1(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ 2 "use strict"; 3 Object.defineProperty(exports, "__esModule", { value: true }); 4 exports.cyrb53 = exports.javaHashCode = exports.murmurhash3_32_gc = void 0; 5 // @ts-nocheck 6 // https://github.com/artem0/canvas-fingerprinting/blob/master/hash/murmurhash3.js 7 // output - 3705295134 a hashed number of the string. 8 // https://en.wikipedia.org/wiki/MurmurHash 9 function murmurhash3_32_gc(key, seed) { 10 var remainder, bytes, h1, h1b, c1, c2, k1, i; 11 remainder = key.length & 3; // key.length % 4 12 bytes = key.length - remainder; 13 h1 = seed; 14 c1 = 0xcc9e2d51; 15 c2 = 0x1b873593; 16 i = 0; 17 while (i < bytes) { 18 k1 = 19 ((key.charCodeAt(i) & 0xff)) | 20 ((key.charCodeAt(++i) & 0xff) << 8) | 21 ((key.charCodeAt(++i) & 0xff) << 16) | 22 ((key.charCodeAt(++i) & 0xff) << 24); 23 ++i; 24 k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff; 25 k1 = (k1 << 15) | (k1 >>> 17); 26 k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff; 27 h1 ^= k1; 28 h1 = (h1 << 13) | (h1 >>> 19); 29 h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff; 30 h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16)); 31 } 32 k1 = 0; 33 switch (remainder) { 34 case 3: 35 k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16; 36 break; 37 case 2: 38 k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8; 39 break; 40 case 1: 41 k1 ^= (key.charCodeAt(i) & 0xff); 42 k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; 43 k1 = (k1 << 15) | (k1 >>> 17); 44 k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; 45 h1 ^= k1; 46 break; 47 default: 48 return 0; 49 } 50 h1 ^= key.length; 51 h1 ^= h1 >>> 16; 52 h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff; 53 h1 ^= h1 >>> 13; 54 h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff; 55 h1 ^= h1 >>> 16; 56 return h1 >>> 0; 57 } 58 exports.murmurhash3_32_gc = murmurhash3_32_gc; 59 // taken from same above repo 60 const javaHashCode = (string, K) => { 61 var hash = 0; 62 if (string.length === 0) { 63 return hash; 64 } 65 let char; 66 for (var i = 0; i < string.length; i++) { 67 char = string.charCodeAt(i); 68 hash = K * ((hash << 5) - hash) + char; 69 hash = hash & hash; 70 } 71 return hash; 72 }; 73 exports.javaHashCode = javaHashCode; 74 // reference - https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript#answer-52171480 75 // output - 6533356943844037 76 const cyrb53 = function (str, seed = 0) { 77 let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed; 78 for (let i = 0, ch; i < str.length; i++) { 79 ch = str.charCodeAt(i); 80 h1 = Math.imul(h1 ^ ch, 2654435761); 81 h2 = Math.imul(h2 ^ ch, 1597334677); 82 } 83 h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909); 84 h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909); 85 return 4294967296 * (2097151 & h2) + (h1 >>> 0); 86 }; 87 exports.cyrb53 = cyrb53; 88 89 },{}],2:[function(require,module,exports){ 90 "use strict"; 91 Object.defineProperty(exports, "__esModule", { value: true }); 92 exports.getCanvasFingerprint = exports.isCanvasSupported = void 0; 93 const isCanvasSupported = () => { 94 var elem = document.createElement('canvas'); 95 return !!(elem.getContext && elem.getContext('2d')); 96 }; 97 exports.isCanvasSupported = isCanvasSupported; 98 // this working code snippet is taken from - https://github.com/artem0/canvas-fingerprinting/blob/master/fingerprinting/fingerprint.js 99 const getCanvasFingerprint = () => { 100 // If canvas is not supported simply return a static string 101 if (!(0, exports.isCanvasSupported)()) 102 return "broprint.js"; 103 // draw a canvas of given text and return its data uri 104 // different browser generates different dataUri based on their hardware configs 105 var canvas = document.createElement('canvas'); 106 var ctx = canvas.getContext('2d'); 107 // https://www.browserleaks.com/canvas#how-does-it-work 108 var txt = 'BroPrint.65@345876'; 109 ctx.textBaseline = "top"; 110 ctx.font = "14px 'Arial'"; 111 ctx.textBaseline = "alphabetic"; 112 ctx.fillStyle = "#f60"; 113 ctx.fillRect(125, 1, 62, 20); 114 ctx.fillStyle = "#069"; 115 ctx.fillText(txt, 2, 15); 116 ctx.fillStyle = "rgba(102, 204, 0, 0.7)"; 117 ctx.fillText(txt, 4, 17); 118 return canvas.toDataURL(); 119 }; 120 exports.getCanvasFingerprint = getCanvasFingerprint; 121 122 },{}],3:[function(require,module,exports){ 123 "use strict"; 124 Object.defineProperty(exports, "__esModule", { value: true }); 125 exports.generateTheAudioFingerPrint = void 0; 126 // ref = https://github.com/rickmacgillis/audio-fingerprint/blob/master/audio-fingerprinting.js 127 // @ts-nocheck 128 exports.generateTheAudioFingerPrint = (function () { 129 var context = null; 130 var currentTime = null; 131 var oscillator = null; 132 var compressor = null; 133 var fingerprint = null; 134 var callback = null; 135 function run(cb, debug = false) { 136 callback = cb; 137 try { 138 setup(); 139 oscillator.connect(compressor); 140 compressor.connect(context.destination); 141 oscillator.start(0); 142 context.startRendering(); 143 context.oncomplete = onComplete; 144 } 145 catch (e) { 146 if (debug) { 147 throw e; 148 } 149 } 150 } 151 function setup() { 152 setContext(); 153 currentTime = context.currentTime; 154 setOscillator(); 155 setCompressor(); 156 } 157 function setContext() { 158 var audioContext = window.OfflineAudioContext || window.webkitOfflineAudioContext; 159 context = new audioContext(1, 44100, 44100); 160 } 161 function setOscillator() { 162 oscillator = context.createOscillator(); 163 oscillator.type = "triangle"; 164 oscillator.frequency.setValueAtTime(10000, currentTime); 165 } 166 function setCompressor() { 167 compressor = context.createDynamicsCompressor(); 168 setCompressorValueIfDefined('threshold', -50); 169 setCompressorValueIfDefined('knee', 40); 170 setCompressorValueIfDefined('ratio', 12); 171 setCompressorValueIfDefined('reduction', -20); 172 setCompressorValueIfDefined('attack', 0); 173 setCompressorValueIfDefined('release', .25); 174 } 175 function setCompressorValueIfDefined(item, value) { 176 if (compressor[item] !== undefined && typeof compressor[item].setValueAtTime === 'function') { 177 compressor[item].setValueAtTime(value, context.currentTime); 178 } 179 } 180 function onComplete(event) { 181 generateFingerprints(event); 182 compressor.disconnect(); 183 } 184 function generateFingerprints(event) { 185 var output = null; 186 for (var i = 4500; 5e3 > i; i++) { 187 var channelData = event.renderedBuffer.getChannelData(0)[i]; 188 output += Math.abs(channelData); 189 } 190 fingerprint = output.toString(); 191 if (typeof callback === 'function') { 192 return callback(fingerprint); 193 } 194 } 195 return { 196 run: run 197 }; 198 })(); 199 200 },{}],4:[function(require,module,exports){ 201 "use strict"; 202 Object.defineProperty(exports, "__esModule", { value: true }); 203 exports.getCurrentBrowserFingerPrint = void 0; 204 const EncryptDecrypt_1 = require("./code/EncryptDecrypt"); 205 const GenerateCanvasFingerprint_1 = require("./code/GenerateCanvasFingerprint"); 206 const generateTheAudioPrints_1 = require("./code/generateTheAudioPrints"); 207 /** 208 * This functions working 209 * @Param {null} 210 * @return {Promise<string>} - resolve(string) 211 */ 212 const getCurrentBrowserFingerPrint = () => { 213 /** 214 * @return {Promise} - a frequency number 120.256896523 215 * @reference - https://fingerprintjs.com/blog/audio-fingerprinting/ 216 */ 217 const getTheAudioPrints = new Promise((resolve, reject) => { 218 generateTheAudioPrints_1.generateTheAudioFingerPrint.run(function (fingerprint) { 219 resolve(fingerprint); 220 }); 221 }); 222 const getScreenResolution = () => { 223 let tSR = { 224 width: window.screen.width, 225 height: window.screen.height, 226 viewportWidth: window.innerWidth,
227 viewportHeight: window.innerHeight, 228 devicePixelRatio: window.devicePixelRatio 229 }; 230 231 return JSON.stringify(tSR); 232 }; 233 const getBrowserLanguages = () => { 234 return navigator.languages || [navigator.language]; 235 }; 236 /** 237 * 238 * @param {null} 239 * @return {Promise<string>} - and sha512 hashed string 240 */ 241 const DevicePrints = new Promise((resolve, reject) => { 242 getTheAudioPrints.then((audioChannelResult) => { 243 let fingerprint = window.btoa(audioChannelResult) + (0, GenerateCanvasFingerprint_1.getCanvasFingerprint)() + getBrowserLanguages(); 244 // using btoa to hash the values to looks better readable 245 resolve((0, EncryptDecrypt_1.cyrb53)(fingerprint, 0)); 246 }).catch(() => { 247 try { 248 // if failed with audio fingerprint then resolve only with canvas fingerprint 249 resolve((0, EncryptDecrypt_1.cyrb53)((0, GenerateCanvasFingerprint_1.getCanvasFingerprint)()).toString() + getBrowserLanguages()); 250 } 251 catch (error) { 252 reject("Failed to generate the finger print of this browser"); 253 } 254 }); 255 } 256 ); 257 return DevicePrints; 258 }; 259 exports.getCurrentBrowserFingerPrint = getCurrentBrowserFingerPrint; 260 261 },{"./code/EncryptDecrypt":1,"./code/GenerateCanvasFingerprint":2,"./code/generateTheAudioPrints":3}],5:[function(require,module,exports){ 262 "use strict"; 263 264 var _index = require("@rajesh896/broprint.js/lib/index.js"); 265 globalThis.window.getCurrentBrowserFingerPrint = _index.getCurrentBrowserFingerPrint; 266 267 },{"@rajesh896/broprint.js/lib/index.js":4}]},{},[5]); 268
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.