ua-parser-js 0.7.25 → 0.7.26

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.

Potentially problematic release.


This version of ua-parser-js might be problematic. Click here for more details.

package/src/ua-parser.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!@license
2
- * UAParser.js v0.7.25
2
+ * UAParser.js v0.7.26
3
3
  * Lightweight JavaScript-based User-Agent string parser
4
4
  * https://github.com/faisalman/ua-parser-js
5
5
  *
@@ -16,7 +16,7 @@
16
16
  /////////////
17
17
 
18
18
 
19
- var LIBVERSION = '0.7.25',
19
+ var LIBVERSION = '0.7.26',
20
20
  EMPTY = '',
21
21
  UNKNOWN = '?',
22
22
  FUNC_TYPE = 'function',
@@ -35,7 +35,8 @@
35
35
  TABLET = 'tablet',
36
36
  SMARTTV = 'smarttv',
37
37
  WEARABLE = 'wearable',
38
- EMBEDDED = 'embedded';
38
+ EMBEDDED = 'embedded',
39
+ UA_MAX_LENGTH = 255;
39
40
 
40
41
 
41
42
  ///////////
@@ -56,11 +57,7 @@
56
57
  return mergedRegexes;
57
58
  },
58
59
  has : function (str1, str2) {
59
- if (typeof str1 === "string") {
60
- return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1;
61
- } else {
62
- return false;
63
- }
60
+ return typeof str1 === STR_TYPE ? str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1 : false;
64
61
  },
65
62
  lowerize : function (str) {
66
63
  return str.toLowerCase();
@@ -68,8 +65,9 @@
68
65
  major : function (version) {
69
66
  return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g,'').split(".")[0] : undefined;
70
67
  },
71
- trim : function (str) {
72
- return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
68
+ trim : function (str, len) {
69
+ str = str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
70
+ return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
73
71
  }
74
72
  };
75
73
 
