@bigbinary/neeto-molecules 5.2.16 → 5.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/AuditLogs.js +33 -2
  2. package/dist/AuditLogs.js.map +1 -1
  3. package/dist/BrowserSupport.js +1 -1
  4. package/dist/DownloadMobileAppCallout.js +1 -1
  5. package/dist/FloatingActionMenu.js +1 -1
  6. package/dist/KeyboardShortcuts.js +1 -1
  7. package/dist/cjs/AuditLogs.js +33 -2
  8. package/dist/cjs/AuditLogs.js.map +1 -1
  9. package/dist/cjs/BrowserSupport.js +2 -2
  10. package/dist/cjs/BrowserSupport.js.map +1 -1
  11. package/dist/cjs/DownloadMobileAppCallout.js +2 -2
  12. package/dist/cjs/DownloadMobileAppCallout.js.map +1 -1
  13. package/dist/cjs/FloatingActionMenu.js +1 -1
  14. package/dist/cjs/KeyboardShortcuts.js +2 -2
  15. package/dist/cjs/KeyboardShortcuts.js.map +1 -1
  16. package/dist/cjs/v2/AuditLogs.js +33 -2
  17. package/dist/cjs/v2/AuditLogs.js.map +1 -1
  18. package/dist/cjs/v2/BrowserSupport.js +2 -2
  19. package/dist/cjs/v2/BrowserSupport.js.map +1 -1
  20. package/dist/cjs/v2/DownloadMobileAppCallout.js +2 -2
  21. package/dist/cjs/v2/DownloadMobileAppCallout.js.map +1 -1
  22. package/dist/cjs/v2/FloatingActionMenu.js +1 -1
  23. package/dist/cjs/v2/KeyboardShortcuts.js +2 -2
  24. package/dist/cjs/v2/KeyboardShortcuts.js.map +1 -1
  25. package/dist/cjs/v2/Metadata.js +12 -8
  26. package/dist/cjs/v2/Metadata.js.map +1 -1
  27. package/dist/cjs/v2/SessionEnvironment.js +6 -5
  28. package/dist/cjs/v2/SessionEnvironment.js.map +1 -1
  29. package/dist/v2/AuditLogs.js +33 -2
  30. package/dist/v2/AuditLogs.js.map +1 -1
  31. package/dist/v2/BrowserSupport.js +1 -1
  32. package/dist/v2/DownloadMobileAppCallout.js +1 -1
  33. package/dist/v2/FloatingActionMenu.js +1 -1
  34. package/dist/v2/KeyboardShortcuts.js +1 -1
  35. package/dist/v2/Metadata.js +12 -8
  36. package/dist/v2/Metadata.js.map +1 -1
  37. package/dist/v2/SessionEnvironment.js +6 -5
  38. package/dist/v2/SessionEnvironment.js.map +1 -1
  39. package/package.json +4 -3
  40. package/src/translations/en.json +17 -16
  41. package/dist/cjs/ua-parser-DN07nD-R.js +0 -1522
  42. package/dist/cjs/ua-parser-DN07nD-R.js.map +0 -1
  43. package/dist/ua-parser-BLkTkt4a.js +0 -1520
  44. package/dist/ua-parser-BLkTkt4a.js.map +0 -1
