{"version":3,"sources":["jsdelivr-header.js","/npm/get-browser-fingerprint@5.1.1/src/index.js"],"names":[],"mappings":"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","file":"/npm/get-browser-fingerprint@5.1.1/src/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/get-browser-fingerprint@5.1.1/src/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","const murmurHash3 = (key, seed = 0) => {\n  let h = seed ^ key.length;\n\n  let i = 0;\n  const len = key.length;\n\n  while (i + 3 < len) {\n    let k = (key.charCodeAt(i) & 0xff) | ((key.charCodeAt(i + 1) & 0xff) << 8) | ((key.charCodeAt(i + 2) & 0xff) << 16) | ((key.charCodeAt(i + 3) & 0xff) << 24);\n    k = Math.imul(k, 0xcc9e2d51);\n    k = (k << 15) | (k >>> 17); // ROTL32(k, 15)\n    k = Math.imul(k, 0x1b873593);\n    h ^= k;\n    h = (h << 13) | (h >>> 19); // ROTL32(h, 13)\n    h = Math.imul(h, 5) + 0xe6546b64;\n    i += 4;\n  }\n\n  // tail\n  let k1 = 0;\n  switch (len - i) {\n    // biome-ignore lint/suspicious/noFallthroughSwitchClause: ignore\n    case 3:\n      k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;\n    // biome-ignore lint/suspicious/noFallthroughSwitchClause: ignore\n    case 2:\n      k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;\n    case 1:\n      k1 ^= key.charCodeAt(i) & 0xff;\n      k1 = Math.imul(k1, 0xcc9e2d51);\n      k1 = (k1 << 15) | (k1 >>> 17);\n      k1 = Math.imul(k1, 0x1b873593);\n      h ^= k1;\n  }\n\n  h ^= h >>> 16;\n  h = Math.imul(h, 0x85ebca6b);\n  h ^= h >>> 13;\n  h = Math.imul(h, 0xc2b2ae35);\n  h ^= h >>> 16;\n  h = h >>> 0; // force unsigned 32 bit\n\n  const result = h.toString(16).padStart(8, '0');\n  return result;\n};\n\nconst safe = async (fn) => {\n  try {\n    return await fn();\n  } catch {\n    return null;\n  }\n};\n\nconst stableStringify = (obj) => {\n  // handle null, string, number, boolean\n  if (obj === null || typeof obj !== 'object') return JSON.stringify(obj);\n  // handle arrays recursively\n  if (Array.isArray(obj)) return `[${obj.map(stableStringify).join(',')}]`;\n\n  const keys = Object.keys(obj).sort();\n  const parts = [];\n  for (const key of keys) {\n    const value = obj[key];\n    if (value !== undefined) parts.push(`${stableStringify(key)}:${stableStringify(value)}`);\n  }\n\n  return `{${parts.join(',')}}`;\n};\n\nconst isMobile = () =>\n  navigator.userAgentData?.mobile === true ||\n  /Mobi|Android|iPhone|iPad|iPod|webOS|BlackBerry|Windows Phone/i.test(navigator.userAgent) ||\n  (navigator.maxTouchPoints > 0 && matchMedia('(pointer:coarse)').matches && innerWidth <= 1024);\n\n/** @type {import('./index.d.ts').getBrowserFingerprint} */\nconst getBrowserFingerprint = async ({ debug = false } = {}) => {\n  // software\n  const fonts = await safe(() => getFonts());\n  const numberingSystem = await safe(() => new Intl.NumberFormat(window.navigator.languages?.[0] || 'en').resolvedOptions().numberingSystem);\n  const languages = window.navigator.languages ? Array.from(window.navigator.languages).join(',') : window.navigator.language || null;\n  const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n  const timezoneOffset = new Date().getTimezoneOffset();\n  const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'reduce' : 'no-preference';\n  const colorScheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n\n  // hardware\n  const forcedColors = window.matchMedia('(forced-colors: active)').matches ? 'active' : null;\n  const { pixelDepth, colorDepth } = window.screen;\n  const touchSupport = 'ontouchstart' in window || window.navigator.maxTouchPoints > 0;\n  const canvasID = await safe(() => getCanvasID(debug));\n  const webglID = await safe(() => getWebglID());\n  const webgpuID = await safe(() => getWebgpuID(debug));\n  const audioID = await safe(() => getAudioID(debug));\n  const aspectRatio = window.screen.width && window.screen.height ? (window.screen.width / window.screen.height).toFixed(4) : null;\n\n  const data = {\n    // SOFTWARE\n    vendor: window.navigator.vendor || null, // vendor\n    platform: window.navigator.platform || null, // os\n    fonts, // stable default os setting\n    numberingSystem, // stable default os setting\n    languages, // stable user locale/setting\n    timezone, // stable user locale/setting\n    timezoneOffset, // stable user locale/setting\n    reducedMotion, // stable user locale/setting\n    colorScheme, // stable user locale/setting\n    // HARDWARE\n    hardwareConcurrency: window.navigator.hardwareConcurrency || null, // cpu\n    deviceMemory: window.navigator.deviceMemory || null, // ram\n    forcedColors, // display\n    pixelDepth, // display\n    colorDepth, // display\n    touchSupport, // display\n    canvasID, // gpu\n    webglID, // gpu\n    webgpuID, // gpu\n    audioID, // audio\n  };\n\n  const mobileData = {\n    aspectRatio,\n    width: window.screen.width,\n    height: window.screen.height,\n    maxTouchPoints: window.navigator.maxTouchPoints,\n  };\n\n  if (isMobile()) Object.assign(data, mobileData);\n\n  const payload = stableStringify(data);\n  const fingerprint = murmurHash3(payload);\n  return { fingerprint, ...data };\n};\n\nconst getCanvasID = async (debug) => {\n  const canvas = document.createElement('canvas');\n  canvas.width = 280;\n  canvas.height = 100;\n  const ctx = canvas.getContext('2d');\n\n  // background with gradient\n  const grad = ctx.createLinearGradient(0, 0, 280, 100);\n  grad.addColorStop(0, '#f60');\n  grad.addColorStop(0.4, '#09f');\n  grad.addColorStop(0.7, '#f09');\n  grad.addColorStop(1, '#0f9');\n  ctx.fillStyle = grad;\n  ctx.fillRect(0, 0, 280, 100);\n\n  // text with multiple fonts and emoji\n  ctx.font = '18px \"Arial\",\"Helvetica\",\"DejaVu Sans\",sans-serif';\n  ctx.fillStyle = '#000';\n  ctx.textBaseline = 'alphabetic';\n  ctx.fillText('Fingerprint ¼½¾™©®∆π∑€¶§', 12, 45);\n\n  ctx.font = 'bold 22px \"Georgia\",\"Times New Roman\",serif';\n  ctx.fillStyle = '#222';\n  ctx.fillText('🦊🐱🚀 2026', 12, 78);\n\n  // content with antialiasing and compositing\n  ctx.globalAlpha = 0.7;\n  ctx.fillStyle = 'rgba(255, 80, 0, 0.35)';\n  ctx.fillRect(180, 20, 80, 60);\n\n  ctx.beginPath();\n  ctx.arc(220, 50, 32, 0, Math.PI * 2);\n  ctx.strokeStyle = '#fff';\n  ctx.lineWidth = 4;\n  ctx.stroke();\n\n  ctx.beginPath();\n  ctx.moveTo(30, 85);\n  ctx.quadraticCurveTo(140, 20, 240, 85);\n  ctx.strokeStyle = '#00f';\n  ctx.lineWidth = 3;\n  ctx.stroke();\n\n  if (debug) {\n    canvas.style.border = '1px solid #444';\n    document.body.appendChild(canvas);\n  }\n\n  const dataUrl = canvas.toDataURL('image/png');\n  const result = murmurHash3(dataUrl);\n  return result;\n};\n\nconst getWebglID = () => {\n  const canvas = document.createElement('canvas');\n  const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n  const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n  const vendor = debugInfo ? gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) : gl.getParameter(gl.VENDOR);\n  const renderer = debugInfo ? gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) : gl.getParameter(gl.RENDERER);\n  const info = { vendor, renderer };\n  const result = murmurHash3(stableStringify(info));\n  return result;\n};\n\nconst getWebgpuID = async (debug) => {\n  const adapter = await navigator.gpu.requestAdapter({ powerPreference: 'high-performance' });\n  const vendor = adapter.info?.vendor ?? '';\n  const architecture = adapter.info?.architecture ?? '';\n  const description = adapter.info?.description ?? '';\n  const features = Array.from(adapter.features).sort();\n  const limits = Array.from(adapter.limits).sort();\n  const info = { vendor, architecture, description, features, limits };\n\n  if (debug) {\n    const debugDiv = document.createElement('pre');\n    debugDiv.style.margin = '10px 0';\n    debugDiv.style.padding = '10px';\n    debugDiv.style.border = '1px solid #444';\n    debugDiv.style.background = '#111';\n    debugDiv.style.color = '#0f8';\n    debugDiv.style.fontFamily = 'monospace';\n    debugDiv.textContent = `WebGPU:\\n${JSON.stringify(info, null, 2)}`;\n    document.body.appendChild(debugDiv);\n  }\n\n  const result = murmurHash3(stableStringify(info));\n  return result;\n};\n\nconst getAudioID = async (debug) => {\n  const OfflineCtx = window.OfflineAudioContext || window.webkitOfflineAudioContext;\n\n  const context = new OfflineCtx(1, 6000, 44100);\n  const osc = context.createOscillator();\n  osc.type = 'sawtooth';\n  osc.frequency.value = 8800;\n\n  const compressor = context.createDynamicsCompressor();\n  compressor.threshold.value = -48;\n  compressor.knee.value = 30;\n  compressor.ratio.value = 14;\n  compressor.attack.value = 0;\n  compressor.release.value = 0.3;\n\n  const gain = context.createGain();\n  gain.gain.value = 0.4;\n\n  osc.connect(compressor);\n  compressor.connect(gain);\n  gain.connect(context.destination);\n\n  osc.start(0);\n  const buffer = await context.startRendering();\n  const channel = buffer.getChannelData(0);\n\n  let hash = 0;\n  let hash2 = 0;\n  for (let i = 3000; i < 5800; i += 2) {\n    const v = channel[i];\n    hash = (hash * 31 + Math.floor((v + 1) * 100000)) | 0;\n    hash2 = Math.imul(hash2 ^ Math.floor(v * 98765), 0x85ebca77);\n  }\n  const final = (hash >>> 0) ^ (hash2 >>> 0);\n\n  if (debug) {\n    const wc = document.createElement('canvas');\n    wc.width = 500;\n    wc.height = 120;\n    wc.style.border = '1px solid #444';\n    wc.style.margin = '10px 0';\n    wc.title = 'Audio buffer snippet (4500–5000 samples)';\n\n    const ctx = wc.getContext('2d');\n    ctx.fillStyle = '#111';\n    ctx.fillRect(0, 0, wc.width, wc.height);\n\n    ctx.font = '14px monospace';\n    ctx.fillStyle = '#0f8';\n    ctx.textAlign = 'left';\n    ctx.fillText('AudioID', 10, 20);\n\n    ctx.strokeStyle = '#0f8';\n    ctx.lineWidth = 1.5;\n    ctx.beginPath();\n\n    const waveform = Array.from(channel.slice(4500, 5000));\n    const step = wc.width / waveform.length;\n\n    for (let i = 0; i < waveform.length; i++) {\n      const x = i * step;\n      const y = ((waveform[i] + 1) / 2) * wc.height;\n      if (i === 0) ctx.moveTo(x, y);\n      else ctx.lineTo(x, y);\n    }\n    ctx.stroke();\n\n    document.body.appendChild(wc);\n  }\n\n  const result = murmurHash3(final.toString(16));\n  return result;\n};\n\nconst getFonts = () => {\n  const baseFonts = ['monospace', 'serif', 'sans-serif'];\n  const testFonts = [\n    'Arial',\n    'Helvetica',\n    'Verdana',\n    'Trebuchet MS',\n    'Comic Sans MS',\n    'Georgia',\n    'Times New Roman',\n    'Courier New',\n    'Segoe UI',\n    'Roboto',\n    'Open Sans',\n    'Noto Sans',\n    'system-ui',\n    '-apple-system',\n    'BlinkMacSystemFont',\n  ];\n\n  const span = document.createElement('span');\n  span.style.fontSize = '72px';\n  span.style.position = 'absolute';\n  span.style.visibility = 'hidden';\n  span.style.whiteSpace = 'nowrap';\n  span.textContent = 'mmmmmmmmmwwwwwww';\n  document.body.appendChild(span);\n\n  const defaults = {};\n  for (const base of baseFonts) {\n    span.style.fontFamily = base;\n    defaults[base] = span.offsetWidth;\n  }\n\n  const detected = [];\n  for (const font of testFonts) {\n    let found = false;\n    for (const base of baseFonts) {\n      span.style.fontFamily = `\"${font}\", ${base}`;\n      if (span.offsetWidth !== defaults[base]) {\n        detected.push(font);\n        found = true;\n        break;\n      }\n    }\n    if (!found) {\n      span.style.fontFamily = `\"${font}\"`;\n      if (span.offsetWidth !== defaults.monospace && span.offsetWidth !== defaults.serif) {\n        detected.push(font);\n      }\n    }\n  }\n\n  document.body.removeChild(span);\n  const info = detected.length ? detected.sort().join(',') : null;\n  return info;\n};\n\nif (typeof window !== 'undefined') {\n  window.getBrowserFingerprint = getBrowserFingerprint;\n}\n\nexport default getBrowserFingerprint;\n"]}