// https://github.com/ornicar/fingerprintjs2/commit/9f580f7c79e6246928d54718f598d27adb821054 window.fipr = (function () { 'use strict'; var l = function (e, t) { (e = [e[0] >>> 16, 65535 & e[0], e[1] >>> 16, 65535 & e[1]]), (t = [t[0] >>> 16, 65535 & t[0], t[1] >>> 16, 65535 & t[1]]); var n = [0, 0, 0, 0]; return ( (n[3] += e[3] + t[3]), (n[2] += n[3] >>> 16), (n[3] &= 65535), (n[2] += e[2] + t[2]), (n[1] += n[2] >>> 16), (n[2] &= 65535), (n[1] += e[1] + t[1]), (n[0] += n[1] >>> 16), (n[1] &= 65535), (n[0] += e[0] + t[0]), (n[0] &= 65535), [(n[0] << 16) | n[1], (n[2] << 16) | n[3]] ); }, f = function (e, t) { (e = [e[0] >>> 16, 65535 & e[0], e[1] >>> 16, 65535 & e[1]]), (t = [t[0] >>> 16, 65535 & t[0], t[1] >>> 16, 65535 & t[1]]); var n = [0, 0, 0, 0]; return ( (n[3] += e[3] * t[3]), (n[2] += n[3] >>> 16), (n[3] &= 65535), (n[2] += e[2] * t[3]), (n[1] += n[2] >>> 16), (n[2] &= 65535), (n[2] += e[3] * t[2]), (n[1] += n[2] >>> 16), (n[2] &= 65535), (n[1] += e[1] * t[3]), (n[0] += n[1] >>> 16), (n[1] &= 65535), (n[1] += e[2] * t[2]), (n[0] += n[1] >>> 16), (n[1] &= 65535), (n[1] += e[3] * t[1]), (n[0] += n[1] >>> 16), (n[1] &= 65535), (n[0] += e[0] * t[3] + e[1] * t[2] + e[2] * t[1] + e[3] * t[0]), (n[0] &= 65535), [(n[0] << 16) | n[1], (n[2] << 16) | n[3]] ); }, g = function (e, t) { return 32 === (t %= 64) ? [e[1], e[0]] : t < 32 ? [(e[0] << t) | (e[1] >>> (32 - t)), (e[1] << t) | (e[0] >>> (32 - t))] : ((t -= 32), [(e[1] << t) | (e[0] >>> (32 - t)), (e[0] << t) | (e[1] >>> (32 - t))]); }, h = function (e, t) { return 0 === (t %= 64) ? e : t < 32 ? [(e[0] << t) | (e[1] >>> (32 - t)), e[1] << t] : [e[1] << (t - 32), 0]; }, m = function (e, t) { return [e[0] ^ t[0], e[1] ^ t[1]]; }, p = function (e) { return ( (e = m(e, [0, e[0] >>> 1])), (e = f(e, [4283543511, 3981806797])), (e = m(e, [0, e[0] >>> 1])), (e = f(e, [3301882366, 444984403])), (e = m(e, [0, e[0] >>> 1])) ); }, c = { audio: { timeout: 1e3, excludeIOS11: !0 }, screen: { detectScreenOrientation: !0 }, plugins: { sortPluginsFor: [/palemoon/i], excludeIE: !1 }, excludes: { pixelRatio: !1 }, NOT_AVAILABLE: 'not available', ERROR: 'error', EXCLUDED: 'excluded', }, d = function (e, t) { if (Array.prototype.forEach && e.forEach === Array.prototype.forEach) e.forEach(t); else if (e.length === +e.length) for (var n = 0, r = e.length; n < r; n++) t(e[n], n, e); else for (var a in e) e.hasOwnProperty(a) && t(e[a], a, e); }, a = function (e, r) { var a = []; return null == e ? a : Array.prototype.map && e.map === Array.prototype.map ? e.map(r) : (d(e, function (e, t, n) { a.push(r(e, t, n)); }), a); }, n = function (e) { var t = [window.screen.width, window.screen.height]; return e.screen.detectScreenOrientation && t.sort().reverse(), t; }, r = function (e) { if (window.screen.availWidth && window.screen.availHeight) { var t = [window.screen.availHeight, window.screen.availWidth]; return e.screen.detectScreenOrientation && t.sort().reverse(), t; } return e.NOT_AVAILABLE; }, i = function (e) { if (null == navigator.plugins) return e.NOT_AVAILABLE; for (var t = [], n = 0, r = navigator.plugins.length; n < r; n++) navigator.plugins[n] && t.push(navigator.plugins[n]); return ( u(e) && (t = t.sort(function (e, t) { return e.name > t.name ? 1 : e.name < t.name ? -1 : 0; })), a(t, function (e) { var t = a(e, function (e) { return [e.type, e.suffixes]; }); return [e.name, e.description, t]; }) ); }, o = function (n) { var e = []; return ( (Object.getOwnPropertyDescriptor && Object.getOwnPropertyDescriptor(window, 'ActiveXObject')) || 'ActiveXObject' in window ? (e = a( [ 'AcroPDF.PDF', 'Adodb.Stream', 'AgControl.AgControl', 'DevalVRXCtrl.DevalVRXCtrl.1', 'MacromediaFlashPaper.MacromediaFlashPaper', 'Msxml2.DOMDocument', 'Msxml2.XMLHTTP', 'PDF.PdfCtrl', 'QuickTime.QuickTime', 'QuickTimeCheckObject.QuickTimeCheck.1', 'RealPlayer', 'RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)', 'RealVideo.RealVideo(tm) ActiveX Control (32-bit)', 'Scripting.Dictionary', 'SWCtl.SWCtl', 'Shell.UIHelper', 'ShockwaveFlash.ShockwaveFlash', 'Skype.Detection', 'TDCCtl.TDCCtl', 'WMPlayer.OCX', 'rmocx.RealPlayer G2 Control', 'rmocx.RealPlayer G2 Control.1', ], function (e) { try { return new window.ActiveXObject(e), e; } catch (t) { return n.ERROR; } } )) : e.push(n.NOT_AVAILABLE), navigator.plugins && (e = e.concat(i(n))), e ); }, u = function (e) { for (var t = !1, n = 0, r = e.plugins.sortPluginsFor.length; n < r; n++) { var a = e.plugins.sortPluginsFor[n]; if (navigator.userAgent.match(a)) { t = !0; break; } } return t; }, s = function (e) { try { return !!window.sessionStorage; } catch (t) { return e.ERROR; } }, A = function (e) { try { return !!window.localStorage; } catch (t) { return e.ERROR; } }, v = function (e) { try { return !!window.indexedDB; } catch (t) { return e.ERROR; } }, x = function (e) { return navigator.hardwareConcurrency ? navigator.hardwareConcurrency : e.NOT_AVAILABLE; }, w = function (e) { return navigator.cpuClass || e.NOT_AVAILABLE; }, E = function (e) { return navigator.platform ? navigator.platform : e.NOT_AVAILABLE; }, t = function () { var e, t = 0; 'undefined' != typeof navigator.maxTouchPoints ? (t = navigator.maxTouchPoints) : 'undefined' != typeof navigator.msMaxTouchPoints && (t = navigator.msMaxTouchPoints); try { document.createEvent('TouchEvent'), (e = !0); } catch (n) { e = !1; } return [t, e, 'ontouchstart' in window]; }, O = function (e) { var t = [], n = document.createElement('canvas'); (n.width = 2e3), (n.height = 200), (n.style.display = 'inline'); var r = n.getContext('2d'); return ( r.rect(0, 0, 10, 10), r.rect(2, 2, 6, 6), t.push('canvas winding:' + (!1 === r.isPointInPath(5, 5, 'evenodd') ? 'yes' : 'no')), (r.textBaseline = 'alphabetic'), (r.fillStyle = '#f60'), r.fillRect(125, 1, 62, 20), (r.fillStyle = '#069'), e.dontUseFakeFontInCanvas ? (r.font = '11pt Arial') : (r.font = '11pt no-real-font-123'), r.fillText('Cwm fjordbank glyphs vext quiz, \ud83d\ude03', 2, 15), (r.fillStyle = 'rgba(102, 204, 0, 0.2)'), (r.font = '18pt Arial'), r.fillText('Cwm fjordbank glyphs vext quiz, \ud83d\ude03', 4, 45), (r.globalCompositeOperation = 'multiply'), (r.fillStyle = 'rgb(255,0,255)'), r.beginPath(), r.arc(50, 50, 50, 0, 2 * Math.PI, !0), r.closePath(), r.fill(), (r.fillStyle = 'rgb(0,255,255)'), r.beginPath(), r.arc(100, 50, 50, 0, 2 * Math.PI, !0), r.closePath(), r.fill(), (r.fillStyle = 'rgb(255,255,0)'), r.beginPath(), r.arc(75, 100, 50, 0, 2 * Math.PI, !0), r.closePath(), r.fill(), (r.fillStyle = 'rgb(255,0,255)'), r.arc(75, 75, 75, 0, 2 * Math.PI, !0), r.arc(75, 75, 25, 0, 2 * Math.PI, !0), r.fill('evenodd'), n.toDataURL && t.push('canvas fp:' + n.toDataURL()), t ); }, y = function () { var e = function (e) { return ( o.clearColor(0, 0, 0, 1), o.enable(o.DEPTH_TEST), o.depthFunc(o.LEQUAL), o.clear(o.COLOR_BUFFER_BIT | o.DEPTH_BUFFER_BIT), '[' + e[0] + ', ' + e[1] + ']' ); }, o = I(); if (!o) return null; var c = [], t = o.createBuffer(); o.bindBuffer(o.ARRAY_BUFFER, t); var n = new Float32Array([-0.2, -0.9, 0, 0.4, -0.26, 0, 0, 0.732134444, 0]); o.bufferData(o.ARRAY_BUFFER, n, o.STATIC_DRAW), (t.itemSize = 3), (t.numItems = 3); var r = o.createProgram(), a = o.createShader(o.VERTEX_SHADER); o.shaderSource( a, 'attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate=attrVertex+uniformOffset;gl_Position=vec4(attrVertex,0,1);}' ), o.compileShader(a); var i = o.createShader(o.FRAGMENT_SHADER); o.shaderSource( i, 'precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor=vec4(varyinTexCoordinate,0,1);}' ), o.compileShader(i), o.attachShader(r, a), o.attachShader(r, i), o.linkProgram(r), o.useProgram(r), (r.vertexPosAttrib = o.getAttribLocation(r, 'attrVertex')), (r.offsetUniform = o.getUniformLocation(r, 'uniformOffset')), o.enableVertexAttribArray(r.vertexPosArray), o.vertexAttribPointer(r.vertexPosAttrib, t.itemSize, o.FLOAT, !1, 0, 0), o.uniform2f(r.offsetUniform, 1, 1), o.drawArrays(o.TRIANGLE_STRIP, 0, t.numItems); try { c.push(o.canvas.toDataURL()); } catch (s) {} c.push('extensions:' + (o.getSupportedExtensions() || []).join(';')), c.push('webgl aliased line width range:' + e(o.getParameter(o.ALIASED_LINE_WIDTH_RANGE))), c.push('webgl aliased point size range:' + e(o.getParameter(o.ALIASED_POINT_SIZE_RANGE))), c.push('webgl alpha bits:' + o.getParameter(o.ALPHA_BITS)), c.push('webgl antialiasing:' + (o.getContextAttributes().antialias ? 'yes' : 'no')), c.push('webgl blue bits:' + o.getParameter(o.BLUE_BITS)), c.push('webgl depth bits:' + o.getParameter(o.DEPTH_BITS)), c.push('webgl green bits:' + o.getParameter(o.GREEN_BITS)), c.push( 'webgl max anisotropy:' + (function (e) { var t = e.getExtension('EXT_texture_filter_anisotropic') || e.getExtension('WEBKIT_EXT_texture_filter_anisotropic') || e.getExtension('MOZ_EXT_texture_filter_anisotropic'); if (t) { var n = e.getParameter(t.MAX_TEXTURE_MAX_ANISOTROPY_EXT); return 0 === n && (n = 2), n; } return null; })(o) ), c.push('webgl max combined texture image units:' + o.getParameter(o.MAX_COMBINED_TEXTURE_IMAGE_UNITS)), c.push('webgl max cube map texture size:' + o.getParameter(o.MAX_CUBE_MAP_TEXTURE_SIZE)), c.push('webgl max fragment uniform vectors:' + o.getParameter(o.MAX_FRAGMENT_UNIFORM_VECTORS)), c.push('webgl max render buffer size:' + o.getParameter(o.MAX_RENDERBUFFER_SIZE)), c.push('webgl max texture image units:' + o.getParameter(o.MAX_TEXTURE_IMAGE_UNITS)), c.push('webgl max texture size:' + o.getParameter(o.MAX_TEXTURE_SIZE)), c.push('webgl max varying vectors:' + o.getParameter(o.MAX_VARYING_VECTORS)), c.push('webgl max vertex attribs:' + o.getParameter(o.MAX_VERTEX_ATTRIBS)), c.push('webgl max vertex texture image units:' + o.getParameter(o.MAX_VERTEX_TEXTURE_IMAGE_UNITS)), c.push('webgl max vertex uniform vectors:' + o.getParameter(o.MAX_VERTEX_UNIFORM_VECTORS)), c.push('webgl max viewport dims:' + e(o.getParameter(o.MAX_VIEWPORT_DIMS))), c.push('webgl red bits:' + o.getParameter(o.RED_BITS)), c.push('webgl renderer:' + o.getParameter(o.RENDERER)), c.push('webgl shading language version:' + o.getParameter(o.SHADING_LANGUAGE_VERSION)), c.push('webgl stencil bits:' + o.getParameter(o.STENCIL_BITS)), c.push('webgl vendor:' + o.getParameter(o.VENDOR)), c.push('webgl version:' + o.getParameter(o.VERSION)); try { var u = o.getExtension('WEBGL_debug_renderer_info'); u && (c.push('webgl unmasked vendor:' + o.getParameter(u.UNMASKED_VENDOR_WEBGL)), c.push('webgl unmasked renderer:' + o.getParameter(u.UNMASKED_RENDERER_WEBGL))); } catch (s) {} return ( o.getShaderPrecisionFormat && d(['FLOAT', 'INT'], function (i) { d(['VERTEX', 'FRAGMENT'], function (a) { d(['HIGH', 'MEDIUM', 'LOW'], function (r) { d(['precision', 'rangeMin', 'rangeMax'], function (e) { var t = o.getShaderPrecisionFormat(o[a + '_SHADER'], o[r + '_' + i])[e]; 'precision' !== e && (e = 'precision ' + e); var n = [ 'webgl ', a.toLowerCase(), ' shader ', r.toLowerCase(), ' ', i.toLowerCase(), ' ', e, ':', t, ].join(''); c.push(n); }); }); }); }), M(o), c ); }, S = function () { try { var e = I(), t = e.getExtension('WEBGL_debug_renderer_info'), n = e.getParameter(t.UNMASKED_VENDOR_WEBGL) + '~' + e.getParameter(t.UNMASKED_RENDERER_WEBGL); return M(e), n; } catch (r) { return null; } }, C = function () { var e = document.createElement('div'); e.innerHTML = ' '; var t = !(e.className = 'adsbox'); try { document.body.appendChild(e), (t = 0 === document.getElementsByClassName('adsbox')[0].offsetHeight), document.body.removeChild(e); } catch (n) { t = !1; } return t; }, T = function () { if ('undefined' != typeof navigator.languages) try { if (navigator.languages[0].substr(0, 2) !== navigator.language.substr(0, 2)) return !0; } catch (e) { return !0; } return !1; }, b = function () { return window.screen.width < window.screen.availWidth || window.screen.height < window.screen.availHeight; }, _ = function () { var e = navigator.userAgent.toLowerCase(), t = navigator.oscpu, n = navigator.platform.toLowerCase(), r = 0 <= e.indexOf('windows phone') ? 'Windows Phone' : 0 <= e.indexOf('windows') || 0 <= e.indexOf('win16') || 0 <= e.indexOf('win32') || 0 <= e.indexOf('win64') || 0 <= e.indexOf('win95') || 0 <= e.indexOf('win98') || 0 <= e.indexOf('winnt') || 0 <= e.indexOf('wow64') ? 'Windows' : 0 <= e.indexOf('android') ? 'Android' : 0 <= e.indexOf('linux') || 0 <= e.indexOf('cros') || 0 <= e.indexOf('x11') ? 'Linux' : 0 <= e.indexOf('iphone') || 0 <= e.indexOf('ipad') || 0 <= e.indexOf('ipod') || 0 <= e.indexOf('crios') || 0 <= e.indexOf('fxios') ? 'iOS' : 0 <= e.indexOf('macintosh') || 0 <= e.indexOf('mac_powerpc)') ? 'Mac' : 'Other'; if ( ('ontouchstart' in window || 0 < navigator.maxTouchPoints || 0 < navigator.msMaxTouchPoints) && 'Windows' !== r && 'Windows Phone' !== r && 'Android' !== r && 'iOS' !== r && 'Other' !== r && -1 === e.indexOf('cros') ) return !0; if (void 0 !== t) { if (0 <= (t = t.toLowerCase()).indexOf('win') && 'Windows' !== r && 'Windows Phone' !== r) return !0; if (0 <= t.indexOf('linux') && 'Linux' !== r && 'Android' !== r) return !0; if (0 <= t.indexOf('mac') && 'Mac' !== r && 'iOS' !== r) return !0; if ((-1 === t.indexOf('win') && -1 === t.indexOf('linux') && -1 === t.indexOf('mac')) != ('Other' === r)) return !0; } return ( (0 <= n.indexOf('win') && 'Windows' !== r && 'Windows Phone' !== r) || ((0 <= n.indexOf('linux') || 0 <= n.indexOf('android') || 0 <= n.indexOf('pike')) && 'Linux' !== r && 'Android' !== r) || ((0 <= n.indexOf('mac') || 0 <= n.indexOf('ipad') || 0 <= n.indexOf('ipod') || 0 <= n.indexOf('iphone')) && 'Mac' !== r && 'iOS' !== r) || (!(0 <= n.indexOf('arm') && 'Windows Phone' === r) && !(0 <= n.indexOf('pike') && 0 <= e.indexOf('opera mini')) && ((n.indexOf('win') < 0 && n.indexOf('linux') < 0 && n.indexOf('mac') < 0 && n.indexOf('iphone') < 0 && n.indexOf('ipad') < 0 && n.indexOf('ipod') < 0) != ('Other' === r) || ('undefined' == typeof navigator.plugins && 'Windows' !== r && 'Windows Phone' !== r))) ); }, P = function () { var e, t = navigator.userAgent.toLowerCase(), n = navigator.productSub; if (0 <= t.indexOf('edge/') || 0 <= t.indexOf('iemobile/')) return !1; if (0 <= t.indexOf('opera mini')) return !1; if ( ('Chrome' === (e = 0 <= t.indexOf('firefox/') ? 'Firefox' : 0 <= t.indexOf('opera/') || 0 <= t.indexOf(' opr/') ? 'Opera' : 0 <= t.indexOf('chrome/') ? 'Chrome' : 0 <= t.indexOf('safari/') ? 0 <= t.indexOf('android 1.') || 0 <= t.indexOf('android 2.') || 0 <= t.indexOf('android 3.') || 0 <= t.indexOf('android 4.') ? 'AOSP' : 'Safari' : 0 <= t.indexOf('trident/') ? 'Internet Explorer' : 'Other') || 'Safari' === e || 'Opera' === e) && '20030107' !== n ) return !0; var r, a = eval.toString().length; if (37 === a && 'Safari' !== e && 'Firefox' !== e && 'Other' !== e) return !0; if (39 === a && 'Internet Explorer' !== e && 'Other' !== e) return !0; if (33 === a && 'Chrome' !== e && 'AOSP' !== e && 'Opera' !== e && 'Other' !== e) return !0; try { throw 'a'; } catch (i) { try { i.toSource(), (r = !0); } catch (o) { r = !1; } } return r && 'Firefox' !== e && 'Other' !== e; }, R = function () { var e = document.createElement('canvas'); return !(!e.getContext || !e.getContext('2d')); }, D = function () { if (!R()) return !1; var e = I(), t = !!window.WebGLRenderingContext && !!e; return M(e), t; }, L = function () { return ( 'Microsoft Internet Explorer' === navigator.appName || !('Netscape' !== navigator.appName || !/Trident/.test(navigator.userAgent)) ); }, I = function () { var e = document.createElement('canvas'), t = null; try { t = e.getContext('webgl') || e.getContext('experimental-webgl'); } catch (n) {} return (t = t || null); }, M = function (e) { var t = e.getExtension('WEBGL_lose_context'); null != t && t.loseContext(); }, k = [ { key: 'userAgent', getData: function (e) { e(navigator.userAgent); }, }, { key: 'webdriver', getData: function (e, t) { e(null == navigator.webdriver ? t.NOT_AVAILABLE : navigator.webdriver); }, }, { key: 'language', getData: function (e, t) { e( navigator.language || navigator.userLanguage || navigator.browserLanguage || navigator.systemLanguage || t.NOT_AVAILABLE ); }, }, { key: 'colorDepth', getData: function (e, t) { e(window.screen.colorDepth || t.NOT_AVAILABLE); }, }, { key: 'deviceMemory', getData: function (e, t) { e(navigator.deviceMemory || t.NOT_AVAILABLE); }, }, { key: 'pixelRatio', getData: function (e, t) { e(window.devicePixelRatio || t.NOT_AVAILABLE); }, }, { key: 'hardwareConcurrency', getData: function (e, t) { e(x(t)); }, }, { key: 'screenResolution', getData: function (e, t) { e(n(t)); }, }, { key: 'availableScreenResolution', getData: function (e, t) { e(r(t)); }, }, { key: 'timezoneOffset', getData: function (e) { e(new Date().getTimezoneOffset()); }, }, { key: 'timezone', getData: function (e, t) { window.Intl && window.Intl.DateTimeFormat ? e(new window.Intl.DateTimeFormat().resolvedOptions().timeZone) : e(t.NOT_AVAILABLE); }, }, { key: 'sessionStorage', getData: function (e, t) { e(s(t)); }, }, { key: 'localStorage', getData: function (e, t) { e(A(t)); }, }, { key: 'indexedDb', getData: function (e, t) { e(v(t)); }, }, { key: 'addBehavior', getData: function (e) { e(!(!document.body || !document.body.addBehavior)); }, }, { key: 'openDatabase', getData: function (e) { e(!!window.openDatabase); }, }, { key: 'cpuClass', getData: function (e, t) { e(w(t)); }, }, { key: 'platform', getData: function (e, t) { e(E(t)); }, }, { key: 'plugins', getData: function (e, t) { L() ? (t.plugins.excludeIE ? e(t.EXCLUDED) : e(o(t))) : e(i(t)); }, }, { key: 'canvas', getData: function (e, t) { R() ? e(O(t)) : e(t.NOT_AVAILABLE); }, }, { key: 'webgl', getData: function (e, t) { D() ? e(y()) : e(t.NOT_AVAILABLE); }, }, { key: 'webglVendorAndRenderer', getData: function (e) { D() ? e(S()) : e(); }, }, { key: 'adBlock', getData: function (e) { e(C()); }, }, { key: 'hasLiedLanguages', getData: function (e) { e(T()); }, }, { key: 'hasLiedResolution', getData: function (e) { e(b()); }, }, { key: 'hasLiedOs', getData: function (e) { e(_()); }, }, { key: 'hasLiedBrowser', getData: function (e) { e(P()); }, }, { key: 'touchSupport', getData: function (e) { e(t()); }, }, { key: 'fonts', getData: function (e, t) { var d = ['monospace', 'sans-serif', 'serif'], l = (l = [ 'Andale Mono', 'Arial', 'Arial Black', 'Arial Hebrew', 'Arial MT', 'Arial Narrow', 'Arial Rounded MT Bold', 'Arial Unicode MS', 'Bitstream Vera Sans Mono', 'Book Antiqua', 'Bookman Old Style', 'Calibri', 'Cambria', 'Cambria Math', 'Century', 'Century Gothic', 'Century Schoolbook', 'Comic Sans', 'Comic Sans MS', 'Consolas', 'Courier', 'Courier New', 'Geneva', 'Georgia', 'Helvetica', 'Helvetica Neue', 'Impact', 'Lucida Bright', 'Lucida Calligraphy', 'Lucida Console', 'Lucida Fax', 'LUCIDA GRANDE', 'Lucida Handwriting', 'Lucida Sans', 'Lucida Sans Typewriter', 'Lucida Sans Unicode', 'Microsoft Sans Serif', 'Monaco', 'Monotype Corsiva', 'MS Gothic', 'MS Outlook', 'MS PGothic', 'MS Reference Sans Serif', 'MS Sans Serif', 'MS Serif', 'MYRIAD', 'MYRIAD PRO', 'Palatino', 'Palatino Linotype', 'Segoe Print', 'Segoe Script', 'Segoe UI', 'Segoe UI Light', 'Segoe UI Semibold', 'Segoe UI Symbol', 'Tahoma', 'Times', 'Times New Roman', 'Times New Roman PS', 'Trebuchet MS', 'Verdana', 'Wingdings', 'Wingdings 2', 'Wingdings 3', ]).filter(function (e, t) { return l.indexOf(e) === t; }), n = document.getElementsByTagName('body')[0], a = document.createElement('div'), f = document.createElement('div'), r = {}, i = {}, g = function () { var e = document.createElement('span'); return ( (e.style.position = 'absolute'), (e.style.left = '-9999px'), (e.style.fontSize = '72px'), (e.style.fontStyle = 'normal'), (e.style.fontWeight = 'normal'), (e.style.letterSpacing = 'normal'), (e.style.lineBreak = 'auto'), (e.style.lineHeight = 'normal'), (e.style.textTransform = 'none'), (e.style.textAlign = 'left'), (e.style.textDecoration = 'none'), (e.style.textShadow = 'none'), (e.style.whiteSpace = 'normal'), (e.style.wordBreak = 'normal'), (e.style.wordSpacing = 'normal'), (e.innerHTML = 'mmmmmmmmmmlli'), e ); }, o = function (e) { for (var t = !1, n = 0; n < d.length; n++) if ((t = e[n].offsetWidth !== r[d[n]] || e[n].offsetHeight !== i[d[n]])) return t; return t; }, c = (function () { for (var e = [], t = 0, n = d.length; t < n; t++) { var r = g(); (r.style.fontFamily = d[t]), a.appendChild(r), e.push(r); } return e; })(); n.appendChild(a); for (var u = 0, s = d.length; u < s; u++) (r[d[u]] = c[u].offsetWidth), (i[d[u]] = c[u].offsetHeight); var h = (function () { for (var e, t, n, r = {}, a = 0, i = l.length; a < i; a++) { for (var o = [], c = 0, u = d.length; c < u; c++) { var s = ((e = l[a]), (t = d[c]), (n = void 0), ((n = g()).style.fontFamily = "'" + e + "'," + t), n); f.appendChild(s), o.push(s); } r[l[a]] = o; } return r; })(); n.appendChild(f); for (var m = [], p = 0, A = l.length; p < A; p++) o(h[l[p]]) && m.push(l[p]); n.removeChild(f), n.removeChild(a), e(m); }, pauseBefore: !0, }, { key: 'audio', getData: function (r, e) { var t = e.audio; if (t.excludeIOS11 && navigator.userAgent.match(/OS 11.+Version\/11.+Safari/)) return r(e.EXCLUDED); var n = window.OfflineAudioContext || window.webkitOfflineAudioContext; if (null == n) return r(e.NOT_AVAILABLE); var a = new n(1, 44100, 44100), i = a.createOscillator(); (i.type = 'triangle'), i.frequency.setValueAtTime(1e4, a.currentTime); var o = a.createDynamicsCompressor(); d( [ ['threshold', -50], ['knee', 40], ['ratio', 12], ['reduction', -20], ['attack', 0], ['release', 0.25], ], function (e) { o[e[0]] !== undefined && 'function' == typeof o[e[0]].setValueAtTime && o[e[0]].setValueAtTime(e[1], a.currentTime); } ), i.connect(o), o.connect(a.destination), i.start(0), a.startRendering(); var c = setTimeout(function () { return ( console.warn( 'Audio fingerprint timed out. Please report bug at https://github.com/Valve/fingerprintjs2 with your user agent: "' + navigator.userAgent + '".' ), (a.oncomplete = function () {}), (a = null), r('audioTimeout') ); }, t.timeout); a.oncomplete = function (e) { var t; try { clearTimeout(c), (t = e.renderedBuffer .getChannelData(0) .slice(4500, 5e3) .reduce(function (e, t) { return e + Math.abs(t); }, 0) .toString()), i.disconnect(), o.disconnect(); } catch (n) { return void r(n); } r(t); }; }, }, ], e = { get: function (r) { var a = { data: [], addPreprocessedComponent: function (e, t) { a.data.push({ key: e, value: t }); }, }, i = -1, o = function (e) { if (k.length <= (i += 1)) r(a.data); else { var t = k[i]; if (c.excludes[t.key]) o(!1); else { if (!e && t.pauseBefore) return ( --i, void setTimeout(function () { o(!0); }, 1) ); try { t.getData(function (e) { a.addPreprocessedComponent(t.key, e), o(!1); }, c); } catch (n) { a.addPreprocessedComponent(t.key, String(n)), o(!1); } } } }; o(!1); }, x64hash128: function (e, t) { t = t || 0; for ( var n = (e = e || '').length % 16, r = e.length - n, a = [0, t], i = [0, t], o = [0, 0], c = [0, 0], u = [2277735313, 289559509], s = [1291169091, 658871167], d = 0; d < r; d += 16 ) (o = [ (255 & e.charCodeAt(d + 4)) | ((255 & e.charCodeAt(d + 5)) << 8) | ((255 & e.charCodeAt(d + 6)) << 16) | ((255 & e.charCodeAt(d + 7)) << 24), (255 & e.charCodeAt(d)) | ((255 & e.charCodeAt(d + 1)) << 8) | ((255 & e.charCodeAt(d + 2)) << 16) | ((255 & e.charCodeAt(d + 3)) << 24), ]), (c = [ (255 & e.charCodeAt(d + 12)) | ((255 & e.charCodeAt(d + 13)) << 8) | ((255 & e.charCodeAt(d + 14)) << 16) | ((255 & e.charCodeAt(d + 15)) << 24), (255 & e.charCodeAt(d + 8)) | ((255 & e.charCodeAt(d + 9)) << 8) | ((255 & e.charCodeAt(d + 10)) << 16) | ((255 & e.charCodeAt(d + 11)) << 24), ]), (o = f(o, u)), (o = g(o, 31)), (o = f(o, s)), (a = m(a, o)), (a = g(a, 27)), (a = l(a, i)), (a = l(f(a, [0, 5]), [0, 1390208809])), (c = f(c, s)), (c = g(c, 33)), (c = f(c, u)), (i = m(i, c)), (i = g(i, 31)), (i = l(i, a)), (i = l(f(i, [0, 5]), [0, 944331445])); switch (((o = [0, 0]), (c = [0, 0]), n)) { case 15: c = m(c, h([0, e.charCodeAt(d + 14)], 48)); case 14: c = m(c, h([0, e.charCodeAt(d + 13)], 40)); case 13: c = m(c, h([0, e.charCodeAt(d + 12)], 32)); case 12: c = m(c, h([0, e.charCodeAt(d + 11)], 24)); case 11: c = m(c, h([0, e.charCodeAt(d + 10)], 16)); case 10: c = m(c, h([0, e.charCodeAt(d + 9)], 8)); case 9: (c = m(c, [0, e.charCodeAt(d + 8)])), (c = f(c, s)), (c = g(c, 33)), (c = f(c, u)), (i = m(i, c)); case 8: o = m(o, h([0, e.charCodeAt(d + 7)], 56)); case 7: o = m(o, h([0, e.charCodeAt(d + 6)], 48)); case 6: o = m(o, h([0, e.charCodeAt(d + 5)], 40)); case 5: o = m(o, h([0, e.charCodeAt(d + 4)], 32)); case 4: o = m(o, h([0, e.charCodeAt(d + 3)], 24)); case 3: o = m(o, h([0, e.charCodeAt(d + 2)], 16)); case 2: o = m(o, h([0, e.charCodeAt(d + 1)], 8)); case 1: (o = m(o, [0, e.charCodeAt(d)])), (o = f(o, u)), (o = g(o, 31)), (o = f(o, s)), (a = m(a, o)); } return ( (a = m(a, [0, e.length])), (i = m(i, [0, e.length])), (a = l(a, i)), (i = l(i, a)), (a = p(a)), (i = p(i)), (a = l(a, i)), (i = l(i, a)), ('00000000' + (a[0] >>> 0).toString(16)).slice(-8) + ('00000000' + (a[1] >>> 0).toString(16)).slice(-8) + ('00000000' + (i[0] >>> 0).toString(16)).slice(-8) + ('00000000' + (i[1] >>> 0).toString(16)).slice(-8) ); }, }; return e; })(); lichess.load.then(() => setTimeout(() => { const t = performance.now(), storage = lichess.storage.make('fipr'), send = hash => { storage.set(hash); const $i = $('#signup-fp-input'); if ($i.length) $i.val(hash); else fetch('/auth/set-fp/' + hash + '/' + Math.round(performance.now() - t), { method: 'post', credentials: 'same-origin', }); }; if (storage.get()) send(storage.get()); else fipr.get(c => send(fipr.x64hash128(c.map(x => x.value).join(''), 31))); }, 1000) );