@@ -1,1520 +0,0 @@
1
- // Generated ESM version of ua-parser-js
2
- // DO NOT EDIT THIS FILE!
3
- // Source: /src/main/ua-parser.js
4
-
5
- /////////////////////////////////////////////////////////////////////////////////
6
- /* UAParser.js v2.0.10
7
- Copyright © 2012-2026 Faisal Salman <f@faisalman.com>
8
- AGPLv3 License *//*
9
- Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
10
- Supports browser & node.js environment.
11
- Demo : https://uaparser.dev
12
- Source : https://github.com/faisalman/ua-parser-js */
13
- /////////////////////////////////////////////////////////////////////////////////
14
-
15
- /* jshint esversion: 6 */
16
- /* globals window */
17
-
18
-
19
-
20
- //////////////
21
- // Constants
22
- /////////////
23
-
24
- var LIBVERSION = '2.0.10',
25
- UA_MAX_LENGTH = 500,
26
- USER_AGENT = 'user-agent',
27
- EMPTY = '',
28
- UNKNOWN = '?',
29
- TYPEOF = {
30
- FUNCTION : 'function',
31
- OBJECT : 'object',
32
- STRING : 'string',
33
- UNDEFINED : 'undefined'
34
- },
35
-
36
- // properties
37
- BROWSER = 'browser',
38
- CPU = 'cpu',
39
- DEVICE = 'device',
40
- ENGINE = 'engine',
41
- OS = 'os',
42
- RESULT = 'result',
43
-
44
- NAME = 'name',
45
- TYPE = 'type',
46
- VENDOR = 'vendor',
47
- VERSION = 'version',
48
- ARCHITECTURE= 'architecture',
49
- MAJOR = 'major',
50
- MODEL = 'model',
51
-
52
- // device types
53
- CONSOLE = 'console',
54
- MOBILE = 'mobile',
55
- TABLET = 'tablet',
56
- SMARTTV = 'smarttv',
57
- WEARABLE = 'wearable',
58
- XR = 'xr',
59
- EMBEDDED = 'embedded',
60
-
61
- // browser types
62
- FETCHER = 'fetcher',
63
- INAPP = 'inapp',
64
-
65
- // client hints
66
- BRANDS = 'brands',
67
- FORMFACTORS = 'formFactors',
68
- FULLVERLIST = 'fullVersionList',
69
- PLATFORM = 'platform',
70
- PLATFORMVER = 'platformVersion',
71
- BITNESS = 'bitness',
72
- CH = 'sec-ch-ua',
73
- CH_FULL_VER_LIST= CH + '-full-version-list',
74
- CH_ARCH = CH + '-arch',
75
- CH_BITNESS = CH + '-' + BITNESS,
76
- CH_FORM_FACTORS = CH + '-form-factors',
77
- CH_MOBILE = CH + '-' + MOBILE,
78
- CH_MODEL = CH + '-' + MODEL,
79
- CH_PLATFORM = CH + '-' + PLATFORM,
80
- CH_PLATFORM_VER = CH_PLATFORM + '-version',
81
- CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],
82
-
83
- // device vendors
84
- AMAZON = 'Amazon',
85
- APPLE = 'Apple',
86
- ASUS = 'ASUS',
87
- BLACKBERRY = 'BlackBerry',
88
- GOOGLE = 'Google',
89
- HUAWEI = 'Huawei',
90
- LENOVO = 'Lenovo',
91
- HONOR = 'Honor',
92
- LG = 'LG',
93
- MICROSOFT = 'Microsoft',
94
- MOTOROLA = 'Motorola',
95
- NVIDIA = 'Nvidia',
96
- ONEPLUS = 'OnePlus',
97
- OPPO = 'OPPO',
98
- SAMSUNG = 'Samsung',
99
- SHARP = 'Sharp',
100
- SONY = 'Sony',
101
- XIAOMI = 'Xiaomi',
102
- ZEBRA = 'Zebra',
103
-
104
- // browsers
105
- CHROME = 'Chrome',
106
- CHROMIUM = 'Chromium',
107
- CHROMECAST = 'Chromecast',
108
- EDGE = 'Edge',
109
- FIREFOX = 'Firefox',
110
- OPERA = 'Opera',
111
- FACEBOOK = 'Facebook',
112
- SOGOU = 'Sogou',
113
-
114
- PREFIX_MOBILE = 'Mobile ',
115
- SUFFIX_BROWSER = ' Browser',
116
-
117
- // os
118
- WINDOWS = 'Windows';
119
-
120
- var isWindow = typeof window !== TYPEOF.UNDEFINED,
121
- NAVIGATOR = (isWindow && window.navigator) ?
122
- window.navigator :
123
- undefined,
124
- NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ?
125
- NAVIGATOR.userAgentData :
126
- undefined;
127
-
128
- ///////////
129
- // Helper
130
- //////////
131
-
132
- var extend = function (defaultRgx, extensions) {
133
- var mergedRgx = {};
134
- var extraRgx = extensions;
135
- if (!isExtensions(extensions)) {
136
- extraRgx = {};
137
- for (var i in extensions) {
138
- for (var j in extensions[i]) {
139
- extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);
140
- }
141
- }
142
- }
143
- for (var k in defaultRgx) {
144
- mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];
145
- }
146
- return mergedRgx;
147
- },
148
- enumerize = function (arr) {
149
- var enums = {};
150
- for (var i=0; i<arr.length; i++) {
151
- enums[arr[i].toUpperCase()] = arr[i];
152
- }
153
- return enums;
154
- },
155
- has = function (str1, str2) {
156
- if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {
157
- for (var i in str1) {
158
- if (lowerize(str2) == lowerize(str1[i])) return true;
159
- }
160
- return false;
161
- }
162
- return isString(str1) ? lowerize(str2) == lowerize(str1) : false;
163
- },
164
- isExtensions = function (obj, deep) {
165
- for (var prop in obj) {
166
- return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
167
- }
168
- },
169
- isString = function (val) {
170
- return typeof val === TYPEOF.STRING;
171
- },
172
- itemListToArray = function (header) {
173
- if (!header) return undefined;
174
- var arr = [];
175
- var tokens = normalizeHeaderValue(header).split(',');
176
- for (var i = 0; i < tokens.length; i++) {
177
- if (tokens[i].indexOf(';') > -1) {
178
- var token = trim(tokens[i]).split(';v=');
179
- arr[i] = { brand : token[0], version : token[1] };
180
- } else {
181
- arr[i] = trim(tokens[i]);
182
- }
183
- }
184
- return arr;
185
- },
186
- lowerize = function (str) {
187
- return isString(str) ? str.toLowerCase() : str;
188
- },
189
- majorize = function (version) {
190
- return isString(version) ? strip(/[^\d\.]/g, version).split('.')[0] : undefined;
191
- },
192
- normalizeHeaderValue = function (str) {
193
- return isString(str) ? trim(strip(/\\?\"/g, str), UA_MAX_LENGTH) : undefined;
194
- },
195
- setProps = function (arr) {
196
- for (var i in arr) {
197
- if (!arr.hasOwnProperty(i)) continue;
198
-
199
- var propName = arr[i];
200
- if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {
201
- this[propName[0]] = propName[1];
202
- } else {
203
- this[propName] = undefined;
204
- }
205
- }
206
- return this;
207
- },
208
- strip = function (pattern, str) {
209
- return isString(str) ? str.replace(pattern, EMPTY) : str;
210
- },
211
- trim = function (str, len) {
212
- str = strip(/^\s\s*/, String(str));
213
- return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
214
- };
215
-
216
- ///////////////
217
- // Map helper
218
- //////////////
219
-
220
- var rgxMapper = function (ua, arrays) {
221
-
222
- if(!ua || !arrays) return;
223
-
224
- var i = 0, j, k, p, q, matches, match;
225
-
226
- // loop through all regexes maps
227
- while (i < arrays.length && !matches) {
228
-
229
- var regex = arrays[i], // even sequence (0,2,4,..)
230
- props = arrays[i + 1]; // odd sequence (1,3,5,..)
231
- j = k = 0;
232
-
233
- // try matching uastring with regexes
234
- while (j < regex.length && !matches) {
235
-
236
- if (!regex[j]) { break; }
237
- matches = regex[j++].exec(ua);
238
-
239
- if (!!matches) {
240
- for (p = 0; p < props.length; p++) {
241
- match = matches[++k];
242
- q = props[p];
243
- // check if given property is actually array
244
- if (typeof q === TYPEOF.OBJECT && q.length > 0) {
245
- if (q.length === 2) {
246
- if (typeof q[1] == TYPEOF.FUNCTION) {
247
- // assign modified match
248
- this[q[0]] = q[1].call(this, match);
249
- } else {
250
- // assign given value, ignore regex match
251
- this[q[0]] = q[1];
252
- }
253
- } else if (q.length >= 3) {
254
- // Check whether q[1] FUNCTION or REGEX
255
- if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {
256
- if (q.length > 3) {
257
- this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;
258
- } else {
259
- // call function (usually string mapper)
260
- this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
261
- }
262
- } else {
263
- if (q.length == 3) {
264
- // sanitize match using given regex
265
- this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
266
- } else if (q.length == 4) {
267
- this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
268
- } else if (q.length > 4) {
269
- this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : undefined;
270
- }
271
- }
272
- }
273
- } else {
274
- this[q] = match ? match : undefined;
275
- }
276
- }
277
- }
278
- }
279
- i += 2;
280
- }
281
- },
282
-
283
- strTest = function (str, map) {
284
- return map.test.test(str) ? map.ifTrue : map.ifFalse;
285
- },
286
-
287
- strMapper = function (str, map) {
288
-
289
- for (var i in map) {
290
- // check if current value is array
291
- if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {
292
- for (var j = 0; j < map[i].length; j++) {
293
- if (has(map[i][j], str)) {
294
- return (i === UNKNOWN) ? undefined : i;
295
- }
296
- }
297
- } else if (has(map[i], str)) {
298
- return (i === UNKNOWN) ? undefined : i;
299
- }
300
- }
301
- return map.hasOwnProperty('*') ? map['*'] : str;
302
- };
303
-
304
- ///////////////
305
- // String map
306
- //////////////
307
-
308
- var windowsVersionMap = {
309
- 'ME' : '4.90',
310
- 'NT 3.51': '3.51',
311
- 'NT 4.0': '4.0',
312
- '2000' : ['5.0', '5.01'],
313
- 'XP' : ['5.1', '5.2'],
314
- 'Vista' : '6.0',
315
- '7' : '6.1',
316
- '8' : '6.2',
317
- '8.1' : '6.3',
318
- '10' : ['6.4', '10.0'],
319
- 'NT' : ''
320
- },
321
-
322
- formFactorsMap = {
323
- 'embedded' : 'Automotive',
324
- 'mobile' : 'Mobile',
325
- 'tablet' : ['Tablet', 'EInk'],
326
- 'smarttv' : 'TV',
327
- 'wearable' : 'Watch',
328
- 'xr' : ['VR', 'XR'],
329
- '?' : ['Desktop', 'Unknown'],
330
- '*' : undefined
331
- },
332
-
333
- browserHintsMap = {
334
- 'Chrome' : 'Google Chrome',
335
- 'Edge' : 'Microsoft Edge',
336
- 'Edge WebView2' : 'Microsoft Edge WebView2',
337
- 'Chrome WebView': 'Android WebView',
338
- 'Chrome Headless':'HeadlessChrome',
339
- 'Huawei Browser': 'HuaweiBrowser',
340
- 'MIUI Browser' : 'Miui Browser',
341
- 'Opera Mobi' : 'OperaMobile',
342
- 'Yandex' : 'YaBrowser'
343
- };
344
-
345
- //////////////
346
- // Regex map
347
- /////////////
348
-
349
- var defaultRegexes = {
350
-
351
- browser : [[
352
-
353
- // Most common regardless engine
354
- /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
355
- ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [
356
- /webview.+edge\/([\w\.]+)/i // Microsoft Edge
357
- ], [VERSION, [NAME, EDGE+' WebView'], [TYPE, INAPP]], [
358
- /edg(?:e|ios|a)?\/([\w\.]+)/i
359
- ], [VERSION, [NAME, 'Edge']], [
360
-
361
- // Presto based
362
- /(opera mini)\/([-\w\.]+)/i, // Opera Mini
363
- /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i, // Opera Mobi/Tablet
364
- /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i // Opera
365
- ], [NAME, VERSION], [
366
- /opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0
367
- ], [VERSION, [NAME, OPERA+' Mini']], [
368
- /\bop(?:rg)?x\/([\w\.]+)/i // Opera GX
369
- ], [VERSION, [NAME, OPERA+' GX']], [
370
- /\bopr\/([\w\.]+)/i // Opera Webkit
371
- ], [VERSION, [NAME, OPERA]], [
372
-
373
- // Mixed
374
- /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i // Baidu
375
- ], [VERSION, [NAME, 'Baidu']], [
376
- /\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i // Maxthon
377
- ], [VERSION, [NAME, 'Maxthon']], [
378
- /(kindle)\/([\w\.]+)/i, // Kindle
379
- /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
380
- // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
381
- // Trident based
382
- /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
383
- /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
384
-
385
- // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon/HiBrowser
386
- /(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,
387
- // Atlas/Rekonq/Puffin/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
388
- /(brave)(?: chrome)?\/([\d\.]+)/i, // Brave
389
- /(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i, // Aloha/HeyTap/Ovi/115/Surf
390
- /(qwant)(?:ios|mobile)\/([\d\.]+)/i, // Qwant
391
- /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo
392
- ], [NAME, VERSION], [
393
- /quark(?:pc)?\/([-\w\.]+)/i // Quark
394
- ], [VERSION, [NAME, 'Quark']], [
395
- /\bddg\/([\w\.]+)/i // DuckDuckGo
396
- ], [VERSION, [NAME, 'DuckDuckGo']], [
397
- /(?:\buc? ?browser|(?:juc.+)ucweb| ucpc)[\/ ]?([\w\.]+)/i // UCBrowser
398
- ], [VERSION, [NAME, 'UCBrowser']], [
399
- /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
400
- /\bqbcore\/([\w\.]+).+microm/i,
401
- /micromessenger\/([\w\.]+)/i // WeChat
402
- ], [VERSION, [NAME, 'WeChat']], [
403
- /konqueror\/([\w\.]+)/i // Konqueror
404
- ], [VERSION, [NAME, 'Konqueror']], [
405
- /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
406
- ], [VERSION, [NAME, 'IE']], [
407
- /ya(?:search)?browser\/([\w\.]+)/i // Yandex
408
- ], [VERSION, [NAME, 'Yandex']], [
409
- /slbrowser\/([\w\.]+)/i // Smart Lenovo Browser
410
- ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [
411
- /(av(?:ast|g|ira))\/([\w\.]+)/i // Avast/AVG/Avira Secure Browser
412
- ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [
413
- /norton\/([\w\.]+)/i // Norton Private Browser
414
- ], [VERSION, [NAME, 'Norton Private' + SUFFIX_BROWSER]], [
415
- /\bfocus\/([\w\.]+)/i // Firefox Focus
416
- ], [VERSION, [NAME, FIREFOX+' Focus']], [
417
- / mms\/([\w\.]+)$/i // Opera Neon
418
- ], [VERSION, [NAME, OPERA+' Neon']], [
419
- / opt\/([\w\.]+)$/i // Opera Touch
420
- ], [VERSION, [NAME, OPERA+' Touch']], [
421
- /coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
422
- ], [VERSION, [NAME, 'Coc Coc']], [
423
- /dolfin\/([\w\.]+)/i // Dolphin
424
- ], [VERSION, [NAME, 'Dolphin']], [
425
- /coast\/([\w\.]+)/i // Opera Coast
426
- ], [VERSION, [NAME, OPERA+' Coast']], [
427
- /miuibrowser\/([\w\.]+)/i // MIUI Browser
428
- ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [
429
- /fxios\/([\w\.-]+)/i // Firefox for iOS
430
- ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [
431
- /\bqihoobrowser\/?([\w\.]*)/i // 360
432
- ], [VERSION, [NAME, '360']], [
433
- /\b(qq)\/([\w\.]+)/i // QQ
434
- ], [[NAME, /(.+)/, '$1Browser'], VERSION], [
435
- /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
436
- ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/VivoBrowser/PicoBrowser
437
- / HBPC\/([\w\.]+)/ // Huawei Browser
438
- ], [VERSION, [NAME, HUAWEI + SUFFIX_BROWSER]], [
439
- /samsungbrowser\/([\w\.]+)/i // Samsung Internet
440
- ], [VERSION, [NAME, SAMSUNG + ' Internet']], [
441
- /metasr[\/ ]?([\d\.]+)/i // Sogou Explorer
442
- ], [VERSION, [NAME, SOGOU + ' Explorer']], [
443
- /(sogou)mo\w+\/([\d\.]+)/i // Sogou Mobile
444
- ], [[NAME, SOGOU + ' Mobile'], VERSION], [
445
- /(electron)\/([\w\.]+) safari/i, // Electron-based App
446
- /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
447
- /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345
448
- ], [NAME, VERSION], [
449
- /(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i // LieBao Browser/Luakit/Rekonq/Steam
450
- ], [NAME], [
451
- /ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i // Iron / 360
452
- ], [VERSION, NAME], [
453
-
454
- // WebView
455
- /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
456
- ], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [
457
- /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
458
- /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
459
- /(daum)apps[\/ ]([\w\.]+)/i, // Daum App
460
- /safari (line)\/([\w\.]+)/i, // Line App for iOS
461
- /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
462
- /(alipay)client\/([\w\.]+)/i, // Alipay
463
- /(twitter)(?:and| f.+e\/([\w\.]+))/i, // Twitter
464
- /(bing)(?:web|sapphire)\/([\w\.]+)/i, // Bing
465
- /(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i // Instagram/Snapchat/Klarna
466
- ], [NAME, VERSION, [TYPE, INAPP]], [
467
- /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
468
- ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [
469
- /(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
470
- ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [
471
- /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
472
- ], [NAME, [TYPE, INAPP]], [
473
- /(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i // Zalo
474
- ], [[NAME, /(.+)/, 'Zalo'], VERSION, [TYPE, INAPP]], [
475
-
476
- /(chromium)[\/ ]([-\w\.]+)/i // Chromium
477
- ], [NAME, VERSION], [
478
-
479
- /ome-(lighthouse)$/i // Chrome Lighthouse
480
- ], [NAME, [TYPE, FETCHER]], [
481
-
482
- /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
483
- ], [VERSION, [NAME, CHROME+' Headless']], [
484
-
485
- /wv\).+chrome\/([\w\.]+).+edgw\//i // Edge WebView2
486
- ], [VERSION, [NAME, EDGE+' WebView2'], [TYPE, INAPP]], [
487
-
488
- /; wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
489
- ], [[NAME, CHROME+' WebView'], VERSION, [TYPE, INAPP]], [
490
-
491
- /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser
492
- ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [
493
-
494
- /chrome\/([\w\.]+) mobile/i // Chrome Mobile
495
- ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [
496
-
497
- /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
498
- ], [NAME, VERSION], [
499
-
500
- /version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i // Safari Mobile
501
- ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [
502
- /iphone .*mobile(?:\/\w+ | ?)safari/i
503
- ], [[NAME, PREFIX_MOBILE + 'Safari']], [
504
- /version\/([\w\.\,]+) .*(safari)/i // Safari
505
- ], [VERSION, NAME], [
506
- /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
507
- ], [NAME, [VERSION, '1']], [
508
-
509
- /(webkit|khtml)\/([\w\.]+)/i
510
- ], [NAME, VERSION], [
511
-
512
- // Gecko based
513
- /(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i // Firefox Mobile
514
- ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [
515
- /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
516
- ], [[NAME, 'Netscape'], VERSION], [
517
- /(wolvic|librewolf)\/([\w\.]+)/i // Wolvic/LibreWolf
518
- ], [NAME, VERSION], [
519
- /mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
520
- ], [VERSION, [NAME, FIREFOX+' Reality']], [
521
- /ekiohf.+(flow)\/([\w\.]+)/i, // Flow
522
- /(swiftfox)/i, // Swiftfox
523
- /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
524
- // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
525
- /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,
526
- // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
527
- /(firefox)\/([\w\.]+)/i, // Other Firefox-based
528
- /(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i, // Mozilla
529
-
530
- // Other
531
- /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
532
- // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird
533
- /\b(links) \(([\w\.]+)/i // Links
534
- ], [NAME, [VERSION, /_/g, '.']], [
535
-
536
- /(cobalt)\/([\w\.]+)/i // Cobalt
537
- ], [NAME, [VERSION, /[^\d\.]+./, EMPTY]]
538
- ],
539
-
540
- cpu : [[
541
-
542
- /\b((amd|x|x86[-_]?|wow|win)64)\b/i // AMD64 (x64)
543
- ], [[ARCHITECTURE, 'amd64']], [
544
-
545
- /(ia32(?=;))/i, // IA32 (quicktime)
546
- /\b((i[346]|x)86)(pc)?\b/i // IA32 (x86)
547
- ], [[ARCHITECTURE, 'ia32']], [
548
-
549
- /\b(aarch64|arm(v?[89]e?l?|_?64))\b/i // ARM64
550
- ], [[ARCHITECTURE, 'arm64']], [
551
-
552
- /\b(arm(v[67])?ht?n?[fl]p?)\b/i // ARMHF
553
- ], [[ARCHITECTURE, 'armhf']], [
554
-
555
- // PocketPC mistakenly identified as PowerPC
556
- /( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i
557
- ], [[ARCHITECTURE, 'arm']], [
558
-
559
- / sun4\w[;\)]/i // SPARC
560
- ], [[ARCHITECTURE, 'sparc']], [
561
- // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
562
- /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,
563
- /((ppc|powerpc)(64)?)( mac|;|\))/i, // PowerPC
564
- /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i // Alpha
565
- ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
566
- /mc680.0/i
567
- ], [[ARCHITECTURE, '68k']], [
568
- /winnt.+\[axp/i
569
- ], [[ARCHITECTURE, 'alpha']]
570
- ],
571
-
572
- device : [[
573
-
574
- //////////////////////////
575
- // MOBILES & TABLETS
576
- /////////////////////////
577
-
578
- // Samsung
579
- /\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
580
- ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
581
- /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
582
- /samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
583
- /sec-(sgh\w+)/i
584
- ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
585
-
586
- // Apple
587
- /(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i // iPod/iPhone
588
- ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
589
- /\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i, // iPad
590
- /\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i
591
- ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [
592
- /(macintosh);/i
593
- ], [MODEL, [VENDOR, APPLE]], [
594
-
595
- // Sharp
596
- /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
597
- ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
598
-
599
- // Honor
600
- /\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i
601
- ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [
602
- /honor([-\w ]+)[;\)]/i
603
- ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [
604
-
605
- // Huawei
606
- /\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i
607
- ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
608
- /(?:huawei) ?([-\w ]+)[;\)]/i,
609
- /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i
610
- ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
611
-
612
- // Xiaomi
613
- /oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
614
- /\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i // Mi Pad tablets
615
- ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
616
-
617
- /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
618
- /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
619
- // Xiaomi Redmi / POCO / Black Shark / Qin
620
- /oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,
621
- // Xiaomi Mi
622
- /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,
623
- /; ([\w ]+) miui\/v?\d/i
624
- ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
625
-
626
- // OnePlus
627
- /droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-l]\w[1m]10)\b/i,
628
- /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
629
- ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [
630
-
631
- // OPPO
632
- /; (\w+) bui.+ oppo/i,
633
- /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
634
- ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [
635
- /\b(opd2(\d{3}a?))(?: bui|\))/i
636
- ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['203', '304', '403', '404', '413', '415'], '*' : OPPO }], [TYPE, TABLET]], [
637
-
638
- // BLU
639
- /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i // Vivo series
640
- ], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [
641
-
642
- // Vivo
643
- /; vivo (\w+)(?: bui|\))/i,
644
- /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
645
- ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
646
-
647
- // Realme
648
- /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
649
- ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
650
-
651
- // Lenovo
652
- /(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,
653
- /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i
654
- ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [
655
- /lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i
656
- ], [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]], [
657
-
658
- // Motorola
659
- /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
660
- /\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
661
- /((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
662
- ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [
663
- /\b(mz60\d|xoom[2 ]{0,2}) build\//i
664
- ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
665
-
666
- // LG
667
- /\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
668
- ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
669
- /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
670
- /\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
671
- /\blg-?([\d\w]+) bui/i
672
- ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
673
-
674
- // Nokia
675
- /(nokia) (t[12][01])/i
676
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
677
- /(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,
678
- /nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i
679
- ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [
680
-
681
- // Google
682
- /(pixel (c|tablet))\b/i // Google Pixel C/Tablet
683
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [
684
- // Google Pixel
685
- /droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i
686
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
687
- /(google) (pixelbook( go)?)/i
688
- ], [VENDOR, MODEL], [
689
-
690
- // Sony
691
- /droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
692
- ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [
693
- /sony tablet [ps]/i,
694
- /\b(?:sony)?sgp\w+(?: bui|\))/i
695
- ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [
696
-
697
- // Amazon
698
- /(alexa)webm/i,
699
- /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, // Kindle Fire without Silk / Echo Show
700
- /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
701
- ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
702
- /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
703
- ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [
704
-
705
- // BlackBerry
706
- /(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook
707
- ], [MODEL, VENDOR, [TYPE, TABLET]], [
708
- /\b((?:bb[a-f]|st[hv])100-\d)/i,
709
- /(?:blackberry|\(bb10;) (\w+)/i
710
- ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [
711
-
712
- // Asus
713
- /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
714
- ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [
715
- / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
716
- ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [
717
-
718
- // HTC
719
- /(nexus 9)/i // HTC Nexus 9
720
- ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
721
- /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i, // HTC
722
-
723
- // ZTE
724
- /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
725
- /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
726
- ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
727
-
728
- // TCL
729
- /tcl (xess p17aa)/i,
730
- /droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i
731
- ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [
732
- /droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i
733
- ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [
734
-
735
- // itel
736
- /(itel) ((\w+))/i
737
- ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [
738
-
739
- // Acer
740
- /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
741
- ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
742
-
743
- // Meizu
744
- /droid.+; (m[1-5] note) bui/i,
745
- /\bmz-([-\w]{2,})/i
746
- ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
747
-
748
- // Ulefone
749
- /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
750
- ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
751
-
752
- // Energizer
753
- /; (energy ?\w+)(?: bui|\))/i,
754
- /; energizer ([\w ]+)(?: bui|\))/i
755
- ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [
756
-
757
- // Cat
758
- /; cat (b35);/i,
759
- /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
760
- ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [
761
-
762
- // Smartfren
763
- /((?:new )?andromax[\w- ]+)(?: bui|\))/i
764
- ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [
765
-
766
- // Nothing
767
- /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i
768
- ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
769
-
770
- // Archos
771
- /; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,
772
- /archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i
773
- ], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [
774
- /archos ([\w ]+)( b|\))/i,
775
- /; (ac[3-6]\d\w{2,8})( b|\))/i
776
- ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [
777
-
778
- // Blackview
779
- /blackview ([-\w ]+)( b|\))/i,
780
- /; (bv\d{4}[-\w ]*)( b|\))/i
781
- ], [MODEL, [VENDOR, 'Blackview'], [TYPE, MOBILE]], [
782
-
783
- // HMD
784
- /; (n159v)/i
785
- ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [
786
-
787
- // T-Mobile
788
- /((revvl[ \w\+]+|tm(?:rv|af)\w*[45]g(?:tb)?))( b|\))/i
789
- ], [MODEL, [TYPE, strTest, { 'test': /ta?b/i, 'ifTrue': TABLET, 'ifFalse': MOBILE }], [VENDOR, 'T-Mobile']], [
790
-
791
- // MIXED
792
- /(imo) (tab \w+)/i, // IMO
793
- /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno
794
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
795
-
796
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
797
- // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan
798
- // BLU/Coolpad/CUBOT/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko
799
- /; (blu|coolpad|cubot|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([-\w\+ ]+?)(?: bui|\)|; r)/i,
800
- /(hp) ([\w ]+\w)/i, // HP iPAQ
801
- /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
802
- /(oppo) ?([\w ]+) bui/i, // OPPO
803
- /(hisense) ([ehv][\w ]+)\)/i, // Hisense
804
- /droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i // Philips
805
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
806
-
807
- /(kobo)\s(ereader|touch)/i, // Kobo
808
- /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
809
- /(kindle)\/([\w\.]+)/i // Kindle
810
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
811
-
812
- /(surface duo)/i // Surface Duo
813
- ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [
814
- /droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
815
- ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
816
- /((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i // Nvidia Tablets
817
- ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [
818
- /(sprint) (\w+)/i // Sprint Phones
819
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
820
- /(kin\.[onetw]{3})/i // Microsoft Kin
821
- ], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [
822
- /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
823
- ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [
824
- /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
825
- ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
826
-
827
- ///////////////////
828
- // SMARTTVS
829
- ///////////////////
830
-
831
- /(philips)[\w ]+tv/i, // Philips
832
- /smart-tv.+(samsung)/i // Samsung
833
- ], [VENDOR, [TYPE, SMARTTV]], [
834
- /hbbtv.+maple;(\d+)/i
835
- ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [
836
- /(vizio)(?: |.+model\/)(\w+-\w+)/i, // Vizio
837
- /tcast.+(lg)e?. ([-\w]+)/i // LG SmartTV
838
- ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
839
- /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
840
- ], [[VENDOR, LG], [TYPE, SMARTTV]], [
841
- /(apple) ?tv/i // Apple TV
842
- ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
843
- /crkey.*devicetype\/chromecast/i // Google Chromecast Third Generation
844
- ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
845
- /crkey.*devicetype\/([^/]*)/i // Google Chromecast with specific device type
846
- ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
847
- /fuchsia.*crkey/i // Google Chromecast Nest Hub
848
- ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
849
- /crkey/i // Google Chromecast, Linux-based or unknown
850
- ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
851
- /(portaltv)/i // Facebook Portal TV
852
- ], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [
853
- /droid.+aft(\w+)( bui|\))/i // Fire TV
854
- ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
855
- /(shield \w+ tv)/i // Nvidia Shield TV
856
- ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [
857
- /\(dtv[\);].+(aquos)/i,
858
- /(aquos-tv[\w ]+)\)/i // Sharp
859
- ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
860
- /(bravia[\w ]+)( bui|\))/i // Sony
861
- ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
862
- /(mi(tv|box)-?\w+) bui/i // Xiaomi
863
- ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
864
- /Hbbtv.*(technisat) (.*);/i // TechniSAT
865
- ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
866
- /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
867
- /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
868
- ], [[VENDOR, /.+\/(\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [
869
-
870
- ///////////////////
871
- // CONSOLES
872
- ///////////////////
873
-
874
- /(playstation \w+)/i // Playstation
875
- ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
876
- /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
877
- ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
878
- /(ouya)/i, // Ouya
879
- /(nintendo) (\w+)/i, // Nintendo
880
- /(retroid) (pocket ([^\)]+))/i, // Retroid Pocket
881
- /(valve).+(steam deck)/i,
882
- /droid.+; ((shield|rgcube|gr0006))( bui|\))/i // Nvidia Portable/Anbernic/Logitech
883
- ], [[VENDOR, strMapper, { 'Nvidia': 'Shield', 'Anbernic': 'RGCUBE', 'Logitech': 'GR0006' }], MODEL, [TYPE, CONSOLE]], [
884
-
885
- ///////////////////
886
- // WEARABLES
887
- ///////////////////
888
-
889
- /\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i // Samsung Galaxy Watch
890
- ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
891
- /((pebble))app/i, // Pebble
892
- /(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i // Asus ZenWatch / LG Watch / Pixel Watch / Xiaomi Watch
893
- ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
894
- /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch
895
- ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [
896
- /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
897
- ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
898
- /(opwwe\d{3})/i // OnePlus Watch
899
- ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [
900
- /(moto 360)/i // Motorola 360
901
- ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [
902
- /(smartwatch 3)/i // Sony SmartWatch
903
- ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [
904
- /(g watch r)/i // LG G Watch R
905
- ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [
906
- /droid.+; (wt63?0{2,3})\)/i
907
- ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
908
-
909
- ///////////////////
910
- // XR
911
- ///////////////////
912
-
913
- /droid.+; (glass) \d/i // Google Glass
914
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [
915
- /(pico) ([\w ]+) os\d/i // Pico
916
- ], [VENDOR, MODEL, [TYPE, XR]], [
917
- /(quest( \d| pro)?s?).+vr/i // Meta Quest
918
- ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [
919
- /mobile vr; rv.+firefox/i // Unidentifiable VR device using Firefox Reality / Wolvic
920
- ], [[TYPE, XR]], [
921
-
922
- ///////////////////
923
- // EMBEDDED
924
- ///////////////////
925
-
926
- /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
927
- ], [VENDOR, [TYPE, EMBEDDED]], [
928
- /(aeobc)\b/i // Echo Dot
929
- ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
930
- /(homepod).+mac os/i // Apple HomePod
931
- ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [
932
- /windows iot/i // Unidentifiable embedded device using Windows IoT
933
- ], [[TYPE, EMBEDDED]], [
934
-
935
- ////////////////////
936
- // MIXED (GENERIC)
937
- ///////////////////
938
-
939
- /droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i // Unidentifiable SmartTV
940
- ], [MODEL, [TYPE, SMARTTV]], [
941
- /\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i
942
- ], [[TYPE, SMARTTV]], [
943
- /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i
944
- ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [
945
- /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
946
- ], [[TYPE, TABLET]], [
947
- /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
948
- ], [[TYPE, MOBILE]], [
949
- /droid .+?; ([\w\. -]+)( bui|\))/i // Generic Android Device
950
- ], [MODEL, [VENDOR, 'Generic']]
951
- ],
952
-
953
- engine : [[
954
-
955
- /windows.+ edge\/([\w\.]+)/i // EdgeHTML
956
- ], [VERSION, [NAME, EDGE+'HTML']], [
957
-
958
- /(arkweb)\/([\w\.]+)/i // ArkWeb
959
- ], [NAME, VERSION], [
960
-
961
- /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
962
- ], [VERSION, [NAME, 'Blink']], [
963
-
964
- /(presto)\/([\w\.]+)/i, // Presto
965
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
966
- /ekioh(flow)\/([\w\.]+)/i, // Flow
967
- /(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links/Dillo
968
- /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
969
-
970
- /\b(libweb)/i // LibWeb
971
- ], [NAME, VERSION], [
972
- /ladybird\//i
973
- ], [[NAME, 'LibWeb']], [
974
-
975
- /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
976
- ], [VERSION, NAME]
977
- ],
978
-
979
- os : [[
980
-
981
- // Windows
982
- /(windows nt) (6\.[23]); arm/i // Windows RT
983
- ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [
984
- /(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i, // Windows IoT/Mobile/Phone
985
- // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11
986
- /(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i
987
- ], [NAME, VERSION], [
988
- /windows nt ?([\d\.\)]*)(?!.+xbox)/i,
989
- /\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i
990
- ], [[VERSION, /(;|\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [
991
- /(windows ce)\/?([\d\.]*)/i // Windows CE
992
- ], [NAME, VERSION], [
993
-
994
- // iOS/macOS
995
- /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
996
- /(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,
997
- /\btvos ?([\w\.]+)/i,
998
- /cfnetwork\/.+darwin/i
999
- ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
1000
- /(mac os x) ?([\w\. ]*)/i,
1001
- /(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i // Mac OS
1002
- ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [
1003
-
1004
- // Google Chromecast
1005
- /android ([\d\.]+).*crkey/i // Google Chromecast, Android-based
1006
- ], [VERSION, [NAME, CHROMECAST + ' Android']], [
1007
- /fuchsia.*crkey\/([\d\.]+)/i // Google Chromecast, Fuchsia-based
1008
- ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [
1009
- /crkey\/([\d\.]+).*devicetype\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker
1010
- ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [
1011
- /linux.*crkey\/([\d\.]+)/i // Google Chromecast, Legacy Linux-based
1012
- ], [VERSION, [NAME, CHROMECAST + ' Linux']], [
1013
- /crkey\/([\d\.]+)/i // Google Chromecast, unknown
1014
- ], [VERSION, [NAME, CHROMECAST]], [
1015
-
1016
- // Mobile OSes
1017
- /droid ([\w\.]+)\b.+(android[- ]x86)/i // Android-x86
1018
- ], [VERSION, NAME], [
1019
- /(ubuntu) ([\w\.]+) like android/i // Ubuntu Touch
1020
- ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [
1021
- /(harmonyos)[\/ ]?([\d\.]*)/i, // HarmonyOS
1022
- // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen
1023
- /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i
1024
- ], [NAME, VERSION], [
1025
- /\(bb(10);/i // BlackBerry 10
1026
- ], [VERSION, [NAME, BLACKBERRY]], [
1027
- /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i // Symbian
1028
- ], [VERSION, [NAME, 'Symbian']], [
1029
- /mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i // Firefox OS
1030
- ], [VERSION, [NAME, FIREFOX+' OS']], [
1031
- /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i, // WebOS
1032
- /webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
1033
- ], [VERSION, [NAME, 'webOS']], [
1034
- /web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i
1035
- // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine
1036
- ], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [
1037
- /watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i // watchOS
1038
- ], [VERSION, [NAME, 'watchOS']], [
1039
-
1040
- // Google ChromeOS
1041
- /cros [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
1042
- ], [VERSION, [NAME, 'Chrome OS']],[
1043
-
1044
- // Smart TVs
1045
- /kepler ([\w\.]+); (aft|aeo)/i // Vega OS
1046
- ], [VERSION, [NAME, 'Vega OS']],[
1047
- /(netrange)mmh/i, // Netrange
1048
- /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
1049
-
1050
- // Console
1051
- /(nintendo|playstation) (\w+)/i, // Nintendo/Playstation
1052
- /(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
1053
- /(pico) .+os([\w\.]+)/i, // Pico
1054
-
1055
- // Other
1056
- /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
1057
- /linux.+(mint)[\/\(\) ]?([\w\.]*)/i, // Mint
1058
- /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i, // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch
1059
- /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
1060
- // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix
1061
- /((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris
1062
- /\b(aix)[; ]([1-9\.]{0,4})/i, // AIX
1063
- /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i, // Hurd/Linux/MorphOS
1064
- /(gnu) ?([\w\.]*)/i, // GNU
1065
- /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
1066
- /(haiku) ?(r\d)?/i // Haiku
1067
- ], [NAME, VERSION], [
1068
- /(sunos) ?([\d\.]*)/i // Solaris
1069
- ], [[NAME, 'Solaris'], VERSION], [
1070
- /\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS
1071
- /(unix) ?([\w\.]*)/i // UNIX
1072
- ], [NAME, VERSION]
1073
- ]
1074
- };
1075
-
1076
- /////////////////
1077
- // Factories
1078
- ////////////////
1079
-
1080
- var defaultProps = (function () {
1081
- var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};
1082
- setProps.call(props.init, [
1083
- [BROWSER, [NAME, VERSION, MAJOR, TYPE]],
1084
- [CPU, [ARCHITECTURE]],
1085
- [DEVICE, [TYPE, MODEL, VENDOR]],
1086
- [ENGINE, [NAME, VERSION]],
1087
- [OS, [NAME, VERSION]]
1088
- ]);
1089
- setProps.call(props.isIgnore, [
1090
- [BROWSER, [VERSION, MAJOR]],
1091
- [ENGINE, [VERSION]],
1092
- [OS, [VERSION]]
1093
- ]);
1094
- setProps.call(props.isIgnoreRgx, [
1095
- [BROWSER, / ?browser$/i],
1096
- [OS, / ?os$/i]
1097
- ]);
1098
- setProps.call(props.toString, [
1099
- [BROWSER, [NAME, VERSION]],
1100
- [CPU, [ARCHITECTURE]],
1101
- [DEVICE, [VENDOR, MODEL]],
1102
- [ENGINE, [NAME, VERSION]],
1103
- [OS, [NAME, VERSION]]
1104
- ]);
1105
- return props;
1106
- })();
1107
-
1108
- var createIData = function (item, itemType) {
1109
-
1110
- var init_props = defaultProps.init[itemType],
1111
- is_ignoreProps = defaultProps.isIgnore[itemType] || 0,
1112
- is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,
1113
- toString_props = defaultProps.toString[itemType] || 0;
1114
-
1115
- function IData () {
1116
- setProps.call(this, init_props);
1117
- }
1118
-
1119
- IData.prototype.getItem = function () {
1120
- return item;
1121
- };
1122
-
1123
- IData.prototype.withClientHints = function () {
1124
-
1125
- // nodejs / non-client-hints browsers
1126
- if (!NAVIGATOR_UADATA) {
1127
- return item
1128
- .parseCH()
1129
- .get();
1130
- }
1131
-
1132
- // browsers based on chromium 85+
1133
- return NAVIGATOR_UADATA
1134
- .getHighEntropyValues(CH_ALL_VALUES)
1135
- .then(function (res) {
1136
- return item
1137
- .setCH(new UACHData(res, false))
1138
- .parseCH()
1139
- .get();
1140
- });
1141
- };
1142
-
1143
- IData.prototype.withFeatureCheck = function () {
1144
- return item.detectFeature().get();
1145
- };
1146
-
1147
- if (itemType != RESULT) {
1148
- IData.prototype.is = function (strToCheck) {
1149
- var is = false;
1150
- for (var i in this) {
1151
- if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {
1152
- is = true;
1153
- if (strToCheck != TYPEOF.UNDEFINED) break;
1154
- } else if (strToCheck == TYPEOF.UNDEFINED && is) {
1155
- is = !is;
1156
- break;
1157
- }
1158
- }
1159
- return is;
1160
- };
1161
- IData.prototype.toString = function () {
1162
- var str = EMPTY;
1163
- for (var i in toString_props) {
1164
- if (typeof(this[toString_props[i]]) !== TYPEOF.UNDEFINED) {
1165
- str += (str ? ' ' : EMPTY) + this[toString_props[i]];
1166
- }
1167
- }
1168
- return str || TYPEOF.UNDEFINED;
1169
- };
1170
- }
1171
-
1172
- IData.prototype.then = function (cb) {
1173
- var that = this;
1174
- var IDataResolve = function () {
1175
- for (var prop in that) {
1176
- if (that.hasOwnProperty(prop)) {
1177
- this[prop] = that[prop];
1178
- }
1179
- }
1180
- };
1181
- IDataResolve.prototype = {
1182
- is : IData.prototype.is,
1183
- toString : IData.prototype.toString,
1184
- withClientHints : IData.prototype.withClientHints,
1185
- withFeatureCheck : IData.prototype.withFeatureCheck
1186
- };
1187
- var resolveData = new IDataResolve();
1188
- cb(resolveData);
1189
- return resolveData;
1190
- };
1191
-
1192
- return new IData();
1193
- };
1194
-
1195
- /////////////////
1196
- // Constructor
1197
- ////////////////
1198
-
1199
- function UACHData (uach, isHttpUACH) {
1200
- uach = uach || {};
1201
- setProps.call(this, CH_ALL_VALUES);
1202
- if (isHttpUACH) {
1203
- setProps.call(this, [
1204
- [BRANDS, itemListToArray(uach[CH])],
1205
- [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
1206
- [MOBILE, /\?1/.test(uach[CH_MOBILE])],
1207
- [MODEL, normalizeHeaderValue(uach[CH_MODEL])],
1208
- [PLATFORM, normalizeHeaderValue(uach[CH_PLATFORM])],
1209
- [PLATFORMVER, normalizeHeaderValue(uach[CH_PLATFORM_VER])],
1210
- [ARCHITECTURE, normalizeHeaderValue(uach[CH_ARCH])],
1211
- [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
1212
- [BITNESS, normalizeHeaderValue(uach[CH_BITNESS])]
1213
- ]);
1214
- } else {
1215
- for (var prop in uach) {
1216
- if(this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];
1217
- }
1218
- }
1219
- }
1220
-
1221
- function UAItem (itemType, ua, rgxMap, uaCH) {
1222
- setProps.call(this, [
1223
- ['itemType', itemType],
1224
- ['ua', ua],
1225
- ['uaCH', uaCH],
1226
- ['rgxMap', rgxMap],
1227
- ['data', createIData(this, itemType)]
1228
- ]);
1229
- return this;
1230
- }
1231
-
1232
- UAItem.prototype.get = function (prop) {
1233
- if (!prop) return this.data;
1234
- return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;
1235
- };
1236
-
1237
- UAItem.prototype.set = function (prop, val) {
1238
- this.data[prop] = val;
1239
- return this;
1240
- };
1241
-
1242
- UAItem.prototype.setCH = function (ch) {
1243
- this.uaCH = ch;
1244
- return this;
1245
- };
1246
-
1247
- UAItem.prototype.detectFeature = function () {
1248
- if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
1249
- switch (this.itemType) {
1250
- case BROWSER:
1251
- // Brave-specific detection
1252
- if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {
1253
- this.set(NAME, 'Brave');
1254
- }
1255
- break;
1256
- case DEVICE:
1257
- // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData
1258
- if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
1259
- this.set(TYPE, MOBILE);
1260
- }
1261
- // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
1262
- if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
1263
- this.set(MODEL, 'iPad')
1264
- .set(TYPE, TABLET);
1265
- }
1266
- break;
1267
- case OS:
1268
- // Chrome-specific detection: check for 'platform' value of navigator.userAgentData
1269
- if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
1270
- this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
1271
- }
1272
- break;
1273
- case RESULT:
1274
- var data = this.data;
1275
- var detect = function (itemType) {
1276
- return data[itemType]
1277
- .getItem()
1278
- .detectFeature()
1279
- .get();
1280
- };
1281
- this.set(BROWSER, detect(BROWSER))
1282
- .set(CPU, detect(CPU))
1283
- .set(DEVICE, detect(DEVICE))
1284
- .set(ENGINE, detect(ENGINE))
1285
- .set(OS, detect(OS));
1286
- }
1287
- }
1288
- return this;
1289
- };
1290
-
1291
- UAItem.prototype.parseUA = function () {
1292
- if (this.itemType != RESULT) {
1293
- rgxMapper.call(this.data, this.ua, this.rgxMap);
1294
- }
1295
- switch (this.itemType) {
1296
- case BROWSER:
1297
- this.set(MAJOR, majorize(this.get(VERSION)));
1298
- break;
1299
- case OS:
1300
- // Since iOS 26, Safari's UA reports the OS version as frozen at 18:
1301
- // https://webkit.org/blog/17333/webkit-features-in-safari-26-0/#update-to-ua-string
1302
- if (this.get(NAME) == 'iOS' && this.get(VERSION)) {
1303
- // Only perform this if iOS version is 18/19
1304
- if (/^1[89][^\d]/.exec(this.get(VERSION))) {
1305
- // Based on the assumption that "iOS" version is tightly coupled with "Safari" version
1306
- var realVersion = /\) Version\/((\d+)[\d\.]*)/.exec(this.ua);
1307
- if (realVersion && parseInt(realVersion[2], 10) >= 26) {
1308
- // iOS version = Safari version
1309
- this.set(VERSION, realVersion[1]);
1310
- }
1311
- }
1312
- }
1313
- break;
1314
- }
1315
- return this;
1316
- };
1317
-
1318
- UAItem.prototype.parseCH = function () {
1319
- var uaCH = this.uaCH,
1320
- rgxMap = this.rgxMap;
1321
-
1322
- switch (this.itemType) {
1323
- case BROWSER:
1324
- case ENGINE:
1325
- var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
1326
- if (brands) {
1327
- for (var i=0; i<brands.length; i++) {
1328
- var brandName = brands[i].brand || brands[i],
1329
- brandVersion = brands[i].version;
1330
- if (this.itemType == BROWSER &&
1331
- !/not.a.brand/i.test(brandName) &&
1332
- (!prevName ||
1333
- (/Chrom/.test(prevName) && brandName != CHROMIUM) ||
1334
- (prevName == EDGE && /WebView2/.test(brandName))
1335
- )) {
1336
- brandName = strMapper(brandName, browserHintsMap);
1337
- prevName = this.get(NAME);
1338
- if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {
1339
- this.set(NAME, brandName)
1340
- .set(VERSION, brandVersion)
1341
- .set(MAJOR, majorize(brandVersion));
1342
- }
1343
- prevName = brandName;
1344
- }
1345
- if (this.itemType == ENGINE && brandName == CHROMIUM) {
1346
- this.set(VERSION, brandVersion);
1347
- }
1348
- }
1349
- }
1350
- break;
1351
- case CPU:
1352
- var archName = uaCH[ARCHITECTURE];
1353
- if (archName) {
1354
- if (archName && uaCH[BITNESS] == '64') archName += '64';
1355
- rgxMapper.call(this.data, archName + ';', rgxMap);
1356
- }
1357
- break;
1358
- case DEVICE:
1359
- if (uaCH[MOBILE]) {
1360
- this.set(TYPE, MOBILE);
1361
- }
1362
- if (uaCH[MODEL]) {
1363
- this.set(MODEL, uaCH[MODEL]);
1364
- if (!this.get(TYPE) || !this.get(VENDOR)) {
1365
- var reParse = {};
1366
- rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);
1367
- if (!this.get(TYPE) && !!reParse.type) {
1368
- this.set(TYPE, reParse.type);
1369
- }
1370
- if (!this.get(VENDOR) && !!reParse.vendor) {
1371
- this.set(VENDOR, reParse.vendor);
1372
- }
1373
- }
1374
- }
1375
- if (uaCH[FORMFACTORS]) {
1376
- var ff;
1377
- if (typeof uaCH[FORMFACTORS] !== 'string') {
1378
- var idx = 0;
1379
- while (!ff && idx < uaCH[FORMFACTORS].length) {
1380
- ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);
1381
- }
1382
- } else {
1383
- ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);
1384
- }
1385
- this.set(TYPE, ff);
1386
- }
1387
- break;
1388
- case OS:
1389
- var osName = uaCH[PLATFORM];
1390
- if(osName) {
1391
- var osVersion = uaCH[PLATFORMVER];
1392
- if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');
1393
- this.set(NAME, osName)
1394
- .set(VERSION, osVersion);
1395
- }
1396
- // Xbox-Specific Detection
1397
- if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {
1398
- this.set(NAME, 'Xbox')
1399
- .set(VERSION, undefined);
1400
- }
1401
- break;
1402
- case RESULT:
1403
- var data = this.data;
1404
- var parse = function (itemType) {
1405
- return data[itemType]
1406
- .getItem()
1407
- .setCH(uaCH)
1408
- .parseCH()
1409
- .get();
1410
- };
1411
- this.set(BROWSER, parse(BROWSER))
1412
- .set(CPU, parse(CPU))
1413
- .set(DEVICE, parse(DEVICE))
1414
- .set(ENGINE, parse(ENGINE))
1415
- .set(OS, parse(OS));
1416
- }
1417
- return this;
1418
- };
1419
-
1420
- function UAParser (ua, extensions, headers) {
1421
-
1422
- if (typeof ua === TYPEOF.OBJECT) {
1423
- if (isExtensions(ua, true)) {
1424
- if (typeof extensions === TYPEOF.OBJECT) {
1425
- headers = extensions; // case UAParser(extensions, headers)
1426
- }
1427
- extensions = ua; // case UAParser(extensions)
1428
- } else {
1429
- headers = ua; // case UAParser(headers)
1430
- extensions = undefined;
1431
- }
1432
- ua = undefined;
1433
- } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {
1434
- headers = extensions; // case UAParser(ua, headers)
1435
- extensions = undefined;
1436
- }
1437
-
1438
- if (headers) {
1439
- if (typeof headers.append === TYPEOF.FUNCTION) {
1440
- // Convert Headers object into a plain object
1441
- var kv = {};
1442
- headers.forEach(function (v, k) { kv[String(k).toLowerCase()] = v; });
1443
- headers = kv;
1444
- } else {
1445
- // Normalize headers field name into lowercase
1446
- var normalized = {};
1447
- for (var header in headers) {
1448
- if (headers.hasOwnProperty(header)) {
1449
- normalized[String(header).toLowerCase()] = headers[header];
1450
- }
1451
- }
1452
- headers = normalized;
1453
- }
1454
- }
1455
-
1456
- if (!(this instanceof UAParser)) {
1457
- return new UAParser(ua, extensions, headers).getResult();
1458
- }
1459
-
1460
- var userAgent = typeof ua === TYPEOF.STRING ? ua : // Passed user-agent string
1461
- (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers
1462
- ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent
1463
- EMPTY)), // empty string
1464
-
1465
- httpUACH = new UACHData(headers, true),
1466
- regexMap = defaultRegexes,
1467
-
1468
- createItemFunc = function (itemType) {
1469
- if (itemType == RESULT) {
1470
- return function () {
1471
- return new UAItem(itemType, userAgent, regexMap, httpUACH)
1472
- .set('ua', userAgent)
1473
- .set(BROWSER, this.getBrowser())
1474
- .set(CPU, this.getCPU())
1475
- .set(DEVICE, this.getDevice())
1476
- .set(ENGINE, this.getEngine())
1477
- .set(OS, this.getOS())
1478
- .get();
1479
- };
1480
- } else {
1481
- return function () {
1482
- return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)
1483
- .parseUA()
1484
- .get();
1485
- };
1486
- }
1487
- };
1488
-
1489
- // public methods
1490
- setProps.call(this, [
1491
- ['getBrowser', createItemFunc(BROWSER)],
1492
- ['getCPU', createItemFunc(CPU)],
1493
- ['getDevice', createItemFunc(DEVICE)],
1494
- ['getEngine', createItemFunc(ENGINE)],
1495
- ['getOS', createItemFunc(OS)],
1496
- ['getResult', createItemFunc(RESULT)],
1497
- ['getUA', function () { return userAgent; }],
1498
- ['setUA', function (ua) {
1499
- if (isString(ua)) userAgent = trim(ua, UA_MAX_LENGTH);
1500
- return this;
1501
- }],
1502
- ['useExtension', function (exts) {
1503
- if (exts) regexMap = extend(regexMap, exts);
1504
- return this;
1505
- }]
1506
- ])
1507
- .setUA(userAgent)
1508
- .useExtension(extensions);
1509
-
1510
- return this;
1511
- }
1512
-
1513
- UAParser.VERSION = LIBVERSION;
1514
- UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);
1515
- UAParser.CPU = enumerize([ARCHITECTURE]);
1516
- UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
1517
- UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
1518
-
1519
- export { UAParser as U };
1520
- //# sourceMappingURL=ua-parser-BLkTkt4a.js.map