From e66180d9aea6191b1ef2ac794f4bd030b24e511d Mon Sep 17 00:00:00 2001 From: Jonathan Kingston Date: Thu, 6 Oct 2022 15:40:28 +0100 Subject: [PATCH] Fix Catalina not supporting WebGL2 (#160) --- Sources/ContentScopeScripts/dist/contentScope.js | 4 +++- build/android/contentScope.js | 4 +++- build/chrome-mv3/inject.js | 4 +++- build/chrome/inject.js | 2 +- build/firefox/inject.js | 4 +++- build/integration/contentScope.js | 4 +++- build/windows/contentScope.js | 4 +++- src/features/fingerprinting-canvas.js | 4 +++- 8 files changed, 22 insertions(+), 8 deletions(-) diff --git a/Sources/ContentScopeScripts/dist/contentScope.js b/Sources/ContentScopeScripts/dist/contentScope.js index 829515b4d..c921fc653 100644 --- a/Sources/ContentScopeScripts/dist/contentScope.js +++ b/Sources/ContentScopeScripts/dist/contentScope.js @@ -3631,9 +3631,11 @@ 'drawArrays' ]; const glContexts = [ - WebGL2RenderingContext, WebGLRenderingContext ]; + if ('WebGL2RenderingContext' in globalThis) { + glContexts.push(WebGL2RenderingContext); + } for (const context of glContexts) { for (const methodName of unsafeGlMethods) { // Some methods are browser specific diff --git a/build/android/contentScope.js b/build/android/contentScope.js index 829515b4d..c921fc653 100644 --- a/build/android/contentScope.js +++ b/build/android/contentScope.js @@ -3631,9 +3631,11 @@ 'drawArrays' ]; const glContexts = [ - WebGL2RenderingContext, WebGLRenderingContext ]; + if ('WebGL2RenderingContext' in globalThis) { + glContexts.push(WebGL2RenderingContext); + } for (const context of glContexts) { for (const methodName of unsafeGlMethods) { // Some methods are browser specific diff --git a/build/chrome-mv3/inject.js b/build/chrome-mv3/inject.js index 7afbfa457..cd087c287 100644 --- a/build/chrome-mv3/inject.js +++ b/build/chrome-mv3/inject.js @@ -2883,9 +2883,11 @@ 'drawArrays' ]; const glContexts = [ - WebGL2RenderingContext, WebGLRenderingContext ]; + if ('WebGL2RenderingContext' in globalThis) { + glContexts.push(WebGL2RenderingContext); + } for (const context of glContexts) { for (const methodName of unsafeGlMethods) { // Some methods are browser specific diff --git a/build/chrome/inject.js b/build/chrome/inject.js index 4bd9b3bb5..aec123047 100644 --- a/build/chrome/inject.js +++ b/build/chrome/inject.js @@ -26,7 +26,7 @@ function init () { const reusableMethodName = '_rm' + randomString() const reusableSecret = '_r' + randomString() const initialScript = ` - ${decodeURI("var%20contentScopeFeatures%20=%20(function%20(exports)%20%7B%0A%20%20'use%20strict';%0A%0A%20%20//%20@ts-nocheck%0A%20%20%20%20%20%20const%20sjcl%20=%20(()%20=%3E%20%7B%0A%20%20/*jslint%20indent:%202,%20bitwise:%20false,%20nomen:%20false,%20plusplus:%20false,%20white:%20false,%20regexp:%20false%20*/%0A%20%20/*global%20document,%20window,%20escape,%20unescape,%20module,%20require,%20Uint32Array%20*/%0A%0A%20%20/**%0A%20%20%20*%20The%20Stanford%20Javascript%20Crypto%20Library,%20top-level%20namespace.%0A%20%20%20*%20@namespace%0A%20%20%20*/%0A%20%20var%20sjcl%20=%20%7B%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Symmetric%20ciphers.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*/%0A%20%20%20%20cipher:%20%7B%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Hash%20functions.%20%20Right%20now%20only%20SHA256%20is%20implemented.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*/%0A%20%20%20%20hash:%20%7B%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Key%20exchange%20functions.%20%20Right%20now%20only%20SRP%20is%20implemented.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*/%0A%20%20%20%20keyexchange:%20%7B%7D,%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Cipher%20modes%20of%20operation.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*/%0A%20%20%20%20mode:%20%7B%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Miscellaneous.%20%20HMAC%20and%20PBKDF2.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*/%0A%20%20%20%20misc:%20%7B%7D,%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Bit%20array%20encoders%20and%20decoders.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20@description%0A%20%20%20%20%20*%20The%20members%20of%20this%20namespace%20are%20functions%20which%20translate%20between%0A%20%20%20%20%20*%20SJCL's%20bitArrays%20and%20other%20objects%20(usually%20strings).%20%20Because%20it%0A%20%20%20%20%20*%20isn't%20always%20clear%20which%20direction%20is%20encoding%20and%20which%20is%20decoding,%0A%20%20%20%20%20*%20the%20method%20names%20are%20%22fromBits%22%20and%20%22toBits%22.%0A%20%20%20%20%20*/%0A%20%20%20%20codec:%20%7B%7D,%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Exceptions.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*/%0A%20%20%20%20exception:%20%7B%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Ciphertext%20is%20corrupt.%0A%20%20%20%20%20%20%20*%20@constructor%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20corrupt:%20function(message)%20%7B%0A%20%20%20%20%20%20%20%20this.toString%20=%20function()%20%7B%20return%20%22CORRUPT:%20%22+this.message;%20%7D;%0A%20%20%20%20%20%20%20%20this.message%20=%20message;%0A%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Invalid%20parameter.%0A%20%20%20%20%20%20%20*%20@constructor%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20invalid:%20function(message)%20%7B%0A%20%20%20%20%20%20%20%20this.toString%20=%20function()%20%7B%20return%20%22INVALID:%20%22+this.message;%20%7D;%0A%20%20%20%20%20%20%20%20this.message%20=%20message;%0A%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Bug%20or%20missing%20feature%20in%20SJCL.%0A%20%20%20%20%20%20%20*%20@constructor%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20bug:%20function(message)%20%7B%0A%20%20%20%20%20%20%20%20this.toString%20=%20function()%20%7B%20return%20%22BUG:%20%22+this.message;%20%7D;%0A%20%20%20%20%20%20%20%20this.message%20=%20message;%0A%20%20%20%20%20%20%7D,%0A%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Something%20isn't%20ready.%0A%20%20%20%20%20%20%20*%20@constructor%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20notReady:%20function(message)%20%7B%0A%20%20%20%20%20%20%20%20this.toString%20=%20function()%20%7B%20return%20%22NOT%20READY:%20%22+this.message;%20%7D;%0A%20%20%20%20%20%20%20%20this.message%20=%20message;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D;%0A%20%20/**%20@fileOverview%20Arrays%20of%20bits,%20encoded%20as%20arrays%20of%20Numbers.%0A%20%20%20*%0A%20%20%20*%20@author%20Emily%20Stark%0A%20%20%20*%20@author%20Mike%20Hamburg%0A%20%20%20*%20@author%20Dan%20Boneh%0A%20%20%20*/%0A%0A%20%20/**%0A%20%20%20*%20Arrays%20of%20bits,%20encoded%20as%20arrays%20of%20Numbers.%0A%20%20%20*%20@namespace%0A%20%20%20*%20@description%0A%20%20%20*%20%3Cp%3E%0A%20%20%20*%20These%20objects%20are%20the%20currency%20accepted%20by%20SJCL's%20crypto%20functions.%0A%20%20%20*%20%3C/p%3E%0A%20%20%20*%0A%20%20%20*%20%3Cp%3E%0A%20%20%20*%20Most%20of%20our%20crypto%20primitives%20operate%20on%20arrays%20of%204-byte%20words%20internally,%0A%20%20%20*%20but%20many%20of%20them%20can%20take%20arguments%20that%20are%20not%20a%20multiple%20of%204%20bytes.%0A%20%20%20*%20This%20library%20encodes%20arrays%20of%20bits%20(whose%20size%20need%20not%20be%20a%20multiple%20of%208%0A%20%20%20*%20bits)%20as%20arrays%20of%2032-bit%20words.%20%20The%20bits%20are%20packed,%20big-endian,%20into%20an%0A%20%20%20*%20array%20of%20words,%2032%20bits%20at%20a%20time.%20%20Since%20the%20words%20are%20double-precision%0A%20%20%20*%20floating%20point%20numbers,%20they%20fit%20some%20extra%20data.%20%20We%20use%20this%20(in%20a%20private,%0A%20%20%20*%20possibly-changing%20manner)%20to%20encode%20the%20number%20of%20bits%20actually%20%20present%0A%20%20%20*%20in%20the%20last%20word%20of%20the%20array.%0A%20%20%20*%20%3C/p%3E%0A%20%20%20*%0A%20%20%20*%20%3Cp%3E%0A%20%20%20*%20Because%20bitwise%20ops%20clear%20this%20out-of-band%20data,%20these%20arrays%20can%20be%20passed%0A%20%20%20*%20to%20ciphers%20like%20AES%20which%20want%20arrays%20of%20words.%0A%20%20%20*%20%3C/p%3E%0A%20%20%20*/%0A%20%20sjcl.bitArray%20=%20%7B%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Array%20slices%20in%20units%20of%20bits.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a%20The%20array%20to%20slice.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20bstart%20The%20offset%20to%20the%20start%20of%20the%20slice,%20in%20bits.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20bend%20The%20offset%20to%20the%20end%20of%20the%20slice,%20in%20bits.%20%20If%20this%20is%20undefined,%0A%20%20%20%20%20*%20slice%20until%20the%20end%20of%20the%20array.%0A%20%20%20%20%20*%20@return%20%7BbitArray%7D%20The%20requested%20slice.%0A%20%20%20%20%20*/%0A%20%20%20%20bitSlice:%20function%20(a,%20bstart,%20bend)%20%7B%0A%20%20%20%20%20%20a%20=%20sjcl.bitArray._shiftRight(a.slice(bstart/32),%2032%20-%20(bstart%20&%2031)).slice(1);%0A%20%20%20%20%20%20return%20(bend%20===%20undefined)%20?%20a%20:%20sjcl.bitArray.clamp(a,%20bend-bstart);%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Extract%20a%20number%20packed%20into%20a%20bit%20array.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a%20The%20array%20to%20slice.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20bstart%20The%20offset%20to%20the%20start%20of%20the%20slice,%20in%20bits.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20blength%20The%20length%20of%20the%20number%20to%20extract.%0A%20%20%20%20%20*%20@return%20%7BNumber%7D%20The%20requested%20slice.%0A%20%20%20%20%20*/%0A%20%20%20%20extract:%20function(a,%20bstart,%20blength)%20%7B%0A%20%20%20%20%20%20//%20FIXME:%20this%20Math.floor%20is%20not%20necessary%20at%20all,%20but%20for%20some%20reason%0A%20%20%20%20%20%20//%20seems%20to%20suppress%20a%20bug%20in%20the%20Chromium%20JIT.%0A%20%20%20%20%20%20var%20x,%20sh%20=%20Math.floor((-bstart-blength)%20&%2031);%0A%20%20%20%20%20%20if%20((bstart%20+%20blength%20-%201%20%5E%20bstart)%20&%20-32)%20%7B%0A%20%20%20%20%20%20%20%20//%20it%20crosses%20a%20boundary%0A%20%20%20%20%20%20%20%20x%20=%20(a%5Bbstart/32%7C0%5D%20%3C%3C%20(32%20-%20sh))%20%5E%20(a%5Bbstart/32+1%7C0%5D%20%3E%3E%3E%20sh);%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20//%20within%20a%20single%20word%0A%20%20%20%20%20%20%20%20x%20=%20a%5Bbstart/32%7C0%5D%20%3E%3E%3E%20sh;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20x%20&%20((1%3C%3Cblength)%20-%201);%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Concatenate%20two%20bit%20arrays.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a1%20The%20first%20array.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a2%20The%20second%20array.%0A%20%20%20%20%20*%20@return%20%7BbitArray%7D%20The%20concatenation%20of%20a1%20and%20a2.%0A%20%20%20%20%20*/%0A%20%20%20%20concat:%20function%20(a1,%20a2)%20%7B%0A%20%20%20%20%20%20if%20(a1.length%20===%200%20%7C%7C%20a2.length%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20return%20a1.concat(a2);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20var%20last%20=%20a1%5Ba1.length-1%5D,%20shift%20=%20sjcl.bitArray.getPartial(last);%0A%20%20%20%20%20%20if%20(shift%20===%2032)%20%7B%0A%20%20%20%20%20%20%20%20return%20a1.concat(a2);%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20return%20sjcl.bitArray._shiftRight(a2,%20shift,%20last%7C0,%20a1.slice(0,a1.length-1));%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Find%20the%20length%20of%20an%20array%20of%20bits.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a%20The%20array.%0A%20%20%20%20%20*%20@return%20%7BNumber%7D%20The%20length%20of%20a,%20in%20bits.%0A%20%20%20%20%20*/%0A%20%20%20%20bitLength:%20function%20(a)%20%7B%0A%20%20%20%20%20%20var%20l%20=%20a.length,%20x;%0A%20%20%20%20%20%20if%20(l%20===%200)%20%7B%20return%200;%20%7D%0A%20%20%20%20%20%20x%20=%20a%5Bl%20-%201%5D;%0A%20%20%20%20%20%20return%20(l-1)%20*%2032%20+%20sjcl.bitArray.getPartial(x);%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Truncate%20an%20array.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a%20The%20array.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20len%20The%20length%20to%20truncate%20to,%20in%20bits.%0A%20%20%20%20%20*%20@return%20%7BbitArray%7D%20A%20new%20array,%20truncated%20to%20len%20bits.%0A%20%20%20%20%20*/%0A%20%20%20%20clamp:%20function%20(a,%20len)%20%7B%0A%20%20%20%20%20%20if%20(a.length%20*%2032%20%3C%20len)%20%7B%20return%20a;%20%7D%0A%20%20%20%20%20%20a%20=%20a.slice(0,%20Math.ceil(len%20/%2032));%0A%20%20%20%20%20%20var%20l%20=%20a.length;%0A%20%20%20%20%20%20len%20=%20len%20&%2031;%0A%20%20%20%20%20%20if%20(l%20%3E%200%20&&%20len)%20%7B%0A%20%20%20%20%20%20%20%20a%5Bl-1%5D%20=%20sjcl.bitArray.partial(len,%20a%5Bl-1%5D%20&%200x80000000%20%3E%3E%20(len-1),%201);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20a;%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Make%20a%20partial%20word%20for%20a%20bit%20array.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20len%20The%20number%20of%20bits%20in%20the%20word.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20x%20The%20bits.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20%5B_end=0%5D%20Pass%201%20if%20x%20has%20already%20been%20shifted%20to%20the%20high%20side.%0A%20%20%20%20%20*%20@return%20%7BNumber%7D%20The%20partial%20word.%0A%20%20%20%20%20*/%0A%20%20%20%20partial:%20function%20(len,%20x,%20_end)%20%7B%0A%20%20%20%20%20%20if%20(len%20===%2032)%20%7B%20return%20x;%20%7D%0A%20%20%20%20%20%20return%20(_end%20?%20x%7C0%20:%20x%20%3C%3C%20(32-len))%20+%20len%20*%200x10000000000;%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Get%20the%20number%20of%20bits%20used%20by%20a%20partial%20word.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20x%20The%20partial%20word.%0A%20%20%20%20%20*%20@return%20%7BNumber%7D%20The%20number%20of%20bits%20used%20by%20the%20partial%20word.%0A%20%20%20%20%20*/%0A%20%20%20%20getPartial:%20function%20(x)%20%7B%0A%20%20%20%20%20%20return%20Math.round(x/0x10000000000)%20%7C%7C%2032;%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Compare%20two%20arrays%20for%20equality%20in%20a%20predictable%20amount%20of%20time.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a%20The%20first%20array.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20b%20The%20second%20array.%0A%20%20%20%20%20*%20@return%20%7Bboolean%7D%20true%20if%20a%20==%20b;%20false%20otherwise.%0A%20%20%20%20%20*/%0A%20%20%20%20equal:%20function%20(a,%20b)%20%7B%0A%20%20%20%20%20%20if%20(sjcl.bitArray.bitLength(a)%20!==%20sjcl.bitArray.bitLength(b))%20%7B%0A%20%20%20%20%20%20%20%20return%20false;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20x%20=%200,%20i;%0A%20%20%20%20%20%20for%20(i=0;%20i%3Ca.length;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20x%20%7C=%20a%5Bi%5D%5Eb%5Bi%5D;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20(x%20===%200);%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%20Shift%20an%20array%20right.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a%20The%20array%20to%20shift.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20shift%20The%20number%20of%20bits%20to%20shift.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20%5Bcarry=0%5D%20A%20byte%20to%20carry%20in%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20%5Bout=%5B%5D%5D%20An%20array%20to%20prepend%20to%20the%20output.%0A%20%20%20%20%20*%20@private%0A%20%20%20%20%20*/%0A%20%20%20%20_shiftRight:%20function%20(a,%20shift,%20carry,%20out)%20%7B%0A%20%20%20%20%20%20var%20i,%20last2=0,%20shift2;%0A%20%20%20%20%20%20if%20(out%20===%20undefined)%20%7B%20out%20=%20%5B%5D;%20%7D%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20for%20(;%20shift%20%3E=%2032;%20shift%20-=%2032)%20%7B%0A%20%20%20%20%20%20%20%20out.push(carry);%0A%20%20%20%20%20%20%20%20carry%20=%200;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(shift%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20return%20out.concat(a);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20for%20(i=0;%20i%3Ca.length;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20out.push(carry%20%7C%20a%5Bi%5D%3E%3E%3Eshift);%0A%20%20%20%20%20%20%20%20carry%20=%20a%5Bi%5D%20%3C%3C%20(32-shift);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20last2%20=%20a.length%20?%20a%5Ba.length-1%5D%20:%200;%0A%20%20%20%20%20%20shift2%20=%20sjcl.bitArray.getPartial(last2);%0A%20%20%20%20%20%20out.push(sjcl.bitArray.partial(shift+shift2%20&%2031,%20(shift%20+%20shift2%20%3E%2032)%20?%20carry%20:%20out.pop(),1));%0A%20%20%20%20%20%20return%20out;%0A%20%20%20%20%7D,%0A%20%20%20%20%0A%20%20%20%20/**%20xor%20a%20block%20of%204%20words%20together.%0A%20%20%20%20%20*%20@private%0A%20%20%20%20%20*/%0A%20%20%20%20_xor4:%20function(x,y)%20%7B%0A%20%20%20%20%20%20return%20%5Bx%5B0%5D%5Ey%5B0%5D,x%5B1%5D%5Ey%5B1%5D,x%5B2%5D%5Ey%5B2%5D,x%5B3%5D%5Ey%5B3%5D%5D;%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%20byteswap%20a%20word%20array%20inplace.%0A%20%20%20%20%20*%20(does%20not%20handle%20partial%20words)%0A%20%20%20%20%20*%20@param%20%7Bsjcl.bitArray%7D%20a%20word%20array%0A%20%20%20%20%20*%20@return%20%7Bsjcl.bitArray%7D%20byteswapped%20array%0A%20%20%20%20%20*/%0A%20%20%20%20byteswapM:%20function(a)%20%7B%0A%20%20%20%20%20%20var%20i,%20v,%20m%20=%200xff00;%0A%20%20%20%20%20%20for%20(i%20=%200;%20i%20%3C%20a.length;%20++i)%20%7B%0A%20%20%20%20%20%20%20%20v%20=%20a%5Bi%5D;%0A%20%20%20%20%20%20%20%20a%5Bi%5D%20=%20(v%20%3E%3E%3E%2024)%20%7C%20((v%20%3E%3E%3E%208)%20&%20m)%20%7C%20((v%20&%20m)%20%3C%3C%208)%20%7C%20(v%20%3C%3C%2024);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20a;%0A%20%20%20%20%7D%0A%20%20%7D;%0A%20%20/**%20@fileOverview%20Bit%20array%20codec%20implementations.%0A%20%20%20*%0A%20%20%20*%20@author%20Emily%20Stark%0A%20%20%20*%20@author%20Mike%20Hamburg%0A%20%20%20*%20@author%20Dan%20Boneh%0A%20%20%20*/%0A%0A%20%20/**%0A%20%20%20*%20UTF-8%20strings%0A%20%20%20*%20@namespace%0A%20%20%20*/%0A%20%20sjcl.codec.utf8String%20=%20%7B%0A%20%20%20%20/**%20Convert%20from%20a%20bitArray%20to%20a%20UTF-8%20string.%20*/%0A%20%20%20%20fromBits:%20function%20(arr)%20%7B%0A%20%20%20%20%20%20var%20out%20=%20%22%22,%20bl%20=%20sjcl.bitArray.bitLength(arr),%20i,%20tmp;%0A%20%20%20%20%20%20for%20(i=0;%20i%3Cbl/8;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20if%20((i&3)%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20tmp%20=%20arr%5Bi/4%5D;%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20out%20+=%20String.fromCharCode(tmp%20%3E%3E%3E%208%20%3E%3E%3E%208%20%3E%3E%3E%208);%0A%20%20%20%20%20%20%20%20tmp%20%3C%3C=%208;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20decodeURIComponent(escape(out));%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%20Convert%20from%20a%20UTF-8%20string%20to%20a%20bitArray.%20*/%0A%20%20%20%20toBits:%20function%20(str)%20%7B%0A%20%20%20%20%20%20str%20=%20unescape(encodeURIComponent(str));%0A%20%20%20%20%20%20var%20out%20=%20%5B%5D,%20i,%20tmp=0;%0A%20%20%20%20%20%20for%20(i=0;%20i%3Cstr.length;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20tmp%20=%20tmp%20%3C%3C%208%20%7C%20str.charCodeAt(i);%0A%20%20%20%20%20%20%20%20if%20((i&3)%20===%203)%20%7B%0A%20%20%20%20%20%20%20%20%20%20out.push(tmp);%0A%20%20%20%20%20%20%20%20%20%20tmp%20=%200;%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(i&3)%20%7B%0A%20%20%20%20%20%20%20%20out.push(sjcl.bitArray.partial(8*(i&3),%20tmp));%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20out;%0A%20%20%20%20%7D%0A%20%20%7D;%0A%20%20/**%20@fileOverview%20Bit%20array%20codec%20implementations.%0A%20%20%20*%0A%20%20%20*%20@author%20Emily%20Stark%0A%20%20%20*%20@author%20Mike%20Hamburg%0A%20%20%20*%20@author%20Dan%20Boneh%0A%20%20%20*/%0A%0A%20%20/**%0A%20%20%20*%20Hexadecimal%0A%20%20%20*%20@namespace%0A%20%20%20*/%0A%20%20sjcl.codec.hex%20=%20%7B%0A%20%20%20%20/**%20Convert%20from%20a%20bitArray%20to%20a%20hex%20string.%20*/%0A%20%20%20%20fromBits:%20function%20(arr)%20%7B%0A%20%20%20%20%20%20var%20out%20=%20%22%22,%20i;%0A%20%20%20%20%20%20for%20(i=0;%20i%3Carr.length;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20out%20+=%20((arr%5Bi%5D%7C0)+0xF00000000000).toString(16).substr(4);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20out.substr(0,%20sjcl.bitArray.bitLength(arr)/4);//.replace(/(.%7B8%7D)/g,%20%22$1%20%22);%0A%20%20%20%20%7D,%0A%20%20%20%20/**%20Convert%20from%20a%20hex%20string%20to%20a%20bitArray.%20*/%0A%20%20%20%20toBits:%20function%20(str)%20%7B%0A%20%20%20%20%20%20var%20i,%20out=%5B%5D,%20len;%0A%20%20%20%20%20%20str%20=%20str.replace(/%5Cs%7C0x/g,%20%22%22);%0A%20%20%20%20%20%20len%20=%20str.length;%0A%20%20%20%20%20%20str%20=%20str%20+%20%2200000000%22;%0A%20%20%20%20%20%20for%20(i=0;%20i%3Cstr.length;%20i+=8)%20%7B%0A%20%20%20%20%20%20%20%20out.push(parseInt(str.substr(i,8),16)%5E0);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20sjcl.bitArray.clamp(out,%20len*4);%0A%20%20%20%20%7D%0A%20%20%7D;%0A%0A%20%20/**%20@fileOverview%20Javascript%20SHA-256%20implementation.%0A%20%20%20*%0A%20%20%20*%20An%20older%20version%20of%20this%20implementation%20is%20available%20in%20the%20public%0A%20%20%20*%20domain,%20but%20this%20one%20is%20(c)%20Emily%20Stark,%20Mike%20Hamburg,%20Dan%20Boneh,%0A%20%20%20*%20Stanford%20University%202008-2010%20and%20BSD-licensed%20for%20liability%0A%20%20%20*%20reasons.%0A%20%20%20*%0A%20%20%20*%20Special%20thanks%20to%20Aldo%20Cortesi%20for%20pointing%20out%20several%20bugs%20in%0A%20%20%20*%20this%20code.%0A%20%20%20*%0A%20%20%20*%20@author%20Emily%20Stark%0A%20%20%20*%20@author%20Mike%20Hamburg%0A%20%20%20*%20@author%20Dan%20Boneh%0A%20%20%20*/%0A%0A%20%20/**%0A%20%20%20*%20Context%20for%20a%20SHA-256%20operation%20in%20progress.%0A%20%20%20*%20@constructor%0A%20%20%20*/%0A%20%20sjcl.hash.sha256%20=%20function%20(hash)%20%7B%0A%20%20%20%20if%20(!this._key%5B0%5D)%20%7B%20this._precompute();%20%7D%0A%20%20%20%20if%20(hash)%20%7B%0A%20%20%20%20%20%20this._h%20=%20hash._h.slice(0);%0A%20%20%20%20%20%20this._buffer%20=%20hash._buffer.slice(0);%0A%20%20%20%20%20%20this._length%20=%20hash._length;%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20this.reset();%0A%20%20%20%20%7D%0A%20%20%7D;%0A%0A%20%20/**%0A%20%20%20*%20Hash%20a%20string%20or%20an%20array%20of%20words.%0A%20%20%20*%20@static%0A%20%20%20*%20@param%20%7BbitArray%7CString%7D%20data%20the%20data%20to%20hash.%0A%20%20%20*%20@return%20%7BbitArray%7D%20The%20hash%20value,%20an%20array%20of%2016%20big-endian%20words.%0A%20%20%20*/%0A%20%20sjcl.hash.sha256.hash%20=%20function%20(data)%20%7B%0A%20%20%20%20return%20(new%20sjcl.hash.sha256()).update(data).finalize();%0A%20%20%7D;%0A%0A%20%20sjcl.hash.sha256.prototype%20=%20%7B%0A%20%20%20%20/**%0A%20%20%20%20%20*%20The%20hash's%20block%20size,%20in%20bits.%0A%20%20%20%20%20*%20@constant%0A%20%20%20%20%20*/%0A%20%20%20%20blockSize:%20512,%0A%20%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Reset%20the%20hash%20state.%0A%20%20%20%20%20*%20@return%20this%0A%20%20%20%20%20*/%0A%20%20%20%20reset:function%20()%20%7B%0A%20%20%20%20%20%20this._h%20=%20this._init.slice(0);%0A%20%20%20%20%20%20this._buffer%20=%20%5B%5D;%0A%20%20%20%20%20%20this._length%20=%200;%0A%20%20%20%20%20%20return%20this;%0A%20%20%20%20%7D,%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Input%20several%20words%20to%20the%20hash.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7CString%7D%20data%20the%20data%20to%20hash.%0A%20%20%20%20%20*%20@return%20this%0A%20%20%20%20%20*/%0A%20%20%20%20update:%20function%20(data)%20%7B%0A%20%20%20%20%20%20if%20(typeof%20data%20===%20%22string%22)%20%7B%0A%20%20%20%20%20%20%20%20data%20=%20sjcl.codec.utf8String.toBits(data);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20i,%20b%20=%20this._buffer%20=%20sjcl.bitArray.concat(this._buffer,%20data),%0A%20%20%20%20%20%20%20%20%20%20ol%20=%20this._length,%0A%20%20%20%20%20%20%20%20%20%20nl%20=%20this._length%20=%20ol%20+%20sjcl.bitArray.bitLength(data);%0A%20%20%20%20%20%20if%20(nl%20%3E%209007199254740991)%7B%0A%20%20%20%20%20%20%20%20throw%20new%20sjcl.exception.invalid(%22Cannot%20hash%20more%20than%202%5E53%20-%201%20bits%22);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20(typeof%20Uint32Array%20!==%20'undefined')%20%7B%0A%20%20%09var%20c%20=%20new%20Uint32Array(b);%0A%20%20%20%20%20%20%09var%20j%20=%200;%0A%20%20%20%20%20%20%09for%20(i%20=%20512+ol%20-%20((512+ol)%20&%20511);%20i%20%3C=%20nl;%20i+=%20512)%20%7B%0A%20%20%20%20%20%20%20%20%09%20%20%20%20this._block(c.subarray(16%20*%20j,%2016%20*%20(j+1)));%0A%20%20%20%20%20%20%20%20%09%20%20%20%20j%20+=%201;%0A%20%20%20%20%20%20%09%7D%0A%20%20%20%20%20%20%09b.splice(0,%2016%20*%20j);%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%09for%20(i%20=%20512+ol%20-%20((512+ol)%20&%20511);%20i%20%3C=%20nl;%20i+=%20512)%20%7B%0A%20%20%20%20%20%20%20%20%09%20%20%20%20this._block(b.splice(0,16));%0A%20%20%20%20%20%20%20%20%09%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20this;%0A%20%20%20%20%7D,%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Complete%20hashing%20and%20output%20the%20hash%20value.%0A%20%20%20%20%20*%20@return%20%7BbitArray%7D%20The%20hash%20value,%20an%20array%20of%208%20big-endian%20words.%0A%20%20%20%20%20*/%0A%20%20%20%20finalize:function%20()%20%7B%0A%20%20%20%20%20%20var%20i,%20b%20=%20this._buffer,%20h%20=%20this._h;%0A%0A%20%20%20%20%20%20//%20Round%20out%20and%20push%20the%20buffer%0A%20%20%20%20%20%20b%20=%20sjcl.bitArray.concat(b,%20%5Bsjcl.bitArray.partial(1,1)%5D);%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20//%20Round%20out%20the%20buffer%20to%20a%20multiple%20of%2016%20words,%20less%20the%202%20length%20words.%0A%20%20%20%20%20%20for%20(i%20=%20b.length%20+%202;%20i%20&%2015;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20b.push(0);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20//%20append%20the%20length%0A%20%20%20%20%20%20b.push(Math.floor(this._length%20/%200x100000000));%0A%20%20%20%20%20%20b.push(this._length%20%7C%200);%0A%0A%20%20%20%20%20%20while%20(b.length)%20%7B%0A%20%20%20%20%20%20%20%20this._block(b.splice(0,16));%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20this.reset();%0A%20%20%20%20%20%20return%20h;%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20The%20SHA-256%20initialization%20vector,%20to%20be%20precomputed.%0A%20%20%20%20%20*%20@private%0A%20%20%20%20%20*/%0A%20%20%20%20_init:%5B%5D,%0A%20%20%20%20/*%0A%20%20%20%20_init:%5B0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19%5D,%0A%20%20%20%20*/%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20The%20SHA-256%20hash%20key,%20to%20be%20precomputed.%0A%20%20%20%20%20*%20@private%0A%20%20%20%20%20*/%0A%20%20%20%20_key:%5B%5D,%0A%20%20%20%20/*%0A%20%20%20%20_key:%0A%20%20%20%20%20%20%5B0x428a2f98,%200x71374491,%200xb5c0fbcf,%200xe9b5dba5,%200x3956c25b,%200x59f111f1,%200x923f82a4,%200xab1c5ed5,%0A%20%20%20%20%20%20%200xd807aa98,%200x12835b01,%200x243185be,%200x550c7dc3,%200x72be5d74,%200x80deb1fe,%200x9bdc06a7,%200xc19bf174,%0A%20%20%20%20%20%20%200xe49b69c1,%200xefbe4786,%200x0fc19dc6,%200x240ca1cc,%200x2de92c6f,%200x4a7484aa,%200x5cb0a9dc,%200x76f988da,%0A%20%20%20%20%20%20%200x983e5152,%200xa831c66d,%200xb00327c8,%200xbf597fc7,%200xc6e00bf3,%200xd5a79147,%200x06ca6351,%200x14292967,%0A%20%20%20%20%20%20%200x27b70a85,%200x2e1b2138,%200x4d2c6dfc,%200x53380d13,%200x650a7354,%200x766a0abb,%200x81c2c92e,%200x92722c85,%0A%20%20%20%20%20%20%200xa2bfe8a1,%200xa81a664b,%200xc24b8b70,%200xc76c51a3,%200xd192e819,%200xd6990624,%200xf40e3585,%200x106aa070,%0A%20%20%20%20%20%20%200x19a4c116,%200x1e376c08,%200x2748774c,%200x34b0bcb5,%200x391c0cb3,%200x4ed8aa4a,%200x5b9cca4f,%200x682e6ff3,%0A%20%20%20%20%20%20%200x748f82ee,%200x78a5636f,%200x84c87814,%200x8cc70208,%200x90befffa,%200xa4506ceb,%200xbef9a3f7,%200xc67178f2%5D,%0A%20%20%20%20*/%0A%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Function%20to%20precompute%20_init%20and%20_key.%0A%20%20%20%20%20*%20@private%0A%20%20%20%20%20*/%0A%20%20%20%20_precompute:%20function%20()%20%7B%0A%20%20%20%20%20%20var%20i%20=%200,%20prime%20=%202,%20factor,%20isPrime;%0A%0A%20%20%20%20%20%20function%20frac(x)%20%7B%20return%20(x-Math.floor(x))%20*%200x100000000%20%7C%200;%20%7D%0A%0A%20%20%20%20%20%20for%20(;%20i%3C64;%20prime++)%20%7B%0A%20%20%20%20%20%20%20%20isPrime%20=%20true;%0A%20%20%20%20%20%20%20%20for%20(factor=2;%20factor*factor%20%3C=%20prime;%20factor++)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(prime%20%25%20factor%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20isPrime%20=%20false;%0A%20%20%20%20%20%20%20%20%20%20%20%20break;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20(isPrime)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(i%3C8)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this._init%5Bi%5D%20=%20frac(Math.pow(prime,%201/2));%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20this._key%5Bi%5D%20=%20frac(Math.pow(prime,%201/3));%0A%20%20%20%20%20%20%20%20%20%20i++;%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D,%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Perform%20one%20cycle%20of%20SHA-256.%0A%20%20%20%20%20*%20@param%20%7BUint32Array%7CbitArray%7D%20w%20one%20block%20of%20words.%0A%20%20%20%20%20*%20@private%0A%20%20%20%20%20*/%0A%20%20%20%20_block:function%20(w)%20%7B%20%20%0A%20%20%20%20%20%20var%20i,%20tmp,%20a,%20b,%0A%20%20%20%20%20%20%20%20h%20=%20this._h,%0A%20%20%20%20%20%20%20%20k%20=%20this._key,%0A%20%20%20%20%20%20%20%20h0%20=%20h%5B0%5D,%20h1%20=%20h%5B1%5D,%20h2%20=%20h%5B2%5D,%20h3%20=%20h%5B3%5D,%0A%20%20%20%20%20%20%20%20h4%20=%20h%5B4%5D,%20h5%20=%20h%5B5%5D,%20h6%20=%20h%5B6%5D,%20h7%20=%20h%5B7%5D;%0A%0A%20%20%20%20%20%20/*%20Rationale%20for%20placement%20of%20%7C0%20:%0A%20%20%20%20%20%20%20*%20If%20a%20value%20can%20overflow%20is%20original%2032%20bits%20by%20a%20factor%20of%20more%20than%20a%20few%0A%20%20%20%20%20%20%20*%20million%20(2%5E23%20ish),%20there%20is%20a%20possibility%20that%20it%20might%20overflow%20the%0A%20%20%20%20%20%20%20*%2053-bit%20mantissa%20and%20lose%20precision.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20To%20avoid%20this,%20we%20clamp%20back%20to%2032%20bits%20by%20%7C'ing%20with%200%20on%20any%20value%20that%0A%20%20%20%20%20%20%20*%20propagates%20around%20the%20loop,%20and%20on%20the%20hash%20state%20h%5B%5D.%20%20I%20don't%20believe%0A%20%20%20%20%20%20%20*%20that%20the%20clamps%20on%20h4%20and%20on%20h0%20are%20strictly%20necessary,%20but%20it's%20close%0A%20%20%20%20%20%20%20*%20(for%20h4%20anyway),%20and%20better%20safe%20than%20sorry.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20clamps%20on%20h%5B%5D%20are%20necessary%20for%20the%20output%20to%20be%20correct%20even%20in%20the%0A%20%20%20%20%20%20%20*%20common%20case%20and%20for%20short%20inputs.%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20for%20(i=0;%20i%3C64;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20//%20load%20up%20the%20input%20word%20for%20this%20round%0A%20%20%20%20%20%20%20%20if%20(i%3C16)%20%7B%0A%20%20%20%20%20%20%20%20%20%20tmp%20=%20w%5Bi%5D;%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20a%20%20%20=%20w%5B(i+1%20)%20&%2015%5D;%0A%20%20%20%20%20%20%20%20%20%20b%20%20%20=%20w%5B(i+14)%20&%2015%5D;%0A%20%20%20%20%20%20%20%20%20%20tmp%20=%20w%5Bi&15%5D%20=%20((a%3E%3E%3E7%20%20%5E%20a%3E%3E%3E18%20%5E%20a%3E%3E%3E3%20%20%5E%20a%3C%3C25%20%5E%20a%3C%3C14)%20+%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(b%3E%3E%3E17%20%5E%20b%3E%3E%3E19%20%5E%20b%3E%3E%3E10%20%5E%20b%3C%3C15%20%5E%20b%3C%3C13)%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20w%5Bi&15%5D%20+%20w%5B(i+9)%20&%2015%5D)%20%7C%200;%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20tmp%20=%20(tmp%20+%20h7%20+%20(h4%3E%3E%3E6%20%5E%20h4%3E%3E%3E11%20%5E%20h4%3E%3E%3E25%20%5E%20h4%3C%3C26%20%5E%20h4%3C%3C21%20%5E%20h4%3C%3C7)%20+%20%20(h6%20%5E%20h4&(h5%5Eh6))%20+%20k%5Bi%5D);%20//%20%7C%200;%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20//%20shift%20register%0A%20%20%20%20%20%20%20%20h7%20=%20h6;%20h6%20=%20h5;%20h5%20=%20h4;%0A%20%20%20%20%20%20%20%20h4%20=%20h3%20+%20tmp%20%7C%200;%0A%20%20%20%20%20%20%20%20h3%20=%20h2;%20h2%20=%20h1;%20h1%20=%20h0;%0A%0A%20%20%20%20%20%20%20%20h0%20=%20(tmp%20+%20%20((h1&h2)%20%5E%20(h3&(h1%5Eh2)))%20+%20(h1%3E%3E%3E2%20%5E%20h1%3E%3E%3E13%20%5E%20h1%3E%3E%3E22%20%5E%20h1%3C%3C30%20%5E%20h1%3C%3C19%20%5E%20h1%3C%3C10))%20%7C%200;%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20h%5B0%5D%20=%20h%5B0%5D+h0%20%7C%200;%0A%20%20%20%20%20%20h%5B1%5D%20=%20h%5B1%5D+h1%20%7C%200;%0A%20%20%20%20%20%20h%5B2%5D%20=%20h%5B2%5D+h2%20%7C%200;%0A%20%20%20%20%20%20h%5B3%5D%20=%20h%5B3%5D+h3%20%7C%200;%0A%20%20%20%20%20%20h%5B4%5D%20=%20h%5B4%5D+h4%20%7C%200;%0A%20%20%20%20%20%20h%5B5%5D%20=%20h%5B5%5D+h5%20%7C%200;%0A%20%20%20%20%20%20h%5B6%5D%20=%20h%5B6%5D+h6%20%7C%200;%0A%20%20%20%20%20%20h%5B7%5D%20=%20h%5B7%5D+h7%20%7C%200;%0A%20%20%20%20%7D%0A%20%20%7D;%0A%0A%0A%20%20/**%20@fileOverview%20HMAC%20implementation.%0A%20%20%20*%0A%20%20%20*%20@author%20Emily%20Stark%0A%20%20%20*%20@author%20Mike%20Hamburg%0A%20%20%20*%20@author%20Dan%20Boneh%0A%20%20%20*/%0A%0A%20%20/**%20HMAC%20with%20the%20specified%20hash%20function.%0A%20%20%20*%20@constructor%0A%20%20%20*%20@param%20%7BbitArray%7D%20key%20the%20key%20for%20HMAC.%0A%20%20%20*%20@param%20%7BObject%7D%20%5BHash=sjcl.hash.sha256%5D%20The%20hash%20function%20to%20use.%0A%20%20%20*/%0A%20%20sjcl.misc.hmac%20=%20function%20(key,%20Hash)%20%7B%0A%20%20%20%20this._hash%20=%20Hash%20=%20Hash%20%7C%7C%20sjcl.hash.sha256;%0A%20%20%20%20var%20exKey%20=%20%5B%5B%5D,%5B%5D%5D,%20i,%0A%20%20%20%20%20%20%20%20bs%20=%20Hash.prototype.blockSize%20/%2032;%0A%20%20%20%20this._baseHash%20=%20%5Bnew%20Hash(),%20new%20Hash()%5D;%0A%0A%20%20%20%20if%20(key.length%20%3E%20bs)%20%7B%0A%20%20%20%20%20%20key%20=%20Hash.hash(key);%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20for%20(i=0;%20i%3Cbs;%20i++)%20%7B%0A%20%20%20%20%20%20exKey%5B0%5D%5Bi%5D%20=%20key%5Bi%5D%5E0x36363636;%0A%20%20%20%20%20%20exKey%5B1%5D%5Bi%5D%20=%20key%5Bi%5D%5E0x5C5C5C5C;%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20this._baseHash%5B0%5D.update(exKey%5B0%5D);%0A%20%20%20%20this._baseHash%5B1%5D.update(exKey%5B1%5D);%0A%20%20%20%20this._resultHash%20=%20new%20Hash(this._baseHash%5B0%5D);%0A%20%20%7D;%0A%0A%20%20/**%20HMAC%20with%20the%20specified%20hash%20function.%20%20Also%20called%20encrypt%20since%20it's%20a%20prf.%0A%20%20%20*%20@param%20%7BbitArray%7CString%7D%20data%20The%20data%20to%20mac.%0A%20%20%20*/%0A%20%20sjcl.misc.hmac.prototype.encrypt%20=%20sjcl.misc.hmac.prototype.mac%20=%20function%20(data)%20%7B%0A%20%20%20%20if%20(!this._updated)%20%7B%0A%20%20%20%20%20%20this.update(data);%0A%20%20%20%20%20%20return%20this.digest(data);%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20throw%20new%20sjcl.exception.invalid(%22encrypt%20on%20already%20updated%20hmac%20called!%22);%0A%20%20%20%20%7D%0A%20%20%7D;%0A%0A%20%20sjcl.misc.hmac.prototype.reset%20=%20function%20()%20%7B%0A%20%20%20%20this._resultHash%20=%20new%20this._hash(this._baseHash%5B0%5D);%0A%20%20%20%20this._updated%20=%20false;%0A%20%20%7D;%0A%0A%20%20sjcl.misc.hmac.prototype.update%20=%20function%20(data)%20%7B%0A%20%20%20%20this._updated%20=%20true;%0A%20%20%20%20this._resultHash.update(data);%0A%20%20%7D;%0A%0A%20%20sjcl.misc.hmac.prototype.digest%20=%20function%20()%20%7B%0A%20%20%20%20var%20w%20=%20this._resultHash.finalize(),%20result%20=%20new%20(this._hash)(this._baseHash%5B1%5D).update(w).finalize();%0A%0A%20%20%20%20this.reset();%0A%0A%20%20%20%20return%20result;%0A%20%20%7D;%0A%0A%20%20%20%20%20%20return%20sjcl;%0A%20%20%20%20%7D)();%0A%0A%20%20/*%20global%20cloneInto,%20exportFunction,%20false%20*/%0A%0A%20%20//%20Only%20use%20globalThis%20for%20testing%20this%20breaks%20window.wrappedJSObject%20code%20in%20Firefox%0A%20%20//%20eslint-disable-next-line%20no-global-assign%0A%20%20let%20globalObj%20=%20typeof%20window%20===%20'undefined'%20?%20globalThis%20:%20window;%0A%20%20let%20Error$1%20=%20globalObj.Error;%0A%0A%20%20function%20getDataKeySync%20(sessionKey,%20domainKey,%20inputData)%20%7B%0A%20%20%20%20%20%20//%20eslint-disable-next-line%20new-cap%0A%20%20%20%20%20%20const%20hmac%20=%20new%20sjcl.misc.hmac(sjcl.codec.utf8String.toBits(sessionKey%20+%20domainKey),%20sjcl.hash.sha256);%0A%20%20%20%20%20%20return%20sjcl.codec.hex.fromBits(hmac.encrypt(inputData))%0A%20%20%7D%0A%0A%20%20//%20linear%20feedback%20shift%20register%20to%20find%20a%20random%20approximation%0A%20%20function%20nextRandom%20(v)%20%7B%0A%20%20%20%20%20%20return%20Math.abs((v%20%3E%3E%201)%20%7C%20(((v%20%3C%3C%2062)%20%5E%20(v%20%3C%3C%2061))%20&%20(~(~0%20%3C%3C%2063)%20%3C%3C%2062)))%0A%20%20%7D%0A%0A%20%20const%20exemptionLists%20=%20%7B%7D;%0A%20%20function%20shouldExemptUrl%20(type,%20url)%20%7B%0A%20%20%20%20%20%20for%20(const%20regex%20of%20exemptionLists%5Btype%5D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(regex.test(url))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20true%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20false%0A%20%20%7D%0A%0A%20%20let%20debug%20=%20false;%0A%0A%20%20function%20initStringExemptionLists%20(args)%20%7B%0A%20%20%20%20%20%20const%20%7B%20stringExemptionLists%20%7D%20=%20args;%0A%20%20%20%20%20%20debug%20=%20args.debug;%0A%20%20%20%20%20%20for%20(const%20type%20in%20stringExemptionLists)%20%7B%0A%20%20%20%20%20%20%20%20%20%20exemptionLists%5Btype%5D%20=%20%5B%5D;%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20stringExemption%20of%20stringExemptionLists%5Btype%5D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20exemptionLists%5Btype%5D.push(new%20RegExp(stringExemption));%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Best%20guess%20effort%20if%20the%20document%20is%20being%20framed%0A%20%20%20*%20@returns%20%7Bboolean%7D%20if%20we%20infer%20the%20document%20is%20framed%0A%20%20%20*/%0A%20%20function%20isBeingFramed%20()%20%7B%0A%20%20%20%20%20%20if%20('ancestorOrigins'%20in%20globalThis.location)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20globalThis.location.ancestorOrigins.length%20%3E%200%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20globalThis.top%20!==%20globalThis.window%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Best%20guess%20effort%20if%20the%20document%20is%20third%20party%0A%20%20%20*%20@returns%20%7Bboolean%7D%20if%20we%20infer%20the%20document%20is%20third%20party%0A%20%20%20*/%0A%20%20function%20isThirdParty%20()%20%7B%0A%20%20%20%20%20%20if%20(!isBeingFramed())%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20!matchHostname(globalThis.location.hostname,%20getTabHostname())%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Best%20guess%20effort%20of%20the%20tabs%20hostname;%20where%20possible%20always%20prefer%20the%20args.site.domain%0A%20%20%20*%20@returns%20%7Bstring%7Cnull%7D%20inferred%20tab%20hostname%0A%20%20%20*/%0A%20%20function%20getTabHostname%20()%20%7B%0A%20%20%20%20%20%20let%20framingOrigin%20=%20null;%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20framingOrigin%20=%20globalThis.top.location.href;%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20framingOrigin%20=%20globalThis.document.referrer;%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20Not%20supported%20in%20Firefox%0A%20%20%20%20%20%20if%20('ancestorOrigins'%20in%20globalThis.location%20&&%20globalThis.location.ancestorOrigins.length)%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20ancestorOrigins%20is%20reverse%20order,%20with%20the%20last%20item%20being%20the%20top%20frame%0A%20%20%20%20%20%20%20%20%20%20framingOrigin%20=%20globalThis.location.ancestorOrigins.item(globalThis.location.ancestorOrigins.length%20-%201);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20framingOrigin%20=%20new%20URL(framingOrigin).hostname;%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20framingOrigin%20=%20null;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20framingOrigin%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Returns%20true%20if%20hostname%20is%20a%20subset%20of%20exceptionDomain%20or%20an%20exact%20match.%0A%20%20%20*%20@param%20%7Bstring%7D%20hostname%0A%20%20%20*%20@param%20%7Bstring%7D%20exceptionDomain%0A%20%20%20*%20@returns%20%7Bboolean%7D%0A%20%20%20*/%0A%20%20function%20matchHostname%20(hostname,%20exceptionDomain)%20%7B%0A%20%20%20%20%20%20return%20hostname%20===%20exceptionDomain%20%7C%7C%20hostname.endsWith(%60.$%7BexceptionDomain%7D%60)%0A%20%20%7D%0A%0A%20%20const%20lineTest%20=%20/(%5C()?(https?:%5B%5E)%5D+):%5B0-9%5D+:%5B0-9%5D+(%5C))?/;%0A%20%20function%20getStackTraceUrls%20(stack)%20%7B%0A%20%20%20%20%20%20const%20urls%20=%20new%20Set();%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20errorLines%20=%20stack.split('%5Cn');%0A%20%20%20%20%20%20%20%20%20%20//%20Should%20cater%20for%20Chrome%20and%20Firefox%20stacks,%20we%20only%20care%20about%20https?%20resources.%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20line%20of%20errorLines)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20res%20=%20line.match(lineTest);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(res)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20urls.add(new%20URL(res%5B2%5D,%20location.href));%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20Fall%20through%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20urls%0A%20%20%7D%0A%0A%20%20function%20getStackTraceOrigins%20(stack)%20%7B%0A%20%20%20%20%20%20const%20urls%20=%20getStackTraceUrls(stack);%0A%20%20%20%20%20%20const%20origins%20=%20new%20Set();%0A%20%20%20%20%20%20for%20(const%20url%20of%20urls)%20%7B%0A%20%20%20%20%20%20%20%20%20%20origins.add(url.hostname);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20origins%0A%20%20%7D%0A%0A%20%20//%20Checks%20the%20stack%20trace%20if%20there%20are%20known%20libraries%20that%20are%20broken.%0A%20%20function%20shouldExemptMethod%20(type)%20%7B%0A%20%20%20%20%20%20//%20Short%20circuit%20stack%20tracing%20if%20we%20don't%20have%20checks%0A%20%20%20%20%20%20if%20(!(type%20in%20exemptionLists)%20%7C%7C%20exemptionLists%5Btype%5D.length%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20const%20stack%20=%20getStack();%0A%20%20%20%20%20%20const%20errorFiles%20=%20getStackTraceUrls(stack);%0A%20%20%20%20%20%20for%20(const%20path%20of%20errorFiles)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(shouldExemptUrl(type,%20path.href))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20true%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20false%0A%20%20%7D%0A%0A%20%20//%20Iterate%20through%20the%20key,%20passing%20an%20item%20index%20and%20a%20byte%20to%20be%20modified%0A%20%20function%20iterateDataKey%20(key,%20callback)%20%7B%0A%20%20%20%20%20%20let%20item%20=%20key.charCodeAt(0);%0A%20%20%20%20%20%20for%20(const%20i%20in%20key)%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20byte%20=%20key.charCodeAt(i);%0A%20%20%20%20%20%20%20%20%20%20for%20(let%20j%20=%208;%20j%20%3E=%200;%20j--)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20res%20=%20callback(item,%20byte);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Exit%20early%20if%20callback%20returns%20null%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(res%20===%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20find%20next%20item%20to%20perturb%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20item%20=%20nextRandom(item);%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Right%20shift%20as%20we%20use%20the%20least%20significant%20bit%20of%20it%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20byte%20=%20byte%20%3E%3E%201;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20isFeatureBroken%20(args,%20feature)%20%7B%0A%20%20%20%20%20%20return%20isWindowsSpecificFeature(feature)%0A%20%20%20%20%20%20%20%20%20%20?%20!args.site.enabledFeatures.includes(feature)%0A%20%20%20%20%20%20%20%20%20%20:%20args.site.isBroken%20%7C%7C%20args.site.allowlisted%20%7C%7C%20!args.site.enabledFeatures.includes(feature)%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20For%20each%20property%20defined%20on%20the%20object,%20update%20it%20with%20the%20target%20value.%0A%20%20%20*/%0A%20%20function%20overrideProperty%20(name,%20prop)%20%7B%0A%20%20%20%20%20%20//%20Don't%20update%20if%20existing%20value%20is%20undefined%20or%20null%0A%20%20%20%20%20%20if%20(!(prop.origValue%20===%20undefined))%20%7B%0A%20%20%20%20%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20%20%20%20%20*%20When%20re-defining%20properties,%20we%20bind%20the%20overwritten%20functions%20to%20null.%20This%20prevents%0A%20%20%20%20%20%20%20%20%20%20%20*%20sites%20from%20using%20toString%20to%20see%20if%20the%20function%20has%20been%20overwritten%0A%20%20%20%20%20%20%20%20%20%20%20*%20without%20this%20bind%20call,%20a%20site%20could%20run%20something%20like%0A%20%20%20%20%20%20%20%20%20%20%20*%20%60Object.getOwnPropertyDescriptor(Screen.prototype,%20%22availTop%22).get.toString()%60%20and%20see%0A%20%20%20%20%20%20%20%20%20%20%20*%20the%20contents%20of%20the%20function.%20Appending%20.bind(null)%20to%20the%20function%20definition%20will%0A%20%20%20%20%20%20%20%20%20%20%20*%20have%20the%20same%20toString%20call%20return%20the%20default%20%5Bnative%20code%5D%0A%20%20%20%20%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defineProperty(prop.object,%20name,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20eslint-disable-next-line%20no-extra-bind%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20get:%20(()%20=%3E%20prop.targetValue).bind(null)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20prop.origValue%0A%20%20%7D%0A%0A%20%20function%20defineProperty%20(object,%20propertyName,%20descriptor)%20%7B%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20Object.defineProperty(object,%20propertyName,%20descriptor);%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20camelcase%20(dashCaseText)%20%7B%0A%20%20%20%20%20%20return%20dashCaseText.replace(/-(.)/g,%20(match,%20letter)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20letter.toUpperCase()%0A%20%20%20%20%20%20%7D)%0A%20%20%7D%0A%0A%20%20//%20We%20use%20this%20method%20to%20detect%20M1%20macs%20and%20set%20appropriate%20API%20values%20to%20prevent%20sites%20from%20detecting%20fingerprinting%20protections%0A%20%20function%20isAppleSilicon%20()%20%7B%0A%20%20%20%20%20%20const%20canvas%20=%20document.createElement('canvas');%0A%20%20%20%20%20%20const%20gl%20=%20canvas.getContext('webgl');%0A%0A%20%20%20%20%20%20//%20Best%20guess%20if%20the%20device%20is%20an%20Apple%20Silicon%0A%20%20%20%20%20%20//%20https://stackoverflow.com/a/65412357%0A%20%20%20%20%20%20return%20gl.getSupportedExtensions().indexOf('WEBGL_compressed_texture_etc')%20!==%20-1%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Take%20configSeting%20which%20should%20be%20an%20array%20of%20possible%20values.%0A%20%20%20*%20If%20a%20value%20contains%20a%20criteria%20that%20is%20a%20match%20for%20this%20environment%20then%20return%20that%20value.%0A%20%20%20*%20Otherwise%20return%20the%20first%20value%20that%20doesn't%20have%20a%20criteria.%0A%20%20%20*%0A%20%20%20*%20@param%20%7B*%5B%5D%7D%20configSetting%20-%20Config%20setting%20which%20should%20contain%20a%20list%20of%20possible%20values%0A%20%20%20*%20@returns%20%7B*%7Cundefined%7D%20-%20The%20value%20from%20the%20list%20that%20best%20matches%20the%20criteria%20in%20the%20config%0A%20%20%20*/%0A%20%20function%20processAttrByCriteria%20(configSetting)%20%7B%0A%20%20%20%20%20%20let%20bestOption;%0A%20%20%20%20%20%20for%20(const%20item%20of%20configSetting)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(item.criteria)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(item.criteria.arch%20===%20'AppleSilicon'%20&&%20isAppleSilicon())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bestOption%20=%20item;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20bestOption%20=%20item;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20return%20bestOption%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Get%20the%20value%20of%20a%20config%20setting.%0A%20%20%20*%20If%20the%20value%20is%20not%20set,%20return%20the%20default%20value.%0A%20%20%20*%20If%20the%20value%20is%20not%20an%20object,%20return%20the%20value.%0A%20%20%20*%20If%20the%20value%20is%20an%20object,%20check%20its%20type%20property.%0A%20%20%20*%0A%20%20%20*%20@param%20%7Bstring%7D%20featureName%0A%20%20%20*%20@param%20%7Bobject%7D%20args%0A%20%20%20*%20@param%20%7Bstring%7D%20prop%0A%20%20%20*%20@param%20%7Bany%7D%20defaultValue%20-%20The%20default%20value%20to%20use%20if%20the%20config%20setting%20is%20not%20set%0A%20%20%20*%20@returns%20The%20value%20of%20the%20config%20setting%20or%20the%20default%20value%0A%20%20%20*/%0A%20%20function%20getFeatureAttr%20(featureName,%20args,%20prop,%20defaultValue)%20%7B%0A%20%20%20%20%20%20let%20configSetting%20=%20getFeatureSetting(featureName,%20args,%20prop);%0A%0A%20%20%20%20%20%20if%20(configSetting%20===%20undefined)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20defaultValue%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20configSettingType%20=%20typeof%20configSetting;%0A%20%20%20%20%20%20switch%20(configSettingType)%20%7B%0A%20%20%20%20%20%20case%20'object':%0A%20%20%20%20%20%20%20%20%20%20if%20(Array.isArray(configSetting))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20configSetting%20=%20processAttrByCriteria(configSetting);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(configSetting%20===%20undefined)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20defaultValue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(!configSetting.type)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20defaultValue%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(configSetting.type%20===%20'undefined')%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20undefined%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20return%20configSetting.value%0A%20%20%20%20%20%20default:%0A%20%20%20%20%20%20%20%20%20%20return%20defaultValue%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20@param%20%7Bstring%7D%20featureName%0A%20%20%20*%20@param%20%7Bobject%7D%20args%0A%20%20%20*%20@param%20%7Bstring%7D%20prop%0A%20%20%20*%20@returns%20%7Bany%7D%0A%20%20%20*/%0A%20%20function%20getFeatureSetting%20(featureName,%20args,%20prop)%20%7B%0A%20%20%20%20%20%20const%20camelFeatureName%20=%20camelcase(featureName);%0A%20%20%20%20%20%20return%20args.featureSettings?.%5BcamelFeatureName%5D?.%5Bprop%5D%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20@param%20%7Bstring%7D%20featureName%0A%20%20%20*%20@param%20%7Bobject%7D%20args%0A%20%20%20*%20@param%20%7Bstring%7D%20prop%0A%20%20%20*%20@returns%20%7Bboolean%7D%0A%20%20%20*/%0A%20%20function%20getFeatureSettingEnabled%20(featureName,%20args,%20prop)%20%7B%0A%20%20%20%20%20%20const%20result%20=%20getFeatureSetting(featureName,%20args,%20prop);%0A%20%20%20%20%20%20return%20result%20===%20'enabled'%0A%20%20%7D%0A%0A%20%20function%20getStack%20()%20%7B%0A%20%20%20%20%20%20return%20new%20Error$1().stack%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20@template%20%7Bobject%7D%20P%0A%20%20%20*%20@typedef%20%7Bobject%7D%20ProxyObject%3CP%3E%0A%20%20%20*%20@property%20%7B(target?:%20object,%20thisArg?:%20P,%20args?:%20object)%20=%3E%20void%7D%20apply%0A%20%20%20*/%0A%0A%20%20/**%0A%20%20%20*%20@template%20%5BP=object%5D%0A%20%20%20*/%0A%20%20class%20DDGProxy%20%7B%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20@param%20%7Bstring%7D%20featureName%0A%20%20%20%20%20%20%20*%20@param%20%7BP%7D%20objectScope%0A%20%20%20%20%20%20%20*%20@param%20%7Bstring%7D%20property%0A%20%20%20%20%20%20%20*%20@param%20%7BProxyObject%3CP%3E%7D%20proxyObject%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20constructor%20(featureName,%20objectScope,%20property,%20proxyObject)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.objectScope%20=%20objectScope;%0A%20%20%20%20%20%20%20%20%20%20this.property%20=%20property;%0A%20%20%20%20%20%20%20%20%20%20this.featureName%20=%20featureName;%0A%20%20%20%20%20%20%20%20%20%20this.camelFeatureName%20=%20camelcase(this.featureName);%0A%20%20%20%20%20%20%20%20%20%20const%20outputHandler%20=%20(...args)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20isExempt%20=%20shouldExemptMethod(this.camelFeatureName);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(debug)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20postDebugMessage(this.camelFeatureName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20action:%20isExempt%20?%20'ignore'%20:%20'restrict',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind:%20this.property,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20documentUrl:%20document.location.href,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stack:%20getStack(),%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20args:%20JSON.stringify(args%5B2%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20The%20normal%20return%20value%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(isExempt)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(...args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20proxyObject.apply(...args)%0A%20%20%20%20%20%20%20%20%20%20%7D;%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._native%20=%20objectScope%5Bproperty%5D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20handler%20=%20%7B%7D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20handler.apply%20=%20outputHandler;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.internal%20=%20new%20globalObj.Proxy(objectScope%5Bproperty%5D,%20handler);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20Actually%20apply%20the%20proxy%20to%20the%20native%20property%0A%20%20%20%20%20%20overload%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.objectScope%5Bthis.property%5D%20=%20this.internal;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20postDebugMessage%20(feature,%20message)%20%7B%0A%20%20%20%20%20%20if%20(message.stack)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20scriptOrigins%20=%20%5B...getStackTraceOrigins(message.stack)%5D;%0A%20%20%20%20%20%20%20%20%20%20message.scriptOrigins%20=%20scriptOrigins;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20globalObj.postMessage(%7B%0A%20%20%20%20%20%20%20%20%20%20action:%20feature,%0A%20%20%20%20%20%20%20%20%20%20message%0A%20%20%20%20%20%20%7D);%0A%20%20%7D%0A%0A%20%20let%20DDGReflect;%0A%20%20let%20DDGPromise;%0A%0A%20%20//%20Exports%20for%20usage%20where%20we%20have%20to%20cross%20the%20xray%20boundary:%20https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Sharing_objects_with_page_scripts%0A%20%20%7B%0A%20%20%20%20%20%20DDGPromise%20=%20globalObj.Promise;%0A%20%20%20%20%20%20DDGReflect%20=%20globalObj.Reflect;%0A%20%20%7D%0A%0A%20%20const%20windowsSpecificFeatures%20=%20%5B'windowsPermissionUsage'%5D;%0A%0A%20%20function%20isWindowsSpecificFeature%20(featureName)%20%7B%0A%20%20%20%20%20%20return%20windowsSpecificFeatures.includes(featureName)%0A%20%20%7D%0A%0A%20%20function%20__variableDynamicImportRuntime0__(path)%20%7B%0A%20%20%20%20%20switch%20(path)%20%7B%0A%20%20%20%20%20%20%20case%20'./features/cookie.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20cookie;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/fingerprinting-audio.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20fingerprintingAudio;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/fingerprinting-battery.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20fingerprintingBattery;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/fingerprinting-canvas.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20fingerprintingCanvas;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/fingerprinting-hardware.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20fingerprintingHardware;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/fingerprinting-screen-size.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20fingerprintingScreenSize;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/fingerprinting-temporary-storage.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20fingerprintingTemporaryStorage;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/google-rejected.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20googleRejected;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/gpc.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20gpc;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/navigator-interface.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20navigatorInterface;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/referrer.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20referrer;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/web-compat.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20webCompat;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/windows-permission-usage.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20windowsPermissionUsage;%20%7D);%0A%20%20%20%20%20%20%20default:%20return%20Promise.reject(new%20Error(%22Unknown%20variable%20dynamic%20import:%20%22%20+%20path));%0A%20%20%20%20%20%7D%0A%20%20%20%7D%0A%0A%20%20function%20shouldRun%20()%20%7B%0A%20%20%20%20%20%20//%20don't%20inject%20into%20non-HTML%20documents%20(such%20as%20XML%20documents)%0A%20%20%20%20%20%20//%20but%20do%20inject%20into%20XHTML%20documents%0A%20%20%20%20%20%20if%20(document%20instanceof%20HTMLDocument%20===%20false%20&&%20(%0A%20%20%20%20%20%20%20%20%20%20document%20instanceof%20XMLDocument%20===%20false%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20document.createElement('div')%20instanceof%20HTMLDivElement%20===%20false%0A%20%20%20%20%20%20))%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20true%0A%20%20%7D%0A%0A%20%20let%20initArgs%20=%20null;%0A%20%20const%20updates%20=%20%5B%5D;%0A%20%20const%20features%20=%20%5B%5D;%0A%0A%20%20async%20function%20load$1%20()%20%7B%0A%20%20%20%20%20%20if%20(!shouldRun())%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20const%20featureNames%20=%20%5B%0A%20%20%20%20%20%20%20%20%20%20'windowsPermissionUsage',%0A%20%20%20%20%20%20%20%20%20%20'webCompat',%0A%20%20%20%20%20%20%20%20%20%20'fingerprintingAudio',%0A%20%20%20%20%20%20%20%20%20%20'fingerprintingBattery',%0A%20%20%20%20%20%20%20%20%20%20'fingerprintingCanvas',%0A%20%20%20%20%20%20%20%20%20%20'cookie',%0A%20%20%20%20%20%20%20%20%20%20'googleRejected',%0A%20%20%20%20%20%20%20%20%20%20'gpc',%0A%20%20%20%20%20%20%20%20%20%20'fingerprintingHardware',%0A%20%20%20%20%20%20%20%20%20%20'referrer',%0A%20%20%20%20%20%20%20%20%20%20'fingerprintingScreenSize',%0A%20%20%20%20%20%20%20%20%20%20'fingerprintingTemporaryStorage',%0A%20%20%20%20%20%20%20%20%20%20'navigatorInterface'%0A%20%20%20%20%20%20%5D;%0A%0A%20%20%20%20%20%20for%20(const%20featureName%20of%20featureNames)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20filename%20=%20featureName.replace(/(%5Ba-zA-Z%5D)(?=%5BA-Z0-9%5D)/g,%20'$1-').toLowerCase();%0A%20%20%20%20%20%20%20%20%20%20const%20feature%20=%20__variableDynamicImportRuntime0__(%60./features/$%7Bfilename%7D.js%60).then((%7B%20init,%20load,%20update%20%7D)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(load)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20load();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%20featureName,%20init,%20update%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20features.push(feature);%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20async%20function%20init$d%20(args)%20%7B%0A%20%20%20%20%20%20initArgs%20=%20args;%0A%20%20%20%20%20%20if%20(!shouldRun())%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20initStringExemptionLists(args);%0A%20%20%20%20%20%20const%20resolvedFeatures%20=%20await%20Promise.all(features);%0A%20%20%20%20%20%20resolvedFeatures.forEach((%7B%20init,%20featureName%20%7D)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(!isFeatureBroken(args,%20featureName))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20init(args);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20//%20Fire%20off%20updates%20that%20came%20in%20faster%20than%20the%20init%0A%20%20%20%20%20%20while%20(updates.length)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20update%20=%20updates.pop();%0A%20%20%20%20%20%20%20%20%20%20await%20updateFeaturesInner(update);%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20async%20function%20update$1%20(args)%20%7B%0A%20%20%20%20%20%20if%20(!shouldRun())%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(initArgs%20===%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20updates.push(args);%0A%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20updateFeaturesInner(args);%0A%20%20%7D%0A%0A%20%20async%20function%20updateFeaturesInner%20(args)%20%7B%0A%20%20%20%20%20%20const%20resolvedFeatures%20=%20await%20Promise.all(features);%0A%20%20%20%20%20%20resolvedFeatures.forEach((%7B%20update,%20featureName%20%7D)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(!isFeatureBroken(initArgs,%20featureName)%20&&%20update)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20update(args);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%7D%0A%0A%20%20class%20Cookie%20%7B%0A%20%20%20%20%20%20constructor%20(cookieString)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.parts%20=%20cookieString.split(';');%0A%20%20%20%20%20%20%20%20%20%20this.parse();%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20parse%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20EXTRACT_ATTRIBUTES%20=%20new%20Set(%5B'max-age',%20'expires',%20'domain'%5D);%0A%20%20%20%20%20%20%20%20%20%20this.attrIdx%20=%20%7B%7D;%0A%20%20%20%20%20%20%20%20%20%20this.parts.forEach((part,%20index)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20kv%20=%20part.split('=',%201);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20attribute%20=%20kv%5B0%5D.trim();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20value%20=%20part.slice(kv%5B0%5D.length%20+%201);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(index%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.name%20=%20attribute;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.value%20=%20value;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(EXTRACT_ATTRIBUTES.has(attribute.toLowerCase()))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this%5Battribute.toLowerCase()%5D%20=%20value;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.attrIdx%5Battribute.toLowerCase()%5D%20=%20index;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20getExpiry%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20@ts-ignore%0A%20%20%20%20%20%20%20%20%20%20if%20(!this.maxAge%20&&%20!this.expires)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20NaN%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20const%20expiry%20=%20this.maxAge%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20parseInt(this.maxAge)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20@ts-ignore%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20:%20(new%20Date(this.expires)%20-%20new%20Date())%20/%201000;%0A%20%20%20%20%20%20%20%20%20%20return%20expiry%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20get%20maxAge%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20this%5B'max-age'%5D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20set%20maxAge%20(value)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(this.attrIdx%5B'max-age'%5D%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.parts.splice(this.attrIdx%5B'max-age'%5D,%201,%20%60max-age=$%7Bvalue%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.parts.push(%60max-age=$%7Bvalue%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20this.parse();%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20toString%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20this.parts.join(';')%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20/*%20eslint-disable%20quote-props%20*/%0A%20%20/*%20eslint-disable%20quotes%20*/%0A%20%20/*%20eslint-disable%20indent%20*/%0A%20%20/*%20eslint-disable%20eol-last%20*/%0A%20%20/*%20eslint-disable%20no-trailing-spaces%20*/%0A%20%20/*%20eslint-disable%20no-multiple-empty-lines%20*/%0A%20%20%20%20%20%20const%20exceptions%20=%20%5B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22nespresso.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22login%20issues%22%0A%20%20%20%20%7D%0A%20%20%5D;%0A%20%20%20%20%20%20const%20excludedCookieDomains%20=%20%5B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22hangouts.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22docs.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22accounts.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22SSO%20which%20needs%20cookies%20for%20auth%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22googleapis.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22login.live.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22SSO%20which%20needs%20cookies%20for%20auth%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22apis.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22pay.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22payments.amazon.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22payments.amazon.de%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22atlassian.net%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22atlassian.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22paypal.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22paypal.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22salesforce.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22salesforceliveagent.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22force.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22disqus.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22spotify.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22hangouts.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22docs.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22btsport-utils-prod.akamaized.net%22,%0A%20%20%20%20%20%20%22reason%22:%20%22broken%20videos%22%0A%20%20%20%20%7D%0A%20%20%5D;%0A%0A%20%20let%20protectionExempted%20=%20true;%0A%20%20const%20tabHostname%20=%20getTabHostname();%0A%20%20let%20tabExempted%20=%20true;%0A%0A%20%20if%20(tabHostname%20!=%20null)%20%7B%0A%20%20%20%20%20%20tabExempted%20=%20exceptions.some((exception)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20matchHostname(tabHostname,%20exception.domain)%0A%20%20%20%20%20%20%7D);%0A%20%20%7D%0A%20%20const%20frameExempted%20=%20excludedCookieDomains.some((exception)%20=%3E%20%7B%0A%20%20%20%20%20%20return%20matchHostname(globalThis.location.hostname,%20exception.domain)%0A%20%20%7D);%0A%20%20protectionExempted%20=%20frameExempted%20%7C%7C%20tabExempted;%0A%0A%20%20//%20Initial%20cookie%20policy%20pre%20init%0A%20%20let%20cookiePolicy%20=%20%7B%0A%20%20%20%20%20%20debug:%20false,%0A%20%20%20%20%20%20isFrame:%20isBeingFramed(),%0A%20%20%20%20%20%20isTracker:%20false,%0A%20%20%20%20%20%20shouldBlock:%20!protectionExempted,%0A%20%20%20%20%20%20shouldBlockTrackerCookie:%20true,%0A%20%20%20%20%20%20shouldBlockNonTrackerCookie:%20true,%0A%20%20%20%20%20%20isThirdParty:%20isThirdParty(),%0A%20%20%20%20%20%20policy:%20%7B%0A%20%20%20%20%20%20%20%20%20%20threshold:%20604800,%20//%207%20days%0A%20%20%20%20%20%20%20%20%20%20maxAge:%20604800%20//%207%20days%0A%20%20%20%20%20%20%7D%0A%20%20%7D;%0A%0A%20%20let%20loadedPolicyResolve;%0A%20%20//%20Listen%20for%20a%20message%20from%20the%20content%20script%20which%20will%20configure%20the%20policy%20for%20this%20context%0A%20%20const%20trackerHosts%20=%20new%20Set();%0A%0A%20%20/**%0A%20%20%20*%20@param%20%7B'ignore'%20%7C%20'block'%20%7C%20'restrict'%7D%20action%0A%20%20%20*%20@param%20%7Bstring%7D%20reason%0A%20%20%20*%20@param%20%7Bany%7D%20ctx%0A%20%20%20*/%0A%20%20function%20debugHelper%20(action,%20reason,%20ctx)%20%7B%0A%20%20%20%20%20%20cookiePolicy.debug%20&&%20postDebugMessage('jscookie',%20%7B%0A%20%20%20%20%20%20%20%20%20%20action,%0A%20%20%20%20%20%20%20%20%20%20reason,%0A%20%20%20%20%20%20%20%20%20%20stack:%20ctx.stack,%0A%20%20%20%20%20%20%20%20%20%20documentUrl:%20globalThis.document.location.href,%0A%20%20%20%20%20%20%20%20%20%20scriptOrigins:%20%5B...ctx.scriptOrigins%5D,%0A%20%20%20%20%20%20%20%20%20%20value:%20ctx.value%0A%20%20%20%20%20%20%7D);%0A%20%20%7D%0A%0A%20%20function%20shouldBlockTrackingCookie%20()%20%7B%0A%20%20%20%20%20%20return%20cookiePolicy.shouldBlock%20&&%20cookiePolicy.shouldBlockTrackerCookie%20&&%20isTrackingCookie()%0A%20%20%7D%0A%0A%20%20function%20shouldBlockNonTrackingCookie%20()%20%7B%0A%20%20%20%20%20%20return%20cookiePolicy.shouldBlock%20&&%20cookiePolicy.shouldBlockNonTrackerCookie%20&&%20isNonTrackingCookie()%0A%20%20%7D%0A%0A%20%20function%20isTrackingCookie%20()%20%7B%0A%20%20%20%20%20%20return%20cookiePolicy.isFrame%20&&%20cookiePolicy.isTracker%20&&%20cookiePolicy.isThirdParty%0A%20%20%7D%0A%0A%20%20function%20isNonTrackingCookie%20()%20%7B%0A%20%20%20%20%20%20return%20cookiePolicy.isFrame%20&&%20!cookiePolicy.isTracker%20&&%20cookiePolicy.isThirdParty%0A%20%20%7D%0A%0A%20%20function%20load%20(args)%20%7B%0A%20%20%20%20%20%20trackerHosts.clear();%0A%0A%20%20%20%20%20%20//%20The%20cookie%20policy%20is%20injected%20into%20every%20frame%20immediately%20so%20that%20no%20cookie%20will%0A%20%20%20%20%20%20//%20be%20missed.%0A%20%20%20%20%20%20const%20document%20=%20globalThis.document;%0A%20%20%20%20%20%20const%20cookieSetter%20=%20Object.getOwnPropertyDescriptor(globalThis.Document.prototype,%20'cookie').set;%0A%20%20%20%20%20%20const%20cookieGetter%20=%20Object.getOwnPropertyDescriptor(globalThis.Document.prototype,%20'cookie').get;%0A%0A%20%20%20%20%20%20const%20loadPolicy%20=%20new%20Promise((resolve)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20loadedPolicyResolve%20=%20resolve;%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20//%20Create%20the%20then%20callback%20now%20-%20this%20ensures%20that%20Promise.prototype.then%20changes%20won't%20break%0A%20%20%20%20%20%20//%20this%20call.%0A%20%20%20%20%20%20const%20loadPolicyThen%20=%20loadPolicy.then.bind(loadPolicy);%0A%0A%20%20%20%20%20%20function%20getCookiePolicy%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20stack%20=%20getStack();%0A%20%20%20%20%20%20%20%20%20%20const%20scriptOrigins%20=%20getStackTraceOrigins(stack);%0A%20%20%20%20%20%20%20%20%20%20const%20getCookieContext%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20stack,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20scriptOrigins,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value:%20'getter'%0A%20%20%20%20%20%20%20%20%20%20%7D;%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(shouldBlockTrackingCookie()%20%7C%7C%20shouldBlockNonTrackingCookie())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('block',%20'3p%20frame',%20getCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20''%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(isTrackingCookie()%20%7C%7C%20isNonTrackingCookie())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('ignore',%20'3p%20frame',%20getCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20return%20cookieGetter.call(document)%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20setCookiePolicy%20(value)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20stack%20=%20getStack();%0A%20%20%20%20%20%20%20%20%20%20const%20scriptOrigins%20=%20getStackTraceOrigins(stack);%0A%20%20%20%20%20%20%20%20%20%20const%20setCookieContext%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20stack,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20scriptOrigins,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%0A%20%20%20%20%20%20%20%20%20%20%7D;%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(shouldBlockTrackingCookie()%20%7C%7C%20shouldBlockNonTrackingCookie())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('block',%20'3p%20frame',%20setCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(isTrackingCookie()%20%7C%7C%20isNonTrackingCookie())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('ignore',%20'3p%20frame',%20setCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20//%20call%20the%20native%20document.cookie%20implementation.%20This%20will%20set%20the%20cookie%20immediately%0A%20%20%20%20%20%20%20%20%20%20//%20if%20the%20value%20is%20valid.%20We%20will%20override%20this%20set%20later%20if%20the%20policy%20dictates%20that%0A%20%20%20%20%20%20%20%20%20%20//%20the%20expiry%20should%20be%20changed.%0A%20%20%20%20%20%20%20%20%20%20cookieSetter.call(document,%20value);%0A%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20wait%20for%20config%20before%20doing%20same-site%20tests%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20loadPolicyThen(()%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20%7B%20shouldBlock,%20policy%20%7D%20=%20cookiePolicy;%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!shouldBlock)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('ignore',%20'disabled',%20setCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20extract%20cookie%20expiry%20from%20cookie%20string%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20cookie%20=%20new%20Cookie(value);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20apply%20cookie%20policy%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(cookie.getExpiry()%20%3E%20policy.threshold)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20check%20if%20the%20cookie%20still%20exists%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(document.cookie.split(';').findIndex(kv%20=%3E%20kv.trim().startsWith(cookie.parts%5B0%5D.trim()))%20!==%20-1)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cookie.maxAge%20=%20policy.maxAge;%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('restrict',%20'expiry',%20setCookieContext);%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cookieSetter.apply(document,%20%5Bcookie.toString()%5D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('ignore',%20'dissappeared',%20setCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('ignore',%20'expiry',%20setCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('ignore',%20'error',%20setCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20suppress%20error%20in%20cookie%20override%20to%20avoid%20breakage%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.warn('Error%20in%20cookie%20override',%20e);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20defineProperty(document,%20'cookie',%20%7B%0A%20%20%20%20%20%20%20%20%20%20configurable:%20true,%0A%20%20%20%20%20%20%20%20%20%20set:%20setCookiePolicy,%0A%20%20%20%20%20%20%20%20%20%20get:%20getCookiePolicy%0A%20%20%20%20%20%20%7D);%0A%20%20%7D%0A%0A%20%20function%20init$c%20(args)%20%7B%0A%20%20%20%20%20%20args.cookie.debug%20=%20args.debug;%0A%20%20%20%20%20%20cookiePolicy%20=%20args.cookie;%0A%0A%20%20%20%20%20%20const%20featureName%20=%20'cookie';%0A%20%20%20%20%20%20cookiePolicy.shouldBlockTrackerCookie%20=%20getFeatureSettingEnabled(featureName,%20args,%20'trackerCookie');%0A%20%20%20%20%20%20cookiePolicy.shouldBlockNonTrackerCookie%20=%20getFeatureSettingEnabled(featureName,%20args,%20'nonTrackerCookie');%0A%20%20%20%20%20%20const%20policy%20=%20getFeatureSetting(featureName,%20args,%20'firstPartyCookiePolicy');%0A%20%20%20%20%20%20if%20(policy)%20%7B%0A%20%20%20%20%20%20%20%20%20%20cookiePolicy.policy%20=%20policy;%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20loadedPolicyResolve();%0A%20%20%7D%0A%0A%20%20function%20update%20(args)%20%7B%0A%20%20%20%20%20%20if%20(args.trackerDefinition)%20%7B%0A%20%20%20%20%20%20%20%20%20%20trackerHosts.add(args.hostname);%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20cookie%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20load:%20load,%0A%20%20%20%20init:%20init$c,%0A%20%20%20%20update:%20update%0A%20%20%7D);%0A%0A%20%20function%20init$b%20(args)%20%7B%0A%20%20%20%20%20%20const%20%7B%20sessionKey,%20site%20%7D%20=%20args;%0A%20%20%20%20%20%20const%20domainKey%20=%20site.domain;%0A%20%20%20%20%20%20const%20featureName%20=%20'fingerprinting-audio';%0A%0A%20%20%20%20%20%20//%20In%20place%20modify%20array%20data%20to%20remove%20fingerprinting%0A%20%20%20%20%20%20function%20transformArrayData%20(channelData,%20domainKey,%20sessionKey,%20thisArg)%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20%7B%20audioKey%20%7D%20=%20getCachedResponse(thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20if%20(!audioKey)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20let%20cdSum%20=%200;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(const%20k%20in%20channelData)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cdSum%20+=%20channelData%5Bk%5D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20If%20the%20buffer%20is%20blank,%20skip%20adding%20data%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(cdSum%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20audioKey%20=%20getDataKeySync(sessionKey,%20domainKey,%20cdSum);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setCache(thisArg,%20args,%20audioKey);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20iterateDataKey(audioKey,%20(item,%20byte)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20itemAudioIndex%20=%20item%20%25%20channelData.length;%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20let%20factor%20=%20byte%20*%200.0000001;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(byte%20%5E%200x1)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20factor%20=%200%20-%20factor;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20channelData%5BitemAudioIndex%5D%20=%20channelData%5BitemAudioIndex%5D%20+%20factor;%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20copyFromChannelProxy%20=%20new%20DDGProxy(featureName,%20AudioBuffer.prototype,%20'copyFromChannel',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20%5Bsource,%20channelNumber,%20startInChannel%5D%20=%20args;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20This%20is%20implemented%20in%20a%20different%20way%20to%20canvas%20purely%20because%20calling%20the%20function%20copied%20the%20original%20value,%20which%20is%20not%20ideal%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(//%20If%20channelNumber%20is%20longer%20than%20arrayBuffer%20number%20of%20channels%20then%20call%20the%20default%20method%20to%20throw%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20channelNumber%20%3E%20thisArg.numberOfChannels%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20If%20startInChannel%20is%20longer%20than%20the%20arrayBuffer%20length%20then%20call%20the%20default%20method%20to%20throw%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20startInChannel%20%3E%20thisArg.length)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20The%20normal%20return%20value%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Call%20the%20protected%20getChannelData%20we%20implement,%20slice%20from%20the%20startInChannel%20value%20and%20assign%20to%20the%20source%20array%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20thisArg.getChannelData(channelNumber).slice(startInChannel).forEach((val,%20index)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20source%5Bindex%5D%20=%20val;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20copyFromChannelProxy.overload();%0A%0A%20%20%20%20%20%20const%20cacheExpiry%20=%2060;%0A%20%20%20%20%20%20const%20cacheData%20=%20new%20WeakMap();%0A%20%20%20%20%20%20function%20getCachedResponse%20(thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20data%20=%20cacheData.get(thisArg);%0A%20%20%20%20%20%20%20%20%20%20const%20timeNow%20=%20Date.now();%0A%20%20%20%20%20%20%20%20%20%20if%20(data%20&&%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20data.args%20===%20JSON.stringify(args)%20&&%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20data.expires%20%3E%20timeNow)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20data.expires%20=%20timeNow%20+%20cacheExpiry;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20cacheData.set(thisArg,%20data);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20data%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20return%20%7B%20audioKey:%20null%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20setCache%20(thisArg,%20args,%20audioKey)%20%7B%0A%20%20%20%20%20%20%20%20%20%20cacheData.set(thisArg,%20%7B%20args:%20JSON.stringify(args),%20expires:%20Date.now()%20+%20cacheExpiry,%20audioKey%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20getChannelDataProxy%20=%20new%20DDGProxy(featureName,%20AudioBuffer.prototype,%20'getChannelData',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20The%20normal%20return%20value%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20channelData%20=%20DDGReflect.apply(target,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Anything%20we%20do%20here%20should%20be%20caught%20and%20ignored%20silently%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20transformArrayData(channelData,%20domainKey,%20sessionKey,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20channelData%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20getChannelDataProxy.overload();%0A%0A%20%20%20%20%20%20const%20audioMethods%20=%20%5B'getByteTimeDomainData',%20'getFloatTimeDomainData',%20'getByteFrequencyData',%20'getFloatFrequencyData'%5D;%0A%20%20%20%20%20%20for%20(const%20methodName%20of%20audioMethods)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20proxy%20=%20new%20DDGProxy(featureName,%20AnalyserNode.prototype,%20methodName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DDGReflect.apply(target,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Anything%20we%20do%20here%20should%20be%20caught%20and%20ignored%20silently%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20transformArrayData(args%5B0%5D,%20domainKey,%20sessionKey,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20proxy.overload();%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20fingerprintingAudio%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$b%0A%20%20%7D);%0A%0A%20%20/**%0A%20%20%20*%20Overwrites%20the%20Battery%20API%20if%20present%20in%20the%20browser.%0A%20%20%20*%20It%20will%20return%20the%20values%20defined%20in%20the%20getBattery%20function%20to%20the%20client,%0A%20%20%20*%20as%20well%20as%20prevent%20any%20script%20from%20listening%20to%20events.%0A%20%20%20*/%0A%20%20function%20init$a%20(args)%20%7B%0A%20%20%20%20%20%20if%20(globalThis.navigator.getBattery)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20BatteryManager%20=%20globalThis.BatteryManager;%0A%0A%20%20%20%20%20%20%20%20%20%20const%20spoofedValues%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20charging:%20true,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20chargingTime:%200,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dischargingTime:%20Infinity,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20level:%201%0A%20%20%20%20%20%20%20%20%20%20%7D;%0A%20%20%20%20%20%20%20%20%20%20const%20eventProperties%20=%20%5B'onchargingchange',%20'onchargingtimechange',%20'ondischargingtimechange',%20'onlevelchange'%5D;%0A%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20%5Bprop,%20val%5D%20of%20Object.entries(spoofedValues))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defineProperty(BatteryManager.prototype,%20prop,%20%7B%20get:%20()%20=%3E%20val%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20eventProp%20of%20eventProperties)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defineProperty(BatteryManager.prototype,%20eventProp,%20%7B%20get:%20()%20=%3E%20null%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20fingerprintingBattery%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$a%0A%20%20%7D);%0A%0A%20%20var%20commonjsGlobal%20=%20typeof%20globalThis%20!==%20'undefined'%20?%20globalThis%20:%20typeof%20window%20!==%20'undefined'%20?%20window%20:%20typeof%20global%20!==%20'undefined'%20?%20global%20:%20typeof%20self%20!==%20'undefined'%20?%20self%20:%20%7B%7D;%0A%0A%20%20var%20alea$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09//%20A%20port%20of%20an%20algorithm%20by%20Johannes%20Baag%C3%B8e%20%3Cbaagoe@baagoe.com%3E,%202010%0A%20%20%09//%20http://baagoe.com/en/RandomMusings/javascript/%0A%20%20%09//%20https://github.com/nquinlan/better-random-numbers-for-javascript-mirror%0A%20%20%09//%20Original%20work%20is%20under%20MIT%20license%20-%0A%0A%20%20%09//%20Copyright%20(C)%202010%20by%20Johannes%20Baag%C3%B8e%20%3Cbaagoe@baagoe.org%3E%0A%20%20%09//%0A%20%20%09//%20Permission%20is%20hereby%20granted,%20free%20of%20charge,%20to%20any%20person%20obtaining%20a%20copy%0A%20%20%09//%20of%20this%20software%20and%20associated%20documentation%20files%20(the%20%22Software%22),%20to%20deal%0A%20%20%09//%20in%20the%20Software%20without%20restriction,%20including%20without%20limitation%20the%20rights%0A%20%20%09//%20to%20use,%20copy,%20modify,%20merge,%20publish,%20distribute,%20sublicense,%20and/or%20sell%0A%20%20%09//%20copies%20of%20the%20Software,%20and%20to%20permit%20persons%20to%20whom%20the%20Software%20is%0A%20%20%09//%20furnished%20to%20do%20so,%20subject%20to%20the%20following%20conditions:%0A%20%20%09//%0A%20%20%09//%20The%20above%20copyright%20notice%20and%20this%20permission%20notice%20shall%20be%20included%20in%0A%20%20%09//%20all%20copies%20or%20substantial%20portions%20of%20the%20Software.%0A%20%20%09//%0A%20%20%09//%20THE%20SOFTWARE%20IS%20PROVIDED%20%22AS%20IS%22,%20WITHOUT%20WARRANTY%20OF%20ANY%20KIND,%20EXPRESS%20OR%0A%20%20%09//%20IMPLIED,%20INCLUDING%20BUT%20NOT%20LIMITED%20TO%20THE%20WARRANTIES%20OF%20MERCHANTABILITY,%0A%20%20%09//%20FITNESS%20FOR%20A%20PARTICULAR%20PURPOSE%20AND%20NONINFRINGEMENT.%20IN%20NO%20EVENT%20SHALL%20THE%0A%20%20%09//%20AUTHORS%20OR%20COPYRIGHT%20HOLDERS%20BE%20LIABLE%20FOR%20ANY%20CLAIM,%20DAMAGES%20OR%20OTHER%0A%20%20%09//%20LIABILITY,%20WHETHER%20IN%20AN%20ACTION%20OF%20CONTRACT,%20TORT%20OR%20OTHERWISE,%20ARISING%20FROM,%0A%20%20%09//%20OUT%20OF%20OR%20IN%20CONNECTION%20WITH%20THE%20SOFTWARE%20OR%20THE%20USE%20OR%20OTHER%20DEALINGS%20IN%0A%20%20%09//%20THE%20SOFTWARE.%0A%0A%0A%0A%20%20%09(function(global,%20module,%20define)%20%7B%0A%0A%20%20%09function%20Alea(seed)%20%7B%0A%20%20%09%20%20var%20me%20=%20this,%20mash%20=%20Mash();%0A%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20t%20=%202091639%20*%20me.s0%20+%20me.c%20*%202.3283064365386963e-10;%20//%202%5E-32%0A%20%20%09%20%20%20%20me.s0%20=%20me.s1;%0A%20%20%09%20%20%20%20me.s1%20=%20me.s2;%0A%20%20%09%20%20%20%20return%20me.s2%20=%20t%20-%20(me.c%20=%20t%20%7C%200);%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20//%20Apply%20the%20seeding%20algorithm%20from%20Baagoe.%0A%20%20%09%20%20me.c%20=%201;%0A%20%20%09%20%20me.s0%20=%20mash('%20');%0A%20%20%09%20%20me.s1%20=%20mash('%20');%0A%20%20%09%20%20me.s2%20=%20mash('%20');%0A%20%20%09%20%20me.s0%20-=%20mash(seed);%0A%20%20%09%20%20if%20(me.s0%20%3C%200)%20%7B%20me.s0%20+=%201;%20%7D%0A%20%20%09%20%20me.s1%20-=%20mash(seed);%0A%20%20%09%20%20if%20(me.s1%20%3C%200)%20%7B%20me.s1%20+=%201;%20%7D%0A%20%20%09%20%20me.s2%20-=%20mash(seed);%0A%20%20%09%20%20if%20(me.s2%20%3C%200)%20%7B%20me.s2%20+=%201;%20%7D%0A%20%20%09%20%20mash%20=%20null;%0A%20%20%09%7D%0A%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.c%20=%20f.c;%0A%20%20%09%20%20t.s0%20=%20f.s0;%0A%20%20%09%20%20t.s1%20=%20f.s1;%0A%20%20%09%20%20t.s2%20=%20f.s2;%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%0A%20%20%09function%20impl(seed,%20opts)%20%7B%0A%20%20%09%20%20var%20xg%20=%20new%20Alea(seed),%0A%20%20%09%20%20%20%20%20%20state%20=%20opts%20&&%20opts.state,%0A%20%20%09%20%20%20%20%20%20prng%20=%20xg.next;%0A%20%20%09%20%20prng.int32%20=%20function()%20%7B%20return%20(xg.next()%20*%200x100000000)%20%7C%200;%20%7D;%0A%20%20%09%20%20prng.double%20=%20function()%20%7B%0A%20%20%09%20%20%20%20return%20prng()%20+%20(prng()%20*%200x200000%20%7C%200)%20*%201.1102230246251565e-16;%20//%202%5E-53%0A%20%20%09%20%20%7D;%0A%20%20%09%20%20prng.quick%20=%20prng;%0A%20%20%09%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20if%20(typeof(state)%20==%20'object')%20copy(state,%20xg);%0A%20%20%09%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(xg,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20prng;%0A%20%20%09%7D%0A%0A%20%20%09function%20Mash()%20%7B%0A%20%20%09%20%20var%20n%20=%200xefc8249d;%0A%0A%20%20%09%20%20var%20mash%20=%20function(data)%20%7B%0A%20%20%09%20%20%20%20data%20=%20String(data);%0A%20%20%09%20%20%20%20for%20(var%20i%20=%200;%20i%20%3C%20data.length;%20i++)%20%7B%0A%20%20%09%20%20%20%20%20%20n%20+=%20data.charCodeAt(i);%0A%20%20%09%20%20%20%20%20%20var%20h%20=%200.02519603282416938%20*%20n;%0A%20%20%09%20%20%20%20%20%20n%20=%20h%20%3E%3E%3E%200;%0A%20%20%09%20%20%20%20%20%20h%20-=%20n;%0A%20%20%09%20%20%20%20%20%20h%20*=%20n;%0A%20%20%09%20%20%20%20%20%20n%20=%20h%20%3E%3E%3E%200;%0A%20%20%09%20%20%20%20%20%20h%20-=%20n;%0A%20%20%09%20%20%20%20%20%20n%20+=%20h%20*%200x100000000;%20//%202%5E32%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20return%20(n%20%3E%3E%3E%200)%20*%202.3283064365386963e-10;%20//%202%5E-32%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20return%20mash;%0A%20%20%09%7D%0A%0A%0A%20%20%09if%20(module%20&&%20module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20impl;%0A%20%20%09%7D%20else%20if%20(define%20&&%20define.amd)%20%7B%0A%20%20%09%20%20define(function()%20%7B%20return%20impl;%20%7D);%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20this.alea%20=%20impl;%0A%20%20%09%7D%0A%0A%20%20%09%7D)(%0A%20%20%09%20%20commonjsGlobal,%0A%20%20%09%20%20module,%20%20%20%20//%20present%20in%20node.js%0A%20%20%09%20%20(typeof%20undefined)%20==%20'function'%20%20%20%20//%20present%20with%20an%20AMD%20loader%0A%20%20%09);%0A%20%20%7D%20(alea$1));%0A%0A%20%20var%20xor128$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09//%20A%20Javascript%20implementaion%20of%20the%20%22xor128%22%20prng%20algorithm%20by%0A%20%20%09//%20George%20Marsaglia.%20%20See%20http://www.jstatsoft.org/v08/i14/paper%0A%0A%20%20%09(function(global,%20module,%20define)%20%7B%0A%0A%20%20%09function%20XorGen(seed)%20%7B%0A%20%20%09%20%20var%20me%20=%20this,%20strseed%20=%20'';%0A%0A%20%20%09%20%20me.x%20=%200;%0A%20%20%09%20%20me.y%20=%200;%0A%20%20%09%20%20me.z%20=%200;%0A%20%20%09%20%20me.w%20=%200;%0A%0A%20%20%09%20%20//%20Set%20up%20generator%20function.%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20t%20=%20me.x%20%5E%20(me.x%20%3C%3C%2011);%0A%20%20%09%20%20%20%20me.x%20=%20me.y;%0A%20%20%09%20%20%20%20me.y%20=%20me.z;%0A%20%20%09%20%20%20%20me.z%20=%20me.w;%0A%20%20%09%20%20%20%20return%20me.w%20%5E=%20(me.w%20%3E%3E%3E%2019)%20%5E%20t%20%5E%20(t%20%3E%3E%3E%208);%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20if%20(seed%20===%20(seed%20%7C%200))%20%7B%0A%20%20%09%20%20%20%20//%20Integer%20seed.%0A%20%20%09%20%20%20%20me.x%20=%20seed;%0A%20%20%09%20%20%7D%20else%20%7B%0A%20%20%09%20%20%20%20//%20String%20seed.%0A%20%20%09%20%20%20%20strseed%20+=%20seed;%0A%20%20%09%20%20%7D%0A%0A%20%20%09%20%20//%20Mix%20in%20string%20seed,%20then%20discard%20an%20initial%20batch%20of%2064%20values.%0A%20%20%09%20%20for%20(var%20k%20=%200;%20k%20%3C%20strseed.length%20+%2064;%20k++)%20%7B%0A%20%20%09%20%20%20%20me.x%20%5E=%20strseed.charCodeAt(k)%20%7C%200;%0A%20%20%09%20%20%20%20me.next();%0A%20%20%09%20%20%7D%0A%20%20%09%7D%0A%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.x%20=%20f.x;%0A%20%20%09%20%20t.y%20=%20f.y;%0A%20%20%09%20%20t.z%20=%20f.z;%0A%20%20%09%20%20t.w%20=%20f.w;%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%0A%20%20%09function%20impl(seed,%20opts)%20%7B%0A%20%20%09%20%20var%20xg%20=%20new%20XorGen(seed),%0A%20%20%09%20%20%20%20%20%20state%20=%20opts%20&&%20opts.state,%0A%20%20%09%20%20%20%20%20%20prng%20=%20function()%20%7B%20return%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000;%20%7D;%0A%20%20%09%20%20prng.double%20=%20function()%20%7B%0A%20%20%09%20%20%20%20do%20%7B%0A%20%20%09%20%20%20%20%20%20var%20top%20=%20xg.next()%20%3E%3E%3E%2011,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20bot%20=%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20result%20=%20(top%20+%20bot)%20/%20(1%20%3C%3C%2021);%0A%20%20%09%20%20%20%20%7D%20while%20(result%20===%200);%0A%20%20%09%20%20%20%20return%20result;%0A%20%20%09%20%20%7D;%0A%20%20%09%20%20prng.int32%20=%20xg.next;%0A%20%20%09%20%20prng.quick%20=%20prng;%0A%20%20%09%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20if%20(typeof(state)%20==%20'object')%20copy(state,%20xg);%0A%20%20%09%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(xg,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20prng;%0A%20%20%09%7D%0A%0A%20%20%09if%20(module%20&&%20module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20impl;%0A%20%20%09%7D%20else%20if%20(define%20&&%20define.amd)%20%7B%0A%20%20%09%20%20define(function()%20%7B%20return%20impl;%20%7D);%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20this.xor128%20=%20impl;%0A%20%20%09%7D%0A%0A%20%20%09%7D)(%0A%20%20%09%20%20commonjsGlobal,%0A%20%20%09%20%20module,%20%20%20%20//%20present%20in%20node.js%0A%20%20%09%20%20(typeof%20undefined)%20==%20'function'%20%20%20%20//%20present%20with%20an%20AMD%20loader%0A%20%20%09);%0A%20%20%7D%20(xor128$1));%0A%0A%20%20var%20xorwow$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09//%20A%20Javascript%20implementaion%20of%20the%20%22xorwow%22%20prng%20algorithm%20by%0A%20%20%09//%20George%20Marsaglia.%20%20See%20http://www.jstatsoft.org/v08/i14/paper%0A%0A%20%20%09(function(global,%20module,%20define)%20%7B%0A%0A%20%20%09function%20XorGen(seed)%20%7B%0A%20%20%09%20%20var%20me%20=%20this,%20strseed%20=%20'';%0A%0A%20%20%09%20%20//%20Set%20up%20generator%20function.%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20t%20=%20(me.x%20%5E%20(me.x%20%3E%3E%3E%202));%0A%20%20%09%20%20%20%20me.x%20=%20me.y;%20me.y%20=%20me.z;%20me.z%20=%20me.w;%20me.w%20=%20me.v;%0A%20%20%09%20%20%20%20return%20(me.d%20=%20(me.d%20+%20362437%20%7C%200))%20+%0A%20%20%09%20%20%20%20%20%20%20(me.v%20=%20(me.v%20%5E%20(me.v%20%3C%3C%204))%20%5E%20(t%20%5E%20(t%20%3C%3C%201)))%20%7C%200;%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20me.x%20=%200;%0A%20%20%09%20%20me.y%20=%200;%0A%20%20%09%20%20me.z%20=%200;%0A%20%20%09%20%20me.w%20=%200;%0A%20%20%09%20%20me.v%20=%200;%0A%0A%20%20%09%20%20if%20(seed%20===%20(seed%20%7C%200))%20%7B%0A%20%20%09%20%20%20%20//%20Integer%20seed.%0A%20%20%09%20%20%20%20me.x%20=%20seed;%0A%20%20%09%20%20%7D%20else%20%7B%0A%20%20%09%20%20%20%20//%20String%20seed.%0A%20%20%09%20%20%20%20strseed%20+=%20seed;%0A%20%20%09%20%20%7D%0A%0A%20%20%09%20%20//%20Mix%20in%20string%20seed,%20then%20discard%20an%20initial%20batch%20of%2064%20values.%0A%20%20%09%20%20for%20(var%20k%20=%200;%20k%20%3C%20strseed.length%20+%2064;%20k++)%20%7B%0A%20%20%09%20%20%20%20me.x%20%5E=%20strseed.charCodeAt(k)%20%7C%200;%0A%20%20%09%20%20%20%20if%20(k%20==%20strseed.length)%20%7B%0A%20%20%09%20%20%20%20%20%20me.d%20=%20me.x%20%3C%3C%2010%20%5E%20me.x%20%3E%3E%3E%204;%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20me.next();%0A%20%20%09%20%20%7D%0A%20%20%09%7D%0A%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.x%20=%20f.x;%0A%20%20%09%20%20t.y%20=%20f.y;%0A%20%20%09%20%20t.z%20=%20f.z;%0A%20%20%09%20%20t.w%20=%20f.w;%0A%20%20%09%20%20t.v%20=%20f.v;%0A%20%20%09%20%20t.d%20=%20f.d;%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%0A%20%20%09function%20impl(seed,%20opts)%20%7B%0A%20%20%09%20%20var%20xg%20=%20new%20XorGen(seed),%0A%20%20%09%20%20%20%20%20%20state%20=%20opts%20&&%20opts.state,%0A%20%20%09%20%20%20%20%20%20prng%20=%20function()%20%7B%20return%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000;%20%7D;%0A%20%20%09%20%20prng.double%20=%20function()%20%7B%0A%20%20%09%20%20%20%20do%20%7B%0A%20%20%09%20%20%20%20%20%20var%20top%20=%20xg.next()%20%3E%3E%3E%2011,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20bot%20=%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20result%20=%20(top%20+%20bot)%20/%20(1%20%3C%3C%2021);%0A%20%20%09%20%20%20%20%7D%20while%20(result%20===%200);%0A%20%20%09%20%20%20%20return%20result;%0A%20%20%09%20%20%7D;%0A%20%20%09%20%20prng.int32%20=%20xg.next;%0A%20%20%09%20%20prng.quick%20=%20prng;%0A%20%20%09%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20if%20(typeof(state)%20==%20'object')%20copy(state,%20xg);%0A%20%20%09%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(xg,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20prng;%0A%20%20%09%7D%0A%0A%20%20%09if%20(module%20&&%20module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20impl;%0A%20%20%09%7D%20else%20if%20(define%20&&%20define.amd)%20%7B%0A%20%20%09%20%20define(function()%20%7B%20return%20impl;%20%7D);%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20this.xorwow%20=%20impl;%0A%20%20%09%7D%0A%0A%20%20%09%7D)(%0A%20%20%09%20%20commonjsGlobal,%0A%20%20%09%20%20module,%20%20%20%20//%20present%20in%20node.js%0A%20%20%09%20%20(typeof%20undefined)%20==%20'function'%20%20%20%20//%20present%20with%20an%20AMD%20loader%0A%20%20%09);%0A%20%20%7D%20(xorwow$1));%0A%0A%20%20var%20xorshift7$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09//%20A%20Javascript%20implementaion%20of%20the%20%22xorshift7%22%20algorithm%20by%0A%20%20%09//%20Fran%C3%A7ois%20Panneton%20and%20Pierre%20L'ecuyer:%0A%20%20%09//%20%22On%20the%20Xorgshift%20Random%20Number%20Generators%22%0A%20%20%09//%20http://saluc.engr.uconn.edu/refs/crypto/rng/panneton05onthexorshift.pdf%0A%0A%20%20%09(function(global,%20module,%20define)%20%7B%0A%0A%20%20%09function%20XorGen(seed)%20%7B%0A%20%20%09%20%20var%20me%20=%20this;%0A%0A%20%20%09%20%20//%20Set%20up%20generator%20function.%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20//%20Update%20xor%20generator.%0A%20%20%09%20%20%20%20var%20X%20=%20me.x,%20i%20=%20me.i,%20t,%20v;%0A%20%20%09%20%20%20%20t%20=%20X%5Bi%5D;%20t%20%5E=%20(t%20%3E%3E%3E%207);%20v%20=%20t%20%5E%20(t%20%3C%3C%2024);%0A%20%20%09%20%20%20%20t%20=%20X%5B(i%20+%201)%20&%207%5D;%20v%20%5E=%20t%20%5E%20(t%20%3E%3E%3E%2010);%0A%20%20%09%20%20%20%20t%20=%20X%5B(i%20+%203)%20&%207%5D;%20v%20%5E=%20t%20%5E%20(t%20%3E%3E%3E%203);%0A%20%20%09%20%20%20%20t%20=%20X%5B(i%20+%204)%20&%207%5D;%20v%20%5E=%20t%20%5E%20(t%20%3C%3C%207);%0A%20%20%09%20%20%20%20t%20=%20X%5B(i%20+%207)%20&%207%5D;%20t%20=%20t%20%5E%20(t%20%3C%3C%2013);%20v%20%5E=%20t%20%5E%20(t%20%3C%3C%209);%0A%20%20%09%20%20%20%20X%5Bi%5D%20=%20v;%0A%20%20%09%20%20%20%20me.i%20=%20(i%20+%201)%20&%207;%0A%20%20%09%20%20%20%20return%20v;%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20function%20init(me,%20seed)%20%7B%0A%20%20%09%20%20%20%20var%20j,%20X%20=%20%5B%5D;%0A%0A%20%20%09%20%20%20%20if%20(seed%20===%20(seed%20%7C%200))%20%7B%0A%20%20%09%20%20%20%20%20%20//%20Seed%20state%20array%20using%20a%2032-bit%20integer.%0A%20%20%09%20%20%20%20%20%20X%5B0%5D%20=%20seed;%0A%20%20%09%20%20%20%20%7D%20else%20%7B%0A%20%20%09%20%20%20%20%20%20//%20Seed%20state%20using%20a%20string.%0A%20%20%09%20%20%20%20%20%20seed%20=%20''%20+%20seed;%0A%20%20%09%20%20%20%20%20%20for%20(j%20=%200;%20j%20%3C%20seed.length;%20++j)%20%7B%0A%20%20%09%20%20%20%20%20%20%20%20X%5Bj%20&%207%5D%20=%20(X%5Bj%20&%207%5D%20%3C%3C%2015)%20%5E%0A%20%20%09%20%20%20%20%20%20%20%20%20%20%20%20(seed.charCodeAt(j)%20+%20X%5B(j%20+%201)%20&%207%5D%20%3C%3C%2013);%0A%20%20%09%20%20%20%20%20%20%7D%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20//%20Enforce%20an%20array%20length%20of%208,%20not%20all%20zeroes.%0A%20%20%09%20%20%20%20while%20(X.length%20%3C%208)%20X.push(0);%0A%20%20%09%20%20%20%20for%20(j%20=%200;%20j%20%3C%208%20&&%20X%5Bj%5D%20===%200;%20++j);%0A%20%20%09%20%20%20%20if%20(j%20==%208)%20X%5B7%5D%20=%20-1;%20else%20X%5Bj%5D;%0A%0A%20%20%09%20%20%20%20me.x%20=%20X;%0A%20%20%09%20%20%20%20me.i%20=%200;%0A%0A%20%20%09%20%20%20%20//%20Discard%20an%20initial%20256%20values.%0A%20%20%09%20%20%20%20for%20(j%20=%20256;%20j%20%3E%200;%20--j)%20%7B%0A%20%20%09%20%20%20%20%20%20me.next();%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%7D%0A%0A%20%20%09%20%20init(me,%20seed);%0A%20%20%09%7D%0A%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.x%20=%20f.x.slice();%0A%20%20%09%20%20t.i%20=%20f.i;%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%0A%20%20%09function%20impl(seed,%20opts)%20%7B%0A%20%20%09%20%20if%20(seed%20==%20null)%20seed%20=%20+(new%20Date);%0A%20%20%09%20%20var%20xg%20=%20new%20XorGen(seed),%0A%20%20%09%20%20%20%20%20%20state%20=%20opts%20&&%20opts.state,%0A%20%20%09%20%20%20%20%20%20prng%20=%20function()%20%7B%20return%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000;%20%7D;%0A%20%20%09%20%20prng.double%20=%20function()%20%7B%0A%20%20%09%20%20%20%20do%20%7B%0A%20%20%09%20%20%20%20%20%20var%20top%20=%20xg.next()%20%3E%3E%3E%2011,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20bot%20=%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20result%20=%20(top%20+%20bot)%20/%20(1%20%3C%3C%2021);%0A%20%20%09%20%20%20%20%7D%20while%20(result%20===%200);%0A%20%20%09%20%20%20%20return%20result;%0A%20%20%09%20%20%7D;%0A%20%20%09%20%20prng.int32%20=%20xg.next;%0A%20%20%09%20%20prng.quick%20=%20prng;%0A%20%20%09%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20if%20(state.x)%20copy(state,%20xg);%0A%20%20%09%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(xg,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20prng;%0A%20%20%09%7D%0A%0A%20%20%09if%20(module%20&&%20module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20impl;%0A%20%20%09%7D%20else%20if%20(define%20&&%20define.amd)%20%7B%0A%20%20%09%20%20define(function()%20%7B%20return%20impl;%20%7D);%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20this.xorshift7%20=%20impl;%0A%20%20%09%7D%0A%0A%20%20%09%7D)(%0A%20%20%09%20%20commonjsGlobal,%0A%20%20%09%20%20module,%20%20%20%20//%20present%20in%20node.js%0A%20%20%09%20%20(typeof%20undefined)%20==%20'function'%20%20%20%20//%20present%20with%20an%20AMD%20loader%0A%20%20%09);%0A%20%20%7D%20(xorshift7$1));%0A%0A%20%20var%20xor4096$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09//%20A%20Javascript%20implementaion%20of%20Richard%20Brent's%20Xorgens%20xor4096%20algorithm.%0A%20%20%09//%0A%20%20%09//%20This%20fast%20non-cryptographic%20random%20number%20generator%20is%20designed%20for%0A%20%20%09//%20use%20in%20Monte-Carlo%20algorithms.%20It%20combines%20a%20long-period%20xorshift%0A%20%20%09//%20generator%20with%20a%20Weyl%20generator,%20and%20it%20passes%20all%20common%20batteries%0A%20%20%09//%20of%20stasticial%20tests%20for%20randomness%20while%20consuming%20only%20a%20few%20nanoseconds%0A%20%20%09//%20for%20each%20prng%20generated.%20%20For%20background%20on%20the%20generator,%20see%20Brent's%0A%20%20%09//%20paper:%20%22Some%20long-period%20random%20number%20generators%20using%20shifts%20and%20xors.%22%0A%20%20%09//%20http://arxiv.org/pdf/1004.3115v1.pdf%0A%20%20%09//%0A%20%20%09//%20Usage:%0A%20%20%09//%0A%20%20%09//%20var%20xor4096%20=%20require('xor4096');%0A%20%20%09//%20random%20=%20xor4096(1);%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Seed%20with%20int32%20or%20string.%0A%20%20%09//%20assert.equal(random(),%200.1520436450538547);%20//%20(0,%201)%20range,%2053%20bits.%0A%20%20%09//%20assert.equal(random.int32(),%201806534897);%20%20%20//%20signed%20int32,%2032%20bits.%0A%20%20%09//%0A%20%20%09//%20For%20nonzero%20numeric%20keys,%20this%20impelementation%20provides%20a%20sequence%0A%20%20%09//%20identical%20to%20that%20by%20Brent's%20xorgens%203%20implementaion%20in%20C.%20%20This%0A%20%20%09//%20implementation%20also%20provides%20for%20initalizing%20the%20generator%20with%0A%20%20%09//%20string%20seeds,%20or%20for%20saving%20and%20restoring%20the%20state%20of%20the%20generator.%0A%20%20%09//%0A%20%20%09//%20On%20Chrome,%20this%20prng%20benchmarks%20about%202.1%20times%20slower%20than%0A%20%20%09//%20Javascript's%20built-in%20Math.random().%0A%0A%20%20%09(function(global,%20module,%20define)%20%7B%0A%0A%20%20%09function%20XorGen(seed)%20%7B%0A%20%20%09%20%20var%20me%20=%20this;%0A%0A%20%20%09%20%20//%20Set%20up%20generator%20function.%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20w%20=%20me.w,%0A%20%20%09%20%20%20%20%20%20%20%20X%20=%20me.X,%20i%20=%20me.i,%20t,%20v;%0A%20%20%09%20%20%20%20//%20Update%20Weyl%20generator.%0A%20%20%09%20%20%20%20me.w%20=%20w%20=%20(w%20+%200x61c88647)%20%7C%200;%0A%20%20%09%20%20%20%20//%20Update%20xor%20generator.%0A%20%20%09%20%20%20%20v%20=%20X%5B(i%20+%2034)%20&%20127%5D;%0A%20%20%09%20%20%20%20t%20=%20X%5Bi%20=%20((i%20+%201)%20&%20127)%5D;%0A%20%20%09%20%20%20%20v%20%5E=%20v%20%3C%3C%2013;%0A%20%20%09%20%20%20%20t%20%5E=%20t%20%3C%3C%2017;%0A%20%20%09%20%20%20%20v%20%5E=%20v%20%3E%3E%3E%2015;%0A%20%20%09%20%20%20%20t%20%5E=%20t%20%3E%3E%3E%2012;%0A%20%20%09%20%20%20%20//%20Update%20Xor%20generator%20array%20state.%0A%20%20%09%20%20%20%20v%20=%20X%5Bi%5D%20=%20v%20%5E%20t;%0A%20%20%09%20%20%20%20me.i%20=%20i;%0A%20%20%09%20%20%20%20//%20Result%20is%20the%20combination.%0A%20%20%09%20%20%20%20return%20(v%20+%20(w%20%5E%20(w%20%3E%3E%3E%2016)))%20%7C%200;%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20function%20init(me,%20seed)%20%7B%0A%20%20%09%20%20%20%20var%20t,%20v,%20i,%20j,%20w,%20X%20=%20%5B%5D,%20limit%20=%20128;%0A%20%20%09%20%20%20%20if%20(seed%20===%20(seed%20%7C%200))%20%7B%0A%20%20%09%20%20%20%20%20%20//%20Numeric%20seeds%20initialize%20v,%20which%20is%20used%20to%20generates%20X.%0A%20%20%09%20%20%20%20%20%20v%20=%20seed;%0A%20%20%09%20%20%20%20%20%20seed%20=%20null;%0A%20%20%09%20%20%20%20%7D%20else%20%7B%0A%20%20%09%20%20%20%20%20%20//%20String%20seeds%20are%20mixed%20into%20v%20and%20X%20one%20character%20at%20a%20time.%0A%20%20%09%20%20%20%20%20%20seed%20=%20seed%20+%20'%5C0';%0A%20%20%09%20%20%20%20%20%20v%20=%200;%0A%20%20%09%20%20%20%20%20%20limit%20=%20Math.max(limit,%20seed.length);%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20//%20Initialize%20circular%20array%20and%20weyl%20value.%0A%20%20%09%20%20%20%20for%20(i%20=%200,%20j%20=%20-32;%20j%20%3C%20limit;%20++j)%20%7B%0A%20%20%09%20%20%20%20%20%20//%20Put%20the%20unicode%20characters%20into%20the%20array,%20and%20shuffle%20them.%0A%20%20%09%20%20%20%20%20%20if%20(seed)%20v%20%5E=%20seed.charCodeAt((j%20+%2032)%20%25%20seed.length);%0A%20%20%09%20%20%20%20%20%20//%20After%2032%20shuffles,%20take%20v%20as%20the%20starting%20w%20value.%0A%20%20%09%20%20%20%20%20%20if%20(j%20===%200)%20w%20=%20v;%0A%20%20%09%20%20%20%20%20%20v%20%5E=%20v%20%3C%3C%2010;%0A%20%20%09%20%20%20%20%20%20v%20%5E=%20v%20%3E%3E%3E%2015;%0A%20%20%09%20%20%20%20%20%20v%20%5E=%20v%20%3C%3C%204;%0A%20%20%09%20%20%20%20%20%20v%20%5E=%20v%20%3E%3E%3E%2013;%0A%20%20%09%20%20%20%20%20%20if%20(j%20%3E=%200)%20%7B%0A%20%20%09%20%20%20%20%20%20%20%20w%20=%20(w%20+%200x61c88647)%20%7C%200;%20%20%20%20%20//%20Weyl.%0A%20%20%09%20%20%20%20%20%20%20%20t%20=%20(X%5Bj%20&%20127%5D%20%5E=%20(v%20+%20w));%20%20//%20Combine%20xor%20and%20weyl%20to%20init%20array.%0A%20%20%09%20%20%20%20%20%20%20%20i%20=%20(0%20==%20t)%20?%20i%20+%201%20:%200;%20%20%20%20%20//%20Count%20zeroes.%0A%20%20%09%20%20%20%20%20%20%7D%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20//%20We%20have%20detected%20all%20zeroes;%20make%20the%20key%20nonzero.%0A%20%20%09%20%20%20%20if%20(i%20%3E=%20128)%20%7B%0A%20%20%09%20%20%20%20%20%20X%5B(seed%20&&%20seed.length%20%7C%7C%200)%20&%20127%5D%20=%20-1;%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20//%20Run%20the%20generator%20512%20times%20to%20further%20mix%20the%20state%20before%20using%20it.%0A%20%20%09%20%20%20%20//%20Factoring%20this%20as%20a%20function%20slows%20the%20main%20generator,%20so%20it%20is%20just%0A%20%20%09%20%20%20%20//%20unrolled%20here.%20%20The%20weyl%20generator%20is%20not%20advanced%20while%20warming%20up.%0A%20%20%09%20%20%20%20i%20=%20127;%0A%20%20%09%20%20%20%20for%20(j%20=%204%20*%20128;%20j%20%3E%200;%20--j)%20%7B%0A%20%20%09%20%20%20%20%20%20v%20=%20X%5B(i%20+%2034)%20&%20127%5D;%0A%20%20%09%20%20%20%20%20%20t%20=%20X%5Bi%20=%20((i%20+%201)%20&%20127)%5D;%0A%20%20%09%20%20%20%20%20%20v%20%5E=%20v%20%3C%3C%2013;%0A%20%20%09%20%20%20%20%20%20t%20%5E=%20t%20%3C%3C%2017;%0A%20%20%09%20%20%20%20%20%20v%20%5E=%20v%20%3E%3E%3E%2015;%0A%20%20%09%20%20%20%20%20%20t%20%5E=%20t%20%3E%3E%3E%2012;%0A%20%20%09%20%20%20%20%20%20X%5Bi%5D%20=%20v%20%5E%20t;%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20//%20Storing%20state%20as%20object%20members%20is%20faster%20than%20using%20closure%20variables.%0A%20%20%09%20%20%20%20me.w%20=%20w;%0A%20%20%09%20%20%20%20me.X%20=%20X;%0A%20%20%09%20%20%20%20me.i%20=%20i;%0A%20%20%09%20%20%7D%0A%0A%20%20%09%20%20init(me,%20seed);%0A%20%20%09%7D%0A%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.i%20=%20f.i;%0A%20%20%09%20%20t.w%20=%20f.w;%0A%20%20%09%20%20t.X%20=%20f.X.slice();%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%20%20%09function%20impl(seed,%20opts)%20%7B%0A%20%20%09%20%20if%20(seed%20==%20null)%20seed%20=%20+(new%20Date);%0A%20%20%09%20%20var%20xg%20=%20new%20XorGen(seed),%0A%20%20%09%20%20%20%20%20%20state%20=%20opts%20&&%20opts.state,%0A%20%20%09%20%20%20%20%20%20prng%20=%20function()%20%7B%20return%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000;%20%7D;%0A%20%20%09%20%20prng.double%20=%20function()%20%7B%0A%20%20%09%20%20%20%20do%20%7B%0A%20%20%09%20%20%20%20%20%20var%20top%20=%20xg.next()%20%3E%3E%3E%2011,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20bot%20=%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20result%20=%20(top%20+%20bot)%20/%20(1%20%3C%3C%2021);%0A%20%20%09%20%20%20%20%7D%20while%20(result%20===%200);%0A%20%20%09%20%20%20%20return%20result;%0A%20%20%09%20%20%7D;%0A%20%20%09%20%20prng.int32%20=%20xg.next;%0A%20%20%09%20%20prng.quick%20=%20prng;%0A%20%20%09%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20if%20(state.X)%20copy(state,%20xg);%0A%20%20%09%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(xg,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20prng;%0A%20%20%09%7D%0A%0A%20%20%09if%20(module%20&&%20module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20impl;%0A%20%20%09%7D%20else%20if%20(define%20&&%20define.amd)%20%7B%0A%20%20%09%20%20define(function()%20%7B%20return%20impl;%20%7D);%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20this.xor4096%20=%20impl;%0A%20%20%09%7D%0A%0A%20%20%09%7D)(%0A%20%20%09%20%20commonjsGlobal,%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20window%20object%20or%20global%0A%20%20%09%20%20module,%20%20%20%20//%20present%20in%20node.js%0A%20%20%09%20%20(typeof%20undefined)%20==%20'function'%20%20%20%20//%20present%20with%20an%20AMD%20loader%0A%20%20%09);%0A%20%20%7D%20(xor4096$1));%0A%0A%20%20var%20tychei$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09//%20A%20Javascript%20implementaion%20of%20the%20%22Tyche-i%22%20prng%20algorithm%20by%0A%20%20%09//%20Samuel%20Neves%20and%20Filipe%20Araujo.%0A%20%20%09//%20See%20https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf%0A%0A%20%20%09(function(global,%20module,%20define)%20%7B%0A%0A%20%20%09function%20XorGen(seed)%20%7B%0A%20%20%09%20%20var%20me%20=%20this,%20strseed%20=%20'';%0A%0A%20%20%09%20%20//%20Set%20up%20generator%20function.%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20b%20=%20me.b,%20c%20=%20me.c,%20d%20=%20me.d,%20a%20=%20me.a;%0A%20%20%09%20%20%20%20b%20=%20(b%20%3C%3C%2025)%20%5E%20(b%20%3E%3E%3E%207)%20%5E%20c;%0A%20%20%09%20%20%20%20c%20=%20(c%20-%20d)%20%7C%200;%0A%20%20%09%20%20%20%20d%20=%20(d%20%3C%3C%2024)%20%5E%20(d%20%3E%3E%3E%208)%20%5E%20a;%0A%20%20%09%20%20%20%20a%20=%20(a%20-%20b)%20%7C%200;%0A%20%20%09%20%20%20%20me.b%20=%20b%20=%20(b%20%3C%3C%2020)%20%5E%20(b%20%3E%3E%3E%2012)%20%5E%20c;%0A%20%20%09%20%20%20%20me.c%20=%20c%20=%20(c%20-%20d)%20%7C%200;%0A%20%20%09%20%20%20%20me.d%20=%20(d%20%3C%3C%2016)%20%5E%20(c%20%3E%3E%3E%2016)%20%5E%20a;%0A%20%20%09%20%20%20%20return%20me.a%20=%20(a%20-%20b)%20%7C%200;%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20/*%20The%20following%20is%20non-inverted%20tyche,%20which%20has%20better%20internal%0A%20%20%09%20%20%20*%20bit%20diffusion,%20but%20which%20is%20about%2025%25%20slower%20than%20tyche-i%20in%20JS.%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20a%20=%20me.a,%20b%20=%20me.b,%20c%20=%20me.c,%20d%20=%20me.d;%0A%20%20%09%20%20%20%20a%20=%20(me.a%20+%20me.b%20%7C%200)%20%3E%3E%3E%200;%0A%20%20%09%20%20%20%20d%20=%20me.d%20%5E%20a;%20d%20=%20d%20%3C%3C%2016%20%5E%20d%20%3E%3E%3E%2016;%0A%20%20%09%20%20%20%20c%20=%20me.c%20+%20d%20%7C%200;%0A%20%20%09%20%20%20%20b%20=%20me.b%20%5E%20c;%20b%20=%20b%20%3C%3C%2012%20%5E%20d%20%3E%3E%3E%2020;%0A%20%20%09%20%20%20%20me.a%20=%20a%20=%20a%20+%20b%20%7C%200;%0A%20%20%09%20%20%20%20d%20=%20d%20%5E%20a;%20me.d%20=%20d%20=%20d%20%3C%3C%208%20%5E%20d%20%3E%3E%3E%2024;%0A%20%20%09%20%20%20%20me.c%20=%20c%20=%20c%20+%20d%20%7C%200;%0A%20%20%09%20%20%20%20b%20=%20b%20%5E%20c;%0A%20%20%09%20%20%20%20return%20me.b%20=%20(b%20%3C%3C%207%20%5E%20b%20%3E%3E%3E%2025);%0A%20%20%09%20%20%7D%0A%20%20%09%20%20*/%0A%0A%20%20%09%20%20me.a%20=%200;%0A%20%20%09%20%20me.b%20=%200;%0A%20%20%09%20%20me.c%20=%202654435769%20%7C%200;%0A%20%20%09%20%20me.d%20=%201367130551;%0A%0A%20%20%09%20%20if%20(seed%20===%20Math.floor(seed))%20%7B%0A%20%20%09%20%20%20%20//%20Integer%20seed.%0A%20%20%09%20%20%20%20me.a%20=%20(seed%20/%200x100000000)%20%7C%200;%0A%20%20%09%20%20%20%20me.b%20=%20seed%20%7C%200;%0A%20%20%09%20%20%7D%20else%20%7B%0A%20%20%09%20%20%20%20//%20String%20seed.%0A%20%20%09%20%20%20%20strseed%20+=%20seed;%0A%20%20%09%20%20%7D%0A%0A%20%20%09%20%20//%20Mix%20in%20string%20seed,%20then%20discard%20an%20initial%20batch%20of%2064%20values.%0A%20%20%09%20%20for%20(var%20k%20=%200;%20k%20%3C%20strseed.length%20+%2020;%20k++)%20%7B%0A%20%20%09%20%20%20%20me.b%20%5E=%20strseed.charCodeAt(k)%20%7C%200;%0A%20%20%09%20%20%20%20me.next();%0A%20%20%09%20%20%7D%0A%20%20%09%7D%0A%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.a%20=%20f.a;%0A%20%20%09%20%20t.b%20=%20f.b;%0A%20%20%09%20%20t.c%20=%20f.c;%0A%20%20%09%20%20t.d%20=%20f.d;%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%20%20%09function%20impl(seed,%20opts)%20%7B%0A%20%20%09%20%20var%20xg%20=%20new%20XorGen(seed),%0A%20%20%09%20%20%20%20%20%20state%20=%20opts%20&&%20opts.state,%0A%20%20%09%20%20%20%20%20%20prng%20=%20function()%20%7B%20return%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000;%20%7D;%0A%20%20%09%20%20prng.double%20=%20function()%20%7B%0A%20%20%09%20%20%20%20do%20%7B%0A%20%20%09%20%20%20%20%20%20var%20top%20=%20xg.next()%20%3E%3E%3E%2011,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20bot%20=%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20result%20=%20(top%20+%20bot)%20/%20(1%20%3C%3C%2021);%0A%20%20%09%20%20%20%20%7D%20while%20(result%20===%200);%0A%20%20%09%20%20%20%20return%20result;%0A%20%20%09%20%20%7D;%0A%20%20%09%20%20prng.int32%20=%20xg.next;%0A%20%20%09%20%20prng.quick%20=%20prng;%0A%20%20%09%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20if%20(typeof(state)%20==%20'object')%20copy(state,%20xg);%0A%20%20%09%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(xg,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20prng;%0A%20%20%09%7D%0A%0A%20%20%09if%20(module%20&&%20module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20impl;%0A%20%20%09%7D%20else%20if%20(define%20&&%20define.amd)%20%7B%0A%20%20%09%20%20define(function()%20%7B%20return%20impl;%20%7D);%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20this.tychei%20=%20impl;%0A%20%20%09%7D%0A%0A%20%20%09%7D)(%0A%20%20%09%20%20commonjsGlobal,%0A%20%20%09%20%20module,%20%20%20%20//%20present%20in%20node.js%0A%20%20%09%20%20(typeof%20undefined)%20==%20'function'%20%20%20%20//%20present%20with%20an%20AMD%20loader%0A%20%20%09);%0A%20%20%7D%20(tychei$1));%0A%0A%20%20var%20seedrandom$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20/*%0A%20%20Copyright%202019%20David%20Bau.%0A%0A%20%20Permission%20is%20hereby%20granted,%20free%20of%20charge,%20to%20any%20person%20obtaining%0A%20%20a%20copy%20of%20this%20software%20and%20associated%20documentation%20files%20(the%0A%20%20%22Software%22),%20to%20deal%20in%20the%20Software%20without%20restriction,%20including%0A%20%20without%20limitation%20the%20rights%20to%20use,%20copy,%20modify,%20merge,%20publish,%0A%20%20distribute,%20sublicense,%20and/or%20sell%20copies%20of%20the%20Software,%20and%20to%0A%20%20permit%20persons%20to%20whom%20the%20Software%20is%20furnished%20to%20do%20so,%20subject%20to%0A%20%20the%20following%20conditions:%0A%0A%20%20The%20above%20copyright%20notice%20and%20this%20permission%20notice%20shall%20be%0A%20%20included%20in%20all%20copies%20or%20substantial%20portions%20of%20the%20Software.%0A%0A%20%20THE%20SOFTWARE%20IS%20PROVIDED%20%22AS%20IS%22,%20WITHOUT%20WARRANTY%20OF%20ANY%20KIND,%0A%20%20EXPRESS%20OR%20IMPLIED,%20INCLUDING%20BUT%20NOT%20LIMITED%20TO%20THE%20WARRANTIES%20OF%0A%20%20MERCHANTABILITY,%20FITNESS%20FOR%20A%20PARTICULAR%20PURPOSE%20AND%20NONINFRINGEMENT.%0A%20%20IN%20NO%20EVENT%20SHALL%20THE%20AUTHORS%20OR%20COPYRIGHT%20HOLDERS%20BE%20LIABLE%20FOR%20ANY%0A%20%20CLAIM,%20DAMAGES%20OR%20OTHER%20LIABILITY,%20WHETHER%20IN%20AN%20ACTION%20OF%20CONTRACT,%0A%20%20TORT%20OR%20OTHERWISE,%20ARISING%20FROM,%20OUT%20OF%20OR%20IN%20CONNECTION%20WITH%20THE%0A%20%20SOFTWARE%20OR%20THE%20USE%20OR%20OTHER%20DEALINGS%20IN%20THE%20SOFTWARE.%0A%0A%20%20*/%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09(function%20(global,%20pool,%20math)%20%7B%0A%20%20%09//%0A%20%20%09//%20The%20following%20constants%20are%20related%20to%20IEEE%20754%20limits.%0A%20%20%09//%0A%0A%20%20%09var%20width%20=%20256,%20%20%20%20%20%20%20%20//%20each%20RC4%20output%20is%200%20%3C=%20x%20%3C%20256%0A%20%20%09%20%20%20%20chunks%20=%206,%20%20%20%20%20%20%20%20%20//%20at%20least%20six%20RC4%20outputs%20for%20each%20double%0A%20%20%09%20%20%20%20digits%20=%2052,%20%20%20%20%20%20%20%20//%20there%20are%2052%20significant%20digits%20in%20a%20double%0A%20%20%09%20%20%20%20rngname%20=%20'random',%20//%20rngname:%20name%20for%20Math.random%20and%20Math.seedrandom%0A%20%20%09%20%20%20%20startdenom%20=%20math.pow(width,%20chunks),%0A%20%20%09%20%20%20%20significance%20=%20math.pow(2,%20digits),%0A%20%20%09%20%20%20%20overflow%20=%20significance%20*%202,%0A%20%20%09%20%20%20%20mask%20=%20width%20-%201,%0A%20%20%09%20%20%20%20nodecrypto;%20%20%20%20%20%20%20%20%20//%20node.js%20crypto%20module,%20initialized%20at%20the%20bottom.%0A%0A%20%20%09//%0A%20%20%09//%20seedrandom()%0A%20%20%09//%20This%20is%20the%20seedrandom%20function%20described%20above.%0A%20%20%09//%0A%20%20%09function%20seedrandom(seed,%20options,%20callback)%20%7B%0A%20%20%09%20%20var%20key%20=%20%5B%5D;%0A%20%20%09%20%20options%20=%20(options%20==%20true)%20?%20%7B%20entropy:%20true%20%7D%20:%20(options%20%7C%7C%20%7B%7D);%0A%0A%20%20%09%20%20//%20Flatten%20the%20seed%20string%20or%20build%20one%20from%20local%20entropy%20if%20needed.%0A%20%20%09%20%20var%20shortseed%20=%20mixkey(flatten(%0A%20%20%09%20%20%20%20options.entropy%20?%20%5Bseed,%20tostring(pool)%5D%20:%0A%20%20%09%20%20%20%20(seed%20==%20null)%20?%20autoseed()%20:%20seed,%203),%20key);%0A%0A%20%20%09%20%20//%20Use%20the%20seed%20to%20initialize%20an%20ARC4%20generator.%0A%20%20%09%20%20var%20arc4%20=%20new%20ARC4(key);%0A%0A%20%20%09%20%20//%20This%20function%20returns%20a%20random%20double%20in%20%5B0,%201)%20that%20contains%0A%20%20%09%20%20//%20randomness%20in%20every%20bit%20of%20the%20mantissa%20of%20the%20IEEE%20754%20value.%0A%20%20%09%20%20var%20prng%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20n%20=%20arc4.g(chunks),%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Start%20with%20a%20numerator%20n%20%3C%202%20%5E%2048%0A%20%20%09%20%20%20%20%20%20%20%20d%20=%20startdenom,%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20and%20denominator%20d%20=%202%20%5E%2048.%0A%20%20%09%20%20%20%20%20%20%20%20x%20=%200;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20and%20no%20'extra%20last%20byte'.%0A%20%20%09%20%20%20%20while%20(n%20%3C%20significance)%20%7B%20%20%20%20%20%20%20%20%20%20//%20Fill%20up%20all%20significant%20digits%20by%0A%20%20%09%20%20%20%20%20%20n%20=%20(n%20+%20x)%20*%20width;%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20shifting%20numerator%20and%0A%20%20%09%20%20%20%20%20%20d%20*=%20width;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20denominator%20and%20generating%20a%0A%20%20%09%20%20%20%20%20%20x%20=%20arc4.g(1);%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20new%20least-significant-byte.%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20while%20(n%20%3E=%20overflow)%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20//%20To%20avoid%20rounding%20up,%20before%20adding%0A%20%20%09%20%20%20%20%20%20n%20/=%202;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20last%20byte,%20shift%20everything%0A%20%20%09%20%20%20%20%20%20d%20/=%202;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20right%20using%20integer%20math%20until%0A%20%20%09%20%20%20%20%20%20x%20%3E%3E%3E=%201;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20we%20have%20exactly%20the%20desired%20bits.%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20return%20(n%20+%20x)%20/%20d;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Form%20the%20number%20within%20%5B0,%201).%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20prng.int32%20=%20function()%20%7B%20return%20arc4.g(4)%20%7C%200;%20%7D;%0A%20%20%09%20%20prng.quick%20=%20function()%20%7B%20return%20arc4.g(4)%20/%200x100000000;%20%7D;%0A%20%20%09%20%20prng.double%20=%20prng;%0A%0A%20%20%09%20%20//%20Mix%20the%20randomness%20into%20accumulated%20entropy.%0A%20%20%09%20%20mixkey(tostring(arc4.S),%20pool);%0A%0A%20%20%09%20%20//%20Calling%20convention:%20what%20to%20return%20as%20a%20function%20of%20prng,%20seed,%20is_math.%0A%20%20%09%20%20return%20(options.pass%20%7C%7C%20callback%20%7C%7C%0A%20%20%09%20%20%20%20%20%20function(prng,%20seed,%20is_math_call,%20state)%20%7B%0A%20%20%09%20%20%20%20%20%20%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20%20%20%20%20%20%20//%20Load%20the%20arc4%20state%20from%20the%20given%20state%20if%20it%20has%20an%20S%20array.%0A%20%20%09%20%20%20%20%20%20%20%20%20%20if%20(state.S)%20%7B%20copy(state,%20arc4);%20%7D%0A%20%20%09%20%20%20%20%20%20%20%20%20%20//%20Only%20provide%20the%20.state%20method%20if%20requested%20via%20options.state.%0A%20%20%09%20%20%20%20%20%20%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(arc4,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%09%20%20%20%20%20%20%20%20//%20If%20called%20as%20a%20method%20of%20Math%20(Math.seedrandom()),%20mutate%0A%20%20%09%20%20%20%20%20%20%20%20//%20Math.random%20because%20that%20is%20how%20seedrandom.js%20has%20worked%20since%20v1.0.%0A%20%20%09%20%20%20%20%20%20%20%20if%20(is_math_call)%20%7B%20math%5Brngname%5D%20=%20prng;%20return%20seed;%20%7D%0A%0A%20%20%09%20%20%20%20%20%20%20%20//%20Otherwise,%20it%20is%20a%20newer%20calling%20convention,%20so%20return%20the%0A%20%20%09%20%20%20%20%20%20%20%20//%20prng%20directly.%0A%20%20%09%20%20%20%20%20%20%20%20else%20return%20prng;%0A%20%20%09%20%20%20%20%20%20%7D)(%0A%20%20%09%20%20prng,%0A%20%20%09%20%20shortseed,%0A%20%20%09%20%20'global'%20in%20options%20?%20options.global%20:%20(this%20==%20math),%0A%20%20%09%20%20options.state);%0A%20%20%09%7D%0A%0A%20%20%09//%0A%20%20%09//%20ARC4%0A%20%20%09//%0A%20%20%09//%20An%20ARC4%20implementation.%20%20The%20constructor%20takes%20a%20key%20in%20the%20form%20of%0A%20%20%09//%20an%20array%20of%20at%20most%20(width)%20integers%20that%20should%20be%200%20%3C=%20x%20%3C%20(width).%0A%20%20%09//%0A%20%20%09//%20The%20g(count)%20method%20returns%20a%20pseudorandom%20integer%20that%20concatenates%0A%20%20%09//%20the%20next%20(count)%20outputs%20from%20ARC4.%20%20Its%20return%20value%20is%20a%20number%20x%0A%20%20%09//%20that%20is%20in%20the%20range%200%20%3C=%20x%20%3C%20(width%20%5E%20count).%0A%20%20%09//%0A%20%20%09function%20ARC4(key)%20%7B%0A%20%20%09%20%20var%20t,%20keylen%20=%20key.length,%0A%20%20%09%20%20%20%20%20%20me%20=%20this,%20i%20=%200,%20j%20=%20me.i%20=%20me.j%20=%200,%20s%20=%20me.S%20=%20%5B%5D;%0A%0A%20%20%09%20%20//%20The%20empty%20key%20%5B%5D%20is%20treated%20as%20%5B0%5D.%0A%20%20%09%20%20if%20(!keylen)%20%7B%20key%20=%20%5Bkeylen++%5D;%20%7D%0A%0A%20%20%09%20%20//%20Set%20up%20S%20using%20the%20standard%20key%20scheduling%20algorithm.%0A%20%20%09%20%20while%20(i%20%3C%20width)%20%7B%0A%20%20%09%20%20%20%20s%5Bi%5D%20=%20i++;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20for%20(i%20=%200;%20i%20%3C%20width;%20i++)%20%7B%0A%20%20%09%20%20%20%20s%5Bi%5D%20=%20s%5Bj%20=%20mask%20&%20(j%20+%20key%5Bi%20%25%20keylen%5D%20+%20(t%20=%20s%5Bi%5D))%5D;%0A%20%20%09%20%20%20%20s%5Bj%5D%20=%20t;%0A%20%20%09%20%20%7D%0A%0A%20%20%09%20%20//%20The%20%22g%22%20method%20returns%20the%20next%20(count)%20outputs%20as%20one%20number.%0A%20%20%09%20%20(me.g%20=%20function(count)%20%7B%0A%20%20%09%20%20%20%20//%20Using%20instance%20members%20instead%20of%20closure%20state%20nearly%20doubles%20speed.%0A%20%20%09%20%20%20%20var%20t,%20r%20=%200,%0A%20%20%09%20%20%20%20%20%20%20%20i%20=%20me.i,%20j%20=%20me.j,%20s%20=%20me.S;%0A%20%20%09%20%20%20%20while%20(count--)%20%7B%0A%20%20%09%20%20%20%20%20%20t%20=%20s%5Bi%20=%20mask%20&%20(i%20+%201)%5D;%0A%20%20%09%20%20%20%20%20%20r%20=%20r%20*%20width%20+%20s%5Bmask%20&%20((s%5Bi%5D%20=%20s%5Bj%20=%20mask%20&%20(j%20+%20t)%5D)%20+%20(s%5Bj%5D%20=%20t))%5D;%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20me.i%20=%20i;%20me.j%20=%20j;%0A%20%20%09%20%20%20%20return%20r;%0A%20%20%09%20%20%20%20//%20For%20robust%20unpredictability,%20the%20function%20call%20below%20automatically%0A%20%20%09%20%20%20%20//%20discards%20an%20initial%20batch%20of%20values.%20%20This%20is%20called%20RC4-drop%5B256%5D.%0A%20%20%09%20%20%20%20//%20See%20http://google.com/search?q=rsa+fluhrer+response&btnI%0A%20%20%09%20%20%7D)(width);%0A%20%20%09%7D%0A%0A%20%20%09//%0A%20%20%09//%20copy()%0A%20%20%09//%20Copies%20internal%20state%20of%20ARC4%20to%20or%20from%20a%20plain%20object.%0A%20%20%09//%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.i%20=%20f.i;%0A%20%20%09%20%20t.j%20=%20f.j;%0A%20%20%09%20%20t.S%20=%20f.S.slice();%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%20%20%09//%0A%20%20%09//%20flatten()%0A%20%20%09//%20Converts%20an%20object%20tree%20to%20nested%20arrays%20of%20strings.%0A%20%20%09//%0A%20%20%09function%20flatten(obj,%20depth)%20%7B%0A%20%20%09%20%20var%20result%20=%20%5B%5D,%20typ%20=%20(typeof%20obj),%20prop;%0A%20%20%09%20%20if%20(depth%20&&%20typ%20==%20'object')%20%7B%0A%20%20%09%20%20%20%20for%20(prop%20in%20obj)%20%7B%0A%20%20%09%20%20%20%20%20%20try%20%7B%20result.push(flatten(obj%5Bprop%5D,%20depth%20-%201));%20%7D%20catch%20(e)%20%7B%7D%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20(result.length%20?%20result%20:%20typ%20==%20'string'%20?%20obj%20:%20obj%20+%20'%5C0');%0A%20%20%09%7D%0A%0A%20%20%09//%0A%20%20%09//%20mixkey()%0A%20%20%09//%20Mixes%20a%20string%20seed%20into%20a%20key%20that%20is%20an%20array%20of%20integers,%20and%0A%20%20%09//%20returns%20a%20shortened%20string%20seed%20that%20is%20equivalent%20to%20the%20result%20key.%0A%20%20%09//%0A%20%20%09function%20mixkey(seed,%20key)%20%7B%0A%20%20%09%20%20var%20stringseed%20=%20seed%20+%20'',%20smear,%20j%20=%200;%0A%20%20%09%20%20while%20(j%20%3C%20stringseed.length)%20%7B%0A%20%20%09%20%20%20%20key%5Bmask%20&%20j%5D%20=%0A%20%20%09%20%20%20%20%20%20mask%20&%20((smear%20%5E=%20key%5Bmask%20&%20j%5D%20*%2019)%20+%20stringseed.charCodeAt(j++));%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20tostring(key);%0A%20%20%09%7D%0A%0A%20%20%09//%0A%20%20%09//%20autoseed()%0A%20%20%09//%20Returns%20an%20object%20for%20autoseeding,%20using%20window.crypto%20and%20Node%20crypto%0A%20%20%09//%20module%20if%20available.%0A%20%20%09//%0A%20%20%09function%20autoseed()%20%7B%0A%20%20%09%20%20try%20%7B%0A%20%20%09%20%20%20%20var%20out;%0A%20%20%09%20%20%20%20if%20(nodecrypto%20&&%20(out%20=%20nodecrypto.randomBytes))%20%7B%0A%20%20%09%20%20%20%20%20%20//%20The%20use%20of%20'out'%20to%20remember%20randomBytes%20makes%20tight%20minified%20code.%0A%20%20%09%20%20%20%20%20%20out%20=%20out(width);%0A%20%20%09%20%20%20%20%7D%20else%20%7B%0A%20%20%09%20%20%20%20%20%20out%20=%20new%20Uint8Array(width);%0A%20%20%09%20%20%20%20%20%20(global.crypto%20%7C%7C%20global.msCrypto).getRandomValues(out);%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20return%20tostring(out);%0A%20%20%09%20%20%7D%20catch%20(e)%20%7B%0A%20%20%09%20%20%20%20var%20browser%20=%20global.navigator,%0A%20%20%09%20%20%20%20%20%20%20%20plugins%20=%20browser%20&&%20browser.plugins;%0A%20%20%09%20%20%20%20return%20%5B+new%20Date,%20global,%20plugins,%20global.screen,%20tostring(pool)%5D;%0A%20%20%09%20%20%7D%0A%20%20%09%7D%0A%0A%20%20%09//%0A%20%20%09//%20tostring()%0A%20%20%09//%20Converts%20an%20array%20of%20charcodes%20to%20a%20string%0A%20%20%09//%0A%20%20%09function%20tostring(a)%20%7B%0A%20%20%09%20%20return%20String.fromCharCode.apply(0,%20a);%0A%20%20%09%7D%0A%0A%20%20%09//%0A%20%20%09//%20When%20seedrandom.js%20is%20loaded,%20we%20immediately%20mix%20a%20few%20bits%0A%20%20%09//%20from%20the%20built-in%20RNG%20into%20the%20entropy%20pool.%20%20Because%20we%20do%0A%20%20%09//%20not%20want%20to%20interfere%20with%20deterministic%20PRNG%20state%20later,%0A%20%20%09//%20seedrandom%20will%20not%20call%20math.random%20on%20its%20own%20again%20after%0A%20%20%09//%20initialization.%0A%20%20%09//%0A%20%20%09mixkey(math.random(),%20pool);%0A%0A%20%20%09//%0A%20%20%09//%20Nodejs%20and%20AMD%20support:%20export%20the%20implementation%20as%20a%20module%20using%0A%20%20%09//%20either%20convention.%0A%20%20%09//%0A%20%20%09if%20(module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20seedrandom;%0A%20%20%09%20%20//%20When%20in%20node.js,%20try%20using%20crypto%20package%20for%20autoseeding.%0A%20%20%09%20%20try%20%7B%0A%20%20%09%20%20%20%20nodecrypto%20=%20require('crypto');%0A%20%20%09%20%20%7D%20catch%20(ex)%20%7B%7D%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20//%20When%20included%20as%20a%20plain%20script,%20set%20up%20Math.seedrandom%20global.%0A%20%20%09%20%20math%5B'seed'%20+%20rngname%5D%20=%20seedrandom;%0A%20%20%09%7D%0A%0A%0A%20%20%09//%20End%20anonymous%20scope,%20and%20pass%20initial%20values.%0A%20%20%09%7D)(%0A%20%20%09%20%20//%20global:%20%60self%60%20in%20browsers%20(including%20strict%20mode%20and%20web%20workers),%0A%20%20%09%20%20//%20otherwise%20%60this%60%20in%20Node%20and%20other%20environments%0A%20%20%09%20%20(typeof%20self%20!==%20'undefined')%20?%20self%20:%20commonjsGlobal,%0A%20%20%09%20%20%5B%5D,%20%20%20%20%20//%20pool:%20entropy%20pool%20starts%20empty%0A%20%20%09%20%20Math%20%20%20%20//%20math:%20package%20containing%20random,%20pow,%20and%20seedrandom%0A%20%20%09);%0A%20%20%7D%20(seedrandom$1));%0A%0A%20%20//%20A%20library%20of%20seedable%20RNGs%20implemented%20in%20Javascript.%0A%20%20//%0A%20%20//%20Usage:%0A%20%20//%0A%20%20//%20var%20seedrandom%20=%20require('seedrandom');%0A%20%20//%20var%20random%20=%20seedrandom(1);%20//%20or%20any%20seed.%0A%20%20//%20var%20x%20=%20random();%20%20%20%20%20%20%20//%200%20%3C=%20x%20%3C%201.%20%20Every%20bit%20is%20random.%0A%20%20//%20var%20x%20=%20random.quick();%20//%200%20%3C=%20x%20%3C%201.%20%2032%20bits%20of%20randomness.%0A%0A%20%20//%20alea,%20a%2053-bit%20multiply-with-carry%20generator%20by%20Johannes%20Baag%C3%B8e.%0A%20%20//%20Period:%20~2%5E116%0A%20%20//%20Reported%20to%20pass%20all%20BigCrush%20tests.%0A%20%20var%20alea%20=%20alea$1.exports;%0A%0A%20%20//%20xor128,%20a%20pure%20xor-shift%20generator%20by%20George%20Marsaglia.%0A%20%20//%20Period:%202%5E128-1.%0A%20%20//%20Reported%20to%20fail:%20MatrixRank%20and%20LinearComp.%0A%20%20var%20xor128%20=%20xor128$1.exports;%0A%0A%20%20//%20xorwow,%20George%20Marsaglia's%20160-bit%20xor-shift%20combined%20plus%20weyl.%0A%20%20//%20Period:%202%5E192-2%5E32%0A%20%20//%20Reported%20to%20fail:%20CollisionOver,%20SimpPoker,%20and%20LinearComp.%0A%20%20var%20xorwow%20=%20xorwow$1.exports;%0A%0A%20%20//%20xorshift7,%20by%20Fran%C3%A7ois%20Panneton%20and%20Pierre%20L'ecuyer,%20takes%0A%20%20//%20a%20different%20approach:%20it%20adds%20robustness%20by%20allowing%20more%20shifts%0A%20%20//%20than%20Marsaglia's%20original%20three.%20%20It%20is%20a%207-shift%20generator%0A%20%20//%20with%20256%20bits,%20that%20passes%20BigCrush%20with%20no%20systmatic%20failures.%0A%20%20//%20Period%202%5E256-1.%0A%20%20//%20No%20systematic%20BigCrush%20failures%20reported.%0A%20%20var%20xorshift7%20=%20xorshift7$1.exports;%0A%0A%20%20//%20xor4096,%20by%20Richard%20Brent,%20is%20a%204096-bit%20xor-shift%20with%20a%0A%20%20//%20very%20long%20period%20that%20also%20adds%20a%20Weyl%20generator.%20It%20also%20passes%0A%20%20//%20BigCrush%20with%20no%20systematic%20failures.%20%20Its%20long%20period%20may%0A%20%20//%20be%20useful%20if%20you%20have%20many%20generators%20and%20need%20to%20avoid%0A%20%20//%20collisions.%0A%20%20//%20Period:%202%5E4128-2%5E32.%0A%20%20//%20No%20systematic%20BigCrush%20failures%20reported.%0A%20%20var%20xor4096%20=%20xor4096$1.exports;%0A%0A%20%20//%20Tyche-i,%20by%20Samuel%20Neves%20and%20Filipe%20Araujo,%20is%20a%20bit-shifting%20random%0A%20%20//%20number%20generator%20derived%20from%20ChaCha,%20a%20modern%20stream%20cipher.%0A%20%20//%20https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf%0A%20%20//%20Period:%20~2%5E127%0A%20%20//%20No%20systematic%20BigCrush%20failures%20reported.%0A%20%20var%20tychei%20=%20tychei$1.exports;%0A%0A%20%20//%20The%20original%20ARC4-based%20prng%20included%20in%20this%20library.%0A%20%20//%20Period:%20~2%5E1600%0A%20%20var%20sr%20=%20seedrandom$1.exports;%0A%0A%20%20sr.alea%20=%20alea;%0A%20%20sr.xor128%20=%20xor128;%0A%20%20sr.xorwow%20=%20xorwow;%0A%20%20sr.xorshift7%20=%20xorshift7;%0A%20%20sr.xor4096%20=%20xor4096;%0A%20%20sr.tychei%20=%20tychei;%0A%0A%20%20var%20seedrandom%20=%20sr;%0A%0A%20%20/**%0A%20%20%20*%20@param%20%7BHTMLCanvasElement%7D%20canvas%0A%20%20%20*%20@param%20%7Bstring%7D%20domainKey%0A%20%20%20*%20@param%20%7Bstring%7D%20sessionKey%0A%20%20%20*%20@param%20%7Bany%7D%20getImageDataProxy%0A%20%20%20*%20@param%20%7BCanvasRenderingContext2D%20%7C%20WebGL2RenderingContext%20%7C%20WebGLRenderingContext%7D%20ctx?%0A%20%20%20*/%0A%20%20function%20computeOffScreenCanvas%20(canvas,%20domainKey,%20sessionKey,%20getImageDataProxy,%20ctx)%20%7B%0A%20%20%20%20%20%20if%20(!ctx)%20%7B%0A%20%20%20%20%20%20%20%20%20%20ctx%20=%20canvas.getContext('2d');%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20Make%20a%20off-screen%20canvas%20and%20put%20the%20data%20there%0A%20%20%20%20%20%20const%20offScreenCanvas%20=%20document.createElement('canvas');%0A%20%20%20%20%20%20offScreenCanvas.width%20=%20canvas.width;%0A%20%20%20%20%20%20offScreenCanvas.height%20=%20canvas.height;%0A%20%20%20%20%20%20const%20offScreenCtx%20=%20offScreenCanvas.getContext('2d');%0A%0A%20%20%20%20%20%20let%20rasterizedCtx%20=%20ctx;%0A%20%20%20%20%20%20//%20If%20we're%20not%20a%202d%20canvas%20we%20need%20to%20rasterise%20first%20into%202d%0A%20%20%20%20%20%20const%20rasterizeToCanvas%20=%20!(ctx%20instanceof%20CanvasRenderingContext2D);%0A%20%20%20%20%20%20if%20(rasterizeToCanvas)%20%7B%0A%20%20%20%20%20%20%20%20%20%20rasterizedCtx%20=%20offScreenCtx;%0A%20%20%20%20%20%20%20%20%20%20offScreenCtx.drawImage(canvas,%200,%200);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20We%20*always*%20compute%20the%20random%20pixels%20on%20the%20complete%20pixel%20set,%20then%20pass%20back%20the%20subset%20later%0A%20%20%20%20%20%20let%20imageData%20=%20getImageDataProxy._native.apply(rasterizedCtx,%20%5B0,%200,%20canvas.width,%20canvas.height%5D);%0A%20%20%20%20%20%20imageData%20=%20modifyPixelData(imageData,%20sessionKey,%20domainKey,%20canvas.width);%0A%0A%20%20%20%20%20%20if%20(rasterizeToCanvas)%20%7B%0A%20%20%20%20%20%20%20%20%20%20clearCanvas(offScreenCtx);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20offScreenCtx.putImageData(imageData,%200,%200);%0A%0A%20%20%20%20%20%20return%20%7B%20offScreenCanvas,%20offScreenCtx%20%7D%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Clears%20the%20pixels%20from%20the%20canvas%20context%0A%20%20%20*%0A%20%20%20*%20@param%20%7BCanvasRenderingContext2D%7D%20canvasContext%0A%20%20%20*/%0A%20%20function%20clearCanvas%20(canvasContext)%20%7B%0A%20%20%20%20%20%20//%20Save%20state%20and%20clean%20the%20pixels%20from%20the%20canvas%0A%20%20%20%20%20%20canvasContext.save();%0A%20%20%20%20%20%20canvasContext.globalCompositeOperation%20=%20'destination-out';%0A%20%20%20%20%20%20canvasContext.fillStyle%20=%20'rgb(255,255,255)';%0A%20%20%20%20%20%20canvasContext.fillRect(0,%200,%20canvasContext.canvas.width,%20canvasContext.canvas.height);%0A%20%20%20%20%20%20canvasContext.restore();%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20@param%20%7BImageData%7D%20imageData%0A%20%20%20*%20@param%20%7Bstring%7D%20sessionKey%0A%20%20%20*%20@param%20%7Bstring%7D%20domainKey%0A%20%20%20*%20@param%20%7Bnumber%7D%20width%0A%20%20%20*/%0A%20%20function%20modifyPixelData%20(imageData,%20domainKey,%20sessionKey,%20width)%20%7B%0A%20%20%20%20%20%20const%20d%20=%20imageData.data;%0A%20%20%20%20%20%20const%20length%20=%20d.length%20/%204;%0A%20%20%20%20%20%20let%20checkSum%20=%200;%0A%20%20%20%20%20%20const%20mappingArray%20=%20%5B%5D;%0A%20%20%20%20%20%20for%20(let%20i%20=%200;%20i%20%3C%20length;%20i%20+=%204)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(!shouldIgnorePixel(d,%20i)%20&&%20!adjacentSame(d,%20i,%20width))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20mappingArray.push(i);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20checkSum%20+=%20d%5Bi%5D%20+%20d%5Bi%20+%201%5D%20+%20d%5Bi%20+%202%5D%20+%20d%5Bi%20+%203%5D;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20windowHash%20=%20getDataKeySync(sessionKey,%20domainKey,%20checkSum);%0A%20%20%20%20%20%20const%20rng%20=%20new%20seedrandom(windowHash);%0A%20%20%20%20%20%20for%20(let%20i%20=%200;%20i%20%3C%20mappingArray.length;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20rand%20=%20rng();%0A%20%20%20%20%20%20%20%20%20%20const%20byte%20=%20Math.floor(rand%20*%2010);%0A%20%20%20%20%20%20%20%20%20%20const%20channel%20=%20byte%20%25%203;%0A%20%20%20%20%20%20%20%20%20%20const%20pixelCanvasIndex%20=%20mappingArray%5Bi%5D%20+%20channel;%0A%0A%20%20%20%20%20%20%20%20%20%20d%5BpixelCanvasIndex%5D%20=%20d%5BpixelCanvasIndex%5D%20%5E%20(byte%20&%200x1);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20return%20imageData%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Ignore%20pixels%20that%20have%20neighbours%20that%20are%20the%20same%0A%20%20%20*%0A%20%20%20*%20@param%20%7BUint8ClampedArray%7D%20imageData%0A%20%20%20*%20@param%20%7Bnumber%7D%20index%0A%20%20%20*%20@param%20%7Bnumber%7D%20width%0A%20%20%20*/%0A%20%20function%20adjacentSame%20(imageData,%20index,%20width)%20%7B%0A%20%20%20%20%20%20const%20widthPixel%20=%20width%20*%204;%0A%20%20%20%20%20%20const%20x%20=%20index%20%25%20widthPixel;%0A%20%20%20%20%20%20const%20maxLength%20=%20imageData.length;%0A%0A%20%20%20%20%20%20//%20Pixels%20not%20on%20the%20right%20border%20of%20the%20canvas%0A%20%20%20%20%20%20if%20(x%20%3C%20widthPixel)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20right%20=%20index%20+%204;%0A%20%20%20%20%20%20%20%20%20%20if%20(!pixelsSame(imageData,%20index,%20right))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20const%20diagonalRightUp%20=%20right%20-%20widthPixel;%0A%20%20%20%20%20%20%20%20%20%20if%20(diagonalRightUp%20%3E%200%20&&%20!pixelsSame(imageData,%20index,%20diagonalRightUp))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20const%20diagonalRightDown%20=%20right%20+%20widthPixel;%0A%20%20%20%20%20%20%20%20%20%20if%20(diagonalRightDown%20%3C%20maxLength%20&&%20!pixelsSame(imageData,%20index,%20diagonalRightDown))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20Pixels%20not%20on%20the%20left%20border%20of%20the%20canvas%0A%20%20%20%20%20%20if%20(x%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20left%20=%20index%20-%204;%0A%20%20%20%20%20%20%20%20%20%20if%20(!pixelsSame(imageData,%20index,%20left))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20const%20diagonalLeftUp%20=%20left%20-%20widthPixel;%0A%20%20%20%20%20%20%20%20%20%20if%20(diagonalLeftUp%20%3E%200%20&&%20!pixelsSame(imageData,%20index,%20diagonalLeftUp))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20const%20diagonalLeftDown%20=%20left%20+%20widthPixel;%0A%20%20%20%20%20%20%20%20%20%20if%20(diagonalLeftDown%20%3C%20maxLength%20&&%20!pixelsSame(imageData,%20index,%20diagonalLeftDown))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20up%20=%20index%20-%20widthPixel;%0A%20%20%20%20%20%20if%20(up%20%3E%200%20&&%20!pixelsSame(imageData,%20index,%20up))%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20down%20=%20index%20+%20widthPixel;%0A%20%20%20%20%20%20if%20(down%20%3C%20maxLength%20&&%20!pixelsSame(imageData,%20index,%20down))%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20return%20true%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Check%20that%20a%20pixel%20at%20index%20and%20index2%20match%20all%20channels%0A%20%20%20*%20@param%20%7BUint8ClampedArray%7D%20imageData%0A%20%20%20*%20@param%20%7Bnumber%7D%20index%0A%20%20%20*%20@param%20%7Bnumber%7D%20index2%0A%20%20%20*/%0A%20%20function%20pixelsSame%20(imageData,%20index,%20index2)%20%7B%0A%20%20%20%20%20%20return%20imageData%5Bindex%5D%20===%20imageData%5Bindex2%5D%20&&%0A%20%20%20%20%20%20%20%20%20%20%20%20%20imageData%5Bindex%20+%201%5D%20===%20imageData%5Bindex2%20+%201%5D%20&&%0A%20%20%20%20%20%20%20%20%20%20%20%20%20imageData%5Bindex%20+%202%5D%20===%20imageData%5Bindex2%20+%202%5D%20&&%0A%20%20%20%20%20%20%20%20%20%20%20%20%20imageData%5Bindex%20+%203%5D%20===%20imageData%5Bindex2%20+%203%5D%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Returns%20true%20if%20pixel%20should%20be%20ignored%0A%20%20%20*%20@param%20%7BUint8ClampedArray%7D%20imageData%0A%20%20%20*%20@param%20%7Bnumber%7D%20index%0A%20%20%20*%20@returns%20%7Bboolean%7D%0A%20%20%20*/%0A%20%20function%20shouldIgnorePixel%20(imageData,%20index)%20%7B%0A%20%20%20%20%20%20//%20Transparent%20pixels%0A%20%20%20%20%20%20if%20(imageData%5Bindex%20+%203%5D%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20true%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20false%0A%20%20%7D%0A%0A%20%20function%20init$9%20(args)%20%7B%0A%20%20%20%20%20%20const%20%7B%20sessionKey,%20site%20%7D%20=%20args;%0A%20%20%20%20%20%20const%20domainKey%20=%20site.domain;%0A%20%20%20%20%20%20const%20featureName%20=%20'fingerprinting-canvas';%0A%20%20%20%20%20%20const%20supportsWebGl%20=%20getFeatureSettingEnabled(featureName,%20args,%20'webGl');%0A%0A%20%20%20%20%20%20const%20unsafeCanvases%20=%20new%20WeakSet();%0A%20%20%20%20%20%20const%20canvasContexts%20=%20new%20WeakMap();%0A%20%20%20%20%20%20const%20canvasCache%20=%20new%20WeakMap();%0A%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Clear%20cache%20as%20canvas%20has%20changed%0A%20%20%20%20%20%20%20*%20@param%20%7BHTMLCanvasElement%7D%20canvas%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20function%20clearCache%20(canvas)%20%7B%0A%20%20%20%20%20%20%20%20%20%20canvasCache.delete(canvas);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20@param%20%7BHTMLCanvasElement%7D%20canvas%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20function%20treatAsUnsafe%20(canvas)%20%7B%0A%20%20%20%20%20%20%20%20%20%20unsafeCanvases.add(canvas);%0A%20%20%20%20%20%20%20%20%20%20clearCache(canvas);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20proxy%20=%20new%20DDGProxy(featureName,%20HTMLCanvasElement.prototype,%20'getContext',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20context%20=%20DDGReflect.apply(target,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20canvasContexts.set(thisArg,%20context);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20context%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20proxy.overload();%0A%0A%20%20%20%20%20%20//%20Known%20data%20methods%0A%20%20%20%20%20%20const%20safeMethods%20=%20%5B'putImageData',%20'drawImage'%5D;%0A%20%20%20%20%20%20for%20(const%20methodName%20of%20safeMethods)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20safeMethodProxy%20=%20new%20DDGProxy(featureName,%20CanvasRenderingContext2D.prototype,%20methodName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Don't%20apply%20escape%20hatch%20for%20canvases%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(methodName%20===%20'drawImage'%20&&%20args%5B0%5D%20&&%20args%5B0%5D%20instanceof%20HTMLCanvasElement)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20treatAsUnsafe(args%5B0%5D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20clearCache(thisArg.canvas);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20safeMethodProxy.overload();%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20unsafeMethods%20=%20%5B%0A%20%20%20%20%20%20%20%20%20%20'strokeRect',%0A%20%20%20%20%20%20%20%20%20%20'bezierCurveTo',%0A%20%20%20%20%20%20%20%20%20%20'quadraticCurveTo',%0A%20%20%20%20%20%20%20%20%20%20'arcTo',%0A%20%20%20%20%20%20%20%20%20%20'ellipse',%0A%20%20%20%20%20%20%20%20%20%20'rect',%0A%20%20%20%20%20%20%20%20%20%20'fill',%0A%20%20%20%20%20%20%20%20%20%20'stroke',%0A%20%20%20%20%20%20%20%20%20%20'lineTo',%0A%20%20%20%20%20%20%20%20%20%20'beginPath',%0A%20%20%20%20%20%20%20%20%20%20'closePath',%0A%20%20%20%20%20%20%20%20%20%20'arc',%0A%20%20%20%20%20%20%20%20%20%20'fillText',%0A%20%20%20%20%20%20%20%20%20%20'fillRect',%0A%20%20%20%20%20%20%20%20%20%20'strokeText',%0A%20%20%20%20%20%20%20%20%20%20'createConicGradient',%0A%20%20%20%20%20%20%20%20%20%20'createLinearGradient',%0A%20%20%20%20%20%20%20%20%20%20'createRadialGradient',%0A%20%20%20%20%20%20%20%20%20%20'createPattern'%0A%20%20%20%20%20%20%5D;%0A%20%20%20%20%20%20for%20(const%20methodName%20of%20unsafeMethods)%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20Some%20methods%20are%20browser%20specific%0A%20%20%20%20%20%20%20%20%20%20if%20(methodName%20in%20CanvasRenderingContext2D.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20unsafeProxy%20=%20new%20DDGProxy(featureName,%20CanvasRenderingContext2D.prototype,%20methodName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20treatAsUnsafe(thisArg.canvas);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20unsafeProxy.overload();%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20(supportsWebGl)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20unsafeGlMethods%20=%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'commit',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'compileShader',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'shaderSource',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'attachShader',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'createProgram',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'linkProgram',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'drawElements',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'drawArrays'%0A%20%20%20%20%20%20%20%20%20%20%5D;%0A%20%20%20%20%20%20%20%20%20%20const%20glContexts%20=%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20WebGL2RenderingContext,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20WebGLRenderingContext%0A%20%20%20%20%20%20%20%20%20%20%5D;%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20context%20of%20glContexts)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(const%20methodName%20of%20unsafeGlMethods)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Some%20methods%20are%20browser%20specific%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(methodName%20in%20context.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20unsafeProxy%20=%20new%20DDGProxy(featureName,%20context.prototype,%20methodName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20treatAsUnsafe(thisArg.canvas);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20unsafeProxy.overload();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20Using%20proxies%20here%20to%20swallow%20calls%20to%20toString%20etc%0A%20%20%20%20%20%20const%20getImageDataProxy%20=%20new%20DDGProxy(featureName,%20CanvasRenderingContext2D.prototype,%20'getImageData',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!unsafeCanvases.has(thisArg.canvas))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Anything%20we%20do%20here%20should%20be%20caught%20and%20ignored%20silently%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20%7B%20offScreenCtx%20%7D%20=%20getCachedOffScreenCanvasOrCompute(thisArg.canvas,%20domainKey,%20sessionKey);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Call%20the%20original%20method%20on%20the%20modified%20off-screen%20canvas%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20offScreenCtx,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20getImageDataProxy.overload();%0A%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Get%20cached%20offscreen%20if%20one%20exists,%20otherwise%20compute%20one%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20@param%20%7BHTMLCanvasElement%7D%20canvas%0A%20%20%20%20%20%20%20*%20@param%20%7Bstring%7D%20domainKey%0A%20%20%20%20%20%20%20*%20@param%20%7Bstring%7D%20sessionKey%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20function%20getCachedOffScreenCanvasOrCompute%20(canvas,%20domainKey,%20sessionKey)%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20result;%0A%20%20%20%20%20%20%20%20%20%20if%20(canvasCache.has(canvas))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20result%20=%20canvasCache.get(canvas);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20ctx%20=%20canvasContexts.get(canvas);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20result%20=%20computeOffScreenCanvas(canvas,%20domainKey,%20sessionKey,%20getImageDataProxy,%20ctx);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20canvasCache.set(canvas,%20result);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20return%20result%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20canvasMethods%20=%20%5B'toDataURL',%20'toBlob'%5D;%0A%20%20%20%20%20%20for%20(const%20methodName%20of%20canvasMethods)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20proxy%20=%20new%20DDGProxy(featureName,%20HTMLCanvasElement.prototype,%20methodName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Short%20circuit%20for%20low%20risk%20canvas%20calls%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!unsafeCanvases.has(thisArg))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20%7B%20offScreenCanvas%20%7D%20=%20getCachedOffScreenCanvasOrCompute(thisArg,%20domainKey,%20sessionKey);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Call%20the%20original%20method%20on%20the%20modified%20off-screen%20canvas%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20offScreenCanvas,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Something%20we%20did%20caused%20an%20exception,%20fall%20back%20to%20the%20native%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20proxy.overload();%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20fingerprintingCanvas%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$9%0A%20%20%7D);%0A%0A%20%20const%20featureName$1%20=%20'fingerprinting-hardware';%0A%0A%20%20function%20init$8%20(args)%20%7B%0A%20%20%20%20%20%20const%20Navigator%20=%20globalThis.Navigator;%0A%20%20%20%20%20%20const%20navigator%20=%20globalThis.navigator;%0A%0A%20%20%20%20%20%20overrideProperty('keyboard',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Navigator.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20navigator.keyboard,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName$1,%20args,%20'keyboard')%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20overrideProperty('hardwareConcurrency',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Navigator.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20navigator.hardwareConcurrency,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName$1,%20args,%20'hardwareConcurrency',%202)%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20overrideProperty('deviceMemory',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Navigator.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20navigator.deviceMemory,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName$1,%20args,%20'deviceMemory',%208)%0A%20%20%20%20%20%20%7D);%0A%20%20%7D%0A%0A%20%20var%20fingerprintingHardware%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$8%0A%20%20%7D);%0A%0A%20%20const%20featureName%20=%20'fingerprinting-screen-size';%0A%0A%20%20/**%0A%20%20%20*%20normalize%20window%20dimensions,%20if%20more%20than%20one%20monitor%20is%20in%20play.%0A%20%20%20*%20%20X/Y%20values%20are%20set%20in%20the%20browser%20based%20on%20distance%20to%20the%20main%20monitor%20top%20or%20left,%20which%0A%20%20%20*%20can%20mean%20second%20or%20more%20monitors%20have%20very%20large%20or%20negative%20values.%20This%20function%20maps%20a%20given%0A%20%20%20*%20given%20coordinate%20value%20to%20the%20proper%20place%20on%20the%20main%20screen.%0A%20%20%20*/%0A%20%20function%20normalizeWindowDimension%20(value,%20targetDimension)%20%7B%0A%20%20%20%20%20%20if%20(value%20%3E%20targetDimension)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20value%20%25%20targetDimension%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(value%20%3C%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20targetDimension%20+%20value%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20value%0A%20%20%7D%0A%0A%20%20function%20setWindowPropertyValue%20(property,%20value)%20%7B%0A%20%20%20%20%20%20//%20Here%20we%20don't%20update%20the%20prototype%20getter%20because%20the%20values%20are%20updated%20dynamically%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20defineProperty(globalThis,%20property,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20get:%20()%20=%3E%20value,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20set:%20()%20=%3E%20%7B%7D,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20configurable:%20true%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%7D%0A%20%20%7D%0A%0A%20%20const%20origPropertyValues%20=%20%7B%7D;%0A%0A%20%20/**%0A%20%20%20*%20Fix%20window%20dimensions.%20The%20extension%20runs%20in%20a%20different%20JS%20context%20than%20the%0A%20%20%20*%20page,%20so%20we%20can%20inject%20the%20correct%20screen%20values%20as%20the%20window%20is%20resized,%0A%20%20%20*%20ensuring%20that%20no%20information%20is%20leaked%20as%20the%20dimensions%20change,%20but%20also%20that%20the%0A%20%20%20*%20values%20change%20correctly%20for%20valid%20use%20cases.%0A%20%20%20*/%0A%20%20function%20setWindowDimensions%20()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20window%20=%20globalThis;%0A%20%20%20%20%20%20%20%20%20%20const%20top%20=%20globalThis.top;%0A%0A%20%20%20%20%20%20%20%20%20%20const%20normalizedY%20=%20normalizeWindowDimension(window.screenY,%20window.screen.height);%0A%20%20%20%20%20%20%20%20%20%20const%20normalizedX%20=%20normalizeWindowDimension(window.screenX,%20window.screen.width);%0A%20%20%20%20%20%20%20%20%20%20if%20(normalizedY%20%3C=%20origPropertyValues.availTop)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenY',%200);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenTop',%200);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenY',%20normalizedY);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenTop',%20normalizedY);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(top.window.outerHeight%20%3E=%20origPropertyValues.availHeight%20-%201)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('outerHeight',%20top.window.screen.height);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('outerHeight',%20top.window.outerHeight);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20top%20not%20accessible%20to%20certain%20iFrames,%20so%20ignore.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(normalizedX%20%3C=%20origPropertyValues.availLeft)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenX',%200);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenLeft',%200);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenX',%20normalizedX);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenLeft',%20normalizedX);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(top.window.outerWidth%20%3E=%20origPropertyValues.availWidth%20-%201)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('outerWidth',%20top.window.screen.width);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('outerWidth',%20top.window.outerWidth);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20top%20not%20accessible%20to%20certain%20iFrames,%20so%20ignore.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20in%20a%20cross%20domain%20iFrame,%20top.window%20is%20not%20accessible.%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20init$7%20(args)%20%7B%0A%20%20%20%20%20%20const%20Screen%20=%20globalThis.Screen;%0A%20%20%20%20%20%20const%20screen%20=%20globalThis.screen;%0A%0A%20%20%20%20%20%20origPropertyValues.availTop%20=%20overrideProperty('availTop',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Screen.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20screen.availTop,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName,%20args,%20'availTop',%200)%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20origPropertyValues.availLeft%20=%20overrideProperty('availLeft',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Screen.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20screen.availLeft,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName,%20args,%20'availLeft',%200)%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20origPropertyValues.availWidth%20=%20overrideProperty('availWidth',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Screen.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20screen.availWidth,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20screen.width%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20origPropertyValues.availHeight%20=%20overrideProperty('availHeight',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Screen.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20screen.availHeight,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20screen.height%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20overrideProperty('colorDepth',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Screen.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20screen.colorDepth,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName,%20args,%20'colorDepth',%2024)%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20overrideProperty('pixelDepth',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Screen.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20screen.pixelDepth,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName,%20args,%20'pixelDepth',%2024)%0A%20%20%20%20%20%20%7D);%0A%0A%20%20%20%20%20%20window.addEventListener('resize',%20function%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20setWindowDimensions();%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20setWindowDimensions();%0A%20%20%7D%0A%0A%20%20var%20fingerprintingScreenSize%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$7%0A%20%20%7D);%0A%0A%20%20function%20init$6%20()%20%7B%0A%20%20%20%20%20%20const%20navigator%20=%20globalThis.navigator;%0A%20%20%20%20%20%20const%20Navigator%20=%20globalThis.Navigator;%0A%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Temporary%20storage%20can%20be%20used%20to%20determine%20hard%20disk%20usage%20and%20size.%0A%20%20%20%20%20%20%20*%20This%20will%20limit%20the%20max%20storage%20to%204GB%20without%20completely%20disabling%20the%0A%20%20%20%20%20%20%20*%20feature.%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20if%20(navigator.webkitTemporaryStorage)%20%7B%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20org%20=%20navigator.webkitTemporaryStorage.queryUsageAndQuota;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20tStorage%20=%20navigator.webkitTemporaryStorage;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20tStorage.queryUsageAndQuota%20=%20function%20queryUsageAndQuota%20(callback,%20err)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20modifiedCallback%20=%20function%20(usedBytes,%20grantedBytes)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20maxBytesGranted%20=%204%20*%201024%20*%201024%20*%201024;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20spoofedGrantedBytes%20=%20Math.min(grantedBytes,%20maxBytesGranted);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20callback(usedBytes,%20spoofedGrantedBytes);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20org.call(navigator.webkitTemporaryStorage,%20modifiedCallback,%20err);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defineProperty(Navigator.prototype,%20'webkitTemporaryStorage',%20%7B%20get:%20()%20=%3E%20tStorage%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%7D%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20fingerprintingTemporaryStorage%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$6%0A%20%20%7D);%0A%0A%20%20function%20init$5%20()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20('browsingTopics'%20in%20Document.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20delete%20Document.prototype.browsingTopics;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20('joinAdInterestGroup'%20in%20Navigator.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20delete%20Navigator.prototype.joinAdInterestGroup;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20('leaveAdInterestGroup'%20in%20Navigator.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20delete%20Navigator.prototype.leaveAdInterestGroup;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20('updateAdInterestGroups'%20in%20Navigator.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20delete%20Navigator.prototype.updateAdInterestGroups;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20('runAdAuction'%20in%20Navigator.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20delete%20Navigator.prototype.runAdAuction;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20('adAuctionComponents'%20in%20Navigator.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20delete%20Navigator.prototype.adAuctionComponents;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20Throw%20away%20this%20exception,%20it's%20likely%20a%20confict%20with%20another%20extension%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20googleRejected%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$5%0A%20%20%7D);%0A%0A%20%20//%20Set%20Global%20Privacy%20Control%20property%20on%20DOM%0A%20%20function%20init$4%20(args)%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20If%20GPC%20on,%20set%20DOM%20property%20prototype%20to%20true%20if%20not%20already%20true%0A%20%20%20%20%20%20%20%20%20%20if%20(args.globalPrivacyControlValue)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(navigator.globalPrivacyControl)%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defineProperty(Navigator.prototype,%20'globalPrivacyControl',%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20get:%20()%20=%3E%20true,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20configurable:%20true,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20enumerable:%20true%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20If%20GPC%20off%20&%20unsupported%20by%20browser,%20set%20DOM%20property%20prototype%20to%20false%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20this%20may%20be%20overwritten%20by%20the%20user%20agent%20or%20other%20extensions%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(typeof%20navigator.globalPrivacyControl%20!==%20'undefined')%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defineProperty(Navigator.prototype,%20'globalPrivacyControl',%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20get:%20()%20=%3E%20false,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20configurable:%20true,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20enumerable:%20true%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20Ignore%20exceptions%20that%20could%20be%20caused%20by%20conflicting%20with%20other%20extensions%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20gpc%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$4%0A%20%20%7D);%0A%0A%20%20function%20init$3%20(args)%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(navigator.duckduckgo)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20(!args.platform%20%7C%7C%20!args.platform.name)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20defineProperty(Navigator.prototype,%20'duckduckgo',%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value:%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20platform:%20args.platform.name,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20isDuckDuckGo%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGPromise.resolve(true)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20enumerable:%20true,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20configurable:%20false,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20writable:%20false%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20todo:%20Just%20ignore%20this%20exception?%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20navigatorInterface%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$3%0A%20%20%7D);%0A%0A%20%20function%20init$2%20(args)%20%7B%0A%20%20%20%20%20%20//%20Unfortunately,%20we%20only%20have%20limited%20information%20about%20the%20referrer%20and%20current%20frame.%20A%20single%0A%20%20%20%20%20%20//%20page%20may%20load%20many%20requests%20and%20sub%20frames,%20all%20with%20different%20referrers.%20Since%20we%0A%20%20%20%20%20%20if%20(args.referrer%20&&%20//%20make%20sure%20the%20referrer%20was%20set%20correctly%0A%20%20%20%20%20%20%20%20%20%20args.referrer.referrer%20!==%20undefined%20&&%20//%20referrer%20value%20will%20be%20undefined%20when%20it%20should%20be%20unchanged.%0A%20%20%20%20%20%20%20%20%20%20document.referrer%20&&%20//%20don't%20change%20the%20value%20if%20it%20isn't%20set%0A%20%20%20%20%20%20%20%20%20%20document.referrer%20!==%20''%20&&%20//%20don't%20add%20referrer%20information%0A%20%20%20%20%20%20%20%20%20%20new%20URL(document.URL).hostname%20!==%20new%20URL(document.referrer).hostname)%20%7B%20//%20don't%20replace%20the%20referrer%20for%20the%20current%20host.%0A%20%20%20%20%20%20%20%20%20%20let%20trimmedReferer%20=%20document.referrer;%0A%20%20%20%20%20%20%20%20%20%20if%20(new%20URL(document.referrer).hostname%20===%20args.referrer.referrerHost)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20make%20sure%20the%20real%20referrer%20&%20replacement%20referrer%20match%20if%20we're%20going%20to%20replace%20it%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20trimmedReferer%20=%20args.referrer.referrer;%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20if%20we%20don't%20have%20a%20matching%20referrer,%20just%20trim%20it%20to%20origin.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20trimmedReferer%20=%20new%20URL(document.referrer).origin%20+%20'/';%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20overrideProperty('referrer',%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20object:%20Document.prototype,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20origValue:%20document.referrer,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20targetValue:%20trimmedReferer%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20referrer%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$2%0A%20%20%7D);%0A%0A%20%20/**%0A%20%20%20*%20Fixes%20incorrect%20sizing%20value%20for%20outerHeight%20and%20outerWidth%0A%20%20%20*/%0A%20%20function%20windowSizingFix%20()%20%7B%0A%20%20%20%20%20%20window.outerHeight%20=%20window.innerHeight;%0A%20%20%20%20%20%20window.outerWidth%20=%20window.innerWidth;%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Add%20missing%20navigator.credentials%20API%0A%20%20%20*/%0A%20%20function%20navigatorCredentialsFix%20()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20value%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20get%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20Promise.reject(new%20Error())%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D;%0A%20%20%20%20%20%20%20%20%20%20defineProperty(Navigator.prototype,%20'credentials',%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20configurable:%20true,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20enumerable:%20true%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20Ignore%20exceptions%20that%20could%20be%20caused%20by%20conflicting%20with%20other%20extensions%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20init$1%20()%20%7B%0A%20%20%20%20%20%20windowSizingFix();%0A%20%20%20%20%20%20navigatorCredentialsFix();%0A%20%20%7D%0A%0A%20%20var%20webCompat%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$1%0A%20%20%7D);%0A%0A%20%20/*%20global%20Bluetooth,%20Geolocation,%20HID,%20Serial,%20USB%20*/%0A%0A%20%20function%20init%20()%20%7B%0A%20%20%20%20%20%20const%20featureName%20=%20'windows-permission-usage';%0A%0A%20%20%20%20%20%20const%20Permission%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20Geolocation:%20'geolocation',%0A%20%20%20%20%20%20%20%20%20%20Camera:%20'camera',%0A%20%20%20%20%20%20%20%20%20%20Microphone:%20'microphone'%0A%20%20%20%20%20%20%7D;%0A%0A%20%20%20%20%20%20const%20Status%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20Inactive:%20'inactive',%0A%20%20%20%20%20%20%20%20%20%20Accessed:%20'accessed',%0A%20%20%20%20%20%20%20%20%20%20Active:%20'active',%0A%20%20%20%20%20%20%20%20%20%20Paused:%20'paused'%0A%20%20%20%20%20%20%7D;%0A%0A%20%20%20%20%20%20const%20isFrameInsideFrame%20=%20window.self%20!==%20window.top%20&&%20window.parent%20!==%20window.top;%0A%0A%20%20%20%20%20%20function%20windowsPostMessage%20(name,%20data)%20%7B%0A%20%20%20%20%20%20%20%20%20%20window.chrome.webview.postMessage(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Feature:%20'Permissions',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Name:%20name,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Data:%20data%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20windowsPostGeolocationMessage%20(name,%20data)%20%7B%0A%20%20%20%20%20%20%20%20%20%20window.chrome.webview.postMessage(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Feature:%20'Geolocation',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Name:%20name,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Data:%20data%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20signalPermissionStatus%20(permission,%20status)%20%7B%0A%20%20%20%20%20%20%20%20%20%20windowsPostMessage('PermissionStatusMessage',%20%7B%20permission,%20status%20%7D);%0A%20%20%20%20%20%20%20%20%20%20console.debug(%60Permission%20'$%7Bpermission%7D'%20is%20$%7Bstatus%7D%60);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20registerPositionMessageHandler%20(args,%20messageId,%20geolocationActiveStatus)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20successHandler%20=%20args%5B0%5D;%0A%0A%20%20%20%20%20%20%20%20%20%20const%20handler%20=%20function%20(%7B%20data%20%7D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(data?.id%20===%20messageId)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20window.chrome.webview.removeEventListener('message',%20handler);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(Permission.Geolocation,%20geolocationActiveStatus);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(Object.prototype.hasOwnProperty.call(data,%20'errorCode'))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(args.length%20%3E=%202)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20errorHandler%20=%20args%5B1%5D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20error%20=%20%7B%20code:%20data.errorCode,%20message:%20data.errorMessage%20%7D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20errorHandler?.(error);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20rez%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20timestamp:%20data.timestamp,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20coords:%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20latitude:%20data.latitude,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20longitude:%20data.longitude,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20altitude:%20null,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20altitudeAccuracy:%20null,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heading:%20null,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20speed:%20null,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20accuracy:%20data.accuracy%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D;%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20successHandler?.(rez);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D;%0A%0A%20%20%20%20%20%20%20%20%20%20window.chrome.webview.addEventListener('message',%20handler);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20let%20watchedPositionId%20=%200;%0A%20%20%20%20%20%20const%20watchedPositions%20=%20new%20Set();%0A%20%20%20%20%20%20//%20proxy%20for%20navigator.geolocation.watchPosition%20-%3E%20show%20red%20geolocation%20indicator%0A%20%20%20%20%20%20const%20watchPositionProxy%20=%20new%20DDGProxy(featureName,%20Geolocation.prototype,%20'watchPosition',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(isFrameInsideFrame)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20we%20can't%20communicate%20with%20iframes%20inside%20iframes%20-%3E%20deny%20permission%20instead%20of%20putting%20users%20at%20risk%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20throw%20new%20DOMException('Permission%20denied')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20messageId%20=%20crypto.randomUUID();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20registerPositionMessageHandler(args,%20messageId,%20Status.Active);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20windowsPostGeolocationMessage('positionRequested',%20%7B%20id:%20messageId%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20watchedPositionId++;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20watchedPositions.add(watchedPositionId);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20watchedPositionId%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20watchPositionProxy.overload();%0A%0A%20%20%20%20%20%20//%20proxy%20for%20navigator.geolocation.clearWatch%20-%3E%20clear%20red%20geolocation%20indicator%0A%20%20%20%20%20%20const%20clearWatchProxy%20=%20new%20DDGProxy(featureName,%20Geolocation.prototype,%20'clearWatch',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(args%5B0%5D%20&&%20watchedPositions.delete(args%5B0%5D)%20&&%20watchedPositions.size%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(Permission.Geolocation,%20Status.Inactive);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20clearWatchProxy.overload();%0A%0A%20%20%20%20%20%20//%20proxy%20for%20navigator.geolocation.getCurrentPosition%20-%3E%20normal%20geolocation%20indicator%0A%20%20%20%20%20%20const%20getCurrentPositionProxy%20=%20new%20DDGProxy(featureName,%20Geolocation.prototype,%20'getCurrentPosition',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20messageId%20=%20crypto.randomUUID();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20registerPositionMessageHandler(args,%20messageId,%20Status.Accessed);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20windowsPostGeolocationMessage('positionRequested',%20%7B%20id:%20messageId%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20getCurrentPositionProxy.overload();%0A%0A%20%20%20%20%20%20const%20userMediaStreams%20=%20new%20Set();%0A%20%20%20%20%20%20const%20videoTracks%20=%20new%20Set();%0A%20%20%20%20%20%20const%20audioTracks%20=%20new%20Set();%0A%0A%20%20%20%20%20%20function%20getTracks%20(permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20switch%20(permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20case%20Permission.Camera:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20videoTracks%0A%20%20%20%20%20%20%20%20%20%20case%20Permission.Microphone:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20audioTracks%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20pause%20(permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20streamTracks%20=%20getTracks(permission);%0A%20%20%20%20%20%20%20%20%20%20streamTracks?.forEach(track%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.enabled%20=%20false;%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20resume%20(permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20streamTracks%20=%20getTracks(permission);%0A%20%20%20%20%20%20%20%20%20%20streamTracks?.forEach(track%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.enabled%20=%20true;%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20stop%20(permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20streamTracks%20=%20getTracks(permission);%0A%20%20%20%20%20%20%20%20%20%20streamTracks?.forEach(track%20=%3E%20track.stop());%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20monitorTrack%20(track)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(track.readyState%20===%20'ended')%20return%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(track.kind%20===%20'video'%20&&%20!videoTracks.has(track))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60New%20video%20stream%20track%20$%7Btrack.id%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.addEventListener('ended',%20videoTrackEnded);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.addEventListener('mute',%20signalVideoTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.addEventListener('unmute',%20signalVideoTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20videoTracks.add(track);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(track.kind%20===%20'audio'%20&&%20!audioTracks.has(track))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60New%20audio%20stream%20track%20$%7Btrack.id%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.addEventListener('ended',%20audioTrackEnded);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.addEventListener('mute',%20signalAudioTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.addEventListener('unmute',%20signalAudioTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20audioTracks.add(track);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20handleTrackEnded%20(track)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(track.kind%20===%20'video'%20&&%20videoTracks.has(track))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60Video%20stream%20track%20$%7Btrack.id%7D%20ended%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.removeEventListener('ended',%20videoTrackEnded);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.removeEventListener('mute',%20signalVideoTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.removeEventListener('unmute',%20signalVideoTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20videoTracks.delete(track);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalVideoTracksState();%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(track.kind%20===%20'audio'%20&&%20audioTracks.has(track))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60Audio%20stream%20track%20$%7Btrack.id%7D%20ended%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.removeEventListener('ended',%20audioTrackEnded);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.removeEventListener('mute',%20signalAudioTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.removeEventListener('unmute',%20signalAudioTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20audioTracks.delete(track);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalAudioTracksState();%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20videoTrackEnded%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20handleTrackEnded(e.target);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20audioTrackEnded%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20handleTrackEnded(e.target);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20signalTracksState%20(permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20tracks%20=%20getTracks(permission);%0A%20%20%20%20%20%20%20%20%20%20if%20(!tracks)%20return%0A%0A%20%20%20%20%20%20%20%20%20%20const%20allTrackCount%20=%20tracks.size;%0A%20%20%20%20%20%20%20%20%20%20if%20(allTrackCount%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(permission,%20Status.Inactive);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20let%20mutedTrackCount%20=%200;%0A%20%20%20%20%20%20%20%20%20%20tracks.forEach(track%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20mutedTrackCount%20+=%20((!track.enabled%20%7C%7C%20track.muted)%20?%201%20:%200);%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20if%20(mutedTrackCount%20===%20allTrackCount)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(permission,%20Status.Paused);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(mutedTrackCount%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60Some%20$%7Bpermission%7D%20tracks%20are%20still%20active:%20$%7BallTrackCount%20-%20mutedTrackCount%7D/$%7BallTrackCount%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(permission,%20Status.Active);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20let%20signalVideoTracksStateTimer;%0A%20%20%20%20%20%20function%20signalVideoTracksState%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20clearTimeout(signalVideoTracksStateTimer);%0A%20%20%20%20%20%20%20%20%20%20signalVideoTracksStateTimer%20=%20setTimeout(()%20=%3E%20signalTracksState(Permission.Camera),%20100);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20let%20signalAudioTracksStateTimer;%0A%20%20%20%20%20%20function%20signalAudioTracksState%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20clearTimeout(signalAudioTracksStateTimer);%0A%20%20%20%20%20%20%20%20%20%20signalAudioTracksStateTimer%20=%20setTimeout(()%20=%3E%20signalTracksState(Permission.Microphone),%20100);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20proxy%20for%20track.stop%20-%3E%20clear%20camera/mic%20indicator%20manually%20here%20because%20no%20ended%20event%20raised%20this%20way%0A%20%20%20%20%20%20const%20stopTrackProxy%20=%20new%20DDGProxy(featureName,%20MediaStreamTrack.prototype,%20'stop',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20handleTrackEnded(thisArg);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20stopTrackProxy.overload();%0A%0A%20%20%20%20%20%20//%20proxy%20for%20track.clone%20-%3E%20monitor%20the%20cloned%20track%0A%20%20%20%20%20%20const%20cloneTrackProxy%20=%20new%20DDGProxy(featureName,%20MediaStreamTrack.prototype,%20'clone',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20clonedTrack%20=%20DDGReflect.apply(target,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(clonedTrack%20&&%20(videoTracks.has(thisArg)%20%7C%7C%20audioTracks.has(thisArg)))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60Media%20stream%20track%20$%7BthisArg.id%7D%20has%20been%20cloned%20to%20track%20$%7BclonedTrack.id%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20monitorTrack(clonedTrack);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20clonedTrack%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20cloneTrackProxy.overload();%0A%0A%20%20%20%20%20%20//%20override%20MediaStreamTrack.enabled%20-%3E%20update%20active/paused%20status%20when%20enabled%20is%20set%0A%20%20%20%20%20%20const%20trackEnabledPropertyDescriptor%20=%20Object.getOwnPropertyDescriptor(MediaStreamTrack.prototype,%20'enabled');%0A%20%20%20%20%20%20defineProperty(MediaStreamTrack.prototype,%20'enabled',%20%7B%0A%20%20%20%20%20%20%20%20%20%20configurable:%20trackEnabledPropertyDescriptor.configurable,%0A%20%20%20%20%20%20%20%20%20%20enumerable:%20trackEnabledPropertyDescriptor.enumerable,%0A%20%20%20%20%20%20%20%20%20%20get:%20function%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20trackEnabledPropertyDescriptor.get.bind(this)()%0A%20%20%20%20%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%20%20%20%20set:%20function%20(value)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20result%20=%20trackEnabledPropertyDescriptor.set.bind(this)(...arguments);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(videoTracks.has(this))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalVideoTracksState();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(audioTracks.has(this))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalAudioTracksState();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20result%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%0A%20%20%20%20%20%20//%20proxy%20for%20get*Tracks%20methods%20-%3E%20needed%20to%20monitor%20tracks%20returned%20by%20saved%20media%20stream%20coming%20for%20MediaDevices.getUserMedia%0A%20%20%20%20%20%20const%20getTracksMethodNames%20=%20%5B'getTracks',%20'getAudioTracks',%20'getVideoTracks'%5D;%0A%20%20%20%20%20%20for%20(const%20methodName%20of%20getTracksMethodNames)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20getTracksProxy%20=%20new%20DDGProxy(featureName,%20MediaStream.prototype,%20methodName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20tracks%20=%20DDGReflect.apply(target,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(userMediaStreams.has(thisArg))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tracks.forEach(monitorTrack);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20tracks%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20getTracksProxy.overload();%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20proxy%20for%20MediaStream.clone%20-%3E%20needed%20to%20monitor%20cloned%20MediaDevices.getUserMedia%20streams%0A%20%20%20%20%20%20const%20cloneMediaStreamProxy%20=%20new%20DDGProxy(featureName,%20MediaStream.prototype,%20'clone',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20clonedStream%20=%20DDGReflect.apply(target,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(userMediaStreams.has(thisArg))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60User%20stream%20$%7BthisArg.id%7D%20has%20been%20cloned%20to%20stream%20$%7BclonedStream.id%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20userMediaStreams.add(clonedStream);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20clonedStream%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20cloneMediaStreamProxy.overload();%0A%0A%20%20%20%20%20%20//%20proxy%20for%20navigator.mediaDevices.getUserMedia%20-%3E%20show%20red%20camera/mic%20indicators%0A%20%20%20%20%20%20if%20(MediaDevices)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20getUserMediaProxy%20=%20new%20DDGProxy(featureName,%20MediaDevices.prototype,%20'getUserMedia',%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(isFrameInsideFrame)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20we%20can't%20communicate%20with%20iframes%20inside%20iframes%20-%3E%20deny%20permission%20instead%20of%20putting%20users%20at%20risk%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20Promise.reject(new%20DOMException('Permission%20denied'))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20videoRequested%20=%20args%5B0%5D?.video;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20audioRequested%20=%20args%5B0%5D?.audio;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args).then(function%20(stream)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60User%20stream%20$%7Bstream.id%7D%20has%20been%20acquired%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20userMediaStreams.add(stream);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(videoRequested)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20newVideoTracks%20=%20stream.getVideoTracks();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(newVideoTracks?.length%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(Permission.Camera,%20Status.Active);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20newVideoTracks.forEach(monitorTrack);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(audioRequested)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20newAudioTracks%20=%20stream.getAudioTracks();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(newAudioTracks?.length%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(Permission.Microphone,%20Status.Active);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20newAudioTracks.forEach(monitorTrack);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20stream%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20getUserMediaProxy.overload();%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20performAction%20(action,%20permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(action%20&&%20permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20switch%20(action)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20'pause':%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pause(permission);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20'resume':%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20resume(permission);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20'stop':%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stop(permission);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20handle%20actions%20from%20browser%0A%20%20%20%20%20%20window.chrome.webview.addEventListener('message',%20function%20(%7B%20data%20%7D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(data?.action%20&&%20data?.permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20performAction(data?.action,%20data?.permission);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%0A%20%20%20%20%20%20//%20these%20permissions%20cannot%20be%20disabled%20using%20WebView2%20or%20DevTools%20protocol%0A%20%20%20%20%20%20const%20permissionsToDisable%20=%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%20name:%20'Bluetooth',%20prototype:%20Bluetooth.prototype,%20method:%20'requestDevice'%20%7D,%0A%20%20%20%20%20%20%20%20%20%20%7B%20name:%20'USB',%20prototype:%20USB.prototype,%20method:%20'requestDevice'%20%7D,%0A%20%20%20%20%20%20%20%20%20%20%7B%20name:%20'Serial',%20prototype:%20Serial.prototype,%20method:%20'requestPort'%20%7D,%0A%20%20%20%20%20%20%20%20%20%20%7B%20name:%20'HID',%20prototype:%20HID.prototype,%20method:%20'requestDevice'%20%7D%0A%20%20%20%20%20%20%5D;%0A%20%20%20%20%20%20for%20(const%20%7B%20name,%20prototype,%20method%20%7D%20of%20permissionsToDisable)%20%7B%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20proxy%20=%20new%20DDGProxy(featureName,%20prototype,%20method,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20Promise.reject(new%20DOMException('Permission%20denied'))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20proxy.overload();%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(error)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.info(%60Could%20not%20disable%20access%20to%20$%7Bname%7D%20because%20of%20error%60,%20error);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20windowsPermissionUsage%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init%0A%20%20%7D);%0A%0A%20%20exports.init%20=%20init$d;%0A%20%20exports.load%20=%20load$1;%0A%20%20exports.update%20=%20update$1;%0A%0A%20%20Object.defineProperty(exports,%20'__esModule',%20%7B%20value:%20true%20%7D);%0A%0A%20%20return%20exports;%0A%0A%7D)(%7B%7D);%0A")} + ${decodeURI("var%20contentScopeFeatures%20=%20(function%20(exports)%20%7B%0A%20%20'use%20strict';%0A%0A%20%20//%20@ts-nocheck%0A%20%20%20%20%20%20const%20sjcl%20=%20(()%20=%3E%20%7B%0A%20%20/*jslint%20indent:%202,%20bitwise:%20false,%20nomen:%20false,%20plusplus:%20false,%20white:%20false,%20regexp:%20false%20*/%0A%20%20/*global%20document,%20window,%20escape,%20unescape,%20module,%20require,%20Uint32Array%20*/%0A%0A%20%20/**%0A%20%20%20*%20The%20Stanford%20Javascript%20Crypto%20Library,%20top-level%20namespace.%0A%20%20%20*%20@namespace%0A%20%20%20*/%0A%20%20var%20sjcl%20=%20%7B%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Symmetric%20ciphers.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*/%0A%20%20%20%20cipher:%20%7B%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Hash%20functions.%20%20Right%20now%20only%20SHA256%20is%20implemented.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*/%0A%20%20%20%20hash:%20%7B%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Key%20exchange%20functions.%20%20Right%20now%20only%20SRP%20is%20implemented.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*/%0A%20%20%20%20keyexchange:%20%7B%7D,%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Cipher%20modes%20of%20operation.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*/%0A%20%20%20%20mode:%20%7B%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Miscellaneous.%20%20HMAC%20and%20PBKDF2.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*/%0A%20%20%20%20misc:%20%7B%7D,%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Bit%20array%20encoders%20and%20decoders.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20@description%0A%20%20%20%20%20*%20The%20members%20of%20this%20namespace%20are%20functions%20which%20translate%20between%0A%20%20%20%20%20*%20SJCL's%20bitArrays%20and%20other%20objects%20(usually%20strings).%20%20Because%20it%0A%20%20%20%20%20*%20isn't%20always%20clear%20which%20direction%20is%20encoding%20and%20which%20is%20decoding,%0A%20%20%20%20%20*%20the%20method%20names%20are%20%22fromBits%22%20and%20%22toBits%22.%0A%20%20%20%20%20*/%0A%20%20%20%20codec:%20%7B%7D,%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Exceptions.%0A%20%20%20%20%20*%20@namespace%0A%20%20%20%20%20*/%0A%20%20%20%20exception:%20%7B%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Ciphertext%20is%20corrupt.%0A%20%20%20%20%20%20%20*%20@constructor%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20corrupt:%20function(message)%20%7B%0A%20%20%20%20%20%20%20%20this.toString%20=%20function()%20%7B%20return%20%22CORRUPT:%20%22+this.message;%20%7D;%0A%20%20%20%20%20%20%20%20this.message%20=%20message;%0A%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Invalid%20parameter.%0A%20%20%20%20%20%20%20*%20@constructor%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20invalid:%20function(message)%20%7B%0A%20%20%20%20%20%20%20%20this.toString%20=%20function()%20%7B%20return%20%22INVALID:%20%22+this.message;%20%7D;%0A%20%20%20%20%20%20%20%20this.message%20=%20message;%0A%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Bug%20or%20missing%20feature%20in%20SJCL.%0A%20%20%20%20%20%20%20*%20@constructor%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20bug:%20function(message)%20%7B%0A%20%20%20%20%20%20%20%20this.toString%20=%20function()%20%7B%20return%20%22BUG:%20%22+this.message;%20%7D;%0A%20%20%20%20%20%20%20%20this.message%20=%20message;%0A%20%20%20%20%20%20%7D,%0A%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Something%20isn't%20ready.%0A%20%20%20%20%20%20%20*%20@constructor%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20notReady:%20function(message)%20%7B%0A%20%20%20%20%20%20%20%20this.toString%20=%20function()%20%7B%20return%20%22NOT%20READY:%20%22+this.message;%20%7D;%0A%20%20%20%20%20%20%20%20this.message%20=%20message;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D;%0A%20%20/**%20@fileOverview%20Arrays%20of%20bits,%20encoded%20as%20arrays%20of%20Numbers.%0A%20%20%20*%0A%20%20%20*%20@author%20Emily%20Stark%0A%20%20%20*%20@author%20Mike%20Hamburg%0A%20%20%20*%20@author%20Dan%20Boneh%0A%20%20%20*/%0A%0A%20%20/**%0A%20%20%20*%20Arrays%20of%20bits,%20encoded%20as%20arrays%20of%20Numbers.%0A%20%20%20*%20@namespace%0A%20%20%20*%20@description%0A%20%20%20*%20%3Cp%3E%0A%20%20%20*%20These%20objects%20are%20the%20currency%20accepted%20by%20SJCL's%20crypto%20functions.%0A%20%20%20*%20%3C/p%3E%0A%20%20%20*%0A%20%20%20*%20%3Cp%3E%0A%20%20%20*%20Most%20of%20our%20crypto%20primitives%20operate%20on%20arrays%20of%204-byte%20words%20internally,%0A%20%20%20*%20but%20many%20of%20them%20can%20take%20arguments%20that%20are%20not%20a%20multiple%20of%204%20bytes.%0A%20%20%20*%20This%20library%20encodes%20arrays%20of%20bits%20(whose%20size%20need%20not%20be%20a%20multiple%20of%208%0A%20%20%20*%20bits)%20as%20arrays%20of%2032-bit%20words.%20%20The%20bits%20are%20packed,%20big-endian,%20into%20an%0A%20%20%20*%20array%20of%20words,%2032%20bits%20at%20a%20time.%20%20Since%20the%20words%20are%20double-precision%0A%20%20%20*%20floating%20point%20numbers,%20they%20fit%20some%20extra%20data.%20%20We%20use%20this%20(in%20a%20private,%0A%20%20%20*%20possibly-changing%20manner)%20to%20encode%20the%20number%20of%20bits%20actually%20%20present%0A%20%20%20*%20in%20the%20last%20word%20of%20the%20array.%0A%20%20%20*%20%3C/p%3E%0A%20%20%20*%0A%20%20%20*%20%3Cp%3E%0A%20%20%20*%20Because%20bitwise%20ops%20clear%20this%20out-of-band%20data,%20these%20arrays%20can%20be%20passed%0A%20%20%20*%20to%20ciphers%20like%20AES%20which%20want%20arrays%20of%20words.%0A%20%20%20*%20%3C/p%3E%0A%20%20%20*/%0A%20%20sjcl.bitArray%20=%20%7B%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Array%20slices%20in%20units%20of%20bits.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a%20The%20array%20to%20slice.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20bstart%20The%20offset%20to%20the%20start%20of%20the%20slice,%20in%20bits.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20bend%20The%20offset%20to%20the%20end%20of%20the%20slice,%20in%20bits.%20%20If%20this%20is%20undefined,%0A%20%20%20%20%20*%20slice%20until%20the%20end%20of%20the%20array.%0A%20%20%20%20%20*%20@return%20%7BbitArray%7D%20The%20requested%20slice.%0A%20%20%20%20%20*/%0A%20%20%20%20bitSlice:%20function%20(a,%20bstart,%20bend)%20%7B%0A%20%20%20%20%20%20a%20=%20sjcl.bitArray._shiftRight(a.slice(bstart/32),%2032%20-%20(bstart%20&%2031)).slice(1);%0A%20%20%20%20%20%20return%20(bend%20===%20undefined)%20?%20a%20:%20sjcl.bitArray.clamp(a,%20bend-bstart);%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Extract%20a%20number%20packed%20into%20a%20bit%20array.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a%20The%20array%20to%20slice.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20bstart%20The%20offset%20to%20the%20start%20of%20the%20slice,%20in%20bits.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20blength%20The%20length%20of%20the%20number%20to%20extract.%0A%20%20%20%20%20*%20@return%20%7BNumber%7D%20The%20requested%20slice.%0A%20%20%20%20%20*/%0A%20%20%20%20extract:%20function(a,%20bstart,%20blength)%20%7B%0A%20%20%20%20%20%20//%20FIXME:%20this%20Math.floor%20is%20not%20necessary%20at%20all,%20but%20for%20some%20reason%0A%20%20%20%20%20%20//%20seems%20to%20suppress%20a%20bug%20in%20the%20Chromium%20JIT.%0A%20%20%20%20%20%20var%20x,%20sh%20=%20Math.floor((-bstart-blength)%20&%2031);%0A%20%20%20%20%20%20if%20((bstart%20+%20blength%20-%201%20%5E%20bstart)%20&%20-32)%20%7B%0A%20%20%20%20%20%20%20%20//%20it%20crosses%20a%20boundary%0A%20%20%20%20%20%20%20%20x%20=%20(a%5Bbstart/32%7C0%5D%20%3C%3C%20(32%20-%20sh))%20%5E%20(a%5Bbstart/32+1%7C0%5D%20%3E%3E%3E%20sh);%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20//%20within%20a%20single%20word%0A%20%20%20%20%20%20%20%20x%20=%20a%5Bbstart/32%7C0%5D%20%3E%3E%3E%20sh;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20x%20&%20((1%3C%3Cblength)%20-%201);%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Concatenate%20two%20bit%20arrays.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a1%20The%20first%20array.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a2%20The%20second%20array.%0A%20%20%20%20%20*%20@return%20%7BbitArray%7D%20The%20concatenation%20of%20a1%20and%20a2.%0A%20%20%20%20%20*/%0A%20%20%20%20concat:%20function%20(a1,%20a2)%20%7B%0A%20%20%20%20%20%20if%20(a1.length%20===%200%20%7C%7C%20a2.length%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20return%20a1.concat(a2);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20var%20last%20=%20a1%5Ba1.length-1%5D,%20shift%20=%20sjcl.bitArray.getPartial(last);%0A%20%20%20%20%20%20if%20(shift%20===%2032)%20%7B%0A%20%20%20%20%20%20%20%20return%20a1.concat(a2);%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20return%20sjcl.bitArray._shiftRight(a2,%20shift,%20last%7C0,%20a1.slice(0,a1.length-1));%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Find%20the%20length%20of%20an%20array%20of%20bits.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a%20The%20array.%0A%20%20%20%20%20*%20@return%20%7BNumber%7D%20The%20length%20of%20a,%20in%20bits.%0A%20%20%20%20%20*/%0A%20%20%20%20bitLength:%20function%20(a)%20%7B%0A%20%20%20%20%20%20var%20l%20=%20a.length,%20x;%0A%20%20%20%20%20%20if%20(l%20===%200)%20%7B%20return%200;%20%7D%0A%20%20%20%20%20%20x%20=%20a%5Bl%20-%201%5D;%0A%20%20%20%20%20%20return%20(l-1)%20*%2032%20+%20sjcl.bitArray.getPartial(x);%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Truncate%20an%20array.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a%20The%20array.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20len%20The%20length%20to%20truncate%20to,%20in%20bits.%0A%20%20%20%20%20*%20@return%20%7BbitArray%7D%20A%20new%20array,%20truncated%20to%20len%20bits.%0A%20%20%20%20%20*/%0A%20%20%20%20clamp:%20function%20(a,%20len)%20%7B%0A%20%20%20%20%20%20if%20(a.length%20*%2032%20%3C%20len)%20%7B%20return%20a;%20%7D%0A%20%20%20%20%20%20a%20=%20a.slice(0,%20Math.ceil(len%20/%2032));%0A%20%20%20%20%20%20var%20l%20=%20a.length;%0A%20%20%20%20%20%20len%20=%20len%20&%2031;%0A%20%20%20%20%20%20if%20(l%20%3E%200%20&&%20len)%20%7B%0A%20%20%20%20%20%20%20%20a%5Bl-1%5D%20=%20sjcl.bitArray.partial(len,%20a%5Bl-1%5D%20&%200x80000000%20%3E%3E%20(len-1),%201);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20a;%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Make%20a%20partial%20word%20for%20a%20bit%20array.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20len%20The%20number%20of%20bits%20in%20the%20word.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20x%20The%20bits.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20%5B_end=0%5D%20Pass%201%20if%20x%20has%20already%20been%20shifted%20to%20the%20high%20side.%0A%20%20%20%20%20*%20@return%20%7BNumber%7D%20The%20partial%20word.%0A%20%20%20%20%20*/%0A%20%20%20%20partial:%20function%20(len,%20x,%20_end)%20%7B%0A%20%20%20%20%20%20if%20(len%20===%2032)%20%7B%20return%20x;%20%7D%0A%20%20%20%20%20%20return%20(_end%20?%20x%7C0%20:%20x%20%3C%3C%20(32-len))%20+%20len%20*%200x10000000000;%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Get%20the%20number%20of%20bits%20used%20by%20a%20partial%20word.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20x%20The%20partial%20word.%0A%20%20%20%20%20*%20@return%20%7BNumber%7D%20The%20number%20of%20bits%20used%20by%20the%20partial%20word.%0A%20%20%20%20%20*/%0A%20%20%20%20getPartial:%20function%20(x)%20%7B%0A%20%20%20%20%20%20return%20Math.round(x/0x10000000000)%20%7C%7C%2032;%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Compare%20two%20arrays%20for%20equality%20in%20a%20predictable%20amount%20of%20time.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a%20The%20first%20array.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20b%20The%20second%20array.%0A%20%20%20%20%20*%20@return%20%7Bboolean%7D%20true%20if%20a%20==%20b;%20false%20otherwise.%0A%20%20%20%20%20*/%0A%20%20%20%20equal:%20function%20(a,%20b)%20%7B%0A%20%20%20%20%20%20if%20(sjcl.bitArray.bitLength(a)%20!==%20sjcl.bitArray.bitLength(b))%20%7B%0A%20%20%20%20%20%20%20%20return%20false;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20x%20=%200,%20i;%0A%20%20%20%20%20%20for%20(i=0;%20i%3Ca.length;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20x%20%7C=%20a%5Bi%5D%5Eb%5Bi%5D;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20(x%20===%200);%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%20Shift%20an%20array%20right.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20a%20The%20array%20to%20shift.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20shift%20The%20number%20of%20bits%20to%20shift.%0A%20%20%20%20%20*%20@param%20%7BNumber%7D%20%5Bcarry=0%5D%20A%20byte%20to%20carry%20in%0A%20%20%20%20%20*%20@param%20%7BbitArray%7D%20%5Bout=%5B%5D%5D%20An%20array%20to%20prepend%20to%20the%20output.%0A%20%20%20%20%20*%20@private%0A%20%20%20%20%20*/%0A%20%20%20%20_shiftRight:%20function%20(a,%20shift,%20carry,%20out)%20%7B%0A%20%20%20%20%20%20var%20i,%20last2=0,%20shift2;%0A%20%20%20%20%20%20if%20(out%20===%20undefined)%20%7B%20out%20=%20%5B%5D;%20%7D%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20for%20(;%20shift%20%3E=%2032;%20shift%20-=%2032)%20%7B%0A%20%20%20%20%20%20%20%20out.push(carry);%0A%20%20%20%20%20%20%20%20carry%20=%200;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(shift%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20return%20out.concat(a);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20for%20(i=0;%20i%3Ca.length;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20out.push(carry%20%7C%20a%5Bi%5D%3E%3E%3Eshift);%0A%20%20%20%20%20%20%20%20carry%20=%20a%5Bi%5D%20%3C%3C%20(32-shift);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20last2%20=%20a.length%20?%20a%5Ba.length-1%5D%20:%200;%0A%20%20%20%20%20%20shift2%20=%20sjcl.bitArray.getPartial(last2);%0A%20%20%20%20%20%20out.push(sjcl.bitArray.partial(shift+shift2%20&%2031,%20(shift%20+%20shift2%20%3E%2032)%20?%20carry%20:%20out.pop(),1));%0A%20%20%20%20%20%20return%20out;%0A%20%20%20%20%7D,%0A%20%20%20%20%0A%20%20%20%20/**%20xor%20a%20block%20of%204%20words%20together.%0A%20%20%20%20%20*%20@private%0A%20%20%20%20%20*/%0A%20%20%20%20_xor4:%20function(x,y)%20%7B%0A%20%20%20%20%20%20return%20%5Bx%5B0%5D%5Ey%5B0%5D,x%5B1%5D%5Ey%5B1%5D,x%5B2%5D%5Ey%5B2%5D,x%5B3%5D%5Ey%5B3%5D%5D;%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%20byteswap%20a%20word%20array%20inplace.%0A%20%20%20%20%20*%20(does%20not%20handle%20partial%20words)%0A%20%20%20%20%20*%20@param%20%7Bsjcl.bitArray%7D%20a%20word%20array%0A%20%20%20%20%20*%20@return%20%7Bsjcl.bitArray%7D%20byteswapped%20array%0A%20%20%20%20%20*/%0A%20%20%20%20byteswapM:%20function(a)%20%7B%0A%20%20%20%20%20%20var%20i,%20v,%20m%20=%200xff00;%0A%20%20%20%20%20%20for%20(i%20=%200;%20i%20%3C%20a.length;%20++i)%20%7B%0A%20%20%20%20%20%20%20%20v%20=%20a%5Bi%5D;%0A%20%20%20%20%20%20%20%20a%5Bi%5D%20=%20(v%20%3E%3E%3E%2024)%20%7C%20((v%20%3E%3E%3E%208)%20&%20m)%20%7C%20((v%20&%20m)%20%3C%3C%208)%20%7C%20(v%20%3C%3C%2024);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20a;%0A%20%20%20%20%7D%0A%20%20%7D;%0A%20%20/**%20@fileOverview%20Bit%20array%20codec%20implementations.%0A%20%20%20*%0A%20%20%20*%20@author%20Emily%20Stark%0A%20%20%20*%20@author%20Mike%20Hamburg%0A%20%20%20*%20@author%20Dan%20Boneh%0A%20%20%20*/%0A%0A%20%20/**%0A%20%20%20*%20UTF-8%20strings%0A%20%20%20*%20@namespace%0A%20%20%20*/%0A%20%20sjcl.codec.utf8String%20=%20%7B%0A%20%20%20%20/**%20Convert%20from%20a%20bitArray%20to%20a%20UTF-8%20string.%20*/%0A%20%20%20%20fromBits:%20function%20(arr)%20%7B%0A%20%20%20%20%20%20var%20out%20=%20%22%22,%20bl%20=%20sjcl.bitArray.bitLength(arr),%20i,%20tmp;%0A%20%20%20%20%20%20for%20(i=0;%20i%3Cbl/8;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20if%20((i&3)%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20tmp%20=%20arr%5Bi/4%5D;%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20out%20+=%20String.fromCharCode(tmp%20%3E%3E%3E%208%20%3E%3E%3E%208%20%3E%3E%3E%208);%0A%20%20%20%20%20%20%20%20tmp%20%3C%3C=%208;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20decodeURIComponent(escape(out));%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%20Convert%20from%20a%20UTF-8%20string%20to%20a%20bitArray.%20*/%0A%20%20%20%20toBits:%20function%20(str)%20%7B%0A%20%20%20%20%20%20str%20=%20unescape(encodeURIComponent(str));%0A%20%20%20%20%20%20var%20out%20=%20%5B%5D,%20i,%20tmp=0;%0A%20%20%20%20%20%20for%20(i=0;%20i%3Cstr.length;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20tmp%20=%20tmp%20%3C%3C%208%20%7C%20str.charCodeAt(i);%0A%20%20%20%20%20%20%20%20if%20((i&3)%20===%203)%20%7B%0A%20%20%20%20%20%20%20%20%20%20out.push(tmp);%0A%20%20%20%20%20%20%20%20%20%20tmp%20=%200;%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(i&3)%20%7B%0A%20%20%20%20%20%20%20%20out.push(sjcl.bitArray.partial(8*(i&3),%20tmp));%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20out;%0A%20%20%20%20%7D%0A%20%20%7D;%0A%20%20/**%20@fileOverview%20Bit%20array%20codec%20implementations.%0A%20%20%20*%0A%20%20%20*%20@author%20Emily%20Stark%0A%20%20%20*%20@author%20Mike%20Hamburg%0A%20%20%20*%20@author%20Dan%20Boneh%0A%20%20%20*/%0A%0A%20%20/**%0A%20%20%20*%20Hexadecimal%0A%20%20%20*%20@namespace%0A%20%20%20*/%0A%20%20sjcl.codec.hex%20=%20%7B%0A%20%20%20%20/**%20Convert%20from%20a%20bitArray%20to%20a%20hex%20string.%20*/%0A%20%20%20%20fromBits:%20function%20(arr)%20%7B%0A%20%20%20%20%20%20var%20out%20=%20%22%22,%20i;%0A%20%20%20%20%20%20for%20(i=0;%20i%3Carr.length;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20out%20+=%20((arr%5Bi%5D%7C0)+0xF00000000000).toString(16).substr(4);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20out.substr(0,%20sjcl.bitArray.bitLength(arr)/4);//.replace(/(.%7B8%7D)/g,%20%22$1%20%22);%0A%20%20%20%20%7D,%0A%20%20%20%20/**%20Convert%20from%20a%20hex%20string%20to%20a%20bitArray.%20*/%0A%20%20%20%20toBits:%20function%20(str)%20%7B%0A%20%20%20%20%20%20var%20i,%20out=%5B%5D,%20len;%0A%20%20%20%20%20%20str%20=%20str.replace(/%5Cs%7C0x/g,%20%22%22);%0A%20%20%20%20%20%20len%20=%20str.length;%0A%20%20%20%20%20%20str%20=%20str%20+%20%2200000000%22;%0A%20%20%20%20%20%20for%20(i=0;%20i%3Cstr.length;%20i+=8)%20%7B%0A%20%20%20%20%20%20%20%20out.push(parseInt(str.substr(i,8),16)%5E0);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20sjcl.bitArray.clamp(out,%20len*4);%0A%20%20%20%20%7D%0A%20%20%7D;%0A%0A%20%20/**%20@fileOverview%20Javascript%20SHA-256%20implementation.%0A%20%20%20*%0A%20%20%20*%20An%20older%20version%20of%20this%20implementation%20is%20available%20in%20the%20public%0A%20%20%20*%20domain,%20but%20this%20one%20is%20(c)%20Emily%20Stark,%20Mike%20Hamburg,%20Dan%20Boneh,%0A%20%20%20*%20Stanford%20University%202008-2010%20and%20BSD-licensed%20for%20liability%0A%20%20%20*%20reasons.%0A%20%20%20*%0A%20%20%20*%20Special%20thanks%20to%20Aldo%20Cortesi%20for%20pointing%20out%20several%20bugs%20in%0A%20%20%20*%20this%20code.%0A%20%20%20*%0A%20%20%20*%20@author%20Emily%20Stark%0A%20%20%20*%20@author%20Mike%20Hamburg%0A%20%20%20*%20@author%20Dan%20Boneh%0A%20%20%20*/%0A%0A%20%20/**%0A%20%20%20*%20Context%20for%20a%20SHA-256%20operation%20in%20progress.%0A%20%20%20*%20@constructor%0A%20%20%20*/%0A%20%20sjcl.hash.sha256%20=%20function%20(hash)%20%7B%0A%20%20%20%20if%20(!this._key%5B0%5D)%20%7B%20this._precompute();%20%7D%0A%20%20%20%20if%20(hash)%20%7B%0A%20%20%20%20%20%20this._h%20=%20hash._h.slice(0);%0A%20%20%20%20%20%20this._buffer%20=%20hash._buffer.slice(0);%0A%20%20%20%20%20%20this._length%20=%20hash._length;%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20this.reset();%0A%20%20%20%20%7D%0A%20%20%7D;%0A%0A%20%20/**%0A%20%20%20*%20Hash%20a%20string%20or%20an%20array%20of%20words.%0A%20%20%20*%20@static%0A%20%20%20*%20@param%20%7BbitArray%7CString%7D%20data%20the%20data%20to%20hash.%0A%20%20%20*%20@return%20%7BbitArray%7D%20The%20hash%20value,%20an%20array%20of%2016%20big-endian%20words.%0A%20%20%20*/%0A%20%20sjcl.hash.sha256.hash%20=%20function%20(data)%20%7B%0A%20%20%20%20return%20(new%20sjcl.hash.sha256()).update(data).finalize();%0A%20%20%7D;%0A%0A%20%20sjcl.hash.sha256.prototype%20=%20%7B%0A%20%20%20%20/**%0A%20%20%20%20%20*%20The%20hash's%20block%20size,%20in%20bits.%0A%20%20%20%20%20*%20@constant%0A%20%20%20%20%20*/%0A%20%20%20%20blockSize:%20512,%0A%20%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Reset%20the%20hash%20state.%0A%20%20%20%20%20*%20@return%20this%0A%20%20%20%20%20*/%0A%20%20%20%20reset:function%20()%20%7B%0A%20%20%20%20%20%20this._h%20=%20this._init.slice(0);%0A%20%20%20%20%20%20this._buffer%20=%20%5B%5D;%0A%20%20%20%20%20%20this._length%20=%200;%0A%20%20%20%20%20%20return%20this;%0A%20%20%20%20%7D,%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Input%20several%20words%20to%20the%20hash.%0A%20%20%20%20%20*%20@param%20%7BbitArray%7CString%7D%20data%20the%20data%20to%20hash.%0A%20%20%20%20%20*%20@return%20this%0A%20%20%20%20%20*/%0A%20%20%20%20update:%20function%20(data)%20%7B%0A%20%20%20%20%20%20if%20(typeof%20data%20===%20%22string%22)%20%7B%0A%20%20%20%20%20%20%20%20data%20=%20sjcl.codec.utf8String.toBits(data);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20var%20i,%20b%20=%20this._buffer%20=%20sjcl.bitArray.concat(this._buffer,%20data),%0A%20%20%20%20%20%20%20%20%20%20ol%20=%20this._length,%0A%20%20%20%20%20%20%20%20%20%20nl%20=%20this._length%20=%20ol%20+%20sjcl.bitArray.bitLength(data);%0A%20%20%20%20%20%20if%20(nl%20%3E%209007199254740991)%7B%0A%20%20%20%20%20%20%20%20throw%20new%20sjcl.exception.invalid(%22Cannot%20hash%20more%20than%202%5E53%20-%201%20bits%22);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20(typeof%20Uint32Array%20!==%20'undefined')%20%7B%0A%20%20%09var%20c%20=%20new%20Uint32Array(b);%0A%20%20%20%20%20%20%09var%20j%20=%200;%0A%20%20%20%20%20%20%09for%20(i%20=%20512+ol%20-%20((512+ol)%20&%20511);%20i%20%3C=%20nl;%20i+=%20512)%20%7B%0A%20%20%20%20%20%20%20%20%09%20%20%20%20this._block(c.subarray(16%20*%20j,%2016%20*%20(j+1)));%0A%20%20%20%20%20%20%20%20%09%20%20%20%20j%20+=%201;%0A%20%20%20%20%20%20%09%7D%0A%20%20%20%20%20%20%09b.splice(0,%2016%20*%20j);%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%09for%20(i%20=%20512+ol%20-%20((512+ol)%20&%20511);%20i%20%3C=%20nl;%20i+=%20512)%20%7B%0A%20%20%20%20%20%20%20%20%09%20%20%20%20this._block(b.splice(0,16));%0A%20%20%20%20%20%20%20%20%09%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20this;%0A%20%20%20%20%7D,%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Complete%20hashing%20and%20output%20the%20hash%20value.%0A%20%20%20%20%20*%20@return%20%7BbitArray%7D%20The%20hash%20value,%20an%20array%20of%208%20big-endian%20words.%0A%20%20%20%20%20*/%0A%20%20%20%20finalize:function%20()%20%7B%0A%20%20%20%20%20%20var%20i,%20b%20=%20this._buffer,%20h%20=%20this._h;%0A%0A%20%20%20%20%20%20//%20Round%20out%20and%20push%20the%20buffer%0A%20%20%20%20%20%20b%20=%20sjcl.bitArray.concat(b,%20%5Bsjcl.bitArray.partial(1,1)%5D);%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20//%20Round%20out%20the%20buffer%20to%20a%20multiple%20of%2016%20words,%20less%20the%202%20length%20words.%0A%20%20%20%20%20%20for%20(i%20=%20b.length%20+%202;%20i%20&%2015;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20b.push(0);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20//%20append%20the%20length%0A%20%20%20%20%20%20b.push(Math.floor(this._length%20/%200x100000000));%0A%20%20%20%20%20%20b.push(this._length%20%7C%200);%0A%0A%20%20%20%20%20%20while%20(b.length)%20%7B%0A%20%20%20%20%20%20%20%20this._block(b.splice(0,16));%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20this.reset();%0A%20%20%20%20%20%20return%20h;%0A%20%20%20%20%7D,%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20The%20SHA-256%20initialization%20vector,%20to%20be%20precomputed.%0A%20%20%20%20%20*%20@private%0A%20%20%20%20%20*/%0A%20%20%20%20_init:%5B%5D,%0A%20%20%20%20/*%0A%20%20%20%20_init:%5B0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19%5D,%0A%20%20%20%20*/%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20The%20SHA-256%20hash%20key,%20to%20be%20precomputed.%0A%20%20%20%20%20*%20@private%0A%20%20%20%20%20*/%0A%20%20%20%20_key:%5B%5D,%0A%20%20%20%20/*%0A%20%20%20%20_key:%0A%20%20%20%20%20%20%5B0x428a2f98,%200x71374491,%200xb5c0fbcf,%200xe9b5dba5,%200x3956c25b,%200x59f111f1,%200x923f82a4,%200xab1c5ed5,%0A%20%20%20%20%20%20%200xd807aa98,%200x12835b01,%200x243185be,%200x550c7dc3,%200x72be5d74,%200x80deb1fe,%200x9bdc06a7,%200xc19bf174,%0A%20%20%20%20%20%20%200xe49b69c1,%200xefbe4786,%200x0fc19dc6,%200x240ca1cc,%200x2de92c6f,%200x4a7484aa,%200x5cb0a9dc,%200x76f988da,%0A%20%20%20%20%20%20%200x983e5152,%200xa831c66d,%200xb00327c8,%200xbf597fc7,%200xc6e00bf3,%200xd5a79147,%200x06ca6351,%200x14292967,%0A%20%20%20%20%20%20%200x27b70a85,%200x2e1b2138,%200x4d2c6dfc,%200x53380d13,%200x650a7354,%200x766a0abb,%200x81c2c92e,%200x92722c85,%0A%20%20%20%20%20%20%200xa2bfe8a1,%200xa81a664b,%200xc24b8b70,%200xc76c51a3,%200xd192e819,%200xd6990624,%200xf40e3585,%200x106aa070,%0A%20%20%20%20%20%20%200x19a4c116,%200x1e376c08,%200x2748774c,%200x34b0bcb5,%200x391c0cb3,%200x4ed8aa4a,%200x5b9cca4f,%200x682e6ff3,%0A%20%20%20%20%20%20%200x748f82ee,%200x78a5636f,%200x84c87814,%200x8cc70208,%200x90befffa,%200xa4506ceb,%200xbef9a3f7,%200xc67178f2%5D,%0A%20%20%20%20*/%0A%0A%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Function%20to%20precompute%20_init%20and%20_key.%0A%20%20%20%20%20*%20@private%0A%20%20%20%20%20*/%0A%20%20%20%20_precompute:%20function%20()%20%7B%0A%20%20%20%20%20%20var%20i%20=%200,%20prime%20=%202,%20factor,%20isPrime;%0A%0A%20%20%20%20%20%20function%20frac(x)%20%7B%20return%20(x-Math.floor(x))%20*%200x100000000%20%7C%200;%20%7D%0A%0A%20%20%20%20%20%20for%20(;%20i%3C64;%20prime++)%20%7B%0A%20%20%20%20%20%20%20%20isPrime%20=%20true;%0A%20%20%20%20%20%20%20%20for%20(factor=2;%20factor*factor%20%3C=%20prime;%20factor++)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(prime%20%25%20factor%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20isPrime%20=%20false;%0A%20%20%20%20%20%20%20%20%20%20%20%20break;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20(isPrime)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(i%3C8)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this._init%5Bi%5D%20=%20frac(Math.pow(prime,%201/2));%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20this._key%5Bi%5D%20=%20frac(Math.pow(prime,%201/3));%0A%20%20%20%20%20%20%20%20%20%20i++;%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D,%0A%20%20%20%20%0A%20%20%20%20/**%0A%20%20%20%20%20*%20Perform%20one%20cycle%20of%20SHA-256.%0A%20%20%20%20%20*%20@param%20%7BUint32Array%7CbitArray%7D%20w%20one%20block%20of%20words.%0A%20%20%20%20%20*%20@private%0A%20%20%20%20%20*/%0A%20%20%20%20_block:function%20(w)%20%7B%20%20%0A%20%20%20%20%20%20var%20i,%20tmp,%20a,%20b,%0A%20%20%20%20%20%20%20%20h%20=%20this._h,%0A%20%20%20%20%20%20%20%20k%20=%20this._key,%0A%20%20%20%20%20%20%20%20h0%20=%20h%5B0%5D,%20h1%20=%20h%5B1%5D,%20h2%20=%20h%5B2%5D,%20h3%20=%20h%5B3%5D,%0A%20%20%20%20%20%20%20%20h4%20=%20h%5B4%5D,%20h5%20=%20h%5B5%5D,%20h6%20=%20h%5B6%5D,%20h7%20=%20h%5B7%5D;%0A%0A%20%20%20%20%20%20/*%20Rationale%20for%20placement%20of%20%7C0%20:%0A%20%20%20%20%20%20%20*%20If%20a%20value%20can%20overflow%20is%20original%2032%20bits%20by%20a%20factor%20of%20more%20than%20a%20few%0A%20%20%20%20%20%20%20*%20million%20(2%5E23%20ish),%20there%20is%20a%20possibility%20that%20it%20might%20overflow%20the%0A%20%20%20%20%20%20%20*%2053-bit%20mantissa%20and%20lose%20precision.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20To%20avoid%20this,%20we%20clamp%20back%20to%2032%20bits%20by%20%7C'ing%20with%200%20on%20any%20value%20that%0A%20%20%20%20%20%20%20*%20propagates%20around%20the%20loop,%20and%20on%20the%20hash%20state%20h%5B%5D.%20%20I%20don't%20believe%0A%20%20%20%20%20%20%20*%20that%20the%20clamps%20on%20h4%20and%20on%20h0%20are%20strictly%20necessary,%20but%20it's%20close%0A%20%20%20%20%20%20%20*%20(for%20h4%20anyway),%20and%20better%20safe%20than%20sorry.%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20The%20clamps%20on%20h%5B%5D%20are%20necessary%20for%20the%20output%20to%20be%20correct%20even%20in%20the%0A%20%20%20%20%20%20%20*%20common%20case%20and%20for%20short%20inputs.%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20for%20(i=0;%20i%3C64;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20//%20load%20up%20the%20input%20word%20for%20this%20round%0A%20%20%20%20%20%20%20%20if%20(i%3C16)%20%7B%0A%20%20%20%20%20%20%20%20%20%20tmp%20=%20w%5Bi%5D;%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20a%20%20%20=%20w%5B(i+1%20)%20&%2015%5D;%0A%20%20%20%20%20%20%20%20%20%20b%20%20%20=%20w%5B(i+14)%20&%2015%5D;%0A%20%20%20%20%20%20%20%20%20%20tmp%20=%20w%5Bi&15%5D%20=%20((a%3E%3E%3E7%20%20%5E%20a%3E%3E%3E18%20%5E%20a%3E%3E%3E3%20%20%5E%20a%3C%3C25%20%5E%20a%3C%3C14)%20+%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(b%3E%3E%3E17%20%5E%20b%3E%3E%3E19%20%5E%20b%3E%3E%3E10%20%5E%20b%3C%3C15%20%5E%20b%3C%3C13)%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20w%5Bi&15%5D%20+%20w%5B(i+9)%20&%2015%5D)%20%7C%200;%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20tmp%20=%20(tmp%20+%20h7%20+%20(h4%3E%3E%3E6%20%5E%20h4%3E%3E%3E11%20%5E%20h4%3E%3E%3E25%20%5E%20h4%3C%3C26%20%5E%20h4%3C%3C21%20%5E%20h4%3C%3C7)%20+%20%20(h6%20%5E%20h4&(h5%5Eh6))%20+%20k%5Bi%5D);%20//%20%7C%200;%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20//%20shift%20register%0A%20%20%20%20%20%20%20%20h7%20=%20h6;%20h6%20=%20h5;%20h5%20=%20h4;%0A%20%20%20%20%20%20%20%20h4%20=%20h3%20+%20tmp%20%7C%200;%0A%20%20%20%20%20%20%20%20h3%20=%20h2;%20h2%20=%20h1;%20h1%20=%20h0;%0A%0A%20%20%20%20%20%20%20%20h0%20=%20(tmp%20+%20%20((h1&h2)%20%5E%20(h3&(h1%5Eh2)))%20+%20(h1%3E%3E%3E2%20%5E%20h1%3E%3E%3E13%20%5E%20h1%3E%3E%3E22%20%5E%20h1%3C%3C30%20%5E%20h1%3C%3C19%20%5E%20h1%3C%3C10))%20%7C%200;%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20h%5B0%5D%20=%20h%5B0%5D+h0%20%7C%200;%0A%20%20%20%20%20%20h%5B1%5D%20=%20h%5B1%5D+h1%20%7C%200;%0A%20%20%20%20%20%20h%5B2%5D%20=%20h%5B2%5D+h2%20%7C%200;%0A%20%20%20%20%20%20h%5B3%5D%20=%20h%5B3%5D+h3%20%7C%200;%0A%20%20%20%20%20%20h%5B4%5D%20=%20h%5B4%5D+h4%20%7C%200;%0A%20%20%20%20%20%20h%5B5%5D%20=%20h%5B5%5D+h5%20%7C%200;%0A%20%20%20%20%20%20h%5B6%5D%20=%20h%5B6%5D+h6%20%7C%200;%0A%20%20%20%20%20%20h%5B7%5D%20=%20h%5B7%5D+h7%20%7C%200;%0A%20%20%20%20%7D%0A%20%20%7D;%0A%0A%0A%20%20/**%20@fileOverview%20HMAC%20implementation.%0A%20%20%20*%0A%20%20%20*%20@author%20Emily%20Stark%0A%20%20%20*%20@author%20Mike%20Hamburg%0A%20%20%20*%20@author%20Dan%20Boneh%0A%20%20%20*/%0A%0A%20%20/**%20HMAC%20with%20the%20specified%20hash%20function.%0A%20%20%20*%20@constructor%0A%20%20%20*%20@param%20%7BbitArray%7D%20key%20the%20key%20for%20HMAC.%0A%20%20%20*%20@param%20%7BObject%7D%20%5BHash=sjcl.hash.sha256%5D%20The%20hash%20function%20to%20use.%0A%20%20%20*/%0A%20%20sjcl.misc.hmac%20=%20function%20(key,%20Hash)%20%7B%0A%20%20%20%20this._hash%20=%20Hash%20=%20Hash%20%7C%7C%20sjcl.hash.sha256;%0A%20%20%20%20var%20exKey%20=%20%5B%5B%5D,%5B%5D%5D,%20i,%0A%20%20%20%20%20%20%20%20bs%20=%20Hash.prototype.blockSize%20/%2032;%0A%20%20%20%20this._baseHash%20=%20%5Bnew%20Hash(),%20new%20Hash()%5D;%0A%0A%20%20%20%20if%20(key.length%20%3E%20bs)%20%7B%0A%20%20%20%20%20%20key%20=%20Hash.hash(key);%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20for%20(i=0;%20i%3Cbs;%20i++)%20%7B%0A%20%20%20%20%20%20exKey%5B0%5D%5Bi%5D%20=%20key%5Bi%5D%5E0x36363636;%0A%20%20%20%20%20%20exKey%5B1%5D%5Bi%5D%20=%20key%5Bi%5D%5E0x5C5C5C5C;%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20this._baseHash%5B0%5D.update(exKey%5B0%5D);%0A%20%20%20%20this._baseHash%5B1%5D.update(exKey%5B1%5D);%0A%20%20%20%20this._resultHash%20=%20new%20Hash(this._baseHash%5B0%5D);%0A%20%20%7D;%0A%0A%20%20/**%20HMAC%20with%20the%20specified%20hash%20function.%20%20Also%20called%20encrypt%20since%20it's%20a%20prf.%0A%20%20%20*%20@param%20%7BbitArray%7CString%7D%20data%20The%20data%20to%20mac.%0A%20%20%20*/%0A%20%20sjcl.misc.hmac.prototype.encrypt%20=%20sjcl.misc.hmac.prototype.mac%20=%20function%20(data)%20%7B%0A%20%20%20%20if%20(!this._updated)%20%7B%0A%20%20%20%20%20%20this.update(data);%0A%20%20%20%20%20%20return%20this.digest(data);%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20throw%20new%20sjcl.exception.invalid(%22encrypt%20on%20already%20updated%20hmac%20called!%22);%0A%20%20%20%20%7D%0A%20%20%7D;%0A%0A%20%20sjcl.misc.hmac.prototype.reset%20=%20function%20()%20%7B%0A%20%20%20%20this._resultHash%20=%20new%20this._hash(this._baseHash%5B0%5D);%0A%20%20%20%20this._updated%20=%20false;%0A%20%20%7D;%0A%0A%20%20sjcl.misc.hmac.prototype.update%20=%20function%20(data)%20%7B%0A%20%20%20%20this._updated%20=%20true;%0A%20%20%20%20this._resultHash.update(data);%0A%20%20%7D;%0A%0A%20%20sjcl.misc.hmac.prototype.digest%20=%20function%20()%20%7B%0A%20%20%20%20var%20w%20=%20this._resultHash.finalize(),%20result%20=%20new%20(this._hash)(this._baseHash%5B1%5D).update(w).finalize();%0A%0A%20%20%20%20this.reset();%0A%0A%20%20%20%20return%20result;%0A%20%20%7D;%0A%0A%20%20%20%20%20%20return%20sjcl;%0A%20%20%20%20%7D)();%0A%0A%20%20/*%20global%20cloneInto,%20exportFunction,%20false%20*/%0A%0A%20%20//%20Only%20use%20globalThis%20for%20testing%20this%20breaks%20window.wrappedJSObject%20code%20in%20Firefox%0A%20%20//%20eslint-disable-next-line%20no-global-assign%0A%20%20let%20globalObj%20=%20typeof%20window%20===%20'undefined'%20?%20globalThis%20:%20window;%0A%20%20let%20Error$1%20=%20globalObj.Error;%0A%0A%20%20function%20getDataKeySync%20(sessionKey,%20domainKey,%20inputData)%20%7B%0A%20%20%20%20%20%20//%20eslint-disable-next-line%20new-cap%0A%20%20%20%20%20%20const%20hmac%20=%20new%20sjcl.misc.hmac(sjcl.codec.utf8String.toBits(sessionKey%20+%20domainKey),%20sjcl.hash.sha256);%0A%20%20%20%20%20%20return%20sjcl.codec.hex.fromBits(hmac.encrypt(inputData))%0A%20%20%7D%0A%0A%20%20//%20linear%20feedback%20shift%20register%20to%20find%20a%20random%20approximation%0A%20%20function%20nextRandom%20(v)%20%7B%0A%20%20%20%20%20%20return%20Math.abs((v%20%3E%3E%201)%20%7C%20(((v%20%3C%3C%2062)%20%5E%20(v%20%3C%3C%2061))%20&%20(~(~0%20%3C%3C%2063)%20%3C%3C%2062)))%0A%20%20%7D%0A%0A%20%20const%20exemptionLists%20=%20%7B%7D;%0A%20%20function%20shouldExemptUrl%20(type,%20url)%20%7B%0A%20%20%20%20%20%20for%20(const%20regex%20of%20exemptionLists%5Btype%5D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(regex.test(url))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20true%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20false%0A%20%20%7D%0A%0A%20%20let%20debug%20=%20false;%0A%0A%20%20function%20initStringExemptionLists%20(args)%20%7B%0A%20%20%20%20%20%20const%20%7B%20stringExemptionLists%20%7D%20=%20args;%0A%20%20%20%20%20%20debug%20=%20args.debug;%0A%20%20%20%20%20%20for%20(const%20type%20in%20stringExemptionLists)%20%7B%0A%20%20%20%20%20%20%20%20%20%20exemptionLists%5Btype%5D%20=%20%5B%5D;%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20stringExemption%20of%20stringExemptionLists%5Btype%5D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20exemptionLists%5Btype%5D.push(new%20RegExp(stringExemption));%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Best%20guess%20effort%20if%20the%20document%20is%20being%20framed%0A%20%20%20*%20@returns%20%7Bboolean%7D%20if%20we%20infer%20the%20document%20is%20framed%0A%20%20%20*/%0A%20%20function%20isBeingFramed%20()%20%7B%0A%20%20%20%20%20%20if%20('ancestorOrigins'%20in%20globalThis.location)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20globalThis.location.ancestorOrigins.length%20%3E%200%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20globalThis.top%20!==%20globalThis.window%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Best%20guess%20effort%20if%20the%20document%20is%20third%20party%0A%20%20%20*%20@returns%20%7Bboolean%7D%20if%20we%20infer%20the%20document%20is%20third%20party%0A%20%20%20*/%0A%20%20function%20isThirdParty%20()%20%7B%0A%20%20%20%20%20%20if%20(!isBeingFramed())%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20!matchHostname(globalThis.location.hostname,%20getTabHostname())%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Best%20guess%20effort%20of%20the%20tabs%20hostname;%20where%20possible%20always%20prefer%20the%20args.site.domain%0A%20%20%20*%20@returns%20%7Bstring%7Cnull%7D%20inferred%20tab%20hostname%0A%20%20%20*/%0A%20%20function%20getTabHostname%20()%20%7B%0A%20%20%20%20%20%20let%20framingOrigin%20=%20null;%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20framingOrigin%20=%20globalThis.top.location.href;%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20framingOrigin%20=%20globalThis.document.referrer;%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20Not%20supported%20in%20Firefox%0A%20%20%20%20%20%20if%20('ancestorOrigins'%20in%20globalThis.location%20&&%20globalThis.location.ancestorOrigins.length)%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20ancestorOrigins%20is%20reverse%20order,%20with%20the%20last%20item%20being%20the%20top%20frame%0A%20%20%20%20%20%20%20%20%20%20framingOrigin%20=%20globalThis.location.ancestorOrigins.item(globalThis.location.ancestorOrigins.length%20-%201);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20framingOrigin%20=%20new%20URL(framingOrigin).hostname;%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20framingOrigin%20=%20null;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20framingOrigin%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Returns%20true%20if%20hostname%20is%20a%20subset%20of%20exceptionDomain%20or%20an%20exact%20match.%0A%20%20%20*%20@param%20%7Bstring%7D%20hostname%0A%20%20%20*%20@param%20%7Bstring%7D%20exceptionDomain%0A%20%20%20*%20@returns%20%7Bboolean%7D%0A%20%20%20*/%0A%20%20function%20matchHostname%20(hostname,%20exceptionDomain)%20%7B%0A%20%20%20%20%20%20return%20hostname%20===%20exceptionDomain%20%7C%7C%20hostname.endsWith(%60.$%7BexceptionDomain%7D%60)%0A%20%20%7D%0A%0A%20%20const%20lineTest%20=%20/(%5C()?(https?:%5B%5E)%5D+):%5B0-9%5D+:%5B0-9%5D+(%5C))?/;%0A%20%20function%20getStackTraceUrls%20(stack)%20%7B%0A%20%20%20%20%20%20const%20urls%20=%20new%20Set();%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20errorLines%20=%20stack.split('%5Cn');%0A%20%20%20%20%20%20%20%20%20%20//%20Should%20cater%20for%20Chrome%20and%20Firefox%20stacks,%20we%20only%20care%20about%20https?%20resources.%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20line%20of%20errorLines)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20res%20=%20line.match(lineTest);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(res)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20urls.add(new%20URL(res%5B2%5D,%20location.href));%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20Fall%20through%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20urls%0A%20%20%7D%0A%0A%20%20function%20getStackTraceOrigins%20(stack)%20%7B%0A%20%20%20%20%20%20const%20urls%20=%20getStackTraceUrls(stack);%0A%20%20%20%20%20%20const%20origins%20=%20new%20Set();%0A%20%20%20%20%20%20for%20(const%20url%20of%20urls)%20%7B%0A%20%20%20%20%20%20%20%20%20%20origins.add(url.hostname);%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20origins%0A%20%20%7D%0A%0A%20%20//%20Checks%20the%20stack%20trace%20if%20there%20are%20known%20libraries%20that%20are%20broken.%0A%20%20function%20shouldExemptMethod%20(type)%20%7B%0A%20%20%20%20%20%20//%20Short%20circuit%20stack%20tracing%20if%20we%20don't%20have%20checks%0A%20%20%20%20%20%20if%20(!(type%20in%20exemptionLists)%20%7C%7C%20exemptionLists%5Btype%5D.length%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20const%20stack%20=%20getStack();%0A%20%20%20%20%20%20const%20errorFiles%20=%20getStackTraceUrls(stack);%0A%20%20%20%20%20%20for%20(const%20path%20of%20errorFiles)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(shouldExemptUrl(type,%20path.href))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20true%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20false%0A%20%20%7D%0A%0A%20%20//%20Iterate%20through%20the%20key,%20passing%20an%20item%20index%20and%20a%20byte%20to%20be%20modified%0A%20%20function%20iterateDataKey%20(key,%20callback)%20%7B%0A%20%20%20%20%20%20let%20item%20=%20key.charCodeAt(0);%0A%20%20%20%20%20%20for%20(const%20i%20in%20key)%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20byte%20=%20key.charCodeAt(i);%0A%20%20%20%20%20%20%20%20%20%20for%20(let%20j%20=%208;%20j%20%3E=%200;%20j--)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20res%20=%20callback(item,%20byte);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Exit%20early%20if%20callback%20returns%20null%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(res%20===%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20find%20next%20item%20to%20perturb%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20item%20=%20nextRandom(item);%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Right%20shift%20as%20we%20use%20the%20least%20significant%20bit%20of%20it%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20byte%20=%20byte%20%3E%3E%201;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20isFeatureBroken%20(args,%20feature)%20%7B%0A%20%20%20%20%20%20return%20isWindowsSpecificFeature(feature)%0A%20%20%20%20%20%20%20%20%20%20?%20!args.site.enabledFeatures.includes(feature)%0A%20%20%20%20%20%20%20%20%20%20:%20args.site.isBroken%20%7C%7C%20args.site.allowlisted%20%7C%7C%20!args.site.enabledFeatures.includes(feature)%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20For%20each%20property%20defined%20on%20the%20object,%20update%20it%20with%20the%20target%20value.%0A%20%20%20*/%0A%20%20function%20overrideProperty%20(name,%20prop)%20%7B%0A%20%20%20%20%20%20//%20Don't%20update%20if%20existing%20value%20is%20undefined%20or%20null%0A%20%20%20%20%20%20if%20(!(prop.origValue%20===%20undefined))%20%7B%0A%20%20%20%20%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20%20%20%20%20*%20When%20re-defining%20properties,%20we%20bind%20the%20overwritten%20functions%20to%20null.%20This%20prevents%0A%20%20%20%20%20%20%20%20%20%20%20*%20sites%20from%20using%20toString%20to%20see%20if%20the%20function%20has%20been%20overwritten%0A%20%20%20%20%20%20%20%20%20%20%20*%20without%20this%20bind%20call,%20a%20site%20could%20run%20something%20like%0A%20%20%20%20%20%20%20%20%20%20%20*%20%60Object.getOwnPropertyDescriptor(Screen.prototype,%20%22availTop%22).get.toString()%60%20and%20see%0A%20%20%20%20%20%20%20%20%20%20%20*%20the%20contents%20of%20the%20function.%20Appending%20.bind(null)%20to%20the%20function%20definition%20will%0A%20%20%20%20%20%20%20%20%20%20%20*%20have%20the%20same%20toString%20call%20return%20the%20default%20%5Bnative%20code%5D%0A%20%20%20%20%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defineProperty(prop.object,%20name,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20eslint-disable-next-line%20no-extra-bind%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20get:%20(()%20=%3E%20prop.targetValue).bind(null)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20prop.origValue%0A%20%20%7D%0A%0A%20%20function%20defineProperty%20(object,%20propertyName,%20descriptor)%20%7B%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20Object.defineProperty(object,%20propertyName,%20descriptor);%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20camelcase%20(dashCaseText)%20%7B%0A%20%20%20%20%20%20return%20dashCaseText.replace(/-(.)/g,%20(match,%20letter)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20letter.toUpperCase()%0A%20%20%20%20%20%20%7D)%0A%20%20%7D%0A%0A%20%20//%20We%20use%20this%20method%20to%20detect%20M1%20macs%20and%20set%20appropriate%20API%20values%20to%20prevent%20sites%20from%20detecting%20fingerprinting%20protections%0A%20%20function%20isAppleSilicon%20()%20%7B%0A%20%20%20%20%20%20const%20canvas%20=%20document.createElement('canvas');%0A%20%20%20%20%20%20const%20gl%20=%20canvas.getContext('webgl');%0A%0A%20%20%20%20%20%20//%20Best%20guess%20if%20the%20device%20is%20an%20Apple%20Silicon%0A%20%20%20%20%20%20//%20https://stackoverflow.com/a/65412357%0A%20%20%20%20%20%20return%20gl.getSupportedExtensions().indexOf('WEBGL_compressed_texture_etc')%20!==%20-1%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Take%20configSeting%20which%20should%20be%20an%20array%20of%20possible%20values.%0A%20%20%20*%20If%20a%20value%20contains%20a%20criteria%20that%20is%20a%20match%20for%20this%20environment%20then%20return%20that%20value.%0A%20%20%20*%20Otherwise%20return%20the%20first%20value%20that%20doesn't%20have%20a%20criteria.%0A%20%20%20*%0A%20%20%20*%20@param%20%7B*%5B%5D%7D%20configSetting%20-%20Config%20setting%20which%20should%20contain%20a%20list%20of%20possible%20values%0A%20%20%20*%20@returns%20%7B*%7Cundefined%7D%20-%20The%20value%20from%20the%20list%20that%20best%20matches%20the%20criteria%20in%20the%20config%0A%20%20%20*/%0A%20%20function%20processAttrByCriteria%20(configSetting)%20%7B%0A%20%20%20%20%20%20let%20bestOption;%0A%20%20%20%20%20%20for%20(const%20item%20of%20configSetting)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(item.criteria)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(item.criteria.arch%20===%20'AppleSilicon'%20&&%20isAppleSilicon())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bestOption%20=%20item;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20bestOption%20=%20item;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20return%20bestOption%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Get%20the%20value%20of%20a%20config%20setting.%0A%20%20%20*%20If%20the%20value%20is%20not%20set,%20return%20the%20default%20value.%0A%20%20%20*%20If%20the%20value%20is%20not%20an%20object,%20return%20the%20value.%0A%20%20%20*%20If%20the%20value%20is%20an%20object,%20check%20its%20type%20property.%0A%20%20%20*%0A%20%20%20*%20@param%20%7Bstring%7D%20featureName%0A%20%20%20*%20@param%20%7Bobject%7D%20args%0A%20%20%20*%20@param%20%7Bstring%7D%20prop%0A%20%20%20*%20@param%20%7Bany%7D%20defaultValue%20-%20The%20default%20value%20to%20use%20if%20the%20config%20setting%20is%20not%20set%0A%20%20%20*%20@returns%20The%20value%20of%20the%20config%20setting%20or%20the%20default%20value%0A%20%20%20*/%0A%20%20function%20getFeatureAttr%20(featureName,%20args,%20prop,%20defaultValue)%20%7B%0A%20%20%20%20%20%20let%20configSetting%20=%20getFeatureSetting(featureName,%20args,%20prop);%0A%0A%20%20%20%20%20%20if%20(configSetting%20===%20undefined)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20defaultValue%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20configSettingType%20=%20typeof%20configSetting;%0A%20%20%20%20%20%20switch%20(configSettingType)%20%7B%0A%20%20%20%20%20%20case%20'object':%0A%20%20%20%20%20%20%20%20%20%20if%20(Array.isArray(configSetting))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20configSetting%20=%20processAttrByCriteria(configSetting);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(configSetting%20===%20undefined)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20defaultValue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(!configSetting.type)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20defaultValue%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(configSetting.type%20===%20'undefined')%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20undefined%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20return%20configSetting.value%0A%20%20%20%20%20%20default:%0A%20%20%20%20%20%20%20%20%20%20return%20defaultValue%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20@param%20%7Bstring%7D%20featureName%0A%20%20%20*%20@param%20%7Bobject%7D%20args%0A%20%20%20*%20@param%20%7Bstring%7D%20prop%0A%20%20%20*%20@returns%20%7Bany%7D%0A%20%20%20*/%0A%20%20function%20getFeatureSetting%20(featureName,%20args,%20prop)%20%7B%0A%20%20%20%20%20%20const%20camelFeatureName%20=%20camelcase(featureName);%0A%20%20%20%20%20%20return%20args.featureSettings?.%5BcamelFeatureName%5D?.%5Bprop%5D%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20@param%20%7Bstring%7D%20featureName%0A%20%20%20*%20@param%20%7Bobject%7D%20args%0A%20%20%20*%20@param%20%7Bstring%7D%20prop%0A%20%20%20*%20@returns%20%7Bboolean%7D%0A%20%20%20*/%0A%20%20function%20getFeatureSettingEnabled%20(featureName,%20args,%20prop)%20%7B%0A%20%20%20%20%20%20const%20result%20=%20getFeatureSetting(featureName,%20args,%20prop);%0A%20%20%20%20%20%20return%20result%20===%20'enabled'%0A%20%20%7D%0A%0A%20%20function%20getStack%20()%20%7B%0A%20%20%20%20%20%20return%20new%20Error$1().stack%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20@template%20%7Bobject%7D%20P%0A%20%20%20*%20@typedef%20%7Bobject%7D%20ProxyObject%3CP%3E%0A%20%20%20*%20@property%20%7B(target?:%20object,%20thisArg?:%20P,%20args?:%20object)%20=%3E%20void%7D%20apply%0A%20%20%20*/%0A%0A%20%20/**%0A%20%20%20*%20@template%20%5BP=object%5D%0A%20%20%20*/%0A%20%20class%20DDGProxy%20%7B%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20@param%20%7Bstring%7D%20featureName%0A%20%20%20%20%20%20%20*%20@param%20%7BP%7D%20objectScope%0A%20%20%20%20%20%20%20*%20@param%20%7Bstring%7D%20property%0A%20%20%20%20%20%20%20*%20@param%20%7BProxyObject%3CP%3E%7D%20proxyObject%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20constructor%20(featureName,%20objectScope,%20property,%20proxyObject)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.objectScope%20=%20objectScope;%0A%20%20%20%20%20%20%20%20%20%20this.property%20=%20property;%0A%20%20%20%20%20%20%20%20%20%20this.featureName%20=%20featureName;%0A%20%20%20%20%20%20%20%20%20%20this.camelFeatureName%20=%20camelcase(this.featureName);%0A%20%20%20%20%20%20%20%20%20%20const%20outputHandler%20=%20(...args)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20isExempt%20=%20shouldExemptMethod(this.camelFeatureName);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(debug)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20postDebugMessage(this.camelFeatureName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20action:%20isExempt%20?%20'ignore'%20:%20'restrict',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind:%20this.property,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20documentUrl:%20document.location.href,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stack:%20getStack(),%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20args:%20JSON.stringify(args%5B2%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20The%20normal%20return%20value%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(isExempt)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(...args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20proxyObject.apply(...args)%0A%20%20%20%20%20%20%20%20%20%20%7D;%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._native%20=%20objectScope%5Bproperty%5D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20handler%20=%20%7B%7D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20handler.apply%20=%20outputHandler;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.internal%20=%20new%20globalObj.Proxy(objectScope%5Bproperty%5D,%20handler);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20Actually%20apply%20the%20proxy%20to%20the%20native%20property%0A%20%20%20%20%20%20overload%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.objectScope%5Bthis.property%5D%20=%20this.internal;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20postDebugMessage%20(feature,%20message)%20%7B%0A%20%20%20%20%20%20if%20(message.stack)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20scriptOrigins%20=%20%5B...getStackTraceOrigins(message.stack)%5D;%0A%20%20%20%20%20%20%20%20%20%20message.scriptOrigins%20=%20scriptOrigins;%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20globalObj.postMessage(%7B%0A%20%20%20%20%20%20%20%20%20%20action:%20feature,%0A%20%20%20%20%20%20%20%20%20%20message%0A%20%20%20%20%20%20%7D);%0A%20%20%7D%0A%0A%20%20let%20DDGReflect;%0A%20%20let%20DDGPromise;%0A%0A%20%20//%20Exports%20for%20usage%20where%20we%20have%20to%20cross%20the%20xray%20boundary:%20https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Sharing_objects_with_page_scripts%0A%20%20%7B%0A%20%20%20%20%20%20DDGPromise%20=%20globalObj.Promise;%0A%20%20%20%20%20%20DDGReflect%20=%20globalObj.Reflect;%0A%20%20%7D%0A%0A%20%20const%20windowsSpecificFeatures%20=%20%5B'windowsPermissionUsage'%5D;%0A%0A%20%20function%20isWindowsSpecificFeature%20(featureName)%20%7B%0A%20%20%20%20%20%20return%20windowsSpecificFeatures.includes(featureName)%0A%20%20%7D%0A%0A%20%20function%20__variableDynamicImportRuntime0__(path)%20%7B%0A%20%20%20%20%20switch%20(path)%20%7B%0A%20%20%20%20%20%20%20case%20'./features/cookie.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20cookie;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/fingerprinting-audio.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20fingerprintingAudio;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/fingerprinting-battery.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20fingerprintingBattery;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/fingerprinting-canvas.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20fingerprintingCanvas;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/fingerprinting-hardware.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20fingerprintingHardware;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/fingerprinting-screen-size.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20fingerprintingScreenSize;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/fingerprinting-temporary-storage.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20fingerprintingTemporaryStorage;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/google-rejected.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20googleRejected;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/gpc.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20gpc;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/navigator-interface.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20navigatorInterface;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/referrer.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20referrer;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/web-compat.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20webCompat;%20%7D);%0A%20%20%20%20%20%20%20case%20'./features/windows-permission-usage.js':%20return%20Promise.resolve().then(function%20()%20%7B%20return%20windowsPermissionUsage;%20%7D);%0A%20%20%20%20%20%20%20default:%20return%20Promise.reject(new%20Error(%22Unknown%20variable%20dynamic%20import:%20%22%20+%20path));%0A%20%20%20%20%20%7D%0A%20%20%20%7D%0A%0A%20%20function%20shouldRun%20()%20%7B%0A%20%20%20%20%20%20//%20don't%20inject%20into%20non-HTML%20documents%20(such%20as%20XML%20documents)%0A%20%20%20%20%20%20//%20but%20do%20inject%20into%20XHTML%20documents%0A%20%20%20%20%20%20if%20(document%20instanceof%20HTMLDocument%20===%20false%20&&%20(%0A%20%20%20%20%20%20%20%20%20%20document%20instanceof%20XMLDocument%20===%20false%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20document.createElement('div')%20instanceof%20HTMLDivElement%20===%20false%0A%20%20%20%20%20%20))%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20true%0A%20%20%7D%0A%0A%20%20let%20initArgs%20=%20null;%0A%20%20const%20updates%20=%20%5B%5D;%0A%20%20const%20features%20=%20%5B%5D;%0A%0A%20%20async%20function%20load$1%20()%20%7B%0A%20%20%20%20%20%20if%20(!shouldRun())%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20const%20featureNames%20=%20%5B%0A%20%20%20%20%20%20%20%20%20%20'windowsPermissionUsage',%0A%20%20%20%20%20%20%20%20%20%20'webCompat',%0A%20%20%20%20%20%20%20%20%20%20'fingerprintingAudio',%0A%20%20%20%20%20%20%20%20%20%20'fingerprintingBattery',%0A%20%20%20%20%20%20%20%20%20%20'fingerprintingCanvas',%0A%20%20%20%20%20%20%20%20%20%20'cookie',%0A%20%20%20%20%20%20%20%20%20%20'googleRejected',%0A%20%20%20%20%20%20%20%20%20%20'gpc',%0A%20%20%20%20%20%20%20%20%20%20'fingerprintingHardware',%0A%20%20%20%20%20%20%20%20%20%20'referrer',%0A%20%20%20%20%20%20%20%20%20%20'fingerprintingScreenSize',%0A%20%20%20%20%20%20%20%20%20%20'fingerprintingTemporaryStorage',%0A%20%20%20%20%20%20%20%20%20%20'navigatorInterface'%0A%20%20%20%20%20%20%5D;%0A%0A%20%20%20%20%20%20for%20(const%20featureName%20of%20featureNames)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20filename%20=%20featureName.replace(/(%5Ba-zA-Z%5D)(?=%5BA-Z0-9%5D)/g,%20'$1-').toLowerCase();%0A%20%20%20%20%20%20%20%20%20%20const%20feature%20=%20__variableDynamicImportRuntime0__(%60./features/$%7Bfilename%7D.js%60).then((%7B%20init,%20load,%20update%20%7D)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(load)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20load();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%20featureName,%20init,%20update%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20features.push(feature);%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20async%20function%20init$d%20(args)%20%7B%0A%20%20%20%20%20%20initArgs%20=%20args;%0A%20%20%20%20%20%20if%20(!shouldRun())%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20initStringExemptionLists(args);%0A%20%20%20%20%20%20const%20resolvedFeatures%20=%20await%20Promise.all(features);%0A%20%20%20%20%20%20resolvedFeatures.forEach((%7B%20init,%20featureName%20%7D)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(!isFeatureBroken(args,%20featureName))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20init(args);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20//%20Fire%20off%20updates%20that%20came%20in%20faster%20than%20the%20init%0A%20%20%20%20%20%20while%20(updates.length)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20update%20=%20updates.pop();%0A%20%20%20%20%20%20%20%20%20%20await%20updateFeaturesInner(update);%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20async%20function%20update$1%20(args)%20%7B%0A%20%20%20%20%20%20if%20(!shouldRun())%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(initArgs%20===%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20updates.push(args);%0A%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20updateFeaturesInner(args);%0A%20%20%7D%0A%0A%20%20async%20function%20updateFeaturesInner%20(args)%20%7B%0A%20%20%20%20%20%20const%20resolvedFeatures%20=%20await%20Promise.all(features);%0A%20%20%20%20%20%20resolvedFeatures.forEach((%7B%20update,%20featureName%20%7D)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(!isFeatureBroken(initArgs,%20featureName)%20&&%20update)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20update(args);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%7D%0A%0A%20%20class%20Cookie%20%7B%0A%20%20%20%20%20%20constructor%20(cookieString)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.parts%20=%20cookieString.split(';');%0A%20%20%20%20%20%20%20%20%20%20this.parse();%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20parse%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20EXTRACT_ATTRIBUTES%20=%20new%20Set(%5B'max-age',%20'expires',%20'domain'%5D);%0A%20%20%20%20%20%20%20%20%20%20this.attrIdx%20=%20%7B%7D;%0A%20%20%20%20%20%20%20%20%20%20this.parts.forEach((part,%20index)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20kv%20=%20part.split('=',%201);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20attribute%20=%20kv%5B0%5D.trim();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20value%20=%20part.slice(kv%5B0%5D.length%20+%201);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(index%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.name%20=%20attribute;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.value%20=%20value;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(EXTRACT_ATTRIBUTES.has(attribute.toLowerCase()))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this%5Battribute.toLowerCase()%5D%20=%20value;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.attrIdx%5Battribute.toLowerCase()%5D%20=%20index;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20getExpiry%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20@ts-ignore%0A%20%20%20%20%20%20%20%20%20%20if%20(!this.maxAge%20&&%20!this.expires)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20NaN%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20const%20expiry%20=%20this.maxAge%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20?%20parseInt(this.maxAge)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20@ts-ignore%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20:%20(new%20Date(this.expires)%20-%20new%20Date())%20/%201000;%0A%20%20%20%20%20%20%20%20%20%20return%20expiry%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20get%20maxAge%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20this%5B'max-age'%5D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20set%20maxAge%20(value)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(this.attrIdx%5B'max-age'%5D%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.parts.splice(this.attrIdx%5B'max-age'%5D,%201,%20%60max-age=$%7Bvalue%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.parts.push(%60max-age=$%7Bvalue%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20this.parse();%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20toString%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20this.parts.join(';')%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20/*%20eslint-disable%20quote-props%20*/%0A%20%20/*%20eslint-disable%20quotes%20*/%0A%20%20/*%20eslint-disable%20indent%20*/%0A%20%20/*%20eslint-disable%20eol-last%20*/%0A%20%20/*%20eslint-disable%20no-trailing-spaces%20*/%0A%20%20/*%20eslint-disable%20no-multiple-empty-lines%20*/%0A%20%20%20%20%20%20const%20exceptions%20=%20%5B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22nespresso.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22login%20issues%22%0A%20%20%20%20%7D%0A%20%20%5D;%0A%20%20%20%20%20%20const%20excludedCookieDomains%20=%20%5B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22hangouts.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22docs.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22accounts.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22SSO%20which%20needs%20cookies%20for%20auth%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22googleapis.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22login.live.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22SSO%20which%20needs%20cookies%20for%20auth%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22apis.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22pay.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22payments.amazon.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22payments.amazon.de%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22atlassian.net%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22atlassian.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22paypal.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22paypal.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22salesforce.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22salesforceliveagent.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22force.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22disqus.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22spotify.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22Site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22hangouts.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22docs.google.com%22,%0A%20%20%20%20%20%20%22reason%22:%20%22site%20breakage%22%0A%20%20%20%20%7D,%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22domain%22:%20%22btsport-utils-prod.akamaized.net%22,%0A%20%20%20%20%20%20%22reason%22:%20%22broken%20videos%22%0A%20%20%20%20%7D%0A%20%20%5D;%0A%0A%20%20let%20protectionExempted%20=%20true;%0A%20%20const%20tabHostname%20=%20getTabHostname();%0A%20%20let%20tabExempted%20=%20true;%0A%0A%20%20if%20(tabHostname%20!=%20null)%20%7B%0A%20%20%20%20%20%20tabExempted%20=%20exceptions.some((exception)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20matchHostname(tabHostname,%20exception.domain)%0A%20%20%20%20%20%20%7D);%0A%20%20%7D%0A%20%20const%20frameExempted%20=%20excludedCookieDomains.some((exception)%20=%3E%20%7B%0A%20%20%20%20%20%20return%20matchHostname(globalThis.location.hostname,%20exception.domain)%0A%20%20%7D);%0A%20%20protectionExempted%20=%20frameExempted%20%7C%7C%20tabExempted;%0A%0A%20%20//%20Initial%20cookie%20policy%20pre%20init%0A%20%20let%20cookiePolicy%20=%20%7B%0A%20%20%20%20%20%20debug:%20false,%0A%20%20%20%20%20%20isFrame:%20isBeingFramed(),%0A%20%20%20%20%20%20isTracker:%20false,%0A%20%20%20%20%20%20shouldBlock:%20!protectionExempted,%0A%20%20%20%20%20%20shouldBlockTrackerCookie:%20true,%0A%20%20%20%20%20%20shouldBlockNonTrackerCookie:%20true,%0A%20%20%20%20%20%20isThirdParty:%20isThirdParty(),%0A%20%20%20%20%20%20policy:%20%7B%0A%20%20%20%20%20%20%20%20%20%20threshold:%20604800,%20//%207%20days%0A%20%20%20%20%20%20%20%20%20%20maxAge:%20604800%20//%207%20days%0A%20%20%20%20%20%20%7D%0A%20%20%7D;%0A%0A%20%20let%20loadedPolicyResolve;%0A%20%20//%20Listen%20for%20a%20message%20from%20the%20content%20script%20which%20will%20configure%20the%20policy%20for%20this%20context%0A%20%20const%20trackerHosts%20=%20new%20Set();%0A%0A%20%20/**%0A%20%20%20*%20@param%20%7B'ignore'%20%7C%20'block'%20%7C%20'restrict'%7D%20action%0A%20%20%20*%20@param%20%7Bstring%7D%20reason%0A%20%20%20*%20@param%20%7Bany%7D%20ctx%0A%20%20%20*/%0A%20%20function%20debugHelper%20(action,%20reason,%20ctx)%20%7B%0A%20%20%20%20%20%20cookiePolicy.debug%20&&%20postDebugMessage('jscookie',%20%7B%0A%20%20%20%20%20%20%20%20%20%20action,%0A%20%20%20%20%20%20%20%20%20%20reason,%0A%20%20%20%20%20%20%20%20%20%20stack:%20ctx.stack,%0A%20%20%20%20%20%20%20%20%20%20documentUrl:%20globalThis.document.location.href,%0A%20%20%20%20%20%20%20%20%20%20scriptOrigins:%20%5B...ctx.scriptOrigins%5D,%0A%20%20%20%20%20%20%20%20%20%20value:%20ctx.value%0A%20%20%20%20%20%20%7D);%0A%20%20%7D%0A%0A%20%20function%20shouldBlockTrackingCookie%20()%20%7B%0A%20%20%20%20%20%20return%20cookiePolicy.shouldBlock%20&&%20cookiePolicy.shouldBlockTrackerCookie%20&&%20isTrackingCookie()%0A%20%20%7D%0A%0A%20%20function%20shouldBlockNonTrackingCookie%20()%20%7B%0A%20%20%20%20%20%20return%20cookiePolicy.shouldBlock%20&&%20cookiePolicy.shouldBlockNonTrackerCookie%20&&%20isNonTrackingCookie()%0A%20%20%7D%0A%0A%20%20function%20isTrackingCookie%20()%20%7B%0A%20%20%20%20%20%20return%20cookiePolicy.isFrame%20&&%20cookiePolicy.isTracker%20&&%20cookiePolicy.isThirdParty%0A%20%20%7D%0A%0A%20%20function%20isNonTrackingCookie%20()%20%7B%0A%20%20%20%20%20%20return%20cookiePolicy.isFrame%20&&%20!cookiePolicy.isTracker%20&&%20cookiePolicy.isThirdParty%0A%20%20%7D%0A%0A%20%20function%20load%20(args)%20%7B%0A%20%20%20%20%20%20trackerHosts.clear();%0A%0A%20%20%20%20%20%20//%20The%20cookie%20policy%20is%20injected%20into%20every%20frame%20immediately%20so%20that%20no%20cookie%20will%0A%20%20%20%20%20%20//%20be%20missed.%0A%20%20%20%20%20%20const%20document%20=%20globalThis.document;%0A%20%20%20%20%20%20const%20cookieSetter%20=%20Object.getOwnPropertyDescriptor(globalThis.Document.prototype,%20'cookie').set;%0A%20%20%20%20%20%20const%20cookieGetter%20=%20Object.getOwnPropertyDescriptor(globalThis.Document.prototype,%20'cookie').get;%0A%0A%20%20%20%20%20%20const%20loadPolicy%20=%20new%20Promise((resolve)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20loadedPolicyResolve%20=%20resolve;%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20//%20Create%20the%20then%20callback%20now%20-%20this%20ensures%20that%20Promise.prototype.then%20changes%20won't%20break%0A%20%20%20%20%20%20//%20this%20call.%0A%20%20%20%20%20%20const%20loadPolicyThen%20=%20loadPolicy.then.bind(loadPolicy);%0A%0A%20%20%20%20%20%20function%20getCookiePolicy%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20stack%20=%20getStack();%0A%20%20%20%20%20%20%20%20%20%20const%20scriptOrigins%20=%20getStackTraceOrigins(stack);%0A%20%20%20%20%20%20%20%20%20%20const%20getCookieContext%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20stack,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20scriptOrigins,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value:%20'getter'%0A%20%20%20%20%20%20%20%20%20%20%7D;%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(shouldBlockTrackingCookie()%20%7C%7C%20shouldBlockNonTrackingCookie())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('block',%20'3p%20frame',%20getCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20''%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(isTrackingCookie()%20%7C%7C%20isNonTrackingCookie())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('ignore',%20'3p%20frame',%20getCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20return%20cookieGetter.call(document)%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20setCookiePolicy%20(value)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20stack%20=%20getStack();%0A%20%20%20%20%20%20%20%20%20%20const%20scriptOrigins%20=%20getStackTraceOrigins(stack);%0A%20%20%20%20%20%20%20%20%20%20const%20setCookieContext%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20stack,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20scriptOrigins,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%0A%20%20%20%20%20%20%20%20%20%20%7D;%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(shouldBlockTrackingCookie()%20%7C%7C%20shouldBlockNonTrackingCookie())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('block',%20'3p%20frame',%20setCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(isTrackingCookie()%20%7C%7C%20isNonTrackingCookie())%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('ignore',%20'3p%20frame',%20setCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20//%20call%20the%20native%20document.cookie%20implementation.%20This%20will%20set%20the%20cookie%20immediately%0A%20%20%20%20%20%20%20%20%20%20//%20if%20the%20value%20is%20valid.%20We%20will%20override%20this%20set%20later%20if%20the%20policy%20dictates%20that%0A%20%20%20%20%20%20%20%20%20%20//%20the%20expiry%20should%20be%20changed.%0A%20%20%20%20%20%20%20%20%20%20cookieSetter.call(document,%20value);%0A%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20wait%20for%20config%20before%20doing%20same-site%20tests%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20loadPolicyThen(()%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20%7B%20shouldBlock,%20policy%20%7D%20=%20cookiePolicy;%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!shouldBlock)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('ignore',%20'disabled',%20setCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20extract%20cookie%20expiry%20from%20cookie%20string%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20cookie%20=%20new%20Cookie(value);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20apply%20cookie%20policy%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(cookie.getExpiry()%20%3E%20policy.threshold)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20check%20if%20the%20cookie%20still%20exists%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(document.cookie.split(';').findIndex(kv%20=%3E%20kv.trim().startsWith(cookie.parts%5B0%5D.trim()))%20!==%20-1)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cookie.maxAge%20=%20policy.maxAge;%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('restrict',%20'expiry',%20setCookieContext);%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cookieSetter.apply(document,%20%5Bcookie.toString()%5D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('ignore',%20'dissappeared',%20setCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('ignore',%20'expiry',%20setCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugHelper('ignore',%20'error',%20setCookieContext);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20suppress%20error%20in%20cookie%20override%20to%20avoid%20breakage%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.warn('Error%20in%20cookie%20override',%20e);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20defineProperty(document,%20'cookie',%20%7B%0A%20%20%20%20%20%20%20%20%20%20configurable:%20true,%0A%20%20%20%20%20%20%20%20%20%20set:%20setCookiePolicy,%0A%20%20%20%20%20%20%20%20%20%20get:%20getCookiePolicy%0A%20%20%20%20%20%20%7D);%0A%20%20%7D%0A%0A%20%20function%20init$c%20(args)%20%7B%0A%20%20%20%20%20%20args.cookie.debug%20=%20args.debug;%0A%20%20%20%20%20%20cookiePolicy%20=%20args.cookie;%0A%0A%20%20%20%20%20%20const%20featureName%20=%20'cookie';%0A%20%20%20%20%20%20cookiePolicy.shouldBlockTrackerCookie%20=%20getFeatureSettingEnabled(featureName,%20args,%20'trackerCookie');%0A%20%20%20%20%20%20cookiePolicy.shouldBlockNonTrackerCookie%20=%20getFeatureSettingEnabled(featureName,%20args,%20'nonTrackerCookie');%0A%20%20%20%20%20%20const%20policy%20=%20getFeatureSetting(featureName,%20args,%20'firstPartyCookiePolicy');%0A%20%20%20%20%20%20if%20(policy)%20%7B%0A%20%20%20%20%20%20%20%20%20%20cookiePolicy.policy%20=%20policy;%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20loadedPolicyResolve();%0A%20%20%7D%0A%0A%20%20function%20update%20(args)%20%7B%0A%20%20%20%20%20%20if%20(args.trackerDefinition)%20%7B%0A%20%20%20%20%20%20%20%20%20%20trackerHosts.add(args.hostname);%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20cookie%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20load:%20load,%0A%20%20%20%20init:%20init$c,%0A%20%20%20%20update:%20update%0A%20%20%7D);%0A%0A%20%20function%20init$b%20(args)%20%7B%0A%20%20%20%20%20%20const%20%7B%20sessionKey,%20site%20%7D%20=%20args;%0A%20%20%20%20%20%20const%20domainKey%20=%20site.domain;%0A%20%20%20%20%20%20const%20featureName%20=%20'fingerprinting-audio';%0A%0A%20%20%20%20%20%20//%20In%20place%20modify%20array%20data%20to%20remove%20fingerprinting%0A%20%20%20%20%20%20function%20transformArrayData%20(channelData,%20domainKey,%20sessionKey,%20thisArg)%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20%7B%20audioKey%20%7D%20=%20getCachedResponse(thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20if%20(!audioKey)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20let%20cdSum%20=%200;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(const%20k%20in%20channelData)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cdSum%20+=%20channelData%5Bk%5D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20If%20the%20buffer%20is%20blank,%20skip%20adding%20data%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(cdSum%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20audioKey%20=%20getDataKeySync(sessionKey,%20domainKey,%20cdSum);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setCache(thisArg,%20args,%20audioKey);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20iterateDataKey(audioKey,%20(item,%20byte)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20itemAudioIndex%20=%20item%20%25%20channelData.length;%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20let%20factor%20=%20byte%20*%200.0000001;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(byte%20%5E%200x1)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20factor%20=%200%20-%20factor;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20channelData%5BitemAudioIndex%5D%20=%20channelData%5BitemAudioIndex%5D%20+%20factor;%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20copyFromChannelProxy%20=%20new%20DDGProxy(featureName,%20AudioBuffer.prototype,%20'copyFromChannel',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20%5Bsource,%20channelNumber,%20startInChannel%5D%20=%20args;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20This%20is%20implemented%20in%20a%20different%20way%20to%20canvas%20purely%20because%20calling%20the%20function%20copied%20the%20original%20value,%20which%20is%20not%20ideal%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(//%20If%20channelNumber%20is%20longer%20than%20arrayBuffer%20number%20of%20channels%20then%20call%20the%20default%20method%20to%20throw%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20channelNumber%20%3E%20thisArg.numberOfChannels%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20If%20startInChannel%20is%20longer%20than%20the%20arrayBuffer%20length%20then%20call%20the%20default%20method%20to%20throw%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20startInChannel%20%3E%20thisArg.length)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20The%20normal%20return%20value%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Call%20the%20protected%20getChannelData%20we%20implement,%20slice%20from%20the%20startInChannel%20value%20and%20assign%20to%20the%20source%20array%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20thisArg.getChannelData(channelNumber).slice(startInChannel).forEach((val,%20index)%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20source%5Bindex%5D%20=%20val;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20copyFromChannelProxy.overload();%0A%0A%20%20%20%20%20%20const%20cacheExpiry%20=%2060;%0A%20%20%20%20%20%20const%20cacheData%20=%20new%20WeakMap();%0A%20%20%20%20%20%20function%20getCachedResponse%20(thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20data%20=%20cacheData.get(thisArg);%0A%20%20%20%20%20%20%20%20%20%20const%20timeNow%20=%20Date.now();%0A%20%20%20%20%20%20%20%20%20%20if%20(data%20&&%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20data.args%20===%20JSON.stringify(args)%20&&%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20data.expires%20%3E%20timeNow)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20data.expires%20=%20timeNow%20+%20cacheExpiry;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20cacheData.set(thisArg,%20data);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20data%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20return%20%7B%20audioKey:%20null%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20setCache%20(thisArg,%20args,%20audioKey)%20%7B%0A%20%20%20%20%20%20%20%20%20%20cacheData.set(thisArg,%20%7B%20args:%20JSON.stringify(args),%20expires:%20Date.now()%20+%20cacheExpiry,%20audioKey%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20getChannelDataProxy%20=%20new%20DDGProxy(featureName,%20AudioBuffer.prototype,%20'getChannelData',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20The%20normal%20return%20value%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20channelData%20=%20DDGReflect.apply(target,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Anything%20we%20do%20here%20should%20be%20caught%20and%20ignored%20silently%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20transformArrayData(channelData,%20domainKey,%20sessionKey,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20channelData%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20getChannelDataProxy.overload();%0A%0A%20%20%20%20%20%20const%20audioMethods%20=%20%5B'getByteTimeDomainData',%20'getFloatTimeDomainData',%20'getByteFrequencyData',%20'getFloatFrequencyData'%5D;%0A%20%20%20%20%20%20for%20(const%20methodName%20of%20audioMethods)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20proxy%20=%20new%20DDGProxy(featureName,%20AnalyserNode.prototype,%20methodName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DDGReflect.apply(target,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Anything%20we%20do%20here%20should%20be%20caught%20and%20ignored%20silently%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20transformArrayData(args%5B0%5D,%20domainKey,%20sessionKey,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20proxy.overload();%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20fingerprintingAudio%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$b%0A%20%20%7D);%0A%0A%20%20/**%0A%20%20%20*%20Overwrites%20the%20Battery%20API%20if%20present%20in%20the%20browser.%0A%20%20%20*%20It%20will%20return%20the%20values%20defined%20in%20the%20getBattery%20function%20to%20the%20client,%0A%20%20%20*%20as%20well%20as%20prevent%20any%20script%20from%20listening%20to%20events.%0A%20%20%20*/%0A%20%20function%20init$a%20(args)%20%7B%0A%20%20%20%20%20%20if%20(globalThis.navigator.getBattery)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20BatteryManager%20=%20globalThis.BatteryManager;%0A%0A%20%20%20%20%20%20%20%20%20%20const%20spoofedValues%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20charging:%20true,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20chargingTime:%200,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20dischargingTime:%20Infinity,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20level:%201%0A%20%20%20%20%20%20%20%20%20%20%7D;%0A%20%20%20%20%20%20%20%20%20%20const%20eventProperties%20=%20%5B'onchargingchange',%20'onchargingtimechange',%20'ondischargingtimechange',%20'onlevelchange'%5D;%0A%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20%5Bprop,%20val%5D%20of%20Object.entries(spoofedValues))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defineProperty(BatteryManager.prototype,%20prop,%20%7B%20get:%20()%20=%3E%20val%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20eventProp%20of%20eventProperties)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defineProperty(BatteryManager.prototype,%20eventProp,%20%7B%20get:%20()%20=%3E%20null%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20fingerprintingBattery%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$a%0A%20%20%7D);%0A%0A%20%20var%20commonjsGlobal%20=%20typeof%20globalThis%20!==%20'undefined'%20?%20globalThis%20:%20typeof%20window%20!==%20'undefined'%20?%20window%20:%20typeof%20global%20!==%20'undefined'%20?%20global%20:%20typeof%20self%20!==%20'undefined'%20?%20self%20:%20%7B%7D;%0A%0A%20%20var%20alea$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09//%20A%20port%20of%20an%20algorithm%20by%20Johannes%20Baag%C3%B8e%20%3Cbaagoe@baagoe.com%3E,%202010%0A%20%20%09//%20http://baagoe.com/en/RandomMusings/javascript/%0A%20%20%09//%20https://github.com/nquinlan/better-random-numbers-for-javascript-mirror%0A%20%20%09//%20Original%20work%20is%20under%20MIT%20license%20-%0A%0A%20%20%09//%20Copyright%20(C)%202010%20by%20Johannes%20Baag%C3%B8e%20%3Cbaagoe@baagoe.org%3E%0A%20%20%09//%0A%20%20%09//%20Permission%20is%20hereby%20granted,%20free%20of%20charge,%20to%20any%20person%20obtaining%20a%20copy%0A%20%20%09//%20of%20this%20software%20and%20associated%20documentation%20files%20(the%20%22Software%22),%20to%20deal%0A%20%20%09//%20in%20the%20Software%20without%20restriction,%20including%20without%20limitation%20the%20rights%0A%20%20%09//%20to%20use,%20copy,%20modify,%20merge,%20publish,%20distribute,%20sublicense,%20and/or%20sell%0A%20%20%09//%20copies%20of%20the%20Software,%20and%20to%20permit%20persons%20to%20whom%20the%20Software%20is%0A%20%20%09//%20furnished%20to%20do%20so,%20subject%20to%20the%20following%20conditions:%0A%20%20%09//%0A%20%20%09//%20The%20above%20copyright%20notice%20and%20this%20permission%20notice%20shall%20be%20included%20in%0A%20%20%09//%20all%20copies%20or%20substantial%20portions%20of%20the%20Software.%0A%20%20%09//%0A%20%20%09//%20THE%20SOFTWARE%20IS%20PROVIDED%20%22AS%20IS%22,%20WITHOUT%20WARRANTY%20OF%20ANY%20KIND,%20EXPRESS%20OR%0A%20%20%09//%20IMPLIED,%20INCLUDING%20BUT%20NOT%20LIMITED%20TO%20THE%20WARRANTIES%20OF%20MERCHANTABILITY,%0A%20%20%09//%20FITNESS%20FOR%20A%20PARTICULAR%20PURPOSE%20AND%20NONINFRINGEMENT.%20IN%20NO%20EVENT%20SHALL%20THE%0A%20%20%09//%20AUTHORS%20OR%20COPYRIGHT%20HOLDERS%20BE%20LIABLE%20FOR%20ANY%20CLAIM,%20DAMAGES%20OR%20OTHER%0A%20%20%09//%20LIABILITY,%20WHETHER%20IN%20AN%20ACTION%20OF%20CONTRACT,%20TORT%20OR%20OTHERWISE,%20ARISING%20FROM,%0A%20%20%09//%20OUT%20OF%20OR%20IN%20CONNECTION%20WITH%20THE%20SOFTWARE%20OR%20THE%20USE%20OR%20OTHER%20DEALINGS%20IN%0A%20%20%09//%20THE%20SOFTWARE.%0A%0A%0A%0A%20%20%09(function(global,%20module,%20define)%20%7B%0A%0A%20%20%09function%20Alea(seed)%20%7B%0A%20%20%09%20%20var%20me%20=%20this,%20mash%20=%20Mash();%0A%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20t%20=%202091639%20*%20me.s0%20+%20me.c%20*%202.3283064365386963e-10;%20//%202%5E-32%0A%20%20%09%20%20%20%20me.s0%20=%20me.s1;%0A%20%20%09%20%20%20%20me.s1%20=%20me.s2;%0A%20%20%09%20%20%20%20return%20me.s2%20=%20t%20-%20(me.c%20=%20t%20%7C%200);%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20//%20Apply%20the%20seeding%20algorithm%20from%20Baagoe.%0A%20%20%09%20%20me.c%20=%201;%0A%20%20%09%20%20me.s0%20=%20mash('%20');%0A%20%20%09%20%20me.s1%20=%20mash('%20');%0A%20%20%09%20%20me.s2%20=%20mash('%20');%0A%20%20%09%20%20me.s0%20-=%20mash(seed);%0A%20%20%09%20%20if%20(me.s0%20%3C%200)%20%7B%20me.s0%20+=%201;%20%7D%0A%20%20%09%20%20me.s1%20-=%20mash(seed);%0A%20%20%09%20%20if%20(me.s1%20%3C%200)%20%7B%20me.s1%20+=%201;%20%7D%0A%20%20%09%20%20me.s2%20-=%20mash(seed);%0A%20%20%09%20%20if%20(me.s2%20%3C%200)%20%7B%20me.s2%20+=%201;%20%7D%0A%20%20%09%20%20mash%20=%20null;%0A%20%20%09%7D%0A%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.c%20=%20f.c;%0A%20%20%09%20%20t.s0%20=%20f.s0;%0A%20%20%09%20%20t.s1%20=%20f.s1;%0A%20%20%09%20%20t.s2%20=%20f.s2;%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%0A%20%20%09function%20impl(seed,%20opts)%20%7B%0A%20%20%09%20%20var%20xg%20=%20new%20Alea(seed),%0A%20%20%09%20%20%20%20%20%20state%20=%20opts%20&&%20opts.state,%0A%20%20%09%20%20%20%20%20%20prng%20=%20xg.next;%0A%20%20%09%20%20prng.int32%20=%20function()%20%7B%20return%20(xg.next()%20*%200x100000000)%20%7C%200;%20%7D;%0A%20%20%09%20%20prng.double%20=%20function()%20%7B%0A%20%20%09%20%20%20%20return%20prng()%20+%20(prng()%20*%200x200000%20%7C%200)%20*%201.1102230246251565e-16;%20//%202%5E-53%0A%20%20%09%20%20%7D;%0A%20%20%09%20%20prng.quick%20=%20prng;%0A%20%20%09%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20if%20(typeof(state)%20==%20'object')%20copy(state,%20xg);%0A%20%20%09%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(xg,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20prng;%0A%20%20%09%7D%0A%0A%20%20%09function%20Mash()%20%7B%0A%20%20%09%20%20var%20n%20=%200xefc8249d;%0A%0A%20%20%09%20%20var%20mash%20=%20function(data)%20%7B%0A%20%20%09%20%20%20%20data%20=%20String(data);%0A%20%20%09%20%20%20%20for%20(var%20i%20=%200;%20i%20%3C%20data.length;%20i++)%20%7B%0A%20%20%09%20%20%20%20%20%20n%20+=%20data.charCodeAt(i);%0A%20%20%09%20%20%20%20%20%20var%20h%20=%200.02519603282416938%20*%20n;%0A%20%20%09%20%20%20%20%20%20n%20=%20h%20%3E%3E%3E%200;%0A%20%20%09%20%20%20%20%20%20h%20-=%20n;%0A%20%20%09%20%20%20%20%20%20h%20*=%20n;%0A%20%20%09%20%20%20%20%20%20n%20=%20h%20%3E%3E%3E%200;%0A%20%20%09%20%20%20%20%20%20h%20-=%20n;%0A%20%20%09%20%20%20%20%20%20n%20+=%20h%20*%200x100000000;%20//%202%5E32%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20return%20(n%20%3E%3E%3E%200)%20*%202.3283064365386963e-10;%20//%202%5E-32%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20return%20mash;%0A%20%20%09%7D%0A%0A%0A%20%20%09if%20(module%20&&%20module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20impl;%0A%20%20%09%7D%20else%20if%20(define%20&&%20define.amd)%20%7B%0A%20%20%09%20%20define(function()%20%7B%20return%20impl;%20%7D);%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20this.alea%20=%20impl;%0A%20%20%09%7D%0A%0A%20%20%09%7D)(%0A%20%20%09%20%20commonjsGlobal,%0A%20%20%09%20%20module,%20%20%20%20//%20present%20in%20node.js%0A%20%20%09%20%20(typeof%20undefined)%20==%20'function'%20%20%20%20//%20present%20with%20an%20AMD%20loader%0A%20%20%09);%0A%20%20%7D%20(alea$1));%0A%0A%20%20var%20xor128$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09//%20A%20Javascript%20implementaion%20of%20the%20%22xor128%22%20prng%20algorithm%20by%0A%20%20%09//%20George%20Marsaglia.%20%20See%20http://www.jstatsoft.org/v08/i14/paper%0A%0A%20%20%09(function(global,%20module,%20define)%20%7B%0A%0A%20%20%09function%20XorGen(seed)%20%7B%0A%20%20%09%20%20var%20me%20=%20this,%20strseed%20=%20'';%0A%0A%20%20%09%20%20me.x%20=%200;%0A%20%20%09%20%20me.y%20=%200;%0A%20%20%09%20%20me.z%20=%200;%0A%20%20%09%20%20me.w%20=%200;%0A%0A%20%20%09%20%20//%20Set%20up%20generator%20function.%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20t%20=%20me.x%20%5E%20(me.x%20%3C%3C%2011);%0A%20%20%09%20%20%20%20me.x%20=%20me.y;%0A%20%20%09%20%20%20%20me.y%20=%20me.z;%0A%20%20%09%20%20%20%20me.z%20=%20me.w;%0A%20%20%09%20%20%20%20return%20me.w%20%5E=%20(me.w%20%3E%3E%3E%2019)%20%5E%20t%20%5E%20(t%20%3E%3E%3E%208);%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20if%20(seed%20===%20(seed%20%7C%200))%20%7B%0A%20%20%09%20%20%20%20//%20Integer%20seed.%0A%20%20%09%20%20%20%20me.x%20=%20seed;%0A%20%20%09%20%20%7D%20else%20%7B%0A%20%20%09%20%20%20%20//%20String%20seed.%0A%20%20%09%20%20%20%20strseed%20+=%20seed;%0A%20%20%09%20%20%7D%0A%0A%20%20%09%20%20//%20Mix%20in%20string%20seed,%20then%20discard%20an%20initial%20batch%20of%2064%20values.%0A%20%20%09%20%20for%20(var%20k%20=%200;%20k%20%3C%20strseed.length%20+%2064;%20k++)%20%7B%0A%20%20%09%20%20%20%20me.x%20%5E=%20strseed.charCodeAt(k)%20%7C%200;%0A%20%20%09%20%20%20%20me.next();%0A%20%20%09%20%20%7D%0A%20%20%09%7D%0A%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.x%20=%20f.x;%0A%20%20%09%20%20t.y%20=%20f.y;%0A%20%20%09%20%20t.z%20=%20f.z;%0A%20%20%09%20%20t.w%20=%20f.w;%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%0A%20%20%09function%20impl(seed,%20opts)%20%7B%0A%20%20%09%20%20var%20xg%20=%20new%20XorGen(seed),%0A%20%20%09%20%20%20%20%20%20state%20=%20opts%20&&%20opts.state,%0A%20%20%09%20%20%20%20%20%20prng%20=%20function()%20%7B%20return%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000;%20%7D;%0A%20%20%09%20%20prng.double%20=%20function()%20%7B%0A%20%20%09%20%20%20%20do%20%7B%0A%20%20%09%20%20%20%20%20%20var%20top%20=%20xg.next()%20%3E%3E%3E%2011,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20bot%20=%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20result%20=%20(top%20+%20bot)%20/%20(1%20%3C%3C%2021);%0A%20%20%09%20%20%20%20%7D%20while%20(result%20===%200);%0A%20%20%09%20%20%20%20return%20result;%0A%20%20%09%20%20%7D;%0A%20%20%09%20%20prng.int32%20=%20xg.next;%0A%20%20%09%20%20prng.quick%20=%20prng;%0A%20%20%09%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20if%20(typeof(state)%20==%20'object')%20copy(state,%20xg);%0A%20%20%09%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(xg,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20prng;%0A%20%20%09%7D%0A%0A%20%20%09if%20(module%20&&%20module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20impl;%0A%20%20%09%7D%20else%20if%20(define%20&&%20define.amd)%20%7B%0A%20%20%09%20%20define(function()%20%7B%20return%20impl;%20%7D);%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20this.xor128%20=%20impl;%0A%20%20%09%7D%0A%0A%20%20%09%7D)(%0A%20%20%09%20%20commonjsGlobal,%0A%20%20%09%20%20module,%20%20%20%20//%20present%20in%20node.js%0A%20%20%09%20%20(typeof%20undefined)%20==%20'function'%20%20%20%20//%20present%20with%20an%20AMD%20loader%0A%20%20%09);%0A%20%20%7D%20(xor128$1));%0A%0A%20%20var%20xorwow$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09//%20A%20Javascript%20implementaion%20of%20the%20%22xorwow%22%20prng%20algorithm%20by%0A%20%20%09//%20George%20Marsaglia.%20%20See%20http://www.jstatsoft.org/v08/i14/paper%0A%0A%20%20%09(function(global,%20module,%20define)%20%7B%0A%0A%20%20%09function%20XorGen(seed)%20%7B%0A%20%20%09%20%20var%20me%20=%20this,%20strseed%20=%20'';%0A%0A%20%20%09%20%20//%20Set%20up%20generator%20function.%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20t%20=%20(me.x%20%5E%20(me.x%20%3E%3E%3E%202));%0A%20%20%09%20%20%20%20me.x%20=%20me.y;%20me.y%20=%20me.z;%20me.z%20=%20me.w;%20me.w%20=%20me.v;%0A%20%20%09%20%20%20%20return%20(me.d%20=%20(me.d%20+%20362437%20%7C%200))%20+%0A%20%20%09%20%20%20%20%20%20%20(me.v%20=%20(me.v%20%5E%20(me.v%20%3C%3C%204))%20%5E%20(t%20%5E%20(t%20%3C%3C%201)))%20%7C%200;%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20me.x%20=%200;%0A%20%20%09%20%20me.y%20=%200;%0A%20%20%09%20%20me.z%20=%200;%0A%20%20%09%20%20me.w%20=%200;%0A%20%20%09%20%20me.v%20=%200;%0A%0A%20%20%09%20%20if%20(seed%20===%20(seed%20%7C%200))%20%7B%0A%20%20%09%20%20%20%20//%20Integer%20seed.%0A%20%20%09%20%20%20%20me.x%20=%20seed;%0A%20%20%09%20%20%7D%20else%20%7B%0A%20%20%09%20%20%20%20//%20String%20seed.%0A%20%20%09%20%20%20%20strseed%20+=%20seed;%0A%20%20%09%20%20%7D%0A%0A%20%20%09%20%20//%20Mix%20in%20string%20seed,%20then%20discard%20an%20initial%20batch%20of%2064%20values.%0A%20%20%09%20%20for%20(var%20k%20=%200;%20k%20%3C%20strseed.length%20+%2064;%20k++)%20%7B%0A%20%20%09%20%20%20%20me.x%20%5E=%20strseed.charCodeAt(k)%20%7C%200;%0A%20%20%09%20%20%20%20if%20(k%20==%20strseed.length)%20%7B%0A%20%20%09%20%20%20%20%20%20me.d%20=%20me.x%20%3C%3C%2010%20%5E%20me.x%20%3E%3E%3E%204;%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20me.next();%0A%20%20%09%20%20%7D%0A%20%20%09%7D%0A%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.x%20=%20f.x;%0A%20%20%09%20%20t.y%20=%20f.y;%0A%20%20%09%20%20t.z%20=%20f.z;%0A%20%20%09%20%20t.w%20=%20f.w;%0A%20%20%09%20%20t.v%20=%20f.v;%0A%20%20%09%20%20t.d%20=%20f.d;%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%0A%20%20%09function%20impl(seed,%20opts)%20%7B%0A%20%20%09%20%20var%20xg%20=%20new%20XorGen(seed),%0A%20%20%09%20%20%20%20%20%20state%20=%20opts%20&&%20opts.state,%0A%20%20%09%20%20%20%20%20%20prng%20=%20function()%20%7B%20return%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000;%20%7D;%0A%20%20%09%20%20prng.double%20=%20function()%20%7B%0A%20%20%09%20%20%20%20do%20%7B%0A%20%20%09%20%20%20%20%20%20var%20top%20=%20xg.next()%20%3E%3E%3E%2011,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20bot%20=%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20result%20=%20(top%20+%20bot)%20/%20(1%20%3C%3C%2021);%0A%20%20%09%20%20%20%20%7D%20while%20(result%20===%200);%0A%20%20%09%20%20%20%20return%20result;%0A%20%20%09%20%20%7D;%0A%20%20%09%20%20prng.int32%20=%20xg.next;%0A%20%20%09%20%20prng.quick%20=%20prng;%0A%20%20%09%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20if%20(typeof(state)%20==%20'object')%20copy(state,%20xg);%0A%20%20%09%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(xg,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20prng;%0A%20%20%09%7D%0A%0A%20%20%09if%20(module%20&&%20module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20impl;%0A%20%20%09%7D%20else%20if%20(define%20&&%20define.amd)%20%7B%0A%20%20%09%20%20define(function()%20%7B%20return%20impl;%20%7D);%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20this.xorwow%20=%20impl;%0A%20%20%09%7D%0A%0A%20%20%09%7D)(%0A%20%20%09%20%20commonjsGlobal,%0A%20%20%09%20%20module,%20%20%20%20//%20present%20in%20node.js%0A%20%20%09%20%20(typeof%20undefined)%20==%20'function'%20%20%20%20//%20present%20with%20an%20AMD%20loader%0A%20%20%09);%0A%20%20%7D%20(xorwow$1));%0A%0A%20%20var%20xorshift7$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09//%20A%20Javascript%20implementaion%20of%20the%20%22xorshift7%22%20algorithm%20by%0A%20%20%09//%20Fran%C3%A7ois%20Panneton%20and%20Pierre%20L'ecuyer:%0A%20%20%09//%20%22On%20the%20Xorgshift%20Random%20Number%20Generators%22%0A%20%20%09//%20http://saluc.engr.uconn.edu/refs/crypto/rng/panneton05onthexorshift.pdf%0A%0A%20%20%09(function(global,%20module,%20define)%20%7B%0A%0A%20%20%09function%20XorGen(seed)%20%7B%0A%20%20%09%20%20var%20me%20=%20this;%0A%0A%20%20%09%20%20//%20Set%20up%20generator%20function.%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20//%20Update%20xor%20generator.%0A%20%20%09%20%20%20%20var%20X%20=%20me.x,%20i%20=%20me.i,%20t,%20v;%0A%20%20%09%20%20%20%20t%20=%20X%5Bi%5D;%20t%20%5E=%20(t%20%3E%3E%3E%207);%20v%20=%20t%20%5E%20(t%20%3C%3C%2024);%0A%20%20%09%20%20%20%20t%20=%20X%5B(i%20+%201)%20&%207%5D;%20v%20%5E=%20t%20%5E%20(t%20%3E%3E%3E%2010);%0A%20%20%09%20%20%20%20t%20=%20X%5B(i%20+%203)%20&%207%5D;%20v%20%5E=%20t%20%5E%20(t%20%3E%3E%3E%203);%0A%20%20%09%20%20%20%20t%20=%20X%5B(i%20+%204)%20&%207%5D;%20v%20%5E=%20t%20%5E%20(t%20%3C%3C%207);%0A%20%20%09%20%20%20%20t%20=%20X%5B(i%20+%207)%20&%207%5D;%20t%20=%20t%20%5E%20(t%20%3C%3C%2013);%20v%20%5E=%20t%20%5E%20(t%20%3C%3C%209);%0A%20%20%09%20%20%20%20X%5Bi%5D%20=%20v;%0A%20%20%09%20%20%20%20me.i%20=%20(i%20+%201)%20&%207;%0A%20%20%09%20%20%20%20return%20v;%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20function%20init(me,%20seed)%20%7B%0A%20%20%09%20%20%20%20var%20j,%20X%20=%20%5B%5D;%0A%0A%20%20%09%20%20%20%20if%20(seed%20===%20(seed%20%7C%200))%20%7B%0A%20%20%09%20%20%20%20%20%20//%20Seed%20state%20array%20using%20a%2032-bit%20integer.%0A%20%20%09%20%20%20%20%20%20X%5B0%5D%20=%20seed;%0A%20%20%09%20%20%20%20%7D%20else%20%7B%0A%20%20%09%20%20%20%20%20%20//%20Seed%20state%20using%20a%20string.%0A%20%20%09%20%20%20%20%20%20seed%20=%20''%20+%20seed;%0A%20%20%09%20%20%20%20%20%20for%20(j%20=%200;%20j%20%3C%20seed.length;%20++j)%20%7B%0A%20%20%09%20%20%20%20%20%20%20%20X%5Bj%20&%207%5D%20=%20(X%5Bj%20&%207%5D%20%3C%3C%2015)%20%5E%0A%20%20%09%20%20%20%20%20%20%20%20%20%20%20%20(seed.charCodeAt(j)%20+%20X%5B(j%20+%201)%20&%207%5D%20%3C%3C%2013);%0A%20%20%09%20%20%20%20%20%20%7D%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20//%20Enforce%20an%20array%20length%20of%208,%20not%20all%20zeroes.%0A%20%20%09%20%20%20%20while%20(X.length%20%3C%208)%20X.push(0);%0A%20%20%09%20%20%20%20for%20(j%20=%200;%20j%20%3C%208%20&&%20X%5Bj%5D%20===%200;%20++j);%0A%20%20%09%20%20%20%20if%20(j%20==%208)%20X%5B7%5D%20=%20-1;%20else%20X%5Bj%5D;%0A%0A%20%20%09%20%20%20%20me.x%20=%20X;%0A%20%20%09%20%20%20%20me.i%20=%200;%0A%0A%20%20%09%20%20%20%20//%20Discard%20an%20initial%20256%20values.%0A%20%20%09%20%20%20%20for%20(j%20=%20256;%20j%20%3E%200;%20--j)%20%7B%0A%20%20%09%20%20%20%20%20%20me.next();%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%7D%0A%0A%20%20%09%20%20init(me,%20seed);%0A%20%20%09%7D%0A%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.x%20=%20f.x.slice();%0A%20%20%09%20%20t.i%20=%20f.i;%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%0A%20%20%09function%20impl(seed,%20opts)%20%7B%0A%20%20%09%20%20if%20(seed%20==%20null)%20seed%20=%20+(new%20Date);%0A%20%20%09%20%20var%20xg%20=%20new%20XorGen(seed),%0A%20%20%09%20%20%20%20%20%20state%20=%20opts%20&&%20opts.state,%0A%20%20%09%20%20%20%20%20%20prng%20=%20function()%20%7B%20return%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000;%20%7D;%0A%20%20%09%20%20prng.double%20=%20function()%20%7B%0A%20%20%09%20%20%20%20do%20%7B%0A%20%20%09%20%20%20%20%20%20var%20top%20=%20xg.next()%20%3E%3E%3E%2011,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20bot%20=%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20result%20=%20(top%20+%20bot)%20/%20(1%20%3C%3C%2021);%0A%20%20%09%20%20%20%20%7D%20while%20(result%20===%200);%0A%20%20%09%20%20%20%20return%20result;%0A%20%20%09%20%20%7D;%0A%20%20%09%20%20prng.int32%20=%20xg.next;%0A%20%20%09%20%20prng.quick%20=%20prng;%0A%20%20%09%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20if%20(state.x)%20copy(state,%20xg);%0A%20%20%09%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(xg,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20prng;%0A%20%20%09%7D%0A%0A%20%20%09if%20(module%20&&%20module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20impl;%0A%20%20%09%7D%20else%20if%20(define%20&&%20define.amd)%20%7B%0A%20%20%09%20%20define(function()%20%7B%20return%20impl;%20%7D);%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20this.xorshift7%20=%20impl;%0A%20%20%09%7D%0A%0A%20%20%09%7D)(%0A%20%20%09%20%20commonjsGlobal,%0A%20%20%09%20%20module,%20%20%20%20//%20present%20in%20node.js%0A%20%20%09%20%20(typeof%20undefined)%20==%20'function'%20%20%20%20//%20present%20with%20an%20AMD%20loader%0A%20%20%09);%0A%20%20%7D%20(xorshift7$1));%0A%0A%20%20var%20xor4096$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09//%20A%20Javascript%20implementaion%20of%20Richard%20Brent's%20Xorgens%20xor4096%20algorithm.%0A%20%20%09//%0A%20%20%09//%20This%20fast%20non-cryptographic%20random%20number%20generator%20is%20designed%20for%0A%20%20%09//%20use%20in%20Monte-Carlo%20algorithms.%20It%20combines%20a%20long-period%20xorshift%0A%20%20%09//%20generator%20with%20a%20Weyl%20generator,%20and%20it%20passes%20all%20common%20batteries%0A%20%20%09//%20of%20stasticial%20tests%20for%20randomness%20while%20consuming%20only%20a%20few%20nanoseconds%0A%20%20%09//%20for%20each%20prng%20generated.%20%20For%20background%20on%20the%20generator,%20see%20Brent's%0A%20%20%09//%20paper:%20%22Some%20long-period%20random%20number%20generators%20using%20shifts%20and%20xors.%22%0A%20%20%09//%20http://arxiv.org/pdf/1004.3115v1.pdf%0A%20%20%09//%0A%20%20%09//%20Usage:%0A%20%20%09//%0A%20%20%09//%20var%20xor4096%20=%20require('xor4096');%0A%20%20%09//%20random%20=%20xor4096(1);%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Seed%20with%20int32%20or%20string.%0A%20%20%09//%20assert.equal(random(),%200.1520436450538547);%20//%20(0,%201)%20range,%2053%20bits.%0A%20%20%09//%20assert.equal(random.int32(),%201806534897);%20%20%20//%20signed%20int32,%2032%20bits.%0A%20%20%09//%0A%20%20%09//%20For%20nonzero%20numeric%20keys,%20this%20impelementation%20provides%20a%20sequence%0A%20%20%09//%20identical%20to%20that%20by%20Brent's%20xorgens%203%20implementaion%20in%20C.%20%20This%0A%20%20%09//%20implementation%20also%20provides%20for%20initalizing%20the%20generator%20with%0A%20%20%09//%20string%20seeds,%20or%20for%20saving%20and%20restoring%20the%20state%20of%20the%20generator.%0A%20%20%09//%0A%20%20%09//%20On%20Chrome,%20this%20prng%20benchmarks%20about%202.1%20times%20slower%20than%0A%20%20%09//%20Javascript's%20built-in%20Math.random().%0A%0A%20%20%09(function(global,%20module,%20define)%20%7B%0A%0A%20%20%09function%20XorGen(seed)%20%7B%0A%20%20%09%20%20var%20me%20=%20this;%0A%0A%20%20%09%20%20//%20Set%20up%20generator%20function.%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20w%20=%20me.w,%0A%20%20%09%20%20%20%20%20%20%20%20X%20=%20me.X,%20i%20=%20me.i,%20t,%20v;%0A%20%20%09%20%20%20%20//%20Update%20Weyl%20generator.%0A%20%20%09%20%20%20%20me.w%20=%20w%20=%20(w%20+%200x61c88647)%20%7C%200;%0A%20%20%09%20%20%20%20//%20Update%20xor%20generator.%0A%20%20%09%20%20%20%20v%20=%20X%5B(i%20+%2034)%20&%20127%5D;%0A%20%20%09%20%20%20%20t%20=%20X%5Bi%20=%20((i%20+%201)%20&%20127)%5D;%0A%20%20%09%20%20%20%20v%20%5E=%20v%20%3C%3C%2013;%0A%20%20%09%20%20%20%20t%20%5E=%20t%20%3C%3C%2017;%0A%20%20%09%20%20%20%20v%20%5E=%20v%20%3E%3E%3E%2015;%0A%20%20%09%20%20%20%20t%20%5E=%20t%20%3E%3E%3E%2012;%0A%20%20%09%20%20%20%20//%20Update%20Xor%20generator%20array%20state.%0A%20%20%09%20%20%20%20v%20=%20X%5Bi%5D%20=%20v%20%5E%20t;%0A%20%20%09%20%20%20%20me.i%20=%20i;%0A%20%20%09%20%20%20%20//%20Result%20is%20the%20combination.%0A%20%20%09%20%20%20%20return%20(v%20+%20(w%20%5E%20(w%20%3E%3E%3E%2016)))%20%7C%200;%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20function%20init(me,%20seed)%20%7B%0A%20%20%09%20%20%20%20var%20t,%20v,%20i,%20j,%20w,%20X%20=%20%5B%5D,%20limit%20=%20128;%0A%20%20%09%20%20%20%20if%20(seed%20===%20(seed%20%7C%200))%20%7B%0A%20%20%09%20%20%20%20%20%20//%20Numeric%20seeds%20initialize%20v,%20which%20is%20used%20to%20generates%20X.%0A%20%20%09%20%20%20%20%20%20v%20=%20seed;%0A%20%20%09%20%20%20%20%20%20seed%20=%20null;%0A%20%20%09%20%20%20%20%7D%20else%20%7B%0A%20%20%09%20%20%20%20%20%20//%20String%20seeds%20are%20mixed%20into%20v%20and%20X%20one%20character%20at%20a%20time.%0A%20%20%09%20%20%20%20%20%20seed%20=%20seed%20+%20'%5C0';%0A%20%20%09%20%20%20%20%20%20v%20=%200;%0A%20%20%09%20%20%20%20%20%20limit%20=%20Math.max(limit,%20seed.length);%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20//%20Initialize%20circular%20array%20and%20weyl%20value.%0A%20%20%09%20%20%20%20for%20(i%20=%200,%20j%20=%20-32;%20j%20%3C%20limit;%20++j)%20%7B%0A%20%20%09%20%20%20%20%20%20//%20Put%20the%20unicode%20characters%20into%20the%20array,%20and%20shuffle%20them.%0A%20%20%09%20%20%20%20%20%20if%20(seed)%20v%20%5E=%20seed.charCodeAt((j%20+%2032)%20%25%20seed.length);%0A%20%20%09%20%20%20%20%20%20//%20After%2032%20shuffles,%20take%20v%20as%20the%20starting%20w%20value.%0A%20%20%09%20%20%20%20%20%20if%20(j%20===%200)%20w%20=%20v;%0A%20%20%09%20%20%20%20%20%20v%20%5E=%20v%20%3C%3C%2010;%0A%20%20%09%20%20%20%20%20%20v%20%5E=%20v%20%3E%3E%3E%2015;%0A%20%20%09%20%20%20%20%20%20v%20%5E=%20v%20%3C%3C%204;%0A%20%20%09%20%20%20%20%20%20v%20%5E=%20v%20%3E%3E%3E%2013;%0A%20%20%09%20%20%20%20%20%20if%20(j%20%3E=%200)%20%7B%0A%20%20%09%20%20%20%20%20%20%20%20w%20=%20(w%20+%200x61c88647)%20%7C%200;%20%20%20%20%20//%20Weyl.%0A%20%20%09%20%20%20%20%20%20%20%20t%20=%20(X%5Bj%20&%20127%5D%20%5E=%20(v%20+%20w));%20%20//%20Combine%20xor%20and%20weyl%20to%20init%20array.%0A%20%20%09%20%20%20%20%20%20%20%20i%20=%20(0%20==%20t)%20?%20i%20+%201%20:%200;%20%20%20%20%20//%20Count%20zeroes.%0A%20%20%09%20%20%20%20%20%20%7D%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20//%20We%20have%20detected%20all%20zeroes;%20make%20the%20key%20nonzero.%0A%20%20%09%20%20%20%20if%20(i%20%3E=%20128)%20%7B%0A%20%20%09%20%20%20%20%20%20X%5B(seed%20&&%20seed.length%20%7C%7C%200)%20&%20127%5D%20=%20-1;%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20//%20Run%20the%20generator%20512%20times%20to%20further%20mix%20the%20state%20before%20using%20it.%0A%20%20%09%20%20%20%20//%20Factoring%20this%20as%20a%20function%20slows%20the%20main%20generator,%20so%20it%20is%20just%0A%20%20%09%20%20%20%20//%20unrolled%20here.%20%20The%20weyl%20generator%20is%20not%20advanced%20while%20warming%20up.%0A%20%20%09%20%20%20%20i%20=%20127;%0A%20%20%09%20%20%20%20for%20(j%20=%204%20*%20128;%20j%20%3E%200;%20--j)%20%7B%0A%20%20%09%20%20%20%20%20%20v%20=%20X%5B(i%20+%2034)%20&%20127%5D;%0A%20%20%09%20%20%20%20%20%20t%20=%20X%5Bi%20=%20((i%20+%201)%20&%20127)%5D;%0A%20%20%09%20%20%20%20%20%20v%20%5E=%20v%20%3C%3C%2013;%0A%20%20%09%20%20%20%20%20%20t%20%5E=%20t%20%3C%3C%2017;%0A%20%20%09%20%20%20%20%20%20v%20%5E=%20v%20%3E%3E%3E%2015;%0A%20%20%09%20%20%20%20%20%20t%20%5E=%20t%20%3E%3E%3E%2012;%0A%20%20%09%20%20%20%20%20%20X%5Bi%5D%20=%20v%20%5E%20t;%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20//%20Storing%20state%20as%20object%20members%20is%20faster%20than%20using%20closure%20variables.%0A%20%20%09%20%20%20%20me.w%20=%20w;%0A%20%20%09%20%20%20%20me.X%20=%20X;%0A%20%20%09%20%20%20%20me.i%20=%20i;%0A%20%20%09%20%20%7D%0A%0A%20%20%09%20%20init(me,%20seed);%0A%20%20%09%7D%0A%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.i%20=%20f.i;%0A%20%20%09%20%20t.w%20=%20f.w;%0A%20%20%09%20%20t.X%20=%20f.X.slice();%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%20%20%09function%20impl(seed,%20opts)%20%7B%0A%20%20%09%20%20if%20(seed%20==%20null)%20seed%20=%20+(new%20Date);%0A%20%20%09%20%20var%20xg%20=%20new%20XorGen(seed),%0A%20%20%09%20%20%20%20%20%20state%20=%20opts%20&&%20opts.state,%0A%20%20%09%20%20%20%20%20%20prng%20=%20function()%20%7B%20return%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000;%20%7D;%0A%20%20%09%20%20prng.double%20=%20function()%20%7B%0A%20%20%09%20%20%20%20do%20%7B%0A%20%20%09%20%20%20%20%20%20var%20top%20=%20xg.next()%20%3E%3E%3E%2011,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20bot%20=%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20result%20=%20(top%20+%20bot)%20/%20(1%20%3C%3C%2021);%0A%20%20%09%20%20%20%20%7D%20while%20(result%20===%200);%0A%20%20%09%20%20%20%20return%20result;%0A%20%20%09%20%20%7D;%0A%20%20%09%20%20prng.int32%20=%20xg.next;%0A%20%20%09%20%20prng.quick%20=%20prng;%0A%20%20%09%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20if%20(state.X)%20copy(state,%20xg);%0A%20%20%09%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(xg,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20prng;%0A%20%20%09%7D%0A%0A%20%20%09if%20(module%20&&%20module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20impl;%0A%20%20%09%7D%20else%20if%20(define%20&&%20define.amd)%20%7B%0A%20%20%09%20%20define(function()%20%7B%20return%20impl;%20%7D);%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20this.xor4096%20=%20impl;%0A%20%20%09%7D%0A%0A%20%20%09%7D)(%0A%20%20%09%20%20commonjsGlobal,%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20window%20object%20or%20global%0A%20%20%09%20%20module,%20%20%20%20//%20present%20in%20node.js%0A%20%20%09%20%20(typeof%20undefined)%20==%20'function'%20%20%20%20//%20present%20with%20an%20AMD%20loader%0A%20%20%09);%0A%20%20%7D%20(xor4096$1));%0A%0A%20%20var%20tychei$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09//%20A%20Javascript%20implementaion%20of%20the%20%22Tyche-i%22%20prng%20algorithm%20by%0A%20%20%09//%20Samuel%20Neves%20and%20Filipe%20Araujo.%0A%20%20%09//%20See%20https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf%0A%0A%20%20%09(function(global,%20module,%20define)%20%7B%0A%0A%20%20%09function%20XorGen(seed)%20%7B%0A%20%20%09%20%20var%20me%20=%20this,%20strseed%20=%20'';%0A%0A%20%20%09%20%20//%20Set%20up%20generator%20function.%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20b%20=%20me.b,%20c%20=%20me.c,%20d%20=%20me.d,%20a%20=%20me.a;%0A%20%20%09%20%20%20%20b%20=%20(b%20%3C%3C%2025)%20%5E%20(b%20%3E%3E%3E%207)%20%5E%20c;%0A%20%20%09%20%20%20%20c%20=%20(c%20-%20d)%20%7C%200;%0A%20%20%09%20%20%20%20d%20=%20(d%20%3C%3C%2024)%20%5E%20(d%20%3E%3E%3E%208)%20%5E%20a;%0A%20%20%09%20%20%20%20a%20=%20(a%20-%20b)%20%7C%200;%0A%20%20%09%20%20%20%20me.b%20=%20b%20=%20(b%20%3C%3C%2020)%20%5E%20(b%20%3E%3E%3E%2012)%20%5E%20c;%0A%20%20%09%20%20%20%20me.c%20=%20c%20=%20(c%20-%20d)%20%7C%200;%0A%20%20%09%20%20%20%20me.d%20=%20(d%20%3C%3C%2016)%20%5E%20(c%20%3E%3E%3E%2016)%20%5E%20a;%0A%20%20%09%20%20%20%20return%20me.a%20=%20(a%20-%20b)%20%7C%200;%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20/*%20The%20following%20is%20non-inverted%20tyche,%20which%20has%20better%20internal%0A%20%20%09%20%20%20*%20bit%20diffusion,%20but%20which%20is%20about%2025%25%20slower%20than%20tyche-i%20in%20JS.%0A%20%20%09%20%20me.next%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20a%20=%20me.a,%20b%20=%20me.b,%20c%20=%20me.c,%20d%20=%20me.d;%0A%20%20%09%20%20%20%20a%20=%20(me.a%20+%20me.b%20%7C%200)%20%3E%3E%3E%200;%0A%20%20%09%20%20%20%20d%20=%20me.d%20%5E%20a;%20d%20=%20d%20%3C%3C%2016%20%5E%20d%20%3E%3E%3E%2016;%0A%20%20%09%20%20%20%20c%20=%20me.c%20+%20d%20%7C%200;%0A%20%20%09%20%20%20%20b%20=%20me.b%20%5E%20c;%20b%20=%20b%20%3C%3C%2012%20%5E%20d%20%3E%3E%3E%2020;%0A%20%20%09%20%20%20%20me.a%20=%20a%20=%20a%20+%20b%20%7C%200;%0A%20%20%09%20%20%20%20d%20=%20d%20%5E%20a;%20me.d%20=%20d%20=%20d%20%3C%3C%208%20%5E%20d%20%3E%3E%3E%2024;%0A%20%20%09%20%20%20%20me.c%20=%20c%20=%20c%20+%20d%20%7C%200;%0A%20%20%09%20%20%20%20b%20=%20b%20%5E%20c;%0A%20%20%09%20%20%20%20return%20me.b%20=%20(b%20%3C%3C%207%20%5E%20b%20%3E%3E%3E%2025);%0A%20%20%09%20%20%7D%0A%20%20%09%20%20*/%0A%0A%20%20%09%20%20me.a%20=%200;%0A%20%20%09%20%20me.b%20=%200;%0A%20%20%09%20%20me.c%20=%202654435769%20%7C%200;%0A%20%20%09%20%20me.d%20=%201367130551;%0A%0A%20%20%09%20%20if%20(seed%20===%20Math.floor(seed))%20%7B%0A%20%20%09%20%20%20%20//%20Integer%20seed.%0A%20%20%09%20%20%20%20me.a%20=%20(seed%20/%200x100000000)%20%7C%200;%0A%20%20%09%20%20%20%20me.b%20=%20seed%20%7C%200;%0A%20%20%09%20%20%7D%20else%20%7B%0A%20%20%09%20%20%20%20//%20String%20seed.%0A%20%20%09%20%20%20%20strseed%20+=%20seed;%0A%20%20%09%20%20%7D%0A%0A%20%20%09%20%20//%20Mix%20in%20string%20seed,%20then%20discard%20an%20initial%20batch%20of%2064%20values.%0A%20%20%09%20%20for%20(var%20k%20=%200;%20k%20%3C%20strseed.length%20+%2020;%20k++)%20%7B%0A%20%20%09%20%20%20%20me.b%20%5E=%20strseed.charCodeAt(k)%20%7C%200;%0A%20%20%09%20%20%20%20me.next();%0A%20%20%09%20%20%7D%0A%20%20%09%7D%0A%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.a%20=%20f.a;%0A%20%20%09%20%20t.b%20=%20f.b;%0A%20%20%09%20%20t.c%20=%20f.c;%0A%20%20%09%20%20t.d%20=%20f.d;%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%20%20%09function%20impl(seed,%20opts)%20%7B%0A%20%20%09%20%20var%20xg%20=%20new%20XorGen(seed),%0A%20%20%09%20%20%20%20%20%20state%20=%20opts%20&&%20opts.state,%0A%20%20%09%20%20%20%20%20%20prng%20=%20function()%20%7B%20return%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000;%20%7D;%0A%20%20%09%20%20prng.double%20=%20function()%20%7B%0A%20%20%09%20%20%20%20do%20%7B%0A%20%20%09%20%20%20%20%20%20var%20top%20=%20xg.next()%20%3E%3E%3E%2011,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20bot%20=%20(xg.next()%20%3E%3E%3E%200)%20/%200x100000000,%0A%20%20%09%20%20%20%20%20%20%20%20%20%20result%20=%20(top%20+%20bot)%20/%20(1%20%3C%3C%2021);%0A%20%20%09%20%20%20%20%7D%20while%20(result%20===%200);%0A%20%20%09%20%20%20%20return%20result;%0A%20%20%09%20%20%7D;%0A%20%20%09%20%20prng.int32%20=%20xg.next;%0A%20%20%09%20%20prng.quick%20=%20prng;%0A%20%20%09%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20if%20(typeof(state)%20==%20'object')%20copy(state,%20xg);%0A%20%20%09%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(xg,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20prng;%0A%20%20%09%7D%0A%0A%20%20%09if%20(module%20&&%20module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20impl;%0A%20%20%09%7D%20else%20if%20(define%20&&%20define.amd)%20%7B%0A%20%20%09%20%20define(function()%20%7B%20return%20impl;%20%7D);%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20this.tychei%20=%20impl;%0A%20%20%09%7D%0A%0A%20%20%09%7D)(%0A%20%20%09%20%20commonjsGlobal,%0A%20%20%09%20%20module,%20%20%20%20//%20present%20in%20node.js%0A%20%20%09%20%20(typeof%20undefined)%20==%20'function'%20%20%20%20//%20present%20with%20an%20AMD%20loader%0A%20%20%09);%0A%20%20%7D%20(tychei$1));%0A%0A%20%20var%20seedrandom$1%20=%20%7Bexports:%20%7B%7D%7D;%0A%0A%20%20/*%0A%20%20Copyright%202019%20David%20Bau.%0A%0A%20%20Permission%20is%20hereby%20granted,%20free%20of%20charge,%20to%20any%20person%20obtaining%0A%20%20a%20copy%20of%20this%20software%20and%20associated%20documentation%20files%20(the%0A%20%20%22Software%22),%20to%20deal%20in%20the%20Software%20without%20restriction,%20including%0A%20%20without%20limitation%20the%20rights%20to%20use,%20copy,%20modify,%20merge,%20publish,%0A%20%20distribute,%20sublicense,%20and/or%20sell%20copies%20of%20the%20Software,%20and%20to%0A%20%20permit%20persons%20to%20whom%20the%20Software%20is%20furnished%20to%20do%20so,%20subject%20to%0A%20%20the%20following%20conditions:%0A%0A%20%20The%20above%20copyright%20notice%20and%20this%20permission%20notice%20shall%20be%0A%20%20included%20in%20all%20copies%20or%20substantial%20portions%20of%20the%20Software.%0A%0A%20%20THE%20SOFTWARE%20IS%20PROVIDED%20%22AS%20IS%22,%20WITHOUT%20WARRANTY%20OF%20ANY%20KIND,%0A%20%20EXPRESS%20OR%20IMPLIED,%20INCLUDING%20BUT%20NOT%20LIMITED%20TO%20THE%20WARRANTIES%20OF%0A%20%20MERCHANTABILITY,%20FITNESS%20FOR%20A%20PARTICULAR%20PURPOSE%20AND%20NONINFRINGEMENT.%0A%20%20IN%20NO%20EVENT%20SHALL%20THE%20AUTHORS%20OR%20COPYRIGHT%20HOLDERS%20BE%20LIABLE%20FOR%20ANY%0A%20%20CLAIM,%20DAMAGES%20OR%20OTHER%20LIABILITY,%20WHETHER%20IN%20AN%20ACTION%20OF%20CONTRACT,%0A%20%20TORT%20OR%20OTHERWISE,%20ARISING%20FROM,%20OUT%20OF%20OR%20IN%20CONNECTION%20WITH%20THE%0A%20%20SOFTWARE%20OR%20THE%20USE%20OR%20OTHER%20DEALINGS%20IN%20THE%20SOFTWARE.%0A%0A%20%20*/%0A%0A%20%20(function%20(module)%20%7B%0A%20%20%09(function%20(global,%20pool,%20math)%20%7B%0A%20%20%09//%0A%20%20%09//%20The%20following%20constants%20are%20related%20to%20IEEE%20754%20limits.%0A%20%20%09//%0A%0A%20%20%09var%20width%20=%20256,%20%20%20%20%20%20%20%20//%20each%20RC4%20output%20is%200%20%3C=%20x%20%3C%20256%0A%20%20%09%20%20%20%20chunks%20=%206,%20%20%20%20%20%20%20%20%20//%20at%20least%20six%20RC4%20outputs%20for%20each%20double%0A%20%20%09%20%20%20%20digits%20=%2052,%20%20%20%20%20%20%20%20//%20there%20are%2052%20significant%20digits%20in%20a%20double%0A%20%20%09%20%20%20%20rngname%20=%20'random',%20//%20rngname:%20name%20for%20Math.random%20and%20Math.seedrandom%0A%20%20%09%20%20%20%20startdenom%20=%20math.pow(width,%20chunks),%0A%20%20%09%20%20%20%20significance%20=%20math.pow(2,%20digits),%0A%20%20%09%20%20%20%20overflow%20=%20significance%20*%202,%0A%20%20%09%20%20%20%20mask%20=%20width%20-%201,%0A%20%20%09%20%20%20%20nodecrypto;%20%20%20%20%20%20%20%20%20//%20node.js%20crypto%20module,%20initialized%20at%20the%20bottom.%0A%0A%20%20%09//%0A%20%20%09//%20seedrandom()%0A%20%20%09//%20This%20is%20the%20seedrandom%20function%20described%20above.%0A%20%20%09//%0A%20%20%09function%20seedrandom(seed,%20options,%20callback)%20%7B%0A%20%20%09%20%20var%20key%20=%20%5B%5D;%0A%20%20%09%20%20options%20=%20(options%20==%20true)%20?%20%7B%20entropy:%20true%20%7D%20:%20(options%20%7C%7C%20%7B%7D);%0A%0A%20%20%09%20%20//%20Flatten%20the%20seed%20string%20or%20build%20one%20from%20local%20entropy%20if%20needed.%0A%20%20%09%20%20var%20shortseed%20=%20mixkey(flatten(%0A%20%20%09%20%20%20%20options.entropy%20?%20%5Bseed,%20tostring(pool)%5D%20:%0A%20%20%09%20%20%20%20(seed%20==%20null)%20?%20autoseed()%20:%20seed,%203),%20key);%0A%0A%20%20%09%20%20//%20Use%20the%20seed%20to%20initialize%20an%20ARC4%20generator.%0A%20%20%09%20%20var%20arc4%20=%20new%20ARC4(key);%0A%0A%20%20%09%20%20//%20This%20function%20returns%20a%20random%20double%20in%20%5B0,%201)%20that%20contains%0A%20%20%09%20%20//%20randomness%20in%20every%20bit%20of%20the%20mantissa%20of%20the%20IEEE%20754%20value.%0A%20%20%09%20%20var%20prng%20=%20function()%20%7B%0A%20%20%09%20%20%20%20var%20n%20=%20arc4.g(chunks),%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Start%20with%20a%20numerator%20n%20%3C%202%20%5E%2048%0A%20%20%09%20%20%20%20%20%20%20%20d%20=%20startdenom,%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20and%20denominator%20d%20=%202%20%5E%2048.%0A%20%20%09%20%20%20%20%20%20%20%20x%20=%200;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20and%20no%20'extra%20last%20byte'.%0A%20%20%09%20%20%20%20while%20(n%20%3C%20significance)%20%7B%20%20%20%20%20%20%20%20%20%20//%20Fill%20up%20all%20significant%20digits%20by%0A%20%20%09%20%20%20%20%20%20n%20=%20(n%20+%20x)%20*%20width;%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20shifting%20numerator%20and%0A%20%20%09%20%20%20%20%20%20d%20*=%20width;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20denominator%20and%20generating%20a%0A%20%20%09%20%20%20%20%20%20x%20=%20arc4.g(1);%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20new%20least-significant-byte.%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20while%20(n%20%3E=%20overflow)%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20//%20To%20avoid%20rounding%20up,%20before%20adding%0A%20%20%09%20%20%20%20%20%20n%20/=%202;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20last%20byte,%20shift%20everything%0A%20%20%09%20%20%20%20%20%20d%20/=%202;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20right%20using%20integer%20math%20until%0A%20%20%09%20%20%20%20%20%20x%20%3E%3E%3E=%201;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%20%20we%20have%20exactly%20the%20desired%20bits.%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20return%20(n%20+%20x)%20/%20d;%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Form%20the%20number%20within%20%5B0,%201).%0A%20%20%09%20%20%7D;%0A%0A%20%20%09%20%20prng.int32%20=%20function()%20%7B%20return%20arc4.g(4)%20%7C%200;%20%7D;%0A%20%20%09%20%20prng.quick%20=%20function()%20%7B%20return%20arc4.g(4)%20/%200x100000000;%20%7D;%0A%20%20%09%20%20prng.double%20=%20prng;%0A%0A%20%20%09%20%20//%20Mix%20the%20randomness%20into%20accumulated%20entropy.%0A%20%20%09%20%20mixkey(tostring(arc4.S),%20pool);%0A%0A%20%20%09%20%20//%20Calling%20convention:%20what%20to%20return%20as%20a%20function%20of%20prng,%20seed,%20is_math.%0A%20%20%09%20%20return%20(options.pass%20%7C%7C%20callback%20%7C%7C%0A%20%20%09%20%20%20%20%20%20function(prng,%20seed,%20is_math_call,%20state)%20%7B%0A%20%20%09%20%20%20%20%20%20%20%20if%20(state)%20%7B%0A%20%20%09%20%20%20%20%20%20%20%20%20%20//%20Load%20the%20arc4%20state%20from%20the%20given%20state%20if%20it%20has%20an%20S%20array.%0A%20%20%09%20%20%20%20%20%20%20%20%20%20if%20(state.S)%20%7B%20copy(state,%20arc4);%20%7D%0A%20%20%09%20%20%20%20%20%20%20%20%20%20//%20Only%20provide%20the%20.state%20method%20if%20requested%20via%20options.state.%0A%20%20%09%20%20%20%20%20%20%20%20%20%20prng.state%20=%20function()%20%7B%20return%20copy(arc4,%20%7B%7D);%20%7D;%0A%20%20%09%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%09%20%20%20%20%20%20%20%20//%20If%20called%20as%20a%20method%20of%20Math%20(Math.seedrandom()),%20mutate%0A%20%20%09%20%20%20%20%20%20%20%20//%20Math.random%20because%20that%20is%20how%20seedrandom.js%20has%20worked%20since%20v1.0.%0A%20%20%09%20%20%20%20%20%20%20%20if%20(is_math_call)%20%7B%20math%5Brngname%5D%20=%20prng;%20return%20seed;%20%7D%0A%0A%20%20%09%20%20%20%20%20%20%20%20//%20Otherwise,%20it%20is%20a%20newer%20calling%20convention,%20so%20return%20the%0A%20%20%09%20%20%20%20%20%20%20%20//%20prng%20directly.%0A%20%20%09%20%20%20%20%20%20%20%20else%20return%20prng;%0A%20%20%09%20%20%20%20%20%20%7D)(%0A%20%20%09%20%20prng,%0A%20%20%09%20%20shortseed,%0A%20%20%09%20%20'global'%20in%20options%20?%20options.global%20:%20(this%20==%20math),%0A%20%20%09%20%20options.state);%0A%20%20%09%7D%0A%0A%20%20%09//%0A%20%20%09//%20ARC4%0A%20%20%09//%0A%20%20%09//%20An%20ARC4%20implementation.%20%20The%20constructor%20takes%20a%20key%20in%20the%20form%20of%0A%20%20%09//%20an%20array%20of%20at%20most%20(width)%20integers%20that%20should%20be%200%20%3C=%20x%20%3C%20(width).%0A%20%20%09//%0A%20%20%09//%20The%20g(count)%20method%20returns%20a%20pseudorandom%20integer%20that%20concatenates%0A%20%20%09//%20the%20next%20(count)%20outputs%20from%20ARC4.%20%20Its%20return%20value%20is%20a%20number%20x%0A%20%20%09//%20that%20is%20in%20the%20range%200%20%3C=%20x%20%3C%20(width%20%5E%20count).%0A%20%20%09//%0A%20%20%09function%20ARC4(key)%20%7B%0A%20%20%09%20%20var%20t,%20keylen%20=%20key.length,%0A%20%20%09%20%20%20%20%20%20me%20=%20this,%20i%20=%200,%20j%20=%20me.i%20=%20me.j%20=%200,%20s%20=%20me.S%20=%20%5B%5D;%0A%0A%20%20%09%20%20//%20The%20empty%20key%20%5B%5D%20is%20treated%20as%20%5B0%5D.%0A%20%20%09%20%20if%20(!keylen)%20%7B%20key%20=%20%5Bkeylen++%5D;%20%7D%0A%0A%20%20%09%20%20//%20Set%20up%20S%20using%20the%20standard%20key%20scheduling%20algorithm.%0A%20%20%09%20%20while%20(i%20%3C%20width)%20%7B%0A%20%20%09%20%20%20%20s%5Bi%5D%20=%20i++;%0A%20%20%09%20%20%7D%0A%20%20%09%20%20for%20(i%20=%200;%20i%20%3C%20width;%20i++)%20%7B%0A%20%20%09%20%20%20%20s%5Bi%5D%20=%20s%5Bj%20=%20mask%20&%20(j%20+%20key%5Bi%20%25%20keylen%5D%20+%20(t%20=%20s%5Bi%5D))%5D;%0A%20%20%09%20%20%20%20s%5Bj%5D%20=%20t;%0A%20%20%09%20%20%7D%0A%0A%20%20%09%20%20//%20The%20%22g%22%20method%20returns%20the%20next%20(count)%20outputs%20as%20one%20number.%0A%20%20%09%20%20(me.g%20=%20function(count)%20%7B%0A%20%20%09%20%20%20%20//%20Using%20instance%20members%20instead%20of%20closure%20state%20nearly%20doubles%20speed.%0A%20%20%09%20%20%20%20var%20t,%20r%20=%200,%0A%20%20%09%20%20%20%20%20%20%20%20i%20=%20me.i,%20j%20=%20me.j,%20s%20=%20me.S;%0A%20%20%09%20%20%20%20while%20(count--)%20%7B%0A%20%20%09%20%20%20%20%20%20t%20=%20s%5Bi%20=%20mask%20&%20(i%20+%201)%5D;%0A%20%20%09%20%20%20%20%20%20r%20=%20r%20*%20width%20+%20s%5Bmask%20&%20((s%5Bi%5D%20=%20s%5Bj%20=%20mask%20&%20(j%20+%20t)%5D)%20+%20(s%5Bj%5D%20=%20t))%5D;%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20me.i%20=%20i;%20me.j%20=%20j;%0A%20%20%09%20%20%20%20return%20r;%0A%20%20%09%20%20%20%20//%20For%20robust%20unpredictability,%20the%20function%20call%20below%20automatically%0A%20%20%09%20%20%20%20//%20discards%20an%20initial%20batch%20of%20values.%20%20This%20is%20called%20RC4-drop%5B256%5D.%0A%20%20%09%20%20%20%20//%20See%20http://google.com/search?q=rsa+fluhrer+response&btnI%0A%20%20%09%20%20%7D)(width);%0A%20%20%09%7D%0A%0A%20%20%09//%0A%20%20%09//%20copy()%0A%20%20%09//%20Copies%20internal%20state%20of%20ARC4%20to%20or%20from%20a%20plain%20object.%0A%20%20%09//%0A%20%20%09function%20copy(f,%20t)%20%7B%0A%20%20%09%20%20t.i%20=%20f.i;%0A%20%20%09%20%20t.j%20=%20f.j;%0A%20%20%09%20%20t.S%20=%20f.S.slice();%0A%20%20%09%20%20return%20t;%0A%20%20%09%7D%0A%20%20%09//%0A%20%20%09//%20flatten()%0A%20%20%09//%20Converts%20an%20object%20tree%20to%20nested%20arrays%20of%20strings.%0A%20%20%09//%0A%20%20%09function%20flatten(obj,%20depth)%20%7B%0A%20%20%09%20%20var%20result%20=%20%5B%5D,%20typ%20=%20(typeof%20obj),%20prop;%0A%20%20%09%20%20if%20(depth%20&&%20typ%20==%20'object')%20%7B%0A%20%20%09%20%20%20%20for%20(prop%20in%20obj)%20%7B%0A%20%20%09%20%20%20%20%20%20try%20%7B%20result.push(flatten(obj%5Bprop%5D,%20depth%20-%201));%20%7D%20catch%20(e)%20%7B%7D%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20(result.length%20?%20result%20:%20typ%20==%20'string'%20?%20obj%20:%20obj%20+%20'%5C0');%0A%20%20%09%7D%0A%0A%20%20%09//%0A%20%20%09//%20mixkey()%0A%20%20%09//%20Mixes%20a%20string%20seed%20into%20a%20key%20that%20is%20an%20array%20of%20integers,%20and%0A%20%20%09//%20returns%20a%20shortened%20string%20seed%20that%20is%20equivalent%20to%20the%20result%20key.%0A%20%20%09//%0A%20%20%09function%20mixkey(seed,%20key)%20%7B%0A%20%20%09%20%20var%20stringseed%20=%20seed%20+%20'',%20smear,%20j%20=%200;%0A%20%20%09%20%20while%20(j%20%3C%20stringseed.length)%20%7B%0A%20%20%09%20%20%20%20key%5Bmask%20&%20j%5D%20=%0A%20%20%09%20%20%20%20%20%20mask%20&%20((smear%20%5E=%20key%5Bmask%20&%20j%5D%20*%2019)%20+%20stringseed.charCodeAt(j++));%0A%20%20%09%20%20%7D%0A%20%20%09%20%20return%20tostring(key);%0A%20%20%09%7D%0A%0A%20%20%09//%0A%20%20%09//%20autoseed()%0A%20%20%09//%20Returns%20an%20object%20for%20autoseeding,%20using%20window.crypto%20and%20Node%20crypto%0A%20%20%09//%20module%20if%20available.%0A%20%20%09//%0A%20%20%09function%20autoseed()%20%7B%0A%20%20%09%20%20try%20%7B%0A%20%20%09%20%20%20%20var%20out;%0A%20%20%09%20%20%20%20if%20(nodecrypto%20&&%20(out%20=%20nodecrypto.randomBytes))%20%7B%0A%20%20%09%20%20%20%20%20%20//%20The%20use%20of%20'out'%20to%20remember%20randomBytes%20makes%20tight%20minified%20code.%0A%20%20%09%20%20%20%20%20%20out%20=%20out(width);%0A%20%20%09%20%20%20%20%7D%20else%20%7B%0A%20%20%09%20%20%20%20%20%20out%20=%20new%20Uint8Array(width);%0A%20%20%09%20%20%20%20%20%20(global.crypto%20%7C%7C%20global.msCrypto).getRandomValues(out);%0A%20%20%09%20%20%20%20%7D%0A%20%20%09%20%20%20%20return%20tostring(out);%0A%20%20%09%20%20%7D%20catch%20(e)%20%7B%0A%20%20%09%20%20%20%20var%20browser%20=%20global.navigator,%0A%20%20%09%20%20%20%20%20%20%20%20plugins%20=%20browser%20&&%20browser.plugins;%0A%20%20%09%20%20%20%20return%20%5B+new%20Date,%20global,%20plugins,%20global.screen,%20tostring(pool)%5D;%0A%20%20%09%20%20%7D%0A%20%20%09%7D%0A%0A%20%20%09//%0A%20%20%09//%20tostring()%0A%20%20%09//%20Converts%20an%20array%20of%20charcodes%20to%20a%20string%0A%20%20%09//%0A%20%20%09function%20tostring(a)%20%7B%0A%20%20%09%20%20return%20String.fromCharCode.apply(0,%20a);%0A%20%20%09%7D%0A%0A%20%20%09//%0A%20%20%09//%20When%20seedrandom.js%20is%20loaded,%20we%20immediately%20mix%20a%20few%20bits%0A%20%20%09//%20from%20the%20built-in%20RNG%20into%20the%20entropy%20pool.%20%20Because%20we%20do%0A%20%20%09//%20not%20want%20to%20interfere%20with%20deterministic%20PRNG%20state%20later,%0A%20%20%09//%20seedrandom%20will%20not%20call%20math.random%20on%20its%20own%20again%20after%0A%20%20%09//%20initialization.%0A%20%20%09//%0A%20%20%09mixkey(math.random(),%20pool);%0A%0A%20%20%09//%0A%20%20%09//%20Nodejs%20and%20AMD%20support:%20export%20the%20implementation%20as%20a%20module%20using%0A%20%20%09//%20either%20convention.%0A%20%20%09//%0A%20%20%09if%20(module.exports)%20%7B%0A%20%20%09%20%20module.exports%20=%20seedrandom;%0A%20%20%09%20%20//%20When%20in%20node.js,%20try%20using%20crypto%20package%20for%20autoseeding.%0A%20%20%09%20%20try%20%7B%0A%20%20%09%20%20%20%20nodecrypto%20=%20require('crypto');%0A%20%20%09%20%20%7D%20catch%20(ex)%20%7B%7D%0A%20%20%09%7D%20else%20%7B%0A%20%20%09%20%20//%20When%20included%20as%20a%20plain%20script,%20set%20up%20Math.seedrandom%20global.%0A%20%20%09%20%20math%5B'seed'%20+%20rngname%5D%20=%20seedrandom;%0A%20%20%09%7D%0A%0A%0A%20%20%09//%20End%20anonymous%20scope,%20and%20pass%20initial%20values.%0A%20%20%09%7D)(%0A%20%20%09%20%20//%20global:%20%60self%60%20in%20browsers%20(including%20strict%20mode%20and%20web%20workers),%0A%20%20%09%20%20//%20otherwise%20%60this%60%20in%20Node%20and%20other%20environments%0A%20%20%09%20%20(typeof%20self%20!==%20'undefined')%20?%20self%20:%20commonjsGlobal,%0A%20%20%09%20%20%5B%5D,%20%20%20%20%20//%20pool:%20entropy%20pool%20starts%20empty%0A%20%20%09%20%20Math%20%20%20%20//%20math:%20package%20containing%20random,%20pow,%20and%20seedrandom%0A%20%20%09);%0A%20%20%7D%20(seedrandom$1));%0A%0A%20%20//%20A%20library%20of%20seedable%20RNGs%20implemented%20in%20Javascript.%0A%20%20//%0A%20%20//%20Usage:%0A%20%20//%0A%20%20//%20var%20seedrandom%20=%20require('seedrandom');%0A%20%20//%20var%20random%20=%20seedrandom(1);%20//%20or%20any%20seed.%0A%20%20//%20var%20x%20=%20random();%20%20%20%20%20%20%20//%200%20%3C=%20x%20%3C%201.%20%20Every%20bit%20is%20random.%0A%20%20//%20var%20x%20=%20random.quick();%20//%200%20%3C=%20x%20%3C%201.%20%2032%20bits%20of%20randomness.%0A%0A%20%20//%20alea,%20a%2053-bit%20multiply-with-carry%20generator%20by%20Johannes%20Baag%C3%B8e.%0A%20%20//%20Period:%20~2%5E116%0A%20%20//%20Reported%20to%20pass%20all%20BigCrush%20tests.%0A%20%20var%20alea%20=%20alea$1.exports;%0A%0A%20%20//%20xor128,%20a%20pure%20xor-shift%20generator%20by%20George%20Marsaglia.%0A%20%20//%20Period:%202%5E128-1.%0A%20%20//%20Reported%20to%20fail:%20MatrixRank%20and%20LinearComp.%0A%20%20var%20xor128%20=%20xor128$1.exports;%0A%0A%20%20//%20xorwow,%20George%20Marsaglia's%20160-bit%20xor-shift%20combined%20plus%20weyl.%0A%20%20//%20Period:%202%5E192-2%5E32%0A%20%20//%20Reported%20to%20fail:%20CollisionOver,%20SimpPoker,%20and%20LinearComp.%0A%20%20var%20xorwow%20=%20xorwow$1.exports;%0A%0A%20%20//%20xorshift7,%20by%20Fran%C3%A7ois%20Panneton%20and%20Pierre%20L'ecuyer,%20takes%0A%20%20//%20a%20different%20approach:%20it%20adds%20robustness%20by%20allowing%20more%20shifts%0A%20%20//%20than%20Marsaglia's%20original%20three.%20%20It%20is%20a%207-shift%20generator%0A%20%20//%20with%20256%20bits,%20that%20passes%20BigCrush%20with%20no%20systmatic%20failures.%0A%20%20//%20Period%202%5E256-1.%0A%20%20//%20No%20systematic%20BigCrush%20failures%20reported.%0A%20%20var%20xorshift7%20=%20xorshift7$1.exports;%0A%0A%20%20//%20xor4096,%20by%20Richard%20Brent,%20is%20a%204096-bit%20xor-shift%20with%20a%0A%20%20//%20very%20long%20period%20that%20also%20adds%20a%20Weyl%20generator.%20It%20also%20passes%0A%20%20//%20BigCrush%20with%20no%20systematic%20failures.%20%20Its%20long%20period%20may%0A%20%20//%20be%20useful%20if%20you%20have%20many%20generators%20and%20need%20to%20avoid%0A%20%20//%20collisions.%0A%20%20//%20Period:%202%5E4128-2%5E32.%0A%20%20//%20No%20systematic%20BigCrush%20failures%20reported.%0A%20%20var%20xor4096%20=%20xor4096$1.exports;%0A%0A%20%20//%20Tyche-i,%20by%20Samuel%20Neves%20and%20Filipe%20Araujo,%20is%20a%20bit-shifting%20random%0A%20%20//%20number%20generator%20derived%20from%20ChaCha,%20a%20modern%20stream%20cipher.%0A%20%20//%20https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf%0A%20%20//%20Period:%20~2%5E127%0A%20%20//%20No%20systematic%20BigCrush%20failures%20reported.%0A%20%20var%20tychei%20=%20tychei$1.exports;%0A%0A%20%20//%20The%20original%20ARC4-based%20prng%20included%20in%20this%20library.%0A%20%20//%20Period:%20~2%5E1600%0A%20%20var%20sr%20=%20seedrandom$1.exports;%0A%0A%20%20sr.alea%20=%20alea;%0A%20%20sr.xor128%20=%20xor128;%0A%20%20sr.xorwow%20=%20xorwow;%0A%20%20sr.xorshift7%20=%20xorshift7;%0A%20%20sr.xor4096%20=%20xor4096;%0A%20%20sr.tychei%20=%20tychei;%0A%0A%20%20var%20seedrandom%20=%20sr;%0A%0A%20%20/**%0A%20%20%20*%20@param%20%7BHTMLCanvasElement%7D%20canvas%0A%20%20%20*%20@param%20%7Bstring%7D%20domainKey%0A%20%20%20*%20@param%20%7Bstring%7D%20sessionKey%0A%20%20%20*%20@param%20%7Bany%7D%20getImageDataProxy%0A%20%20%20*%20@param%20%7BCanvasRenderingContext2D%20%7C%20WebGL2RenderingContext%20%7C%20WebGLRenderingContext%7D%20ctx?%0A%20%20%20*/%0A%20%20function%20computeOffScreenCanvas%20(canvas,%20domainKey,%20sessionKey,%20getImageDataProxy,%20ctx)%20%7B%0A%20%20%20%20%20%20if%20(!ctx)%20%7B%0A%20%20%20%20%20%20%20%20%20%20ctx%20=%20canvas.getContext('2d');%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20Make%20a%20off-screen%20canvas%20and%20put%20the%20data%20there%0A%20%20%20%20%20%20const%20offScreenCanvas%20=%20document.createElement('canvas');%0A%20%20%20%20%20%20offScreenCanvas.width%20=%20canvas.width;%0A%20%20%20%20%20%20offScreenCanvas.height%20=%20canvas.height;%0A%20%20%20%20%20%20const%20offScreenCtx%20=%20offScreenCanvas.getContext('2d');%0A%0A%20%20%20%20%20%20let%20rasterizedCtx%20=%20ctx;%0A%20%20%20%20%20%20//%20If%20we're%20not%20a%202d%20canvas%20we%20need%20to%20rasterise%20first%20into%202d%0A%20%20%20%20%20%20const%20rasterizeToCanvas%20=%20!(ctx%20instanceof%20CanvasRenderingContext2D);%0A%20%20%20%20%20%20if%20(rasterizeToCanvas)%20%7B%0A%20%20%20%20%20%20%20%20%20%20rasterizedCtx%20=%20offScreenCtx;%0A%20%20%20%20%20%20%20%20%20%20offScreenCtx.drawImage(canvas,%200,%200);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20We%20*always*%20compute%20the%20random%20pixels%20on%20the%20complete%20pixel%20set,%20then%20pass%20back%20the%20subset%20later%0A%20%20%20%20%20%20let%20imageData%20=%20getImageDataProxy._native.apply(rasterizedCtx,%20%5B0,%200,%20canvas.width,%20canvas.height%5D);%0A%20%20%20%20%20%20imageData%20=%20modifyPixelData(imageData,%20sessionKey,%20domainKey,%20canvas.width);%0A%0A%20%20%20%20%20%20if%20(rasterizeToCanvas)%20%7B%0A%20%20%20%20%20%20%20%20%20%20clearCanvas(offScreenCtx);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20offScreenCtx.putImageData(imageData,%200,%200);%0A%0A%20%20%20%20%20%20return%20%7B%20offScreenCanvas,%20offScreenCtx%20%7D%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Clears%20the%20pixels%20from%20the%20canvas%20context%0A%20%20%20*%0A%20%20%20*%20@param%20%7BCanvasRenderingContext2D%7D%20canvasContext%0A%20%20%20*/%0A%20%20function%20clearCanvas%20(canvasContext)%20%7B%0A%20%20%20%20%20%20//%20Save%20state%20and%20clean%20the%20pixels%20from%20the%20canvas%0A%20%20%20%20%20%20canvasContext.save();%0A%20%20%20%20%20%20canvasContext.globalCompositeOperation%20=%20'destination-out';%0A%20%20%20%20%20%20canvasContext.fillStyle%20=%20'rgb(255,255,255)';%0A%20%20%20%20%20%20canvasContext.fillRect(0,%200,%20canvasContext.canvas.width,%20canvasContext.canvas.height);%0A%20%20%20%20%20%20canvasContext.restore();%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20@param%20%7BImageData%7D%20imageData%0A%20%20%20*%20@param%20%7Bstring%7D%20sessionKey%0A%20%20%20*%20@param%20%7Bstring%7D%20domainKey%0A%20%20%20*%20@param%20%7Bnumber%7D%20width%0A%20%20%20*/%0A%20%20function%20modifyPixelData%20(imageData,%20domainKey,%20sessionKey,%20width)%20%7B%0A%20%20%20%20%20%20const%20d%20=%20imageData.data;%0A%20%20%20%20%20%20const%20length%20=%20d.length%20/%204;%0A%20%20%20%20%20%20let%20checkSum%20=%200;%0A%20%20%20%20%20%20const%20mappingArray%20=%20%5B%5D;%0A%20%20%20%20%20%20for%20(let%20i%20=%200;%20i%20%3C%20length;%20i%20+=%204)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(!shouldIgnorePixel(d,%20i)%20&&%20!adjacentSame(d,%20i,%20width))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20mappingArray.push(i);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20checkSum%20+=%20d%5Bi%5D%20+%20d%5Bi%20+%201%5D%20+%20d%5Bi%20+%202%5D%20+%20d%5Bi%20+%203%5D;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20windowHash%20=%20getDataKeySync(sessionKey,%20domainKey,%20checkSum);%0A%20%20%20%20%20%20const%20rng%20=%20new%20seedrandom(windowHash);%0A%20%20%20%20%20%20for%20(let%20i%20=%200;%20i%20%3C%20mappingArray.length;%20i++)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20rand%20=%20rng();%0A%20%20%20%20%20%20%20%20%20%20const%20byte%20=%20Math.floor(rand%20*%2010);%0A%20%20%20%20%20%20%20%20%20%20const%20channel%20=%20byte%20%25%203;%0A%20%20%20%20%20%20%20%20%20%20const%20pixelCanvasIndex%20=%20mappingArray%5Bi%5D%20+%20channel;%0A%0A%20%20%20%20%20%20%20%20%20%20d%5BpixelCanvasIndex%5D%20=%20d%5BpixelCanvasIndex%5D%20%5E%20(byte%20&%200x1);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20return%20imageData%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Ignore%20pixels%20that%20have%20neighbours%20that%20are%20the%20same%0A%20%20%20*%0A%20%20%20*%20@param%20%7BUint8ClampedArray%7D%20imageData%0A%20%20%20*%20@param%20%7Bnumber%7D%20index%0A%20%20%20*%20@param%20%7Bnumber%7D%20width%0A%20%20%20*/%0A%20%20function%20adjacentSame%20(imageData,%20index,%20width)%20%7B%0A%20%20%20%20%20%20const%20widthPixel%20=%20width%20*%204;%0A%20%20%20%20%20%20const%20x%20=%20index%20%25%20widthPixel;%0A%20%20%20%20%20%20const%20maxLength%20=%20imageData.length;%0A%0A%20%20%20%20%20%20//%20Pixels%20not%20on%20the%20right%20border%20of%20the%20canvas%0A%20%20%20%20%20%20if%20(x%20%3C%20widthPixel)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20right%20=%20index%20+%204;%0A%20%20%20%20%20%20%20%20%20%20if%20(!pixelsSame(imageData,%20index,%20right))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20const%20diagonalRightUp%20=%20right%20-%20widthPixel;%0A%20%20%20%20%20%20%20%20%20%20if%20(diagonalRightUp%20%3E%200%20&&%20!pixelsSame(imageData,%20index,%20diagonalRightUp))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20const%20diagonalRightDown%20=%20right%20+%20widthPixel;%0A%20%20%20%20%20%20%20%20%20%20if%20(diagonalRightDown%20%3C%20maxLength%20&&%20!pixelsSame(imageData,%20index,%20diagonalRightDown))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20Pixels%20not%20on%20the%20left%20border%20of%20the%20canvas%0A%20%20%20%20%20%20if%20(x%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20left%20=%20index%20-%204;%0A%20%20%20%20%20%20%20%20%20%20if%20(!pixelsSame(imageData,%20index,%20left))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20const%20diagonalLeftUp%20=%20left%20-%20widthPixel;%0A%20%20%20%20%20%20%20%20%20%20if%20(diagonalLeftUp%20%3E%200%20&&%20!pixelsSame(imageData,%20index,%20diagonalLeftUp))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20const%20diagonalLeftDown%20=%20left%20+%20widthPixel;%0A%20%20%20%20%20%20%20%20%20%20if%20(diagonalLeftDown%20%3C%20maxLength%20&&%20!pixelsSame(imageData,%20index,%20diagonalLeftDown))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20up%20=%20index%20-%20widthPixel;%0A%20%20%20%20%20%20if%20(up%20%3E%200%20&&%20!pixelsSame(imageData,%20index,%20up))%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20down%20=%20index%20+%20widthPixel;%0A%20%20%20%20%20%20if%20(down%20%3C%20maxLength%20&&%20!pixelsSame(imageData,%20index,%20down))%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20false%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20return%20true%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Check%20that%20a%20pixel%20at%20index%20and%20index2%20match%20all%20channels%0A%20%20%20*%20@param%20%7BUint8ClampedArray%7D%20imageData%0A%20%20%20*%20@param%20%7Bnumber%7D%20index%0A%20%20%20*%20@param%20%7Bnumber%7D%20index2%0A%20%20%20*/%0A%20%20function%20pixelsSame%20(imageData,%20index,%20index2)%20%7B%0A%20%20%20%20%20%20return%20imageData%5Bindex%5D%20===%20imageData%5Bindex2%5D%20&&%0A%20%20%20%20%20%20%20%20%20%20%20%20%20imageData%5Bindex%20+%201%5D%20===%20imageData%5Bindex2%20+%201%5D%20&&%0A%20%20%20%20%20%20%20%20%20%20%20%20%20imageData%5Bindex%20+%202%5D%20===%20imageData%5Bindex2%20+%202%5D%20&&%0A%20%20%20%20%20%20%20%20%20%20%20%20%20imageData%5Bindex%20+%203%5D%20===%20imageData%5Bindex2%20+%203%5D%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Returns%20true%20if%20pixel%20should%20be%20ignored%0A%20%20%20*%20@param%20%7BUint8ClampedArray%7D%20imageData%0A%20%20%20*%20@param%20%7Bnumber%7D%20index%0A%20%20%20*%20@returns%20%7Bboolean%7D%0A%20%20%20*/%0A%20%20function%20shouldIgnorePixel%20(imageData,%20index)%20%7B%0A%20%20%20%20%20%20//%20Transparent%20pixels%0A%20%20%20%20%20%20if%20(imageData%5Bindex%20+%203%5D%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20true%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20false%0A%20%20%7D%0A%0A%20%20function%20init$9%20(args)%20%7B%0A%20%20%20%20%20%20const%20%7B%20sessionKey,%20site%20%7D%20=%20args;%0A%20%20%20%20%20%20const%20domainKey%20=%20site.domain;%0A%20%20%20%20%20%20const%20featureName%20=%20'fingerprinting-canvas';%0A%20%20%20%20%20%20const%20supportsWebGl%20=%20getFeatureSettingEnabled(featureName,%20args,%20'webGl');%0A%0A%20%20%20%20%20%20const%20unsafeCanvases%20=%20new%20WeakSet();%0A%20%20%20%20%20%20const%20canvasContexts%20=%20new%20WeakMap();%0A%20%20%20%20%20%20const%20canvasCache%20=%20new%20WeakMap();%0A%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Clear%20cache%20as%20canvas%20has%20changed%0A%20%20%20%20%20%20%20*%20@param%20%7BHTMLCanvasElement%7D%20canvas%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20function%20clearCache%20(canvas)%20%7B%0A%20%20%20%20%20%20%20%20%20%20canvasCache.delete(canvas);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20@param%20%7BHTMLCanvasElement%7D%20canvas%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20function%20treatAsUnsafe%20(canvas)%20%7B%0A%20%20%20%20%20%20%20%20%20%20unsafeCanvases.add(canvas);%0A%20%20%20%20%20%20%20%20%20%20clearCache(canvas);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20proxy%20=%20new%20DDGProxy(featureName,%20HTMLCanvasElement.prototype,%20'getContext',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20context%20=%20DDGReflect.apply(target,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20canvasContexts.set(thisArg,%20context);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20context%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20proxy.overload();%0A%0A%20%20%20%20%20%20//%20Known%20data%20methods%0A%20%20%20%20%20%20const%20safeMethods%20=%20%5B'putImageData',%20'drawImage'%5D;%0A%20%20%20%20%20%20for%20(const%20methodName%20of%20safeMethods)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20safeMethodProxy%20=%20new%20DDGProxy(featureName,%20CanvasRenderingContext2D.prototype,%20methodName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Don't%20apply%20escape%20hatch%20for%20canvases%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(methodName%20===%20'drawImage'%20&&%20args%5B0%5D%20&&%20args%5B0%5D%20instanceof%20HTMLCanvasElement)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20treatAsUnsafe(args%5B0%5D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20clearCache(thisArg.canvas);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20safeMethodProxy.overload();%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20unsafeMethods%20=%20%5B%0A%20%20%20%20%20%20%20%20%20%20'strokeRect',%0A%20%20%20%20%20%20%20%20%20%20'bezierCurveTo',%0A%20%20%20%20%20%20%20%20%20%20'quadraticCurveTo',%0A%20%20%20%20%20%20%20%20%20%20'arcTo',%0A%20%20%20%20%20%20%20%20%20%20'ellipse',%0A%20%20%20%20%20%20%20%20%20%20'rect',%0A%20%20%20%20%20%20%20%20%20%20'fill',%0A%20%20%20%20%20%20%20%20%20%20'stroke',%0A%20%20%20%20%20%20%20%20%20%20'lineTo',%0A%20%20%20%20%20%20%20%20%20%20'beginPath',%0A%20%20%20%20%20%20%20%20%20%20'closePath',%0A%20%20%20%20%20%20%20%20%20%20'arc',%0A%20%20%20%20%20%20%20%20%20%20'fillText',%0A%20%20%20%20%20%20%20%20%20%20'fillRect',%0A%20%20%20%20%20%20%20%20%20%20'strokeText',%0A%20%20%20%20%20%20%20%20%20%20'createConicGradient',%0A%20%20%20%20%20%20%20%20%20%20'createLinearGradient',%0A%20%20%20%20%20%20%20%20%20%20'createRadialGradient',%0A%20%20%20%20%20%20%20%20%20%20'createPattern'%0A%20%20%20%20%20%20%5D;%0A%20%20%20%20%20%20for%20(const%20methodName%20of%20unsafeMethods)%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20Some%20methods%20are%20browser%20specific%0A%20%20%20%20%20%20%20%20%20%20if%20(methodName%20in%20CanvasRenderingContext2D.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20unsafeProxy%20=%20new%20DDGProxy(featureName,%20CanvasRenderingContext2D.prototype,%20methodName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20treatAsUnsafe(thisArg.canvas);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20unsafeProxy.overload();%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20(supportsWebGl)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20unsafeGlMethods%20=%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'commit',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'compileShader',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'shaderSource',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'attachShader',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'createProgram',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'linkProgram',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'drawElements',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'drawArrays'%0A%20%20%20%20%20%20%20%20%20%20%5D;%0A%20%20%20%20%20%20%20%20%20%20const%20glContexts%20=%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20WebGLRenderingContext%0A%20%20%20%20%20%20%20%20%20%20%5D;%0A%20%20%20%20%20%20%20%20%20%20if%20('WebGL2RenderingContext'%20in%20globalThis)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20glContexts.push(WebGL2RenderingContext);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20context%20of%20glContexts)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(const%20methodName%20of%20unsafeGlMethods)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Some%20methods%20are%20browser%20specific%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(methodName%20in%20context.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20unsafeProxy%20=%20new%20DDGProxy(featureName,%20context.prototype,%20methodName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20treatAsUnsafe(thisArg.canvas);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20unsafeProxy.overload();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20Using%20proxies%20here%20to%20swallow%20calls%20to%20toString%20etc%0A%20%20%20%20%20%20const%20getImageDataProxy%20=%20new%20DDGProxy(featureName,%20CanvasRenderingContext2D.prototype,%20'getImageData',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!unsafeCanvases.has(thisArg.canvas))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Anything%20we%20do%20here%20should%20be%20caught%20and%20ignored%20silently%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20%7B%20offScreenCtx%20%7D%20=%20getCachedOffScreenCanvasOrCompute(thisArg.canvas,%20domainKey,%20sessionKey);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Call%20the%20original%20method%20on%20the%20modified%20off-screen%20canvas%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20offScreenCtx,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20getImageDataProxy.overload();%0A%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Get%20cached%20offscreen%20if%20one%20exists,%20otherwise%20compute%20one%0A%20%20%20%20%20%20%20*%0A%20%20%20%20%20%20%20*%20@param%20%7BHTMLCanvasElement%7D%20canvas%0A%20%20%20%20%20%20%20*%20@param%20%7Bstring%7D%20domainKey%0A%20%20%20%20%20%20%20*%20@param%20%7Bstring%7D%20sessionKey%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20function%20getCachedOffScreenCanvasOrCompute%20(canvas,%20domainKey,%20sessionKey)%20%7B%0A%20%20%20%20%20%20%20%20%20%20let%20result;%0A%20%20%20%20%20%20%20%20%20%20if%20(canvasCache.has(canvas))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20result%20=%20canvasCache.get(canvas);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20ctx%20=%20canvasContexts.get(canvas);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20result%20=%20computeOffScreenCanvas(canvas,%20domainKey,%20sessionKey,%20getImageDataProxy,%20ctx);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20canvasCache.set(canvas,%20result);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20return%20result%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20canvasMethods%20=%20%5B'toDataURL',%20'toBlob'%5D;%0A%20%20%20%20%20%20for%20(const%20methodName%20of%20canvasMethods)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20proxy%20=%20new%20DDGProxy(featureName,%20HTMLCanvasElement.prototype,%20methodName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Short%20circuit%20for%20low%20risk%20canvas%20calls%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!unsafeCanvases.has(thisArg))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20%7B%20offScreenCanvas%20%7D%20=%20getCachedOffScreenCanvasOrCompute(thisArg,%20domainKey,%20sessionKey);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Call%20the%20original%20method%20on%20the%20modified%20off-screen%20canvas%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20offScreenCanvas,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Something%20we%20did%20caused%20an%20exception,%20fall%20back%20to%20the%20native%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20proxy.overload();%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20fingerprintingCanvas%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$9%0A%20%20%7D);%0A%0A%20%20const%20featureName$1%20=%20'fingerprinting-hardware';%0A%0A%20%20function%20init$8%20(args)%20%7B%0A%20%20%20%20%20%20const%20Navigator%20=%20globalThis.Navigator;%0A%20%20%20%20%20%20const%20navigator%20=%20globalThis.navigator;%0A%0A%20%20%20%20%20%20overrideProperty('keyboard',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Navigator.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20navigator.keyboard,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName$1,%20args,%20'keyboard')%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20overrideProperty('hardwareConcurrency',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Navigator.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20navigator.hardwareConcurrency,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName$1,%20args,%20'hardwareConcurrency',%202)%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20overrideProperty('deviceMemory',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Navigator.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20navigator.deviceMemory,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName$1,%20args,%20'deviceMemory',%208)%0A%20%20%20%20%20%20%7D);%0A%20%20%7D%0A%0A%20%20var%20fingerprintingHardware%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$8%0A%20%20%7D);%0A%0A%20%20const%20featureName%20=%20'fingerprinting-screen-size';%0A%0A%20%20/**%0A%20%20%20*%20normalize%20window%20dimensions,%20if%20more%20than%20one%20monitor%20is%20in%20play.%0A%20%20%20*%20%20X/Y%20values%20are%20set%20in%20the%20browser%20based%20on%20distance%20to%20the%20main%20monitor%20top%20or%20left,%20which%0A%20%20%20*%20can%20mean%20second%20or%20more%20monitors%20have%20very%20large%20or%20negative%20values.%20This%20function%20maps%20a%20given%0A%20%20%20*%20given%20coordinate%20value%20to%20the%20proper%20place%20on%20the%20main%20screen.%0A%20%20%20*/%0A%20%20function%20normalizeWindowDimension%20(value,%20targetDimension)%20%7B%0A%20%20%20%20%20%20if%20(value%20%3E%20targetDimension)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20value%20%25%20targetDimension%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(value%20%3C%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20targetDimension%20+%20value%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20value%0A%20%20%7D%0A%0A%20%20function%20setWindowPropertyValue%20(property,%20value)%20%7B%0A%20%20%20%20%20%20//%20Here%20we%20don't%20update%20the%20prototype%20getter%20because%20the%20values%20are%20updated%20dynamically%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20defineProperty(globalThis,%20property,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20get:%20()%20=%3E%20value,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20set:%20()%20=%3E%20%7B%7D,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20configurable:%20true%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%7D%0A%20%20%7D%0A%0A%20%20const%20origPropertyValues%20=%20%7B%7D;%0A%0A%20%20/**%0A%20%20%20*%20Fix%20window%20dimensions.%20The%20extension%20runs%20in%20a%20different%20JS%20context%20than%20the%0A%20%20%20*%20page,%20so%20we%20can%20inject%20the%20correct%20screen%20values%20as%20the%20window%20is%20resized,%0A%20%20%20*%20ensuring%20that%20no%20information%20is%20leaked%20as%20the%20dimensions%20change,%20but%20also%20that%20the%0A%20%20%20*%20values%20change%20correctly%20for%20valid%20use%20cases.%0A%20%20%20*/%0A%20%20function%20setWindowDimensions%20()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20window%20=%20globalThis;%0A%20%20%20%20%20%20%20%20%20%20const%20top%20=%20globalThis.top;%0A%0A%20%20%20%20%20%20%20%20%20%20const%20normalizedY%20=%20normalizeWindowDimension(window.screenY,%20window.screen.height);%0A%20%20%20%20%20%20%20%20%20%20const%20normalizedX%20=%20normalizeWindowDimension(window.screenX,%20window.screen.width);%0A%20%20%20%20%20%20%20%20%20%20if%20(normalizedY%20%3C=%20origPropertyValues.availTop)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenY',%200);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenTop',%200);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenY',%20normalizedY);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenTop',%20normalizedY);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(top.window.outerHeight%20%3E=%20origPropertyValues.availHeight%20-%201)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('outerHeight',%20top.window.screen.height);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('outerHeight',%20top.window.outerHeight);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20top%20not%20accessible%20to%20certain%20iFrames,%20so%20ignore.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(normalizedX%20%3C=%20origPropertyValues.availLeft)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenX',%200);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenLeft',%200);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenX',%20normalizedX);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('screenLeft',%20normalizedX);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(top.window.outerWidth%20%3E=%20origPropertyValues.availWidth%20-%201)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('outerWidth',%20top.window.screen.width);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20setWindowPropertyValue('outerWidth',%20top.window.outerWidth);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20top%20not%20accessible%20to%20certain%20iFrames,%20so%20ignore.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20in%20a%20cross%20domain%20iFrame,%20top.window%20is%20not%20accessible.%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20init$7%20(args)%20%7B%0A%20%20%20%20%20%20const%20Screen%20=%20globalThis.Screen;%0A%20%20%20%20%20%20const%20screen%20=%20globalThis.screen;%0A%0A%20%20%20%20%20%20origPropertyValues.availTop%20=%20overrideProperty('availTop',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Screen.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20screen.availTop,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName,%20args,%20'availTop',%200)%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20origPropertyValues.availLeft%20=%20overrideProperty('availLeft',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Screen.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20screen.availLeft,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName,%20args,%20'availLeft',%200)%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20origPropertyValues.availWidth%20=%20overrideProperty('availWidth',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Screen.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20screen.availWidth,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20screen.width%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20origPropertyValues.availHeight%20=%20overrideProperty('availHeight',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Screen.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20screen.availHeight,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20screen.height%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20overrideProperty('colorDepth',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Screen.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20screen.colorDepth,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName,%20args,%20'colorDepth',%2024)%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20overrideProperty('pixelDepth',%20%7B%0A%20%20%20%20%20%20%20%20%20%20object:%20Screen.prototype,%0A%20%20%20%20%20%20%20%20%20%20origValue:%20screen.pixelDepth,%0A%20%20%20%20%20%20%20%20%20%20targetValue:%20getFeatureAttr(featureName,%20args,%20'pixelDepth',%2024)%0A%20%20%20%20%20%20%7D);%0A%0A%20%20%20%20%20%20window.addEventListener('resize',%20function%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20setWindowDimensions();%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20setWindowDimensions();%0A%20%20%7D%0A%0A%20%20var%20fingerprintingScreenSize%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$7%0A%20%20%7D);%0A%0A%20%20function%20init$6%20()%20%7B%0A%20%20%20%20%20%20const%20navigator%20=%20globalThis.navigator;%0A%20%20%20%20%20%20const%20Navigator%20=%20globalThis.Navigator;%0A%0A%20%20%20%20%20%20/**%0A%20%20%20%20%20%20%20*%20Temporary%20storage%20can%20be%20used%20to%20determine%20hard%20disk%20usage%20and%20size.%0A%20%20%20%20%20%20%20*%20This%20will%20limit%20the%20max%20storage%20to%204GB%20without%20completely%20disabling%20the%0A%20%20%20%20%20%20%20*%20feature.%0A%20%20%20%20%20%20%20*/%0A%20%20%20%20%20%20if%20(navigator.webkitTemporaryStorage)%20%7B%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20org%20=%20navigator.webkitTemporaryStorage.queryUsageAndQuota;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20tStorage%20=%20navigator.webkitTemporaryStorage;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20tStorage.queryUsageAndQuota%20=%20function%20queryUsageAndQuota%20(callback,%20err)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20modifiedCallback%20=%20function%20(usedBytes,%20grantedBytes)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20maxBytesGranted%20=%204%20*%201024%20*%201024%20*%201024;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20spoofedGrantedBytes%20=%20Math.min(grantedBytes,%20maxBytesGranted);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20callback(usedBytes,%20spoofedGrantedBytes);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20org.call(navigator.webkitTemporaryStorage,%20modifiedCallback,%20err);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defineProperty(Navigator.prototype,%20'webkitTemporaryStorage',%20%7B%20get:%20()%20=%3E%20tStorage%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(e)%20%7B%7D%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20fingerprintingTemporaryStorage%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$6%0A%20%20%7D);%0A%0A%20%20function%20init$5%20()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20('browsingTopics'%20in%20Document.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20delete%20Document.prototype.browsingTopics;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20('joinAdInterestGroup'%20in%20Navigator.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20delete%20Navigator.prototype.joinAdInterestGroup;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20('leaveAdInterestGroup'%20in%20Navigator.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20delete%20Navigator.prototype.leaveAdInterestGroup;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20('updateAdInterestGroups'%20in%20Navigator.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20delete%20Navigator.prototype.updateAdInterestGroups;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20('runAdAuction'%20in%20Navigator.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20delete%20Navigator.prototype.runAdAuction;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20('adAuctionComponents'%20in%20Navigator.prototype)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20delete%20Navigator.prototype.adAuctionComponents;%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20Throw%20away%20this%20exception,%20it's%20likely%20a%20confict%20with%20another%20extension%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20googleRejected%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$5%0A%20%20%7D);%0A%0A%20%20//%20Set%20Global%20Privacy%20Control%20property%20on%20DOM%0A%20%20function%20init$4%20(args)%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20If%20GPC%20on,%20set%20DOM%20property%20prototype%20to%20true%20if%20not%20already%20true%0A%20%20%20%20%20%20%20%20%20%20if%20(args.globalPrivacyControlValue)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(navigator.globalPrivacyControl)%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defineProperty(Navigator.prototype,%20'globalPrivacyControl',%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20get:%20()%20=%3E%20true,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20configurable:%20true,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20enumerable:%20true%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20If%20GPC%20off%20&%20unsupported%20by%20browser,%20set%20DOM%20property%20prototype%20to%20false%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20this%20may%20be%20overwritten%20by%20the%20user%20agent%20or%20other%20extensions%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(typeof%20navigator.globalPrivacyControl%20!==%20'undefined')%20return%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defineProperty(Navigator.prototype,%20'globalPrivacyControl',%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20get:%20()%20=%3E%20false,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20configurable:%20true,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20enumerable:%20true%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20Ignore%20exceptions%20that%20could%20be%20caused%20by%20conflicting%20with%20other%20extensions%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20gpc%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$4%0A%20%20%7D);%0A%0A%20%20function%20init$3%20(args)%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(navigator.duckduckgo)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20(!args.platform%20%7C%7C%20!args.platform.name)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20defineProperty(Navigator.prototype,%20'duckduckgo',%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value:%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20platform:%20args.platform.name,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20isDuckDuckGo%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGPromise.resolve(true)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20enumerable:%20true,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20configurable:%20false,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20writable:%20false%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20todo:%20Just%20ignore%20this%20exception?%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20navigatorInterface%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$3%0A%20%20%7D);%0A%0A%20%20function%20init$2%20(args)%20%7B%0A%20%20%20%20%20%20//%20Unfortunately,%20we%20only%20have%20limited%20information%20about%20the%20referrer%20and%20current%20frame.%20A%20single%0A%20%20%20%20%20%20//%20page%20may%20load%20many%20requests%20and%20sub%20frames,%20all%20with%20different%20referrers.%20Since%20we%0A%20%20%20%20%20%20if%20(args.referrer%20&&%20//%20make%20sure%20the%20referrer%20was%20set%20correctly%0A%20%20%20%20%20%20%20%20%20%20args.referrer.referrer%20!==%20undefined%20&&%20//%20referrer%20value%20will%20be%20undefined%20when%20it%20should%20be%20unchanged.%0A%20%20%20%20%20%20%20%20%20%20document.referrer%20&&%20//%20don't%20change%20the%20value%20if%20it%20isn't%20set%0A%20%20%20%20%20%20%20%20%20%20document.referrer%20!==%20''%20&&%20//%20don't%20add%20referrer%20information%0A%20%20%20%20%20%20%20%20%20%20new%20URL(document.URL).hostname%20!==%20new%20URL(document.referrer).hostname)%20%7B%20//%20don't%20replace%20the%20referrer%20for%20the%20current%20host.%0A%20%20%20%20%20%20%20%20%20%20let%20trimmedReferer%20=%20document.referrer;%0A%20%20%20%20%20%20%20%20%20%20if%20(new%20URL(document.referrer).hostname%20===%20args.referrer.referrerHost)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20make%20sure%20the%20real%20referrer%20&%20replacement%20referrer%20match%20if%20we're%20going%20to%20replace%20it%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20trimmedReferer%20=%20args.referrer.referrer;%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20if%20we%20don't%20have%20a%20matching%20referrer,%20just%20trim%20it%20to%20origin.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20trimmedReferer%20=%20new%20URL(document.referrer).origin%20+%20'/';%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20overrideProperty('referrer',%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20object:%20Document.prototype,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20origValue:%20document.referrer,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20targetValue:%20trimmedReferer%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20referrer%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$2%0A%20%20%7D);%0A%0A%20%20/**%0A%20%20%20*%20Fixes%20incorrect%20sizing%20value%20for%20outerHeight%20and%20outerWidth%0A%20%20%20*/%0A%20%20function%20windowSizingFix%20()%20%7B%0A%20%20%20%20%20%20window.outerHeight%20=%20window.innerHeight;%0A%20%20%20%20%20%20window.outerWidth%20=%20window.innerWidth;%0A%20%20%7D%0A%0A%20%20/**%0A%20%20%20*%20Add%20missing%20navigator.credentials%20API%0A%20%20%20*/%0A%20%20function%20navigatorCredentialsFix%20()%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20value%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20get%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20Promise.reject(new%20Error())%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D;%0A%20%20%20%20%20%20%20%20%20%20defineProperty(Navigator.prototype,%20'credentials',%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20configurable:%20true,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20enumerable:%20true%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20//%20Ignore%20exceptions%20that%20could%20be%20caused%20by%20conflicting%20with%20other%20extensions%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20init$1%20()%20%7B%0A%20%20%20%20%20%20windowSizingFix();%0A%20%20%20%20%20%20navigatorCredentialsFix();%0A%20%20%7D%0A%0A%20%20var%20webCompat%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init$1%0A%20%20%7D);%0A%0A%20%20/*%20global%20Bluetooth,%20Geolocation,%20HID,%20Serial,%20USB%20*/%0A%0A%20%20function%20init%20()%20%7B%0A%20%20%20%20%20%20const%20featureName%20=%20'windows-permission-usage';%0A%0A%20%20%20%20%20%20const%20Permission%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20Geolocation:%20'geolocation',%0A%20%20%20%20%20%20%20%20%20%20Camera:%20'camera',%0A%20%20%20%20%20%20%20%20%20%20Microphone:%20'microphone'%0A%20%20%20%20%20%20%7D;%0A%0A%20%20%20%20%20%20const%20Status%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20Inactive:%20'inactive',%0A%20%20%20%20%20%20%20%20%20%20Accessed:%20'accessed',%0A%20%20%20%20%20%20%20%20%20%20Active:%20'active',%0A%20%20%20%20%20%20%20%20%20%20Paused:%20'paused'%0A%20%20%20%20%20%20%7D;%0A%0A%20%20%20%20%20%20const%20isFrameInsideFrame%20=%20window.self%20!==%20window.top%20&&%20window.parent%20!==%20window.top;%0A%0A%20%20%20%20%20%20function%20windowsPostMessage%20(name,%20data)%20%7B%0A%20%20%20%20%20%20%20%20%20%20window.chrome.webview.postMessage(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Feature:%20'Permissions',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Name:%20name,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Data:%20data%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20windowsPostGeolocationMessage%20(name,%20data)%20%7B%0A%20%20%20%20%20%20%20%20%20%20window.chrome.webview.postMessage(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Feature:%20'Geolocation',%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Name:%20name,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Data:%20data%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20signalPermissionStatus%20(permission,%20status)%20%7B%0A%20%20%20%20%20%20%20%20%20%20windowsPostMessage('PermissionStatusMessage',%20%7B%20permission,%20status%20%7D);%0A%20%20%20%20%20%20%20%20%20%20console.debug(%60Permission%20'$%7Bpermission%7D'%20is%20$%7Bstatus%7D%60);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20registerPositionMessageHandler%20(args,%20messageId,%20geolocationActiveStatus)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20successHandler%20=%20args%5B0%5D;%0A%0A%20%20%20%20%20%20%20%20%20%20const%20handler%20=%20function%20(%7B%20data%20%7D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(data?.id%20===%20messageId)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20window.chrome.webview.removeEventListener('message',%20handler);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(Permission.Geolocation,%20geolocationActiveStatus);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(Object.prototype.hasOwnProperty.call(data,%20'errorCode'))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(args.length%20%3E=%202)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20errorHandler%20=%20args%5B1%5D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20error%20=%20%7B%20code:%20data.errorCode,%20message:%20data.errorMessage%20%7D;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20errorHandler?.(error);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20rez%20=%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20timestamp:%20data.timestamp,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20coords:%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20latitude:%20data.latitude,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20longitude:%20data.longitude,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20altitude:%20null,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20altitudeAccuracy:%20null,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heading:%20null,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20speed:%20null,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20accuracy:%20data.accuracy%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D;%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20successHandler?.(rez);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D;%0A%0A%20%20%20%20%20%20%20%20%20%20window.chrome.webview.addEventListener('message',%20handler);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20let%20watchedPositionId%20=%200;%0A%20%20%20%20%20%20const%20watchedPositions%20=%20new%20Set();%0A%20%20%20%20%20%20//%20proxy%20for%20navigator.geolocation.watchPosition%20-%3E%20show%20red%20geolocation%20indicator%0A%20%20%20%20%20%20const%20watchPositionProxy%20=%20new%20DDGProxy(featureName,%20Geolocation.prototype,%20'watchPosition',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(isFrameInsideFrame)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20we%20can't%20communicate%20with%20iframes%20inside%20iframes%20-%3E%20deny%20permission%20instead%20of%20putting%20users%20at%20risk%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20throw%20new%20DOMException('Permission%20denied')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20messageId%20=%20crypto.randomUUID();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20registerPositionMessageHandler(args,%20messageId,%20Status.Active);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20windowsPostGeolocationMessage('positionRequested',%20%7B%20id:%20messageId%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20watchedPositionId++;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20watchedPositions.add(watchedPositionId);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20watchedPositionId%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20watchPositionProxy.overload();%0A%0A%20%20%20%20%20%20//%20proxy%20for%20navigator.geolocation.clearWatch%20-%3E%20clear%20red%20geolocation%20indicator%0A%20%20%20%20%20%20const%20clearWatchProxy%20=%20new%20DDGProxy(featureName,%20Geolocation.prototype,%20'clearWatch',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(args%5B0%5D%20&&%20watchedPositions.delete(args%5B0%5D)%20&&%20watchedPositions.size%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(Permission.Geolocation,%20Status.Inactive);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20clearWatchProxy.overload();%0A%0A%20%20%20%20%20%20//%20proxy%20for%20navigator.geolocation.getCurrentPosition%20-%3E%20normal%20geolocation%20indicator%0A%20%20%20%20%20%20const%20getCurrentPositionProxy%20=%20new%20DDGProxy(featureName,%20Geolocation.prototype,%20'getCurrentPosition',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20messageId%20=%20crypto.randomUUID();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20registerPositionMessageHandler(args,%20messageId,%20Status.Accessed);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20windowsPostGeolocationMessage('positionRequested',%20%7B%20id:%20messageId%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20getCurrentPositionProxy.overload();%0A%0A%20%20%20%20%20%20const%20userMediaStreams%20=%20new%20Set();%0A%20%20%20%20%20%20const%20videoTracks%20=%20new%20Set();%0A%20%20%20%20%20%20const%20audioTracks%20=%20new%20Set();%0A%0A%20%20%20%20%20%20function%20getTracks%20(permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20switch%20(permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20case%20Permission.Camera:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20videoTracks%0A%20%20%20%20%20%20%20%20%20%20case%20Permission.Microphone:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20audioTracks%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20pause%20(permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20streamTracks%20=%20getTracks(permission);%0A%20%20%20%20%20%20%20%20%20%20streamTracks?.forEach(track%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.enabled%20=%20false;%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20resume%20(permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20streamTracks%20=%20getTracks(permission);%0A%20%20%20%20%20%20%20%20%20%20streamTracks?.forEach(track%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.enabled%20=%20true;%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20stop%20(permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20streamTracks%20=%20getTracks(permission);%0A%20%20%20%20%20%20%20%20%20%20streamTracks?.forEach(track%20=%3E%20track.stop());%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20monitorTrack%20(track)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(track.readyState%20===%20'ended')%20return%0A%0A%20%20%20%20%20%20%20%20%20%20if%20(track.kind%20===%20'video'%20&&%20!videoTracks.has(track))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60New%20video%20stream%20track%20$%7Btrack.id%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.addEventListener('ended',%20videoTrackEnded);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.addEventListener('mute',%20signalVideoTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.addEventListener('unmute',%20signalVideoTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20videoTracks.add(track);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(track.kind%20===%20'audio'%20&&%20!audioTracks.has(track))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60New%20audio%20stream%20track%20$%7Btrack.id%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.addEventListener('ended',%20audioTrackEnded);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.addEventListener('mute',%20signalAudioTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.addEventListener('unmute',%20signalAudioTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20audioTracks.add(track);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20handleTrackEnded%20(track)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(track.kind%20===%20'video'%20&&%20videoTracks.has(track))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60Video%20stream%20track%20$%7Btrack.id%7D%20ended%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.removeEventListener('ended',%20videoTrackEnded);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.removeEventListener('mute',%20signalVideoTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.removeEventListener('unmute',%20signalVideoTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20videoTracks.delete(track);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalVideoTracksState();%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(track.kind%20===%20'audio'%20&&%20audioTracks.has(track))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60Audio%20stream%20track%20$%7Btrack.id%7D%20ended%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.removeEventListener('ended',%20audioTrackEnded);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.removeEventListener('mute',%20signalAudioTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20track.removeEventListener('unmute',%20signalAudioTracksState);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20audioTracks.delete(track);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalAudioTracksState();%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20videoTrackEnded%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20handleTrackEnded(e.target);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20audioTrackEnded%20(e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20handleTrackEnded(e.target);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20signalTracksState%20(permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20tracks%20=%20getTracks(permission);%0A%20%20%20%20%20%20%20%20%20%20if%20(!tracks)%20return%0A%0A%20%20%20%20%20%20%20%20%20%20const%20allTrackCount%20=%20tracks.size;%0A%20%20%20%20%20%20%20%20%20%20if%20(allTrackCount%20===%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(permission,%20Status.Inactive);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20let%20mutedTrackCount%20=%200;%0A%20%20%20%20%20%20%20%20%20%20tracks.forEach(track%20=%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20mutedTrackCount%20+=%20((!track.enabled%20%7C%7C%20track.muted)%20?%201%20:%200);%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20if%20(mutedTrackCount%20===%20allTrackCount)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(permission,%20Status.Paused);%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(mutedTrackCount%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60Some%20$%7Bpermission%7D%20tracks%20are%20still%20active:%20$%7BallTrackCount%20-%20mutedTrackCount%7D/$%7BallTrackCount%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(permission,%20Status.Active);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20let%20signalVideoTracksStateTimer;%0A%20%20%20%20%20%20function%20signalVideoTracksState%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20clearTimeout(signalVideoTracksStateTimer);%0A%20%20%20%20%20%20%20%20%20%20signalVideoTracksStateTimer%20=%20setTimeout(()%20=%3E%20signalTracksState(Permission.Camera),%20100);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20let%20signalAudioTracksStateTimer;%0A%20%20%20%20%20%20function%20signalAudioTracksState%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20clearTimeout(signalAudioTracksStateTimer);%0A%20%20%20%20%20%20%20%20%20%20signalAudioTracksStateTimer%20=%20setTimeout(()%20=%3E%20signalTracksState(Permission.Microphone),%20100);%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20proxy%20for%20track.stop%20-%3E%20clear%20camera/mic%20indicator%20manually%20here%20because%20no%20ended%20event%20raised%20this%20way%0A%20%20%20%20%20%20const%20stopTrackProxy%20=%20new%20DDGProxy(featureName,%20MediaStreamTrack.prototype,%20'stop',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20handleTrackEnded(thisArg);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args)%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20stopTrackProxy.overload();%0A%0A%20%20%20%20%20%20//%20proxy%20for%20track.clone%20-%3E%20monitor%20the%20cloned%20track%0A%20%20%20%20%20%20const%20cloneTrackProxy%20=%20new%20DDGProxy(featureName,%20MediaStreamTrack.prototype,%20'clone',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20clonedTrack%20=%20DDGReflect.apply(target,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(clonedTrack%20&&%20(videoTracks.has(thisArg)%20%7C%7C%20audioTracks.has(thisArg)))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60Media%20stream%20track%20$%7BthisArg.id%7D%20has%20been%20cloned%20to%20track%20$%7BclonedTrack.id%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20monitorTrack(clonedTrack);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20clonedTrack%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20cloneTrackProxy.overload();%0A%0A%20%20%20%20%20%20//%20override%20MediaStreamTrack.enabled%20-%3E%20update%20active/paused%20status%20when%20enabled%20is%20set%0A%20%20%20%20%20%20const%20trackEnabledPropertyDescriptor%20=%20Object.getOwnPropertyDescriptor(MediaStreamTrack.prototype,%20'enabled');%0A%20%20%20%20%20%20defineProperty(MediaStreamTrack.prototype,%20'enabled',%20%7B%0A%20%20%20%20%20%20%20%20%20%20configurable:%20trackEnabledPropertyDescriptor.configurable,%0A%20%20%20%20%20%20%20%20%20%20enumerable:%20trackEnabledPropertyDescriptor.enumerable,%0A%20%20%20%20%20%20%20%20%20%20get:%20function%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20trackEnabledPropertyDescriptor.get.bind(this)()%0A%20%20%20%20%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%20%20%20%20set:%20function%20(value)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20result%20=%20trackEnabledPropertyDescriptor.set.bind(this)(...arguments);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(videoTracks.has(this))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalVideoTracksState();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(audioTracks.has(this))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalAudioTracksState();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20result%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%0A%20%20%20%20%20%20//%20proxy%20for%20get*Tracks%20methods%20-%3E%20needed%20to%20monitor%20tracks%20returned%20by%20saved%20media%20stream%20coming%20for%20MediaDevices.getUserMedia%0A%20%20%20%20%20%20const%20getTracksMethodNames%20=%20%5B'getTracks',%20'getAudioTracks',%20'getVideoTracks'%5D;%0A%20%20%20%20%20%20for%20(const%20methodName%20of%20getTracksMethodNames)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20getTracksProxy%20=%20new%20DDGProxy(featureName,%20MediaStream.prototype,%20methodName,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20tracks%20=%20DDGReflect.apply(target,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(userMediaStreams.has(thisArg))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tracks.forEach(monitorTrack);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20tracks%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20getTracksProxy.overload();%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20proxy%20for%20MediaStream.clone%20-%3E%20needed%20to%20monitor%20cloned%20MediaDevices.getUserMedia%20streams%0A%20%20%20%20%20%20const%20cloneMediaStreamProxy%20=%20new%20DDGProxy(featureName,%20MediaStream.prototype,%20'clone',%20%7B%0A%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20clonedStream%20=%20DDGReflect.apply(target,%20thisArg,%20args);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(userMediaStreams.has(thisArg))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60User%20stream%20$%7BthisArg.id%7D%20has%20been%20cloned%20to%20stream%20$%7BclonedStream.id%7D%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20userMediaStreams.add(clonedStream);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20clonedStream%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20cloneMediaStreamProxy.overload();%0A%0A%20%20%20%20%20%20//%20proxy%20for%20navigator.mediaDevices.getUserMedia%20-%3E%20show%20red%20camera/mic%20indicators%0A%20%20%20%20%20%20if%20(MediaDevices)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20getUserMediaProxy%20=%20new%20DDGProxy(featureName,%20MediaDevices.prototype,%20'getUserMedia',%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20(target,%20thisArg,%20args)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(isFrameInsideFrame)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20we%20can't%20communicate%20with%20iframes%20inside%20iframes%20-%3E%20deny%20permission%20instead%20of%20putting%20users%20at%20risk%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20Promise.reject(new%20DOMException('Permission%20denied'))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20videoRequested%20=%20args%5B0%5D?.video;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20audioRequested%20=%20args%5B0%5D?.audio;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20DDGReflect.apply(target,%20thisArg,%20args).then(function%20(stream)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.debug(%60User%20stream%20$%7Bstream.id%7D%20has%20been%20acquired%60);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20userMediaStreams.add(stream);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(videoRequested)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20newVideoTracks%20=%20stream.getVideoTracks();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(newVideoTracks?.length%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(Permission.Camera,%20Status.Active);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20newVideoTracks.forEach(monitorTrack);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(audioRequested)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20newAudioTracks%20=%20stream.getAudioTracks();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(newAudioTracks?.length%20%3E%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20signalPermissionStatus(Permission.Microphone,%20Status.Active);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20newAudioTracks.forEach(monitorTrack);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20stream%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20getUserMediaProxy.overload();%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20function%20performAction%20(action,%20permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(action%20&&%20permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20switch%20(action)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20'pause':%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pause(permission);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20'resume':%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20resume(permission);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20'stop':%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stop(permission);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20handle%20actions%20from%20browser%0A%20%20%20%20%20%20window.chrome.webview.addEventListener('message',%20function%20(%7B%20data%20%7D)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(data?.action%20&&%20data?.permission)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20performAction(data?.action,%20data?.permission);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D);%0A%0A%20%20%20%20%20%20//%20these%20permissions%20cannot%20be%20disabled%20using%20WebView2%20or%20DevTools%20protocol%0A%20%20%20%20%20%20const%20permissionsToDisable%20=%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%20name:%20'Bluetooth',%20prototype:%20Bluetooth.prototype,%20method:%20'requestDevice'%20%7D,%0A%20%20%20%20%20%20%20%20%20%20%7B%20name:%20'USB',%20prototype:%20USB.prototype,%20method:%20'requestDevice'%20%7D,%0A%20%20%20%20%20%20%20%20%20%20%7B%20name:%20'Serial',%20prototype:%20Serial.prototype,%20method:%20'requestPort'%20%7D,%0A%20%20%20%20%20%20%20%20%20%20%7B%20name:%20'HID',%20prototype:%20HID.prototype,%20method:%20'requestDevice'%20%7D%0A%20%20%20%20%20%20%5D;%0A%20%20%20%20%20%20for%20(const%20%7B%20name,%20prototype,%20method%20%7D%20of%20permissionsToDisable)%20%7B%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20proxy%20=%20new%20DDGProxy(featureName,%20prototype,%20method,%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20apply%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20Promise.reject(new%20DOMException('Permission%20denied'))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20proxy.overload();%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20(error)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.info(%60Could%20not%20disable%20access%20to%20$%7Bname%7D%20because%20of%20error%60,%20error);%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20windowsPermissionUsage%20=%20/*#__PURE__*/Object.freeze(%7B%0A%20%20%20%20__proto__:%20null,%0A%20%20%20%20init:%20init%0A%20%20%7D);%0A%0A%20%20exports.init%20=%20init$d;%0A%20%20exports.load%20=%20load$1;%0A%20%20exports.update%20=%20update$1;%0A%0A%20%20Object.defineProperty(exports,%20'__esModule',%20%7B%20value:%20true%20%7D);%0A%0A%20%20return%20exports;%0A%0A%7D)(%7B%7D);%0A")} contentScopeFeatures.load() // Define a random function we call later. // Use define property so isn't enumerable diff --git a/build/firefox/inject.js b/build/firefox/inject.js index d8dc48a9d..ed26b0ecb 100644 --- a/build/firefox/inject.js +++ b/build/firefox/inject.js @@ -2901,9 +2901,11 @@ 'drawArrays' ]; const glContexts = [ - WebGL2RenderingContext, WebGLRenderingContext ]; + if ('WebGL2RenderingContext' in globalThis) { + glContexts.push(WebGL2RenderingContext); + } for (const context of glContexts) { for (const methodName of unsafeGlMethods) { // Some methods are browser specific diff --git a/build/integration/contentScope.js b/build/integration/contentScope.js index e33872eee..38e0326ae 100644 --- a/build/integration/contentScope.js +++ b/build/integration/contentScope.js @@ -2883,9 +2883,11 @@ 'drawArrays' ]; const glContexts = [ - WebGL2RenderingContext, WebGLRenderingContext ]; + if ('WebGL2RenderingContext' in globalThis) { + glContexts.push(WebGL2RenderingContext); + } for (const context of glContexts) { for (const methodName of unsafeGlMethods) { // Some methods are browser specific diff --git a/build/windows/contentScope.js b/build/windows/contentScope.js index 9c2b64d0c..f021aba31 100644 --- a/build/windows/contentScope.js +++ b/build/windows/contentScope.js @@ -3633,9 +3633,11 @@ 'drawArrays' ]; const glContexts = [ - WebGL2RenderingContext, WebGLRenderingContext ]; + if ('WebGL2RenderingContext' in globalThis) { + glContexts.push(WebGL2RenderingContext); + } for (const context of glContexts) { for (const methodName of unsafeGlMethods) { // Some methods are browser specific diff --git a/src/features/fingerprinting-canvas.js b/src/features/fingerprinting-canvas.js index 0ef6767c5..7c7d3e0cc 100644 --- a/src/features/fingerprinting-canvas.js +++ b/src/features/fingerprinting-canvas.js @@ -102,9 +102,11 @@ export function init (args) { 'drawArrays' ] const glContexts = [ - WebGL2RenderingContext, WebGLRenderingContext ] + if ('WebGL2RenderingContext' in globalThis) { + glContexts.push(WebGL2RenderingContext) + } for (const context of glContexts) { for (const methodName of unsafeGlMethods) { // Some methods are browser specific