@@ -160,7 +158,8 @@
160
158
  var maps = {
161
159
 
162
160
  browser : {
163
- oldsafari : {
161
+ // Safari < 3.0
162
+ oldSafari : {
164
163
  version : {
165
164
  '1.0' : '/8',
166
165
  '1.2' : '/1',
@@ -171,22 +170,16 @@
171
170
  '2.0.4' : '/419',
172
171
  '?' : '/'
173
172
  }
174
- }
175
- },
176
-
177
- device : {
178
- amazon : {
179
- model : {
180
- 'Fire Phone' : ['SD', 'KF']
181
- }
182
173
  },
183
- sprint : {
184
- model : {
185
- 'Evo Shift 4G' : '7373KT'
186
- },
187
- vendor : {
188
- 'HTC' : 'APA',
189
- 'Sprint' : 'Sprint'
174
+ oldEdge : {
175
+ version : {
176
+ '0.1' : '12.',
177
+ '21' : '13.',
178
+ '31' : '14.',
179
+ '39' : '15.',
180
+ '41' : '16.',
181
+ '42' : '17.',
182
+ '44' : '18.'
190
183
  }
191
184
  }
192
185
  },
@@ -220,145 +213,108 @@
220
213
 
221
214
  browser : [[
222
215
 
216
+ /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
217
+ ], [VERSION, [NAME, 'Chrome']], [
218
+ /(?:edgios|edga|edg)\/([\w\.]+)/i // Microsoft Edge
219
+ ], [VERSION, [NAME, 'Edge']], [
220
+ /edge\/([\w\.]+)/i // Old Edge (Trident)
221
+ ], [[VERSION, mapper.str, maps.browser.oldEdge.version], [NAME, 'Edge']], [
222
+
223
223
  // Presto based
224
224
  /(opera\smini)\/([\w\.-]+)/i, // Opera Mini
225
- /(opera\s[mobiletab]{3,6}).+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
225
+ /(opera\s[mobiletab]{3,6})\b.+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
226
226
  /(opera).+version\/([\w\.]+)/i, // Opera > 9.80
227
227
  /(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
228
228
  ], [NAME, VERSION], [
229
-
230
- /(opios)[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
231
- ], [[NAME, 'Opera Mini'], VERSION], [
232
-
233
- /\s(opr)\/([\w\.]+)/i // Opera Webkit
234
- ], [[NAME, 'Opera'], VERSION], [
229
+ /opios[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
230
+ ], [VERSION, [NAME, 'Opera Mini']], [
231
+ /\sopr\/([\w\.]+)/i // Opera Webkit
232
+ ], [VERSION, [NAME, 'Opera']], [
235
233
 
236
234
  // Mixed
237
235
  /(kindle)\/([\w\.]+)/i, // Kindle
238
- /(lunascape|maxthon|netfront|jasmine|blazer|instagram)[\/\s]?([\w\.]*)/i,
239
- // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Instagram
236
+ /(lunascape|maxthon|netfront|jasmine|blazer|instagram)[\/\s]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Instagram
240
237
  // Trident based
241
- /(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i,
242
- // Avant/IEMobile/SlimBrowser
243
- /(bidubrowser|baidubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
238
+ /(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
239
+ /(ba?idubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
244
240
  /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
245
241
 
246
242
  // Webkit/KHTML based
247
- /(rekonq)\/([\w\.]*)/i, // Rekonq
248
243
  /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i,
249
244
  // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
250
- /(puffin|brave|whale|qqbrowserlite|qq)\/([\w\.]+)/i // Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
245
+ /(rekonq|puffin|brave|whale|qqbrowserlite|qq)\/([\w\.]+)/i, // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
246
+ /(weibo)__([\d\.]+)/i // Weibo
251
247
  ], [NAME, VERSION], [
252
-
253
- /(konqueror)\/([\w\.]+)/i // Konqueror
254
- ], [[NAME, 'Konqueror'], VERSION], [
255
-
256
- /(trident).+rv[:\s]([\w\.]{1,9}).+like\sgecko/i // IE11
257
- ], [[NAME, 'IE'], VERSION], [
258
-
259
- /(edge|edgios|edga|edg)\/((\d+)?[\w\.]+)/i // Microsoft Edge
260
- ], [[NAME, 'Edge'], VERSION], [
261
-
262
- /(yabrowser)\/([\w\.]+)/i // Yandex
263
- ], [[NAME, 'Yandex'], VERSION], [
264
-
265
- /(Avast)\/([\w\.]+)/i // Avast Secure Browser
266
- ], [[NAME, 'Avast Secure Browser'], VERSION], [
267
-
268
- /(AVG)\/([\w\.]+)/i // AVG Secure Browser
269
- ], [[NAME, 'AVG Secure Browser'], VERSION], [
270
-
271
- /(focus)\/([\w\.]+)/i // Firefox Focus
272
- ], [[NAME, 'Firefox Focus'], VERSION], [
273
-
274
- /(opt)\/([\w\.]+)/i // Opera Touch
275
- ], [[NAME, 'Opera Touch'], VERSION], [
276
-
277
- /((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
278
- ], [[NAME, 'UCBrowser'], VERSION], [
279
-
248
+ /(?:[\s\/]uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
249
+ ], [VERSION, [NAME, 'UCBrowser']], [
250
+ /(?:windowswechat)?\sqbcore\/([\w\.]+)\b.*(?:windowswechat)?/i // WeChat Desktop for Windows Built-in Browser
251
+ ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [
252
+ /micromessenger\/([\w\.]+)/i // WeChat
253
+ ], [VERSION, [NAME, 'WeChat']], [
254
+ /konqueror\/([\w\.]+)/i // Konqueror
255
+ ], [VERSION, [NAME, 'Konqueror']], [
256
+ /trident.+rv[:\s]([\w\.]{1,9})\b.+like\sgecko/i // IE11
257
+ ], [VERSION, [NAME, 'IE']], [
258
+ /yabrowser\/([\w\.]+)/i // Yandex
259
+ ], [VERSION, [NAME, 'Yandex']], [
260
+ /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
261
+ ], [[NAME, /(.+)/, '$1 Secure Browser'], VERSION], [
262
+ /focus\/([\w\.]+)/i // Firefox Focus
263
+ ], [VERSION, [NAME, 'Firefox Focus']], [
264
+ /opt\/([\w\.]+)/i // Opera Touch
265
+ ], [VERSION, [NAME, 'Opera Touch']], [
266
+ /coc_coc_browser\/([\w\.]+)/i // Coc Coc Browser
267
+ ], [VERSION, [NAME, 'Coc Coc']], [
268
+ /dolfin\/([\w\.]+)/i // Dolphin
269
+ ], [VERSION, [NAME, 'Dolphin']], [
270
+ /coast\/([\w\.]+)/i // Opera Coast
271
+ ], [VERSION, [NAME, 'Opera Coast']],
272
+ [/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
273
+ ], [VERSION, [NAME, 'MIUI Browser']], [
274
+ /fxios\/([\w\.-]+)/i // Firefox for iOS
275
+ ], [VERSION, [NAME, 'Firefox']], [
276
+ /(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
277
+ ], [[NAME, '360 Browser']], [
278
+ /(oculus|samsung|sailfish)browser\/([\w\.]+)/i
279
+ ], [[NAME, /(.+)/, '$1 Browser'], VERSION], [ // Oculus/Samsung/Sailfish Browser
280
280
  /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
281
281
  ], [[NAME, /_/g, ' '], VERSION], [
282
-
283
- /((?:windowswechat)? qbcore)\/([\w\.]+).*(?:windowswechat)?/i // WeChat Desktop for Windows Built-in Browser
284
- ], [[NAME, 'WeChat(Win) Desktop'], VERSION], [
285
-
286
- /(micromessenger)\/([\w\.]+)/i // WeChat
287
- ], [[NAME, 'WeChat'], VERSION], [
288
-
289
282
  /m?(qqbrowser|baiduboxapp|2345Explorer)[\/\s]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
290
283
  ], [NAME, VERSION], [
291
-
292
- /(MetaSr)[\/\s]?([\w\.]+)/i // SouGouBrowser
293
- ], [NAME], [
294
-
284
+ /(MetaSr)[\/\s]?([\w\.]+)/i, // SouGouBrowser
295
285
  /(LBBROWSER)/i // LieBao Browser
296
286
  ], [NAME], [
297
287
 
298
- /(weibo)__([\d\.]+)/i // Weibo
299
- ], [NAME, VERSION], [
300
-
301
- /xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
302
- ], [VERSION, [NAME, 'MIUI Browser']], [
303
-
288
+ // WebView
304
289
  /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android with version
305
- ], [VERSION, [NAME, 'Facebook']], [
306
-
290
+ ], [VERSION, [NAME, 'Facebook']], [
307
291
  /FBAN\/FBIOS|FB_IAB\/FB4A/i // Facebook App for iOS & Android without version
308
292
  ], [[NAME, 'Facebook']], [
309
-
293
+ /\s(electron)\/([\w\.]+)\ssafari/i, // Electron-based App
310
294
  /safari\s(line)\/([\w\.]+)/i, // Line App for iOS
311
- /droid.+(line)\/([\w\.]+)\/iab/i // Line App for Android
295
+ /\b(line)\/([\w\.]+)\/iab/i // Line App for Android
312
296
  ], [NAME, VERSION], [
297
+ /\bgsa\/([\w\.]+)\s.*safari\//i // Google Search Appliance on iOS
298
+ ], [VERSION, [NAME, 'GSA']], [
313
299
 
314
300
  /headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
315
301
  ], [VERSION, [NAME, 'Chrome Headless']], [
316
302
 
317
303
  /\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
318
- ], [[NAME, /(.+)/, '$1 WebView'], VERSION], [
319
-
320
- /((?:oculus|samsung)browser)\/([\w\.]+)/i
321
- ], [[NAME, /(.+(?:g|us))(.+)/, '$1 $2'], VERSION], [ // Oculus / Samsung Browser
304
+ ], [[NAME, 'Chrome WebView'], VERSION], [
322
305
 
323
- /droid.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
306
+ /droid.+\sversion\/([\w\.]+)\b.+(?:mobile\ssafari|safari)/i // Android Browser
324
307
  ], [VERSION, [NAME, 'Android Browser']], [
325
308
 
326
- /(coc_coc_browser)\/([\w\.]+)/i // Coc Coc Browser
327
- ], [[NAME, 'Coc Coc'], VERSION], [
328
-
329
- /(sailfishbrowser)\/([\w\.]+)/i // Sailfish Browser
330
- ], [[NAME, 'Sailfish Browser'], VERSION], [
331
-
332
- /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
333
- // Chrome/OmniWeb/Arora/Tizen/Nokia
309
+ /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
334
310
  ], [NAME, VERSION], [
335
311
 
336
- /(dolfin)\/([\w\.]+)/i // Dolphin
337
- ], [[NAME, 'Dolphin'], VERSION], [
338
-
339
- /(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
340
- ], [[NAME, '360 Browser']], [
341
-
342
- /((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
343
- ], [[NAME, 'Chrome'], VERSION], [
344
-
345
- /(coast)\/([\w\.]+)/i // Opera Coast
346
- ], [[NAME, 'Opera Coast'], VERSION], [
347
-
348
- /fxios\/([\w\.-]+)/i // Firefox for iOS
349
- ], [VERSION, [NAME, 'Firefox']], [
350
-
351
312
  /version\/([\w\.]+)\s.*mobile\/\w+\s(safari)/i // Mobile Safari
352
313
  ], [VERSION, [NAME, 'Mobile Safari']], [
353
-
354
314
  /version\/([\w\.]+)\s.*(mobile\s?safari|safari)/i // Safari & Safari Mobile
355
315
  ], [VERSION, NAME], [
356
-
357
- /webkit.+?(gsa)\/([\w\.]+)\s.*(mobile\s?safari|safari)(\/[\w\.]+)/i // Google Search Appliance on iOS
358
- ], [[NAME, 'GSA'], VERSION], [
359
-
360
316
  /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
361
- ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
317
+ ], [NAME, [VERSION, mapper.str, maps.browser.oldSafari.version]], [
362
318
 
363
319
  /(webkit|khtml)\/([\w\.]+)/i
364
320
  ], [NAME, VERSION], [
@@ -370,7 +326,6 @@
370
326
  /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
371
327
  // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
372
328
  /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,
373
-
374
329
  // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
375
330
  /(firefox)\/([\w\.]+)\s[\w\s\-]+\/[\w\.]+$/i, // Other Firefox-based
376
331
  /(mozilla)\/([\w\.]+)\s.+rv\:.+gecko\/\d+/i, // Mozilla
@@ -387,15 +342,21 @@
387
342
 
388
343
  cpu : [[
389
344
 
390
- /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64
345
+ /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64 (x64)
391
346
  ], [[ARCHITECTURE, 'amd64']], [
392
347
 
393
348
  /(ia32(?=;))/i // IA32 (quicktime)
394
349
  ], [[ARCHITECTURE, util.lowerize]], [
395
350
 
396
- /((?:i[346]|x)86)[;\)]/i // IA32
351
+ /((?:i[346]|x)86)[;\)]/i // IA32 (x86)
397
352
  ], [[ARCHITECTURE, 'ia32']], [
398
353
 
354
+ /\b(aarch64|armv?8e?l?)\b/i // ARM64
355
+ ], [[ARCHITECTURE, 'arm64']], [
356
+
357
+ /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
358
+ ], [[ARCHITECTURE, 'armhf']], [
359
+
399
360
  // PocketPC mistakenly identified as PowerPC
400
361
  /windows\s(ce|mobile);\sppc;/i
401
362
  ], [[ARCHITECTURE, 'arm']], [
@@ -406,281 +367,292 @@
406
367
  /(sun4\w)[;\)]/i // SPARC
407
368
  ], [[ARCHITECTURE, 'sparc']], [
408
369
 
409
- /((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+[;l]))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
370
+ /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?:64|(?=v(?:[1-7]|[5-7]1)l?|;|eabi))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
410
371
  // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
411
372
  ], [[ARCHITECTURE, util.lowerize]]
412
373
  ],
413
374
 
414
375
  device : [[
415
-
416
- /\((ipad|playbook);[\w\s\),;-]+(rim|apple)/i // iPad/PlayBook
417
- ], [MODEL, VENDOR, [TYPE, TABLET]], [
418
-
419
- /applecoremedia\/[\w\.]+ \((ipad)/ // iPad
420
- ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
421
-
422
- /(apple\s{0,1}tv)/i // Apple TV
423
- ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple'], [TYPE, SMARTTV]], [
424
-
425
- /(archos)\s(gamepad2?)/i, // Archos
426
- /(hp).+(touchpad)/i, // HP TouchPad
427
- /(hp).+(tablet)/i, // HP Tablet
428
- /(kindle)\/([\w\.]+)/i, // Kindle
429
- /\s(nook)[\w\s]+build\/(\w+)/i, // Nook
430
- /(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak
431
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
432
-
433
- /(alexa)webm/i,
434
- /(kf[A-z]+)(\sbuild\/|\)).+silk\//i // Kindle Fire HD
435
- ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
436
- /(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i // Fire Phone
437
- ], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
438
- /droid.+aft([\w])(\sbuild\/|\))/i // Fire TV
439
- ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
440
-
376
+
377
+ //////////////////////
378
+ // MOBILES & TABLETS
379
+ /////////////////////
380
+
381
+ // Samsung
382
+ /\b(sch-i[89]0\d|shw-m380s|sm-p(?:605|610|587)|sm-t\w+|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus\s10)/i,
383
+ ], [MODEL, [VENDOR, 'Samsung'], [TYPE, TABLET]], [
384
+ /(s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+)/i,
385
+ /\ssamsung[\s-]([\w-]+)/i,
386
+ /sec-(sgh\w+)/i
387
+ ], [MODEL, [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
388
+
389
+ // Apple
441
390
  /\((ip(?:hone|od)[\s\w]*);/i // iPod/iPhone
442
391
  ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
392
+ /\((ipad);[\w\s\),;-]+(apple)/i // iPad
393
+ ], [MODEL, VENDOR, [TYPE, TABLET]], [
394
+ /applecoremedia\/[\w\.]+\s\((ipad)/i
395
+ ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
443
396
 
444
- /(blackberry)[\s-]?(\w+)/i, // BlackBerry
445
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
446
- // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
447
- /(hp)\s([\w\s]+\w)/i, // HP iPAQ
448
- /(asus)-?(\w+)/i // Asus
449
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
450
- /\(bb10;\s(\w+)/i // BlackBerry 10
451
- ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
452
- // Asus Tablets
453
- /droid.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i
454
- ], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
455
-
456
- /sony\stablet\s[ps]\sbuild\//i, // Sony
457
- /(?:sony)?sgp\w+(?:\sbuild\/|\))/i
458
- ], [[MODEL, 'Xperia Tablet'], [VENDOR, 'Sony'], [TYPE, TABLET]], [
459
- /droid.+\s([c-g]\d{4}|so[-l]\w+|xq-a\w[4-7][12])(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
460
- ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
461
-
462
- /\s(ouya)\s/i, // Ouya
463
- /(nintendo)\s([wids3utch]+)/i // Nintendo
464
- ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
465
-
466
- /droid.+;\s(shield)\sbuild/i // Nvidia
467
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
468
-
469
- /(playstation\s[345portablevi]+)/i // Playstation
470
- ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
471
-
472
- /(sprint\s(\w+))/i // Sprint Phones
473
- ], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
474
-
475
- /(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
476
- /(zte)-(\w*)/i, // ZTE
477
- /(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
478
- // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
479
- ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
480
-
481
- /(nexus\s9)/i // HTC Nexus 9
482
- ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
483
-
484
- /d\/huawei([\w\s-]+)[;\)]/i, // Huawei
485
- /droid.+\s(nexus\s6p|vog-[at]?l\d\d|ane-[at]?l[x\d]\d|eml-a?l\d\da?|lya-[at]?l\d[\dc]|clt-a?l\d\di?)/i,
486
- /droid.+\s((?:A(?:GS2?|KA|LP|N[AE]|QM|RE|SK|TH)|B(?:A(?:C|H2)|G2|KL|LA|MH|Z[AKT])|C(?:AZ|DY|LT|OL|[MOR]R)|DUK|E(?:BG|DI|L[ES]|ML|V[AR])|FRD|G(?:LK|RA)|H(?:D[LN]|MA|LK|RY|WI)|INE|J(?:DN2|MM|NY|SN)|K(?:NT|OB|SA)|L(?:IO|LD|ON|[RY]A)|M(?:AR|ED|[HL]A|ON|RX|T7)|N(?:EO|TS|XT)|OXF|P(?:AR|CT|IC|LK|RA)|R(?:IO|VL)|S(?:C[ML]|EA|HT|PN|TF)|T(?:A[HS]|NY)|V(?:[CI]E|KY|OG|RD)|W(?:AS|LZ)|Y(?:635|AL))-[ATU][LN][01259][019])[;\)\s]/i
487
-
397
+ // Huawei
398
+ /d\/huawei([\w\s-]+)[;\)]/i,
399
+ /\b(nexus\s6p|vog-[at]?l\d\d|ane-[at]?l[x\d]\d|eml-a?l\d\da?|lya-[at]?l\d[\dc]|clt-a?l\d\di?|ele-l\d\d)/i,
400
+ /\b(\w{2,4}-[atu][ln][01259][019])[;\)\s]/i
488
401
  ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
489
-
490
- /droid.+(bah2?-a?[lw]\d{2})/i // Huawei MediaPad
402
+ /\b(bah2?-a?[lw]\d{2})/i // Huawei MediaPad
491
403
  ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [
492
404
 
493
- /(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
494
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
405
+ // Xiaomi
406
+ /\b(poco[\s\w]+)(?:\sbuild|\))/i, // Xiaomi POCO
407
+ /\b;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
408
+ /\b(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi
409
+ /\b(redmi[\s\-_]?(?:note|k)?[\w\s_]+)(?:\sbuild|\))/i, // Xiaomi Redmi
410
+ /\b(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i // Xiaomi Mi
411
+ ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
412
+ /\b(mi[\s\-_]?(?:pad)(?:[\w\s_]+))(?:\sbuild|\))/i // Mi Pad tablets
413
+ ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
495
414
 
496
- /[\s\(;](xbox(?:\sone)?)[\s\);]/i // Microsoft Xbox
497
- ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
498
- /(kin\.[onetw]{3})/i // Microsoft Kin
499
- ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
415
+ // OPPO
416
+ /;\s(\w+)\sbuild.+\soppo/i,
417
+ /\s(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007)\b/i
418
+ ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
419
+
420
+ // Vivo
421
+ /\svivo\s(\w+)(?:\sbuild|\))/i,
422
+ /\s(v[12]\d{3}\w?[at])(?:\sbuild|;)/i
423
+ ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
424
+
425
+ // Realme
426
+ /\s(rmx[12]\d{3})(?:\sbuild|;)/i
427
+ ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
500
428
 
501
- // Motorola
502
- /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i,
429
+ // Motorola
430
+ /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)\b[\w\s]+build\//i,
503
431
  /\smot[\s-](\w*)/i,
504
432
  /(moto[\s\w\(\)]+(?=\sbuild|\)))/i,
505
- /(XT\d{3,4}) build\//i,
433
+ /(xt\d{3,4})\sbuild\//i,
506
434
  /(nexus\s6)/i
507
435
  ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
508
- /droid.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
436
+ /\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
509
437
  ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
510
438
 
511
- /hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
512
- ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
513
-
514
- /hbbtv.+maple;(\d+)/i
515
- ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
516
-
517
- /\(dtv[\);].+(aquos)/i // Sharp
518
- ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
519
-
520
- /droid.+((sch-i[89]0\d|shw-m380s|SM-P605|SM-P610|SM-P587|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,
521
- /((SM-T\w+))/i
522
- ], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
523
- /smart-tv.+(samsung)/i
524
- ], [VENDOR, [TYPE, SMARTTV], MODEL], [
525
- /((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,
526
- /\s(sam)(?:sung)[\s-]([\w-]+)/i,
527
- /sec-((sgh\w+))/i
528
- ], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
529
-
530
- /sie-(\w*)/i // Siemens
531
- ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
532
-
533
- /(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia
534
- /(nokia)[\s_-]?([\w\.-]*)/i
535
- ], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
536
-
537
- /droid[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i // Acer
538
- ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
539
-
540
- /droid.+([vl]k\-?\d{3})\s+build/i // LG Tablet
439
+ // LG
440
+ /((?=lg)?[vl]k\-?\d{3})\s+build|\s3\.[\s\w;-]{10}lg?-([06cv9]{3,4})/i
541
441
  ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
542
- /droid\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet
543
- ], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
544
- /linux;\snetcast.+smarttv/i, // LG SmartTV
545
- /lg\snetcast\.tv-201\d/i
546
- ], [[VENDOR, 'LG'], MODEL, [TYPE, SMARTTV]], [
547
- /(nexus\s[45])/i, // LG
548
- /lg[e;\s\/-]+(\w*)/i,
549
- /droid.+lg(\-?[\d\w]+)\s+build/i
442
+ /(nexus\s[45])/i,
443
+ /lg[e;\s\/-]+((?!browser|netcast)\w+)/i,
444
+ /\blg(\-?[\d\w]+)\s+build/i
550
445
  ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
551
446
 
552
- /(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+)|[\w-]+)/i // Lenovo tablets
553
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
554
- /droid.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
447
+ // Lenovo
448
+ /(ideatab[\w\-\s]+)/i,
449
+ /lenovo\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+)|[\w-]+)/i // Lenovo tablets
555
450
  ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
556
- /(lenovo)[_\s-]?([\w-]+)/i
557
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
558
451
 
559
- /linux;.+((jolla));/i // Jolla
560
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
452
+ // Nokia
453
+ /(?:maemo|nokia).*(n900|lumia\s\d+)/i,
454
+ /nokia[\s_-]?([\w\.-]*)/i
455
+ ], [MODEL, [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
561
456
 
562
- /((pebble))app\/[\d\.]+\s/i // Pebble
563
- ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
457
+ // Google
458
+ /droid.+;\s(pixel\sc)[\s)]/i // Google Pixel C
459
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
460
+ /droid.+;\s(pixel[\s\daxl]{0,6})(?:\sbuild|\))/i // Google Pixel
461
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
564
462
 
565
- /droid.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
566
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
463
+ // Sony
464
+ /droid.+\s([c-g]\d{4}|so[-l]\w+|xq-a\w[4-7][12])(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
465
+ ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
466
+ /sony\stablet\s[ps]\sbuild\//i,
467
+ /(?:sony)?sgp\w+(?:\sbuild\/|\))/i
468
+ ], [[MODEL, 'Xperia Tablet'], [VENDOR, 'Sony'], [TYPE, TABLET]], [
567
469
 
568
- /crkey/i // Google Chromecast
569
- ], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
470
+ // OnePlus
471
+ /\s(kb2005|in20[12]5|be20[12][59])\b/i,
472
+ /\ba000(1)\s+build/i, // OnePlus
473
+ /\boneplus\s(a\d{4})[\s)]/i
474
+ ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
570
475
 
571
- /droid.+;\s(glass)\s\d/i // Google Glass
572
- ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
476
+ // Amazon
477
+ /(alexa)webm/i,
478
+ /(kf[a-z]+)(\sbuild\/|\)).+silk\//i // Kindle Fire HD
479
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
480
+ /(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i // Fire Phone
481
+ ], [[MODEL, 'Fire Phone'], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
573
482
 
574
- /droid.+;\s(pixel c)[\s)]/i // Google Pixel C
575
- ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
483
+ // BlackBerry
484
+ /\((playbook);[\w\s\),;-]+(rim)/i // BlackBerry PlayBook
485
+ ], [MODEL, VENDOR, [TYPE, TABLET]], [
486
+ /\(bb10;\s(\w+)/i // BlackBerry 10
487
+ ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
488
+
489
+ // Asus
490
+ /\b(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus\s7|padfone|p00c)/i
491
+ ], [MODEL, [VENDOR, 'ASUS'], [TYPE, TABLET]], [
492
+ /\s(z[es]6[027][01][km][ls]|zenfone\s\d\w?)\b/i
493
+ ], [MODEL, [VENDOR, 'ASUS'], [TYPE, MOBILE]], [
576
494
 
577
- /droid.+;\s(pixel( [2-9]a?)?( xl)?)[\s)]/i // Google Pixel
578
- ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
495
+ // HTC
496
+ /(nexus\s9)/i // HTC Nexus 9
497
+ ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
498
+ /(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
579
499
 
580
- /droid.+;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
581
- /droid.+(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi
582
- /droid.+(redmi[\s\-_]?(?:note|k)?(?:[\s_]?[\w\s]+))(?:\sbuild|\))/i,
583
- // Xiaomi Redmi
584
- /droid.+(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i
585
- // Xiaomi Mi
586
- ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
587
- /droid.+(mi[\s\-_]?(?:pad)(?:[\s_]?[\w\s]+))(?:\sbuild|\))/i // Mi Pad tablets
588
- ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
589
- /droid.+;\s(m[1-5]\snote)\sbuild/i // Meizu
500
+ // ZTE
501
+ /(zte)-(\w*)/i,
502
+ /(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
503
+ ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
504
+
505
+ // Acer
506
+ /droid[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i
507
+ ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
508
+
509
+ // Meizu
510
+ /droid.+;\s(m[1-5]\snote)\sbuild/i,
511
+ /\bmz-([\w-]{2,})/i
590
512
  ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
591
- /(mz)-([\w-]{2,})/i
592
- ], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
593
513
 
594
- /droid.+a000(1)\s+build/i, // OnePlus
595
- /droid.+oneplus\s(a\d{4})[\s)]/i
596
- ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
514
+ // MIXED
515
+ /(blackberry)[\s-]?(\w+)/i, // BlackBerry
516
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
517
+ // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
518
+ /(hp)\s([\w\s]+\w)/i, // HP iPAQ
519
+ /(asus)-?(\w+)/i, // Asus
520
+ /(microsoft);\s(lumia[\s\w]+)/i, // Microsoft Lumia
521
+ /(lenovo)[_\s-]?([\w-]+)/i, // Lenovo
522
+ /linux;.+(jolla);/i, // Jolla
523
+ /droid.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
524
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
597
525
 
598
- /droid.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
599
- ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
526
+ /(archos)\s(gamepad2?)/i, // Archos
527
+ /(hp).+(touchpad)/i, // HP TouchPad
528
+ /(hp).+(tablet)/i, // HP Tablet
529
+ /(kindle)\/([\w\.]+)/i, // Kindle
530
+ /\s(nook)[\w\s]+build\/(\w+)/i, // Nook
531
+ /(dell)\s(strea[kpr\s\d]*[\dko])/i, // Dell Streak
532
+ /[;\/]\s?(le[\s\-]+pan)[\s\-]+(\w{1,9})\sbuild/i, // Le Pan Tablets
533
+ /[;\/]\s?(trinity)[\-\s]*(t\d{3})\sbuild/i, // Trinity Tablets
534
+ /\b(gigaset)[\s\-]+(q\w{1,9})\sbuild/i, // Gigaset Tablets
535
+ /\b(vodafone)\s([\w\s]+)(?:\)|\sbuild)/i // Vodafone
536
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
600
537
 
601
- /droid.+[;\/\s](Venue[\d\s]{2,7})\s+build/i // Dell Venue Tablets
538
+ /\s(surface\sduo)\s/i // Surface Duo
539
+ ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, TABLET]], [
540
+ /\s(u304aa)\sbuild/i // AT&T
541
+ ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
542
+ /sie-(\w*)/i // Siemens
543
+ ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
544
+ /[;\/]\s?(rct\w+)\sbuild/i // RCA Tablets
545
+ ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
546
+ /[;\/\s](venue[\d\s]{2,7})\sbuild/i // Dell Venue Tablets
602
547
  ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
603
-
604
- /droid.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet
548
+ /[;\/]\s?(q(?:mv|ta)\w+)\sbuild/i // Verizon Tablet
605
549
  ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
606
-
607
- /droid.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(\S(?:.*\S)?)\s+build/i
608
- ], [[VENDOR, 'Barnes & Noble'], MODEL, [TYPE, TABLET]], [
609
-
610
- /droid.+[;\/]\s+(TM\d{3}.*\b)\s+build/i // Barnes & Noble Tablet
550
+ /[;\/]\s(?:barnes[&\s]+noble\s|bn[rt])([\w\s\+]*)\sbuild/i // Barnes & Noble Tablet
551
+ ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
552
+ /[;\/]\s(tm\d{3}\w+)\sbuild/i
611
553
  ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
612
-
613
- /droid.+;\s(k88)\sbuild/i // ZTE K Series Tablet
554
+ /;\s(k88)\sbuild/i // ZTE K Series Tablet
614
555
  ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
615
-
616
- /droid.+;\s(nx\d{3}j)\sbuild/i // ZTE Nubia
556
+ /;\s(nx\d{3}j)\sbuild/i // ZTE Nubia
617
557
  ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
618
-
619
- /droid.+[;\/]\s*(gen\d{3})\s+build.*49h/i // Swiss GEN Mobile
558
+ /[;\/]\s?(gen\d{3})\sbuild.*49h/i // Swiss GEN Mobile
620
559
  ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
621
-
622
- /droid.+[;\/]\s*(zur\d{3})\s+build/i // Swiss ZUR Tablet
560
+ /[;\/]\s?(zur\d{3})\sbuild/i // Swiss ZUR Tablet
623
561
  ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
624
-
625
- /droid.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i // Zeki Tablets
562
+ /[;\/]\s?((zeki)?tb.*\b)\sbuild/i // Zeki Tablets
626
563
  ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
627
-
628
- /(android).+[;\/]\s+([YR]\d{2})\s+build/i,
629
- /droid.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i // Dragon Touch Tablet
564
+ /[;\/]\s([yr]\d{2})\sbuild/i,
565
+ /[;\/]\s(dragon[\-\s]+touch\s|dt)(\w{5})\sbuild/i // Dragon Touch Tablet
630
566
  ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
631
-
632
- /droid.+[;\/]\s*(NS-?\w{0,9})\sbuild/i // Insignia Tablets
567
+ /[;\/]\s?(ns-?\w{0,9})\sbuild/i // Insignia Tablets
633
568
  ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
634
-
635
- /droid.+[;\/]\s*((NXA|Next)-?\w{0,9})\s+build/i // NextBook Tablets
569
+ /[;\/]\s?((nxa|Next)-?\w{0,9})\sbuild/i // NextBook Tablets
636
570
  ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
637
-
638
- /droid.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
571
+ /[;\/]\s?(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05]))\sbuild/i
639
572
  ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
640
-
641
- /droid.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i // LvTel Phones
573
+ /[;\/]\s?(lvtel\-)?(v1[12])\sbuild/i // LvTel Phones
642
574
  ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
643
-
644
- /droid.+;\s(PH-1)\s/i
575
+ /;\s(ph-1)\s/i
645
576
  ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1
646
-
647
- /droid.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
577
+ /[;\/]\s?(v(100md|700na|7011|917g).*\b)\sbuild/i // Envizen Tablets
648
578
  ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
579
+ /[;\/]\s?(trio[\s\w\-\.]+)\sbuild/i // MachSpeed Tablets
580
+ ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
581
+ /[;\/]\s?tu_(1491)\sbuild/i // Rotor Tablets
582
+ ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
583
+ /(shield[\w\s]+)\sbuild/i // Nvidia Shield Tablets
584
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
585
+ /(sprint)\s(\w+)/i // Sprint Phones
586
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
587
+ /(kin\.[onetw]{3})/i // Microsoft Kin
588
+ ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
589
+ /droid\s[\d\.]+;\s(cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
590
+ ], [MODEL, [VENDOR, 'Zebra'], [TYPE, TABLET]], [
591
+ /droid\s[\d\.]+;\s(ec30|ps20|tc[2-8]\d[kx])\)/i
592
+ ], [MODEL, [VENDOR, 'Zebra'], [TYPE, MOBILE]], [
649
593
 
650
- /droid.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i // Le Pan Tablets
651
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
594
+ ///////////////////
595
+ // CONSOLES
596
+ ///////////////////
652
597
 
653
- /droid.+[;\/]\s*(Trio[\s\w\-\.]+)\s+build/i // MachSpeed Tablets
654
- ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
598
+ /\s(ouya)\s/i, // Ouya
599
+ /(nintendo)\s([wids3utch]+)/i // Nintendo
600
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
601
+ /droid.+;\s(shield)\sbuild/i // Nvidia
602
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
603
+ /(playstation\s[345portablevi]+)/i // Playstation
604
+ ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
605
+ /[\s\(;](xbox(?:\sone)?(?!;\sxbox))[\s\);]/i // Microsoft Xbox
606
+ ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
655
607
 
656
- /droid.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i // Trinity Tablets
657
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
608
+ ///////////////////
609
+ // SMARTTVS
610
+ ///////////////////
658
611
 
659
- /droid.+[;\/]\s*TU_(1491)\s+build/i // Rotor Tablets
660
- ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
612
+ /smart-tv.+(samsung)/i // Samsung
613
+ ], [VENDOR, [TYPE, SMARTTV], MODEL], [
614
+ /hbbtv.+maple;(\d+)/i
615
+ ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
616
+ /linux;\snetcast.+smarttv/i, // LG SmartTV
617
+ /lg\snetcast\.tv-201\d/i
618
+ ], [[VENDOR, 'LG'], MODEL, [TYPE, SMARTTV]], [
619
+ /(apple)\s?tv/i // Apple TV
620
+ ], [VENDOR, [MODEL, 'Apple TV'], [TYPE, SMARTTV]], [
621
+ /crkey/i // Google Chromecast
622
+ ], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
623
+ /droid.+aft([\w])(\sbuild\/|\))/i // Fire TV
624
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
625
+ /\(dtv[\);].+(aquos)/i // Sharp
626
+ ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
627
+ /hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
628
+ ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
629
+ /[\s\/\(](android\s|smart[-\s]?|opera\s)tv[;\)\s]/i // SmartTV from Unidentified Vendors
630
+ ], [[TYPE, SMARTTV]], [
661
631
 
662
- //android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
663
- //], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
632
+ ///////////////////
633
+ // WEARABLES
634
+ ///////////////////
664
635
 
665
- /droid.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i // Gigaset Tablets
666
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
636
+ /((pebble))app\/[\d\.]+\s/i // Pebble
637
+ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
638
+ /droid.+;\s(glass)\s\d/i // Google Glass
639
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
640
+ /droid\s[\d\.]+;\s(wt63?0{2,3})\)/i
641
+ ], [MODEL, [VENDOR, 'Zebra'], [TYPE, WEARABLE]], [
667
642
 
668
- /[\s\/\(](android\stv|smart-?tv)[;\)\s]/i // SmartTV from Unidentified Vendors
669
- ], [[TYPE, SMARTTV]], [
670
- // Android Phones from Unidentified Vendors
671
- /droid .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i
643
+ ////////////////////
644
+ // MIXED (GENERIC)
645
+ ///////////////////
646
+
647
+ /droid .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i // Android Phones from Unidentified Vendors
672
648
  ], [MODEL, [TYPE, MOBILE]], [
673
- // Android Tablets from Unidentified Vendors
674
- /droid .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i
649
+ /droid .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
675
650
  ], [MODEL, [TYPE, TABLET]], [
676
-
677
651
  /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
678
652
  /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
679
- ], [[TYPE, util.lowerize], VENDOR, MODEL], [
680
-
653
+ ], [[TYPE, util.lowerize]], [
681
654
  /(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
682
655
  ], [MODEL, [VENDOR, 'Generic']], [
683
-
684
656
  /(phone)/i
685
657
  ], [[TYPE, MOBILE]]
686
658
  ],
@@ -700,39 +672,46 @@
700
672
  /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
701
673
  ], [NAME, VERSION], [
702
674
 
703
- /rv\:([\w\.]{1,9}).+(gecko)/i // Gecko
675
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
704
676
  ], [VERSION, NAME]
705
677
  ],
706
678
 
707
679
  os : [[
708
680
 
709
- // Xbox, consider this before other Windows-based devices
710
- /(xbox);\s+xbox\s([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
711
-
712
- // Windows based
681
+ // Windows
713
682
  /microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
714
683
  ], [NAME, VERSION], [
715
684
  /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
716
685
  /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, // Windows Phone
717
- /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
686
+ /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)(?!.+xbox)/i
718
687
  ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
719
688
  /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
720
689
  ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
721
690
 
722
- // Mobile/Embedded OS
723
- /\((bb)(10);/i // BlackBerry 10
724
- ], [[NAME, 'BlackBerry'], VERSION], [
725
- /(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
726
- /(tizen|kaios)[\/\s]([\w\.]+)/i, // Tizen/KaiOS
727
- /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i
691
+ // iOS/macOS
692
+ /ip[honead]{2,4}\b(?:.*os\s([\w]+)\slike\smac|;\sopera)/i, // iOS
693
+ /cfnetwork\/.+darwin/i
694
+ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
695
+ /(mac\sos\sx)\s?([\w\s\.]*)/i,
696
+ /(macintosh|mac(?=_powerpc)\s)(?!.+haiku)/i // Mac OS
697
+ ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
698
+
699
+ // Mobile OSes
700
+ /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i,
728
701
  // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
702
+ /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
703
+ /(tizen|kaios)[\/\s]([\w\.]+)/i // Tizen/KaiOS
729
704
  ], [NAME, VERSION], [
730
- /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i // Symbian
731
- ], [[NAME, 'Symbian'], VERSION], [
705
+ /\(bb(10);/i // BlackBerry 10
706
+ ], [VERSION, [NAME, 'BlackBerry']], [
707
+ /(?:symbian\s?os|symbos|s60(?=;)|series60)[\/\s-]?([\w\.]*)/i // Symbian
708
+ ], [VERSION, [NAME, 'Symbian']], [
732
709
  /\((series40);/i // Series 40
733
710
  ], [NAME], [
734
711
  /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
735
- ], [[NAME, 'Firefox OS'], VERSION], [
712
+ ], [[NAME, 'Firefox OS']], [
713
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
714
+ ], [VERSION, [NAME, 'webOS']], [
736
715
 
737
716
  // Google Chromecast
738
717
  /crkey\/([\d\.]+)/i // Google Chromecast
@@ -740,11 +719,12 @@
740
719
 
741
720
  // Console
742
721
  /(nintendo|playstation)\s([wids345portablevuch]+)/i, // Nintendo/Playstation
722
+ /(xbox);\s+xbox\s([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
743
723
 
744
724
  // GNU/Linux based
745
- /(mint)[\/\s\(]?(\w*)/i, // Mint
725
+ /(mint)[\/\s\(\)]?(\w*)/i, // Mint
746
726
  /(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
747
- /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]*)/i,
727
+ /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?=\slinux)|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus|raspbian)(?:\sgnu\/linux)?(?:\slinux)?[\/\s-]?(?!chrom|package)([\w\.-]*)/i,
748
728
  // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
749
729
  // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
750
730
  /(hurd|linux)\s?([\w\.]*)/i, // Hurd/Linux
@@ -759,20 +739,12 @@
759
739
  ], [[NAME, 'Solaris'], VERSION], [
760
740
 
761
741
  // BSD based
762
- /\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]*)/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
742
+ /\s([frentopc-]{0,4}bsd|dragonfly)\s?(?!amd|[ix346]{1,2}86)([\w\.]*)/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
763
743
  ], [NAME, VERSION],[
764
744
 
765
745
  /(haiku)\s(\w+)/i // Haiku
766
746
  ], [NAME, VERSION],[
767
747
 
768
- /cfnetwork\/.+darwin/i,
769
- /ip[honead]{2,4}(?:.*os\s([\w]+)\slike\smac|;\sopera)/i // iOS
770
- ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
771
-
772
- /(mac\sos\sx)\s?([\w\s\.]*)/i,
773
- /(macintosh|mac(?=_powerpc)\s)/i // Mac OS
774
- ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
775
-
776
748
  // Other
777
749
  /((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris
778
750
  /(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX
@@ -787,45 +759,45 @@
787
759
  /////////////////
788
760
  // Constructor
789
761
  ////////////////
790
- var UAParser = function (uastring, extensions) {
762
+ var UAParser = function (ua, extensions) {
791
763
 
792
- if (typeof uastring === 'object') {
793
- extensions = uastring;
794
- uastring = undefined;
764
+ if (typeof ua === 'object') {
765
+ extensions = ua;
766
+ ua = undefined;
795
767
  }
796
-
768
+
797
769
  if (!(this instanceof UAParser)) {
798
- return new UAParser(uastring, extensions).getResult();
770
+ return new UAParser(ua, extensions).getResult();
799
771
  }
800
-
801
- var ua = uastring || ((typeof window !== 'undefined' && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
802
- var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
772
+
773
+ var _ua = ua || ((typeof window !== 'undefined' && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
774
+ var _rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
803
775
 
804
776
  this.getBrowser = function () {
805
- var browser = { name: undefined, version: undefined };
806
- mapper.rgx.call(browser, ua, rgxmap.browser);
807
- browser.major = util.major(browser.version); // deprecated
808
- return browser;
777
+ var _browser = { name: undefined, version: undefined };
778
+ mapper.rgx.call(_browser, _ua, _rgxmap.browser);
779
+ _browser.major = util.major(_browser.version); // deprecated
780
+ return _browser;
809
781
  };
810
782
  this.getCPU = function () {
811
- var cpu = { architecture: undefined };
812
- mapper.rgx.call(cpu, ua, rgxmap.cpu);
813
- return cpu;
783
+ var _cpu = { architecture: undefined };
784
+ mapper.rgx.call(_cpu, _ua, _rgxmap.cpu);
785
+ return _cpu;
814
786
  };
815
787
  this.getDevice = function () {
816
- var device = { vendor: undefined, model: undefined, type: undefined };
817
- mapper.rgx.call(device, ua, rgxmap.device);
818
- return device;
788
+ var _device = { vendor: undefined, model: undefined, type: undefined };
789
+ mapper.rgx.call(_device, _ua, _rgxmap.device);
790
+ return _device;
819
791
  };
820
792
  this.getEngine = function () {
821
- var engine = { name: undefined, version: undefined };
822
- mapper.rgx.call(engine, ua, rgxmap.engine);
823
- return engine;
793
+ var _engine = { name: undefined, version: undefined };
794
+ mapper.rgx.call(_engine, _ua, _rgxmap.engine);
795
+ return _engine;
824
796
  };
825
797
  this.getOS = function () {
826
- var os = { name: undefined, version: undefined };
827
- mapper.rgx.call(os, ua, rgxmap.os);
828
- return os;
798
+ var _os = { name: undefined, version: undefined };
799
+ mapper.rgx.call(_os, _ua, _rgxmap.os);
800
+ return _os;
829
801
  };
830
802
  this.getResult = function () {
831
803
  return {
@@ -838,12 +810,13 @@
838
810
  };
839
811
  };
840
812
  this.getUA = function () {
841
- return ua;
813
+ return _ua;
842
814
  };
843
- this.setUA = function (uastring) {
844
- ua = uastring;
815
+ this.setUA = function (ua) {
816
+ _ua = ua.length > UA_MAX_LENGTH ? util.trim(ua, UA_MAX_LENGTH) : ua;
845
817
  return this;
846
818
  };
819
+ this.setUA(_ua);
847
820
  return this;
848
821
  };
849
822