{
"version": 3,
"sources": ["../../js/utils.ts", "../../js/canvas.ts", "../../js/codecs.ts", "../../js/colors.ts", "../../js/domrect.ts", "../../js/fonts.ts", "../../js/math.ts", "../../js/plugins.ts", "../../js/properties.ts", "../../js/speech.ts", "../../js/webgl.ts", "../../js/device.ts", "../../js/storedids.ts", "../../js/main.ts"],
"sourcesContent": ["export const mmapiws = window.__mmapiws || {};\n\n/**\n * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011)\n *\n * @author Gary Court\n * @see http://github.com/garycourt/murmurhash-js\n * @author Austin Appleby\n * @see http://sites.google.com/site/murmurhash/\n * @license MIT. http://opensource.org/licenses/MIT\n *\n * @param {string} key ASCII only\n * @param {number} seed Positive integer only\n * @return {number} 32-bit positive integer hash\n */\nexport function murmurhash3(key: string, seed: number): number {\n const remainder = key.length & 3; // key.length % 4\n const bytes = key.length - remainder;\n let h1 = seed;\n let h1b: number;\n const c1 = 0xcc9e2d51;\n const c2 = 0x1b873593;\n let i = 0;\n let k1: number;\n\n while (i < bytes) {\n k1 =\n (key.charCodeAt(i) & 0xff) |\n ((key.charCodeAt(++i) & 0xff) << 8) |\n ((key.charCodeAt(++i) & 0xff) << 16) |\n ((key.charCodeAt(++i) & 0xff) << 24);\n ++i;\n\n k1 =\n ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 =\n ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1b =\n ((h1 & 0xffff) * 5 + ((((h1 >>> 16) * 5) & 0xffff) << 16)) & 0xffffffff;\n h1 = (h1b & 0xffff) + 0x6b64 + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16);\n }\n\n k1 = 0;\n\n /* eslint default-case: 0, no-fallthrough: 0, max-len: 0 */\n switch (remainder) {\n case 3:\n k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;\n case 2:\n k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;\n case 1:\n k1 ^= key.charCodeAt(i) & 0xff;\n\n k1 =\n ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) &\n 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 =\n ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) &\n 0xffffffff;\n h1 ^= k1;\n }\n\n h1 ^= key.length;\n\n h1 ^= h1 >>> 16;\n h1 =\n ((h1 & 0xffff) * 0x85ebca6b +\n ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) &\n 0xffffffff;\n h1 ^= h1 >>> 13;\n h1 =\n ((h1 & 0xffff) * 0xc2b2ae35 +\n ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16)) &\n 0xffffffff;\n h1 ^= h1 >>> 16;\n\n return h1 >>> 0;\n}\n\nexport function timer(ms: number): Promise {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function inThirdPartyIframe(): boolean {\n try {\n return window.top.location.origin !== window.self.location.origin;\n } catch {\n // If it is a third party iframe, we will generally end up here\n // as window.top.location.origin will fail for security reasons.\n return true;\n }\n}\n", "import { murmurhash3 } from './utils';\n\nexport function getCanvas2dHash(): number {\n let canvas: HTMLCanvasElement;\n let ctx: CanvasRenderingContext2D;\n try {\n canvas = document.createElement('canvas');\n ctx = canvas.getContext('2d');\n } catch {}\n\n if (!ctx) {\n return null;\n }\n\n ctx.fillStyle = 'red';\n ctx.fillRect(30, 10, 200, 100);\n\n ctx.strokeStyle = '#1a3bc1';\n ctx.lineWidth = 6;\n ctx.lineCap = 'round';\n ctx.arc(50, 50, 20, 0, Math.PI, false);\n ctx.stroke();\n\n ctx.fillStyle = '#42e1a2';\n\n ctx.font = \"15.4px 'Arial'\";\n ctx.textBaseline = 'alphabetic';\n ctx.fillText('PR flacks quiz gym: TV DJ box when? \\u2620', 15, 60);\n ctx.shadowOffsetX = 1;\n ctx.shadowOffsetY = 2;\n ctx.shadowColor = 'white';\n ctx.fillStyle = 'rgba(0, 0, 200, 0.5)';\n ctx.font = \"60px 'Not a real font'\";\n ctx.fillText('No\\u9A97', 40, 80);\n\n return murmurhash3(canvas.toDataURL(), 0);\n}\n", "export interface Codecs {\n audio: { [key: string]: boolean };\n video: { [key: string]: boolean };\n}\n\nexport function getCodecs(): Codecs {\n const videoTypes = [\n 'video/mp4; codecs=\"avc1.42c00d\"',\n 'video/ogg; codecs=\"theora\"',\n 'video/webm; codecs=\"vorbis,vp8\"',\n 'video/webm; codecs=\"vorbis,vp9\"',\n 'video/mp2t; codecs=\"avc1.42E01E,mp4a.40.2\"',\n ];\n const audioTypes = [\n 'audio/mpeg',\n 'audio/mp4; codecs=\"mp4a.40.2\"',\n 'audio/ogg; codecs=\"vorbis\"',\n 'audio/ogg; codecs=\"opus\"',\n 'audio/webm; codecs=\"vorbis\"',\n 'audio/wav; codecs=\"1\"',\n ];\n\n return {\n audio: typeSupport(audioTypes),\n video: typeSupport(videoTypes),\n };\n}\n\nfunction typeSupport(mediaTypes: string[]): { [key: string]: boolean } {\n const supportedMediaTypes = {};\n for (let i = 0; i < mediaTypes.length; i++) {\n const mimeType = mediaTypes[i];\n if (window.MediaSource) {\n supportedMediaTypes[mimeType] =\n window.MediaSource.isTypeSupported(mimeType);\n }\n }\n return supportedMediaTypes;\n}\n", "export interface SystemColors {\n ActiveBorder?: string;\n ActiveCaption?: string;\n AppWorkspace?: string;\n Background?: string;\n ButtonFace?: string;\n ButtonHighlight?: string;\n ButtonShadow?: string;\n ButtonText?: string;\n CaptionText?: string;\n GrayText?: string;\n Highlight?: string;\n HighlightText?: string;\n InactiveBorder?: string;\n InactiveCaption?: string;\n InactiveCaptionText?: string;\n InfoBackground?: string;\n InfoText?: string;\n Menu?: string;\n MenuText?: string;\n Scrollbar?: string;\n ThreeDDarkShadow?: string;\n ThreeDFace?: string;\n ThreeDHighlight?: string;\n ThreeDLightShadow?: string;\n ThreeDShadow?: string;\n Window?: string;\n WindowFrame?: string;\n WindowText?: string;\n}\n\nexport function getSystemColors(): SystemColors {\n const colors: SystemColors = {};\n let canvas: HTMLCanvasElement;\n let ctx: CanvasRenderingContext2D | null;\n try {\n canvas = document.createElement('canvas');\n ctx = canvas.getContext('2d');\n } catch {}\n\n if (!ctx) {\n return colors;\n }\n\n const elements = [\n 'ActiveBorder',\n 'ActiveCaption',\n 'AppWorkspace',\n 'Background',\n 'ButtonFace',\n 'ButtonHighlight',\n 'ButtonShadow',\n 'ButtonText',\n 'CaptionText',\n 'GrayText',\n 'Highlight',\n 'HighlightText',\n 'InactiveBorder',\n 'InactiveCaption',\n 'InactiveCaptionText',\n 'InfoBackground',\n 'InfoText',\n 'Menu',\n 'MenuText',\n 'Scrollbar',\n 'ThreeDDarkShadow',\n 'ThreeDFace',\n 'ThreeDHighlight',\n 'ThreeDLightShadow',\n 'ThreeDShadow',\n 'Window',\n 'WindowFrame',\n 'WindowText',\n ];\n\n for (let i = 0; i < elements.length; i++) {\n ctx.fillStyle = elements[i];\n colors[elements[i]] = ctx.fillStyle;\n }\n\n return colors;\n}\n", "import { murmurhash3 } from './utils';\n\nconst styles: Partial[] = [\n {\n width: '150px',\n height: '100px',\n border: '2px solid rgba(0,150,255,0.91)',\n color: 'rgba(255,255,255,1)',\n background: 'rgb(255,255,255)',\n position: 'absolute',\n transform:\n 'skewY(29.1755628deg) rotate3d(11.000000007, 90, 0.100000000000009, 60000000000033.0000000006deg)',\n },\n {\n width: '150px',\n height: '100px',\n border: 'solid 2.89px',\n borderColor: '#3A0CA3',\n fontSize: '45px',\n marginTop: '50px',\n position: 'absolute',\n transform:\n 'skewY(29.1755618deg) scale(3.0000000000333, -1.00002) matrix(33.0000000003, 1.000001, -2.0000003, 1.009, 33.00000003, -6.0000006)',\n },\n {\n width: '150px',\n height: '100px',\n border: '2px solid rgba(0,150,255,0.91)',\n borderColor: 'rgba(0,150,255,0.91)',\n padding: '15px',\n position: 'absolute',\n transform: 'perspective(1555px) translateZ(-25.0000001px)',\n },\n {\n width: '150px',\n height: '100px',\n border: '2px solid rgba(0,1,255,0.91)',\n top: '0.1rem',\n left: '0.1rem',\n marginTop: '--255.50005px',\n marginLeft: '0.500005rem',\n position: 'absolute',\n },\n {\n width: '150px',\n height: '100px',\n border: '2px solid rgba(118,165,175,1)',\n marginTop: '-333.552px',\n marginLeft: '13.90000099rem',\n padding: '4.4545px',\n left: '5px',\n top: '5px',\n position: 'absolute',\n transform:\n ' matrix(33.0000000003, 1.000001, -2.0000003, 1.009, 33.00000003, -6.0000006)',\n },\n];\nexport async function getDOMRect(): Promise {\n try {\n const iframe = document.createElement('iframe');\n iframe.style.visibility = 'hidden';\n document.body.appendChild(iframe);\n return new Promise((resolve, reject) => {\n iframe.onload = function () {\n const iframeDocument =\n iframe.contentDocument || iframe.contentWindow?.document;\n if (!iframeDocument) {\n reject(new Error('Failed to create iframe document'));\n return;\n }\n styles.forEach((style, index) => {\n const rect = iframeDocument.createElement('div');\n rect.id = `rect-${index}`;\n Object.assign(rect.style, style);\n iframeDocument.body.appendChild(rect);\n });\n\n const getRect = (id: string) =>\n iframeDocument.getElementById(id)?.getClientRects()[0];\n\n const rects: DOMRect[] = styles.map((_, index) => {\n const rect = getRect(`rect-${index}`);\n if (!rect) {\n reject(new Error(`Failed to get rect for rect-${index}`));\n }\n return rect;\n });\n\n const rectHash = murmurhash3(JSON.stringify(rects), 0);\n document.body.removeChild(iframe);\n resolve(rectHash);\n };\n iframe.src = 'about:blank';\n });\n } catch {\n return null;\n }\n}\n", "const fontsToTry = [\n 'Abadi MT Condensed Light',\n 'Adobe Fangsong Std',\n 'Adobe Hebrew',\n 'Adobe Ming Std',\n 'Agency FB',\n 'Arab',\n 'Arabic Typesetting',\n 'Arial Black',\n 'Batang',\n 'Bauhaus 93',\n 'Bell MT',\n 'Bitstream Vera Serif',\n 'Bodoni MT',\n 'Bookman Old Style',\n 'Braggadocio',\n 'Broadway',\n 'Calibri',\n 'Californian FB',\n 'Castellar',\n 'Casual',\n 'Centaur',\n 'Century Gothic',\n 'Chalkduster',\n 'Colonna MT',\n 'Copperplate Gothic Light',\n 'DejaVu LGC Sans Mono',\n 'Desdemona',\n 'DFKai-SB',\n 'Dotum',\n 'Engravers MT',\n 'Eras Bold ITC',\n 'Eurostile',\n 'FangSong',\n 'Forte',\n 'Franklin Gothic Heavy',\n 'French Script MT',\n 'Gabriola',\n 'Gigi',\n 'Gisha',\n 'Goudy Old Style',\n 'Gulim',\n 'GungSeo',\n 'Haettenschweiler',\n 'Harrington',\n 'Hiragino Sans GB',\n 'Impact',\n 'Informal Roman',\n 'KacstOne',\n 'Kino MT',\n 'Kozuka Gothic Pr6N',\n 'Lohit Gujarati',\n 'Loma',\n 'Lucida Bright',\n 'Lucida Fax',\n 'Magneto',\n 'Malgun Gothic',\n 'Matura MT Script Capitals',\n 'Menlo',\n 'MingLiU-ExtB',\n 'MoolBoran',\n 'MS PMincho',\n 'MS Reference Sans Serif',\n 'News Gothic MT',\n 'Niagara Solid',\n 'Nyala',\n 'Palace Script MT',\n 'Papyrus',\n 'Perpetua',\n 'Playbill',\n 'PMingLiU',\n 'Rachana',\n 'Rockwell',\n 'Sawasdee',\n 'Script MT Bold',\n 'Segoe Print',\n 'Showcard Gothic',\n 'SimHei',\n 'Snap ITC',\n 'TlwgMono',\n 'Tw Cen MT Condensed Extra Bold',\n 'Ubuntu',\n 'Umpush',\n 'Univers',\n 'Utopia',\n 'Vladimir Script',\n 'Wide Latin',\n];\n\nexport function getFonts(): string[] {\n const fonts = getCanvasFonts();\n if (fonts !== null) {\n return fonts;\n }\n return getCssFonts();\n}\n\nfunction getCanvasFonts(): string[] {\n let canvas: HTMLCanvasElement;\n let ctx: CanvasRenderingContext2D;\n try {\n canvas = document.createElement('canvas');\n ctx = canvas.getContext('2d');\n } catch {}\n\n if (!ctx) {\n return null;\n }\n\n const baseFonts = ['sans-serif', 'serif', 'monospace'];\n const baseFontMetrics = [];\n const fontSize = '72px';\n const testText = 'mmmmmmmmmmlli';\n\n for (let k = 0; k < baseFonts.length; k++) {\n ctx.font = fontSize + ' \"' + baseFonts[k] + '\"';\n baseFontMetrics[k] = ctx.measureText(testText);\n }\n\n const fonts = [];\n for (let i = 0; i < fontsToTry.length; i++) {\n const font = fontsToTry[i];\n\n let hasFont = false;\n for (let j = 0; j < baseFontMetrics.length; j++) {\n ctx.font = fontSize + ' \"' + font + '\", \"' + baseFonts[j] + '\"';\n const fontMetric = ctx.measureText(testText);\n if (\n fontMetric.width !== baseFontMetrics[j].width ||\n fontMetric.fontBoundingBoxAscent !==\n baseFontMetrics[j].fontBoundingBoxAscent\n ) {\n hasFont = true;\n break;\n }\n }\n if (hasFont) {\n fonts.push(font);\n }\n }\n return fonts;\n}\n\nfunction getCssFonts(): string[] {\n const fonts = [];\n const fontDetector = new Detector();\n\n for (let i = 0; i < fontsToTry.length; i++) {\n const font = fontsToTry[i];\n\n if (fontDetector.detect(font)) {\n fonts.push(font);\n }\n }\n fontDetector.finish();\n return fonts;\n}\n\n/*!\n * Based on Detector function (v.0.3) from:\n * Author : Lalit Patel\n * Website: http://www.lalit.org/lab/javascript-css-font-detect/\n * License: Apache Software License 2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n */\nfunction Detector() {\n const baseFonts = ['monospace', 'sans-serif', 'serif'];\n const baseFontSizes = [];\n const testString = 'mmmmmmmmmmlli';\n const testSize = '72px';\n const body = document.body;\n const span = document.createElement('span');\n const style = span.style;\n\n style.fontSize = testSize;\n style.visibility = 'hidden';\n span.innerText = testString;\n body.appendChild(span);\n\n const calculateFontSize = function (name: string): {\n height: number;\n width: number;\n } {\n style.fontFamily = name;\n\n return {\n height: span.offsetHeight,\n width: span.offsetWidth,\n };\n };\n\n for (let i = 0; i < baseFonts.length; i++) {\n baseFontSizes[i] = calculateFontSize(baseFonts[i]);\n }\n\n this.detect = function (font: string): boolean {\n for (let j = 0; j < baseFontSizes.length; j++) {\n const fontSize = calculateFontSize('\"' + font + '\",' + baseFonts[j]);\n const baseFontSize = baseFontSizes[j];\n if (\n fontSize.height !== baseFontSize.height ||\n fontSize.width !== baseFontSize.width\n ) {\n return true;\n }\n }\n return false;\n };\n\n this.finish = function (): void {\n body.removeChild(span);\n };\n}\n", "const funcs = [\n Math.acos,\n Math.acosh,\n Math.asin,\n Math.atan,\n Math.atanh,\n Math.cos,\n Math.cosh,\n Math.exp,\n Math.expm1,\n Math.fround,\n Math.log,\n Math.log10,\n Math.sin,\n Math.sinh,\n Math.sqrt,\n Math.tan,\n Math.tanh,\n];\n\nconst constants = [\n -1,\n 0,\n 1,\n Math.E,\n Math.PI,\n Math.SQRT2,\n 1e300,\n -1e300,\n 1e-300,\n 1e-300,\n];\n\nexport function getMath(): object {\n const calcs = {};\n for (const f of funcs) {\n if (f) {\n const fCalcs = (calcs[f.name] ??= {});\n\n for (const c of constants) {\n // We skip NaNs mostly to reduce payload size without losing\n // information.\n const v = f(c);\n if (!Number.isNaN(v)) {\n fCalcs[c] = stringify(v);\n }\n }\n }\n }\n return calcs;\n}\n\nfunction stringify(v: number) {\n if (v == Number.NEGATIVE_INFINITY) {\n return '-Infinity';\n }\n\n if (v == Number.POSITIVE_INFINITY) {\n return 'Infinity';\n }\n\n return v;\n}\n", "interface MIMEType {\n description: string;\n suffixes: string;\n type: string;\n}\n\nexport interface DevicePlugin {\n name: string;\n filename: string;\n description: string;\n mimeTypes?: MIMEType[];\n version?: string;\n}\n\n// This list is a mostly random sample of plugins we saw on proxies.\nconst pluginsToTry = [\n '4game',\n 'AdblockPlugin',\n 'AdobeExManCCDetect',\n 'AdobeExManDetect',\n 'Alawar NPAPI utils',\n 'Aliedit Plug-In',\n 'Alipay Security Control 3',\n 'AliSSOLogin plugin',\n 'AmazonMP3DownloaderPlugin',\n 'AOL Media Playback Plugin',\n 'AppUp',\n 'ArchiCAD',\n 'AVG SiteSafety plugin',\n 'Babylon ToolBar',\n 'Battlelog Game Launcher',\n 'BitCometAgent',\n 'Bitdefender QuickScan',\n 'BlueStacks Install Detector',\n 'CatalinaGroup Update',\n 'Citrix ICA Client',\n 'Citrix online plug-in',\n 'Citrix Receiver Plug-in',\n 'Coowon Update',\n 'DealPlyLive Update',\n 'Default Browser Helper',\n 'DivX Browser Plug-In',\n 'DivX Plus Web Player',\n 'DivX VOD Helper Plug-in',\n 'doubleTwist Web Plugin',\n 'Downloaders plugin',\n 'downloadUpdater',\n 'eMusicPlugin DLM6',\n 'ESN Launch Mozilla Plugin',\n 'ESN Sonar API',\n 'Exif Everywhere',\n 'Facebook Plugin',\n 'File Downloader Plug-in',\n 'FileLab plugin',\n 'FlyOrDie Games Plugin',\n 'Folx 3 Browser Plugin',\n 'FUZEShare',\n 'GDL Object Web Plug-in 16.00',\n 'GFACE Plugin',\n 'Ginger',\n 'Gnome Shell Integration',\n 'Google Earth Plugin',\n 'Google Earth Plug-in',\n 'Google Gears 0.5.33.0',\n 'Google Talk Effects Plugin',\n 'Google Update',\n 'Harmony Firefox Plugin',\n 'Harmony Plug-In',\n 'Heroes & Generals live',\n 'HPDetect',\n 'Html5 location provider',\n 'IE Tab plugin',\n 'iGetterScriptablePlugin',\n 'iMesh plugin',\n 'Kaspersky Password Manager',\n 'LastPass',\n 'LogMeIn Plugin 1.0.0.935',\n 'LogMeIn Plugin 1.0.0.961',\n 'Ma-Config.com plugin',\n 'Microsoft Office 2013',\n 'MinibarPlugin',\n 'Native Client',\n 'Nitro PDF Plug-In',\n 'Nokia Suite Enabler Plugin',\n 'Norton Identity Safe',\n 'npAPI Plugin',\n 'NPLastPass',\n 'NPPlayerShell',\n 'npTongbuAddin',\n 'NyxLauncher',\n 'Octoshape Streaming Services',\n 'Online Storage plug-in',\n 'Orbit Downloader',\n 'Pando Web Plugin',\n 'Parom.TV player plugin',\n 'PDF integrado do WebKit',\n 'PDF-XChange Viewer',\n 'PhotoCenterPlugin1.1.2.2',\n 'Picasa',\n 'PlayOn Plug-in',\n 'QQ2013 Firefox Plugin',\n 'QQDownload Plugin',\n 'QQMiniDL Plugin',\n 'QQMusic',\n 'RealDownloader Plugin',\n 'Roblox Launcher Plugin',\n 'RockMelt Update',\n 'Safer Update',\n 'SafeSearch',\n 'Scripting.Dictionary',\n 'SefClient Plugin',\n 'Shell.UIHelper',\n 'Silverlight Plug-In',\n 'Simple Pass',\n 'Skype Web Plugin',\n 'SumatraPDF Browser Plugin',\n 'Symantec PKI Client',\n 'Tencent FTN plug-in',\n 'Thunder DapCtrl NPAPI Plugin',\n 'TorchHelper',\n 'Unity Player',\n 'Uplay PC',\n 'VDownloader',\n 'Veetle TV Core',\n 'VLC Multimedia Plugin',\n 'Web Components',\n 'WebKit-integrierte PDF',\n 'WEBZEN Browser Extension',\n 'Wolfram Mathematica',\n 'WordCaptureX',\n 'WPI Detector 1.4',\n 'Yandex Media Plugin',\n 'Yandex PDF Viewer',\n 'YouTube Plug-in',\n 'zako',\n];\n\nexport function getPlugins(): DevicePlugin[] {\n // We put the plugins in an array instead of a map as order can\n // reveal installation order on some browsers.\n const plugins = [];\n const seen = {};\n\n for (let i = 0; i < navigator.plugins.length; i++) {\n const plugin = navigator.plugins[i];\n\n // We skip Flash with Chrome as it has been causing fingerprint\n // differences between subdomains. In particular, it is sometimes\n // present on one subdomain but not another, even though the content\n // settings are the same. Enumerating navigator.plugins is mostly\n // worthless nowadays anyway.\n if (\n plugin.name === 'Shockwave Flash' &&\n navigator.userAgent.indexOf('Chrome') > -1\n ) {\n continue;\n }\n seen[plugin.name] = 1;\n\n plugins.push(getPluginProperties(plugin));\n }\n\n // Firefox 29+ only displays a small subset of plugins while\n // enumerating to reduce the browser's entropy\n for (let i = 0; i < pluginsToTry.length; i++) {\n const name = pluginsToTry[i];\n if (!seen[name]) {\n const plugin = navigator.plugins[name];\n if (plugin) {\n plugins.push(getPluginProperties(plugin));\n }\n }\n }\n return plugins;\n}\n\nfunction getPluginProperties(plugin: Plugin): DevicePlugin {\n const p: DevicePlugin = {\n name: plugin.name,\n filename: plugin.filename.toLowerCase(),\n description: plugin.description,\n };\n\n if (typeof (plugin as any).version !== 'undefined') {\n p.version = (plugin as any).version;\n }\n\n p.mimeTypes = [];\n for (let j = 0; j < plugin.length; j++) {\n const mime = plugin[j];\n\n p.mimeTypes.push({\n description: mime.description,\n suffixes: mime.suffixes,\n type: mime.type,\n });\n }\n return p;\n}\n", "import { inThirdPartyIframe } from './utils';\n\nexport type ObjectProperties = Record;\n\nexport async function getNavigatorProperties(): Promise {\n const nav = objectProperties(navigator);\n\n // We use this for properties that haven't made it into the\n // navigator TypeScript type yet. Everything else should use\n // navigator directly so that we get type checking.\n const navigatorAny: any = navigator;\n const connection =\n navigatorAny.connection ||\n navigatorAny.mozConnection ||\n navigatorAny.webkitConnection;\n if (connection) {\n nav.connection = objectProperties(connection);\n }\n\n if ('getGamepads' in navigator) {\n try {\n nav.gamepads = Array.from(\n navigator\n .getGamepads()\n .filter((e) => !!e)\n .map((g) => g.id),\n );\n } catch {}\n }\n\n if (\n !inThirdPartyIframe() &&\n navigatorAny.keyboard &&\n navigatorAny.keyboard.getLayoutMap\n ) {\n (nav.keyboard ??= {}).layoutMap = Array.from(\n (await navigatorAny.keyboard.getLayoutMap()).entries(),\n );\n }\n\n if (navigator.mediaDevices) {\n if (navigator.mediaDevices.getSupportedConstraints) {\n (nav.mediaDevices ??= {}).supportedConstraints =\n navigator.mediaDevices.getSupportedConstraints();\n }\n\n if (navigator.mediaDevices.enumerateDevices) {\n // The IDs and labels do not seem stable, when set at all.\n (nav.mediaDevices ??= {}).enumerateDevices = (\n await navigator.mediaDevices.enumerateDevices()\n ).map((d) => d.kind);\n }\n }\n\n return nav;\n}\n\nexport function getScreenProperties(): ObjectProperties {\n const properties: ObjectProperties = {};\n const order = [];\n\n // eslint-disable-next-line no-restricted-syntax\n for (const property in window.screen) {\n if (typeof window.screen[property] !== 'object') {\n properties[property] = window.screen[property];\n }\n order.push(property);\n }\n properties.enumerationOrder = order;\n\n return properties;\n}\n\nexport function objectProperties(obj: object): ObjectProperties {\n const order = [];\n const properties: ObjectProperties = {};\n // eslint-disable-next-line no-restricted-syntax\n for (const property in obj) {\n // There are null and object properties which we do not include.\n //\n // Nulls appear in some document modes but not others in IE[8,10] so they\n // are not useful.\n //\n // We tried including plain objects, but that did not get anything\n // interesting in IE[8,11], Chrome 67, or Firefox 60 (the objects aren't\n // plain), so we don't bother.\n if (typeof obj[property] !== 'object' || isArray(obj[property])) {\n properties[property] = obj[property];\n }\n order.push(property);\n }\n properties.enumerationOrder = order;\n\n return properties;\n}\n\n// We cannot use \"Array.isArray()\" as some clients overwrite it with crazy\n// things that do not work correctly. Instead we use the suggested polyfill\n// function from MDN's isArray() page.\nfunction isArray(a: any): boolean {\n return Object.prototype.toString.call(a) === '[object Array]';\n}\n", "import { ObjectProperties, objectProperties } from './properties';\nimport { timer } from './utils';\n\nexport interface SpeechSynthesisProperties {\n voices: ObjectProperties[];\n}\n\nexport async function getSpeechSynthesis(): Promise {\n if (!window.speechSynthesis) {\n return null;\n }\n\n try {\n const voices = await getVoices();\n return {\n voices: voices\n // We take at most 20 elements as this can be very large in Firefox.\n .slice(0, 20)\n .map((v) => objectProperties(v)),\n };\n } catch {\n return null;\n }\n}\n\n// This is a pretty annoying API as getVoices will return an empty\n// list right away as the browser hasn't loaded it yet. We construct\n// our own async version of it.\nasync function getVoices() {\n const voices = speechSynthesis.getVoices();\n if (voices.length) {\n return voices;\n }\n\n await Promise.race([\n new Promise((r) =>\n speechSynthesis.addEventListener('voiceschanged', r, { once: true }),\n ),\n // Wait up to 50 ms for the voices.\n timer(50),\n ]);\n\n return speechSynthesis.getVoices();\n}\n", "import { mmapiws, murmurhash3 } from './utils';\n\nexport interface Webgl {\n extensions?: string[];\n hash?: number;\n}\n\n// This is an extremely minimal use of WebGL. To get a good fingerprint,\n// we may need to make more extensive use of it. It is painful to do\n// without libraries though.\nexport function getWebgl(): Webgl {\n let gl: WebGLRenderingContext;\n const canvas = document.createElement('canvas');\n const props: Webgl = {};\n try {\n gl = (canvas.getContext('webgl') ||\n canvas.getContext('experimental-webgl')) as WebGLRenderingContext;\n } catch {}\n\n if (!gl) {\n return props;\n }\n\n try {\n props.extensions = gl.getSupportedExtensions();\n } catch {}\n try {\n if (!mmapiws.disableWebglHash) {\n props.hash = getWebglHash(gl, canvas);\n }\n } catch {}\n\n return props;\n}\n\nfunction getWebglHash(\n gl: WebGLRenderingContext,\n canvas: HTMLCanvasElement,\n): number {\n /* eslint no-multi-str: 0 */\n const vShaderTemplate =\n '\\\nattribute vec2 attrVertex; \\\nvarying vec2 varyinTexCoordinate; \\\nuniform vec2 uniformOffset; \\\nvoid main() { \\\n varyinTexCoordinate = attrVertex + uniformOffset; \\\n gl_Position = vec4(attrVertex, 0, 1); \\\n}';\n\n const fShaderTemplate =\n '\\\nprecision mediump float; \\\nvarying vec2 varyinTexCoordinate; \\\nvoid main() { \\\n gl_FragColor = vec4(varyinTexCoordinate, 0, 1); \\\n}';\n\n const vertexPosBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexPosBuffer);\n\n const vertices = new Float32Array([\n // X, Y, Z,\n -0.2, -0.9, 0.0, 0.4, -0.26, 0.0, 0.0, 0.732134444, 0.0,\n ]);\n\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n const vertexPosBufferItemSize = 3;\n const vertexPosBufferNumItems = 3;\n\n const program = gl.createProgram();\n const vshader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vshader, vShaderTemplate);\n gl.compileShader(vshader);\n\n const fshader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fshader, fShaderTemplate);\n gl.compileShader(fshader);\n\n gl.attachShader(program, vshader);\n gl.attachShader(program, fshader);\n gl.linkProgram(program);\n\n gl.useProgram(program);\n const programVertexPosAttrib = gl.getAttribLocation(program, 'attrVertex');\n const programOffsetUniform = gl.getUniformLocation(program, 'uniformOffset');\n // TODO: investigate whether this shoudl be set to something else. It was originally\n // a variable that wasn't set.\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(\n programVertexPosAttrib,\n vertexPosBufferItemSize,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n gl.uniform2f(programOffsetUniform, 1, 1);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, vertexPosBufferNumItems);\n\n // Rather than using murmurhash, we could extract the PNG CRC, which\n // may be faster, but this is simpler for now.\n return murmurhash3(canvas.toDataURL(), 0);\n}\n", "import { getCanvas2dHash } from './canvas';\nimport { Codecs, getCodecs } from './codecs';\nimport { SystemColors, getSystemColors } from './colors';\nimport { getDOMRect } from './domrect';\nimport { getFonts } from './fonts';\nimport { getMath } from './math';\nimport { DevicePlugin, getPlugins } from './plugins';\nimport {\n ObjectProperties,\n getNavigatorProperties,\n getScreenProperties,\n} from './properties';\nimport { SpeechSynthesisProperties, getSpeechSynthesis } from './speech';\nimport { StoredIds } from './storedids';\nimport { inThirdPartyIframe, mmapiws } from './utils';\nimport { Webgl, getWebgl } from './webgl';\n\ndeclare global {\n // eslint-disable-next-line\n var maxmind_user_id: number;\n // eslint-disable-next-line\n var survey_height_follow: number;\n}\n\ninterface Battery {\n charging: boolean;\n chargingTime: number;\n dischargingTime: null;\n level: number;\n}\n\ninterface Canvas {\n '2dHash': number;\n webgl: Webgl;\n}\n\ninterface Fonts {\n css: string[];\n}\n\nexport interface Device {\n accountId: number;\n applePay: ObjectProperties;\n canvas: Canvas;\n codecs: Codecs;\n battery?: Battery;\n deviceTime: number;\n documentUrl: string;\n fonts: Fonts;\n hasGPC: boolean;\n heapSizeLimit: number;\n math: object;\n navigator: ObjectProperties;\n plugins: DevicePlugin[];\n rects: number;\n requestDuration?: number;\n screen: ObjectProperties;\n speechSynthesis: SpeechSynthesisProperties;\n storedIds?: StoredIds;\n systemColors: SystemColors;\n timezoneOffset: number;\n touchInput: boolean;\n}\n\nexport async function getDevice(): Promise {\n const date = new Date();\n\n // This can fail on ancient versions of Firefox (e.g., 3.6)\n let systemColors: SystemColors;\n try {\n systemColors = getSystemColors();\n } catch {}\n\n const accountId = getAccountId();\n const device: Device = {\n accountId: accountId,\n applePay: getApplePay(),\n canvas: {\n '2dHash': getCanvas2dHash(),\n webgl: getWebgl(),\n },\n codecs: getCodecs(),\n deviceTime: date.getTime() / 1000,\n documentUrl: document.URL,\n fonts: {\n css: getFonts(),\n },\n hasGPC: getGPC(),\n heapSizeLimit: getHeapSizeLimit(),\n math: getMath(),\n navigator: await getNavigatorProperties(),\n plugins: getPlugins(),\n screen: getScreenProperties(),\n speechSynthesis: await getSpeechSynthesis(),\n systemColors: systemColors,\n timezoneOffset: date.getTimezoneOffset(),\n touchInput: getSupportsTouchInput(),\n rects: await getDOMRect(),\n };\n\n if ((navigator as any).getBattery) {\n const batteryData = await (navigator as any).getBattery();\n device.battery = {\n charging: batteryData.charging,\n chargingTime: batteryData.chargingTime,\n dischargingTime: batteryData.dischargingTime,\n level: batteryData.level,\n };\n }\n\n return device;\n}\n\nfunction getApplePay(): ObjectProperties {\n if (inThirdPartyIframe()) {\n return null;\n }\n const ap = (window as any).ApplePaySession;\n if (!ap) {\n return null;\n }\n\n return {\n canMakePayments: ap.canMakePayments(),\n };\n}\n\nfunction getGPC(): boolean {\n const gpc = (navigator as any).globalPrivacyControl;\n\n // While the spec defines this as a boolean, there seems to be some\n // confusion about it (MDN has it as an integer or maybe a string).\n return !!gpc;\n}\n\nfunction getHeapSizeLimit(): number {\n const memory = (performance as any).memory;\n return memory ? memory.jsHeapSizeLimit : 0;\n}\n\n// Based on https://stackoverflow.com/a/4819886/211029 UPDATE 2018, which\n// is based on Modernizr\nfunction getSupportsTouchInput(): boolean {\n try {\n if (navigator.maxTouchPoints > 0 || 'ontouchstart' in window) {\n return true;\n }\n\n const query =\n '(-webkit-touch-enabled),(-moz-touch-enabled),(-o-touch-enabled),(-ms-touch-enabled)';\n // Not supported until IE10. Raises an error.\n return window.matchMedia(query).matches;\n } catch {\n return false;\n }\n}\n\nfunction getAccountId(): number {\n if (typeof window.survey_height_follow !== 'undefined') {\n return window.survey_height_follow;\n }\n if (typeof window.maxmind_user_id !== 'undefined') {\n return window.maxmind_user_id;\n }\n return mmapiws.accountId;\n}\n", "export interface StoredIds {\n cookie?: string;\n indexedDb?: string;\n localStorage?: string;\n}\n\nexport async function getStoredIds(): Promise {\n const ids: StoredIds = {};\n\n // This is the Mozilla-recommended method for getting a cookie :-(\n //eslint-disable-next-line @microsoft/sdl/no-cookies\n ids.cookie = document.cookie.replace(\n /(?:(?:^|.*;\\s*)__mmapiwsid\\s*=\\s*([^;]*).*$)|^.*$/,\n '$1',\n );\n if (window.localStorage) {\n ids.localStorage = localStorage.getItem('__mmapiwsid');\n }\n if (window.indexedDB) {\n ids.indexedDb = await getIndexedDbId();\n }\n return ids;\n}\n\nexport async function setStoredIds(\n domain: string,\n value: string,\n): Promise {\n const key = '__mmapiwsid';\n const date = new Date();\n date.setFullYear(date.getFullYear() + 2);\n\n if (!domain) {\n domain = document.domain;\n }\n try {\n //eslint-disable-next-line @microsoft/sdl/no-cookies\n document.cookie =\n key +\n '=' +\n value +\n '; Secure; expires=' +\n date.toUTCString() +\n '; domain=' +\n domain +\n '; path=/' +\n '; SameSite=None';\n } catch {\n // ignore cookie setting errors, which should not occur in real browsers\n // see: https://linear.app/maxmind/issue/UHUA-17649\n }\n if (window.localStorage) {\n // This throws an exception in private mode on Safari. See http://tinyurl.com/kcqewzw\n try {\n localStorage.setItem(key, value);\n } catch {}\n }\n\n await setStoredIdForDb(value);\n}\n\nconst storeName = 'StoredId';\n\nasync function setStoredIdForDb(value: string): Promise {\n const db = await getIndexedDb();\n\n if (!db) {\n return;\n }\n\n const tx = db.transaction(storeName, 'readwrite');\n const store = tx.objectStore(storeName);\n\n try {\n store.put({\n id: 0,\n value: value,\n });\n } catch {}\n}\n\nfunction openDb(): IDBOpenDBRequest {\n if (!window.indexedDB) {\n return null;\n }\n try {\n return indexedDB.open('__mmapiwsDb', 1);\n } catch {\n return null;\n }\n}\n\nasync function getIndexedDb(): Promise {\n const req = openDb();\n\n return new Promise((resolve) => {\n req.onsuccess = (e) => {\n resolve((e.currentTarget as IDBOpenDBRequest).result);\n };\n\n req.onerror = () => {\n resolve(null);\n };\n\n req.onupgradeneeded = (evt) => {\n (evt.currentTarget as IDBRequest).result.createObjectStore(storeName, {\n keyPath: 'id',\n });\n };\n });\n}\n\nasync function getIndexedDbId(): Promise {\n const db = await getIndexedDb();\n if (!db) {\n return null;\n }\n\n return new Promise((resolve) => {\n const tx = db.transaction(storeName, 'readonly');\n const store = tx.objectStore(storeName);\n const req = store.get(0);\n req.onsuccess = function (evt: Event) {\n const record = (evt.target as IDBRequest).result;\n if (record) {\n resolve(record.value);\n }\n resolve(null);\n };\n\n req.onerror = () => resolve(null);\n });\n}\n", "/* LICENSING\n *\n * A copy of the attribution of all licensed code used in device.js must be\n * kept directly before the related function or code. If the minification\n * process is stripping the attribution comment from minified version of\n * device.js, you can alternately place a copy right after this comment.\n *\n * For a comment directly before a function, use the `function` keyword, and\n * not a function expression - otherwise `uglifyjs` will discard the comment.\n * i.e:\n *\n * // this comment won't be in minified js\n * var myfunc = function(a,b) { return a + b };\n *\n * // properly attributed function in minified js\n * function myfunc(a,b) { return a + b }\n *\n * For a license comment to be included in the minified and deployed device.js,\n * it must include one of the following strings, with \":\" characters removed.\n * Or, the comment can begin with a \"!\" character.\n *\n * @:preserve\n * @:license\n * @:cc_on\n */\n// We do not \"use strict\" as it can result in failures when properties get set\n// to readonly, e.g., in Safari's private browsing mode. In most cases, we do\n// not want these failures to set an event handler, etc., to stop the\n// execution of the script.\nimport { Device, getDevice } from './device';\nimport { getStoredIds, setStoredIds } from './storedids';\nimport { mmapiws, timer } from './utils';\n\nasync function runDevice(): Promise {\n const device = await getDevice();\n await sendToServer(device, 6);\n}\n\nasync function ready(): Promise {\n if (typeof document.body !== 'undefined' && document.body) {\n await runDevice();\n } else {\n await timer(500);\n await ready();\n }\n}\n\nasync function handleResponse(\n body: string,\n version: number,\n device: Device,\n): Promise {\n const responseValues = body.split(/;/);\n const domain = responseValues[0];\n const id = responseValues[1];\n const serverIpVersion = parseInt(responseValues[2], 10);\n\n if (typeof id !== 'undefined') {\n await setStoredIds(domain, id);\n }\n\n if (version === 6 && serverIpVersion === 6 && !mmapiws.apiHost) {\n await sendToServer(device, 4);\n }\n}\n\nfunction getRequestDuration(): number {\n if (!window.performance) {\n return null;\n }\n\n const resources = performance.getEntriesByType('resource');\n if (resources === undefined) {\n return null;\n }\n\n const uri = createUrl(6); // The first request.\n\n for (let i = 0; i < resources.length; i++) {\n if (resources[i].name !== uri.toString()) {\n continue;\n }\n\n // We could consider using a different phase for the start time instead\n // of startTime, such as domainLookupStart. Although this is probably\n // sufficient. We use responseEnd because we're looking for the round\n // trip time.\n return (\n (resources[i] as PerformanceResourceTiming).responseEnd -\n resources[i].startTime\n );\n }\n\n return null;\n}\n\nasync function sendToServer(device: Device, version: number): Promise {\n const url = createUrl(version);\n\n // We set this here so that it is updated for subsequent requests\n device.storedIds = await getStoredIds();\n\n // Pass along how long the first request took. We think this could be\n // useful for proxy detection. Currently this only works in the cases where\n // we already make 2 requests. If it proves useful, we may want to always\n // send 2+ requests, although that will make device take more time and\n // resources.\n if (version === 4) {\n const requestDuration = getRequestDuration();\n if (requestDuration !== null) {\n device.requestDuration = requestDuration;\n }\n }\n\n const response = await fetch(url, {\n method: 'POST',\n body: jsonStringify(device),\n });\n\n if (response.status === 200) {\n await handleResponse(await response.text(), version, device);\n }\n}\n\n// We can use JSON.stringify, but we have to protect against toJSON\n// methods on Object and Array (e.g., from certain versions of the\n// Prototype framework).\nfunction jsonStringify(obj: object): string {\n const hasArrayToJSON = 'toJSON' in Array.prototype;\n const hasObjectToJSON = 'toJSON' in Object.prototype;\n const arrayToJSON = (Array.prototype as any).toJSON;\n const objectToJSON = (Object.prototype as any).toJSON;\n try {\n delete (Array.prototype as any).toJSON;\n delete (Object.prototype as any).toJSON;\n return JSON.stringify(obj);\n } finally {\n /* eslint no-extend-native: 0 */\n // Only restore if they were set initially.\n if (hasArrayToJSON) {\n (Array.prototype as any).toJSON = arrayToJSON;\n }\n if (hasObjectToJSON) {\n (Object.prototype as any).toJSON = objectToJSON;\n }\n }\n}\n\nfunction createUrl(version: number): URL {\n const host = mmapiws.apiHost ?? 'd-ipv' + version + '.mmapiws.com';\n\n return new URL('/ant_squire', 'https://' + host);\n}\n\nready().catch((e) => console.error(e));\n"],
"mappings": "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",
"names": ["mmapiws", "murmurhash3", "key", "seed", "remainder", "bytes", "h1", "h1b", "c1", "c2", "i", "k1", "timer", "ms", "resolve", "inThirdPartyIframe", "getCanvas2dHash", "canvas", "ctx", "e", "murmurhash3", "getCodecs", "videoTypes", "typeSupport", "mediaTypes", "supportedMediaTypes", "i", "mimeType", "getSystemColors", "colors", "canvas", "ctx", "e", "elements", "i", "styles", "getDOMRect", "__async", "iframe", "resolve", "reject", "_a", "iframeDocument", "style", "index", "rect", "getRect", "id", "rects", "_", "rectHash", "murmurhash3", "fontsToTry", "getFonts", "fonts", "getCanvasFonts", "getCssFonts", "canvas", "ctx", "e", "baseFonts", "baseFontMetrics", "fontSize", "testText", "k", "i", "font", "hasFont", "j", "fontMetric", "fontDetector", "Detector", "baseFontSizes", "testString", "testSize", "body", "span", "style", "calculateFontSize", "name", "baseFontSize", "funcs", "constants", "getMath", "_a", "_b", "calcs", "f", "fCalcs", "v", "stringify", "pluginsToTry", "getPlugins", "plugins", "seen", "i", "plugin", "getPluginProperties", "name", "p", "j", "mime", "getNavigatorProperties", "__async", "_a", "_b", "_c", "nav", "objectProperties", "navigatorAny", "connection", "e", "g", "inThirdPartyIframe", "d", "getScreenProperties", "properties", "order", "property", "obj", "isArray", "a", "getSpeechSynthesis", "__async", "getVoices", "v", "objectProperties", "voices", "r", "timer", "getWebgl", "gl", "canvas", "props", "e", "mmapiws", "getWebglHash", "vShaderTemplate", "fShaderTemplate", "vertexPosBuffer", "vertices", "vertexPosBufferItemSize", "vertexPosBufferNumItems", "program", "vshader", "fshader", "programVertexPosAttrib", "programOffsetUniform", "murmurhash3", "getDevice", "__async", "date", "systemColors", "getSystemColors", "e", "device", "getAccountId", "getApplePay", "getCanvas2dHash", "getWebgl", "getCodecs", "getFonts", "getGPC", "getHeapSizeLimit", "getMath", "getNavigatorProperties", "getPlugins", "getScreenProperties", "getSpeechSynthesis", "getSupportsTouchInput", "getDOMRect", "batteryData", "inThirdPartyIframe", "ap", "memory", "mmapiws", "getStoredIds", "__async", "ids", "getIndexedDbId", "setStoredIds", "domain", "value", "key", "date", "e", "setStoredIdForDb", "storeName", "db", "getIndexedDb", "store", "openDb", "req", "resolve", "evt", "record", "runDevice", "__async", "device", "getDevice", "sendToServer", "ready", "timer", "handleResponse", "body", "version", "responseValues", "domain", "id", "serverIpVersion", "setStoredIds", "mmapiws", "getRequestDuration", "resources", "uri", "createUrl", "i", "url", "getStoredIds", "requestDuration", "response", "jsonStringify", "obj", "hasArrayToJSON", "hasObjectToJSON", "arrayToJSON", "objectToJSON", "_a", "host"]
}