fpscanner 1.0.1 → 1.0.3-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/detections/hasMismatchPlatformWorker.d.ts.map +1 -1
- package/dist/detections/hasMismatchWebGLInWorker.d.ts.map +1 -1
- package/dist/detections/hasMissingChromeObject.d.ts.map +1 -1
- package/dist/fpScanner.cjs.js +2 -2
- package/dist/fpScanner.es.js +166 -150
- package/package.json +1 -1
- package/src/detections/hasHeadlessChromeScreenResolution.ts +1 -1
- package/src/detections/hasMismatchPlatformWorker.ts +27 -1
- package/src/detections/hasMismatchWebGLInWorker.ts +12 -3
- package/src/detections/hasMissingChromeObject.ts +21 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hasMismatchPlatformWorker.d.ts","sourceRoot":"","sources":["../../src/detections/hasMismatchPlatformWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"hasMismatchPlatformWorker.d.ts","sourceRoot":"","sources":["../../src/detections/hasMismatchPlatformWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAkBvC,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,WAAW,WAiBjE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hasMismatchWebGLInWorker.d.ts","sourceRoot":"","sources":["../../src/detections/hasMismatchWebGLInWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"hasMismatchWebGLInWorker.d.ts","sourceRoot":"","sources":["../../src/detections/hasMismatchWebGLInWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAOvC,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,WAAW,WAchE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hasMissingChromeObject.d.ts","sourceRoot":"","sources":["../../src/detections/hasMissingChromeObject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"hasMissingChromeObject.d.ts","sourceRoot":"","sources":["../../src/detections/hasMissingChromeObject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAgBvC,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,WAS9D"}
|
package/dist/fpScanner.cjs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});function
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});function ie(){return navigator.webdriver}function ae(){return navigator.userAgent}function oe(){return navigator.platform}const l="ERROR",r="INIT",s="NA",f="SKIPPED",g="high",S="low",se="medium";function p(t){let e=0;for(let n=0,i=t.length;n<i;n++){let a=t.charCodeAt(n);e=(e<<5)-e+a,e|=0}return e.toString(16).padStart(8,"0")}function h(t,e){for(const n in t)t[n]=e}function ce(){return navigator.buildID==="20181001000000"}function le(){try{let t=!1;const e=Error.prepareStackTrace;Error.prepareStackTrace=function(){return t=!0,e};const n=new Error("");return console.log(n),t}catch{return l}}function ue(){const t={vendor:r,renderer:r};if(ce())return h(t,s),t;try{var e=document.createElement("canvas"),n=e.getContext("webgl")||e.getContext("experimental-webgl");n.getSupportedExtensions().indexOf("WEBGL_debug_renderer_info")>=0?(t.vendor=n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_VENDOR_WEBGL),t.renderer=n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_RENDERER_WEBGL)):h(t,s)}catch{h(t,l)}return t}function de(){return"__pwInitScripts"in window||"__playwright__binding__"in window}function ge(){return navigator.hardwareConcurrency||s}function he(){const t=[],e=.123456789;return["E","LN10","LN2","LOG10E","LOG2E","PI","SQRT1_2","SQRT2"].forEach(function(a){try{t.push(Math[a])}catch{t.push(-1)}}),["tan","sin","exp","atan","acosh","asinh","atanh","expm1","log1p","sinh"].forEach(function(a){try{t.push(Math[a](e))}catch{t.push(-1)}}),p(t.map(String).join(","))}function me(){return navigator.deviceMemory||s}function pe(){return eval.toString().length}function fe(){const t={timezone:r,localeLanguage:r};try{if(typeof Intl<"u"&&typeof Intl.DateTimeFormat<"u"){const e=Intl.DateTimeFormat().resolvedOptions();t.timezone=e.timeZone,t.localeLanguage=e.locale}else t.timezone=s,t.localeLanguage=s}catch{t.timezone=l,t.localeLanguage=l}return t}function ve(){return{width:window.screen.width,height:window.screen.height,pixelDepth:window.screen.pixelDepth,colorDepth:window.screen.colorDepth,availableWidth:window.screen.availWidth,availableHeight:window.screen.availHeight,innerWidth:window.innerWidth,innerHeight:window.innerHeight,hasMultipleDisplays:typeof screen.isExtended<"u"?screen.isExtended:s}}function we(){return{languages:navigator.languages,language:navigator.language}}async function ye(){const t={vendor:r,architecture:r,device:r,description:r};if("gpu"in navigator)try{const e=await navigator.gpu.requestAdapter();e&&(t.vendor=e.info.vendor,t.architecture=e.info.architecture,t.device=e.info.device,t.description=e.info.description)}catch{h(t,l)}else h(t,s);return t}function be(){const t=["__driver_evaluate","__webdriver_evaluate","__selenium_evaluate","__fxdriver_evaluate","__driver_unwrapped","__webdriver_unwrapped","__selenium_unwrapped","__fxdriver_unwrapped","_Selenium_IDE_Recorder","_selenium","calledSelenium","$cdc_asdjflasutopfhvcZLmcfl_","$chrome_asyncScriptInfo","__$webdriverAsyncExecutor","webdriver","__webdriverFunc","domAutomation","domAutomationController","__lastWatirAlert","__lastWatirConfirm","__lastWatirPrompt","__webdriver_script_fn","_WEBDRIVER_ELEM_CACHE"];let e=!1;for(let n=0;n<t.length;n++)if(t[n]in window){e=!0;break}return e=e||!!document.__webdriver_script_fn||!!window.domAutomation||!!window.domAutomationController,e}function Se(){try{const t="webdriver",e=window.navigator;if(!e[t]&&!e.hasOwnProperty(t)){e[t]=1;const n=e[t]===1;return delete e[t],n}return!0}catch{return!1}}async function Ce(){const t=window.navigator,e={architecture:r,bitness:r,brands:r,mobile:r,model:r,platform:r,platformVersion:r,uaFullVersion:r};if("userAgentData"in t)try{const n=await t.userAgentData.getHighEntropyValues(["architecture","bitness","brands","mobile","model","platform","platformVersion","uaFullVersion"]);e.architecture=n.architecture,e.bitness=n.bitness,e.brands=n.brands,e.mobile=n.mobile,e.model=n.model,e.platform=n.platform,e.platformVersion=n.platformVersion,e.uaFullVersion=n.uaFullVersion}catch{h(e,l)}else h(e,s);return e}function Pe(){if(!navigator.plugins)return!1;const t=typeof navigator.plugins.toString=="function"?navigator.plugins.toString():navigator.plugins.constructor&&typeof navigator.plugins.constructor.toString=="function"?navigator.plugins.constructor.toString():typeof navigator.plugins;return t==="[object PluginArray]"||t==="[object MSPluginsCollection]"||t==="[object HTMLPluginsCollection]"}function Ae(){if(!navigator.plugins)return s;const t=[];for(let e=0;e<navigator.plugins.length;e++)t.push(navigator.plugins[e].name);return p(t.join(","))}function Me(){return navigator.plugins?navigator.plugins.length:s}function xe(){if(!navigator.plugins)return s;try{return navigator.plugins[0]===navigator.plugins[0][0].enabledPlugin}catch{return l}}function We(){if(!navigator.plugins)return s;try{return navigator.plugins.item(4294967296)!==navigator.plugins[0]}catch{return l}}function Ee(){const t={isValidPluginArray:r,pluginCount:r,pluginNamesHash:r,pluginConsistency1:r,pluginOverflow:r};try{t.isValidPluginArray=Pe(),t.pluginCount=Me(),t.pluginNamesHash=Ae(),t.pluginConsistency1=xe(),t.pluginOverflow=We()}catch{h(t,l)}return t}async function ke(){return new Promise(async function(t){var e={audiooutput:0,audioinput:0,videoinput:0};if(navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices){const a=await navigator.mediaDevices.enumerateDevices();if(typeof a<"u"){for(var n=0;n<a.length;n++){var i=a[n].kind;e[i]=e[i]+1}return t({speakers:e.audiooutput,microphones:e.audioinput,webcams:e.videoinput})}else return h(e,s),t(e)}else return h(e,s),t(e)})}function De(){const t={webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r},e=document.createElement("iframe");let n=!1;try{e.style.display="none",e.src="about:blank",document.body.appendChild(e),n=!0;const i=e.contentWindow?.navigator;t.webdriver=i.webdriver??!1,t.userAgent=i.userAgent??s,t.platform=i.platform??s,t.memory=i.deviceMemory??s,t.cpuCount=i.hardwareConcurrency??s,t.language=i.language??s}catch{h(t,l)}finally{if(n)try{document.body.removeChild(e)}catch{}}return t}async function _e(){return new Promise(t=>{const e={vendor:r,renderer:r,userAgent:r,language:r,platform:r,memory:r,cpuCount:r};let n=null,i=null,a=null;const d=()=>{a&&clearTimeout(a),n&&n.terminate(),i&&URL.revokeObjectURL(i)};try{const m=`try {
|
|
2
2
|
var fingerprintWorker = {};
|
|
3
3
|
|
|
4
4
|
fingerprintWorker.userAgent = navigator.userAgent;
|
|
@@ -29,4 +29,4 @@
|
|
|
29
29
|
self.postMessage(fingerprintWorker);
|
|
30
30
|
} catch (e) {
|
|
31
31
|
self.postMessage(fingerprintWorker);
|
|
32
|
-
}`,w=new Blob([m],{type:"application/javascript"});i=URL.createObjectURL(w),n=new Worker(i),a=window.setTimeout(()=>{h(),g(e,l),t(e)},2e3),n.onmessage=function(o){try{e.vendor=o.data.vendor,e.renderer=o.data.renderer,e.userAgent=o.data.userAgent,e.language=o.data.language,e.platform=o.data.platform,e.memory=o.data.memory,e.cpuCount=o.data.cpuCount}catch{g(e,l)}finally{h(),t(e)}},n.onerror=function(){h(),g(e,l),t(e)}}catch{h(),g(e,l),t(e)}})}function _e(){const t={toSourceError:r,hasToSource:!1};try{null.usdfsh}catch(e){t.toSourceError=e.toString()}try{throw"xyz"}catch(e){try{e.toSource(),t.hasToSource=!0}catch{t.hasToSource=!1}}return t}const S=['audio/mp4; codecs="mp4a.40.2"',"audio/mpeg;",'audio/webm; codecs="vorbis"','audio/ogg; codecs="vorbis"','audio/wav; codecs="1"','audio/ogg; codecs="speex"','audio/ogg; codecs="flac"','audio/3gpp; codecs="samr"'],C=['video/mp4; codecs="avc1.42E01E, mp4a.40.2"','video/mp4; codecs="avc1.42E01E"','video/mp4; codecs="avc1.58A01E"','video/mp4; codecs="avc1.4D401E"','video/mp4; codecs="avc1.64001E"','video/mp4; codecs="mp4v.20.8"','video/mp4; codecs="mp4v.20.240"','video/webm; codecs="vp8"','video/ogg; codecs="theora"','video/ogg; codecs="dirac"','video/3gpp; codecs="mp4v.20.8"','video/x-matroska; codecs="theora"'];function A(t,e){const n={};try{const i=document.createElement(e);for(const a of t)try{n[a]=i.canPlayType(a)||null}catch{n[a]=null}}catch{for(const i of t)n[i]=null}return n}function P(t){const e={},n=window.MediaSource;if(!n||typeof n.isTypeSupported!="function"){for(const i of t)e[i]=null;return e}for(const i of t)try{e[i]=n.isTypeSupported(i)}catch{e[i]=null}return e}function M(t){try{const e=window.RTCRtpReceiver;if(e&&typeof e.getCapabilities=="function"){const n=e.getCapabilities(t);return p(JSON.stringify(n))}return s}catch{return l}}function Re(){const t={audioCanPlayTypeHash:s,videoCanPlayTypeHash:s,audioMediaSourceHash:s,videoMediaSourceHash:s,rtcAudioCapabilitiesHash:s,rtcVideoCapabilitiesHash:s,hasMediaSource:!1};try{t.hasMediaSource=!!window.MediaSource;const e=A(S,"audio"),n=A(C,"video");t.audioCanPlayTypeHash=p(JSON.stringify(e)),t.videoCanPlayTypeHash=p(JSON.stringify(n));const i=P(S),a=P(C);t.audioMediaSourceHash=p(JSON.stringify(i)),t.videoMediaSourceHash=p(JSON.stringify(a)),t.rtcAudioCapabilitiesHash=M("audio"),t.rtcVideoCapabilitiesHash=M("video")}catch{g(t,l)}return t}async function Ie(){return new Promise(t=>{try{const e=new Image,n=document.createElement("canvas").getContext("2d");e.onload=()=>{n.drawImage(e,0,0),t(n.getImageData(0,0,1,1).data.filter(i=>i===0).length!=4)},e.onerror=()=>{t(l)},e.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII="}catch{t(l)}})}function Te(){var t=document.createElement("canvas");t.width=400,t.height=200,t.style.display="inline";var e=t.getContext("2d");try{return e.rect(0,0,10,10),e.rect(2,2,6,6),e.textBaseline="alphabetic",e.fillStyle="#f60",e.fillRect(125,1,62,20),e.fillStyle="#069",e.font="11pt no-real-font-123",e.fillText("Cwm fjordbank glyphs vext quiz, 😃",2,15),e.fillStyle="rgba(102, 204, 0, 0.2)",e.font="18pt Arial",e.fillText("Cwm fjordbank glyphs vext quiz, 😃",4,45),e.globalCompositeOperation="multiply",e.fillStyle="rgb(255,0,255)",e.beginPath(),e.arc(50,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(0,255,255)",e.beginPath(),e.arc(100,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,255,0)",e.beginPath(),e.arc(75,100,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,0,255)",e.arc(75,75,75,0,2*Math.PI,!0),e.arc(75,75,25,0,2*Math.PI,!0),e.fill("evenodd"),p(t.toDataURL())}catch{return l}}async function Le(){const t={hasModifiedCanvas:r,canvasFingerprint:r};return t.hasModifiedCanvas=await Ie(),t.canvasFingerprint=Te(),t}function Oe(){const t=["deviceMemory","hardwareConcurrency","language","languages","platform"],e=[];for(const n of t){const i=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator),n);i&&i.value?e.push("1"):e.push("0")}return e.join("")}function He(){return Math.random().toString(36).substring(2,15)}function Fe(){return new Date().getTime()}function Ue(){return window.location.href}function x(t,e){const n=t.signals;return e==="iframe"?n.contexts.iframe.webdriver!==n.automation.webdriver||n.contexts.iframe.userAgent!==n.browser.userAgent||n.contexts.iframe.platform!==n.device.platform||n.contexts.iframe.memory!==n.device.memory||n.contexts.iframe.cpuCount!==n.device.cpuCount:n.contexts.webWorker.webdriver!==n.automation.webdriver||n.contexts.webWorker.userAgent!==n.browser.userAgent||n.contexts.webWorker.platform!==n.device.platform||n.contexts.webWorker.memory!==n.device.memory||n.contexts.webWorker.cpuCount!==n.device.cpuCount}function Ve(){const t={bitmask:r,extensions:[]},e=document.body.hasAttribute("data-gr-ext-installed"),n=typeof window.ethereum<"u",i=document.getElementById("coupon-birds-drop-div")!==null,a=document.querySelector("deepl-input-controller")!==null,h=document.getElementById("monica-content-root")!==null,m=document.querySelector("chatgpt-sidebar")!==null,w=typeof window.__REQUESTLY__<"u",o=Array.from(document.querySelectorAll("*")).filter(v=>v.tagName.toLowerCase().startsWith("veepn-")).length>0;return t.bitmask=[e?"1":"0",n?"1":"0",i?"1":"0",a?"1":"0",h?"1":"0",m?"1":"0",w?"1":"0",o?"1":"0"].join(""),e&&t.extensions.push("grammarly"),n&&t.extensions.push("metamask"),i&&t.extensions.push("coupon-birds"),a&&t.extensions.push("deepl"),h&&t.extensions.push("monica-ai"),m&&t.extensions.push("sider-ai"),w&&t.extensions.push("requestly"),o&&t.extensions.push("veepn"),t}function c(t){try{return t()}catch{return!1}}function Ge(){const t={bitmask:r,chrome:c(()=>"chrome"in window),brave:c(()=>"brave"in navigator),applePaySupport:c(()=>"ApplePaySetup"in window),opera:c(()=>typeof window.opr<"u"||typeof window.onoperadetachedviewchange=="object"),serial:c(()=>window.navigator.serial!==void 0),attachShadow:c(()=>!!Element.prototype.attachShadow),caches:c(()=>!!window.caches),webAssembly:c(()=>!!window.WebAssembly&&!!window.WebAssembly.instantiate),buffer:c(()=>"Buffer"in window),showModalDialog:c(()=>"showModalDialog"in window),safari:c(()=>"safari"in window),webkitPrefixedFunction:c(()=>"webkitCancelAnimationFrame"in window),mozPrefixedFunction:c(()=>"mozGetUserMedia"in navigator),usb:c(()=>typeof window.USB=="function"),browserCapture:c(()=>typeof window.BrowserCaptureMediaStreamTrack=="function"),paymentRequestUpdateEvent:c(()=>typeof window.PaymentRequestUpdateEvent=="function"),pressureObserver:c(()=>typeof window.PressureObserver=="function"),audioSession:c(()=>"audioSession"in navigator),selectAudioOutput:c(()=>typeof navigator<"u"&&typeof navigator.mediaDevices<"u"&&typeof navigator.mediaDevices.selectAudioOutput=="function"),barcodeDetector:c(()=>"BarcodeDetector"in window),battery:c(()=>"getBattery"in navigator),devicePosture:c(()=>"DevicePosture"in window),documentPictureInPicture:c(()=>"documentPictureInPicture"in window),eyeDropper:c(()=>"EyeDropper"in window),editContext:c(()=>"EditContext"in window),fencedFrame:c(()=>"FencedFrameConfig"in window),sanitizer:c(()=>"Sanitizer"in window),otpCredential:c(()=>"OTPCredential"in window)},e=Object.keys(t).filter(n=>n!=="bitmask").map(n=>t[n]?"1":"0").join("");return t.bitmask=e,t}function je(){const t={prefersColorScheme:r,prefersReducedMotion:r,prefersReducedTransparency:r,colorGamut:r,pointer:r,anyPointer:r,hover:r,anyHover:r,colorDepth:r};try{window.matchMedia("(prefers-color-scheme: dark)").matches?t.prefersColorScheme="dark":window.matchMedia("(prefers-color-scheme: light)").matches?t.prefersColorScheme="light":t.prefersColorScheme=null,t.prefersReducedMotion=window.matchMedia("(prefers-reduced-motion: reduce)").matches,t.prefersReducedTransparency=window.matchMedia("(prefers-reduced-transparency: reduce)").matches,window.matchMedia("(color-gamut: rec2020)").matches?t.colorGamut="rec2020":window.matchMedia("(color-gamut: p3)").matches?t.colorGamut="p3":window.matchMedia("(color-gamut: srgb)").matches?t.colorGamut="srgb":t.colorGamut=null,window.matchMedia("(pointer: fine)").matches?t.pointer="fine":window.matchMedia("(pointer: coarse)").matches?t.pointer="coarse":window.matchMedia("(pointer: none)").matches?t.pointer="none":t.pointer=null,window.matchMedia("(any-pointer: fine)").matches?t.anyPointer="fine":window.matchMedia("(any-pointer: coarse)").matches?t.anyPointer="coarse":window.matchMedia("(any-pointer: none)").matches?t.anyPointer="none":t.anyPointer=null,t.hover=window.matchMedia("(hover: hover)").matches,t.anyHover=window.matchMedia("(any-hover: hover)").matches;let e=0;for(let n=0;n<=16;n++)window.matchMedia(`(color: ${n})`).matches&&(e=n);t.colorDepth=e}catch{g(t,l)}return t}function Be(t){const e=t.signals.device.screenResolution;return e.width===600&&e.height===800||e.availableWidth===600&&e.availableHeight===800||e.innerWidth===600&&e.innerHeight===800}function Ne(t){return t.signals.automation.webdriver===!0}function ze(t){return!!t.signals.automation.selenium}function $e(t){return t.signals.automation.cdp===!0}function Qe(t){return t.signals.automation.playwright===!0}function qe(t){return typeof t.signals.device.memory!="number"?!1:t.signals.device.memory>32||t.signals.device.memory<.25}function Ke(t){return typeof t.signals.device.cpuCount!="number"?!1:t.signals.device.cpuCount>70}function Je(t){const e=t.signals.browser.userAgent;return t.signals.browser.features.chrome===!1&&typeof e=="string"&&e.includes("Chrome")}function Ye(t){return t.signals.contexts.iframe.webdriver===!0}function Ze(t){return t.signals.contexts.webWorker.webdriver===!0}function Xe(t){const e=t.signals.contexts.webWorker,n=t.signals.graphics.webGL;return e.vendor===l||e.renderer===l||n.vendor===s||n.renderer===s||e.vendor===f?!1:e.vendor!==n.vendor||e.renderer!==n.renderer}function et(t){return t.signals.contexts.webWorker.platform===s||t.signals.contexts.webWorker.platform===l||t.signals.contexts.webWorker.platform===f?!1:t.signals.device.platform!==t.signals.contexts.webWorker.platform}function tt(t){return t.signals.contexts.iframe.platform===s||t.signals.contexts.iframe.platform===l?!1:t.signals.device.platform!==t.signals.contexts.iframe.platform}function rt(t){return t.signals.automation.webdriverWritable===!0}function nt(t){return t.signals.graphics.webGL.renderer.includes("SwiftShader")}function it(t){return t.signals.locale.internationalization.timezone==="UTC"}function at(t){const e=t.signals.locale.languages.languages,n=t.signals.locale.languages.language;return n&&e&&Array.isArray(e)&&e.length>0?e[0]!==n:!1}function ot(t){return!!(t.signals.browser.features.chrome&&t.signals.browser.etsl!==33||t.signals.browser.features.safari&&t.signals.browser.etsl!==37||t.signals.browser.userAgent.includes("Firefox")&&t.signals.browser.etsl!==37)}function st(t){return[t.signals.browser.userAgent,t.signals.contexts.iframe.userAgent,t.signals.contexts.webWorker.userAgent].some(n=>/bot|headless/i.test(n.toLowerCase()))}function ct(t){const e=t.signals.graphics.webgpu,n=t.signals.graphics.webGL,i=t.signals.browser.userAgent;return!!((n.vendor.includes("Apple")||n.renderer.includes("Apple"))&&!i.includes("Mac")||e.vendor.includes("apple")&&!i.includes("Mac")||e.vendor.includes("apple")&&!n.renderer.includes("Apple"))}function lt(t){const e=t.signals.device.platform,n=t.signals.browser.userAgent,i=t.signals.browser.highEntropyValues.platform;return!!(n.includes("Mac")&&(e.includes("Win")||e.includes("Linux"))||n.includes("Windows")&&(e.includes("Mac")||e.includes("Linux"))||n.includes("Linux")&&(e.includes("Mac")||e.includes("Win"))||i!==l&&i!==s&&(i.includes("Mac")&&(e.includes("Win")||e.includes("Linux"))||i.includes("Windows")&&(e.includes("Mac")||e.includes("Linux"))||i.includes("Linux")&&(e.includes("Mac")||e.includes("Win"))))}async function ut(t,e){const n=new TextEncoder().encode(e),i=new TextEncoder().encode(t),a=new Uint8Array(i.length);for(let m=0;m<i.length;m++)a[m]=i[m]^n[m%n.length];const h=String.fromCharCode(...a);return btoa(h)}class dt{constructor(){this.fingerprint={signals:{automation:{webdriver:r,webdriverWritable:r,selenium:r,cdp:r,playwright:r,navigatorPropertyDescriptors:r},device:{cpuCount:r,memory:r,platform:r,screenResolution:{width:r,height:r,pixelDepth:r,colorDepth:r,availableWidth:r,availableHeight:r,innerWidth:r,innerHeight:r,hasMultipleDisplays:r},multimediaDevices:{speakers:r,microphones:r,webcams:r},mediaQueries:{prefersColorScheme:r,prefersReducedMotion:r,prefersReducedTransparency:r,colorGamut:r,pointer:r,anyPointer:r,hover:r,anyHover:r,colorDepth:r}},browser:{userAgent:r,features:{bitmask:r,chrome:r,brave:r,applePaySupport:r,opera:r,serial:r,attachShadow:r,caches:r,webAssembly:r,buffer:r,showModalDialog:r,safari:r,webkitPrefixedFunction:r,mozPrefixedFunction:r,usb:r,browserCapture:r,paymentRequestUpdateEvent:r,pressureObserver:r,audioSession:r,selectAudioOutput:r,barcodeDetector:r,battery:r,devicePosture:r,documentPictureInPicture:r,eyeDropper:r,editContext:r,fencedFrame:r,sanitizer:r,otpCredential:r},plugins:{isValidPluginArray:r,pluginCount:r,pluginNamesHash:r,pluginConsistency1:r,pluginOverflow:r},extensions:{bitmask:r,extensions:r},highEntropyValues:{architecture:r,bitness:r,brands:r,mobile:r,model:r,platform:r,platformVersion:r,uaFullVersion:r},etsl:r,maths:r,toSourceError:{toSourceError:r,hasToSource:r}},graphics:{webGL:{vendor:r,renderer:r},webgpu:{vendor:r,architecture:r,device:r,description:r},canvas:{hasModifiedCanvas:r,canvasFingerprint:r}},codecs:{audioCanPlayTypeHash:r,videoCanPlayTypeHash:r,audioMediaSourceHash:r,videoMediaSourceHash:r,rtcAudioCapabilitiesHash:r,rtcVideoCapabilitiesHash:r,hasMediaSource:r},locale:{internationalization:{timezone:r,localeLanguage:r},languages:{languages:r,language:r}},contexts:{iframe:{webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r},webWorker:{webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r,vendor:r,renderer:r}}},fsid:r,nonce:r,time:r,url:r,fastBotDetection:!1,fastBotDetectionDetails:{headlessChromeScreenResolution:{detected:!1,severity:"high"},hasWebdriver:{detected:!1,severity:"high"},hasWebdriverWritable:{detected:!1,severity:"high"},hasSeleniumProperty:{detected:!1,severity:"high"},hasCDP:{detected:!1,severity:"high"},hasPlaywright:{detected:!1,severity:"high"},hasImpossibleDeviceMemory:{detected:!1,severity:"high"},hasHighCPUCount:{detected:!1,severity:"high"},hasMissingChromeObject:{detected:!1,severity:"high"},hasWebdriverIframe:{detected:!1,severity:"high"},hasWebdriverWorker:{detected:!1,severity:"high"},hasMismatchWebGLInWorker:{detected:!1,severity:"high"},hasMismatchPlatformIframe:{detected:!1,severity:"high"},hasMismatchPlatformWorker:{detected:!1,severity:"high"},hasSwiftshaderRenderer:{detected:!1,severity:"low"},hasUTCTimezone:{detected:!1,severity:"medium"},hasMismatchLanguages:{detected:!1,severity:"low"},hasInconsistentEtsl:{detected:!1,severity:"high"},hasBotUserAgent:{detected:!1,severity:"high"},hasGPUMismatch:{detected:!1,severity:"high"},hasPlatformMismatch:{detected:!1,severity:"high"}}}}async collectSignal(e){try{return await e()}catch{return l}}generateFingerprintScannerId(){try{const e=this.fingerprint.signals,n=this.fingerprint.fastBotDetectionDetails,i="FS1",h=[n.headlessChromeScreenResolution.detected,n.hasWebdriver.detected,n.hasWebdriverWritable.detected,n.hasSeleniumProperty.detected,n.hasCDP.detected,n.hasPlaywright.detected,n.hasImpossibleDeviceMemory.detected,n.hasHighCPUCount.detected,n.hasMissingChromeObject.detected,n.hasWebdriverIframe.detected,n.hasWebdriverWorker.detected,n.hasMismatchWebGLInWorker.detected,n.hasMismatchPlatformIframe.detected,n.hasMismatchPlatformWorker.detected,n.hasSwiftshaderRenderer.detected,n.hasUTCTimezone.detected,n.hasMismatchLanguages.detected,n.hasInconsistentEtsl.detected,n.hasBotUserAgent.detected,n.hasGPUMismatch.detected,n.hasPlatformMismatch.detected].map(u=>u?"1":"0").join(""),m=[e.automation.webdriver===!0,e.automation.webdriverWritable===!0,e.automation.selenium===!0,e.automation.cdp===!0,e.automation.playwright===!0].map(u=>u?"1":"0").join(""),w=p(String(e.automation.navigatorPropertyDescriptors)).slice(0,4),o=`${m}h${w}`,v=typeof e.device.screenResolution.width=="number"?e.device.screenResolution.width:0,y=typeof e.device.screenResolution.height=="number"?e.device.screenResolution.height:0,W=typeof e.device.cpuCount=="number"?String(e.device.cpuCount).padStart(2,"0"):"00",E=typeof e.device.memory=="number"?String(Math.round(e.device.memory)).padStart(2,"0"):"00",k=[e.device.screenResolution.hasMultipleDisplays===!0,e.device.mediaQueries.prefersReducedMotion===!0,e.device.mediaQueries.prefersReducedTransparency===!0,e.device.mediaQueries.hover===!0,e.device.mediaQueries.anyHover===!0].map(u=>u?"1":"0").join(""),D=[e.device.platform,e.device.screenResolution.pixelDepth,e.device.screenResolution.colorDepth,e.device.multimediaDevices.speakers,e.device.multimediaDevices.microphones,e.device.multimediaDevices.webcams,e.device.mediaQueries.prefersColorScheme,e.device.mediaQueries.colorGamut,e.device.mediaQueries.pointer,e.device.mediaQueries.anyPointer,e.device.mediaQueries.colorDepth].map(u=>String(u)).join("|"),_=p(D).slice(0,6),R=`${v}x${y}c${W}m${E}b${k}h${_}`,I=typeof e.browser.features.bitmask=="string"?e.browser.features.bitmask:"0000000000",T=typeof e.browser.extensions.bitmask=="string"?e.browser.extensions.bitmask:"00000000",L=[e.browser.plugins.isValidPluginArray===!0,e.browser.plugins.pluginConsistency1===!0,e.browser.plugins.pluginOverflow===!0,e.browser.toSourceError.hasToSource===!0].map(u=>u?"1":"0").join(""),O=[e.browser.userAgent,e.browser.etsl,e.browser.maths,e.browser.plugins.pluginCount,e.browser.plugins.pluginNamesHash,e.browser.toSourceError.toSourceError,e.browser.highEntropyValues.architecture,e.browser.highEntropyValues.bitness,e.browser.highEntropyValues.platform,e.browser.highEntropyValues.platformVersion,e.browser.highEntropyValues.uaFullVersion,e.browser.highEntropyValues.mobile].map(u=>String(u)).join("|"),H=p(O).slice(0,6),F=`f${I}e${T}p${L}h${H}`,U=[e.graphics.canvas.hasModifiedCanvas===!0].map(u=>u?"1":"0").join(""),V=[e.graphics.webGL.vendor,e.graphics.webGL.renderer,e.graphics.webgpu.vendor,e.graphics.webgpu.architecture,e.graphics.webgpu.device,e.graphics.webgpu.description,e.graphics.canvas.canvasFingerprint].map(u=>String(u)).join("|"),G=p(V).slice(0,6),j=`${U}h${G}`,B=[e.codecs.hasMediaSource===!0].map(u=>u?"1":"0").join(""),N=[e.codecs.audioCanPlayTypeHash,e.codecs.videoCanPlayTypeHash,e.codecs.audioMediaSourceHash,e.codecs.videoMediaSourceHash,e.codecs.rtcAudioCapabilitiesHash,e.codecs.rtcVideoCapabilitiesHash].map(u=>String(u)).join("|"),z=p(N).slice(0,6),$=`${B}h${z}`,Q=typeof e.locale.languages.language=="string"?e.locale.languages.language.slice(0,2).toLowerCase():"xx",q=Array.isArray(e.locale.languages.languages)?e.locale.languages.languages.length:0,K=(typeof e.locale.internationalization.timezone=="string"?e.locale.internationalization.timezone:"unknown").replace(/[\/\s]/g,"-"),J=[e.locale.internationalization.timezone,e.locale.internationalization.localeLanguage,Array.isArray(e.locale.languages.languages)?e.locale.languages.languages.join(","):e.locale.languages.languages,e.locale.languages.language].map(u=>String(u)).join("|"),Y=p(J).slice(0,4),Z=`${Q}${q}t${K}_h${Y}`,X=[x(this.fingerprint,"iframe"),x(this.fingerprint,"worker"),e.contexts.iframe.webdriver===!0,e.contexts.webWorker.webdriver===!0].map(u=>u?"1":"0").join(""),ee=[e.contexts.iframe.userAgent,e.contexts.iframe.platform,e.contexts.iframe.memory,e.contexts.iframe.cpuCount,e.contexts.iframe.language,e.contexts.webWorker.userAgent,e.contexts.webWorker.platform,e.contexts.webWorker.memory,e.contexts.webWorker.cpuCount,e.contexts.webWorker.language,e.contexts.webWorker.vendor,e.contexts.webWorker.renderer].map(u=>String(u)).join("|"),te=p(ee).slice(0,6),re=`${X}h${te}`;return[i,h,o,R,F,j,$,Z,re].join("_")}catch(e){return console.error("Error generating fingerprint scanner id",e),l}}async encryptFingerprint(e){const n="__DEFAULT_FPSCANNER_KEY__";return n.length>20&&n.indexOf("DEFAULT")>0&&n.indexOf("FPSCANNER")>0&&console.warn('[fpscanner] WARNING: Using default encryption key! Run "npx fpscanner build --key=your-secret-key" to inject your own key. See: https://github.com/antoinevastel/fpscanner#advanced-custom-builds'),await ut(JSON.stringify(e),n)}getDetectionRules(){return[{name:"headlessChromeScreenResolution",severity:d,test:Be},{name:"hasWebdriver",severity:d,test:Ne},{name:"hasWebdriverWritable",severity:d,test:rt},{name:"hasSeleniumProperty",severity:d,test:ze},{name:"hasCDP",severity:d,test:$e},{name:"hasPlaywright",severity:d,test:Qe},{name:"hasImpossibleDeviceMemory",severity:d,test:qe},{name:"hasHighCPUCount",severity:d,test:Ke},{name:"hasMissingChromeObject",severity:d,test:Je},{name:"hasWebdriverIframe",severity:d,test:Ye},{name:"hasWebdriverWorker",severity:d,test:Ze},{name:"hasMismatchWebGLInWorker",severity:d,test:Xe},{name:"hasMismatchPlatformIframe",severity:d,test:tt},{name:"hasMismatchPlatformWorker",severity:d,test:et},{name:"hasSwiftshaderRenderer",severity:b,test:nt},{name:"hasUTCTimezone",severity:oe,test:it},{name:"hasMismatchLanguages",severity:b,test:at},{name:"hasInconsistentEtsl",severity:d,test:ot},{name:"hasBotUserAgent",severity:d,test:st},{name:"hasGPUMismatch",severity:d,test:ct},{name:"hasPlatformMismatch",severity:d,test:lt}]}runDetectionRules(){const e=this.getDetectionRules(),n={headlessChromeScreenResolution:{detected:!1,severity:"high"},hasWebdriver:{detected:!1,severity:"high"},hasWebdriverWritable:{detected:!1,severity:"high"},hasSeleniumProperty:{detected:!1,severity:"high"},hasCDP:{detected:!1,severity:"high"},hasPlaywright:{detected:!1,severity:"high"},hasImpossibleDeviceMemory:{detected:!1,severity:"high"},hasHighCPUCount:{detected:!1,severity:"high"},hasMissingChromeObject:{detected:!1,severity:"high"},hasWebdriverIframe:{detected:!1,severity:"high"},hasWebdriverWorker:{detected:!1,severity:"high"},hasMismatchWebGLInWorker:{detected:!1,severity:"high"},hasMismatchPlatformIframe:{detected:!1,severity:"high"},hasMismatchPlatformWorker:{detected:!1,severity:"high"},hasSwiftshaderRenderer:{detected:!1,severity:"low"},hasUTCTimezone:{detected:!1,severity:"medium"},hasMismatchLanguages:{detected:!1,severity:"low"},hasInconsistentEtsl:{detected:!1,severity:"high"},hasBotUserAgent:{detected:!1,severity:"high"},hasGPUMismatch:{detected:!1,severity:"high"},hasPlatformMismatch:{detected:!1,severity:"high"}};for(const i of e)try{const a=i.test(this.fingerprint);n[i.name]={detected:a,severity:i.severity}}catch{n[i.name]={detected:!1,severity:i.severity}}return n}async collectFingerprint(e={encrypt:!0}){const{encrypt:n=!0,skipWorker:i=!1}=e,a=this.fingerprint.signals,h={webdriver:this.collectSignal(ne),webdriverWritable:this.collectSignal(be),selenium:this.collectSignal(ye),cdp:this.collectSignal(ce),playwright:this.collectSignal(ue),navigatorPropertyDescriptors:this.collectSignal(Oe),cpuCount:this.collectSignal(de),memory:this.collectSignal(he),platform:this.collectSignal(ae),screenResolution:this.collectSignal(fe),multimediaDevices:this.collectSignal(Ee),mediaQueries:this.collectSignal(je),userAgent:this.collectSignal(ie),browserFeatures:this.collectSignal(Ge),plugins:this.collectSignal(We),browserExtensions:this.collectSignal(Ve),highEntropyValues:this.collectSignal(Se),etsl:this.collectSignal(me),maths:this.collectSignal(ge),toSourceError:this.collectSignal(_e),webGL:this.collectSignal(le),webgpu:this.collectSignal(we),canvas:this.collectSignal(Le),mediaCodecs:this.collectSignal(Re),internationalization:this.collectSignal(pe),languages:this.collectSignal(ve),iframe:this.collectSignal(ke),webWorker:i?Promise.resolve({webdriver:f,userAgent:f,platform:f,memory:f,cpuCount:f,language:f,vendor:f,renderer:f}):this.collectSignal(De),nonce:this.collectSignal(He),time:this.collectSignal(Fe),url:this.collectSignal(Ue)},m=Object.keys(h),w=await Promise.all(Object.values(h)),o=Object.fromEntries(m.map((v,y)=>[v,w[y]]));return a.automation.webdriver=o.webdriver,a.automation.webdriverWritable=o.webdriverWritable,a.automation.selenium=o.selenium,a.automation.cdp=o.cdp,a.automation.playwright=o.playwright,a.automation.navigatorPropertyDescriptors=o.navigatorPropertyDescriptors,a.device.cpuCount=o.cpuCount,a.device.memory=o.memory,a.device.platform=o.platform,a.device.screenResolution=o.screenResolution,a.device.multimediaDevices=o.multimediaDevices,a.device.mediaQueries=o.mediaQueries,a.browser.userAgent=o.userAgent,a.browser.features=o.browserFeatures,a.browser.plugins=o.plugins,a.browser.extensions=o.browserExtensions,a.browser.highEntropyValues=o.highEntropyValues,a.browser.etsl=o.etsl,a.browser.maths=o.maths,a.browser.toSourceError=o.toSourceError,a.graphics.webGL=o.webGL,a.graphics.webgpu=o.webgpu,a.graphics.canvas=o.canvas,a.codecs=o.mediaCodecs,a.locale.internationalization=o.internationalization,a.locale.languages=o.languages,a.contexts.iframe=o.iframe,a.contexts.webWorker=o.webWorker,this.fingerprint.nonce=o.nonce,this.fingerprint.time=o.time,this.fingerprint.url=o.url,this.fingerprint.fastBotDetectionDetails=this.runDetectionRules(),this.fingerprint.fastBotDetection=Object.values(this.fingerprint.fastBotDetectionDetails).some(v=>v.detected),this.fingerprint.fsid=this.generateFingerprintScannerId(),n?await this.encryptFingerprint(JSON.stringify(this.fingerprint)):this.fingerprint}}exports.default=dt;
|
|
32
|
+
}`,w=new Blob([m],{type:"application/javascript"});i=URL.createObjectURL(w),n=new Worker(i),a=window.setTimeout(()=>{d(),h(e,l),t(e)},2e3),n.onmessage=function(o){try{e.vendor=o.data.vendor,e.renderer=o.data.renderer,e.userAgent=o.data.userAgent,e.language=o.data.language,e.platform=o.data.platform,e.memory=o.data.memory,e.cpuCount=o.data.cpuCount}catch{h(e,l)}finally{d(),t(e)}},n.onerror=function(){d(),h(e,l),t(e)}}catch{d(),h(e,l),t(e)}})}function Re(){const t={toSourceError:r,hasToSource:!1};try{null.usdfsh}catch(e){t.toSourceError=e.toString()}try{throw"xyz"}catch(e){try{e.toSource(),t.hasToSource=!0}catch{t.hasToSource=!1}}return t}const C=['audio/mp4; codecs="mp4a.40.2"',"audio/mpeg;",'audio/webm; codecs="vorbis"','audio/ogg; codecs="vorbis"','audio/wav; codecs="1"','audio/ogg; codecs="speex"','audio/ogg; codecs="flac"','audio/3gpp; codecs="samr"'],P=['video/mp4; codecs="avc1.42E01E, mp4a.40.2"','video/mp4; codecs="avc1.42E01E"','video/mp4; codecs="avc1.58A01E"','video/mp4; codecs="avc1.4D401E"','video/mp4; codecs="avc1.64001E"','video/mp4; codecs="mp4v.20.8"','video/mp4; codecs="mp4v.20.240"','video/webm; codecs="vp8"','video/ogg; codecs="theora"','video/ogg; codecs="dirac"','video/3gpp; codecs="mp4v.20.8"','video/x-matroska; codecs="theora"'];function A(t,e){const n={};try{const i=document.createElement(e);for(const a of t)try{n[a]=i.canPlayType(a)||null}catch{n[a]=null}}catch{for(const i of t)n[i]=null}return n}function M(t){const e={},n=window.MediaSource;if(!n||typeof n.isTypeSupported!="function"){for(const i of t)e[i]=null;return e}for(const i of t)try{e[i]=n.isTypeSupported(i)}catch{e[i]=null}return e}function x(t){try{const e=window.RTCRtpReceiver;if(e&&typeof e.getCapabilities=="function"){const n=e.getCapabilities(t);return p(JSON.stringify(n))}return s}catch{return l}}function Ie(){const t={audioCanPlayTypeHash:s,videoCanPlayTypeHash:s,audioMediaSourceHash:s,videoMediaSourceHash:s,rtcAudioCapabilitiesHash:s,rtcVideoCapabilitiesHash:s,hasMediaSource:!1};try{t.hasMediaSource=!!window.MediaSource;const e=A(C,"audio"),n=A(P,"video");t.audioCanPlayTypeHash=p(JSON.stringify(e)),t.videoCanPlayTypeHash=p(JSON.stringify(n));const i=M(C),a=M(P);t.audioMediaSourceHash=p(JSON.stringify(i)),t.videoMediaSourceHash=p(JSON.stringify(a)),t.rtcAudioCapabilitiesHash=x("audio"),t.rtcVideoCapabilitiesHash=x("video")}catch{h(t,l)}return t}async function Le(){return new Promise(t=>{try{const e=new Image,n=document.createElement("canvas").getContext("2d");e.onload=()=>{n.drawImage(e,0,0),t(n.getImageData(0,0,1,1).data.filter(i=>i===0).length!=4)},e.onerror=()=>{t(l)},e.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII="}catch{t(l)}})}function Te(){var t=document.createElement("canvas");t.width=400,t.height=200,t.style.display="inline";var e=t.getContext("2d");try{return e.rect(0,0,10,10),e.rect(2,2,6,6),e.textBaseline="alphabetic",e.fillStyle="#f60",e.fillRect(125,1,62,20),e.fillStyle="#069",e.font="11pt no-real-font-123",e.fillText("Cwm fjordbank glyphs vext quiz, 😃",2,15),e.fillStyle="rgba(102, 204, 0, 0.2)",e.font="18pt Arial",e.fillText("Cwm fjordbank glyphs vext quiz, 😃",4,45),e.globalCompositeOperation="multiply",e.fillStyle="rgb(255,0,255)",e.beginPath(),e.arc(50,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(0,255,255)",e.beginPath(),e.arc(100,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,255,0)",e.beginPath(),e.arc(75,100,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,0,255)",e.arc(75,75,75,0,2*Math.PI,!0),e.arc(75,75,25,0,2*Math.PI,!0),e.fill("evenodd"),p(t.toDataURL())}catch{return l}}async function Oe(){const t={hasModifiedCanvas:r,canvasFingerprint:r};return t.hasModifiedCanvas=await Le(),t.canvasFingerprint=Te(),t}function He(){const t=["deviceMemory","hardwareConcurrency","language","languages","platform"],e=[];for(const n of t){const i=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator),n);i&&i.value?e.push("1"):e.push("0")}return e.join("")}function Ue(){return Math.random().toString(36).substring(2,15)}function Fe(){return new Date().getTime()}function Ge(){return window.location.href}function W(t,e){const n=t.signals;return e==="iframe"?n.contexts.iframe.webdriver!==n.automation.webdriver||n.contexts.iframe.userAgent!==n.browser.userAgent||n.contexts.iframe.platform!==n.device.platform||n.contexts.iframe.memory!==n.device.memory||n.contexts.iframe.cpuCount!==n.device.cpuCount:n.contexts.webWorker.webdriver!==n.automation.webdriver||n.contexts.webWorker.userAgent!==n.browser.userAgent||n.contexts.webWorker.platform!==n.device.platform||n.contexts.webWorker.memory!==n.device.memory||n.contexts.webWorker.cpuCount!==n.device.cpuCount}function Ve(){const t={bitmask:r,extensions:[]},e=document.body.hasAttribute("data-gr-ext-installed"),n=typeof window.ethereum<"u",i=document.getElementById("coupon-birds-drop-div")!==null,a=document.querySelector("deepl-input-controller")!==null,d=document.getElementById("monica-content-root")!==null,m=document.querySelector("chatgpt-sidebar")!==null,w=typeof window.__REQUESTLY__<"u",o=Array.from(document.querySelectorAll("*")).filter(v=>v.tagName.toLowerCase().startsWith("veepn-")).length>0;return t.bitmask=[e?"1":"0",n?"1":"0",i?"1":"0",a?"1":"0",d?"1":"0",m?"1":"0",w?"1":"0",o?"1":"0"].join(""),e&&t.extensions.push("grammarly"),n&&t.extensions.push("metamask"),i&&t.extensions.push("coupon-birds"),a&&t.extensions.push("deepl"),d&&t.extensions.push("monica-ai"),m&&t.extensions.push("sider-ai"),w&&t.extensions.push("requestly"),o&&t.extensions.push("veepn"),t}function c(t){try{return t()}catch{return!1}}function Be(){const t={bitmask:r,chrome:c(()=>"chrome"in window),brave:c(()=>"brave"in navigator),applePaySupport:c(()=>"ApplePaySetup"in window),opera:c(()=>typeof window.opr<"u"||typeof window.onoperadetachedviewchange=="object"),serial:c(()=>window.navigator.serial!==void 0),attachShadow:c(()=>!!Element.prototype.attachShadow),caches:c(()=>!!window.caches),webAssembly:c(()=>!!window.WebAssembly&&!!window.WebAssembly.instantiate),buffer:c(()=>"Buffer"in window),showModalDialog:c(()=>"showModalDialog"in window),safari:c(()=>"safari"in window),webkitPrefixedFunction:c(()=>"webkitCancelAnimationFrame"in window),mozPrefixedFunction:c(()=>"mozGetUserMedia"in navigator),usb:c(()=>typeof window.USB=="function"),browserCapture:c(()=>typeof window.BrowserCaptureMediaStreamTrack=="function"),paymentRequestUpdateEvent:c(()=>typeof window.PaymentRequestUpdateEvent=="function"),pressureObserver:c(()=>typeof window.PressureObserver=="function"),audioSession:c(()=>"audioSession"in navigator),selectAudioOutput:c(()=>typeof navigator<"u"&&typeof navigator.mediaDevices<"u"&&typeof navigator.mediaDevices.selectAudioOutput=="function"),barcodeDetector:c(()=>"BarcodeDetector"in window),battery:c(()=>"getBattery"in navigator),devicePosture:c(()=>"DevicePosture"in window),documentPictureInPicture:c(()=>"documentPictureInPicture"in window),eyeDropper:c(()=>"EyeDropper"in window),editContext:c(()=>"EditContext"in window),fencedFrame:c(()=>"FencedFrameConfig"in window),sanitizer:c(()=>"Sanitizer"in window),otpCredential:c(()=>"OTPCredential"in window)},e=Object.keys(t).filter(n=>n!=="bitmask").map(n=>t[n]?"1":"0").join("");return t.bitmask=e,t}function je(){const t={prefersColorScheme:r,prefersReducedMotion:r,prefersReducedTransparency:r,colorGamut:r,pointer:r,anyPointer:r,hover:r,anyHover:r,colorDepth:r};try{window.matchMedia("(prefers-color-scheme: dark)").matches?t.prefersColorScheme="dark":window.matchMedia("(prefers-color-scheme: light)").matches?t.prefersColorScheme="light":t.prefersColorScheme=null,t.prefersReducedMotion=window.matchMedia("(prefers-reduced-motion: reduce)").matches,t.prefersReducedTransparency=window.matchMedia("(prefers-reduced-transparency: reduce)").matches,window.matchMedia("(color-gamut: rec2020)").matches?t.colorGamut="rec2020":window.matchMedia("(color-gamut: p3)").matches?t.colorGamut="p3":window.matchMedia("(color-gamut: srgb)").matches?t.colorGamut="srgb":t.colorGamut=null,window.matchMedia("(pointer: fine)").matches?t.pointer="fine":window.matchMedia("(pointer: coarse)").matches?t.pointer="coarse":window.matchMedia("(pointer: none)").matches?t.pointer="none":t.pointer=null,window.matchMedia("(any-pointer: fine)").matches?t.anyPointer="fine":window.matchMedia("(any-pointer: coarse)").matches?t.anyPointer="coarse":window.matchMedia("(any-pointer: none)").matches?t.anyPointer="none":t.anyPointer=null,t.hover=window.matchMedia("(hover: hover)").matches,t.anyHover=window.matchMedia("(any-hover: hover)").matches;let e=0;for(let n=0;n<=16;n++)window.matchMedia(`(color: ${n})`).matches&&(e=n);t.colorDepth=e}catch{h(t,l)}return t}function Ne(t){const e=t.signals.device.screenResolution;return e.width===800&&e.height===600||e.availableWidth===800&&e.availableHeight===600||e.innerWidth===800&&e.innerHeight===600}function ze(t){return t.signals.automation.webdriver===!0}function $e(t){return!!t.signals.automation.selenium}function Qe(t){return t.signals.automation.cdp===!0}function qe(t){return t.signals.automation.playwright===!0}function Ke(t){return typeof t.signals.device.memory!="number"?!1:t.signals.device.memory>32||t.signals.device.memory<.25}function Je(t){return typeof t.signals.device.cpuCount!="number"?!1:t.signals.device.cpuCount>70}function Ye(t){return t.includes("Android")||t.includes("iPhone")||t.includes("iPod")||t.includes("iPad")}function Ze(t){const e=t.signals.browser.userAgent;return typeof e!="string"||!e.includes("Chrome")||Ye(e)?!1:t.signals.browser.features.chrome===!1}function Xe(t){return t.signals.contexts.iframe.webdriver===!0}function et(t){return t.signals.contexts.webWorker.webdriver===!0}function y(t){return t===s||t===l||t===f||t===r}function tt(t){const e=t.signals.contexts.webWorker,n=t.signals.graphics.webGL;return y(n.vendor)||y(n.renderer)||y(e.vendor)||y(e.renderer)?!1:e.vendor!==n.vendor||e.renderer!==n.renderer}function rt(t,e){const n=t.includes("iPad"),i=e.includes("iPad");if(n===i)return!1;const a=d=>d==="MacIntel"||d==="MacPPC";return a(t)||a(e)}function nt(t){if(t.signals.contexts.webWorker.platform===s||t.signals.contexts.webWorker.platform===l||t.signals.contexts.webWorker.platform===f)return!1;const e=t.signals.device.platform,n=t.signals.contexts.webWorker.platform;return!(e===n||rt(e,n))}function it(t){return t.signals.contexts.iframe.platform===s||t.signals.contexts.iframe.platform===l?!1:t.signals.device.platform!==t.signals.contexts.iframe.platform}function at(t){return t.signals.automation.webdriverWritable===!0}function ot(t){return t.signals.graphics.webGL.renderer.includes("SwiftShader")}function st(t){return t.signals.locale.internationalization.timezone==="UTC"}function ct(t){const e=t.signals.locale.languages.languages,n=t.signals.locale.languages.language;return n&&e&&Array.isArray(e)&&e.length>0?e[0]!==n:!1}function lt(t){return!!(t.signals.browser.features.chrome&&t.signals.browser.etsl!==33||t.signals.browser.features.safari&&t.signals.browser.etsl!==37||t.signals.browser.userAgent.includes("Firefox")&&t.signals.browser.etsl!==37)}function ut(t){return[t.signals.browser.userAgent,t.signals.contexts.iframe.userAgent,t.signals.contexts.webWorker.userAgent].some(n=>/bot|headless/i.test(n.toLowerCase()))}function dt(t){const e=t.signals.graphics.webgpu,n=t.signals.graphics.webGL,i=t.signals.browser.userAgent;return!!((n.vendor.includes("Apple")||n.renderer.includes("Apple"))&&!i.includes("Mac")||e.vendor.includes("apple")&&!i.includes("Mac")||e.vendor.includes("apple")&&!n.renderer.includes("Apple"))}function gt(t){const e=t.signals.device.platform,n=t.signals.browser.userAgent,i=t.signals.browser.highEntropyValues.platform;return!!(n.includes("Mac")&&(e.includes("Win")||e.includes("Linux"))||n.includes("Windows")&&(e.includes("Mac")||e.includes("Linux"))||n.includes("Linux")&&(e.includes("Mac")||e.includes("Win"))||i!==l&&i!==s&&(i.includes("Mac")&&(e.includes("Win")||e.includes("Linux"))||i.includes("Windows")&&(e.includes("Mac")||e.includes("Linux"))||i.includes("Linux")&&(e.includes("Mac")||e.includes("Win"))))}async function ht(t,e){const n=new TextEncoder().encode(e),i=new TextEncoder().encode(t),a=new Uint8Array(i.length);for(let m=0;m<i.length;m++)a[m]=i[m]^n[m%n.length];const d=String.fromCharCode(...a);return btoa(d)}class mt{constructor(){this.fingerprint={signals:{automation:{webdriver:r,webdriverWritable:r,selenium:r,cdp:r,playwright:r,navigatorPropertyDescriptors:r},device:{cpuCount:r,memory:r,platform:r,screenResolution:{width:r,height:r,pixelDepth:r,colorDepth:r,availableWidth:r,availableHeight:r,innerWidth:r,innerHeight:r,hasMultipleDisplays:r},multimediaDevices:{speakers:r,microphones:r,webcams:r},mediaQueries:{prefersColorScheme:r,prefersReducedMotion:r,prefersReducedTransparency:r,colorGamut:r,pointer:r,anyPointer:r,hover:r,anyHover:r,colorDepth:r}},browser:{userAgent:r,features:{bitmask:r,chrome:r,brave:r,applePaySupport:r,opera:r,serial:r,attachShadow:r,caches:r,webAssembly:r,buffer:r,showModalDialog:r,safari:r,webkitPrefixedFunction:r,mozPrefixedFunction:r,usb:r,browserCapture:r,paymentRequestUpdateEvent:r,pressureObserver:r,audioSession:r,selectAudioOutput:r,barcodeDetector:r,battery:r,devicePosture:r,documentPictureInPicture:r,eyeDropper:r,editContext:r,fencedFrame:r,sanitizer:r,otpCredential:r},plugins:{isValidPluginArray:r,pluginCount:r,pluginNamesHash:r,pluginConsistency1:r,pluginOverflow:r},extensions:{bitmask:r,extensions:r},highEntropyValues:{architecture:r,bitness:r,brands:r,mobile:r,model:r,platform:r,platformVersion:r,uaFullVersion:r},etsl:r,maths:r,toSourceError:{toSourceError:r,hasToSource:r}},graphics:{webGL:{vendor:r,renderer:r},webgpu:{vendor:r,architecture:r,device:r,description:r},canvas:{hasModifiedCanvas:r,canvasFingerprint:r}},codecs:{audioCanPlayTypeHash:r,videoCanPlayTypeHash:r,audioMediaSourceHash:r,videoMediaSourceHash:r,rtcAudioCapabilitiesHash:r,rtcVideoCapabilitiesHash:r,hasMediaSource:r},locale:{internationalization:{timezone:r,localeLanguage:r},languages:{languages:r,language:r}},contexts:{iframe:{webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r},webWorker:{webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r,vendor:r,renderer:r}}},fsid:r,nonce:r,time:r,url:r,fastBotDetection:!1,fastBotDetectionDetails:{headlessChromeScreenResolution:{detected:!1,severity:"high"},hasWebdriver:{detected:!1,severity:"high"},hasWebdriverWritable:{detected:!1,severity:"high"},hasSeleniumProperty:{detected:!1,severity:"high"},hasCDP:{detected:!1,severity:"high"},hasPlaywright:{detected:!1,severity:"high"},hasImpossibleDeviceMemory:{detected:!1,severity:"high"},hasHighCPUCount:{detected:!1,severity:"high"},hasMissingChromeObject:{detected:!1,severity:"high"},hasWebdriverIframe:{detected:!1,severity:"high"},hasWebdriverWorker:{detected:!1,severity:"high"},hasMismatchWebGLInWorker:{detected:!1,severity:"high"},hasMismatchPlatformIframe:{detected:!1,severity:"high"},hasMismatchPlatformWorker:{detected:!1,severity:"high"},hasSwiftshaderRenderer:{detected:!1,severity:"low"},hasUTCTimezone:{detected:!1,severity:"medium"},hasMismatchLanguages:{detected:!1,severity:"low"},hasInconsistentEtsl:{detected:!1,severity:"high"},hasBotUserAgent:{detected:!1,severity:"high"},hasGPUMismatch:{detected:!1,severity:"high"},hasPlatformMismatch:{detected:!1,severity:"high"}}}}async collectSignal(e){try{return await e()}catch{return l}}generateFingerprintScannerId(){try{const e=this.fingerprint.signals,n=this.fingerprint.fastBotDetectionDetails,i="FS1",d=[n.headlessChromeScreenResolution.detected,n.hasWebdriver.detected,n.hasWebdriverWritable.detected,n.hasSeleniumProperty.detected,n.hasCDP.detected,n.hasPlaywright.detected,n.hasImpossibleDeviceMemory.detected,n.hasHighCPUCount.detected,n.hasMissingChromeObject.detected,n.hasWebdriverIframe.detected,n.hasWebdriverWorker.detected,n.hasMismatchWebGLInWorker.detected,n.hasMismatchPlatformIframe.detected,n.hasMismatchPlatformWorker.detected,n.hasSwiftshaderRenderer.detected,n.hasUTCTimezone.detected,n.hasMismatchLanguages.detected,n.hasInconsistentEtsl.detected,n.hasBotUserAgent.detected,n.hasGPUMismatch.detected,n.hasPlatformMismatch.detected].map(u=>u?"1":"0").join(""),m=[e.automation.webdriver===!0,e.automation.webdriverWritable===!0,e.automation.selenium===!0,e.automation.cdp===!0,e.automation.playwright===!0].map(u=>u?"1":"0").join(""),w=p(String(e.automation.navigatorPropertyDescriptors)).slice(0,4),o=`${m}h${w}`,v=typeof e.device.screenResolution.width=="number"?e.device.screenResolution.width:0,b=typeof e.device.screenResolution.height=="number"?e.device.screenResolution.height:0,E=typeof e.device.cpuCount=="number"?String(e.device.cpuCount).padStart(2,"0"):"00",k=typeof e.device.memory=="number"?String(Math.round(e.device.memory)).padStart(2,"0"):"00",D=[e.device.screenResolution.hasMultipleDisplays===!0,e.device.mediaQueries.prefersReducedMotion===!0,e.device.mediaQueries.prefersReducedTransparency===!0,e.device.mediaQueries.hover===!0,e.device.mediaQueries.anyHover===!0].map(u=>u?"1":"0").join(""),_=[e.device.platform,e.device.screenResolution.pixelDepth,e.device.screenResolution.colorDepth,e.device.multimediaDevices.speakers,e.device.multimediaDevices.microphones,e.device.multimediaDevices.webcams,e.device.mediaQueries.prefersColorScheme,e.device.mediaQueries.colorGamut,e.device.mediaQueries.pointer,e.device.mediaQueries.anyPointer,e.device.mediaQueries.colorDepth].map(u=>String(u)).join("|"),R=p(_).slice(0,6),I=`${v}x${b}c${E}m${k}b${D}h${R}`,L=typeof e.browser.features.bitmask=="string"?e.browser.features.bitmask:"0000000000",T=typeof e.browser.extensions.bitmask=="string"?e.browser.extensions.bitmask:"00000000",O=[e.browser.plugins.isValidPluginArray===!0,e.browser.plugins.pluginConsistency1===!0,e.browser.plugins.pluginOverflow===!0,e.browser.toSourceError.hasToSource===!0].map(u=>u?"1":"0").join(""),H=[e.browser.userAgent,e.browser.etsl,e.browser.maths,e.browser.plugins.pluginCount,e.browser.plugins.pluginNamesHash,e.browser.toSourceError.toSourceError,e.browser.highEntropyValues.architecture,e.browser.highEntropyValues.bitness,e.browser.highEntropyValues.platform,e.browser.highEntropyValues.platformVersion,e.browser.highEntropyValues.uaFullVersion,e.browser.highEntropyValues.mobile].map(u=>String(u)).join("|"),U=p(H).slice(0,6),F=`f${L}e${T}p${O}h${U}`,G=[e.graphics.canvas.hasModifiedCanvas===!0].map(u=>u?"1":"0").join(""),V=[e.graphics.webGL.vendor,e.graphics.webGL.renderer,e.graphics.webgpu.vendor,e.graphics.webgpu.architecture,e.graphics.webgpu.device,e.graphics.webgpu.description,e.graphics.canvas.canvasFingerprint].map(u=>String(u)).join("|"),B=p(V).slice(0,6),j=`${G}h${B}`,N=[e.codecs.hasMediaSource===!0].map(u=>u?"1":"0").join(""),z=[e.codecs.audioCanPlayTypeHash,e.codecs.videoCanPlayTypeHash,e.codecs.audioMediaSourceHash,e.codecs.videoMediaSourceHash,e.codecs.rtcAudioCapabilitiesHash,e.codecs.rtcVideoCapabilitiesHash].map(u=>String(u)).join("|"),$=p(z).slice(0,6),Q=`${N}h${$}`,q=typeof e.locale.languages.language=="string"?e.locale.languages.language.slice(0,2).toLowerCase():"xx",K=Array.isArray(e.locale.languages.languages)?e.locale.languages.languages.length:0,J=(typeof e.locale.internationalization.timezone=="string"?e.locale.internationalization.timezone:"unknown").replace(/[\/\s]/g,"-"),Y=[e.locale.internationalization.timezone,e.locale.internationalization.localeLanguage,Array.isArray(e.locale.languages.languages)?e.locale.languages.languages.join(","):e.locale.languages.languages,e.locale.languages.language].map(u=>String(u)).join("|"),Z=p(Y).slice(0,4),X=`${q}${K}t${J}_h${Z}`,ee=[W(this.fingerprint,"iframe"),W(this.fingerprint,"worker"),e.contexts.iframe.webdriver===!0,e.contexts.webWorker.webdriver===!0].map(u=>u?"1":"0").join(""),te=[e.contexts.iframe.userAgent,e.contexts.iframe.platform,e.contexts.iframe.memory,e.contexts.iframe.cpuCount,e.contexts.iframe.language,e.contexts.webWorker.userAgent,e.contexts.webWorker.platform,e.contexts.webWorker.memory,e.contexts.webWorker.cpuCount,e.contexts.webWorker.language,e.contexts.webWorker.vendor,e.contexts.webWorker.renderer].map(u=>String(u)).join("|"),re=p(te).slice(0,6),ne=`${ee}h${re}`;return[i,d,o,I,F,j,Q,X,ne].join("_")}catch(e){return console.error("Error generating fingerprint scanner id",e),l}}async encryptFingerprint(e){const n="__DEFAULT_FPSCANNER_KEY__";return n.length>20&&n.indexOf("DEFAULT")>0&&n.indexOf("FPSCANNER")>0&&console.warn('[fpscanner] WARNING: Using default encryption key! Run "npx fpscanner build --key=your-secret-key" to inject your own key. See: https://github.com/antoinevastel/fpscanner#advanced-custom-builds'),await ht(JSON.stringify(e),n)}getDetectionRules(){return[{name:"headlessChromeScreenResolution",severity:g,test:Ne},{name:"hasWebdriver",severity:g,test:ze},{name:"hasWebdriverWritable",severity:g,test:at},{name:"hasSeleniumProperty",severity:g,test:$e},{name:"hasCDP",severity:g,test:Qe},{name:"hasPlaywright",severity:g,test:qe},{name:"hasImpossibleDeviceMemory",severity:g,test:Ke},{name:"hasHighCPUCount",severity:g,test:Je},{name:"hasMissingChromeObject",severity:g,test:Ze},{name:"hasWebdriverIframe",severity:g,test:Xe},{name:"hasWebdriverWorker",severity:g,test:et},{name:"hasMismatchWebGLInWorker",severity:g,test:tt},{name:"hasMismatchPlatformIframe",severity:g,test:it},{name:"hasMismatchPlatformWorker",severity:g,test:nt},{name:"hasSwiftshaderRenderer",severity:S,test:ot},{name:"hasUTCTimezone",severity:se,test:st},{name:"hasMismatchLanguages",severity:S,test:ct},{name:"hasInconsistentEtsl",severity:g,test:lt},{name:"hasBotUserAgent",severity:g,test:ut},{name:"hasGPUMismatch",severity:g,test:dt},{name:"hasPlatformMismatch",severity:g,test:gt}]}runDetectionRules(){const e=this.getDetectionRules(),n={headlessChromeScreenResolution:{detected:!1,severity:"high"},hasWebdriver:{detected:!1,severity:"high"},hasWebdriverWritable:{detected:!1,severity:"high"},hasSeleniumProperty:{detected:!1,severity:"high"},hasCDP:{detected:!1,severity:"high"},hasPlaywright:{detected:!1,severity:"high"},hasImpossibleDeviceMemory:{detected:!1,severity:"high"},hasHighCPUCount:{detected:!1,severity:"high"},hasMissingChromeObject:{detected:!1,severity:"high"},hasWebdriverIframe:{detected:!1,severity:"high"},hasWebdriverWorker:{detected:!1,severity:"high"},hasMismatchWebGLInWorker:{detected:!1,severity:"high"},hasMismatchPlatformIframe:{detected:!1,severity:"high"},hasMismatchPlatformWorker:{detected:!1,severity:"high"},hasSwiftshaderRenderer:{detected:!1,severity:"low"},hasUTCTimezone:{detected:!1,severity:"medium"},hasMismatchLanguages:{detected:!1,severity:"low"},hasInconsistentEtsl:{detected:!1,severity:"high"},hasBotUserAgent:{detected:!1,severity:"high"},hasGPUMismatch:{detected:!1,severity:"high"},hasPlatformMismatch:{detected:!1,severity:"high"}};for(const i of e)try{const a=i.test(this.fingerprint);n[i.name]={detected:a,severity:i.severity}}catch{n[i.name]={detected:!1,severity:i.severity}}return n}async collectFingerprint(e={encrypt:!0}){const{encrypt:n=!0,skipWorker:i=!1}=e,a=this.fingerprint.signals,d={webdriver:this.collectSignal(ie),webdriverWritable:this.collectSignal(Se),selenium:this.collectSignal(be),cdp:this.collectSignal(le),playwright:this.collectSignal(de),navigatorPropertyDescriptors:this.collectSignal(He),cpuCount:this.collectSignal(ge),memory:this.collectSignal(me),platform:this.collectSignal(oe),screenResolution:this.collectSignal(ve),multimediaDevices:this.collectSignal(ke),mediaQueries:this.collectSignal(je),userAgent:this.collectSignal(ae),browserFeatures:this.collectSignal(Be),plugins:this.collectSignal(Ee),browserExtensions:this.collectSignal(Ve),highEntropyValues:this.collectSignal(Ce),etsl:this.collectSignal(pe),maths:this.collectSignal(he),toSourceError:this.collectSignal(Re),webGL:this.collectSignal(ue),webgpu:this.collectSignal(ye),canvas:this.collectSignal(Oe),mediaCodecs:this.collectSignal(Ie),internationalization:this.collectSignal(fe),languages:this.collectSignal(we),iframe:this.collectSignal(De),webWorker:i?Promise.resolve({webdriver:f,userAgent:f,platform:f,memory:f,cpuCount:f,language:f,vendor:f,renderer:f}):this.collectSignal(_e),nonce:this.collectSignal(Ue),time:this.collectSignal(Fe),url:this.collectSignal(Ge)},m=Object.keys(d),w=await Promise.all(Object.values(d)),o=Object.fromEntries(m.map((v,b)=>[v,w[b]]));return a.automation.webdriver=o.webdriver,a.automation.webdriverWritable=o.webdriverWritable,a.automation.selenium=o.selenium,a.automation.cdp=o.cdp,a.automation.playwright=o.playwright,a.automation.navigatorPropertyDescriptors=o.navigatorPropertyDescriptors,a.device.cpuCount=o.cpuCount,a.device.memory=o.memory,a.device.platform=o.platform,a.device.screenResolution=o.screenResolution,a.device.multimediaDevices=o.multimediaDevices,a.device.mediaQueries=o.mediaQueries,a.browser.userAgent=o.userAgent,a.browser.features=o.browserFeatures,a.browser.plugins=o.plugins,a.browser.extensions=o.browserExtensions,a.browser.highEntropyValues=o.highEntropyValues,a.browser.etsl=o.etsl,a.browser.maths=o.maths,a.browser.toSourceError=o.toSourceError,a.graphics.webGL=o.webGL,a.graphics.webgpu=o.webgpu,a.graphics.canvas=o.canvas,a.codecs=o.mediaCodecs,a.locale.internationalization=o.internationalization,a.locale.languages=o.languages,a.contexts.iframe=o.iframe,a.contexts.webWorker=o.webWorker,this.fingerprint.nonce=o.nonce,this.fingerprint.time=o.time,this.fingerprint.url=o.url,this.fingerprint.fastBotDetectionDetails=this.runDetectionRules(),this.fingerprint.fastBotDetection=Object.values(this.fingerprint.fastBotDetectionDetails).some(v=>v.detected),this.fingerprint.fsid=this.generateFingerprintScannerId(),n?await this.encryptFingerprint(JSON.stringify(this.fingerprint)):this.fingerprint}}exports.default=mt;
|
package/dist/fpScanner.es.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
function
|
|
1
|
+
function ie() {
|
|
2
2
|
return navigator.webdriver;
|
|
3
3
|
}
|
|
4
|
-
function
|
|
4
|
+
function ae() {
|
|
5
5
|
return navigator.userAgent;
|
|
6
6
|
}
|
|
7
|
-
function
|
|
7
|
+
function oe() {
|
|
8
8
|
return navigator.platform;
|
|
9
9
|
}
|
|
10
|
-
const l = "ERROR", r = "INIT", s = "NA", f = "SKIPPED",
|
|
10
|
+
const l = "ERROR", r = "INIT", s = "NA", f = "SKIPPED", g = "high", S = "low", se = "medium";
|
|
11
11
|
function p(t) {
|
|
12
12
|
let e = 0;
|
|
13
13
|
for (let n = 0, i = t.length; n < i; n++) {
|
|
@@ -20,10 +20,10 @@ function h(t, e) {
|
|
|
20
20
|
for (const n in t)
|
|
21
21
|
t[n] = e;
|
|
22
22
|
}
|
|
23
|
-
function
|
|
23
|
+
function ce() {
|
|
24
24
|
return navigator.buildID === "20181001000000";
|
|
25
25
|
}
|
|
26
|
-
function
|
|
26
|
+
function le() {
|
|
27
27
|
try {
|
|
28
28
|
let t = !1;
|
|
29
29
|
const e = Error.prepareStackTrace;
|
|
@@ -36,12 +36,12 @@ function ce() {
|
|
|
36
36
|
return l;
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
function
|
|
39
|
+
function ue() {
|
|
40
40
|
const t = {
|
|
41
41
|
vendor: r,
|
|
42
42
|
renderer: r
|
|
43
43
|
};
|
|
44
|
-
if (
|
|
44
|
+
if (ce())
|
|
45
45
|
return h(t, s), t;
|
|
46
46
|
try {
|
|
47
47
|
var e = document.createElement("canvas"), n = e.getContext("webgl") || e.getContext("experimental-webgl");
|
|
@@ -51,10 +51,10 @@ function le() {
|
|
|
51
51
|
}
|
|
52
52
|
return t;
|
|
53
53
|
}
|
|
54
|
-
function
|
|
54
|
+
function de() {
|
|
55
55
|
return "__pwInitScripts" in window || "__playwright__binding__" in window;
|
|
56
56
|
}
|
|
57
|
-
function
|
|
57
|
+
function ge() {
|
|
58
58
|
return navigator.hardwareConcurrency || s;
|
|
59
59
|
}
|
|
60
60
|
function he() {
|
|
@@ -73,13 +73,13 @@ function he() {
|
|
|
73
73
|
}
|
|
74
74
|
}), p(t.map(String).join(","));
|
|
75
75
|
}
|
|
76
|
-
function
|
|
76
|
+
function me() {
|
|
77
77
|
return navigator.deviceMemory || s;
|
|
78
78
|
}
|
|
79
|
-
function
|
|
79
|
+
function pe() {
|
|
80
80
|
return eval.toString().length;
|
|
81
81
|
}
|
|
82
|
-
function
|
|
82
|
+
function fe() {
|
|
83
83
|
const t = {
|
|
84
84
|
timezone: r,
|
|
85
85
|
localeLanguage: r
|
|
@@ -95,7 +95,7 @@ function pe() {
|
|
|
95
95
|
}
|
|
96
96
|
return t;
|
|
97
97
|
}
|
|
98
|
-
function
|
|
98
|
+
function ve() {
|
|
99
99
|
return {
|
|
100
100
|
width: window.screen.width,
|
|
101
101
|
height: window.screen.height,
|
|
@@ -108,13 +108,13 @@ function fe() {
|
|
|
108
108
|
hasMultipleDisplays: typeof screen.isExtended < "u" ? screen.isExtended : s
|
|
109
109
|
};
|
|
110
110
|
}
|
|
111
|
-
function
|
|
111
|
+
function we() {
|
|
112
112
|
return {
|
|
113
113
|
languages: navigator.languages,
|
|
114
114
|
language: navigator.language
|
|
115
115
|
};
|
|
116
116
|
}
|
|
117
|
-
async function
|
|
117
|
+
async function ye() {
|
|
118
118
|
const t = {
|
|
119
119
|
vendor: r,
|
|
120
120
|
architecture: r,
|
|
@@ -132,7 +132,7 @@ async function we() {
|
|
|
132
132
|
h(t, s);
|
|
133
133
|
return t;
|
|
134
134
|
}
|
|
135
|
-
function
|
|
135
|
+
function be() {
|
|
136
136
|
const t = [
|
|
137
137
|
"__driver_evaluate",
|
|
138
138
|
"__webdriver_evaluate",
|
|
@@ -166,7 +166,7 @@ function ye() {
|
|
|
166
166
|
}
|
|
167
167
|
return e = e || !!document.__webdriver_script_fn || !!window.domAutomation || !!window.domAutomationController, e;
|
|
168
168
|
}
|
|
169
|
-
function
|
|
169
|
+
function Se() {
|
|
170
170
|
try {
|
|
171
171
|
const t = "webdriver", e = window.navigator;
|
|
172
172
|
if (!e[t] && !e.hasOwnProperty(t)) {
|
|
@@ -179,7 +179,7 @@ function be() {
|
|
|
179
179
|
return !1;
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
|
-
async function
|
|
182
|
+
async function Ce() {
|
|
183
183
|
const t = window.navigator, e = {
|
|
184
184
|
architecture: r,
|
|
185
185
|
bitness: r,
|
|
@@ -210,7 +210,7 @@ async function Se() {
|
|
|
210
210
|
h(e, s);
|
|
211
211
|
return e;
|
|
212
212
|
}
|
|
213
|
-
function
|
|
213
|
+
function Pe() {
|
|
214
214
|
if (!navigator.plugins) return !1;
|
|
215
215
|
const t = typeof navigator.plugins.toString == "function" ? navigator.plugins.toString() : navigator.plugins.constructor && typeof navigator.plugins.constructor.toString == "function" ? navigator.plugins.constructor.toString() : typeof navigator.plugins;
|
|
216
216
|
return t === "[object PluginArray]" || t === "[object MSPluginsCollection]" || t === "[object HTMLPluginsCollection]";
|
|
@@ -222,7 +222,7 @@ function Ae() {
|
|
|
222
222
|
t.push(navigator.plugins[e].name);
|
|
223
223
|
return p(t.join(","));
|
|
224
224
|
}
|
|
225
|
-
function
|
|
225
|
+
function Me() {
|
|
226
226
|
return navigator.plugins ? navigator.plugins.length : s;
|
|
227
227
|
}
|
|
228
228
|
function xe() {
|
|
@@ -241,7 +241,7 @@ function We() {
|
|
|
241
241
|
return l;
|
|
242
242
|
}
|
|
243
243
|
}
|
|
244
|
-
function
|
|
244
|
+
function Ee() {
|
|
245
245
|
const t = {
|
|
246
246
|
isValidPluginArray: r,
|
|
247
247
|
pluginCount: r,
|
|
@@ -250,13 +250,13 @@ function Me() {
|
|
|
250
250
|
pluginOverflow: r
|
|
251
251
|
};
|
|
252
252
|
try {
|
|
253
|
-
t.isValidPluginArray =
|
|
253
|
+
t.isValidPluginArray = Pe(), t.pluginCount = Me(), t.pluginNamesHash = Ae(), t.pluginConsistency1 = xe(), t.pluginOverflow = We();
|
|
254
254
|
} catch {
|
|
255
255
|
h(t, l);
|
|
256
256
|
}
|
|
257
257
|
return t;
|
|
258
258
|
}
|
|
259
|
-
async function
|
|
259
|
+
async function ke() {
|
|
260
260
|
return new Promise(async function(t) {
|
|
261
261
|
var e = {
|
|
262
262
|
audiooutput: 0,
|
|
@@ -281,7 +281,7 @@ async function Ee() {
|
|
|
281
281
|
return h(e, s), t(e);
|
|
282
282
|
});
|
|
283
283
|
}
|
|
284
|
-
function
|
|
284
|
+
function De() {
|
|
285
285
|
const t = {
|
|
286
286
|
webdriver: r,
|
|
287
287
|
userAgent: r,
|
|
@@ -306,7 +306,7 @@ function ke() {
|
|
|
306
306
|
}
|
|
307
307
|
return t;
|
|
308
308
|
}
|
|
309
|
-
async function
|
|
309
|
+
async function _e() {
|
|
310
310
|
return new Promise((t) => {
|
|
311
311
|
const e = {
|
|
312
312
|
vendor: r,
|
|
@@ -318,7 +318,7 @@ async function De() {
|
|
|
318
318
|
cpuCount: r
|
|
319
319
|
};
|
|
320
320
|
let n = null, i = null, a = null;
|
|
321
|
-
const
|
|
321
|
+
const d = () => {
|
|
322
322
|
a && clearTimeout(a), n && n.terminate(), i && URL.revokeObjectURL(i);
|
|
323
323
|
};
|
|
324
324
|
try {
|
|
@@ -355,24 +355,24 @@ async function De() {
|
|
|
355
355
|
self.postMessage(fingerprintWorker);
|
|
356
356
|
}`, w = new Blob([m], { type: "application/javascript" });
|
|
357
357
|
i = URL.createObjectURL(w), n = new Worker(i), a = window.setTimeout(() => {
|
|
358
|
-
|
|
358
|
+
d(), h(e, l), t(e);
|
|
359
359
|
}, 2e3), n.onmessage = function(o) {
|
|
360
360
|
try {
|
|
361
361
|
e.vendor = o.data.vendor, e.renderer = o.data.renderer, e.userAgent = o.data.userAgent, e.language = o.data.language, e.platform = o.data.platform, e.memory = o.data.memory, e.cpuCount = o.data.cpuCount;
|
|
362
362
|
} catch {
|
|
363
363
|
h(e, l);
|
|
364
364
|
} finally {
|
|
365
|
-
|
|
365
|
+
d(), t(e);
|
|
366
366
|
}
|
|
367
367
|
}, n.onerror = function() {
|
|
368
|
-
|
|
368
|
+
d(), h(e, l), t(e);
|
|
369
369
|
};
|
|
370
370
|
} catch {
|
|
371
|
-
|
|
371
|
+
d(), h(e, l), t(e);
|
|
372
372
|
}
|
|
373
373
|
});
|
|
374
374
|
}
|
|
375
|
-
function
|
|
375
|
+
function Re() {
|
|
376
376
|
const t = {
|
|
377
377
|
toSourceError: r,
|
|
378
378
|
hasToSource: !1
|
|
@@ -393,7 +393,7 @@ function _e() {
|
|
|
393
393
|
}
|
|
394
394
|
return t;
|
|
395
395
|
}
|
|
396
|
-
const
|
|
396
|
+
const C = [
|
|
397
397
|
'audio/mp4; codecs="mp4a.40.2"',
|
|
398
398
|
"audio/mpeg;",
|
|
399
399
|
'audio/webm; codecs="vorbis"',
|
|
@@ -402,7 +402,7 @@ const S = [
|
|
|
402
402
|
'audio/ogg; codecs="speex"',
|
|
403
403
|
'audio/ogg; codecs="flac"',
|
|
404
404
|
'audio/3gpp; codecs="samr"'
|
|
405
|
-
],
|
|
405
|
+
], P = [
|
|
406
406
|
'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
|
|
407
407
|
'video/mp4; codecs="avc1.42E01E"',
|
|
408
408
|
'video/mp4; codecs="avc1.58A01E"',
|
|
@@ -432,7 +432,7 @@ function A(t, e) {
|
|
|
432
432
|
}
|
|
433
433
|
return n;
|
|
434
434
|
}
|
|
435
|
-
function
|
|
435
|
+
function M(t) {
|
|
436
436
|
const e = {}, n = window.MediaSource;
|
|
437
437
|
if (!n || typeof n.isTypeSupported != "function") {
|
|
438
438
|
for (const i of t)
|
|
@@ -459,7 +459,7 @@ function x(t) {
|
|
|
459
459
|
return l;
|
|
460
460
|
}
|
|
461
461
|
}
|
|
462
|
-
function
|
|
462
|
+
function Ie() {
|
|
463
463
|
const t = {
|
|
464
464
|
audioCanPlayTypeHash: s,
|
|
465
465
|
videoCanPlayTypeHash: s,
|
|
@@ -471,16 +471,16 @@ function Re() {
|
|
|
471
471
|
};
|
|
472
472
|
try {
|
|
473
473
|
t.hasMediaSource = !!window.MediaSource;
|
|
474
|
-
const e = A(
|
|
474
|
+
const e = A(C, "audio"), n = A(P, "video");
|
|
475
475
|
t.audioCanPlayTypeHash = p(JSON.stringify(e)), t.videoCanPlayTypeHash = p(JSON.stringify(n));
|
|
476
|
-
const i =
|
|
476
|
+
const i = M(C), a = M(P);
|
|
477
477
|
t.audioMediaSourceHash = p(JSON.stringify(i)), t.videoMediaSourceHash = p(JSON.stringify(a)), t.rtcAudioCapabilitiesHash = x("audio"), t.rtcVideoCapabilitiesHash = x("video");
|
|
478
478
|
} catch {
|
|
479
479
|
h(t, l);
|
|
480
480
|
}
|
|
481
481
|
return t;
|
|
482
482
|
}
|
|
483
|
-
async function
|
|
483
|
+
async function Le() {
|
|
484
484
|
return new Promise((t) => {
|
|
485
485
|
try {
|
|
486
486
|
const e = new Image(), n = document.createElement("canvas").getContext("2d");
|
|
@@ -494,7 +494,7 @@ async function Ie() {
|
|
|
494
494
|
}
|
|
495
495
|
});
|
|
496
496
|
}
|
|
497
|
-
function
|
|
497
|
+
function Te() {
|
|
498
498
|
var t = document.createElement("canvas");
|
|
499
499
|
t.width = 400, t.height = 200, t.style.display = "inline";
|
|
500
500
|
var e = t.getContext("2d");
|
|
@@ -504,14 +504,14 @@ function Le() {
|
|
|
504
504
|
return l;
|
|
505
505
|
}
|
|
506
506
|
}
|
|
507
|
-
async function
|
|
507
|
+
async function He() {
|
|
508
508
|
const t = {
|
|
509
509
|
hasModifiedCanvas: r,
|
|
510
510
|
canvasFingerprint: r
|
|
511
511
|
};
|
|
512
|
-
return t.hasModifiedCanvas = await
|
|
512
|
+
return t.hasModifiedCanvas = await Le(), t.canvasFingerprint = Te(), t;
|
|
513
513
|
}
|
|
514
|
-
function
|
|
514
|
+
function Oe() {
|
|
515
515
|
const t = ["deviceMemory", "hardwareConcurrency", "language", "languages", "platform"], e = [];
|
|
516
516
|
for (const n of t) {
|
|
517
517
|
const i = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator), n);
|
|
@@ -519,13 +519,13 @@ function He() {
|
|
|
519
519
|
}
|
|
520
520
|
return e.join("");
|
|
521
521
|
}
|
|
522
|
-
function
|
|
522
|
+
function Ue() {
|
|
523
523
|
return Math.random().toString(36).substring(2, 15);
|
|
524
524
|
}
|
|
525
525
|
function Fe() {
|
|
526
526
|
return (/* @__PURE__ */ new Date()).getTime();
|
|
527
527
|
}
|
|
528
|
-
function
|
|
528
|
+
function Ge() {
|
|
529
529
|
return window.location.href;
|
|
530
530
|
}
|
|
531
531
|
function W(t, e) {
|
|
@@ -536,17 +536,17 @@ function Ve() {
|
|
|
536
536
|
const t = {
|
|
537
537
|
bitmask: r,
|
|
538
538
|
extensions: []
|
|
539
|
-
}, e = document.body.hasAttribute("data-gr-ext-installed"), n = typeof window.ethereum < "u", i = document.getElementById("coupon-birds-drop-div") !== null, a = document.querySelector("deepl-input-controller") !== null,
|
|
539
|
+
}, e = document.body.hasAttribute("data-gr-ext-installed"), n = typeof window.ethereum < "u", i = document.getElementById("coupon-birds-drop-div") !== null, a = document.querySelector("deepl-input-controller") !== null, d = document.getElementById("monica-content-root") !== null, m = document.querySelector("chatgpt-sidebar") !== null, w = typeof window.__REQUESTLY__ < "u", o = Array.from(document.querySelectorAll("*")).filter((v) => v.tagName.toLowerCase().startsWith("veepn-")).length > 0;
|
|
540
540
|
return t.bitmask = [
|
|
541
541
|
e ? "1" : "0",
|
|
542
542
|
n ? "1" : "0",
|
|
543
543
|
i ? "1" : "0",
|
|
544
544
|
a ? "1" : "0",
|
|
545
|
-
|
|
545
|
+
d ? "1" : "0",
|
|
546
546
|
m ? "1" : "0",
|
|
547
547
|
w ? "1" : "0",
|
|
548
548
|
o ? "1" : "0"
|
|
549
|
-
].join(""), e && t.extensions.push("grammarly"), n && t.extensions.push("metamask"), i && t.extensions.push("coupon-birds"), a && t.extensions.push("deepl"),
|
|
549
|
+
].join(""), e && t.extensions.push("grammarly"), n && t.extensions.push("metamask"), i && t.extensions.push("coupon-birds"), a && t.extensions.push("deepl"), d && t.extensions.push("monica-ai"), m && t.extensions.push("sider-ai"), w && t.extensions.push("requestly"), o && t.extensions.push("veepn"), t;
|
|
550
550
|
}
|
|
551
551
|
function c(t) {
|
|
552
552
|
try {
|
|
@@ -555,7 +555,7 @@ function c(t) {
|
|
|
555
555
|
return !1;
|
|
556
556
|
}
|
|
557
557
|
}
|
|
558
|
-
function
|
|
558
|
+
function Be() {
|
|
559
559
|
const t = {
|
|
560
560
|
bitmask: r,
|
|
561
561
|
chrome: c(() => "chrome" in window),
|
|
@@ -589,7 +589,7 @@ function Ge() {
|
|
|
589
589
|
}, e = Object.keys(t).filter((n) => n !== "bitmask").map((n) => t[n] ? "1" : "0").join("");
|
|
590
590
|
return t.bitmask = e, t;
|
|
591
591
|
}
|
|
592
|
-
function
|
|
592
|
+
function je() {
|
|
593
593
|
const t = {
|
|
594
594
|
prefersColorScheme: r,
|
|
595
595
|
prefersReducedMotion: r,
|
|
@@ -612,87 +612,103 @@ function Be() {
|
|
|
612
612
|
}
|
|
613
613
|
return t;
|
|
614
614
|
}
|
|
615
|
-
function je(t) {
|
|
616
|
-
const e = t.signals.device.screenResolution;
|
|
617
|
-
return e.width === 600 && e.height === 800 || e.availableWidth === 600 && e.availableHeight === 800 || e.innerWidth === 600 && e.innerHeight === 800;
|
|
618
|
-
}
|
|
619
615
|
function Ne(t) {
|
|
620
|
-
|
|
616
|
+
const e = t.signals.device.screenResolution;
|
|
617
|
+
return e.width === 800 && e.height === 600 || e.availableWidth === 800 && e.availableHeight === 600 || e.innerWidth === 800 && e.innerHeight === 600;
|
|
621
618
|
}
|
|
622
619
|
function ze(t) {
|
|
623
|
-
return
|
|
620
|
+
return t.signals.automation.webdriver === !0;
|
|
624
621
|
}
|
|
625
622
|
function $e(t) {
|
|
626
|
-
return t.signals.automation.
|
|
623
|
+
return !!t.signals.automation.selenium;
|
|
627
624
|
}
|
|
628
625
|
function Qe(t) {
|
|
629
|
-
return t.signals.automation.
|
|
626
|
+
return t.signals.automation.cdp === !0;
|
|
630
627
|
}
|
|
631
628
|
function qe(t) {
|
|
632
|
-
return
|
|
629
|
+
return t.signals.automation.playwright === !0;
|
|
633
630
|
}
|
|
634
631
|
function Ke(t) {
|
|
635
|
-
return typeof t.signals.device.
|
|
632
|
+
return typeof t.signals.device.memory != "number" ? !1 : t.signals.device.memory > 32 || t.signals.device.memory < 0.25;
|
|
636
633
|
}
|
|
637
634
|
function Je(t) {
|
|
638
|
-
|
|
639
|
-
return t.signals.browser.features.chrome === !1 && typeof e == "string" && e.includes("Chrome");
|
|
635
|
+
return typeof t.signals.device.cpuCount != "number" ? !1 : t.signals.device.cpuCount > 70;
|
|
640
636
|
}
|
|
641
637
|
function Ye(t) {
|
|
642
|
-
return t.
|
|
638
|
+
return t.includes("Android") || t.includes("iPhone") || t.includes("iPod") || t.includes("iPad");
|
|
643
639
|
}
|
|
644
640
|
function Ze(t) {
|
|
645
|
-
|
|
641
|
+
const e = t.signals.browser.userAgent;
|
|
642
|
+
return typeof e != "string" || !e.includes("Chrome") || Ye(e) ? !1 : t.signals.browser.features.chrome === !1;
|
|
646
643
|
}
|
|
647
644
|
function Xe(t) {
|
|
648
|
-
|
|
649
|
-
return e.vendor === l || e.renderer === l || n.vendor === s || n.renderer === s || e.vendor === f ? !1 : e.vendor !== n.vendor || e.renderer !== n.renderer;
|
|
645
|
+
return t.signals.contexts.iframe.webdriver === !0;
|
|
650
646
|
}
|
|
651
647
|
function et(t) {
|
|
652
|
-
return t.signals.contexts.webWorker.
|
|
648
|
+
return t.signals.contexts.webWorker.webdriver === !0;
|
|
649
|
+
}
|
|
650
|
+
function y(t) {
|
|
651
|
+
return t === s || t === l || t === f || t === r;
|
|
653
652
|
}
|
|
654
653
|
function tt(t) {
|
|
654
|
+
const e = t.signals.contexts.webWorker, n = t.signals.graphics.webGL;
|
|
655
|
+
return y(n.vendor) || y(n.renderer) || y(e.vendor) || y(e.renderer) ? !1 : e.vendor !== n.vendor || e.renderer !== n.renderer;
|
|
656
|
+
}
|
|
657
|
+
function rt(t, e) {
|
|
658
|
+
const n = t.includes("iPad"), i = e.includes("iPad");
|
|
659
|
+
if (n === i)
|
|
660
|
+
return !1;
|
|
661
|
+
const a = (d) => d === "MacIntel" || d === "MacPPC";
|
|
662
|
+
return a(t) || a(e);
|
|
663
|
+
}
|
|
664
|
+
function nt(t) {
|
|
665
|
+
if (t.signals.contexts.webWorker.platform === s || t.signals.contexts.webWorker.platform === l || t.signals.contexts.webWorker.platform === f)
|
|
666
|
+
return !1;
|
|
667
|
+
const e = t.signals.device.platform, n = t.signals.contexts.webWorker.platform;
|
|
668
|
+
return !(e === n || rt(e, n));
|
|
669
|
+
}
|
|
670
|
+
function it(t) {
|
|
655
671
|
return t.signals.contexts.iframe.platform === s || t.signals.contexts.iframe.platform === l ? !1 : t.signals.device.platform !== t.signals.contexts.iframe.platform;
|
|
656
672
|
}
|
|
657
|
-
function
|
|
673
|
+
function at(t) {
|
|
658
674
|
return t.signals.automation.webdriverWritable === !0;
|
|
659
675
|
}
|
|
660
|
-
function
|
|
676
|
+
function ot(t) {
|
|
661
677
|
return t.signals.graphics.webGL.renderer.includes("SwiftShader");
|
|
662
678
|
}
|
|
663
|
-
function
|
|
679
|
+
function st(t) {
|
|
664
680
|
return t.signals.locale.internationalization.timezone === "UTC";
|
|
665
681
|
}
|
|
666
|
-
function
|
|
682
|
+
function ct(t) {
|
|
667
683
|
const e = t.signals.locale.languages.languages, n = t.signals.locale.languages.language;
|
|
668
684
|
return n && e && Array.isArray(e) && e.length > 0 ? e[0] !== n : !1;
|
|
669
685
|
}
|
|
670
|
-
function
|
|
686
|
+
function lt(t) {
|
|
671
687
|
return !!(t.signals.browser.features.chrome && t.signals.browser.etsl !== 33 || t.signals.browser.features.safari && t.signals.browser.etsl !== 37 || t.signals.browser.userAgent.includes("Firefox") && t.signals.browser.etsl !== 37);
|
|
672
688
|
}
|
|
673
|
-
function
|
|
689
|
+
function ut(t) {
|
|
674
690
|
return [
|
|
675
691
|
t.signals.browser.userAgent,
|
|
676
692
|
t.signals.contexts.iframe.userAgent,
|
|
677
693
|
t.signals.contexts.webWorker.userAgent
|
|
678
694
|
].some((n) => /bot|headless/i.test(n.toLowerCase()));
|
|
679
695
|
}
|
|
680
|
-
function
|
|
696
|
+
function dt(t) {
|
|
681
697
|
const e = t.signals.graphics.webgpu, n = t.signals.graphics.webGL, i = t.signals.browser.userAgent;
|
|
682
698
|
return !!((n.vendor.includes("Apple") || n.renderer.includes("Apple")) && !i.includes("Mac") || e.vendor.includes("apple") && !i.includes("Mac") || e.vendor.includes("apple") && !n.renderer.includes("Apple"));
|
|
683
699
|
}
|
|
684
|
-
function
|
|
700
|
+
function gt(t) {
|
|
685
701
|
const e = t.signals.device.platform, n = t.signals.browser.userAgent, i = t.signals.browser.highEntropyValues.platform;
|
|
686
702
|
return !!(n.includes("Mac") && (e.includes("Win") || e.includes("Linux")) || n.includes("Windows") && (e.includes("Mac") || e.includes("Linux")) || n.includes("Linux") && (e.includes("Mac") || e.includes("Win")) || i !== l && i !== s && (i.includes("Mac") && (e.includes("Win") || e.includes("Linux")) || i.includes("Windows") && (e.includes("Mac") || e.includes("Linux")) || i.includes("Linux") && (e.includes("Mac") || e.includes("Win"))));
|
|
687
703
|
}
|
|
688
|
-
async function
|
|
704
|
+
async function ht(t, e) {
|
|
689
705
|
const n = new TextEncoder().encode(e), i = new TextEncoder().encode(t), a = new Uint8Array(i.length);
|
|
690
706
|
for (let m = 0; m < i.length; m++)
|
|
691
707
|
a[m] = i[m] ^ n[m % n.length];
|
|
692
|
-
const
|
|
693
|
-
return btoa(
|
|
708
|
+
const d = String.fromCharCode(...a);
|
|
709
|
+
return btoa(d);
|
|
694
710
|
}
|
|
695
|
-
class
|
|
711
|
+
class pt {
|
|
696
712
|
constructor() {
|
|
697
713
|
this.fingerprint = {
|
|
698
714
|
signals: {
|
|
@@ -921,7 +937,7 @@ class ht {
|
|
|
921
937
|
*/
|
|
922
938
|
generateFingerprintScannerId() {
|
|
923
939
|
try {
|
|
924
|
-
const e = this.fingerprint.signals, n = this.fingerprint.fastBotDetectionDetails, i = "FS1",
|
|
940
|
+
const e = this.fingerprint.signals, n = this.fingerprint.fastBotDetectionDetails, i = "FS1", d = [
|
|
925
941
|
n.headlessChromeScreenResolution.detected,
|
|
926
942
|
n.hasWebdriver.detected,
|
|
927
943
|
n.hasWebdriverWritable.detected,
|
|
@@ -950,13 +966,13 @@ class ht {
|
|
|
950
966
|
e.automation.selenium === !0,
|
|
951
967
|
e.automation.cdp === !0,
|
|
952
968
|
e.automation.playwright === !0
|
|
953
|
-
].map((u) => u ? "1" : "0").join(""), w = p(String(e.automation.navigatorPropertyDescriptors)).slice(0, 4), o = `${m}h${w}`, v = typeof e.device.screenResolution.width == "number" ? e.device.screenResolution.width : 0,
|
|
969
|
+
].map((u) => u ? "1" : "0").join(""), w = p(String(e.automation.navigatorPropertyDescriptors)).slice(0, 4), o = `${m}h${w}`, v = typeof e.device.screenResolution.width == "number" ? e.device.screenResolution.width : 0, b = typeof e.device.screenResolution.height == "number" ? e.device.screenResolution.height : 0, E = typeof e.device.cpuCount == "number" ? String(e.device.cpuCount).padStart(2, "0") : "00", k = typeof e.device.memory == "number" ? String(Math.round(e.device.memory)).padStart(2, "0") : "00", D = [
|
|
954
970
|
e.device.screenResolution.hasMultipleDisplays === !0,
|
|
955
971
|
e.device.mediaQueries.prefersReducedMotion === !0,
|
|
956
972
|
e.device.mediaQueries.prefersReducedTransparency === !0,
|
|
957
973
|
e.device.mediaQueries.hover === !0,
|
|
958
974
|
e.device.mediaQueries.anyHover === !0
|
|
959
|
-
].map((u) => u ? "1" : "0").join(""),
|
|
975
|
+
].map((u) => u ? "1" : "0").join(""), _ = [
|
|
960
976
|
e.device.platform,
|
|
961
977
|
e.device.screenResolution.pixelDepth,
|
|
962
978
|
e.device.screenResolution.colorDepth,
|
|
@@ -968,12 +984,12 @@ class ht {
|
|
|
968
984
|
e.device.mediaQueries.pointer,
|
|
969
985
|
e.device.mediaQueries.anyPointer,
|
|
970
986
|
e.device.mediaQueries.colorDepth
|
|
971
|
-
].map((u) => String(u)).join("|"),
|
|
987
|
+
].map((u) => String(u)).join("|"), R = p(_).slice(0, 6), I = `${v}x${b}c${E}m${k}b${D}h${R}`, L = typeof e.browser.features.bitmask == "string" ? e.browser.features.bitmask : "0000000000", T = typeof e.browser.extensions.bitmask == "string" ? e.browser.extensions.bitmask : "00000000", H = [
|
|
972
988
|
e.browser.plugins.isValidPluginArray === !0,
|
|
973
989
|
e.browser.plugins.pluginConsistency1 === !0,
|
|
974
990
|
e.browser.plugins.pluginOverflow === !0,
|
|
975
991
|
e.browser.toSourceError.hasToSource === !0
|
|
976
|
-
].map((u) => u ? "1" : "0").join(""),
|
|
992
|
+
].map((u) => u ? "1" : "0").join(""), O = [
|
|
977
993
|
e.browser.userAgent,
|
|
978
994
|
e.browser.etsl,
|
|
979
995
|
e.browser.maths,
|
|
@@ -986,7 +1002,7 @@ class ht {
|
|
|
986
1002
|
e.browser.highEntropyValues.platformVersion,
|
|
987
1003
|
e.browser.highEntropyValues.uaFullVersion,
|
|
988
1004
|
e.browser.highEntropyValues.mobile
|
|
989
|
-
].map((u) => String(u)).join("|"),
|
|
1005
|
+
].map((u) => String(u)).join("|"), U = p(O).slice(0, 6), F = `f${L}e${T}p${H}h${U}`, G = [
|
|
990
1006
|
e.graphics.canvas.hasModifiedCanvas === !0
|
|
991
1007
|
].map((u) => u ? "1" : "0").join(""), V = [
|
|
992
1008
|
e.graphics.webGL.vendor,
|
|
@@ -996,26 +1012,26 @@ class ht {
|
|
|
996
1012
|
e.graphics.webgpu.device,
|
|
997
1013
|
e.graphics.webgpu.description,
|
|
998
1014
|
e.graphics.canvas.canvasFingerprint
|
|
999
|
-
].map((u) => String(u)).join("|"),
|
|
1015
|
+
].map((u) => String(u)).join("|"), B = p(V).slice(0, 6), j = `${G}h${B}`, N = [
|
|
1000
1016
|
e.codecs.hasMediaSource === !0
|
|
1001
|
-
].map((u) => u ? "1" : "0").join(""),
|
|
1017
|
+
].map((u) => u ? "1" : "0").join(""), z = [
|
|
1002
1018
|
e.codecs.audioCanPlayTypeHash,
|
|
1003
1019
|
e.codecs.videoCanPlayTypeHash,
|
|
1004
1020
|
e.codecs.audioMediaSourceHash,
|
|
1005
1021
|
e.codecs.videoMediaSourceHash,
|
|
1006
1022
|
e.codecs.rtcAudioCapabilitiesHash,
|
|
1007
1023
|
e.codecs.rtcVideoCapabilitiesHash
|
|
1008
|
-
].map((u) => String(u)).join("|"),
|
|
1024
|
+
].map((u) => String(u)).join("|"), $ = p(z).slice(0, 6), Q = `${N}h${$}`, q = typeof e.locale.languages.language == "string" ? e.locale.languages.language.slice(0, 2).toLowerCase() : "xx", K = Array.isArray(e.locale.languages.languages) ? e.locale.languages.languages.length : 0, J = (typeof e.locale.internationalization.timezone == "string" ? e.locale.internationalization.timezone : "unknown").replace(/[\/\s]/g, "-"), Y = [
|
|
1009
1025
|
e.locale.internationalization.timezone,
|
|
1010
1026
|
e.locale.internationalization.localeLanguage,
|
|
1011
1027
|
Array.isArray(e.locale.languages.languages) ? e.locale.languages.languages.join(",") : e.locale.languages.languages,
|
|
1012
1028
|
e.locale.languages.language
|
|
1013
|
-
].map((u) => String(u)).join("|"),
|
|
1029
|
+
].map((u) => String(u)).join("|"), Z = p(Y).slice(0, 4), X = `${q}${K}t${J}_h${Z}`, ee = [
|
|
1014
1030
|
W(this.fingerprint, "iframe"),
|
|
1015
1031
|
W(this.fingerprint, "worker"),
|
|
1016
1032
|
e.contexts.iframe.webdriver === !0,
|
|
1017
1033
|
e.contexts.webWorker.webdriver === !0
|
|
1018
|
-
].map((u) => u ? "1" : "0").join(""),
|
|
1034
|
+
].map((u) => u ? "1" : "0").join(""), te = [
|
|
1019
1035
|
e.contexts.iframe.userAgent,
|
|
1020
1036
|
e.contexts.iframe.platform,
|
|
1021
1037
|
e.contexts.iframe.memory,
|
|
@@ -1028,17 +1044,17 @@ class ht {
|
|
|
1028
1044
|
e.contexts.webWorker.language,
|
|
1029
1045
|
e.contexts.webWorker.vendor,
|
|
1030
1046
|
e.contexts.webWorker.renderer
|
|
1031
|
-
].map((u) => String(u)).join("|"),
|
|
1047
|
+
].map((u) => String(u)).join("|"), re = p(te).slice(0, 6), ne = `${ee}h${re}`;
|
|
1032
1048
|
return [
|
|
1033
1049
|
i,
|
|
1034
|
-
|
|
1050
|
+
d,
|
|
1035
1051
|
o,
|
|
1036
|
-
|
|
1052
|
+
I,
|
|
1037
1053
|
F,
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1054
|
+
j,
|
|
1055
|
+
Q,
|
|
1056
|
+
X,
|
|
1057
|
+
ne
|
|
1042
1058
|
].join("_");
|
|
1043
1059
|
} catch (e) {
|
|
1044
1060
|
return console.error("Error generating fingerprint scanner id", e), l;
|
|
@@ -1048,34 +1064,34 @@ class ht {
|
|
|
1048
1064
|
const n = "__DEFAULT_FPSCANNER_KEY__";
|
|
1049
1065
|
return n.length > 20 && n.indexOf("DEFAULT") > 0 && n.indexOf("FPSCANNER") > 0 && console.warn(
|
|
1050
1066
|
'[fpscanner] WARNING: Using default encryption key! Run "npx fpscanner build --key=your-secret-key" to inject your own key. See: https://github.com/antoinevastel/fpscanner#advanced-custom-builds'
|
|
1051
|
-
), await
|
|
1067
|
+
), await ht(JSON.stringify(e), n);
|
|
1052
1068
|
}
|
|
1053
1069
|
/**
|
|
1054
1070
|
* Detection rules with name and severity.
|
|
1055
1071
|
*/
|
|
1056
1072
|
getDetectionRules() {
|
|
1057
1073
|
return [
|
|
1058
|
-
{ name: "headlessChromeScreenResolution", severity:
|
|
1059
|
-
{ name: "hasWebdriver", severity:
|
|
1060
|
-
{ name: "hasWebdriverWritable", severity:
|
|
1061
|
-
{ name: "hasSeleniumProperty", severity:
|
|
1062
|
-
{ name: "hasCDP", severity:
|
|
1063
|
-
{ name: "hasPlaywright", severity:
|
|
1064
|
-
{ name: "hasImpossibleDeviceMemory", severity:
|
|
1065
|
-
{ name: "hasHighCPUCount", severity:
|
|
1066
|
-
{ name: "hasMissingChromeObject", severity:
|
|
1067
|
-
{ name: "hasWebdriverIframe", severity:
|
|
1068
|
-
{ name: "hasWebdriverWorker", severity:
|
|
1069
|
-
{ name: "hasMismatchWebGLInWorker", severity:
|
|
1070
|
-
{ name: "hasMismatchPlatformIframe", severity:
|
|
1071
|
-
{ name: "hasMismatchPlatformWorker", severity:
|
|
1072
|
-
{ name: "hasSwiftshaderRenderer", severity:
|
|
1073
|
-
{ name: "hasUTCTimezone", severity:
|
|
1074
|
-
{ name: "hasMismatchLanguages", severity:
|
|
1075
|
-
{ name: "hasInconsistentEtsl", severity:
|
|
1076
|
-
{ name: "hasBotUserAgent", severity:
|
|
1077
|
-
{ name: "hasGPUMismatch", severity:
|
|
1078
|
-
{ name: "hasPlatformMismatch", severity:
|
|
1074
|
+
{ name: "headlessChromeScreenResolution", severity: g, test: Ne },
|
|
1075
|
+
{ name: "hasWebdriver", severity: g, test: ze },
|
|
1076
|
+
{ name: "hasWebdriverWritable", severity: g, test: at },
|
|
1077
|
+
{ name: "hasSeleniumProperty", severity: g, test: $e },
|
|
1078
|
+
{ name: "hasCDP", severity: g, test: Qe },
|
|
1079
|
+
{ name: "hasPlaywright", severity: g, test: qe },
|
|
1080
|
+
{ name: "hasImpossibleDeviceMemory", severity: g, test: Ke },
|
|
1081
|
+
{ name: "hasHighCPUCount", severity: g, test: Je },
|
|
1082
|
+
{ name: "hasMissingChromeObject", severity: g, test: Ze },
|
|
1083
|
+
{ name: "hasWebdriverIframe", severity: g, test: Xe },
|
|
1084
|
+
{ name: "hasWebdriverWorker", severity: g, test: et },
|
|
1085
|
+
{ name: "hasMismatchWebGLInWorker", severity: g, test: tt },
|
|
1086
|
+
{ name: "hasMismatchPlatformIframe", severity: g, test: it },
|
|
1087
|
+
{ name: "hasMismatchPlatformWorker", severity: g, test: nt },
|
|
1088
|
+
{ name: "hasSwiftshaderRenderer", severity: S, test: ot },
|
|
1089
|
+
{ name: "hasUTCTimezone", severity: se, test: st },
|
|
1090
|
+
{ name: "hasMismatchLanguages", severity: S, test: ct },
|
|
1091
|
+
{ name: "hasInconsistentEtsl", severity: g, test: lt },
|
|
1092
|
+
{ name: "hasBotUserAgent", severity: g, test: ut },
|
|
1093
|
+
{ name: "hasGPUMismatch", severity: g, test: dt },
|
|
1094
|
+
{ name: "hasPlatformMismatch", severity: g, test: gt }
|
|
1079
1095
|
];
|
|
1080
1096
|
}
|
|
1081
1097
|
runDetectionRules() {
|
|
@@ -1112,41 +1128,41 @@ class ht {
|
|
|
1112
1128
|
return n;
|
|
1113
1129
|
}
|
|
1114
1130
|
async collectFingerprint(e = { encrypt: !0 }) {
|
|
1115
|
-
const { encrypt: n = !0, skipWorker: i = !1 } = e, a = this.fingerprint.signals,
|
|
1131
|
+
const { encrypt: n = !0, skipWorker: i = !1 } = e, a = this.fingerprint.signals, d = {
|
|
1116
1132
|
// Automation signals
|
|
1117
|
-
webdriver: this.collectSignal(
|
|
1118
|
-
webdriverWritable: this.collectSignal(
|
|
1119
|
-
selenium: this.collectSignal(
|
|
1120
|
-
cdp: this.collectSignal(
|
|
1121
|
-
playwright: this.collectSignal(
|
|
1122
|
-
navigatorPropertyDescriptors: this.collectSignal(
|
|
1133
|
+
webdriver: this.collectSignal(ie),
|
|
1134
|
+
webdriverWritable: this.collectSignal(Se),
|
|
1135
|
+
selenium: this.collectSignal(be),
|
|
1136
|
+
cdp: this.collectSignal(le),
|
|
1137
|
+
playwright: this.collectSignal(de),
|
|
1138
|
+
navigatorPropertyDescriptors: this.collectSignal(Oe),
|
|
1123
1139
|
// Device signals
|
|
1124
|
-
cpuCount: this.collectSignal(
|
|
1125
|
-
memory: this.collectSignal(
|
|
1126
|
-
platform: this.collectSignal(
|
|
1127
|
-
screenResolution: this.collectSignal(
|
|
1128
|
-
multimediaDevices: this.collectSignal(
|
|
1129
|
-
mediaQueries: this.collectSignal(
|
|
1140
|
+
cpuCount: this.collectSignal(ge),
|
|
1141
|
+
memory: this.collectSignal(me),
|
|
1142
|
+
platform: this.collectSignal(oe),
|
|
1143
|
+
screenResolution: this.collectSignal(ve),
|
|
1144
|
+
multimediaDevices: this.collectSignal(ke),
|
|
1145
|
+
mediaQueries: this.collectSignal(je),
|
|
1130
1146
|
// Browser signals
|
|
1131
|
-
userAgent: this.collectSignal(
|
|
1132
|
-
browserFeatures: this.collectSignal(
|
|
1133
|
-
plugins: this.collectSignal(
|
|
1147
|
+
userAgent: this.collectSignal(ae),
|
|
1148
|
+
browserFeatures: this.collectSignal(Be),
|
|
1149
|
+
plugins: this.collectSignal(Ee),
|
|
1134
1150
|
browserExtensions: this.collectSignal(Ve),
|
|
1135
|
-
highEntropyValues: this.collectSignal(
|
|
1136
|
-
etsl: this.collectSignal(
|
|
1151
|
+
highEntropyValues: this.collectSignal(Ce),
|
|
1152
|
+
etsl: this.collectSignal(pe),
|
|
1137
1153
|
maths: this.collectSignal(he),
|
|
1138
|
-
toSourceError: this.collectSignal(
|
|
1154
|
+
toSourceError: this.collectSignal(Re),
|
|
1139
1155
|
// Graphics signals
|
|
1140
|
-
webGL: this.collectSignal(
|
|
1141
|
-
webgpu: this.collectSignal(
|
|
1142
|
-
canvas: this.collectSignal(
|
|
1156
|
+
webGL: this.collectSignal(ue),
|
|
1157
|
+
webgpu: this.collectSignal(ye),
|
|
1158
|
+
canvas: this.collectSignal(He),
|
|
1143
1159
|
// Codecs
|
|
1144
|
-
mediaCodecs: this.collectSignal(
|
|
1160
|
+
mediaCodecs: this.collectSignal(Ie),
|
|
1145
1161
|
// Locale signals
|
|
1146
|
-
internationalization: this.collectSignal(
|
|
1147
|
-
languages: this.collectSignal(
|
|
1162
|
+
internationalization: this.collectSignal(fe),
|
|
1163
|
+
languages: this.collectSignal(we),
|
|
1148
1164
|
// Context signals
|
|
1149
|
-
iframe: this.collectSignal(
|
|
1165
|
+
iframe: this.collectSignal(De),
|
|
1150
1166
|
webWorker: i ? Promise.resolve({
|
|
1151
1167
|
webdriver: f,
|
|
1152
1168
|
userAgent: f,
|
|
@@ -1156,15 +1172,15 @@ class ht {
|
|
|
1156
1172
|
language: f,
|
|
1157
1173
|
vendor: f,
|
|
1158
1174
|
renderer: f
|
|
1159
|
-
}) : this.collectSignal(
|
|
1175
|
+
}) : this.collectSignal(_e),
|
|
1160
1176
|
// Meta signals
|
|
1161
|
-
nonce: this.collectSignal(
|
|
1177
|
+
nonce: this.collectSignal(Ue),
|
|
1162
1178
|
time: this.collectSignal(Fe),
|
|
1163
|
-
url: this.collectSignal(
|
|
1164
|
-
}, m = Object.keys(
|
|
1179
|
+
url: this.collectSignal(Ge)
|
|
1180
|
+
}, m = Object.keys(d), w = await Promise.all(Object.values(d)), o = Object.fromEntries(m.map((v, b) => [v, w[b]]));
|
|
1165
1181
|
return a.automation.webdriver = o.webdriver, a.automation.webdriverWritable = o.webdriverWritable, a.automation.selenium = o.selenium, a.automation.cdp = o.cdp, a.automation.playwright = o.playwright, a.automation.navigatorPropertyDescriptors = o.navigatorPropertyDescriptors, a.device.cpuCount = o.cpuCount, a.device.memory = o.memory, a.device.platform = o.platform, a.device.screenResolution = o.screenResolution, a.device.multimediaDevices = o.multimediaDevices, a.device.mediaQueries = o.mediaQueries, a.browser.userAgent = o.userAgent, a.browser.features = o.browserFeatures, a.browser.plugins = o.plugins, a.browser.extensions = o.browserExtensions, a.browser.highEntropyValues = o.highEntropyValues, a.browser.etsl = o.etsl, a.browser.maths = o.maths, a.browser.toSourceError = o.toSourceError, a.graphics.webGL = o.webGL, a.graphics.webgpu = o.webgpu, a.graphics.canvas = o.canvas, a.codecs = o.mediaCodecs, a.locale.internationalization = o.internationalization, a.locale.languages = o.languages, a.contexts.iframe = o.iframe, a.contexts.webWorker = o.webWorker, this.fingerprint.nonce = o.nonce, this.fingerprint.time = o.time, this.fingerprint.url = o.url, this.fingerprint.fastBotDetectionDetails = this.runDetectionRules(), this.fingerprint.fastBotDetection = Object.values(this.fingerprint.fastBotDetectionDetails).some((v) => v.detected), this.fingerprint.fsid = this.generateFingerprintScannerId(), n ? await this.encryptFingerprint(JSON.stringify(this.fingerprint)) : this.fingerprint;
|
|
1166
1182
|
}
|
|
1167
1183
|
}
|
|
1168
1184
|
export {
|
|
1169
|
-
|
|
1185
|
+
pt as default
|
|
1170
1186
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fpscanner",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3-beta.0",
|
|
4
4
|
"description": "A lightweight browser fingerprinting and bot detection library with encryption, obfuscation, and cross-context validation",
|
|
5
5
|
"main": "dist/fpScanner.cjs.js",
|
|
6
6
|
"module": "dist/fpScanner.es.js",
|
|
@@ -3,5 +3,5 @@ import { Fingerprint } from '../types';
|
|
|
3
3
|
export function hasHeadlessChromeScreenResolution(fingerprint: Fingerprint) {
|
|
4
4
|
const screen = fingerprint.signals.device.screenResolution;
|
|
5
5
|
|
|
6
|
-
return (screen.width ===
|
|
6
|
+
return (screen.width === 800 && screen.height === 600) || (screen.availableWidth === 800 && screen.availableHeight === 600) || (screen.innerWidth === 800 && screen.innerHeight === 600);
|
|
7
7
|
}
|
|
@@ -1,10 +1,36 @@
|
|
|
1
1
|
import { Fingerprint } from "../types";
|
|
2
2
|
import { ERROR, NA, SKIPPED } from "../signals/utils";
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* iPad Safari in desktop-style mode often reports navigator.platform as "MacIntel"
|
|
6
|
+
* in the top-level window (and same-origin iframe) while dedicated workers can still
|
|
7
|
+
* report "iPad". That split is expected on real hardware, not a worker spoof signal.
|
|
8
|
+
*/
|
|
9
|
+
function isBenignIPadMacPlatformSplit(a: string, b: string): boolean {
|
|
10
|
+
const aIsIPad = a.includes("iPad");
|
|
11
|
+
const bIsIPad = b.includes("iPad");
|
|
12
|
+
if (aIsIPad === bIsIPad) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const macDesktopCompat = (p: string) => p === "MacIntel" || p === "MacPPC";
|
|
16
|
+
return macDesktopCompat(a) || macDesktopCompat(b);
|
|
17
|
+
}
|
|
18
|
+
|
|
4
19
|
export function hasMismatchPlatformWorker(fingerprint: Fingerprint) {
|
|
5
20
|
if (fingerprint.signals.contexts.webWorker.platform === NA || fingerprint.signals.contexts.webWorker.platform === ERROR || fingerprint.signals.contexts.webWorker.platform === SKIPPED) {
|
|
6
21
|
return false;
|
|
7
22
|
}
|
|
8
23
|
|
|
9
|
-
|
|
24
|
+
const devicePlatform = fingerprint.signals.device.platform;
|
|
25
|
+
const workerPlatform = fingerprint.signals.contexts.webWorker.platform;
|
|
26
|
+
|
|
27
|
+
if (devicePlatform === workerPlatform) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (isBenignIPadMacPlatformSplit(devicePlatform, workerPlatform)) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return true;
|
|
10
36
|
}
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { Fingerprint } from "../types";
|
|
2
|
-
import { ERROR, NA, SKIPPED } from "../signals/utils";
|
|
2
|
+
import { ERROR, INIT, NA, SKIPPED } from "../signals/utils";
|
|
3
|
+
|
|
4
|
+
function webGLStringUnavailable(value: string): boolean {
|
|
5
|
+
return value === NA || value === ERROR || value === SKIPPED || value === INIT;
|
|
6
|
+
}
|
|
3
7
|
|
|
4
8
|
export function hasMismatchWebGLInWorker(fingerprint: Fingerprint) {
|
|
5
9
|
const worker = fingerprint.signals.contexts.webWorker;
|
|
6
10
|
const webGL = fingerprint.signals.graphics.webGL;
|
|
7
|
-
|
|
8
|
-
if (
|
|
11
|
+
|
|
12
|
+
if (
|
|
13
|
+
webGLStringUnavailable(webGL.vendor) ||
|
|
14
|
+
webGLStringUnavailable(webGL.renderer) ||
|
|
15
|
+
webGLStringUnavailable(worker.vendor) ||
|
|
16
|
+
webGLStringUnavailable(worker.renderer)
|
|
17
|
+
) {
|
|
9
18
|
return false;
|
|
10
19
|
}
|
|
11
20
|
|
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
import { Fingerprint } from "../types";
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* In-app browsers and system WebViews on Android/iOS often ship a Chrome-like UA but
|
|
5
|
+
* do not expose window.chrome. That is common on real devices, so this rule is only
|
|
6
|
+
* meant for desktop-style environments where missing chrome is suspicious.
|
|
7
|
+
*/
|
|
8
|
+
function isClaimedMobileUserAgent(ua: string): boolean {
|
|
9
|
+
return (
|
|
10
|
+
ua.includes("Android") ||
|
|
11
|
+
ua.includes("iPhone") ||
|
|
12
|
+
ua.includes("iPod") ||
|
|
13
|
+
ua.includes("iPad")
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
3
17
|
export function hasMissingChromeObject(fingerprint: Fingerprint) {
|
|
4
18
|
const userAgent = fingerprint.signals.browser.userAgent;
|
|
5
|
-
|
|
19
|
+
if (typeof userAgent !== "string" || !userAgent.includes("Chrome")) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
if (isClaimedMobileUserAgent(userAgent)) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return fingerprint.signals.browser.features.chrome === false;
|
|
6
26
|
}
|