wemy-monitoring
Version:
一个前端监控
3,706 lines • 106 kB
JavaScript
var kt = Object.defineProperty;
var yt = (r, e, t) => e in r ? kt(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
var x = (r, e, t) => yt(r, typeof e != "symbol" ? e + "" : e, t);
var st = /* @__PURE__ */ ((r) => (r.version = "1.0.0", r))(st || {}), V = /* @__PURE__ */ ((r) => (r.FCP = "FCP", r.LCP = "LCP", r.INP = "INP", r.CLS = "CLS", r.NT = "navigationTiming", r.RF = "resource-flow", r.CD = "cache-data", r))(V || {}), P = /* @__PURE__ */ ((r) => (r.PI = "page-information", r.OI = "origin-information", r.RCR = "router-change-record", r.DBR = "dom-behavior-record", r.HT = "http-record", r))(P || {}), A = /* @__PURE__ */ ((r) => (r.JS = "js", r.RS = "resource", r.PM = "promise", r.HP = "http", r.CS = "cors", r))(A || {});
function Ee(r) {
return r instanceof ErrorEvent ? r.message === "Script error." ? A.CS : A.JS : A.RS;
}
const te = (r) => window.btoa(r), Tt = /^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i, Mt = 10;
function Et(r) {
const e = r.match(Tt);
if (!e) return {};
const t = e[2], i = e[1] || "", s = parseInt(e[3], 10) || void 0, l = parseInt(e[4], 10) || void 0;
return {
fileName: t,
functionName: i,
row: s,
col: l
};
}
function Ge(r) {
const { stack: e } = r;
if (!e) return [];
const t = [];
for (const i of e.split(`
`).slice(1)) {
const s = Et(i);
s && t.push(s);
}
return t.slice(0, Mt);
}
function xt(r) {
return r && r.__esModule && Object.prototype.hasOwnProperty.call(r, "default") ? r.default : r;
}
var re = { exports: {} }, Rt = re.exports, Je;
function At() {
return Je || (Je = 1, function(r, e) {
(function(t, i) {
var s = "1.0.40", l = "", h = "?", m = "function", p = "undefined", S = "object", k = "string", F = "major", n = "model", d = "name", o = "type", c = "vendor", u = "version", L = "architecture", K = "console", b = "mobile", g = "tablet", C = "smarttv", q = "wearable", be = "embedded", ge = 500, ne = "Amazon", Q = "Apple", Oe = "ASUS", Le = "BlackBerry", oe = "Browser", ae = "Chrome", bt = "Edge", ce = "Firefox", Z = "Google", Ne = "Huawei", ve = "LG", Se = "Microsoft", _e = "Motorola", Y = "Opera", $ = "Samsung", Ie = "Sharp", de = "Sony", ke = "Xiaomi", ye = "Zebra", De = "Facebook", qe = "Chromium OS", He = "Mac OS", ze = " Browser", gt = function(v, y) {
var w = {};
for (var E in v)
y[E] && y[E].length % 2 === 0 ? w[E] = y[E].concat(v[E]) : w[E] = v[E];
return w;
}, ue = function(v) {
for (var y = {}, w = 0; w < v.length; w++)
y[v[w].toUpperCase()] = v[w];
return y;
}, Ve = function(v, y) {
return typeof v === k ? G(y).indexOf(G(v)) !== -1 : !1;
}, G = function(v) {
return v.toLowerCase();
}, vt = function(v) {
return typeof v === k ? v.replace(/[^\d\.]/g, l).split(".")[0] : i;
}, Te = function(v, y) {
if (typeof v === k)
return v = v.replace(/^\s\s*/, l), typeof y === p ? v : v.substring(0, ge);
}, ee = function(v, y) {
for (var w = 0, E, H, _, T, f, I; w < y.length && !f; ) {
var Me = y[w], We = y[w + 1];
for (E = H = 0; E < Me.length && !f && Me[E]; )
if (f = Me[E++].exec(v), f)
for (_ = 0; _ < We.length; _++)
I = f[++H], T = We[_], typeof T === S && T.length > 0 ? T.length === 2 ? typeof T[1] == m ? this[T[0]] = T[1].call(this, I) : this[T[0]] = T[1] : T.length === 3 ? typeof T[1] === m && !(T[1].exec && T[1].test) ? this[T[0]] = I ? T[1].call(this, I, T[2]) : i : this[T[0]] = I ? I.replace(T[1], T[2]) : i : T.length === 4 && (this[T[0]] = I ? T[3].call(this, I.replace(T[1], T[2])) : i) : this[T] = I || i;
w += 2;
}
}, le = function(v, y) {
for (var w in y)
if (typeof y[w] === S && y[w].length > 0) {
for (var E = 0; E < y[w].length; E++)
if (Ve(y[w][E], v))
return w === h ? i : w;
} else if (Ve(y[w], v))
return w === h ? i : w;
return y.hasOwnProperty("*") ? y["*"] : v;
}, St = {
"1.0": "/8",
"1.2": "/1",
"1.3": "/3",
"2.0": "/412",
"2.0.2": "/416",
"2.0.3": "/417",
"2.0.4": "/419",
"?": "/"
}, Ue = {
ME: "4.90",
"NT 3.11": "NT3.51",
"NT 4.0": "NT4.0",
2e3: "NT 5.0",
XP: ["NT 5.1", "NT 5.2"],
Vista: "NT 6.0",
7: "NT 6.1",
8: "NT 6.2",
"8.1": "NT 6.3",
10: ["NT 6.4", "NT 10.0"],
RT: "ARM"
}, je = {
browser: [
[
/\b(?:crmo|crios)\/([\w\.]+)/i
// Chrome for Android/iOS
],
[u, [d, "Chrome"]],
[
/edg(?:e|ios|a)?\/([\w\.]+)/i
// Microsoft Edge
],
[u, [d, "Edge"]],
[
// Presto based
/(opera mini)\/([-\w\.]+)/i,
// Opera Mini
/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,
// Opera Mobi/Tablet
/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i
// Opera
],
[d, u],
[
/opios[\/ ]+([\w\.]+)/i
// Opera mini on iphone >= 8.0
],
[u, [d, Y + " Mini"]],
[
/\bop(?:rg)?x\/([\w\.]+)/i
// Opera GX
],
[u, [d, Y + " GX"]],
[
/\bopr\/([\w\.]+)/i
// Opera Webkit
],
[u, [d, Y]],
[
// Mixed
/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i
// Baidu
],
[u, [d, "Baidu"]],
[
/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i
// Maxthon
],
[u, [d, "Maxthon"]],
[
/(kindle)\/([\w\.]+)/i,
// Kindle
/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
// Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
// Trident based
/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,
// Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
/(?:ms|\()(ie) ([\w\.]+)/i,
// Internet Explorer
// Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon)\/([-\w\.]+)/i,
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
/(heytap|ovi|115)browser\/([\d\.]+)/i,
// HeyTap/Ovi/115
/(weibo)__([\d\.]+)/i
// Weibo
],
[d, u],
[
/quark(?:pc)?\/([-\w\.]+)/i
// Quark
],
[u, [d, "Quark"]],
[
/\bddg\/([\w\.]+)/i
// DuckDuckGo
],
[u, [d, "DuckDuckGo"]],
[
/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i
// UCBrowser
],
[u, [d, "UC" + oe]],
[
/microm.+\bqbcore\/([\w\.]+)/i,
// WeChat Desktop for Windows Built-in Browser
/\bqbcore\/([\w\.]+).+microm/i,
/micromessenger\/([\w\.]+)/i
// WeChat
],
[u, [d, "WeChat"]],
[
/konqueror\/([\w\.]+)/i
// Konqueror
],
[u, [d, "Konqueror"]],
[
/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i
// IE11
],
[u, [d, "IE"]],
[
/ya(?:search)?browser\/([\w\.]+)/i
// Yandex
],
[u, [d, "Yandex"]],
[
/slbrowser\/([\w\.]+)/i
// Smart Lenovo Browser
],
[u, [d, "Smart Lenovo " + oe]],
[
/(avast|avg)\/([\w\.]+)/i
// Avast/AVG Secure Browser
],
[[d, /(.+)/, "$1 Secure " + oe], u],
[
/\bfocus\/([\w\.]+)/i
// Firefox Focus
],
[u, [d, ce + " Focus"]],
[
/\bopt\/([\w\.]+)/i
// Opera Touch
],
[u, [d, Y + " Touch"]],
[
/coc_coc\w+\/([\w\.]+)/i
// Coc Coc Browser
],
[u, [d, "Coc Coc"]],
[
/dolfin\/([\w\.]+)/i
// Dolphin
],
[u, [d, "Dolphin"]],
[
/coast\/([\w\.]+)/i
// Opera Coast
],
[u, [d, Y + " Coast"]],
[
/miuibrowser\/([\w\.]+)/i
// MIUI Browser
],
[u, [d, "MIUI" + ze]],
[
/fxios\/([\w\.-]+)/i
// Firefox for iOS
],
[u, [d, ce]],
[
/\bqihoobrowser\/?([\w\.]*)/i
// 360
],
[u, [d, "360"]],
[
/\b(qq)\/([\w\.]+)/i
// QQ
],
[[d, /(.+)/, "$1Browser"], u],
[
/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
],
[[d, /(.+)/, "$1" + ze], u],
[
// Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
/samsungbrowser\/([\w\.]+)/i
// Samsung Internet
],
[u, [d, $ + " Internet"]],
[
/metasr[\/ ]?([\d\.]+)/i
// Sogou Explorer
],
[u, [d, "Sogou Explorer"]],
[
/(sogou)mo\w+\/([\d\.]+)/i
// Sogou Mobile
],
[[d, "Sogou Mobile"], u],
[
/(electron)\/([\w\.]+) safari/i,
// Electron-based App
/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,
// Tesla
/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i
// QQ/2345
],
[d, u],
[
/(lbbrowser|rekonq)/i,
// LieBao Browser/Rekonq
/\[(linkedin)app\]/i
// LinkedIn App for iOS & Android
],
[d],
[
/ome\/([\w\.]+) \w* ?(iron) saf/i,
// Iron
/ome\/([\w\.]+).+qihu (360)[es]e/i
// 360
],
[u, d],
[
// WebView
/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i
// Facebook App for iOS & Android
],
[[d, De], u],
[
/(Klarna)\/([\w\.]+)/i,
// Klarna Shopping Browser for iOS & Android
/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,
// Kakao App
/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,
// Naver InApp
/safari (line)\/([\w\.]+)/i,
// Line App for iOS
/\b(line)\/([\w\.]+)\/iab/i,
// Line App for Android
/(alipay)client\/([\w\.]+)/i,
// Alipay
/(twitter)(?:and| f.+e\/([\w\.]+))/i,
// Twitter
/(chromium|instagram|snapchat)[\/ ]([-\w\.]+)/i
// Chromium/Instagram/Snapchat
],
[d, u],
[
/\bgsa\/([\w\.]+) .*safari\//i
// Google Search Appliance on iOS
],
[u, [d, "GSA"]],
[
/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i
// TikTok
],
[u, [d, "TikTok"]],
[
/headlesschrome(?:\/([\w\.]+)| )/i
// Chrome Headless
],
[u, [d, ae + " Headless"]],
[
/ wv\).+(chrome)\/([\w\.]+)/i
// Chrome WebView
],
[[d, ae + " WebView"], u],
[
/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i
// Android Browser
],
[u, [d, "Android " + oe]],
[
/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i
// Chrome/OmniWeb/Arora/Tizen/Nokia
],
[d, u],
[
/version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i
// Mobile Safari
],
[u, [d, "Mobile Safari"]],
[
/version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i
// Safari & Safari Mobile
],
[u, d],
[
/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i
// Safari < 3.0
],
[d, [u, le, St]],
[
/(webkit|khtml)\/([\w\.]+)/i
],
[d, u],
[
// Gecko based
/(navigator|netscape\d?)\/([-\w\.]+)/i
// Netscape
],
[[d, "Netscape"], u],
[
/(wolvic|librewolf)\/([\w\.]+)/i
// Wolvic/LibreWolf
],
[d, u],
[
/mobile vr; rv:([\w\.]+)\).+firefox/i
// Firefox Reality
],
[u, [d, ce + " Reality"]],
[
/ekiohf.+(flow)\/([\w\.]+)/i,
// Flow
/(swiftfox)/i,
// Swiftfox
/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
// IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,
// Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
/(firefox)\/([\w\.]+)/i,
// Other Firefox-based
/(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i,
// Mozilla
// Other
/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser
/(links) \(([\w\.]+)/i
// Links
],
[d, [u, /_/g, "."]],
[
/(cobalt)\/([\w\.]+)/i
// Cobalt
],
[d, [u, /master.|lts./, ""]]
],
cpu: [
[
/(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i
// AMD64 (x64)
],
[[L, "amd64"]],
[
/(ia32(?=;))/i
// IA32 (quicktime)
],
[[L, G]],
[
/((?:i[346]|x)86)[;\)]/i
// IA32 (x86)
],
[[L, "ia32"]],
[
/\b(aarch64|arm(v?8e?l?|_?64))\b/i
// ARM64
],
[[L, "arm64"]],
[
/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i
// ARMHF
],
[[L, "armhf"]],
[
// PocketPC mistakenly identified as PowerPC
/windows (ce|mobile); ppc;/i
],
[[L, "arm"]],
[
/((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i
// PowerPC
],
[[L, /ower/, l, G]],
[
/(sun4\w)[;\)]/i
// SPARC
],
[[L, "sparc"]],
[
/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
// IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
],
[[L, G]]
],
device: [
[
//////////////////////////
// MOBILES & TABLETS
/////////////////////////
// Samsung
/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
],
[n, [c, $], [o, g]],
[
/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
/samsung[- ]((?!sm-[lr])[-\w]+)/i,
/sec-(sgh\w+)/i
],
[n, [c, $], [o, b]],
[
// Apple
/(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i
// iPod/iPhone
],
[n, [c, Q], [o, b]],
[
/\((ipad);[-\w\),; ]+apple/i,
// iPad
/applecoremedia\/[\w\.]+ \((ipad)/i,
/\b(ipad)\d\d?,\d\d?[;\]].+ios/i
],
[n, [c, Q], [o, g]],
[
/(macintosh);/i
],
[n, [c, Q]],
[
// Sharp
/\b(sh-?[altvz]?\d\d[a-ekm]?)/i
],
[n, [c, Ie], [o, b]],
[
// Honor
/(?:honor)([-\w ]+)[;\)]/i
],
[n, [c, "Honor"], [o, b]],
[
// Huawei
/\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i
],
[n, [c, Ne], [o, g]],
[
/(?:huawei)([-\w ]+)[;\)]/i,
/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i
],
[n, [c, Ne], [o, b]],
[
// Xiaomi
/\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i,
// Xiaomi POCO
/\b; (\w+) build\/hm\1/i,
// Xiaomi Hongmi 'numeric' models
/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,
// Xiaomi Hongmi
/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,
// Xiaomi Redmi
/oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i,
// Xiaomi Redmi 'numeric' models
/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i
// Xiaomi Mi
],
[[n, /_/g, " "], [c, ke], [o, b]],
[
/oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i,
// Redmi Pad
/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i
// Mi Pad tablets
],
[[n, /_/g, " "], [c, ke], [o, g]],
[
// OPPO
/; (\w+) bui.+ oppo/i,
/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
],
[n, [c, "OPPO"], [o, b]],
[
/\b(opd2\d{3}a?) bui/i
],
[n, [c, "OPPO"], [o, g]],
[
// Vivo
/vivo (\w+)(?: bui|\))/i,
/\b(v[12]\d{3}\w?[at])(?: bui|;)/i
],
[n, [c, "Vivo"], [o, b]],
[
// Realme
/\b(rmx[1-3]\d{3})(?: bui|;|\))/i
],
[n, [c, "Realme"], [o, b]],
[
// Motorola
/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
/\bmot(?:orola)?[- ](\w*)/i,
/((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i
],
[n, [c, _e], [o, b]],
[
/\b(mz60\d|xoom[2 ]{0,2}) build\//i
],
[n, [c, _e], [o, g]],
[
// LG
/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
],
[n, [c, ve], [o, g]],
[
/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
/\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,
/\blg-?([\d\w]+) bui/i
],
[n, [c, ve], [o, b]],
[
// Lenovo
/(ideatab[-\w ]+)/i,
/lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i
],
[n, [c, "Lenovo"], [o, g]],
[
// Nokia
/(?:maemo|nokia).*(n900|lumia \d+)/i,
/nokia[-_ ]?([-\w\.]*)/i
],
[[n, /_/g, " "], [c, "Nokia"], [o, b]],
[
// Google
/(pixel c)\b/i
// Google Pixel C
],
[n, [c, Z], [o, g]],
[
/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i
// Google Pixel
],
[n, [c, Z], [o, b]],
[
// Sony
/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
],
[n, [c, de], [o, b]],
[
/sony tablet [ps]/i,
/\b(?:sony)?sgp\w+(?: bui|\))/i
],
[[n, "Xperia Tablet"], [c, de], [o, g]],
[
// OnePlus
/ (kb2005|in20[12]5|be20[12][59])\b/i,
/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
],
[n, [c, "OnePlus"], [o, b]],
[
// Amazon
/(alexa)webm/i,
/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,
// Kindle Fire without Silk / Echo Show
/(kf[a-z]+)( bui|\)).+silk\//i
// Kindle Fire HD
],
[n, [c, ne], [o, g]],
[
/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i
// Fire Phone
],
[[n, /(.+)/g, "Fire Phone $1"], [c, ne], [o, b]],
[
// BlackBerry
/(playbook);[-\w\),; ]+(rim)/i
// BlackBerry PlayBook
],
[n, c, [o, g]],
[
/\b((?:bb[a-f]|st[hv])100-\d)/i,
/\(bb10; (\w+)/i
// BlackBerry 10
],
[n, [c, Le], [o, b]],
[
// Asus
/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
],
[n, [c, Oe], [o, g]],
[
/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
],
[n, [c, Oe], [o, b]],
[
// HTC
/(nexus 9)/i
// HTC Nexus 9
],
[n, [c, "HTC"], [o, g]],
[
/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,
// HTC
// ZTE
/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i
// Alcatel/GeeksPhone/Nexian/Panasonic/Sony
],
[c, [n, /_/g, " "], [o, b]],
[
// TCL
/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])\w*(\)| bui)/i
],
[n, [c, "TCL"], [o, g]],
[
// itel
/(itel) ((\w+))/i
],
[[c, G], n, [o, le, { tablet: ["p10001l", "w7001"], "*": "mobile" }]],
[
// Acer
/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
],
[n, [c, "Acer"], [o, g]],
[
// Meizu
/droid.+; (m[1-5] note) bui/i,
/\bmz-([-\w]{2,})/i
],
[n, [c, "Meizu"], [o, b]],
[
// Ulefone
/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
],
[n, [c, "Ulefone"], [o, b]],
[
// Energizer
/; (energy ?\w+)(?: bui|\))/i,
/; energizer ([\w ]+)(?: bui|\))/i
],
[n, [c, "Energizer"], [o, b]],
[
// Cat
/; cat (b35);/i,
/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
],
[n, [c, "Cat"], [o, b]],
[
// Smartfren
/((?:new )?andromax[\w- ]+)(?: bui|\))/i
],
[n, [c, "Smartfren"], [o, b]],
[
// Nothing
/droid.+; (a(?:015|06[35]|142p?))/i
],
[n, [c, "Nothing"], [o, b]],
[
// MIXED
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
// BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Infinix/Tecno/Micromax/Advan
/; (imo) ((?!tab)[\w ]+?)(?: bui|\))/i,
// IMO
/(hp) ([\w ]+\w)/i,
// HP iPAQ
/(asus)-?(\w+)/i,
// Asus
/(microsoft); (lumia[\w ]+)/i,
// Microsoft Lumia
/(lenovo)[-_ ]?([-\w]+)/i,
// Lenovo
/(jolla)/i,
// Jolla
/(oppo) ?([\w ]+) bui/i
// OPPO
],
[c, n, [o, b]],
[
/(imo) (tab \w+)/i,
// IMO
/(kobo)\s(ereader|touch)/i,
// Kobo
/(archos) (gamepad2?)/i,
// Archos
/(hp).+(touchpad(?!.+tablet)|tablet)/i,
// HP TouchPad
/(kindle)\/([\w\.]+)/i,
// Kindle
/(nook)[\w ]+build\/(\w+)/i,
// Nook
/(dell) (strea[kpr\d ]*[\dko])/i,
// Dell Streak
/(le[- ]+pan)[- ]+(\w{1,9}) bui/i,
// Le Pan Tablets
/(trinity)[- ]*(t\d{3}) bui/i,
// Trinity Tablets
/(gigaset)[- ]+(q\w{1,9}) bui/i,
// Gigaset Tablets
/(vodafone) ([\w ]+)(?:\)| bui)/i
// Vodafone
],
[c, n, [o, g]],
[
/(surface duo)/i
// Surface Duo
],
[n, [c, Se], [o, g]],
[
/droid [\d\.]+; (fp\du?)(?: b|\))/i
// Fairphone
],
[n, [c, "Fairphone"], [o, b]],
[
/(u304aa)/i
// AT&T
],
[n, [c, "AT&T"], [o, b]],
[
/\bsie-(\w*)/i
// Siemens
],
[n, [c, "Siemens"], [o, b]],
[
/\b(rct\w+) b/i
// RCA Tablets
],
[n, [c, "RCA"], [o, g]],
[
/\b(venue[\d ]{2,7}) b/i
// Dell Venue Tablets
],
[n, [c, "Dell"], [o, g]],
[
/\b(q(?:mv|ta)\w+) b/i
// Verizon Tablet
],
[n, [c, "Verizon"], [o, g]],
[
/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i
// Barnes & Noble Tablet
],
[n, [c, "Barnes & Noble"], [o, g]],
[
/\b(tm\d{3}\w+) b/i
],
[n, [c, "NuVision"], [o, g]],
[
/\b(k88) b/i
// ZTE K Series Tablet
],
[n, [c, "ZTE"], [o, g]],
[
/\b(nx\d{3}j) b/i
// ZTE Nubia
],
[n, [c, "ZTE"], [o, b]],
[
/\b(gen\d{3}) b.+49h/i
// Swiss GEN Mobile
],
[n, [c, "Swiss"], [o, b]],
[
/\b(zur\d{3}) b/i
// Swiss ZUR Tablet
],
[n, [c, "Swiss"], [o, g]],
[
/\b((zeki)?tb.*\b) b/i
// Zeki Tablets
],
[n, [c, "Zeki"], [o, g]],
[
/\b([yr]\d{2}) b/i,
/\b(dragon[- ]+touch |dt)(\w{5}) b/i
// Dragon Touch Tablet
],
[[c, "Dragon Touch"], n, [o, g]],
[
/\b(ns-?\w{0,9}) b/i
// Insignia Tablets
],
[n, [c, "Insignia"], [o, g]],
[
/\b((nxa|next)-?\w{0,9}) b/i
// NextBook Tablets
],
[n, [c, "NextBook"], [o, g]],
[
/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i
// Voice Xtreme Phones
],
[[c, "Voice"], n, [o, b]],
[
/\b(lvtel\-)?(v1[12]) b/i
// LvTel Phones
],
[[c, "LvTel"], n, [o, b]],
[
/\b(ph-1) /i
// Essential PH-1
],
[n, [c, "Essential"], [o, b]],
[
/\b(v(100md|700na|7011|917g).*\b) b/i
// Envizen Tablets
],
[n, [c, "Envizen"], [o, g]],
[
/\b(trio[-\w\. ]+) b/i
// MachSpeed Tablets
],
[n, [c, "MachSpeed"], [o, g]],
[
/\btu_(1491) b/i
// Rotor Tablets
],
[n, [c, "Rotor"], [o, g]],
[
/(shield[\w ]+) b/i
// Nvidia Shield Tablets
],
[n, [c, "Nvidia"], [o, g]],
[
/(sprint) (\w+)/i
// Sprint Phones
],
[c, n, [o, b]],
[
/(kin\.[onetw]{3})/i
// Microsoft Kin
],
[[n, /\./g, " "], [c, Se], [o, b]],
[
/droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i
// Zebra
],
[n, [c, ye], [o, g]],
[
/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
],
[n, [c, ye], [o, b]],
[
///////////////////
// SMARTTVS
///////////////////
/smart-tv.+(samsung)/i
// Samsung
],
[c, [o, C]],
[
/hbbtv.+maple;(\d+)/i
],
[[n, /^/, "SmartTV"], [c, $], [o, C]],
[
/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
// LG SmartTV
],
[[c, ve], [o, C]],
[
/(apple) ?tv/i
// Apple TV
],
[c, [n, Q + " TV"], [o, C]],
[
/crkey/i
// Google Chromecast
],
[[n, ae + "cast"], [c, Z], [o, C]],
[
/droid.+aft(\w+)( bui|\))/i
// Fire TV
],
[n, [c, ne], [o, C]],
[
/\(dtv[\);].+(aquos)/i,
/(aquos-tv[\w ]+)\)/i
// Sharp
],
[n, [c, Ie], [o, C]],
[
/(bravia[\w ]+)( bui|\))/i
// Sony
],
[n, [c, de], [o, C]],
[
/(mitv-\w{5}) bui/i
// Xiaomi
],
[n, [c, ke], [o, C]],
[
/Hbbtv.*(technisat) (.*);/i
// TechniSAT
],
[c, n, [o, C]],
[
/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,
// Roku
/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i
// HbbTV devices
],
[[c, Te], [n, Te], [o, C]],
[
/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i
// SmartTV from Unidentified Vendors
],
[[o, C]],
[
///////////////////
// CONSOLES
///////////////////
/(ouya)/i,
// Ouya
/(nintendo) ([wids3utch]+)/i
// Nintendo
],
[c, n, [o, K]],
[
/droid.+; (shield) bui/i
// Nvidia
],
[n, [c, "Nvidia"], [o, K]],
[
/(playstation [345portablevi]+)/i
// Playstation
],
[n, [c, de], [o, K]],
[
/\b(xbox(?: one)?(?!; xbox))[\); ]/i
// Microsoft Xbox
],
[n, [c, Se], [o, K]],
[
///////////////////
// WEARABLES
///////////////////
/\b(sm-[lr]\d\d[05][fnuw]?s?)\b/i
// Samsung Galaxy Watch
],
[n, [c, $], [o, q]],
[
/((pebble))app/i
// Pebble
],
[c, n, [o, q]],
[
/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i
// Apple Watch
],
[n, [c, Q], [o, q]],
[
/droid.+; (glass) \d/i
// Google Glass
],
[n, [c, Z], [o, q]],
[
/droid.+; (wt63?0{2,3})\)/i
],
[n, [c, ye], [o, q]],
[
///////////////////
// XR
///////////////////
/droid.+; (glass) \d/i
// Google Glass
],
[n, [c, Z], [o, q]],
[
/(pico) (4|neo3(?: link|pro)?)/i
// Pico
],
[c, n, [o, q]],
[
/; (quest( \d| pro)?)/i
// Oculus Quest
],
[n, [c, De], [o, q]],
[
///////////////////
// EMBEDDED
///////////////////
/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i
// Tesla
],
[c, [o, be]],
[
/(aeobc)\b/i
// Echo Dot
],
[n, [c, ne], [o, be]],
[
////////////////////
// MIXED (GENERIC)
///////////////////
/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+? mobile safari/i
// Android Phones from Unidentified Vendors
],
[n, [o, b]],
[
/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i
// Android Tablets from Unidentified Vendors
],
[n, [o, g]],
[
/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i
// Unidentifiable Tablet
],
[[o, g]],
[
/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i
// Unidentifiable Mobile
],
[[o, b]],
[
/(android[-\w\. ]{0,9});.+buil/i
// Generic Android Device
],
[n, [c, "Generic"]]
],
engine: [
[
/windows.+ edge\/([\w\.]+)/i
// EdgeHTML
],
[u, [d, bt + "HTML"]],
[
/(arkweb)\/([\w\.]+)/i
// ArkWeb
],
[d, u],
[
/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i
// Blink
],
[u, [d, "Blink"]],
[
/(presto)\/([\w\.]+)/i,
// Presto
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,
// WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
/ekioh(flow)\/([\w\.]+)/i,
// Flow
/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,
// KHTML/Tasman/Links
/(icab)[\/ ]([23]\.[\d\.]+)/i,
// iCab
/\b(libweb)/i
],
[d, u],
[
/rv\:([\w\.]{1,9})\b.+(gecko)/i
// Gecko
],
[u, d]
],
os: [
[
// Windows
/microsoft (windows) (vista|xp)/i
// Windows (iTunes)
],
[d, u],
[
/(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i
// Windows Phone
],
[d, [u, le, Ue]],
[
/windows nt 6\.2; (arm)/i,
// Windows RT
/windows[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i,
/(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i
],
[[u, le, Ue], [d, "Windows"]],
[
// iOS/macOS
/ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i,
// iOS
/(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,
/cfnetwork\/.+darwin/i
],
[[u, /_/g, "."], [d, "iOS"]],
[
/(mac os x) ?([\w\. ]*)/i,
/(macintosh|mac_powerpc\b)(?!.+haiku)/i
// Mac OS
],
[[d, He], [u, /_/g, "."]],
[
// Mobile OSes
/droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i
// Android-x86/HarmonyOS
],
[u, d],
[
// Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS/OpenHarmony
/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish|openharmony)[-\/ ]?([\w\.]*)/i,
/(blackberry)\w*\/([\w\.]*)/i,
// Blackberry
/(tizen|kaios)[\/ ]([\w\.]+)/i,
// Tizen/KaiOS
/\((series40);/i
// Series 40
],
[d, u],
[
/\(bb(10);/i
// BlackBerry 10
],
[u, [d, Le]],
[
/(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i
// Symbian
],
[u, [d, "Symbian"]],
[
/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i
// Firefox OS
],
[u, [d, ce + " OS"]],
[
/web0s;.+rt(tv)/i,
/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i
// WebOS
],
[u, [d, "webOS"]],
[
/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i
// watchOS
],
[u, [d, "watchOS"]],
[
// Google Chromecast
/crkey\/([\d\.]+)/i
// Google Chromecast
],
[u, [d, ae + "cast"]],
[
/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i
// Chromium OS
],
[[d, qe], u],
[
// Smart TVs
/panasonic;(viera)/i,
// Panasonic Viera
/(netrange)mmh/i,
// Netrange
/(nettv)\/(\d+\.[\w\.]+)/i,
// NetTV
// Console
/(nintendo|playstation) ([wids345portablevuch]+)/i,
// Nintendo/Playstation
/(xbox); +xbox ([^\);]+)/i,
// Microsoft Xbox (360, One, X, S, Series X, Series S)
// Other
/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,
// Joli/Palm
/(mint)[\/\(\) ]?(\w*)/i,
// Mint
/(mageia|vectorlinux)[; ]/i,
// Mageia/VectorLinux
/([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
// Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire
/(hurd|linux) ?([\w\.]*)/i,
// Hurd/Linux
/(gnu) ?([\w\.]*)/i,
// GNU
/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,
// FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
/(haiku) (\w+)/i
// Haiku
],
[d, u],
[
/(sunos) ?([\w\.\d]*)/i
// Solaris
],
[[d, "Solaris"], u],
[
/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,
// Solaris
/(aix) ((\d)(?=\.|\)| )[\w\.])*/i,
// AIX
/\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i,
// BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS
/(unix) ?([\w\.]*)/i
// UNIX
],
[d, u]
]
}, N = function(v, y) {
if (typeof v === S && (y = v, v = i), !(this instanceof N))
return new N(v, y).getResult();
var w = typeof t !== p && t.navigator ? t.navigator : i, E = v || (w && w.userAgent ? w.userAgent : l), H = w && w.userAgentData ? w.userAgentData : i, _ = y ? gt(je, y) : je, T = w && w.userAgent == E;
return this.getBrowser = function() {
var f = {};
return f[d] = i, f[u] = i, ee.call(f, E, _.browser), f[F] = vt(f[u]), T && w && w.brave && typeof w.brave.isBrave == m && (f[d] = "Brave"), f;
}, this.getCPU = function() {
var f = {};
return f[L] = i, ee.call(f, E, _.cpu), f;
}, this.getDevice = function() {
var f = {};
return f[c] = i, f[n] = i, f[o] = i, ee.call(f, E, _.device), T && !f[o] && H && H.mobile && (f[o] = b), T && f[n] == "Macintosh" && w && typeof w.standalone !== p && w.maxTouchPoints && w.maxTouchPoints > 2 && (f[n] = "iPad", f[o] = g), f;
}, this.getEngine = function() {
var f = {};
return f[d] = i, f[u] = i, ee.call(f, E, _.engine), f;
}, this.getOS = function() {
var f = {};
return f[d] = i, f[u] = i, ee.call(f, E, _.os), T && !f[d] && H && H.platform && H.platform != "Unknown" && (f[d] = H.platform.replace(/chrome os/i, qe).replace(/macos/i, He)), f;
}, this.getResult = function() {
return {
ua: this.getUA(),
browser: this.getBrowser(),
engine: this.getEngine(),
os: this.getOS(),
device: this.getDevice(),
cpu: this.getCPU()
};
}, this.getUA = function() {
return E;
}, this.setUA = function(f) {
return E = typeof f === k && f.length > ge ? Te(f, ge) : f, this;
}, this.setUA(E), this;
};
N.VERSION = s, N.BROWSER = ue([d, u, F]), N.CPU = ue([L]), N.DEVICE = ue([n, c, o, K, b, C, g, q, be]), N.ENGINE = N.OS = ue([d, u]), r.exports && (e = r.exports = N), e.UAParser = N;
var J = typeof t !== p && (t.jQuery || t.Zepto);
if (J && !J.ua) {
var he = new N();
J.ua = he.getResult(), J.ua.get = function() {
return he.getUA();
}, J.ua.set = function(v) {
he.setUA(v);
var y = he.getResult();
for (var w in y)
J.ua[w] = y[w];
};
}
})(typeof window == "object" ? window : Rt);
}(re, re.exports)), re.exports;
}
var Ft = At();
const Pt = /* @__PURE__ */ xt(Ft), Bt = {
"Amazon Silk": "amazon_silk",
"Android Browser": "android",
Bada: "bada",
BlackBerry: "blackberry",
Chrome: "chrome",
Chromium: "chromium",
Electron: "electron",
Epiphany: "epiphany",
Firefox: "firefox",
Focus: "focus",
Generic: "generic",
"Google Search": "google_search",
Googlebot: "googlebot",
"Internet Explorer": "ie",
"K-Meleon": "k_meleon",
Maxthon: "maxthon",
"Microsoft Edge": "edge",
"MZ Browser": "mz",
"NAVER Whale Browser": "naver",
Opera: "opera",
"Opera Coast": "opera_coast",
PhantomJS: "phantomjs",
Puffin: "puffin",
QupZilla: "qupzilla",
QQ: "qq",
QQLite: "qqlite",
Safari: "safari",
Sailfish: "sailfish",
"Samsung Internet for Android": "samsung_internet",
SeaMonkey: "seamonkey",
Sleipnir: "sleipnir",
Swing: "swing",
Tizen: "tizen",
"UC Browser": "uc",
Vivaldi: "vivaldi",
"WebOS Browser": "webos",
WeChat: "wechat",
"Yandex Browser": "yandex",
Roku: "roku"
}, nt = {
amazon_silk: "Amazon Silk",
android: "Android Browser",
bada: "Bada",
blackberry: "BlackBerry",
chrome: "Chrome",
chromium: "Chromium",
electron: "Electron",
epiphany: "Epiphany",
firefox: "Firefox",
focus: "Focus",
generic: "Generic",
googlebot: "Googlebot",
google_search: "Google Search",
ie: "Internet Explorer",
k_meleon: "K-Meleon",
maxthon: "Maxthon",
edge: "Microsoft Edge",
mz: "MZ Browser",
naver: "NAVER Whale Browser",
opera: "Opera",
opera_coast: "Opera Coast",
phantomjs: "PhantomJS",
puffin: "Puffin",
qupzilla: "QupZilla",
qq: "QQ Browser",
qqlite: "QQ Browser Lite",
safari: "Safari",
sailfish: "Sailfish",
samsung_internet: "Samsung Internet for Android",
seamonkey: "SeaMonkey",
sleipnir: "Sleipnir",
swing: "Swing",
tizen: "Tizen",
uc: "UC Browser",
vivaldi: "Vivaldi",
webos: "WebOS Browser",
wechat: "WeChat",
yandex: "Yandex Browser"
}, R = {
tablet: "tablet",
mobile: "mobile",
desktop: "desktop",
tv: "tv"
}, B = {
WindowsPhone: "Windows Phone",
Windows: "Windows",
MacOS: "macOS",
iOS: "iOS",
Android: "Android",
WebOS: "WebOS",
BlackBerry: "BlackBerry",
Bada: "Bada",
Tizen: "Tizen",
Linux: "Linux",
ChromeOS: "Chrome OS",
PlayStation4: "PlayStation 4",
Roku: "Roku"
}, U = {
EdgeHTML: "EdgeHTML",
Blink: "Blink",
Trident: "Trident",
Presto: "Presto",
Gecko: "Gecko",
WebKit: "WebKit"
};
class a {
/**
* Get first matched item for a string
* @param {RegExp} regexp
* @param {String} ua
* @return {Array|{index: number, input: string}|*|boolean|string}
*/
static getFirstMatch(e, t) {
const i = t.match(e);
return i && i.length > 0 && i[1] || "";
}
/**
* Get second matched item for a string
* @param regexp
* @param {String} ua
* @return {Array|{index: number, input: string}|*|boolean|string}
*/
static getSecondMatch(e, t) {
const i = t.match(e);
return i && i.length > 1 && i[2] || "";
}
/**
* Match a regexp and return a constant or undefined
* @param {RegExp} regexp
* @param {String} ua
* @param {*} _const Any const that will be returned if regexp matches the string
* @return {*}
*/
static matchAndReturnConst(e, t, i) {
if (e.test(t))
return i;
}
static getWindowsVersionName(e) {
switch (e) {
case "NT":
return "NT";
case "XP":
return "XP";
case "NT 5.0":
return "2000";
case "NT 5.1":
return "XP";
case "NT 5.2":
return "2003";
case "NT 6.0":
return "Vista";
case "NT 6.1":
return "7";
case "NT 6.2":
return "8";
case "NT 6.3":
return "8.1";
case "NT 10.0":
return "10";
default:
return;
}
}
/**
* Get macOS version name
* 10.5 - Leopard
* 10.6 - Snow Leopard
* 10.7 - Lion
* 10.8 - Mountain Lion
* 10.9 - Mavericks
* 10.10 - Yosemite
* 10.11 - El Capitan
* 10.12 - Sierra
* 10.13 - High Sierra
* 10.14 - Mojave
* 10.15 - Catalina
*
* @example
* getMacOSVersionName("10.14") // 'Mojave'
*
* @param {string} version
* @return {string} versionName
*/
static getMacOSVersionName(e) {
const t = e.split(".").splice(0, 2).map((i) => parseInt(i, 10) || 0);
if (t.push(0), t[0] === 10)
switch (t[1]) {
case 5:
return "Leopard";
case 6:
return "Snow Leopard";
case 7:
return "Lion";
case 8:
return "Mountain Lion";
case 9:
return "Mavericks";
case 10:
return "Yosemite";
case 11:
return "El Capitan";
case 12:
return "Sierra";
case 13:
return "High Sierra";
case 14:
return "Mojave";
case 15:
return "Catalina";
default:
return;
}
}
/**
* Get Android version name
* 1.5 - Cupcake
* 1.6 - Donut
* 2.0 - Eclair
* 2.1 - Eclair
* 2.2 - Froyo
* 2.x - Gingerbread
* 3.x - Honeycomb
* 4.0 - Ice Cream Sandwich
* 4.1 - Jelly Bean
* 4.4 - KitKat
* 5.x - Lollipop
* 6.x - Marshmallow
* 7.x - Nougat
* 8.x - Oreo
* 9.x - Pie
*
* @example
* getAndroidVersionName("7.0") // 'Nougat'
*
* @param {string} version
* @return {string} versionName
*/
static getAndroidVersionName(e) {
const t = e.split(".").splice(0, 2).map((i) => parseInt(i, 10) || 0);
if (t.push(0), !(t[0] === 1 && t[1] < 5)) {
if (t[0] === 1 && t[1] < 6) return "Cupcake";
if (t[0] === 1 && t[1] >= 6) return "Donut";
if (t[0] === 2 && t[1] < 2) return "Eclair";
if (t[0] === 2 && t[1] === 2) return "Froyo";
if (t[0] === 2 && t[1] > 2) return "Gingerbread";
if (t[0] === 3) return "Honeycomb";
if (t[0] === 4 && t[1] < 1) return "Ice Cream Sandwich";
if (t[0] === 4 && t[1] < 4) return "Jelly Bean";
if (t[0] === 4 && t[1] >= 4) return "KitKat";
if (t[0] === 5) return "Lollipop";
if (t[0] === 6) return "Marshmallow";
if (t[0] === 7) return "Nougat";
if (t[0] === 8) return "Oreo";
if (t[0] === 9) return "Pie";
}
}
/**
* Get version precisions count
*
* @example
* getVersionPrecision("1.10.3") // 3
*
* @param {string} version
* @return {number}
*/
static getVersionPrecision(e) {
return e.split(".").length;
}
/**
* Calculate browser version weight
*
* @example
* compareVersions('1.10.2.1', '1.8.2.1.90') // 1
* compareVersions('1.010.2.1', '1.09.2.1.90'); // 1
* compareVersions('1.10.2.1', '1.10.2.1'); // 0
* compareVersions('1.10.2.1', '1.0800.2'); // -1
* compareVersions('1.10.2.1', '1.10', true); // 0
*
* @param {String} versionA versions versions to compare
* @param {String} versionB versions versions to compare
* @param {boolean} [isLoose] enable loose comparison
* @return {Number} comparison result: -1 when versionA is lower,
* 1 when versionA is bigger, 0 when both equal
*/
/* eslint consistent-return: 1 */
static compareVersions(e, t, i = !1) {
const s = a.getVersionPrecision(e), l = a.getVersionPrecision(t);
let h = Math.max(s, l), m = 0;
const p = a.map([e, t], (S) => {
const k = h - a.getVersionPrecision(S), F = S + new Array(k + 1).join(".0");
return a.map(F.split("."), (n) => new Array(20 - n.length).join("0") + n).reverse();
});
for (i && (m = h - Math.min(s, l)), h -= 1; h >= m; ) {
if (p[0][h] > p[1][h])
return 1;
if (p[0][h] === p[1][h]) {
if (h === m)
return 0;
h -= 1;
} else if (p[0][h] < p[1][h])
return -1;
}
}
/**
* Array::map polyfill
*
* @param {Array} arr
* @param {Function} iterator
* @return {Array}
*/
static map(e, t) {
const i = [];
let s;
if (Array.prototype.map)
return Array.prototype.map.call(e, t);
for (s = 0; s < e.length; s += 1)
i.push(t(e[s]));
return i;
}
/**
* Array::find polyfill
*
* @param {Array} arr
* @param {Function} predicate
* @return {Array}
*/
static find(e, t) {
let i, s;
if (Array.prototype.find)
return Array.prototype.find.call(e, t);
for (i = 0, s = e.length; i < s; i += 1) {
const l = e[i];
if (t(l, i))
return l;
}
}
/**
* Object::assign polyfill
*
* @param {Object} obj
* @param {Object} ...objs
* @return {Object}
*/
static assign(e, ...t) {
const i = e;
let s, l;
if (Object.assign)
return Object.assign(e, ...t);
for (s = 0, l = t.length; s < l; s += 1) {
const h = t[s];
typeof h == "object" && h !== null && Object.keys(h).forEach((p) => {
i[p] = h[p];
});
}
return e;
}
/**
* Get short version/alias for a browser name
*
* @example
* getBrowserAlias('Microsoft Edge') // edge
*
* @param {string} browserName
* @return {string}
*/
static getBrowserAlias(e) {
return Bt[e];
}
/**
* Get short version/alias for a browser name
*
* @example
* getBrowserAlias('edge') // Microsoft Edge
*
* @param {string} browserAlias
* @return {string}
*/
static getBrowserTypeByAlias(e) {
return nt[e] || "";
}
}
const M = /version\/(\d+(\.?_?\d+)+)/i, Ct = [
/* Googlebot */
{
test: [/googlebot/i],
describe(r) {
const e = {
name: "Googlebot"
}, t = a.getFirstMatch(/googlebot\/(\d+(\.\d+))/i, r) || a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
/* Opera < 13.0 */
{
test: [/opera/i],
describe(r) {
const e = {
name: "Opera"
}, t = a.getFirstMatch(M, r) || a.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
/* Opera > 13.0 */
{
test: [/opr\/|opios/i],
describe(r) {
const e = {
name: "Opera"
}, t = a.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i, r) || a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
{
test: [/SamsungBrowser/i],
describe(r) {
const e = {
name: "Samsung Internet for Android"
}, t = a.getFirstMatch(M, r) || a.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/Whale/i],
describe(r) {
const e = {
name: "NAVER Whale Browser"
}, t = a.getFirstMatch(M, r) || a.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/MZBrowser/i],
describe(r) {
const e = {
name: "MZ Browser"
}, t = a.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i, r) || a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
{
test: [/focus/i],
describe(r) {
const e = {
name: "Focus"
}, t = a.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i, r) || a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
{
test: [/swing/i],
describe(r) {
const e = {
name: "Swing"
}, t = a.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i, r) || a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
{
test: [/coast/i],
describe(r) {
const e = {
name: "Opera Coast"
}, t = a.getFirstMatch(M, r) || a.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/opt\/\d+(?:.?_?\d+)+/i],
describe(r) {
const e = {
name: "Opera Touch"
}, t = a.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i, r) || a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
{
test: [/yabrowser/i],
describe(r) {
const e = {
name: "Yandex Browser"
}, t = a.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i, r) || a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
{
test: [/ucbrowser/i],
describe(r) {
const e = {
name: "UC Browser"
}, t = a.getFirstMatch(M, r) || a.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/Maxthon|mxios/i],
describe(r) {
const e = {
name: "Maxthon"
}, t = a.getFirstMatch(M, r) || a.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/epiphany/i],
describe(r) {
const e = {
name: "Epiphany"
}, t = a.getFirstMatch(M, r) || a.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/puffin/i],
describe(r) {
const e = {
name: "Puffin"
}, t = a.getFirstMatch(M, r) || a.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/sleipnir/i],
describe(r) {
const e = {
name: "Sleipnir"
}, t = a.getFirstMatch(M, r) || a.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/k-meleon/i],
describe(r) {
const e = {
name: "K-Meleon"
}, t = a.getFirstMatch(M, r) || a.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/micromessenger/i],
describe(r) {
const e = {
name: "WeChat"
}, t = a.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i, r) || a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
{
test: [/qqbrowser/i],
describe(r) {
const e = {
name: /qqbrowserlite/i.test(r) ? "QQ Browser Lite" : "QQ Browser"
}, t = a.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i, r) || a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
{
test: [/msie|trident/i],
describe(r) {
const e = {
name: "Internet Explorer"
}, t = a.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/\sedg\//i],
describe(r) {
const e = {
name: "Microsoft Edge"
}, t = a.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/edg([ea]|ios)/i],
describe(r) {
const e = {
name: "Microsoft Edge"
}, t = a.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/vivaldi/i],
describe(r) {
const e = {
name: "Vivaldi"
}, t = a.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/seamonkey/i],
describe(r) {
const e = {
name: "SeaMonkey"
}, t = a.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/sailfish/i],
describe(r) {
const e = {
name: "Sailfish"
}, t = a.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/silk/i],
describe(r) {
const e = {
name: "Amazon Silk"
}, t = a.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/phantom/i],
describe(r) {
const e = {
name: "PhantomJS"
}, t = a.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/slimerjs/i],
describe(r) {
const e = {
name: "SlimerJS"
}, t = a.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/blackberry|\bbb\d+/i, /rim\stablet/i],
describe(r) {
const e = {
name: "BlackBerry"
}, t = a.getFirstMatch(M, r) || a.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/(web|hpw)[o0]s/i],
describe(r) {
const e = {
name: "WebOS Browser"
}, t = a.getFirstMatch(M, r) || a.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/bada/i],
describe(r) {
const e = {
name: "Bada"
}, t = a.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/tizen/i],
describe(r) {
const e = {
name: "Tizen"
}, t = a.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i, r) || a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
{
test: [/qupzilla/i],
describe(r) {
const e = {
name: "QupZilla"
}, t = a.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i, r) || a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
{
test: [/firefox|iceweasel|fxios/i],
describe(r) {
const e = {
name: "Firefox"
}, t = a.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/electron/i],
describe(r) {
const e = {
name: "Electron"
}, t = a.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/MiuiBrowser/i],
describe(r) {
const e = {
name: "Miui"
}, t = a.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/chromium/i],
describe(r) {
const e = {
name: "Chromium"
}, t = a.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i, r) || a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
{
test: [/chrome|crios|crmo/i],
describe(r) {
const e = {
name: "Chrome"
}, t = a.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
{
test: [/GSA/i],
describe(r) {
const e = {
name: "Google Search"
}, t = a.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
/* Android Browser */
{
test(r) {
const e = !r.test(/like android/i), t = r.test(/android/i);
return e && t;
},
describe(r) {
const e = {
name: "Android Browser"
}, t = a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
/* PlayStation 4 */
{
test: [/playstation 4/i],
describe(r) {
const e = {
name: "PlayStation 4"
}, t = a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
/* Safari */
{
test: [/safari|applewebkit/i],
describe(r) {
const e = {
name: "Safari"
}, t = a.getFirstMatch(M, r);
return t && (e.version = t), e;
}
},
/* Something else */
{
test: [/.*/i],
describe(r) {
const e = /^(.*)\/(.*) /, t = /^(.*)\/(.*)[ \t]\((.*)/, s = r.search("\\(") !== -1 ? t : e;
return {
name: a.getFirstMatch(s, r),
version: a.getSecondMatch(s, r)
};
}
}
], Ot = [
/* Roku */
{
test: [/Roku\/DVP/],
describe(r) {
const e = a.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i, r);
return {
name: B.Roku,
version: e
};
}
},
/* Windows Phone */
{
test: [/windows phone/i],
describe(r) {
const e = a.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i, r);
return {
name: B.WindowsPhone,
version: e
};
}
},
/* Windows */
{
test: [/windows /i],
describe(r) {
const e = a.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i, r), t = a.getWindowsVersionName(e);
return {
name: B.Windows,
version: e,
versionName: t
};
}
},
/* Firefox on iPad */
{
test: [/Macintosh(.*?) FxiOS(.*?)\//],
describe(r) {
const e = {
name: B.iOS
}, t = a.getSecondMatch(/(Version\/)(\d[\d.]+)/, r);
return t && (e.version = t), e;
}
},
/* macOS */
{
test: [/macintosh/i],
describe(r) {
const e = a.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i, r).replace(/[_\s]/g, "."), t = a.getMacOSVersionName(e), i = {
name: B.MacOS,
version: e
};
return t && (i.versionName = t), i;
}
},
/* iOS */
{
test: [/(ipod|iphone|ipad)/i],
describe(r) {
const e = a.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i, r).replace(/[_\s]/g, ".");
return {
name: B.iOS,
version: e
};
}
},
/* Android */
{
test(r) {
const e = !r.test(/like android/i), t = r.test(/android/i);
return e && t;
},
describe(r) {
const e = a.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i, r), t = a.getAndroidVersionName(e), i = {
name: B.Android,
version: e
};
return t && (i.versionName = t), i;
}
},
/* WebOS */
{
test: [/(web|hpw)[o0]s/i],
describe(r) {
const e = a.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i, r), t = {
name: B.WebOS
};
return e && e.length && (t.version = e), t;
}
},
/* BlackBerry */
{
test: [/blackberry|\bbb\d+/i, /rim\stablet/i],
describe(r) {
const e = a.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i, r) || a.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i, r) || a.getFirstMatch(/\bbb(\d+)/i, r);
return {
name: B.BlackBerry,
version: e
};
}
},
/* Bada */
{
test: [/bada/i],
describe(r) {
const e = a.getFirstMatch(/bada\/(\d+(\.\d+)*)/i, r);
return {
name: B.Bada,
version: e
};
}
},
/* Tizen */
{
test: [/tizen/i],
describe(r) {
const e = a.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i, r);
return {
name: B.Tizen,
version: e
};
}
},
/* Linux */
{
test: [/linux/i],
describe() {
return {
name: B.Linux
};
}
},
/* Chrome OS */
{
test: [/CrOS/],
describe() {
return {
name: B.ChromeOS
};
}
},
/* Playstation 4 */
{
test: [/PlayStation 4/],
describe(r) {
const e = a.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i, r);
return {
name: B.PlayStation4,
version: e
};
}
}
], Lt = [
/* Googlebot */
{
test: [/googlebot/i],
describe() {
return {
type: "bot",
vendor: "Google"
};
}
},
/* Huawei */
{
test: [/huawei/i],
describe(r) {
const e = a.getFirstMatch(/(can-l01)/i, r) && "Nova", t = {
type: R.mobile,
vendor: "Huawei"
};
return e && (t.model = e), t;
}
},
/* Nexus Tablet */
{
test: [/nexus\s*(?:7|8|9|10).*/i],
describe() {
return {
type: R.tablet,
vendor: "Nexus"
};
}
},
/* iPad */
{
test: [/ipad/i],
describe() {
return {
type: R.tablet,
vendor: "Apple",
model: "iPad"
};
}
},
/* Firefox on iPad */
{
test: [/Macintosh(.*?) FxiOS(.*?)\//],
describe() {
return {
type: R.tablet,
vendor: "Apple",
model: "iPad"
};
}
},
/* Amazon Kindle Fire */
{
test: [/kftt build/i],
describe() {
return {
type: R.tablet,
vendor: "Amazon",
model: "Kindle Fire HD 7"
};
}
},
/* Another Amazon Tablet with Silk */
{
test: [/silk/i],
describe() {
return {
type: R.tablet,
vendor: "Amazon"
};
}
},
/* Tablet */
{
test: [/tablet(?! pc)/i],
describe() {
return {
type: R.tablet
};
}
},
/* iPod/iPhone */
{
test(r) {
const e = r.test(/ipod|iphone/i), t = r.test(/like (ipod|iphone)/i);
return e && !t;
},
describe(r) {
const e = a.getFirstMatch(/(ipod|iphone)/i, r);
return {
type: R.mobile,
vendor: "Apple",
model: e
};
}
},
/* Nexus Mobile */
{
test: [/nexus\s*[0-6].*/i, /galaxy nexus/i],
describe() {
return {
type: R.mobile,
vendor: "Nexus"
};
}
},
/* Mobile */
{
test: [/[^-]mobi/i],
describe() {
return {
type: R.mobile
};
}
},
/* BlackBerry */
{
test(r) {
return r.getBrowserName(!0) === "blackberry";
},
describe() {
return {
type: R.mobile,
vendor: "BlackBerry"
};
}
},
/* Bada */
{
test(r) {
return r.getBrowserName(!0) === "bada";
},
describe() {
return {
type: R.mobile
};
}
},
/* Windows Phone */
{
test(r) {
return r.getBrowserName() === "windows phone";
},
describe() {
return {
type: R.mobile,
vendor: "Microsoft"
};
}
},
/* Android Tablet */
{
test(r) {
const e = Number(String(r.getOSVersion()).split(".")[0]);
return r.getOSName(!0) === "android" && e >= 3;
},
describe() {
return {
type: R.tablet
};
}
},
/* Android Mobile */
{
test(r) {
return r.getOSName(!0) === "android";
},
describe() {
return {
type: R.mobile
};
}
},
/* desktop */
{
test(r) {
return r.getOSName(!0) === "macos";
},
describe() {
return {
type: R.desktop,
vendor: "Apple"
};
}
},
/* Windows */
{
test(r) {
return r.getOSName(!0) === "windows";
},
describe() {
return {
type: R.desktop
};
}
},
/* Linux */
{
test(r) {
return r.getOSName(!0) === "linux";
},
describe() {
return {
type: R.desktop
};
}
},
/* PlayStation 4 */
{
test(r) {
return r.getOSName(!0) === "playstation 4";
},
describe() {
return {
type: R.tv
};
}
},
/* Roku */
{
test(r) {
return r.getOSName(!0) === "roku";
},
describe() {
return {
type: R.tv
};
}
}
], Nt = [
/* EdgeHTML */
{
test(r) {
return r.getBrowserName(!0) === "microsoft edge";
},
describe(r) {
if (/\sedg\//i.test(r))
return {
name: U.Blink
};
const t = a.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i, r);
return {
name: U.EdgeHTML,
version: t
};
}
},
/* Trident */
{
test: [/trident/i],
describe(r) {
const e = {
name: U.Trident
}, t = a.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
/* Presto */
{
test(r) {
return r.test(/presto/i);
},
describe(r) {
const e = {
name: U.Presto
}, t = a.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
/* Gecko */
{
test(r) {
const e = r.test(/gecko/i), t = r.test(/like gecko/i);
return e && !t;
},
describe(r) {
const e = {
name: U.Gecko
}, t = a.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
},
/* Blink */
{
test: [/(apple)?webkit\/537\.36/i],
describe() {
return {
name: U.Blink
};
}
},
/* WebKit */
{
test: [/(apple)?webkit/i],
describe(r) {
const e = {
name: U.WebKit
}, t = a.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i, r);
return t && (e.version = t), e;
}
}
];
class Xe {
/**
* Create instance of Parser
*
* @param {String} UA User-Agent string
* @param {Boolean} [skipParsing=false] parser can skip parsing in purpose of performance
* improvements if you need to make a more particular parsing
* like {@link Parser#parseBrowser} or {@link Parser#parsePlatform}
*
* @throw {Error} in case of empty UA String
*
* @constructor
*/
constructor(e, t = !1) {
if (e == null || e === "")
throw new Error("UserAgent parameter can't be empty");
this._ua = e, this.parsedResult = {}, t !== !0 && this.parse();
}
/**
* Get UserAgent string of current Parser instance
* @return {String} User-Agent String of the current <Parser> object
*
* @public
*/
getUA() {
return this._ua;
}
/**
* Test a UA string for a regexp
* @param {RegExp} regex
* @return {Boolean}
*/
test(e) {
return e.test(this._ua);
}
/**
* Get parsed browser object
* @return {Object}
*/
parseBrowser() {
this.parsedResult.browser = {};
const e = a.find(Ct, (t) => {
if (typeof t.test == "function")
return t.test(this);
if (t.test instanceof Array)
return t.test.some((i) => this.test(i));
throw new Error("Browser's test function is not valid");
});
return e && (this.parsedResult.browser = e.describe(this.getUA())), this.parsedResult.browser;
}
/**
* Get parsed browser object
* @return {Object}
*
* @public
*/
getBrowser() {
return this.parsedResult.browser ? this.parsedResult.browser : this.parseBrowser();
}
/**
* Get browser's name
* @return {String} Browser's name or an empty string
*
* @public
*/
getBrowserName(e) {
return e ? String(this.getBrowser().name).toLowerCase() || "" : this.getBrowser().name || "";
}
/**
* Get browser's version
* @return {String} version of browser
*
* @public
*/
getBrowserVersion() {
return this.getBrowser().version;
}
/**
* Get OS
* @return {Object}
*
* @example
* this.getOS();
* {
* name: 'macOS',
* version: '10.11.12'
* }
*/
getOS() {
return this.parsedResult.os ? this.parsedResult.os : this.parseOS();
}
/**
* Parse OS and save it to this.parsedResult.os
* @return {*|{}}
*/
parseOS() {
this.parsedResult.os = {};
const e = a.find(Ot, (t) => {
if (typeof t.test == "function")
return t.test(this);
if (t.test instanceof Array)
return t.test.some((i) => this.test(i));
throw new Error("Browser's test function is not valid");
});
return e && (this.parsedResult.os = e.describe(this.getUA())), this.parsedResult.os;
}
/**
* Get OS name
* @param {Boolean} [toLowerCase] return lower-cased value
* @return {String} name of the OS — macOS, Windows, Linux, etc.
*/
getOSName(e) {
const { name: t } = this.getOS();
return e ? String(t).toLowerCase() || "" : t || "";
}
/**
* Get OS version
* @return {String} full version with dots ('10.11.12', '5.6', etc)
*/
getOSVersion() {
return this.getOS().version;
}
/**
* Get parsed platform
* @return {{}}
*/
getPlatform() {
return this.parsedResult.platform ? this.parsedResult.platform : this.parsePlatform();
}
/**
* Get platform name
* @param {Boolean} [toLowerCase=false]
* @return {*}
*/
getPlatformType(e = !1) {
const { type: t } = this.getPlatform();
return e ? String(t).toLowerCase() || "" : t || "";
}
/**
* Get parsed platform
* @return {{}}
*/
parsePlatform() {
this.parsedResult.platform = {};
const e = a.find(Lt, (t) => {
if (typeof t.test == "function")
return t.test(this);
if (t.test instanceof Array)
return t.test.some((i) => this.test(i));
throw new Error("Browser's test function is not valid");
});
return e && (this.parsedResult.platform = e.describe(this.getUA())), this.parsedResult.platform;
}
/**
* Get parsed engine
* @return {{}}
*/
getEngine() {
return this.parsedResult.engine ? this.parsedResult.engine : this.parseEngine();
}
/**
* Get engines's name
* @return {String} Engines's name or an empty string
*
* @public
*/
getEngineName(e) {
return e ? String(this.getEngine().name).toLowerCase() || "" : this.getEngine().name || "";
}
/**
* Get parsed platform
* @return {{}}
*/
parseEngine() {
this.parsedResult.engine = {};
const e = a.find(Nt, (t) => {
if (typeof t.test == "function")
return t.test(this);
if (t.test instanceof Array)
return t.test.some((i) => this.test(i));
throw new Error("Browser's test function is not valid");
});
return e && (this.parsedResult.engine = e.describe(this.getUA())), this.parsedResult.engine;
}
/**
* Parse full information about the browser
* @returns {Parser}
*/
parse() {
return this.parseBrowser(), this.parseOS(), this.parsePlatform(), this.parseEngine(), this;
}
/**
* Get parsed result
* @return {ParsedResult}
*/
getResult() {
return a.assign({}, this.parsedResult);
}
/**
* Check if parsed browser matches certain conditions
*
* @param {Object} checkTree It's one or two layered object,
* which can include a platform or an OS on the first layer
* and should have browsers specs on the bottom-laying layer
*
* @returns {Boolean|undefined} Whether the browser satisfies the set conditions or not.
* Returns `undefined` when the browser is no described in the checkTree object.
*
* @example
* const browser = Bowser.getParser(window.navigator.userAgent);
* if (browser.satisfies({chrome: '>118.01.1322' }))
* // or with os
* if (browser.satisfies({windows: { chrome: '>118.01.1322' } }))
* // or with platforms
* if (browser.satisfies({desktop: { chrome: '>118.01.1322' } }))
*/
satisfies(e) {
const t = {};
let i = 0;
const s = {};
let l = 0;
if (Object.keys(e).forEach((m) => {
const p = e[m];
typeof p == "string" ? (s[m] = p, l += 1) : typeof p == "object" && (t[m] = p, i += 1);
}), i > 0) {
const m = Object.keys(t), p = a.find(m, (k) => this.isOS(k));
if (p) {
const k = this.satisfies(t[p]);
if (k !== void 0)
return k;
}
const S = a.find(
m,
(k) => this.isPlatform(k)
);
if (S) {
const k = this.satisfies(t[S]);
if (k !== void 0)
return k;
}
}
if (l > 0) {
const m = Object.keys(s), p = a.find(m, (S) => this.isBrowser(S, !0));
if (p !== void 0)
return this.compareVersion(s[p]);
}
}
/**
* Check if the browser name equals the passed string
* @param browserName The string to compare with the browser name
* @param [includingAlias=false] The flag showing whether alias will be included into comparison
* @returns {boolean}
*/
isBrowser(e, t = !1) {
const i = this.getBrowserName().toLowerCase();
let s = e.toLowerCase();
const l = a.getBrowserTypeByAlias(s);
return t && l && (s = l.toLowerCase()), s === i;
}
compareVersion(e) {
let t = [0], i = e, s = !1;
const l = this.getBrowserVersion();
if (typeof l == "string")
return e[0] === ">" || e[0] === "<" ? (i = e.substr(1), e[1] === "=" ? (s = !0, i = e.substr(2)) : t = [], e[0] === ">" ? t.push(1) : t.push(-1)) : e[0] === "=" ? i = e.substr(1) : e[0] === "~" && (s = !0, i = e.substr(1)), t.indexOf(
a.compareVersions(l, i, s)
) > -1;
}
isOS(e) {
return this.getOSName(!0) === String(e).toLowerCase();
}
isPlatform(e) {
return this.getPlatformType(!0) === String(e).toLowerCase();
}
isEngine(e) {
return this.getEngineName(!0) === String(e).toLowerCase();
}
/**
* Is anything? Check if the browser is called "anything",
* the OS called "anything" or the platform called "anything"
* @param {String} anything
* @param [includingAlias=false] The flag showing whether alias will be included into comparison
* @returns {Boolean}
*/
is(e, t = !1) {
return this.isBrowser(e, t) || this.isOS(e) || this.isPlatform(e);
}
/**
* Check if any of the given values satisfies this.is(anything)
* @param {String[]} anythings
* @returns {Boolean}
*/
some(e = []) {
return e.some((t) => this.is(t));
}
}
/*!
* Bowser - a browser detector
* https://github.com/lancedikson/bowser
* MIT License | (c) Dustin Diaz 2012-2015
* MIT License | (c) Denis Demchenko 2015-2019
*/
class _t {
/**
* Creates a {@link Parser} instance
*
* @param {String} UA UserAgent string
* @param {Boolean} [skipParsing=false] Will make the Parser postpone parsing until you ask it
* explicitly. Same as `skipParsing` for {@link Parser}.
* @returns {Parser}
* @throws {Error} when UA is not a String
*
* @example
* const parser = Bowser.getParser(window.navigator.userAgent);
* const result = parser.getResult();
*/
static getParser(e, t = !1) {
if (typeof e != "string")
throw new Error("UserAgent should be a string");
return new Xe(e, t);
}
/**
* Creates a {@link Parser} instance and runs {@link Parser.getResult} immediately
*
* @param UA
* @return {ParsedResult}
*
* @example
* const result = Bowser.parse(window.navigator.userAgent);
*/
static parse(e) {
return new Xe(e).getResult();
}
static get BROWSER_MAP() {
return nt;
}
static get ENGINE_MAP() {
return U;
}
static get OS_MAP() {
return B;
}
static get PLATFORMS_MAP() {
return R;
}
}
function O() {
const { host: r, hostname: e, href: t, protocol: i, origin: s, port: l, pathname: h, search: m, hash: p } = window.location, { width: S, height: k } = window.screen, { language: F, userAgent: n } = navigator;
return {
host: r,
hostname: e,
href: t,
protocol: i,
origin: s,
port: l,
pathname: h,
search: m,
hash: p,
title: document.title,
language: F.substr(0, 2),
userAgent: It(n),
winScreen: `${S}x${k}`,
docScreen: `${document.documentElement.clientWidth ?? document.body.clientWidth}x${document.documentElement.clientHeight ?? document.body.clientHeight}`
};
}
function It(r) {
const e = _t.parse(r), t = Pt(r), i = e.browser.name ?? t.browser.name, s = e.browser.version ?? t.browser.version, l = e.os.name ?? t.os.name, h = t.os.version ?? e.os.version, m = e.platform.type ?? t.device.type, p = e.platform.vendor ?? t.device.vendor ?? "", S = e.platform.model ?? t.device.model ?? "", k = e.engine.name ?? t.engine.name, F = e.engine.version ?? t.engine.version;
return {
browserName: i,
browserVersion: s,
osName: l,
osVersion: h,
deviceType: m,
deviceVendor: p,
deviceModel: S,
engineName: k,
engineVersion: F
};
}
function z(r) {
const e = r.getFullYear(), t = (r.getMonth() + 1).toString().padStart(2, "0"), i = r.getDate().toString().padStart(2, "0"), s = r.getHours().toString().padStart(2, "0"), l = r.getMinutes().toString().padStart(2, "0"), h = r.getSeconds().toString().padStart(2, "0");
return `${e}年${t}月${i}日${s}时${l}分${h}秒`;
}
function ot(r) {
document.readyState === "complete" ? setTimeout(r) : window.addEventListener("load", r, { once: !0, capture: !0 });
}
function at(r) {
if ("XMLHttpRequest" in window && typeof window.XMLHttpRequest == "function") {
const e = window.XMLHttpRequest;
window.oXMLHttpRequest || (window.oXMLHttpRequest = e), window.XMLHttpRequest = function() {
const t = new e(), { open: i, send: s } = t;
let l = {};
return t.open = (h, m) => {
l.method = h, l.url = m, i.call(t, h, m, !0);
}, t.send = (h) => {
l.body = h ?? "", l.requestTime = (/* @__PURE__ */ new Date()).getTime(), l.requestTimeFormat = z(/* @__PURE__ */ new Date()), s.call(t, h);
}, t.addEventListener("loadend", () => {
const { status: h, statusText: m, response: p } = t;
l = {
...l,
status: h,
statusText: m,
response: p && JSON.parse(p),
responseTime: (/* @__PURE__ */ new Date()).getTime(),
responseTimeFormat: z(/* @__PURE__ */ new Date())
}, typeof r == "function" && r(l);
}), t;
};
}
}
function ct(r) {
if ("fetch" in window && typeof window.fetch == "function") {
const e = window.fetch;
window.oFetch || (window.oFetch = e), window.fetch = async (t, i) => {
let s = {};
return s.method = (i == null ? void 0 : i.method) ?? "", s.url = (t && typeof t != "string" ? t == null ? void 0 : t.url : t) || "", s.body = (i == null ? void 0 : i.body) ?? "", s.requestTime = (/* @__PURE__ */ new Date()).getTime(), s.responseTimeFormat = z(/* @__PURE__ */ new Date()), e.call(window, t, i).then(async (l) => {
const h = l.clone();
return s = {
...s,
status: h.status,
statusText: h.statusText,
response: h.text() ?? JSON.parse(await h.text()),
responseTime: (/* @__PURE__ */ new Date()).getTime()
}, typeof r == "function" && r(s), l;
});
};
}
}
class Dt {
constructor(e, t, i) {
x(this, "options");
x(this, "submitErrorUids");
x(this, "report");
x(this, "trackerInstance");
this.options = Object.assign(
{
js: !0,
resource: !0,
promise: !0,
cors: !0,
http: !0
},
e
), this.submitErrorUids = [], this.report = t, this.trackerInstance = i, this.installErrorInnerTracker();
}
initJSError() {
window.addEventListener(
"error",
(e) => {
var i, s;
if (Ee(e) !== A.JS) return;
const t = {
errorUid: te(`${A.JS}-${e.message}-${e.filename}`),
mechanismType: A.JS,
type: ((i = e.error) == null ? void 0 : i.name) ?? "UnKnowun",
errorMessage: e.message,
meta: {
file: e.filename,
row: e.lineno,
col: e.colno
},
errorStack: Ge(e.error),
hehaviorStack: (s = this.trackerInstance.userActionTracker) == null ? void 0 : s.hehaviorStack.get(),
pageInformation: O()
};
this.errorDataReportHandler(t);
},
!0
);
}
initResourceError() {
window.addEventListener(
"error",
(e) => {
var s;
if (Ee(e) !== A.RS) return;
const t = e.target, i = {
errorUid: te(`${A.RS}-${t.src}-${t.tagName}`),
mechanismType: A.RS,
type: "RessourceError",
errorMessage: "",
meta: {
url: t.src,
html: t.outerHTML,
type: t.tagName
},
hehaviorStack: (s = this.trackerInstance.userActionTracker) == null ? void 0 : s.hehaviorStack.get(),
pageInformation: O()
};
this.errorDataReportHandler(i);
},
!0
);
}
initPromiseError() {
window.addEventListener(
"unhandledrejection",
(e) => {
var i, s, l;
const t = {
errorUid: te(
`${A.PM}-${e.reason.message ?? e.reason}-${e.reason.name ?? "UnKnown"}`
),
mechanismType: A.PM,
type: ((i = e.reason) == null ? void 0 : i.name) ?? "UnKnown",
errorMessage: ((s = e.reason) == null ? void 0 : s.message) ?? e.reason,
meta: {},
errorStack: Ge(e.reason),
hehaviorStack: (l = this.trackerInstance.userActionTracker) == null ? void 0 : l.hehaviorStack.get(),
pageInformation: O()
};
this.errorDataReportHandler(t);
},
!0
);
}
initHttpError() {
const e = (t) => {
var s;
if (t.status < 400) return;
const i = {
errorUid: te(`${A.HP}-${t.response}-${t.statusText}`),
mechanismType: A.HP,
type: "HTTPError",
errorMessage: t.response,
meta: {
...t
},
hehaviorStack: (s = this.trackerInstance.userActionTracker) == null ? void 0 : s.hehaviorStack.get(),
pageInformation: O()
};
this.errorDataReportHandler(i);
};
at(e), ct(e);
}
initCorsError() {
window.addEventListener(
"error",
(e) => {
var i;
if (Ee(e) !== A.CS) return;
const t = {
errorUid: te(`${A.CS}-${e.message}`),
mechanismType: A.CS,
type: "CorsError",
errorMessage: e.message,
meta: {},
hehaviorStack: (i = this.trackerInstance.userActionTracker) == null ? void 0 : i.hehaviorStack.get(),
pageInformation: O()
};
this.errorDataReportHandler(t);
},
!0
);
}
installErrorInnerTracker() {
this.options.js && this.initJSError(), this.options.resource && this.initResourceError(), this.options.promise && this.initPromiseError(), this.options.http && this.initHttpError(), this.options.cors && this.initCorsError();
}
errorDataReportHandler(e) {
this.submitErrorUids.includes(e.errorUid) || (this.submitErrorUids.push(e.errorUid), this.report(e, "error"));
}
}
var Ae, dt = -1, ie = function(r) {
addEventListener("pageshow", function(e) {
e.persisted && (dt = e.timeStamp, r(e));
}, !0);
}, ut = function() {
var r = self.performance && performance.getEntriesByType && performance.getEntriesByType("navigation")[0];
if (r && r.responseStart > 0 && r.responseStart < performance.now()) return r;
}, Fe = function() {
var r = ut();
return r && r.activationStart || 0;
}, j = function(r, e) {
var t = ut(), i = "navigate";
return dt >= 0 ? i = "back-forward-cache" : t && (document.prerendering || Fe() > 0 ? i = "prerender" : document.wasDiscarded ? i = "restore" : t.type && (i = t.type.replace(/_/g, "-"))), { name: r, value: e === void 0 ? -1 : e, rating: "good", delta: 0, entries: [], id: "v4-".concat(Date.now(), "-").concat(Math.floor(8999999999999 * Math.random()) + 1e12), navigationType: i };
}, se = function(r, e, t) {
try {
if (PerformanceObserver.supportedEntryTypes.includes(r)) {
var i = new PerformanceObserver(function(s) {
Promise.resolve().then(function() {
e(s.getEntries());
});
});
return i.observe(Object.assign({ type: r, buffered: !0 }, t || {})), i;
}
} catch {
}
}, W = function(r, e, t, i) {
var s, l;
return function(h) {
e.value >= 0 && (h || i) && ((l = e.value - (s || 0)) || s === void 0) && (s = e.value, e.delta = l, e.rating = function(m, p) {
return m > p[1] ? "poor" : m > p[0] ? "needs-improvement" : "good";
}(e.value, t), r(e));
};
}, Pe = function(r) {
requestAnimationFrame(function() {
return requestAnimationFrame(function() {
return r();
});
});
}, we = function(r) {
document.addEventListener("visibilitychange", function() {
document.visibilityState === "hidden" && r();
});
}, Be = function(r) {
var e = !1;
return function() {
e || (r(), e = !0);
};
}, X = -1, Ke = function() {
return document.visibilityState !== "hidden" || document.prerendering ? 1 / 0 : 0;
}, fe = function(r) {
document.visibilityState === "hidden" && X > -1 && (X = r.type === "visibilitychange" ? r.timeStamp : 0, qt());
}, Qe = function() {
addEventListener("visibilitychange", fe, !0), addEventListener("prerenderingchange", fe, !0);
}, qt = function() {
removeEventListener("visibilitychange", fe, !0), removeEventListener("prerenderingchange", fe, !0);
}, lt = function() {
return X < 0 && (X = Ke(), Qe(), ie(function() {
setTimeout(function() {
X = Ke(), Qe();
}, 0);
})), { get firstHiddenTime() {
return X;
} };
}, Ce = function(r) {
document.prerendering ? addEventListener("prerenderingchange", function() {
return r();
}, !0) : r();
}, Ze = [1800, 3e3], ht = function(r, e) {
e = e || {}, Ce(function() {
var t, i = lt(), s = j("FCP"), l = se("paint", function(h) {
h.forEach(function(m) {
m.name === "first-contentful-paint" && (l.disconnect(), m.startTime < i.firstHiddenTime && (s.value = Math.max(m.startTime - Fe(), 0), s.entries.push(m), t(!0)));
});
});
l && (t = W(r, s, Ze, e.reportAllChanges), ie(function(h) {
s = j("FCP"), t = W(r, s, Ze, e.reportAllChanges), Pe(function() {
s.value = performance.now() - h.timeStamp, t(!0);
});
}));
});
}, Ye = [0.1, 0.25], Ht = function(r, e) {
e = e || {}, ht(Be(function() {
var t, i = j("CLS", 0), s = 0, l = [], h = function(p) {
p.forEach(function(S) {
if (!S.hadRecentInput) {
var k = l[0], F = l[l.length - 1];
s && S.startTime - F.startTime < 1e3 && S.startTime - k.startTime < 5e3 ? (s += S.value, l.push(S)) : (s = S.value, l = [S]);
}
}), s > i.value && (i.value = s, i.entries = l, t());
}, m = se("layout-shift", h);
m && (t = W(r, i, Ye, e.reportAllChanges), we(function() {
h(m.takeRecords()), t(!0);
}), ie(function() {
s = 0, i = j("CLS", 0), t = W(r, i, Ye, e.reportAllChanges), Pe(function() {
return t();
});
}), setTimeout(t, 0));
}));
}, pt = 0, xe = 1 / 0, pe = 0, zt = function(r) {
r.forEach(function(e) {
e.interactionId && (xe = Math.min(xe, e.interactionId), pe = Math.max(pe, e.interactionId), pt = pe ? (pe - xe) / 7 + 1 : 0);
});
}, mt = function() {
return Ae ? pt : performance.interactionCount || 0;
}, Vt = function() {
"interactionCount" in performance || Ae || (Ae = se("event", zt, { type: "event", buffered: !0, durationThreshold: 0 }));
}, D = [], me = /* @__PURE__ */ new Map(), ft = 0, Ut = function() {
var r = Math.min(D.length - 1, Math.floor((mt() - ft) / 50));
return D[r];
}, jt = [], Wt = function(r) {
if (jt.forEach(function(s) {
return s(r);
}), r.interactionId || r.entryType === "first-input") {
var e = D[D.length - 1], t = me.get(r.interactionId);
if (t || D.length < 10 || r.duration > e.latency) {
if (t) r.duration > t.latency ? (t.entries = [r], t.latency = r.duration) : r.duration === t.latency && r.startTime === t.entries[0].startTime && t.entries.push(r);
else {
var i = { id: r.interactionId, latency: r.duration, entries: [r] };
me.set(i.id, i), D.push(i);
}
D.sort(function(s, l) {
return l.latency - s.latency;
}), D.length > 10 && D.splice(10).forEach(function(s) {
return me.delete(s.id);
});
}
}
}, wt = function(r) {
var e = self.requestIdleCallback || self.setTimeout, t = -1;
return r = Be(r), document.visibilityState === "hidden" ? r() : (t = e(r), we(r)), t;
}, $e = [200, 500], Gt = function(r, e) {
"PerformanceEventTiming" in self && "interactionId" in PerformanceEventTiming.prototype && (e = e || {}, Ce(function() {
var t;
Vt();
var i, s = j("INP"), l = function(m) {
wt(function() {
m.forEach(Wt);
var p = Ut();
p && p.latency !== s.value && (s.value = p.latency, s.entries = p.entries, i());
});
}, h = se("event", l, { durationThreshold: (t = e.durationThreshold) !== null && t !== void 0 ? t : 40 });
i = W(r, s, $e, e.reportAllChanges), h && (h.observe({ type: "first-input", buffered: !0 }), we(function() {
l(h.takeRecords()), i(!0);
}), ie(function() {
ft = mt(), D.length = 0, me.clear(), s = j("INP"), i = W(r, s, $e, e.reportAllChanges);
}));
}));
}, et = [2500, 4e3], Re = {}, Jt = function(r, e) {
e = e || {}, Ce(function() {
var t, i = lt(), s = j("LCP"), l = function(p) {
e.reportAllChanges || (p = p.slice(-1)), p.forEach(function(S) {
S.startTime < i.firstHiddenTime && (s.value = Math.max(S.startTime - Fe(), 0), s.entries = [S], t());
});
}, h = se("largest-contentful-paint", l);
if (h) {
t = W(r, s, et, e.reportAllChanges);
var m = Be(function() {
Re[s.id] || (l(h.takeRecords()), h.disconnect(), Re[s.id] = !0, t(!0));
});
["keydown", "click"].forEach(function(p) {
addEventListener(p, function() {
return wt(m);
}, { once: !0, capture: !0 });
}), we(m), ie(function(p) {
s = j("LCP"), t = W(r, s, et, e.reportAllChanges), Pe(function() {
s.value = performance.now() - p.timeStamp, Re[s.id] = !0, t(!0);
});
});
}
});
};
function Xt() {
const r = window.location.origin, {
domainLookupStart: e,
domainLookupEnd: t,
connectStart: i,
connectEnd: s,
secureConnectionStart: l,
requestStart: h,
responseStart: m,
responseEnd: p,
domInteractive: S,
loadEventStart: k,
domComplete: F,
fetchStart: n,
redirectCount: d,
redirectStart: o,
redirectEnd: c
} = performance.getEntriesByType("navigation")[0];
return {
DNS: {
start: e,
end: t,
value: t - e
},
TCP: {
start: i,
end: s,
value: l ? l - i : s - i
},
SSL: {
start: l ?? 0,
end: l ? s : 0,
value: l ? s - l : 0
},
TTFB: {
start: h,
end: m,
value: m - h
},
Trans: {
start: m,
end: p,
value: p - m
},
DomParse: {
start: p,
end: S,
value: S - p
},
DomReady: {
start: n,
end: F,
value: F - n
},
Res: {
start: p,
end: k,
value: k - p
},
Load: {
start: n,
end: k,
value: k - n
},
Redirect: {
start: o,
end: c,
value: c - o
},
RedirectCount: d,
navigationUrl: r
};
}
function Kt() {
return performance.getEntriesByType("resource").map((e) => {
const t = window.location.origin, {
name: i,
transferSize: s,
initiatorType: l,
startTime: h,
responseEnd: m,
domainLookupEnd: p,
domainLookupStart: S,
connectStart: k,
connectEnd: F,
secureConnectionStart: n,
responseStart: d,
requestStart: o,
redirectStart: c,
redirectEnd: u
} = e;
return {
resorceUrl: t,
name: i,
initiatorType: l,
transferSize: s,
start: h,
end: m,
DNS: p - S,
TCP: n ? n - k : F - k,
SSL: n ? F - n : 0,
TTFB: d - o,
Trans: m - o,
Redirect: u - c
};
});
}
function Qt() {
const r = window.location.origin, e = performance.getEntriesByType("resource");
let t = 0;
return e.forEach((i) => {
(i.deliveryType === "cache" || i.duration === 0 && i.transferSize !== 0) && t++;
}), {
cacheUrl: r,
cacheHitQuantity: t,
noCacheHitQuantity: e.length - t,
cacheHitRate: (t / e.length).toFixed(2)
};
}
class Zt {
constructor(e, t) {
x(this, "data");
x(this, "options");
x(this, "report");
this.data = {}, this.options = Object.assign(
{
FCP: !0,
LCP: !0,
CLS: !0,
INP: !0,
navigationTiming: !0,
resourceFlow: !0,
cacheData: !0
},
e
), this.report = t, this.installPerformanceInnerTracker(), this.performanceDataReportHandler();
}
initFCP() {
ht((e) => {
this.data[V.FCP] = {
name: e.name,
value: e.value,
rating: e.rating
};
});
}
initLCP() {
Jt((e) => {
this.data[V.LCP] = {
name: e.name,
value: e.value,
rating: e.rating
};
});
}
initINP() {
Gt((e) => {
this.data[V.INP] = {
name: e.name,
value: e.value,
rating: e.rating
};
});
}
initCLS() {
Ht((e) => {
this.data[V.CLS] = {
name: e.name,
value: e.value,
rating: e.rating
};
});
}
initNavigationTiming() {
const e = Xt();
this.data[V.NT] = e;
}
initResourceFlow() {
const e = Kt();
this.data[V.RF] = e;
}
initCacheData() {
const e = Qt();
this.data[V.CD] = e;
}
installPerformanceInnerTracker() {
this.options.FCP && this.initFCP(), this.options.LCP && this.initLCP(), this.options.FID && this.initINP(), this.options.CLS && this.initCLS(), ot(() => {
this.options.navigationTiming && this.initNavigationTiming(), this.options.resourceFlow && this.initResourceFlow(), this.options.cacheData && this.initCacheData();
});
}
performanceDataReportHandler() {
window.addEventListener("beforeunload", () => {
JSON.stringify(this.data) !== "{}" && (this.data.pageUrl = window.location.origin, this.report(this.data, "performance"));
});
}
}
function tt(r) {
window.addEventListener("pushState", (e) => r(e), !0), window.addEventListener("replaceState", (e) => r(e), !0), window.addEventListener("popstate", (e) => r(e), !0);
}
function Yt() {
history.pushState = rt("pushState"), history.replaceState = rt("replaceState");
}
function rt(r) {
const e = history[r];
return function(...t) {
const i = e.apply(history, t), s = new Event(r);
return window.dispatchEvent(s), i;
};
}
class $t {
constructor(e) {
x(this, "data");
x(this, "maxBehaviorRecords");
const { maxBehaviorRecords: t } = e;
this.maxBehaviorRecords = t, this.data = [];
}
push(e) {
this.length() === this.maxBehaviorRecords && this.shift(), this.data.push(e);
}
shift() {
return this.data.shift();
}
length() {
return this.data.length;
}
get() {
return this.data;
}
clear() {
this.data = [];
}
}
function it() {
return {
referrer: document.referrer,
type: performance.getEntriesByType("navigation")[0].type
};
}
function er(r, e) {
let t = r.target;
if (t.classList.contains(e))
return t;
{
let i = 2;
for (; t && i; ) {
if (t.classList && t.classList.contains(e))
return t;
t = t.parentNode, i--;
}
}
return !1;
}
class tr {
constructor(e, t) {
x(this, "data");
x(this, "options");
x(this, "elementTrackedList");
x(this, "classTrackedList");
x(this, "eventTrackedList");
x(this, "hehaviorStack");
x(this, "customActions");
x(this, "customActionsAcount");
x(this, "report");
this.data = {}, this.options = Object.assign(
{
PI: !0,
OI: !0,
RCR: !0,
DBR: !0,
HT: !0,
BS: !0,
PV: !0,
elementTrackedList: ["button", "div"],
classTrackedList: ["tracked"],
eventTrackedList: ["click"],
maxBehaviorRecords: 100
},
e
), this.elementTrackedList = this.options.elementTrackedList, this.classTrackedList = this.options.classTrackedList, this.eventTrackedList = this.options.eventTrackedList, this.hehaviorStack = new $t({
maxBehaviorRecords: this.options.maxBehaviorRecords
}), this.customActionsAcount = this.options.customAcount || 5, this.customActions = [], this.report = t, Yt(), window.sendData = this.sendDataCustom.bind(this), this.installUserActionInnerTracker(), this.userActionDataReportHandler();
}
initPageInformation() {
const e = O();
this.data[P.PI] = e;
}
initOriginInformation() {
const e = it();
this.data[P.OI] = e;
}
initRouterChange() {
tt((e) => {
const t = {
jumpType: e.type,
pageInfo: O(),
time: (/* @__PURE__ */ new Date()).getTime(),
timeFormat: z(/* @__PURE__ */ new Date())
};
this.data[P.RCR] ? this.data[P.RCR].push(t) : this.data[P.RCR] = [t];
const i = {
name: P.RCR,
page: O().pathname,
value: {
jumpType: e.type
},
time: (/* @__PURE__ */ new Date()).getTime(),
timeFormat: z(/* @__PURE__ */ new Date())
};
this.hehaviorStack.push(i);
});
}
initPV() {
const e = () => {
const t = {
pageInfo: O(),
originInformation: it()
};
this.report(t, "PV");
};
ot(e), tt(e);
}
initDomHandler() {
this.eventTrackedList.forEach((e) => {
window.addEventListener(
e,
(t) => {
var h, m, p;
let i = this.elementTrackedList.includes((m = (h = t.target) == null ? void 0 : h.tagName) == null ? void 0 : m.toLocaleLowerCase()) ? t.target : void 0;
if (i = i ?? Array.from((p = t.target) == null ? void 0 : p.classList).find((S) => {
const k = er(t, S);
return k ? this.classTrackedList.includes(k.className) : !1;
}) ? t.target : void 0, !i) return;
const s = {
tagInfo: {
id: i.id,
classList: Array.from(i.classList),
tagName: i.tagName,
text: i.textContent
},
pageInfo: O(),
time: (/* @__PURE__ */ new Date()).getTime(),
timeFormat: z(/* @__PURE__ */ new Date())
};
this.data[P.DBR] ? this.data[P.DBR][e] ? this.data[P.DBR][e].push(s) : this.data[P.DBR][e] = [s] : this.data[P.DBR] = { [e]: [s] };
const l = {
name: e,
page: O().pathname,
value: {
tagInfo: {
id: i.id,
classList: Array.from(i.classList),
tagName: i.tagName,
text: i.textContent
},
pageInfo: O()
},
time: (/* @__PURE__ */ new Date()).getTime(),
timeFormat: z(/* @__PURE__ */ new Date())
};
this.hehaviorStack.push(l);
},
!0
);
});
}
initHttpHandler() {
const e = (t) => {
this.data[P.HT] ? this.data[P.HT].push(t) : this.data[P.HT] = [t];
};
at(e), ct(e);
}
sendDataCustom(e) {
this.customActions.length === this.customActionsAcount ? (this.report(this.customActions, "custom") && (this.customActions.length = 0), this.customActions.length = 0) : this.customActions.push(e), this.hehaviorStack.push({
name: "custom",
page: O().pathname,
value: e,
time: (/* @__PURE__ */ new Date()).getTime(),
timeFormat: z(/* @__PURE__ */ new Date())
});
}
installUserActionInnerTracker() {
this.options.PI && this.initPageInformation(), this.options.OI && this.initOriginInformation(), this.options.RCR && this.initRouterChange(), this.options.DBR && this.initDomHandler(), this.options.PV && this.initPV(), this.options.HT && this.initHttpHandler();
}
userActionDataReportHandler() {
window.addEventListener("beforeunload", () => {
JSON.stringify(this.data) !== "{}" && this.report(this.data, "userAction"), this.options.BS && this.report(this.hehaviorStack.get(), "behaviorStack");
});
}
}
class ir {
constructor(e, t) {
x(this, "appId");
x(this, "uid");
x(this, "extra");
x(this, "options");
x(this, "performanceTracker");
x(this, "userActionTracker");
x(this, "errorTracker");
this.appId = e, this.options = Object.assign(
{
sdkVersion: st.version,
requestUrl: "http://localhost:3000",
performanceTracker: !0,
userActionTracker: !0,
errorTracker: !0
},
t
), window.userId = this.setUserId.bind(this), window.extra = this.setExtra.bind(this), this.installInnerTracker();
}
installInnerTracker() {
this.options.performanceTracker && (this.performanceTracker = new Zt(this.options.performanceTracker, this.report.bind(this))), this.options.userActionTracker && (this.userActionTracker = new tr(this.options.userActionTracker, this.report.bind(this))), this.options.errorTracker && (this.errorTracker = new Dt(this.options.errorTracker, this.report.bind(this), this));
}
report(e, t) {
const i = Object.assign(
{ data: e, type: t },
{
appId: this.appId,
uid: this.uid,
extra: this.extra,
time: (/* @__PURE__ */ new Date()).getTime(),
timeFormat: z(/* @__PURE__ */ new Date())
}
), s = new Blob([JSON.stringify(i)]);
return navigator.sendBeacon(this.options.requestUrl, s);
}
setUserId(e) {
this.uid = e;
}
setExtra(e) {
this.extra = e;
}
}
export {
ir as Tracker
};