ua-parser-js 2.0.0-beta.3 → 2.0.0-rc.1

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 (197) hide show
  1. package/README.md +22 -17
  2. package/dist/icons/color/LICENSE.md +3 -0
  3. package/dist/icons/color/browser/android-browser.svg +1 -0
  4. package/dist/icons/color/browser/avant.png +0 -0
  5. package/dist/icons/color/browser/basilisk.png +0 -0
  6. package/dist/icons/color/browser/basilisk.svg +1 -0
  7. package/dist/icons/color/browser/brave.png +0 -0
  8. package/dist/icons/color/browser/brave.svg +1 -0
  9. package/dist/icons/color/browser/chrome.png +0 -0
  10. package/dist/icons/color/browser/chrome.svg +1 -0
  11. package/dist/icons/color/browser/chromium.png +0 -0
  12. package/dist/icons/color/browser/chromium.svg +1 -0
  13. package/dist/icons/color/browser/coc-coc.png +0 -0
  14. package/dist/icons/color/browser/default.png +0 -0
  15. package/dist/icons/color/browser/default.svg +1 -0
  16. package/dist/icons/color/browser/dolphin.png +0 -0
  17. package/dist/icons/color/browser/edge.png +0 -0
  18. package/dist/icons/color/browser/edge.svg +1 -0
  19. package/dist/icons/color/browser/electron.png +0 -0
  20. package/dist/icons/color/browser/electron.svg +1 -0
  21. package/dist/icons/color/browser/falkon.png +0 -0
  22. package/dist/icons/color/browser/falkon.svg +1 -0
  23. package/dist/icons/color/browser/firefox-reality.png +0 -0
  24. package/dist/icons/color/browser/firefox-reality.svg +1 -0
  25. package/dist/icons/color/browser/firefox.png +0 -0
  26. package/dist/icons/color/browser/firefox.svg +1 -0
  27. package/dist/icons/color/browser/gsa.svg +9 -0
  28. package/dist/icons/color/browser/icecat.png +0 -0
  29. package/dist/icons/color/browser/ie.svg +6 -0
  30. package/dist/icons/color/browser/konqueror.png +0 -0
  31. package/dist/icons/color/browser/konqueror.svg +1 -0
  32. package/dist/icons/color/browser/maxthon.png +0 -0
  33. package/dist/icons/color/browser/midori.png +0 -0
  34. package/dist/icons/color/browser/midori.svg +1 -0
  35. package/dist/icons/color/browser/netsurf.png +0 -0
  36. package/dist/icons/color/browser/netsurf.svg +1 -0
  37. package/dist/icons/color/browser/opera-gx.png +0 -0
  38. package/dist/icons/color/browser/opera-gx.svg +1 -0
  39. package/dist/icons/color/browser/opera-mini.png +0 -0
  40. package/dist/icons/color/browser/opera-touch.png +0 -0
  41. package/dist/icons/color/browser/opera.png +0 -0
  42. package/dist/icons/color/browser/opera.svg +1 -0
  43. package/dist/icons/color/browser/palemoon.png +0 -0
  44. package/dist/icons/color/browser/puffin.png +0 -0
  45. package/dist/icons/color/browser/safari.png +0 -0
  46. package/dist/icons/color/browser/safari.svg +1 -0
  47. package/dist/icons/color/browser/samsung-internet.png +0 -0
  48. package/dist/icons/color/browser/samsung-internet.svg +1 -0
  49. package/dist/icons/color/browser/seamonkey.png +0 -0
  50. package/dist/icons/color/browser/silk.png +0 -0
  51. package/dist/icons/color/browser/sogou-mobile.png +0 -0
  52. package/dist/icons/color/browser/ucbrowser.png +0 -0
  53. package/dist/icons/color/browser/ucbrowser.svg +1 -0
  54. package/dist/icons/color/browser/vivaldi.png +0 -0
  55. package/dist/icons/color/browser/vivaldi.svg +1 -0
  56. package/dist/icons/color/browser/webkit.png +0 -0
  57. package/dist/icons/color/browser/webkit.svg +1 -0
  58. package/dist/icons/color/browser/yandex.png +0 -0
  59. package/dist/icons/color/os/centos.svg +1 -0
  60. package/dist/icons/mono/LICENSE.md +3 -0
  61. package/dist/icons/mono/browser/alipay.svg +1 -0
  62. package/dist/icons/mono/browser/android-browser.svg +1 -0
  63. package/dist/icons/mono/browser/avast-secure-browser.svg +1 -0
  64. package/dist/icons/mono/browser/baidu-browser.svg +1 -0
  65. package/dist/icons/mono/browser/brave.svg +1 -0
  66. package/dist/icons/mono/browser/chrome-headless.svg +1 -0
  67. package/dist/icons/mono/browser/chrome-webview.svg +1 -0
  68. package/dist/icons/mono/browser/chrome.svg +1 -0
  69. package/dist/icons/mono/browser/chromium.svg +1 -0
  70. package/dist/icons/mono/browser/duckduckgo.svg +1 -0
  71. package/dist/icons/mono/browser/edge.svg +1 -0
  72. package/dist/icons/mono/browser/electron.svg +1 -0
  73. package/dist/icons/mono/browser/facebook.svg +1 -0
  74. package/dist/icons/mono/browser/firefox-focus.svg +1 -0
  75. package/dist/icons/mono/browser/firefox-reality.svg +1 -0
  76. package/dist/icons/mono/browser/firefox.svg +1 -0
  77. package/dist/icons/mono/browser/gsa.svg +1 -0
  78. package/dist/icons/mono/browser/huawei-browser.svg +1 -0
  79. package/dist/icons/mono/browser/icecat.svg +1 -0
  80. package/dist/icons/mono/browser/ie.svg +1 -0
  81. package/dist/icons/mono/browser/instagram.svg +1 -0
  82. package/dist/icons/mono/browser/jasmine.svg +1 -0
  83. package/dist/icons/mono/browser/kakaotalk.svg +1 -0
  84. package/dist/icons/mono/browser/klarna.svg +1 -0
  85. package/dist/icons/mono/browser/line.svg +1 -0
  86. package/dist/icons/mono/browser/linkedin.svg +1 -0
  87. package/dist/icons/mono/browser/miui-browser.svg +1 -0
  88. package/dist/icons/mono/browser/mobile-chrome.svg +1 -0
  89. package/dist/icons/mono/browser/mobile-firefox.svg +1 -0
  90. package/dist/icons/mono/browser/mobile-safari.svg +1 -0
  91. package/dist/icons/mono/browser/mozilla.svg +1 -0
  92. package/dist/icons/mono/browser/naver.svg +1 -0
  93. package/dist/icons/mono/browser/nokia-browser.svg +1 -0
  94. package/dist/icons/mono/browser/oculus-browser.svg +1 -0
  95. package/dist/icons/mono/browser/opera-coast.svg +1 -0
  96. package/dist/icons/mono/browser/opera-gx.svg +1 -0
  97. package/dist/icons/mono/browser/opera-mini.svg +1 -0
  98. package/dist/icons/mono/browser/opera-mobi.svg +1 -0
  99. package/dist/icons/mono/browser/opera-tablet.svg +1 -0
  100. package/dist/icons/mono/browser/opera-touch.svg +1 -0
  101. package/dist/icons/mono/browser/opera.svg +1 -0
  102. package/dist/icons/mono/browser/qqbrowser.svg +1 -0
  103. package/dist/icons/mono/browser/qqbrowserlite.svg +1 -0
  104. package/dist/icons/mono/browser/safari.svg +1 -0
  105. package/dist/icons/mono/browser/sailfish-browser.svg +1 -0
  106. package/dist/icons/mono/browser/samsung-internet.svg +1 -0
  107. package/dist/icons/mono/browser/smart-lenovo-browser.svg +1 -0
  108. package/dist/icons/mono/browser/snapchat.svg +1 -0
  109. package/dist/icons/mono/browser/sogou-explorer.svg +1 -0
  110. package/dist/icons/mono/browser/sogou-mobile.svg +1 -0
  111. package/dist/icons/mono/browser/tesla.svg +1 -0
  112. package/dist/icons/mono/browser/tiktok.svg +1 -0
  113. package/dist/icons/mono/browser/twitter.svg +1 -0
  114. package/dist/icons/mono/browser/vivaldi.svg +1 -0
  115. package/dist/icons/mono/browser/vivo-browser.svg +1 -0
  116. package/dist/icons/mono/browser/wechat.svg +1 -0
  117. package/dist/icons/mono/browser/weibo.svg +1 -0
  118. package/dist/icons/mono/browser/yandex.svg +1 -0
  119. package/dist/icons/mono/device/acer.svg +1 -0
  120. package/dist/icons/mono/device/amazon.svg +1 -0
  121. package/dist/icons/mono/device/apple.svg +1 -0
  122. package/dist/icons/mono/device/asus.svg +1 -0
  123. package/dist/icons/mono/device/att.svg +1 -0
  124. package/dist/icons/mono/device/blackberry.svg +1 -0
  125. package/dist/icons/mono/device/dell.svg +1 -0
  126. package/dist/icons/mono/device/facebook.svg +1 -0
  127. package/dist/icons/mono/device/fairphone.svg +1 -0
  128. package/dist/icons/mono/device/google.svg +1 -0
  129. package/dist/icons/mono/device/hp.svg +1 -0
  130. package/dist/icons/mono/device/huawei.svg +1 -0
  131. package/dist/icons/mono/device/lenovo.svg +1 -0
  132. package/dist/icons/mono/device/lg.svg +1 -0
  133. package/dist/icons/mono/device/meizu.svg +1 -0
  134. package/dist/icons/mono/device/microsoft.svg +1 -0
  135. package/dist/icons/mono/device/motorola.svg +1 -0
  136. package/dist/icons/mono/device/nintendo.svg +1 -0
  137. package/dist/icons/mono/device/nokia.svg +1 -0
  138. package/dist/icons/mono/device/nvidia.svg +1 -0
  139. package/dist/icons/mono/device/oneplus.svg +1 -0
  140. package/dist/icons/mono/device/oppo.svg +1 -0
  141. package/dist/icons/mono/device/panasonic.svg +1 -0
  142. package/dist/icons/mono/device/roku.svg +1 -0
  143. package/dist/icons/mono/device/samsung.svg +1 -0
  144. package/dist/icons/mono/device/siemens.svg +1 -0
  145. package/dist/icons/mono/device/sony.svg +1 -0
  146. package/dist/icons/mono/device/tesla.svg +1 -0
  147. package/dist/icons/mono/device/vivo.svg +1 -0
  148. package/dist/icons/mono/device/vodafone.svg +1 -0
  149. package/dist/icons/mono/device/xiaomi.svg +1 -0
  150. package/dist/icons/mono/device/zebra.svg +1 -0
  151. package/dist/icons/mono/os/android.svg +1 -0
  152. package/dist/icons/mono/os/arch.svg +1 -0
  153. package/dist/icons/mono/os/blackberry.svg +1 -0
  154. package/dist/icons/mono/os/centos.svg +1 -0
  155. package/dist/icons/mono/os/chrome-os.svg +1 -0
  156. package/dist/icons/mono/os/chromecast.svg +1 -0
  157. package/dist/icons/mono/os/debian.svg +1 -0
  158. package/dist/icons/mono/os/deepin.svg +1 -0
  159. package/dist/icons/mono/os/elementary-os.svg +1 -0
  160. package/dist/icons/mono/os/fedora.svg +1 -0
  161. package/dist/icons/mono/os/firefox.svg +1 -0
  162. package/dist/icons/mono/os/freebsd.svg +1 -0
  163. package/dist/icons/mono/os/gentoo.svg +1 -0
  164. package/dist/icons/mono/os/gnu.svg +1 -0
  165. package/dist/icons/mono/os/harmonyos.svg +1 -0
  166. package/dist/icons/mono/os/ios.svg +1 -0
  167. package/dist/icons/mono/os/kaios.svg +1 -0
  168. package/dist/icons/mono/os/linux.svg +1 -0
  169. package/dist/icons/mono/os/macos.svg +1 -0
  170. package/dist/icons/mono/os/manjaro.svg +1 -0
  171. package/dist/icons/mono/os/mint.svg +1 -0
  172. package/dist/icons/mono/os/netbsd.svg +1 -0
  173. package/dist/icons/mono/os/nintendo.svg +1 -0
  174. package/dist/icons/mono/os/openbsd.svg +1 -0
  175. package/dist/icons/mono/os/playstation.svg +1 -0
  176. package/dist/icons/mono/os/raspbian.svg +1 -0
  177. package/dist/icons/mono/os/redhat.svg +1 -0
  178. package/dist/icons/mono/os/sailfish.svg +1 -0
  179. package/dist/icons/mono/os/slackware.svg +1 -0
  180. package/dist/icons/mono/os/suse.svg +1 -0
  181. package/dist/icons/mono/os/ubuntu.svg +1 -0
  182. package/dist/icons/mono/os/windows.svg +1 -0
  183. package/dist/icons/mono/os/xbox.svg +1 -0
  184. package/dist/ua-parser.min.js +2 -2
  185. package/dist/ua-parser.pack.js +2 -2
  186. package/package.json +7 -4
  187. package/src/enums/ua-parser-enums.js +13 -5
  188. package/src/enums/ua-parser-enums.mjs +13 -5
  189. package/src/extensions/ua-parser-extensions.d.ts +1 -0
  190. package/src/extensions/ua-parser-extensions.js +100 -75
  191. package/src/extensions/ua-parser-extensions.mjs +100 -75
  192. package/src/helpers/ua-parser-helpers.d.ts +11 -3
  193. package/src/helpers/ua-parser-helpers.js +44 -5
  194. package/src/helpers/ua-parser-helpers.mjs +45 -6
  195. package/src/main/ua-parser.d.ts +2 -2
  196. package/src/main/ua-parser.js +59 -17
  197. package/src/main/ua-parser.mjs +59 -17
