isdata-customer-sdk 0.1.78 → 0.1.80

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.
@@ -29570,6 +29570,7 @@ __webpack_require__.d(__webpack_exports__, {
29570
29570
  getChildrenOfficeInfosByID: function() { return /* reexport */ getChildrenOfficeInfosByID; },
29571
29571
  getCurrentUserPortalPageID: function() { return /* reexport */ getCurrentUserPortalPageID; },
29572
29572
  getDifyFileType: function() { return /* reexport */ getDifyFileType; },
29573
+ getFileSize: function() { return /* reexport */ getFileSize; },
29573
29574
  getGroupMappingsByAccount: function() { return /* reexport */ getGroupMappingsByAccount; },
29574
29575
  getIMHanlder: function() { return /* reexport */ getIMHanlder; },
29575
29576
  getIntegrateAppInfoByID: function() { return /* reexport */ getIntegrateAppInfoByID; },
@@ -29622,15 +29623,9 @@ __webpack_require__.d(__webpack_exports__, {
29622
29623
  validateSSOPageLoaded: function() { return /* reexport */ validateSSOPageLoaded; }
29623
29624
  });
29624
29625
 
29625
- // NAMESPACE OBJECT: ./src/api/utils.js
29626
- var utils_namespaceObject = {};
29627
- __webpack_require__.r(utils_namespaceObject);
29628
- __webpack_require__.d(utils_namespaceObject, {
29629
- w$: function() { return createFileFromUrl; },
29630
- KQ: function() { return extractFilenameFromUrl; },
29631
- Ie: function() { return getUrlParamValue; },
29632
- Ju: function() { return queryAssetById; }
29633
- });
29626
+ // NAMESPACE OBJECT: ./node_modules/ua-parser-js/src/main/ua-parser.mjs
29627
+ var ua_parser_namespaceObject = {};
29628
+ __webpack_require__.r(ua_parser_namespaceObject);
29634
29629
 
29635
29630
  ;// ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js
29636
29631
  /* eslint-disable no-var */
@@ -30721,6 +30716,1494 @@ const getIntegrateAppInfoByID = async appID => {
30721
30716
  let appInfo = result.data.appInfo;
30722
30717
  return appInfo;
30723
30718
  };
30719
+ ;// ./node_modules/ua-parser-js/src/main/ua-parser.mjs
30720
+ // Generated ESM version of ua-parser-js
30721
+ // DO NOT EDIT THIS FILE!
30722
+ // Source: /src/main/ua-parser.js
30723
+
30724
+ /////////////////////////////////////////////////////////////////////////////////
30725
+ /* UAParser.js v2.0.6
30726
+ Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
30727
+ AGPLv3 License *//*
30728
+ Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
30729
+ Supports browser & node.js environment.
30730
+ Demo : https://uaparser.dev
30731
+ Source : https://github.com/faisalman/ua-parser-js */
30732
+ /////////////////////////////////////////////////////////////////////////////////
30733
+
30734
+ /* jshint esversion: 6 */
30735
+ /* globals window */
30736
+
30737
+
30738
+
30739
+ //////////////
30740
+ // Constants
30741
+ /////////////
30742
+
30743
+ var LIBVERSION = '2.0.6',
30744
+ UA_MAX_LENGTH = 500,
30745
+ USER_AGENT = 'user-agent',
30746
+ EMPTY = '',
30747
+ UNKNOWN = '?',
30748
+ TYPEOF = {
30749
+ FUNCTION : 'function',
30750
+ OBJECT : 'object',
30751
+ STRING : 'string',
30752
+ UNDEFINED : 'undefined'
30753
+ },
30754
+
30755
+ // properties
30756
+ BROWSER = 'browser',
30757
+ CPU = 'cpu',
30758
+ DEVICE = 'device',
30759
+ ENGINE = 'engine',
30760
+ OS = 'os',
30761
+ RESULT = 'result',
30762
+
30763
+ NAME = 'name',
30764
+ TYPE = 'type',
30765
+ VENDOR = 'vendor',
30766
+ VERSION = 'version',
30767
+ ARCHITECTURE= 'architecture',
30768
+ MAJOR = 'major',
30769
+ MODEL = 'model',
30770
+
30771
+ // device types
30772
+ CONSOLE = 'console',
30773
+ MOBILE = 'mobile',
30774
+ TABLET = 'tablet',
30775
+ SMARTTV = 'smarttv',
30776
+ WEARABLE = 'wearable',
30777
+ XR = 'xr',
30778
+ EMBEDDED = 'embedded',
30779
+
30780
+ // browser types
30781
+ INAPP = 'inapp',
30782
+
30783
+ // client hints
30784
+ BRANDS = 'brands',
30785
+ FORMFACTORS = 'formFactors',
30786
+ FULLVERLIST = 'fullVersionList',
30787
+ PLATFORM = 'platform',
30788
+ PLATFORMVER = 'platformVersion',
30789
+ BITNESS = 'bitness',
30790
+ CH = 'sec-ch-ua',
30791
+ CH_FULL_VER_LIST= CH + '-full-version-list',
30792
+ CH_ARCH = CH + '-arch',
30793
+ CH_BITNESS = CH + '-' + BITNESS,
30794
+ CH_FORM_FACTORS = CH + '-form-factors',
30795
+ CH_MOBILE = CH + '-' + MOBILE,
30796
+ CH_MODEL = CH + '-' + MODEL,
30797
+ CH_PLATFORM = CH + '-' + PLATFORM,
30798
+ CH_PLATFORM_VER = CH_PLATFORM + '-version',
30799
+ CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],
30800
+
30801
+ // device vendors
30802
+ AMAZON = 'Amazon',
30803
+ APPLE = 'Apple',
30804
+ ASUS = 'ASUS',
30805
+ BLACKBERRY = 'BlackBerry',
30806
+ GOOGLE = 'Google',
30807
+ HUAWEI = 'Huawei',
30808
+ LENOVO = 'Lenovo',
30809
+ HONOR = 'Honor',
30810
+ LG = 'LG',
30811
+ MICROSOFT = 'Microsoft',
30812
+ MOTOROLA = 'Motorola',
30813
+ NVIDIA = 'Nvidia',
30814
+ ONEPLUS = 'OnePlus',
30815
+ OPPO = 'OPPO',
30816
+ SAMSUNG = 'Samsung',
30817
+ SHARP = 'Sharp',
30818
+ SONY = 'Sony',
30819
+ XIAOMI = 'Xiaomi',
30820
+ ZEBRA = 'Zebra',
30821
+
30822
+ // browsers
30823
+ CHROME = 'Chrome',
30824
+ CHROMIUM = 'Chromium',
30825
+ CHROMECAST = 'Chromecast',
30826
+ EDGE = 'Edge',
30827
+ FIREFOX = 'Firefox',
30828
+ OPERA = 'Opera',
30829
+ FACEBOOK = 'Facebook',
30830
+ SOGOU = 'Sogou',
30831
+
30832
+ PREFIX_MOBILE = 'Mobile ',
30833
+ SUFFIX_BROWSER = ' Browser',
30834
+
30835
+ // os
30836
+ WINDOWS = 'Windows';
30837
+
30838
+ var isWindow = typeof window !== TYPEOF.UNDEFINED,
30839
+ NAVIGATOR = (isWindow && window.navigator) ?
30840
+ window.navigator :
30841
+ undefined,
30842
+ NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ?
30843
+ NAVIGATOR.userAgentData :
30844
+ undefined;
30845
+
30846
+ ///////////
30847
+ // Helper
30848
+ //////////
30849
+
30850
+ var extend = function (defaultRgx, extensions) {
30851
+ var mergedRgx = {};
30852
+ var extraRgx = extensions;
30853
+ if (!isExtensions(extensions)) {
30854
+ extraRgx = {};
30855
+ for (var i in extensions) {
30856
+ for (var j in extensions[i]) {
30857
+ extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);
30858
+ }
30859
+ }
30860
+ }
30861
+ for (var k in defaultRgx) {
30862
+ mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];
30863
+ }
30864
+ return mergedRgx;
30865
+ },
30866
+ enumerize = function (arr) {
30867
+ var enums = {};
30868
+ for (var i=0; i<arr.length; i++) {
30869
+ enums[arr[i].toUpperCase()] = arr[i];
30870
+ }
30871
+ return enums;
30872
+ },
30873
+ has = function (str1, str2) {
30874
+ if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {
30875
+ for (var i in str1) {
30876
+ if (lowerize(str2) == lowerize(str1[i])) return true;
30877
+ }
30878
+ return false;
30879
+ }
30880
+ return isString(str1) ? lowerize(str2) == lowerize(str1) : false;
30881
+ },
30882
+ isExtensions = function (obj, deep) {
30883
+ for (var prop in obj) {
30884
+ return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
30885
+ }
30886
+ },
30887
+ isString = function (val) {
30888
+ return typeof val === TYPEOF.STRING;
30889
+ },
30890
+ itemListToArray = function (header) {
30891
+ if (!header) return undefined;
30892
+ var arr = [];
30893
+ var tokens = strip(/\\?\"/g, header).split(',');
30894
+ for (var i = 0; i < tokens.length; i++) {
30895
+ if (tokens[i].indexOf(';') > -1) {
30896
+ var token = trim(tokens[i]).split(';v=');
30897
+ arr[i] = { brand : token[0], version : token[1] };
30898
+ } else {
30899
+ arr[i] = trim(tokens[i]);
30900
+ }
30901
+ }
30902
+ return arr;
30903
+ },
30904
+ lowerize = function (str) {
30905
+ return isString(str) ? str.toLowerCase() : str;
30906
+ },
30907
+ majorize = function (version) {
30908
+ return isString(version) ? strip(/[^\d\.]/g, version).split('.')[0] : undefined;
30909
+ },
30910
+ setProps = function (arr) {
30911
+ for (var i in arr) {
30912
+ if (!arr.hasOwnProperty(i)) continue;
30913
+
30914
+ var propName = arr[i];
30915
+ if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {
30916
+ this[propName[0]] = propName[1];
30917
+ } else {
30918
+ this[propName] = undefined;
30919
+ }
30920
+ }
30921
+ return this;
30922
+ },
30923
+ strip = function (pattern, str) {
30924
+ return isString(str) ? str.replace(pattern, EMPTY) : str;
30925
+ },
30926
+ stripQuotes = function (str) {
30927
+ return strip(/\\?\"/g, str);
30928
+ },
30929
+ trim = function (str, len) {
30930
+ str = strip(/^\s\s*/, String(str));
30931
+ return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
30932
+ };
30933
+
30934
+ ///////////////
30935
+ // Map helper
30936
+ //////////////
30937
+
30938
+ var rgxMapper = function (ua, arrays) {
30939
+
30940
+ if(!ua || !arrays) return;
30941
+
30942
+ var i = 0, j, k, p, q, matches, match;
30943
+
30944
+ // loop through all regexes maps
30945
+ while (i < arrays.length && !matches) {
30946
+
30947
+ var regex = arrays[i], // even sequence (0,2,4,..)
30948
+ props = arrays[i + 1]; // odd sequence (1,3,5,..)
30949
+ j = k = 0;
30950
+
30951
+ // try matching uastring with regexes
30952
+ while (j < regex.length && !matches) {
30953
+
30954
+ if (!regex[j]) { break; }
30955
+ matches = regex[j++].exec(ua);
30956
+
30957
+ if (!!matches) {
30958
+ for (p = 0; p < props.length; p++) {
30959
+ match = matches[++k];
30960
+ q = props[p];
30961
+ // check if given property is actually array
30962
+ if (typeof q === TYPEOF.OBJECT && q.length > 0) {
30963
+ if (q.length === 2) {
30964
+ if (typeof q[1] == TYPEOF.FUNCTION) {
30965
+ // assign modified match
30966
+ this[q[0]] = q[1].call(this, match);
30967
+ } else {
30968
+ // assign given value, ignore regex match
30969
+ this[q[0]] = q[1];
30970
+ }
30971
+ } else if (q.length >= 3) {
30972
+ // Check whether q[1] FUNCTION or REGEX
30973
+ if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {
30974
+ if (q.length > 3) {
30975
+ this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;
30976
+ } else {
30977
+ // call function (usually string mapper)
30978
+ this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
30979
+ }
30980
+ } else {
30981
+ if (q.length == 3) {
30982
+ // sanitize match using given regex
30983
+ this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
30984
+ } else if (q.length == 4) {
30985
+ this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
30986
+ } else if (q.length > 4) {
30987
+ this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : undefined;
30988
+ }
30989
+ }
30990
+ }
30991
+ } else {
30992
+ this[q] = match ? match : undefined;
30993
+ }
30994
+ }
30995
+ }
30996
+ }
30997
+ i += 2;
30998
+ }
30999
+ },
31000
+
31001
+ strMapper = function (str, map) {
31002
+
31003
+ for (var i in map) {
31004
+ // check if current value is array
31005
+ if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {
31006
+ for (var j = 0; j < map[i].length; j++) {
31007
+ if (has(map[i][j], str)) {
31008
+ return (i === UNKNOWN) ? undefined : i;
31009
+ }
31010
+ }
31011
+ } else if (has(map[i], str)) {
31012
+ return (i === UNKNOWN) ? undefined : i;
31013
+ }
31014
+ }
31015
+ return map.hasOwnProperty('*') ? map['*'] : str;
31016
+ };
31017
+
31018
+ ///////////////
31019
+ // String map
31020
+ //////////////
31021
+
31022
+ var windowsVersionMap = {
31023
+ 'ME' : '4.90',
31024
+ 'NT 3.51': '3.51',
31025
+ 'NT 4.0': '4.0',
31026
+ '2000' : ['5.0', '5.01'],
31027
+ 'XP' : ['5.1', '5.2'],
31028
+ 'Vista' : '6.0',
31029
+ '7' : '6.1',
31030
+ '8' : '6.2',
31031
+ '8.1' : '6.3',
31032
+ '10' : ['6.4', '10.0'],
31033
+ 'NT' : ''
31034
+ },
31035
+
31036
+ formFactorsMap = {
31037
+ 'embedded' : 'Automotive',
31038
+ 'mobile' : 'Mobile',
31039
+ 'tablet' : ['Tablet', 'EInk'],
31040
+ 'smarttv' : 'TV',
31041
+ 'wearable' : 'Watch',
31042
+ 'xr' : ['VR', 'XR'],
31043
+ '?' : ['Desktop', 'Unknown'],
31044
+ '*' : undefined
31045
+ },
31046
+
31047
+ browserHintsMap = {
31048
+ 'Chrome' : 'Google Chrome',
31049
+ 'Edge' : 'Microsoft Edge',
31050
+ 'Edge WebView2' : 'Microsoft Edge WebView2',
31051
+ 'Chrome WebView': 'Android WebView',
31052
+ 'Chrome Headless':'HeadlessChrome',
31053
+ 'Huawei Browser': 'HuaweiBrowser',
31054
+ 'MIUI Browser' : 'Miui Browser',
31055
+ 'Opera Mobi' : 'OperaMobile',
31056
+ 'Yandex' : 'YaBrowser'
31057
+ };
31058
+
31059
+ //////////////
31060
+ // Regex map
31061
+ /////////////
31062
+
31063
+ var defaultRegexes = {
31064
+
31065
+ browser : [[
31066
+
31067
+ // Most common regardless engine
31068
+ /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
31069
+ ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [
31070
+ /webview.+edge\/([\w\.]+)/i // Microsoft Edge
31071
+ ], [VERSION, [NAME, EDGE+' WebView']], [
31072
+ /edg(?:e|ios|a)?\/([\w\.]+)/i
31073
+ ], [VERSION, [NAME, 'Edge']], [
31074
+
31075
+ // Presto based
31076
+ /(opera mini)\/([-\w\.]+)/i, // Opera Mini
31077
+ /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i, // Opera Mobi/Tablet
31078
+ /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i // Opera
31079
+ ], [NAME, VERSION], [
31080
+ /opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0
31081
+ ], [VERSION, [NAME, OPERA+' Mini']], [
31082
+ /\bop(?:rg)?x\/([\w\.]+)/i // Opera GX
31083
+ ], [VERSION, [NAME, OPERA+' GX']], [
31084
+ /\bopr\/([\w\.]+)/i // Opera Webkit
31085
+ ], [VERSION, [NAME, OPERA]], [
31086
+
31087
+ // Mixed
31088
+ /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i // Baidu
31089
+ ], [VERSION, [NAME, 'Baidu']], [
31090
+ /\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i // Maxthon
31091
+ ], [VERSION, [NAME, 'Maxthon']], [
31092
+ /(kindle)\/([\w\.]+)/i, // Kindle
31093
+ /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
31094
+ // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
31095
+ // Trident based
31096
+ /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
31097
+ /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
31098
+
31099
+ // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon
31100
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\/([-\w\.]+)/i,
31101
+ // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
31102
+ /(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i, // HeyTap/Ovi/115/Surf
31103
+ /(qwant)(?:ios|mobile)\/([\d\.]+)/i, // Qwant
31104
+ /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo
31105
+ ], [NAME, VERSION], [
31106
+ /quark(?:pc)?\/([-\w\.]+)/i // Quark
31107
+ ], [VERSION, [NAME, 'Quark']], [
31108
+ /\bddg\/([\w\.]+)/i // DuckDuckGo
31109
+ ], [VERSION, [NAME, 'DuckDuckGo']], [
31110
+ /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
31111
+ ], [VERSION, [NAME, 'UCBrowser']], [
31112
+ /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
31113
+ /\bqbcore\/([\w\.]+).+microm/i,
31114
+ /micromessenger\/([\w\.]+)/i // WeChat
31115
+ ], [VERSION, [NAME, 'WeChat']], [
31116
+ /konqueror\/([\w\.]+)/i // Konqueror
31117
+ ], [VERSION, [NAME, 'Konqueror']], [
31118
+ /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
31119
+ ], [VERSION, [NAME, 'IE']], [
31120
+ /ya(?:search)?browser\/([\w\.]+)/i // Yandex
31121
+ ], [VERSION, [NAME, 'Yandex']], [
31122
+ /slbrowser\/([\w\.]+)/i // Smart Lenovo Browser
31123
+ ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [
31124
+ /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
31125
+ ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [
31126
+ /\bfocus\/([\w\.]+)/i // Firefox Focus
31127
+ ], [VERSION, [NAME, FIREFOX+' Focus']], [
31128
+ /\bopt\/([\w\.]+)/i // Opera Touch
31129
+ ], [VERSION, [NAME, OPERA+' Touch']], [
31130
+ /coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
31131
+ ], [VERSION, [NAME, 'Coc Coc']], [
31132
+ /dolfin\/([\w\.]+)/i // Dolphin
31133
+ ], [VERSION, [NAME, 'Dolphin']], [
31134
+ /coast\/([\w\.]+)/i // Opera Coast
31135
+ ], [VERSION, [NAME, OPERA+' Coast']], [
31136
+ /miuibrowser\/([\w\.]+)/i // MIUI Browser
31137
+ ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [
31138
+ /fxios\/([\w\.-]+)/i // Firefox for iOS
31139
+ ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [
31140
+ /\bqihoobrowser\/?([\w\.]*)/i // 360
31141
+ ], [VERSION, [NAME, '360']], [
31142
+ /\b(qq)\/([\w\.]+)/i // QQ
31143
+ ], [[NAME, /(.+)/, '$1Browser'], VERSION], [
31144
+ /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
31145
+ ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
31146
+ /samsungbrowser\/([\w\.]+)/i // Samsung Internet
31147
+ ], [VERSION, [NAME, SAMSUNG + ' Internet']], [
31148
+ /metasr[\/ ]?([\d\.]+)/i // Sogou Explorer
31149
+ ], [VERSION, [NAME, SOGOU + ' Explorer']], [
31150
+ /(sogou)mo\w+\/([\d\.]+)/i // Sogou Mobile
31151
+ ], [[NAME, SOGOU + ' Mobile'], VERSION], [
31152
+ /(electron)\/([\w\.]+) safari/i, // Electron-based App
31153
+ /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
31154
+ /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345
31155
+ ], [NAME, VERSION], [
31156
+ /(lbbrowser|rekonq)/i // LieBao Browser/Rekonq
31157
+ ], [NAME], [
31158
+ /ome\/([\w\.]+) \w* ?(iron) saf/i, // Iron
31159
+ /ome\/([\w\.]+).+qihu (360)[es]e/i // 360
31160
+ ], [VERSION, NAME], [
31161
+
31162
+ // WebView
31163
+ /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
31164
+ ], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [
31165
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
31166
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
31167
+ /(daum)apps[\/ ]([\w\.]+)/i, // Daum App
31168
+ /safari (line)\/([\w\.]+)/i, // Line App for iOS
31169
+ /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
31170
+ /(alipay)client\/([\w\.]+)/i, // Alipay
31171
+ /(twitter)(?:and| f.+e\/([\w\.]+))/i, // Twitter
31172
+ /(bing)(?:web|sapphire)\/([\w\.]+)/i, // Bing
31173
+ /(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i // Instagram/Snapchat/Klarna
31174
+ ], [NAME, VERSION, [TYPE, INAPP]], [
31175
+ /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
31176
+ ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [
31177
+ /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
31178
+ ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [
31179
+ /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
31180
+ ], [NAME, [TYPE, INAPP]], [
31181
+ /(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i // Zalo
31182
+ ], [[NAME, /(.+)/, 'Zalo'], VERSION, [TYPE, INAPP]], [
31183
+
31184
+ /(chromium)[\/ ]([-\w\.]+)/i // Chromium
31185
+ ], [NAME, VERSION], [
31186
+
31187
+ /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
31188
+ ], [VERSION, [NAME, CHROME+' Headless']], [
31189
+
31190
+ /wv\).+chrome\/([\w\.]+).+edgw\//i // Edge WebView2
31191
+ ], [VERSION, [NAME, EDGE+' WebView2']], [
31192
+
31193
+ / wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
31194
+ ], [[NAME, CHROME+' WebView'], VERSION], [
31195
+
31196
+ /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser
31197
+ ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [
31198
+
31199
+ /chrome\/([\w\.]+) mobile/i // Chrome Mobile
31200
+ ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [
31201
+
31202
+ /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
31203
+ ], [NAME, VERSION], [
31204
+
31205
+ /version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i // Safari Mobile
31206
+ ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [
31207
+ /iphone .*mobile(?:\/\w+ | ?)safari/i
31208
+ ], [[NAME, PREFIX_MOBILE + 'Safari']], [
31209
+ /version\/([\w\.\,]+) .*(safari)/i // Safari
31210
+ ], [VERSION, NAME], [
31211
+ /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
31212
+ ], [NAME, [VERSION, '1']], [
31213
+
31214
+ /(webkit|khtml)\/([\w\.]+)/i
31215
+ ], [NAME, VERSION], [
31216
+
31217
+ // Gecko based
31218
+ /(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i // Firefox Mobile
31219
+ ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [
31220
+ /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
31221
+ ], [[NAME, 'Netscape'], VERSION], [
31222
+ /(wolvic|librewolf)\/([\w\.]+)/i // Wolvic/LibreWolf
31223
+ ], [NAME, VERSION], [
31224
+ /mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
31225
+ ], [VERSION, [NAME, FIREFOX+' Reality']], [
31226
+ /ekiohf.+(flow)\/([\w\.]+)/i, // Flow
31227
+ /(swiftfox)/i, // Swiftfox
31228
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
31229
+ // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
31230
+ /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,
31231
+ // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
31232
+ /(firefox)\/([\w\.]+)/i, // Other Firefox-based
31233
+ /(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i, // Mozilla
31234
+
31235
+ // Other
31236
+ /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
31237
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird
31238
+ /\b(links) \(([\w\.]+)/i // Links
31239
+ ], [NAME, [VERSION, /_/g, '.']], [
31240
+
31241
+ /(cobalt)\/([\w\.]+)/i // Cobalt
31242
+ ], [NAME, [VERSION, /[^\d\.]+./, EMPTY]]
31243
+ ],
31244
+
31245
+ cpu : [[
31246
+
31247
+ /\b((amd|x|x86[-_]?|wow|win)64)\b/i // AMD64 (x64)
31248
+ ], [[ARCHITECTURE, 'amd64']], [
31249
+
31250
+ /(ia32(?=;))/i, // IA32 (quicktime)
31251
+ /\b((i[346]|x)86)(pc)?\b/i // IA32 (x86)
31252
+ ], [[ARCHITECTURE, 'ia32']], [
31253
+
31254
+ /\b(aarch64|arm(v?[89]e?l?|_?64))\b/i // ARM64
31255
+ ], [[ARCHITECTURE, 'arm64']], [
31256
+
31257
+ /\b(arm(v[67])?ht?n?[fl]p?)\b/i // ARMHF
31258
+ ], [[ARCHITECTURE, 'armhf']], [
31259
+
31260
+ // PocketPC mistakenly identified as PowerPC
31261
+ /( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i
31262
+ ], [[ARCHITECTURE, 'arm']], [
31263
+
31264
+ / sun4\w[;\)]/i // SPARC
31265
+ ], [[ARCHITECTURE, 'sparc']], [
31266
+ // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
31267
+ /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,
31268
+ /((ppc|powerpc)(64)?)( mac|;|\))/i, // PowerPC
31269
+ /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i // Alpha
31270
+ ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
31271
+ /mc680.0/i
31272
+ ], [[ARCHITECTURE, '68k']], [
31273
+ /winnt.+\[axp/i
31274
+ ], [[ARCHITECTURE, 'alpha']]
31275
+ ],
31276
+
31277
+ device : [[
31278
+
31279
+ //////////////////////////
31280
+ // MOBILES & TABLETS
31281
+ /////////////////////////
31282
+
31283
+ // Samsung
31284
+ /\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
31285
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
31286
+ /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
31287
+ /samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
31288
+ /sec-(sgh\w+)/i
31289
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
31290
+
31291
+ // Apple
31292
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i // iPod/iPhone
31293
+ ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
31294
+ /\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i, // iPad
31295
+ /\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i
31296
+ ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [
31297
+ /(macintosh);/i
31298
+ ], [MODEL, [VENDOR, APPLE]], [
31299
+
31300
+ // Sharp
31301
+ /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
31302
+ ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
31303
+
31304
+ // Honor
31305
+ /\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i
31306
+ ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [
31307
+ /honor([-\w ]+)[;\)]/i
31308
+ ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [
31309
+
31310
+ // Huawei
31311
+ /\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
31312
+ ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
31313
+ /(?:huawei) ?([-\w ]+)[;\)]/i,
31314
+ /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i
31315
+ ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
31316
+
31317
+ // Xiaomi
31318
+ /oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
31319
+ /\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i // Mi Pad tablets
31320
+ ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
31321
+
31322
+ /\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO
31323
+ /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
31324
+ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
31325
+ /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
31326
+ /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
31327
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i, // Xiaomi Mi
31328
+ / ([\w ]+) miui\/v?\d/i
31329
+ ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
31330
+
31331
+ // OnePlus
31332
+ /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-k]\w[1m]10)\b/i,
31333
+ /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
31334
+ ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [
31335
+
31336
+ // OPPO
31337
+ /; (\w+) bui.+ oppo/i,
31338
+ /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
31339
+ ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [
31340
+ /\b(opd2(\d{3}a?))(?: bui|\))/i
31341
+ ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['203', '304', '403', '404', '413', '415'], '*' : OPPO }], [TYPE, TABLET]], [
31342
+
31343
+ // BLU
31344
+ /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i // Vivo series
31345
+ ], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [
31346
+
31347
+ // Vivo
31348
+ /; vivo (\w+)(?: bui|\))/i,
31349
+ /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
31350
+ ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
31351
+
31352
+ // Realme
31353
+ /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
31354
+ ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
31355
+
31356
+ // Lenovo
31357
+ /(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,
31358
+ /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i
31359
+ ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [
31360
+ /lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i
31361
+ ], [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]], [
31362
+
31363
+ // Motorola
31364
+ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
31365
+ /\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
31366
+ /((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
31367
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [
31368
+ /\b(mz60\d|xoom[2 ]{0,2}) build\//i
31369
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
31370
+
31371
+ // LG
31372
+ /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
31373
+ ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
31374
+ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
31375
+ /\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
31376
+ /\blg-?([\d\w]+) bui/i
31377
+ ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
31378
+
31379
+ // Nokia
31380
+ /(nokia) (t[12][01])/i
31381
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
31382
+ /(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,
31383
+ /nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i
31384
+ ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [
31385
+
31386
+ // Google
31387
+ /(pixel (c|tablet))\b/i // Google Pixel C/Tablet
31388
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [
31389
+ // Google Pixel
31390
+ /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
31391
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
31392
+ /(google) (pixelbook( go)?)/i
31393
+ ], [VENDOR, MODEL], [
31394
+
31395
+ // Sony
31396
+ /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
31397
+ ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [
31398
+ /sony tablet [ps]/i,
31399
+ /\b(?:sony)?sgp\w+(?: bui|\))/i
31400
+ ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [
31401
+
31402
+ // Amazon
31403
+ /(alexa)webm/i,
31404
+ /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, // Kindle Fire without Silk / Echo Show
31405
+ /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
31406
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
31407
+ /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
31408
+ ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [
31409
+
31410
+ // BlackBerry
31411
+ /(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook
31412
+ ], [MODEL, VENDOR, [TYPE, TABLET]], [
31413
+ /\b((?:bb[a-f]|st[hv])100-\d)/i,
31414
+ /(?:blackberry|\(bb10;) (\w+)/i
31415
+ ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [
31416
+
31417
+ // Asus
31418
+ /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
31419
+ ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [
31420
+ / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
31421
+ ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [
31422
+
31423
+ // HTC
31424
+ /(nexus 9)/i // HTC Nexus 9
31425
+ ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
31426
+ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i, // HTC
31427
+
31428
+ // ZTE
31429
+ /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
31430
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
31431
+ ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
31432
+
31433
+ // TCL
31434
+ /tcl (xess p17aa)/i,
31435
+ /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
31436
+ ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [
31437
+ /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
31438
+ ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [
31439
+
31440
+ // itel
31441
+ /(itel) ((\w+))/i
31442
+ ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [
31443
+
31444
+ // Acer
31445
+ /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
31446
+ ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
31447
+
31448
+ // Meizu
31449
+ /droid.+; (m[1-5] note) bui/i,
31450
+ /\bmz-([-\w]{2,})/i
31451
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
31452
+
31453
+ // Ulefone
31454
+ /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
31455
+ ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
31456
+
31457
+ // Energizer
31458
+ /; (energy ?\w+)(?: bui|\))/i,
31459
+ /; energizer ([\w ]+)(?: bui|\))/i
31460
+ ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [
31461
+
31462
+ // Cat
31463
+ /; cat (b35);/i,
31464
+ /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
31465
+ ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [
31466
+
31467
+ // Smartfren
31468
+ /((?:new )?andromax[\w- ]+)(?: bui|\))/i
31469
+ ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [
31470
+
31471
+ // Nothing
31472
+ /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i
31473
+ ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
31474
+
31475
+ // Archos
31476
+ /; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,
31477
+ /archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i
31478
+ ], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [
31479
+ /archos ([\w ]+)( b|\))/i,
31480
+ /; (ac[3-6]\d\w{2,8})( b|\))/i
31481
+ ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [
31482
+
31483
+ // HMD
31484
+ /; (n159v)/i
31485
+ ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [
31486
+
31487
+ // MIXED
31488
+ /(imo) (tab \w+)/i, // IMO
31489
+ /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno
31490
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
31491
+
31492
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
31493
+ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan
31494
+ // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko
31495
+ /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,
31496
+ /(hp) ([\w ]+\w)/i, // HP iPAQ
31497
+ /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
31498
+ /(oppo) ?([\w ]+) bui/i, // OPPO
31499
+ /(hisense) ([ehv][\w ]+)\)/i, // Hisense
31500
+ /droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i // Philips
31501
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
31502
+
31503
+ /(kobo)\s(ereader|touch)/i, // Kobo
31504
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
31505
+ /(kindle)\/([\w\.]+)/i // Kindle
31506
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
31507
+
31508
+ /(surface duo)/i // Surface Duo
31509
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [
31510
+ /droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
31511
+ ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
31512
+ /((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i // Nvidia Tablets
31513
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [
31514
+ /(sprint) (\w+)/i // Sprint Phones
31515
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
31516
+ /(kin\.[onetw]{3})/i // Microsoft Kin
31517
+ ], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [
31518
+ /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
31519
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [
31520
+ /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
31521
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
31522
+
31523
+ ///////////////////
31524
+ // SMARTTVS
31525
+ ///////////////////
31526
+
31527
+ /(philips)[\w ]+tv/i, // Philips
31528
+ /smart-tv.+(samsung)/i // Samsung
31529
+ ], [VENDOR, [TYPE, SMARTTV]], [
31530
+ /hbbtv.+maple;(\d+)/i
31531
+ ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [
31532
+ /(vizio)(?: |.+model\/)(\w+-\w+)/i, // Vizio
31533
+ /tcast.+(lg)e?. ([-\w]+)/i // LG SmartTV
31534
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
31535
+ /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
31536
+ ], [[VENDOR, LG], [TYPE, SMARTTV]], [
31537
+ /(apple) ?tv/i // Apple TV
31538
+ ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
31539
+ /crkey.*devicetype\/chromecast/i // Google Chromecast Third Generation
31540
+ ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
31541
+ /crkey.*devicetype\/([^/]*)/i // Google Chromecast with specific device type
31542
+ ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
31543
+ /fuchsia.*crkey/i // Google Chromecast Nest Hub
31544
+ ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
31545
+ /crkey/i // Google Chromecast, Linux-based or unknown
31546
+ ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
31547
+ /(portaltv)/i // Facebook Portal TV
31548
+ ], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [
31549
+ /droid.+aft(\w+)( bui|\))/i // Fire TV
31550
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
31551
+ /(shield \w+ tv)/i // Nvidia Shield TV
31552
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [
31553
+ /\(dtv[\);].+(aquos)/i,
31554
+ /(aquos-tv[\w ]+)\)/i // Sharp
31555
+ ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
31556
+ /(bravia[\w ]+)( bui|\))/i // Sony
31557
+ ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
31558
+ /(mi(tv|box)-?\w+) bui/i // Xiaomi
31559
+ ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
31560
+ /Hbbtv.*(technisat) (.*);/i // TechniSAT
31561
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
31562
+ /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
31563
+ /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
31564
+ ], [[VENDOR, /.+\/(\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [
31565
+
31566
+ ///////////////////
31567
+ // CONSOLES
31568
+ ///////////////////
31569
+
31570
+ /(playstation \w+)/i // Playstation
31571
+ ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
31572
+ /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
31573
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
31574
+ /(ouya)/i, // Ouya
31575
+ /(nintendo) (\w+)/i, // Nintendo
31576
+ /(retroid) (pocket ([^\)]+))/i // Retroid Pocket
31577
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
31578
+ /droid.+; (shield)( bui|\))/i // Nvidia Portable
31579
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [
31580
+
31581
+ ///////////////////
31582
+ // WEARABLES
31583
+ ///////////////////
31584
+
31585
+ /\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i // Samsung Galaxy Watch
31586
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
31587
+ /((pebble))app/i, // Pebble
31588
+ /(asus|google|lg|oppo) ((pixel |zen)?watch[\w ]*)( bui|\))/i // Asus ZenWatch / LG Watch / Pixel Watch
31589
+ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
31590
+ /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch
31591
+ ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [
31592
+ /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
31593
+ ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
31594
+ /(opwwe\d{3})/i // OnePlus Watch
31595
+ ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [
31596
+ /(moto 360)/i // Motorola 360
31597
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [
31598
+ /(smartwatch 3)/i // Sony SmartWatch
31599
+ ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [
31600
+ /(g watch r)/i // LG G Watch R
31601
+ ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [
31602
+ /droid.+; (wt63?0{2,3})\)/i
31603
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
31604
+
31605
+ ///////////////////
31606
+ // XR
31607
+ ///////////////////
31608
+
31609
+ /droid.+; (glass) \d/i // Google Glass
31610
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [
31611
+ /(pico) ([\w ]+) os\d/i // Pico
31612
+ ], [VENDOR, MODEL, [TYPE, XR]], [
31613
+ /(quest( \d| pro)?s?).+vr/i // Meta Quest
31614
+ ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [
31615
+ /mobile vr; rv.+firefox/i // Unidentifiable VR device using Firefox Reality / Wolvic
31616
+ ], [[TYPE, XR]], [
31617
+
31618
+ ///////////////////
31619
+ // EMBEDDED
31620
+ ///////////////////
31621
+
31622
+ /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
31623
+ ], [VENDOR, [TYPE, EMBEDDED]], [
31624
+ /(aeobc)\b/i // Echo Dot
31625
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
31626
+ /(homepod).+mac os/i // Apple HomePod
31627
+ ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [
31628
+ /windows iot/i // Unidentifiable embedded device using Windows IoT
31629
+ ], [[TYPE, EMBEDDED]], [
31630
+
31631
+ ////////////////////
31632
+ // MIXED (GENERIC)
31633
+ ///////////////////
31634
+
31635
+ /droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i // Unidentifiable SmartTV
31636
+ ], [MODEL, [TYPE, SMARTTV]], [
31637
+ /\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i
31638
+ ], [[TYPE, SMARTTV]], [
31639
+ /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i
31640
+ ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [
31641
+ /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
31642
+ ], [[TYPE, TABLET]], [
31643
+ /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
31644
+ ], [[TYPE, MOBILE]], [
31645
+ /droid .+?; ([\w\. -]+)( bui|\))/i // Generic Android Device
31646
+ ], [MODEL, [VENDOR, 'Generic']]
31647
+ ],
31648
+
31649
+ engine : [[
31650
+
31651
+ /windows.+ edge\/([\w\.]+)/i // EdgeHTML
31652
+ ], [VERSION, [NAME, EDGE+'HTML']], [
31653
+
31654
+ /(arkweb)\/([\w\.]+)/i // ArkWeb
31655
+ ], [NAME, VERSION], [
31656
+
31657
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
31658
+ ], [VERSION, [NAME, 'Blink']], [
31659
+
31660
+ /(presto)\/([\w\.]+)/i, // Presto
31661
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
31662
+ /ekioh(flow)\/([\w\.]+)/i, // Flow
31663
+ /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
31664
+ /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
31665
+
31666
+ /\b(libweb)/i // LibWeb
31667
+ ], [NAME, VERSION], [
31668
+ /ladybird\//i
31669
+ ], [[NAME, 'LibWeb']], [
31670
+
31671
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
31672
+ ], [VERSION, NAME]
31673
+ ],
31674
+
31675
+ os : [[
31676
+
31677
+ // Windows
31678
+ /(windows nt) (6\.[23]); arm/i // Windows RT
31679
+ ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [
31680
+ /(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i, // Windows IoT/Mobile/Phone
31681
+ // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11
31682
+ /(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i
31683
+ ], [NAME, VERSION], [
31684
+ /windows nt ?([\d\.\)]*)(?!.+xbox)/i,
31685
+ /\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i
31686
+ ], [[VERSION, /(;|\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [
31687
+ /(windows ce)\/?([\d\.]*)/i // Windows CE
31688
+ ], [NAME, VERSION], [
31689
+
31690
+ // iOS/macOS
31691
+ /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
31692
+ /(?:ios;fbsv|ios(?=.+ip(?:ad|hone))|ip(?:ad|hone)(?: |.+i(?:pad)?)os)[\/ ]([\w\.]+)/i,
31693
+ /cfnetwork\/.+darwin/i
31694
+ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
31695
+ /(mac os x) ?([\w\. ]*)/i,
31696
+ /(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i // Mac OS
31697
+ ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [
31698
+
31699
+ // Google Chromecast
31700
+ /android ([\d\.]+).*crkey/i // Google Chromecast, Android-based
31701
+ ], [VERSION, [NAME, CHROMECAST + ' Android']], [
31702
+ /fuchsia.*crkey\/([\d\.]+)/i // Google Chromecast, Fuchsia-based
31703
+ ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [
31704
+ /crkey\/([\d\.]+).*devicetype\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker
31705
+ ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [
31706
+ /linux.*crkey\/([\d\.]+)/i // Google Chromecast, Legacy Linux-based
31707
+ ], [VERSION, [NAME, CHROMECAST + ' Linux']], [
31708
+ /crkey\/([\d\.]+)/i // Google Chromecast, unknown
31709
+ ], [VERSION, [NAME, CHROMECAST]], [
31710
+
31711
+ // Mobile OSes
31712
+ /droid ([\w\.]+)\b.+(android[- ]x86)/i // Android-x86
31713
+ ], [VERSION, NAME], [
31714
+ /(ubuntu) ([\w\.]+) like android/i // Ubuntu Touch
31715
+ ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [
31716
+ /(harmonyos)[\/ ]?([\d\.]*)/i, // HarmonyOS
31717
+ // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen
31718
+ /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i
31719
+ ], [NAME, VERSION], [
31720
+ /\(bb(10);/i // BlackBerry 10
31721
+ ], [VERSION, [NAME, BLACKBERRY]], [
31722
+ /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i // Symbian
31723
+ ], [VERSION, [NAME, 'Symbian']], [
31724
+ /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
31725
+ ], [VERSION, [NAME, FIREFOX+' OS']], [
31726
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i, // WebOS
31727
+ /webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
31728
+ ], [VERSION, [NAME, 'webOS']], [
31729
+ /web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i
31730
+ // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine
31731
+ ], [[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']], [
31732
+ /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
31733
+ ], [VERSION, [NAME, 'watchOS']], [
31734
+
31735
+ // Google ChromeOS
31736
+ /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
31737
+ ], [[NAME, "Chrome OS"], VERSION],[
31738
+
31739
+ // Smart TVs
31740
+ /panasonic;(viera)/i, // Panasonic Viera
31741
+ /(netrange)mmh/i, // Netrange
31742
+ /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
31743
+
31744
+ // Console
31745
+ /(nintendo|playstation) (\w+)/i, // Nintendo/Playstation
31746
+ /(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
31747
+ /(pico) .+os([\w\.]+)/i, // Pico
31748
+
31749
+ // Other
31750
+ /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
31751
+ /linux.+(mint)[\/\(\) ]?([\w\.]*)/i, // Mint
31752
+ /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i, // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch
31753
+ /([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,
31754
+ // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix
31755
+ /((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris
31756
+ /\b(aix)[; ]([1-9\.]{0,4})/i, // AIX
31757
+ /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i, // Hurd/Linux/MorphOS
31758
+ /(gnu) ?([\w\.]*)/i, // GNU
31759
+ /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
31760
+ /(haiku) ?(r\d)?/i // Haiku
31761
+ ], [NAME, VERSION], [
31762
+ /(sunos) ?([\d\.]*)/i // Solaris
31763
+ ], [[NAME, 'Solaris'], VERSION], [
31764
+ /\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS
31765
+ /(unix) ?([\w\.]*)/i // UNIX
31766
+ ], [NAME, VERSION]
31767
+ ]
31768
+ };
31769
+
31770
+ /////////////////
31771
+ // Factories
31772
+ ////////////////
31773
+
31774
+ var defaultProps = (function () {
31775
+ var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};
31776
+ setProps.call(props.init, [
31777
+ [BROWSER, [NAME, VERSION, MAJOR, TYPE]],
31778
+ [CPU, [ARCHITECTURE]],
31779
+ [DEVICE, [TYPE, MODEL, VENDOR]],
31780
+ [ENGINE, [NAME, VERSION]],
31781
+ [OS, [NAME, VERSION]]
31782
+ ]);
31783
+ setProps.call(props.isIgnore, [
31784
+ [BROWSER, [VERSION, MAJOR]],
31785
+ [ENGINE, [VERSION]],
31786
+ [OS, [VERSION]]
31787
+ ]);
31788
+ setProps.call(props.isIgnoreRgx, [
31789
+ [BROWSER, / ?browser$/i],
31790
+ [OS, / ?os$/i]
31791
+ ]);
31792
+ setProps.call(props.toString, [
31793
+ [BROWSER, [NAME, VERSION]],
31794
+ [CPU, [ARCHITECTURE]],
31795
+ [DEVICE, [VENDOR, MODEL]],
31796
+ [ENGINE, [NAME, VERSION]],
31797
+ [OS, [NAME, VERSION]]
31798
+ ]);
31799
+ return props;
31800
+ })();
31801
+
31802
+ var createIData = function (item, itemType) {
31803
+
31804
+ var init_props = defaultProps.init[itemType],
31805
+ is_ignoreProps = defaultProps.isIgnore[itemType] || 0,
31806
+ is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,
31807
+ toString_props = defaultProps.toString[itemType] || 0;
31808
+
31809
+ function IData () {
31810
+ setProps.call(this, init_props);
31811
+ }
31812
+
31813
+ IData.prototype.getItem = function () {
31814
+ return item;
31815
+ };
31816
+
31817
+ IData.prototype.withClientHints = function () {
31818
+
31819
+ // nodejs / non-client-hints browsers
31820
+ if (!NAVIGATOR_UADATA) {
31821
+ return item
31822
+ .parseCH()
31823
+ .get();
31824
+ }
31825
+
31826
+ // browsers based on chromium 85+
31827
+ return NAVIGATOR_UADATA
31828
+ .getHighEntropyValues(CH_ALL_VALUES)
31829
+ .then(function (res) {
31830
+ return item
31831
+ .setCH(new UACHData(res, false))
31832
+ .parseCH()
31833
+ .get();
31834
+ });
31835
+ };
31836
+
31837
+ IData.prototype.withFeatureCheck = function () {
31838
+ return item.detectFeature().get();
31839
+ };
31840
+
31841
+ if (itemType != RESULT) {
31842
+ IData.prototype.is = function (strToCheck) {
31843
+ var is = false;
31844
+ for (var i in this) {
31845
+ 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)) {
31846
+ is = true;
31847
+ if (strToCheck != TYPEOF.UNDEFINED) break;
31848
+ } else if (strToCheck == TYPEOF.UNDEFINED && is) {
31849
+ is = !is;
31850
+ break;
31851
+ }
31852
+ }
31853
+ return is;
31854
+ };
31855
+ IData.prototype.toString = function () {
31856
+ var str = EMPTY;
31857
+ for (var i in toString_props) {
31858
+ if (typeof(this[toString_props[i]]) !== TYPEOF.UNDEFINED) {
31859
+ str += (str ? ' ' : EMPTY) + this[toString_props[i]];
31860
+ }
31861
+ }
31862
+ return str || TYPEOF.UNDEFINED;
31863
+ };
31864
+ }
31865
+
31866
+ if (!NAVIGATOR_UADATA) {
31867
+ IData.prototype.then = function (cb) {
31868
+ var that = this;
31869
+ var IDataResolve = function () {
31870
+ for (var prop in that) {
31871
+ if (that.hasOwnProperty(prop)) {
31872
+ this[prop] = that[prop];
31873
+ }
31874
+ }
31875
+ };
31876
+ IDataResolve.prototype = {
31877
+ is : IData.prototype.is,
31878
+ toString : IData.prototype.toString
31879
+ };
31880
+ var resolveData = new IDataResolve();
31881
+ cb(resolveData);
31882
+ return resolveData;
31883
+ };
31884
+ }
31885
+
31886
+ return new IData();
31887
+ };
31888
+
31889
+ /////////////////
31890
+ // Constructor
31891
+ ////////////////
31892
+
31893
+ function UACHData (uach, isHttpUACH) {
31894
+ uach = uach || {};
31895
+ setProps.call(this, CH_ALL_VALUES);
31896
+ if (isHttpUACH) {
31897
+ setProps.call(this, [
31898
+ [BRANDS, itemListToArray(uach[CH])],
31899
+ [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
31900
+ [MOBILE, /\?1/.test(uach[CH_MOBILE])],
31901
+ [MODEL, stripQuotes(uach[CH_MODEL])],
31902
+ [PLATFORM, stripQuotes(uach[CH_PLATFORM])],
31903
+ [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],
31904
+ [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],
31905
+ [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
31906
+ [BITNESS, stripQuotes(uach[CH_BITNESS])]
31907
+ ]);
31908
+ } else {
31909
+ for (var prop in uach) {
31910
+ if(this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];
31911
+ }
31912
+ }
31913
+ }
31914
+
31915
+ function UAItem (itemType, ua, rgxMap, uaCH) {
31916
+
31917
+ this.get = function (prop) {
31918
+ if (!prop) return this.data;
31919
+ return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;
31920
+ };
31921
+
31922
+ this.set = function (prop, val) {
31923
+ this.data[prop] = val;
31924
+ return this;
31925
+ };
31926
+
31927
+ this.setCH = function (ch) {
31928
+ this.uaCH = ch;
31929
+ return this;
31930
+ };
31931
+
31932
+ this.detectFeature = function () {
31933
+ if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
31934
+ switch (this.itemType) {
31935
+ case BROWSER:
31936
+ // Brave-specific detection
31937
+ if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {
31938
+ this.set(NAME, 'Brave');
31939
+ }
31940
+ break;
31941
+ case DEVICE:
31942
+ // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData
31943
+ if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
31944
+ this.set(TYPE, MOBILE);
31945
+ }
31946
+ // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
31947
+ if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
31948
+ this.set(MODEL, 'iPad')
31949
+ .set(TYPE, TABLET);
31950
+ }
31951
+ break;
31952
+ case OS:
31953
+ // Chrome-specific detection: check for 'platform' value of navigator.userAgentData
31954
+ if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
31955
+ this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
31956
+ }
31957
+ break;
31958
+ case RESULT:
31959
+ var data = this.data;
31960
+ var detect = function (itemType) {
31961
+ return data[itemType]
31962
+ .getItem()
31963
+ .detectFeature()
31964
+ .get();
31965
+ };
31966
+ this.set(BROWSER, detect(BROWSER))
31967
+ .set(CPU, detect(CPU))
31968
+ .set(DEVICE, detect(DEVICE))
31969
+ .set(ENGINE, detect(ENGINE))
31970
+ .set(OS, detect(OS));
31971
+ }
31972
+ }
31973
+ return this;
31974
+ };
31975
+
31976
+ this.parseUA = function () {
31977
+ if (this.itemType != RESULT) {
31978
+ rgxMapper.call(this.data, this.ua, this.rgxMap);
31979
+ }
31980
+ switch (this.itemType) {
31981
+ case BROWSER:
31982
+ this.set(MAJOR, majorize(this.get(VERSION)));
31983
+ break;
31984
+ case OS:
31985
+ if (this.get(NAME) == 'iOS' && this.get(VERSION) == '18.6') {
31986
+ // Based on the assumption that iOS version is tightly coupled with Safari version
31987
+ var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua); // Get Safari version
31988
+ if (realVersion && parseInt(realVersion[1].substring(0,2), 10) >= 26) {
31989
+ this.set(VERSION, realVersion[1]); // Set as iOS version
31990
+ }
31991
+ }
31992
+ break;
31993
+ }
31994
+ return this;
31995
+ };
31996
+
31997
+ this.parseCH = function () {
31998
+ var uaCH = this.uaCH,
31999
+ rgxMap = this.rgxMap;
32000
+
32001
+ switch (this.itemType) {
32002
+ case BROWSER:
32003
+ case ENGINE:
32004
+ var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
32005
+ if (brands) {
32006
+ for (var i=0; i<brands.length; i++) {
32007
+ var brandName = brands[i].brand || brands[i],
32008
+ brandVersion = brands[i].version;
32009
+ if (this.itemType == BROWSER &&
32010
+ !/not.a.brand/i.test(brandName) &&
32011
+ (!prevName ||
32012
+ (/Chrom/.test(prevName) && brandName != CHROMIUM) ||
32013
+ (prevName == EDGE && /WebView2/.test(brandName))
32014
+ )) {
32015
+ brandName = strMapper(brandName, browserHintsMap);
32016
+ prevName = this.get(NAME);
32017
+ if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {
32018
+ this.set(NAME, brandName)
32019
+ .set(VERSION, brandVersion)
32020
+ .set(MAJOR, majorize(brandVersion));
32021
+ }
32022
+ prevName = brandName;
32023
+ }
32024
+ if (this.itemType == ENGINE && brandName == CHROMIUM) {
32025
+ this.set(VERSION, brandVersion);
32026
+ }
32027
+ }
32028
+ }
32029
+ break;
32030
+ case CPU:
32031
+ var archName = uaCH[ARCHITECTURE];
32032
+ if (archName) {
32033
+ if (archName && uaCH[BITNESS] == '64') archName += '64';
32034
+ rgxMapper.call(this.data, archName + ';', rgxMap);
32035
+ }
32036
+ break;
32037
+ case DEVICE:
32038
+ if (uaCH[MOBILE]) {
32039
+ this.set(TYPE, MOBILE);
32040
+ }
32041
+ if (uaCH[MODEL]) {
32042
+ this.set(MODEL, uaCH[MODEL]);
32043
+ if (!this.get(TYPE) || !this.get(VENDOR)) {
32044
+ var reParse = {};
32045
+ rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);
32046
+ if (!this.get(TYPE) && !!reParse.type) {
32047
+ this.set(TYPE, reParse.type);
32048
+ }
32049
+ if (!this.get(VENDOR) && !!reParse.vendor) {
32050
+ this.set(VENDOR, reParse.vendor);
32051
+ }
32052
+ }
32053
+ }
32054
+ if (uaCH[FORMFACTORS]) {
32055
+ var ff;
32056
+ if (typeof uaCH[FORMFACTORS] !== 'string') {
32057
+ var idx = 0;
32058
+ while (!ff && idx < uaCH[FORMFACTORS].length) {
32059
+ ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);
32060
+ }
32061
+ } else {
32062
+ ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);
32063
+ }
32064
+ this.set(TYPE, ff);
32065
+ }
32066
+ break;
32067
+ case OS:
32068
+ var osName = uaCH[PLATFORM];
32069
+ if(osName) {
32070
+ var osVersion = uaCH[PLATFORMVER];
32071
+ if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');
32072
+ this.set(NAME, osName)
32073
+ .set(VERSION, osVersion);
32074
+ }
32075
+ // Xbox-Specific Detection
32076
+ if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {
32077
+ this.set(NAME, 'Xbox')
32078
+ .set(VERSION, undefined);
32079
+ }
32080
+ break;
32081
+ case RESULT:
32082
+ var data = this.data;
32083
+ var parse = function (itemType) {
32084
+ return data[itemType]
32085
+ .getItem()
32086
+ .setCH(uaCH)
32087
+ .parseCH()
32088
+ .get();
32089
+ };
32090
+ this.set(BROWSER, parse(BROWSER))
32091
+ .set(CPU, parse(CPU))
32092
+ .set(DEVICE, parse(DEVICE))
32093
+ .set(ENGINE, parse(ENGINE))
32094
+ .set(OS, parse(OS));
32095
+ }
32096
+ return this;
32097
+ };
32098
+
32099
+ setProps.call(this, [
32100
+ ['itemType', itemType],
32101
+ ['ua', ua],
32102
+ ['uaCH', uaCH],
32103
+ ['rgxMap', rgxMap],
32104
+ ['data', createIData(this, itemType)]
32105
+ ]);
32106
+
32107
+ return this;
32108
+ }
32109
+
32110
+ function UAParser (ua, extensions, headers) {
32111
+
32112
+ if (typeof ua === TYPEOF.OBJECT) {
32113
+ if (isExtensions(ua, true)) {
32114
+ if (typeof extensions === TYPEOF.OBJECT) {
32115
+ headers = extensions; // case UAParser(extensions, headers)
32116
+ }
32117
+ extensions = ua; // case UAParser(extensions)
32118
+ } else {
32119
+ headers = ua; // case UAParser(headers)
32120
+ extensions = undefined;
32121
+ }
32122
+ ua = undefined;
32123
+ } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {
32124
+ headers = extensions; // case UAParser(ua, headers)
32125
+ extensions = undefined;
32126
+ }
32127
+
32128
+ if (headers) {
32129
+ if (typeof headers.append === TYPEOF.FUNCTION) {
32130
+ // Convert Headers object into a plain object
32131
+ var kv = {};
32132
+ headers.forEach(function (v, k) { kv[String(k).toLowerCase()] = v; });
32133
+ headers = kv;
32134
+ } else {
32135
+ // Normalize headers field name into lowercase
32136
+ var normalized = {};
32137
+ for (var header in headers) {
32138
+ if (headers.hasOwnProperty(header)) {
32139
+ normalized[String(header).toLowerCase()] = headers[header];
32140
+ }
32141
+ }
32142
+ headers = normalized;
32143
+ }
32144
+ }
32145
+
32146
+ if (!(this instanceof UAParser)) {
32147
+ return new UAParser(ua, extensions, headers).getResult();
32148
+ }
32149
+
32150
+ var userAgent = typeof ua === TYPEOF.STRING ? ua : // Passed user-agent string
32151
+ (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers
32152
+ ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent
32153
+ EMPTY)), // empty string
32154
+
32155
+ httpUACH = new UACHData(headers, true),
32156
+ regexMap = extensions ?
32157
+ extend(defaultRegexes, extensions) :
32158
+ defaultRegexes,
32159
+
32160
+ createItemFunc = function (itemType) {
32161
+ if (itemType == RESULT) {
32162
+ return function () {
32163
+ return new UAItem(itemType, userAgent, regexMap, httpUACH)
32164
+ .set('ua', userAgent)
32165
+ .set(BROWSER, this.getBrowser())
32166
+ .set(CPU, this.getCPU())
32167
+ .set(DEVICE, this.getDevice())
32168
+ .set(ENGINE, this.getEngine())
32169
+ .set(OS, this.getOS())
32170
+ .get();
32171
+ };
32172
+ } else {
32173
+ return function () {
32174
+ return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)
32175
+ .parseUA()
32176
+ .get();
32177
+ };
32178
+ }
32179
+ };
32180
+
32181
+ // public methods
32182
+ setProps.call(this, [
32183
+ ['getBrowser', createItemFunc(BROWSER)],
32184
+ ['getCPU', createItemFunc(CPU)],
32185
+ ['getDevice', createItemFunc(DEVICE)],
32186
+ ['getEngine', createItemFunc(ENGINE)],
32187
+ ['getOS', createItemFunc(OS)],
32188
+ ['getResult', createItemFunc(RESULT)],
32189
+ ['getUA', function () { return userAgent; }],
32190
+ ['setUA', function (ua) {
32191
+ if (isString(ua)) userAgent = trim(ua, UA_MAX_LENGTH);
32192
+ return this;
32193
+ }]
32194
+ ])
32195
+ .setUA(userAgent);
32196
+
32197
+ return this;
32198
+ }
32199
+
32200
+ UAParser.VERSION = LIBVERSION;
32201
+ UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);
32202
+ UAParser.CPU = enumerize([ARCHITECTURE]);
32203
+ UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
32204
+ UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
32205
+
32206
+
30724
32207
  // EXTERNAL MODULE: ./node_modules/crypto-js/index.js
30725
32208
  var crypto_js = __webpack_require__(1396);
30726
32209
  var crypto_js_default = /*#__PURE__*/__webpack_require__.n(crypto_js);
@@ -30728,6 +32211,7 @@ var crypto_js_default = /*#__PURE__*/__webpack_require__.n(crypto_js);
30728
32211
 
30729
32212
 
30730
32213
 
32214
+
30731
32215
  /**
30732
32216
  *
30733
32217
  * @returns 获取登录验证码图片
@@ -30833,9 +32317,16 @@ const loginAccount = async (data, appid) => {
30833
32317
  //登录平台成功
30834
32318
  if (code == 10110004) {
30835
32319
  let id = response.id;
32320
+ // 初始化解析器
32321
+ const parser = new ua_parser_namespaceObject["default"]();
32322
+ // 获取浏览器信息
32323
+ const browser = parser.getBrowser();
32324
+ let timestamp = new Date().getTime();
32325
+ let clientID = browser.name + "_" + browser.version + "_" + timestamp;
30836
32326
  window.sessionStorage.setItem("iportal_login_user_id", id);
30837
32327
  window.sessionStorage.setItem("iportal_group_id", data.groupid);
30838
32328
  window.sessionStorage.setItem("iportal_login_user_key", old_key);
32329
+ window.sessionStorage.setItem("iportal_client_id", clientID);
30839
32330
  return {
30840
32331
  code: code
30841
32332
  };
@@ -30958,20 +32449,15 @@ const getFileSize = async url => {
30958
32449
  try {
30959
32450
  // 发送HEAD请求(不下载文件内容)
30960
32451
  const response = await fetch(url, {
30961
- method: 'HEAD'
32452
+ method: 'GET',
32453
+ headers: {
32454
+ 'Range': 'bytes=0-0'
32455
+ } // 仅请求第 1 个字节
30962
32456
  });
30963
-
30964
- // 检查响应状态
30965
- if (!response.ok) {
30966
- throw new Error(`请求失败,状态码: ${response.status}`);
30967
- }
30968
-
30969
- // 获取Content-Length头部
30970
- const contentLength = response.headers.get('Content-Length');
30971
- if (!contentLength) {
30972
- throw new Error('未找到Content-Length响应头');
30973
- }
30974
- return parseInt(contentLength, 10);
32457
+ if (response.status !== 206) throw new Error('不支持 Range 请求');
32458
+ const contentRange = response.headers.get('Content-Range');
32459
+ const totalSize = contentRange?.match(/\/(\d+)$/)?.[1]; // 解析总大小(如 "bytes 0-0/1000" → 1000)
32460
+ return totalSize ? parseInt(totalSize, 10) : -1;
30975
32461
  } catch (error) {
30976
32462
  console.error('获取文件大小失败:', error);
30977
32463
  return -1; // 返回-1表示失败
@@ -31074,7 +32560,7 @@ class ChatClientMgr {
31074
32560
  this.singleChatID = params.singleChatID || "";
31075
32561
  this.customParams = params.customParams || {};
31076
32562
  this.chartOrigin = params.chartOrigin;
31077
- console.log("ChatClientMgr init:", this.actionKey);
32563
+ // console.log("ChatClientMgr init:", this.actionKey);
31078
32564
  }
31079
32565
  makeKey(key) {
31080
32566
  return `${key}-${this.actionKey}`;
@@ -31447,14 +32933,14 @@ const getIMHanlder = customerHanlder => {
31447
32933
  getPortalDocmentInfo: async data => {
31448
32934
  let kb_doc_id = data.kb_doc_id;
31449
32935
  let doc_info = await getPortalDocmentInfo(kb_doc_id);
31450
- let urlStr = doc_info.summary;
32936
+ let urlStr = doc_info?.summary;
31451
32937
  if (urlStr) {
31452
32938
  let urlObj = JSON.parse(urlStr);
31453
- if (urlObj && urlObj.url) {
32939
+ if (urlObj) {
31454
32940
  let url = urlObj[0].url;
31455
32941
  let home_page = window.smardaten_api_context_path;
31456
32942
  let finalUrl = `${home_page}/storage_area/public${url}`;
31457
- let fileSize = await (0,utils_namespaceObject.getFileSize)(finalUrl);
32943
+ let fileSize = await getFileSize(finalUrl);
31458
32944
  doc_info.fileSize = fileSize;
31459
32945
  }
31460
32946
  }