1(function(window){FingerprintPlugin=function(){const checkMatchMedia=(e)=>{return matchMedia('(prefers-reduced-motion: '.concat(e,')')).matches} 2const reducedMotion=()=>{return checkMatchMedia('reduce')||!checkMatchMedia('no-preference')} 3const reducedTransparency=()=>{return checkMatchMedia('prefers-reduced-transparency: reduce')||!checkMatchMedia('prefers-reduced-transparency: no-preference')&&undefined} 4const hdr=()=>{return checkMatchMedia('dynamic-range: high')||!checkMatchMedia('dynamic-range: standard')&&undefined} 5const invertedColors=()=>{return checkMatchMedia('inverted-colors: inverted')||!checkMatchMedia('inverted-colors: none')&&undefined} 6const forcedColors=()=>{return checkMatchMedia('forced-colors: active')||!checkMatchMedia('forced-colors: none')&&undefined} 7const colorGamut=()=>{const gamutArr=['rec2020','p3','srgb'] 8for(const item of gamutArr){if(checkMatchMedia(`color-gamut: ${item}`)){return item}}} 9const checkContrast=(e)=>{return matchMedia('(prefers-contrast: '.concat(e,')')).matches} 10const contrast=()=>{return checkContrast('no-preference')?0:checkContrast('high')||checkContrast('more')?1:checkContrast('low')||checkContrast('less')?-1:checkContrast('forced')?10:undefined} 11const monochrome=()=>{if(checkMatchMedia('min-monochrome: 0')){for(let i=0;i<=100;++i){if(checkMatchMedia(`max-monochrome: ${i}`)){return i}} 12throw new Error('Too high value')}} 13const vendor=()=>{return navigator.vendor||''} 14const pdfViewerEnabled=()=>{return navigator.pdfViewerEnabled} 15const architecture=()=>{const e=new Float32Array(1) 16const n=new Uint8Array(e.buffer) 17return e[0]=1/0,e[0]=e[0]-e[0],n[3]} 18const cookiesEnabled=()=>{try{document.cookie='cookietest=1; SameSite=Strict;' 19const value=document.cookie.indexOf('cookietest=')!==-1 20return document.cookie='cookietest=1; SameSite=Strict; expires=Thu, 01-Jan-1970 00:00:01 GMT',value}catch{return!1}} 21const vendorFlavors=()=>{const resultArr=[] 22const flavorsArr=['chrome','safari','__crWeb','__gCrWeb','yandex','__yb','__ybro','__firefox__','__edgeTrackingPreventionStatistics','webkit','oprt','samsungAr','ucweb','UCShellJava','puffinDevice'] 23for(const value of flavorsArr){const flavorsValue=window[value] 24if(flavorsValue&&typeof flavorsValue==='object'){resultArr.push(value)}} 25return resultArr.sort()} 26const getCanvasFingerprint=()=>{const canvas=document.createElement('canvas');const ctx=canvas.getContext('2d');canvas.width=2000;canvas.height=200;ctx.textBaseline="top";ctx.font="14px 'Arial'";ctx.textBaseline="alphabetic";ctx.fillStyle="#f60";ctx.fillRect(125,1,62,20);ctx.fillStyle="#069";ctx.fillText("Hello, world!",2,15);ctx.fillStyle="rgba(102, 204, 0, 0.7)";ctx.fillText("Hello, world!",4,17);return canvas.toDataURL()};const getWebGLFingerprint=()=>{const canvas=document.createElement('canvas');const gl=canvas.getContext('webgl')||canvas.getContext('experimental-webgl');if(!gl){return'not supported'} 27const debugInfo=gl.getExtension('WEBGL_debug_renderer_info');const vendor=gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);const renderer=gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);return `webgl vendor: ${vendor}; renderer: ${renderer}`} 28function getAudioFingerprint(){return new Promise(resolve=>{const context=new(window.OfflineAudioContext||window.webkitOfflineAudioContext)(1,44100,44100);const oscillator=context.createOscillator();oscillator.type='triangle';oscillator.frequency.setValueAtTime(10000,context.currentTime);const compressor=context.createDynamicsCompressor();oscillator.connect(compressor);compressor.connect(context.destination);oscillator.start(0);context.startRendering();context.oncomplete=event=>{const output=event.renderedBuffer.getChannelData(0);let hash=0;for(let i=0;i<output.length;i++){hash+=Math.abs(output[i])} 29resolve(hash)}})} 30function getFontsFingerprint(){const baseFonts=['monospace','sans-serif','serif'];const testString="mmmmmmmmmmlli";const testSize='72px';const h=document.getElementsByTagName('body')[0];const container=document.createElement('span');container.style.fontSize=testSize;container.innerHTML=testString;document.body.appendChild(container);const defaultWidths={};
30baseFonts.forEach(font=>{container.style.fontFamily=font;defaultWidths[font]=container.offsetWidth});const checkFont=font=>{let matched=!1;baseFonts.forEach(baseFont=>{container.style.fontFamily=`${font},${baseFont}`;matched=container.offsetWidth!==defaultWidths[baseFont]||matched});return matched};const fonts=['Arial','Arial Black','Comic Sans MS','Courier New'];const results=fonts.map(font=>({font,detected:checkFont(font)}));document.body.removeChild(container);return results.filter(result=>result.detected).map(result=>result.font).join(', ')} 31async function generateFingerprint(){const canvasFingerprint=getCanvasFingerprint();const webGLFingerprint=getWebGLFingerprint();const audioFingerprint=await getAudioFingerprint();const fontsFingerprint=getFontsFingerprint();return `${canvasFingerprint}|${webGLFingerprint}|${audioFingerprint}|${fontsFingerprint}`} 32return{createFingerprint:function(){return new Promise(async function(resolve,reject){const extraArr=[] 33extraArr.push(reducedMotion(),reducedTransparency(),hdr(),invertedColors(),forcedColors(),colorGamut()) 34extraArr.push(vendor(),pdfViewerEnabled(),architecture(),contrast(),cookiesEnabled(),monochrome(),vendorFlavors(),await generateFingerprint()) 35const options={preprocessor:null,audio:{timeout:1e3,excludeIOS11:!0},fonts:{swfContainerId:'fingerprintjs2',swfPath:'flash/compiled/FontList.swf',userDefinedFonts:[],extendedJsFonts:!1},screen:{detectScreenOrientation:!0},plugins:{sortPluginsFor:[/palemoon/i],excludeIE:!1},extraComponents:[],excludes:{timezoneOffset:!0,hasLiedLanguages:!0,hasLiedResolution:!0,hasLiedBrowser:!0,doNotTrack:!0,fontsFlash:!0,adBlock:!0,pixelRatio:!0,enumerateDevices:!0,userAgent:!0},NOT_AVAILABLE:'not available',ERROR:'error',EXCLUDED:'excluded'} 36let murmur 37setTimeout(()=>{Fingerprint2.get(options,(components)=>{const values=components.map((component)=>component.value) 38values.push(...extraArr) 39murmur=Fingerprint2.x64hash128(values.join(''),31) 40if(murmur){murmur=murmur.replaceAll('"','') 41murmur=murmur.replaceAll('\'','')}else{const date=new Date 42const time=date.getTime() 43murmur=`${time}${time}111111`} 44resolve(murmur)})},2000)})}}} 45window.FingerprintPlugin=FingerprintPlugin()})(window)
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.