@@ -1,5 +1,5 @@
1
1
  ///////////////////////////////////////////////
2
- /* Helpers for UAParser.js v2.0.0-beta.3
2
+ /* Helpers for UAParser.js v2.0.0-rc.1
3
3
  https://github.com/faisalman/ua-parser-js
4
4
  Author: Faisal Salman <f@faisalman.com>
5
5
  AGPLv3 License */
@@ -8,15 +8,54 @@
8
8
  /*jshint esversion: 6 */
9
9
 
10
10
  const { CPU, OS, Engine } = require('../enums/ua-parser-enums');
11
+ const { UAParser } = require('../main/ua-parser');
12
+ const { isFromEU } = require('detect-europe-js');
11
13
 
12
- const isAppleSilicon = (res) => res.os.is(OS.MACOS) && res.cpu.is(CPU.ARM);
14
+ const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;
13
15
 
14
- const isChromiumBased = (res) => res.engine.is(Engine.BLINK);
16
+ const isAppleSilicon = (res) => {
17
+ if (res.os.is(OS.MACOS)) {
18
+ if (res.cpu.is(CPU.ARM)) {
19
+ return true;
20
+ }
21
+ try {
22
+ const canvas = document.createElement('canvas');
23
+ const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
24
+ const debug = webgl.getExtension('WEBGL_debug_renderer_info');
25
+ const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
26
+ if (renderer.match(/apple m\d/i)) {
27
+ return true;
28
+ }
29
+ } catch {
30
+ return false;
31
+ }
32
+ }
33
+ return false;
34
+ }
35
+
36
+ const isChromeFamily = (res) => res.engine.is(Engine.BLINK);
37
+
38
+ const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
39
+ / electron\//i.test(navigator?.userAgent)); // browser
15
40
 
16
41
  const isFrozenUA = (ua) => /^Mozilla\/5\.0 \((Windows NT 10\.0; Win64; x64|Macintosh; Intel Mac OS X 10_15_7|X11; Linux x86_64|X11; CrOS x86_64 14541\.0\.0|Fuchsia|Linux; Android 10; K)\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/\d+\.0\.0\.0 (Mobile )?Safari\/537\.36/.test(ua);
17
42
 
43
+ const isStandalonePWA = () => window && (window.matchMedia('(display-mode: standalone)').matches ||
44
+ // iOS
45
+ navigator.standalone ||
46
+ // Android
47
+ document.referrer.startsWith('android-app://') ||
48
+ // Windows
49
+ window.Windows ||
50
+ /trident.+(msapphost|webview)\//i.test(navigator.userAgent) ||
51
+ document.referrer.startsWith('app-info://platform/microsoft-store'));
52
+
18
53
  module.exports = {
54
+ getDeviceVendor,
19
55
  isAppleSilicon,
20
- isChromiumBased,
21
- isFrozenUA
56
+ isChromeFamily,
57
+ isElectron,
58
+ isFromEU,
59
+ isFrozenUA,
60
+ isStandalonePWA
22
61
  }
@@ -3,7 +3,7 @@
3
3
  // Source: /src/helpers/ua-parser-helpers.js
4
4
 
5
5
  ///////////////////////////////////////////////
6
- /* Helpers for UAParser.js v2.0.0-beta.3
6
+ /* Helpers for UAParser.js v2.0.0-rc.1
7
7
  https://github.com/faisalman/ua-parser-js
8
8
  Author: Faisal Salman <f@faisalman.com>
9
9
  AGPLv3 License */
@@ -11,16 +11,55 @@
11
11
 
12
12
  /*jshint esversion: 6 */
13
13
 
14
- import { CPU, OS, Engine } from '../enums/ua-parser-enums';
14
+ import { CPU, OS, Engine } from './enums/ua-parser-enums.mjs';
15
+ import { UAParser } from './main/ua-parser.mjs';
16
+ import { isFromEU } from 'detect-europe-js';
15
17
 
16
- const isAppleSilicon = (res) => res.os.is(OS.MACOS) && res.cpu.is(CPU.ARM);
18
+ const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;
17
19
 
18
- const isChromiumBased = (res) => res.engine.is(Engine.BLINK);
20
+ const isAppleSilicon = (res) => {
21
+ if (res.os.is(OS.MACOS)) {
22
+ if (res.cpu.is(CPU.ARM)) {
23
+ return true;
24
+ }
25
+ try {
26
+ const canvas = document.createElement('canvas');
27
+ const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
28
+ const debug = webgl.getExtension('WEBGL_debug_renderer_info');
29
+ const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
30
+ if (renderer.match(/apple m\d/i)) {
31
+ return true;
32
+ }
33
+ } catch {
34
+ return false;
35
+ }
36
+ }
37
+ return false;
38
+ }
39
+
40
+ const isChromeFamily = (res) => res.engine.is(Engine.BLINK);
41
+
42
+ const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
43
+ / electron\//i.test(navigator?.userAgent)); // browser
19
44
 
20
45
  const isFrozenUA = (ua) => /^Mozilla\/5\.0 \((Windows NT 10\.0; Win64; x64|Macintosh; Intel Mac OS X 10_15_7|X11; Linux x86_64|X11; CrOS x86_64 14541\.0\.0|Fuchsia|Linux; Android 10; K)\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/\d+\.0\.0\.0 (Mobile )?Safari\/537\.36/.test(ua);
21
46
 
47
+ const isStandalonePWA = () => window && (window.matchMedia('(display-mode: standalone)').matches ||
48
+ // iOS
49
+ navigator.standalone ||
50
+ // Android
51
+ document.referrer.startsWith('android-app://') ||
52
+ // Windows
53
+ window.Windows ||
54
+ /trident.+(msapphost|webview)\//i.test(navigator.userAgent) ||
55
+ document.referrer.startsWith('app-info://platform/microsoft-store'));
56
+
22
57
  export {
58
+ getDeviceVendor,
23
59
  isAppleSilicon,
24
- isChromiumBased,
25
- isFrozenUA
60
+ isChromeFamily,
61
+ isElectron,
62
+ isFromEU,
63
+ isFrozenUA,
64
+ isStandalonePWA
26
65
  }
@@ -8,14 +8,14 @@ declare namespace UAParser {
8
8
  is(val: string): boolean;
9
9
  toString(): string;
10
10
  withClientHints(): PromiseLike<T> | T;
11
- withFeatureCheck(): T;
11
+ withFeatureCheck(): PromiseLike<T> | T;
12
12
  }
13
13
 
14
14
  interface IBrowser extends IData<IBrowser> {
15
15
  name?: string;
16
16
  version?: string;
17
17
  major?: string;
18
- type?: 'crawler' | 'cli' | 'email' | 'fetcher' | 'inapp' | 'module';
18
+ type?: 'crawler' | 'cli' | 'email' | 'fetcher' | 'inapp' | 'mediaplayer' | 'module';
19
19
  }
20
20
 
21
21
  interface ICPU extends IData<ICPU> {
@@ -1,10 +1,10 @@
1
1
  /////////////////////////////////////////////////////////////////////////////////
2
- /* UAParser.js v2.0.0-beta.3
2
+ /* UAParser.js v2.0.0-rc.1
3
3
  Copyright © 2012-2024 Faisal Salman <f@faisalman.com>
4
4
  AGPLv3 License *//*
5
5
  Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
6
6
  Supports browser & node.js environment.
7
- Demo : https://faisalman.github.io/ua-parser-js
7
+ Demo : https://uaparser.dev
8
8
  Source : https://github.com/faisalman/ua-parser-js */
9
9
  /////////////////////////////////////////////////////////////////////////////////
10
10
 
@@ -19,7 +19,7 @@
19
19
  // Constants
20
20
  /////////////
21
21
 
22
- var LIBVERSION = '2.0.0-beta.3',
22
+ var LIBVERSION = '2.0.0-rc.1',
23
23
  EMPTY = '',
24
24
  UNKNOWN = '?',
25
25
  FUNC_TYPE = 'function',
@@ -82,6 +82,7 @@
82
82
  PREFIX_MOBILE = 'Mobile ',
83
83
  SUFFIX_BROWSER = ' Browser',
84
84
  CHROME = 'Chrome',
85
+ CHROMECAST = 'Chromecast',
85
86
  EDGE = 'Edge',
86
87
  FIREFOX = 'Firefox',
87
88
  OPERA = 'Opera',
@@ -327,11 +328,13 @@
327
328
  /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
328
329
 
329
330
  // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
330
- /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar)\/([-\w\.]+)/i,
331
- // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar
331
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio)\/([-\w\.]+)/i,
332
+ // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio
332
333
  /(heytap|ovi)browser\/([\d\.]+)/i, // HeyTap/Ovi
333
334
  /(weibo)__([\d\.]+)/i // Weibo
334
335
  ], [NAME, VERSION], [
336
+ /quark(?:pc)?\/([-\w\.]+)/i // Quark
337
+ ], [VERSION, [NAME, 'Quark']], [
335
338
  /\bddg\/([\w\.]+)/i // DuckDuckGo
336
339
  ], [VERSION, [NAME, 'DuckDuckGo']], [
337
340
  /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
@@ -497,8 +500,8 @@
497
500
  // Samsung
498
501
  /\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
499
502
  ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
500
- /\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
501
- /samsung[- ]([-\w]+)/i,
503
+ /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
504
+ /samsung[- ]((?!sm-[lr])[-\w]+)/i,
502
505
  /sec-(sgh\w+)/i
503
506
  ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
504
507
 
@@ -529,7 +532,7 @@
529
532
  /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
530
533
  /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
531
534
  /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
532
- /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i // Xiaomi Mi
535
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i // Xiaomi Mi
533
536
  ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
534
537
  /oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i, // Redmi Pad
535
538
  /\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
@@ -597,7 +600,7 @@
597
600
 
598
601
  // Amazon
599
602
  /(alexa)webm/i,
600
- /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i, // Kindle Fire without Silk / Echo Show
603
+ /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, // Kindle Fire without Silk / Echo Show
601
604
  /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
602
605
  ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
603
606
  /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
@@ -626,6 +629,17 @@
626
629
  /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
627
630
  ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
628
631
 
632
+ // TCL
633
+ /tcl (xess p17aa)/i,
634
+ /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
635
+ ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [
636
+ /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
637
+ ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [
638
+
639
+ // itel
640
+ /(itel) ((\w+))/i
641
+ ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [
642
+
629
643
  // Acer
630
644
  /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
631
645
  ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
@@ -639,6 +653,10 @@
639
653
  /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
640
654
  ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
641
655
 
656
+ // Nothing
657
+ /droid.+; (a(?:015|06[35]|142p?))/i
658
+ ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
659
+
642
660
  // MIXED
643
661
  /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\w]*)/i,
644
662
  // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
@@ -683,8 +701,14 @@
683
701
  ], [[VENDOR, LG], [TYPE, SMARTTV]], [
684
702
  /(apple) ?tv/i // Apple TV
685
703
  ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
686
- /crkey/i // Google Chromecast
687
- ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
704
+ /crkey.*devicetype\/chromecast/i // Google Chromecast Third Generation
705
+ ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
706
+ /crkey.*devicetype\/([^/]*)/i // Google Chromecast with specific device type
707
+ ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
708
+ /fuchsia.*crkey/i // Google Chromecast Nest Hub
709
+ ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
710
+ /crkey/i // Google Chromecast, Linux-based or unknown
711
+ ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
688
712
  /droid.+aft(\w+)( bui|\))/i // Fire TV
689
713
  ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
690
714
  /\(dtv[\);].+(aquos)/i,
@@ -720,6 +744,8 @@
720
744
  // WEARABLES
721
745
  ///////////////////
722
746
 
747
+ /\b(sm-[lr]\d\d[05][fnuw]?s?)\b/i // Samsung Galaxy Watch
748
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
723
749
  /((pebble))app/i // Pebble
724
750
  ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
725
751
  /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
@@ -733,7 +759,9 @@
733
759
 
734
760
  /droid.+; (glass) \d/i // Google Glass
735
761
  ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [
736
- /(quest( \d| pro)?)/i // Oculus Quest
762
+ /(pico) (4|neo3(?: link|pro)?)/i // Pico
763
+ ], [VENDOR, MODEL, [TYPE, XR]], [
764
+ /; (quest( \d| pro)?)/i // Oculus Quest
737
765
  ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [
738
766
 
739
767
  ///////////////////
@@ -766,6 +794,9 @@
766
794
  /windows.+ edge\/([\w\.]+)/i // EdgeHTML
767
795
  ], [VERSION, [NAME, EDGE+'HTML']], [
768
796
 
797
+ /(arkweb)\/([\w\.]+)/i // ArkWeb
798
+ ], [NAME, VERSION], [
799
+
769
800
  /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
770
801
  ], [VERSION, [NAME, 'Blink']], [
771
802
 
@@ -802,10 +833,22 @@
802
833
  /(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS
803
834
  ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [
804
835
 
836
+ // Google Chromecast
837
+ /android ([\d\.]+).*crkey/i // Google Chromecast, Android-based
838
+ ], [VERSION, [NAME, CHROMECAST + ' Android']], [
839
+ /fuchsia.*crkey\/([\d\.]+)/i // Google Chromecast, Fuchsia-based
840
+ ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [
841
+ /crkey\/([\d\.]+).*devicetype\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker
842
+ ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [
843
+ /linux.*crkey\/([\d\.]+)/i // Google Chromecast, Legacy Linux-based
844
+ ], [VERSION, [NAME, CHROMECAST + ' Linux']], [
845
+ /crkey\/([\d\.]+)/i // Google Chromecast, unknown
846
+ ], [VERSION, [NAME, CHROMECAST]], [
847
+
805
848
  // Mobile OSes
806
849
  /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
807
- ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS
808
- /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,
850
+ ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS/OpenHarmony
851
+ /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish|openharmony)[-\/ ]?([\w\.]*)/i,
809
852
  /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
810
853
  /(tizen|kaios)[\/ ]([\w\.]+)/i, // Tizen/KaiOS
811
854
  /\((series40);/i // Series 40
@@ -822,9 +865,7 @@
822
865
  /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
823
866
  ], [VERSION, [NAME, 'watchOS']], [
824
867
 
825
- // Google Chromecast
826
- /crkey\/([\d\.]+)/i // Google Chromecast
827
- ], [VERSION, [NAME, CHROME+'cast']], [
868
+ // Google ChromeOS
828
869
  /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
829
870
  ], [[NAME, "Chrome OS"], VERSION],[
830
871
 
@@ -836,6 +877,7 @@
836
877
  // Console
837
878
  /(nintendo|playstation) (\w+)/i, // Nintendo/Playstation
838
879
  /(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
880
+ /(pico) .+os([\w\.]+)/i, // Pico
839
881
 
840
882
  // Other
841
883
  /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
@@ -3,12 +3,12 @@
3
3
  // Source: /src/main/ua-parser.js
4
4
 
5
5
  /////////////////////////////////////////////////////////////////////////////////
6
- /* UAParser.js v2.0.0-beta.3
6
+ /* UAParser.js v2.0.0-rc.1
7
7
  Copyright © 2012-2024 Faisal Salman <f@faisalman.com>
8
8
  AGPLv3 License *//*
9
9
  Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
10
10
  Supports browser & node.js environment.
11
- Demo : https://faisalman.github.io/ua-parser-js
11
+ Demo : https://uaparser.dev
12
12
  Source : https://github.com/faisalman/ua-parser-js */
13
13
  /////////////////////////////////////////////////////////////////////////////////
14
14
 
@@ -21,7 +21,7 @@
21
21
  // Constants
22
22
  /////////////
23
23
 
24
- var LIBVERSION = '2.0.0-beta.3',
24
+ var LIBVERSION = '2.0.0-rc.1',
25
25
  EMPTY = '',
26
26
  UNKNOWN = '?',
27
27
  FUNC_TYPE = 'function',
@@ -84,6 +84,7 @@
84
84
  PREFIX_MOBILE = 'Mobile ',
85
85
  SUFFIX_BROWSER = ' Browser',
86
86
  CHROME = 'Chrome',
87
+ CHROMECAST = 'Chromecast',
87
88
  EDGE = 'Edge',
88
89
  FIREFOX = 'Firefox',
89
90
  OPERA = 'Opera',
@@ -329,11 +330,13 @@
329
330
  /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
330
331
 
331
332
  // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
332
- /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar)\/([-\w\.]+)/i,
333
- // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar
333
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio)\/([-\w\.]+)/i,
334
+ // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio
334
335
  /(heytap|ovi)browser\/([\d\.]+)/i, // HeyTap/Ovi
335
336
  /(weibo)__([\d\.]+)/i // Weibo
336
337
  ], [NAME, VERSION], [
338
+ /quark(?:pc)?\/([-\w\.]+)/i // Quark
339
+ ], [VERSION, [NAME, 'Quark']], [
337
340
  /\bddg\/([\w\.]+)/i // DuckDuckGo
338
341
  ], [VERSION, [NAME, 'DuckDuckGo']], [
339
342
  /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
@@ -499,8 +502,8 @@
499
502
  // Samsung
500
503
  /\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
501
504
  ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
502
- /\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
503
- /samsung[- ]([-\w]+)/i,
505
+ /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
506
+ /samsung[- ]((?!sm-[lr])[-\w]+)/i,
504
507
  /sec-(sgh\w+)/i
505
508
  ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
506
509
 
@@ -531,7 +534,7 @@
531
534
  /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
532
535
  /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
533
536
  /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
534
- /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i // Xiaomi Mi
537
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i // Xiaomi Mi
535
538
  ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
536
539
  /oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i, // Redmi Pad
537
540
  /\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
@@ -599,7 +602,7 @@
599
602
 
600
603
  // Amazon
601
604
  /(alexa)webm/i,
602
- /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i, // Kindle Fire without Silk / Echo Show
605
+ /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, // Kindle Fire without Silk / Echo Show
603
606
  /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
604
607
  ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
605
608
  /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
@@ -628,6 +631,17 @@
628
631
  /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
629
632
  ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
630
633
 
634
+ // TCL
635
+ /tcl (xess p17aa)/i,
636
+ /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
637
+ ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [
638
+ /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
639
+ ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [
640
+
641
+ // itel
642
+ /(itel) ((\w+))/i
643
+ ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [
644
+
631
645
  // Acer
632
646
  /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
633
647
  ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
@@ -641,6 +655,10 @@
641
655
  /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
642
656
  ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
643
657
 
658
+ // Nothing
659
+ /droid.+; (a(?:015|06[35]|142p?))/i
660
+ ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
661
+
644
662
  // MIXED
645
663
  /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\w]*)/i,
646
664
  // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
@@ -685,8 +703,14 @@
685
703
  ], [[VENDOR, LG], [TYPE, SMARTTV]], [
686
704
  /(apple) ?tv/i // Apple TV
687
705
  ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
688
- /crkey/i // Google Chromecast
689
- ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
706
+ /crkey.*devicetype\/chromecast/i // Google Chromecast Third Generation
707
+ ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
708
+ /crkey.*devicetype\/([^/]*)/i // Google Chromecast with specific device type
709
+ ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
710
+ /fuchsia.*crkey/i // Google Chromecast Nest Hub
711
+ ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
712
+ /crkey/i // Google Chromecast, Linux-based or unknown
713
+ ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
690
714
  /droid.+aft(\w+)( bui|\))/i // Fire TV
691
715
  ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
692
716
  /\(dtv[\);].+(aquos)/i,
@@ -722,6 +746,8 @@
722
746
  // WEARABLES
723
747
  ///////////////////
724
748
 
749
+ /\b(sm-[lr]\d\d[05][fnuw]?s?)\b/i // Samsung Galaxy Watch
750
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
725
751
  /((pebble))app/i // Pebble
726
752
  ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
727
753
  /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
@@ -735,7 +761,9 @@
735
761
 
736
762
  /droid.+; (glass) \d/i // Google Glass
737
763
  ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [
738
- /(quest( \d| pro)?)/i // Oculus Quest
764
+ /(pico) (4|neo3(?: link|pro)?)/i // Pico
765
+ ], [VENDOR, MODEL, [TYPE, XR]], [
766
+ /; (quest( \d| pro)?)/i // Oculus Quest
739
767
  ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [
740
768
 
741
769
  ///////////////////
@@ -768,6 +796,9 @@
768
796
  /windows.+ edge\/([\w\.]+)/i // EdgeHTML
769
797
  ], [VERSION, [NAME, EDGE+'HTML']], [
770
798
 
799
+ /(arkweb)\/([\w\.]+)/i // ArkWeb
800
+ ], [NAME, VERSION], [
801
+
771
802
  /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
772
803
  ], [VERSION, [NAME, 'Blink']], [
773
804
 
@@ -804,10 +835,22 @@
804
835
  /(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS
805
836
  ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [
806
837
 
838
+ // Google Chromecast
839
+ /android ([\d\.]+).*crkey/i // Google Chromecast, Android-based
840
+ ], [VERSION, [NAME, CHROMECAST + ' Android']], [
841
+ /fuchsia.*crkey\/([\d\.]+)/i // Google Chromecast, Fuchsia-based
842
+ ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [
843
+ /crkey\/([\d\.]+).*devicetype\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker
844
+ ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [
845
+ /linux.*crkey\/([\d\.]+)/i // Google Chromecast, Legacy Linux-based
846
+ ], [VERSION, [NAME, CHROMECAST + ' Linux']], [
847
+ /crkey\/([\d\.]+)/i // Google Chromecast, unknown
848
+ ], [VERSION, [NAME, CHROMECAST]], [
849
+
807
850
  // Mobile OSes
808
851
  /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
809
- ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS
810
- /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,
852
+ ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS/OpenHarmony
853
+ /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish|openharmony)[-\/ ]?([\w\.]*)/i,
811
854
  /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
812
855
  /(tizen|kaios)[\/ ]([\w\.]+)/i, // Tizen/KaiOS
813
856
  /\((series40);/i // Series 40
@@ -824,9 +867,7 @@
824
867
  /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
825
868
  ], [VERSION, [NAME, 'watchOS']], [
826
869
 
827
- // Google Chromecast
828
- /crkey\/([\d\.]+)/i // Google Chromecast
829
- ], [VERSION, [NAME, CHROME+'cast']], [
870
+ // Google ChromeOS
830
871
  /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
831
872
  ], [[NAME, "Chrome OS"], VERSION],[
832
873
 
@@ -838,6 +879,7 @@
838
879
  // Console
839
880
  /(nintendo|playstation) (\w+)/i, // Nintendo/Playstation
840
881
  /(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
882
+ /(pico) .+os([\w\.]+)/i, // Pico
841
883
 
842
884
  // Other
843
885
  /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm