Matomo Analytics – Ethical Stats. Powerful Insights. - Version 4.1.2

Version Description

Download this release

Release Info

Developer matomoteam
Plugin Icon 128x128 Matomo Analytics – Ethical Stats. Powerful Insights.
Version 4.1.2
Comparing to
See all releases

Code changes from version 4.1.1 to 4.1.2

Files changed (130) hide show
  1. app/bootstrap.php +3 -0
  2. app/config/global.ini.php +12 -7
  3. app/core/CliMulti/Process.php +16 -0
  4. app/core/CliMulti/RequestCommand.php +2 -0
  5. app/core/CronArchive.php +10 -4
  6. app/core/CronArchive/QueueConsumer.php +6 -2
  7. app/core/DataAccess/ArchivingDbAdapter.php +14 -0
  8. app/core/Http.php +7 -2
  9. app/core/Mail/Transport.php +6 -2
  10. app/core/Period/Factory.php +5 -1
  11. app/core/SettingsServer.php +45 -15
  12. app/core/Tracker/TableLogAction.php +11 -5
  13. app/core/Tracker/VisitExcluded.php +7 -2
  14. app/core/Tracker/VisitorRecognizer.php +10 -0
  15. app/core/Version.php +1 -1
  16. app/lang/ar.json +1 -1
  17. app/lang/be.json +1 -1
  18. app/lang/bg.json +1 -1
  19. app/lang/ca.json +1 -1
  20. app/lang/cs.json +1 -2
  21. app/lang/da.json +54 -7
  22. app/lang/de.json +1 -2
  23. app/lang/el.json +35 -6
  24. app/lang/en.json +43 -13
  25. app/lang/es-ar.json +1 -2
  26. app/lang/es.json +1 -2
  27. app/lang/fa.json +1 -1
  28. app/lang/fi.json +1 -1
  29. app/lang/fr.json +1 -2
  30. app/lang/id.json +1 -1
  31. app/lang/it.json +1 -2
  32. app/lang/ja.json +1 -2
  33. app/lang/ko.json +1 -1
  34. app/lang/lv.json +1 -1
  35. app/lang/nb.json +1 -1
  36. app/lang/nl.json +1 -1
  37. app/lang/pl.json +1 -2
  38. app/lang/pt-br.json +1 -2
  39. app/lang/pt.json +1 -2
  40. app/lang/ro.json +1 -1
  41. app/lang/ru.json +6 -3
  42. app/lang/sq.json +13 -2
  43. app/lang/sr.json +1 -2
  44. app/lang/sv.json +10 -4
  45. app/lang/tl.json +1 -1
  46. app/lang/tr.json +2 -2
  47. app/lang/uk.json +1 -2
  48. app/lang/vi.json +1 -1
  49. app/lang/zh-cn.json +1 -2
  50. app/lang/zh-tw.json +42 -5
  51. app/plugins/API/Reports/Get.php +1 -1
  52. app/plugins/Actions/Reports/Get.php +1 -1
  53. app/plugins/Contents/Reports/GetContentNames.php +1 -2
  54. app/plugins/Contents/Reports/GetContentPieces.php +1 -2
  55. app/plugins/CoreAdminHome/Controller.php +3 -2
  56. app/plugins/CoreHome/CoreHome.php +1 -0
  57. app/plugins/CoreHome/angularjs/period-selector/period-selector.directive.html +1 -1
  58. app/plugins/CoreHome/stylesheets/layout.less +16 -1
  59. app/plugins/CoreHome/templates/_menu.twig +12 -7
  60. app/plugins/CorePluginsAdmin/Controller.php +2 -0
  61. app/plugins/CorePluginsAdmin/CorePluginsAdmin.php +1 -0
  62. app/plugins/CoreUpdater/Controller.php +0 -5
  63. app/plugins/CoreUpdater/Model.php +1 -0
  64. app/plugins/CoreVisualizations/Visualizations/Sparklines.php +1 -1
  65. app/plugins/DevicesDetection/Reports/GetBrand.php +1 -1
  66. app/plugins/DevicesDetection/Reports/GetBrowserVersions.php +1 -1
  67. app/plugins/DevicesDetection/Reports/GetBrowsers.php +1 -1
  68. app/plugins/DevicesDetection/Reports/GetModel.php +1 -1
  69. app/plugins/DevicesDetection/Reports/GetOsFamilies.php +1 -1
  70. app/plugins/DevicesDetection/Reports/GetOsVersions.php +1 -1
  71. app/plugins/DevicesDetection/Reports/GetType.php +1 -1
  72. app/plugins/Events/Reports/GetAction.php +1 -1
  73. app/plugins/Events/Reports/GetCategory.php +1 -1
  74. app/plugins/Events/Reports/GetName.php +1 -1
  75. app/plugins/Feedback/API.php +0 -1
  76. app/plugins/Goals/Reports/Get.php +1 -1
  77. app/plugins/Goals/Reports/GetDaysToConversion.php +1 -0
  78. app/plugins/Goals/Reports/GetVisitsUntilConversion.php +1 -0
  79. app/plugins/Live/Model.php +60 -29
  80. app/plugins/Login/PasswordResetter.php +7 -10
  81. app/plugins/Marketplace/Controller.php +2 -0
  82. app/plugins/Marketplace/templates/_updateCommunicationEmail.twig +2 -2
  83. app/plugins/Marketplace/templates/uploadPluginDialog.twig +1 -1
  84. app/plugins/Morpheus/templates/admin.twig +1 -1
  85. app/plugins/MultiSites/Reports/GetAll.php +1 -1
  86. app/plugins/MultiSites/Reports/GetOne.php +1 -1
  87. app/plugins/PagePerformance/Controller.php +3 -2
  88. app/plugins/PagePerformance/Reports/Get.php +1 -1
  89. app/plugins/PrivacyManager/PrivacyManager.php +3 -1
  90. app/plugins/PrivacyManager/SystemSettings.php +14 -0
  91. app/plugins/PrivacyManager/templates/footerLinks.twig +2 -0
  92. app/plugins/Referrers/Reports/Get.php +1 -1
  93. app/plugins/Referrers/SearchEngine.php +3 -1
  94. app/plugins/Resolution/Reports/GetResolution.php +1 -1
  95. app/plugins/SitesManager/SitesManager.php +1 -0
  96. app/plugins/SitesManager/templates/help/excluded-user-agents-help.html +1 -0
  97. app/plugins/UserId/Reports/GetUsers.php +1 -1
  98. app/plugins/VisitFrequency/Reports/Get.php +2 -2
  99. app/plugins/VisitsSummary/Reports/Get.php +21 -3
  100. app/plugins/WebsiteMeasurable/MeasurableSettings.php +3 -1
  101. app/vendor/autoload.php +1 -1
  102. app/vendor/bin/lessc +0 -191
  103. app/vendor/composer/InstalledVersions.php +10 -10
  104. app/vendor/composer/autoload_real.php +7 -7
  105. app/vendor/composer/autoload_static.php +6 -6
  106. app/vendor/composer/installed.json +7 -7
  107. app/vendor/composer/installed.php +10 -10
  108. app/vendor/matomo/device-detector/DeviceDetector.php +2 -2
  109. app/vendor/matomo/device-detector/Parser/Client/Browser.php +9 -1
  110. app/vendor/matomo/device-detector/Parser/Device/AbstractDeviceParser.php +401 -332
  111. app/vendor/matomo/device-detector/Parser/OperatingSystem.php +19 -4
  112. app/vendor/matomo/device-detector/README.md +10 -7
  113. app/vendor/matomo/device-detector/regexes/bots.yml +92 -25
  114. app/vendor/matomo/device-detector/regexes/client/browser_engine.yml +1 -1
  115. app/vendor/matomo/device-detector/regexes/client/browsers.yml +57 -8
  116. app/vendor/matomo/device-detector/regexes/client/feed_readers.yml +1 -1
  117. app/vendor/matomo/device-detector/regexes/client/mobile_apps.yml +57 -70
  118. app/vendor/matomo/device-detector/regexes/device/mobiles.yml +1568 -408
  119. app/vendor/matomo/device-detector/regexes/device/portable_media_player.yml +6 -1
  120. app/vendor/matomo/device-detector/regexes/device/televisions.yml +98 -2
  121. app/vendor/matomo/device-detector/regexes/oss.yml +283 -15
  122. assets/js/asset_manager_core_js.js +7 -6
  123. classes/WpMatomo/Admin/SystemReport.php +14 -0
  124. classes/WpMatomo/Admin/TrackingSettings.php +18 -0
  125. classes/WpMatomo/Admin/TrackingSettings/Forms.php +15 -1
  126. classes/WpMatomo/Admin/views/summary.php +1 -1
  127. classes/WpMatomo/Admin/views/tracking.php +16 -0
  128. classes/WpMatomo/Site/Sync/SyncConfig.php +1 -1
  129. matomo.php +1 -1
  130. readme.txt +1 -1
app/bootstrap.php CHANGED
@@ -148,6 +148,9 @@ if ( $GLOBALS['MATOMO_LOADED_DIRECTLY'] ) {
148
 
149
  if ( ! defined( 'ABSPATH' ) ) {
150
  echo 'Could not find wp-load. If your server uses symlinks or a custom content directory, Matomo may not work for you as we cannot detect the paths correctly. For more information see https://matomo.org/faq/wordpress/how-do-i-make-matomo-for-wordpress-work-when-i-have-a-custom-content-directory/';
 
 
 
151
  exit; // if accessed directly
152
  }
153
 
148
 
149
  if ( ! defined( 'ABSPATH' ) ) {
150
  echo 'Could not find wp-load. If your server uses symlinks or a custom content directory, Matomo may not work for you as we cannot detect the paths correctly. For more information see https://matomo.org/faq/wordpress/how-do-i-make-matomo-for-wordpress-work-when-i-have-a-custom-content-directory/';
151
+ if (!empty($_SERVER['MATOMO_WP_ROOT_PATH'])) {
152
+ echo ' Note: A custom WP root path was set.';
153
+ }
154
  exit; // if accessed directly
155
  }
156
 
app/config/global.ini.php CHANGED
@@ -356,6 +356,11 @@ archiving_range_force_on_browser_request = 1
356
  ; If you need any other period, or want to ensure one of those is always archived, you can define them here
357
  archiving_custom_ranges[] =
358
 
 
 
 
 
 
359
  ; By default Matomo runs OPTIMIZE TABLE SQL queries to free spaces after deleting some data.
360
  ; If your Matomo tracks millions of pages, the OPTIMIZE TABLE queries might run for hours (seen in "SHOW FULL PROCESSLIST \g")
361
  ; so you can disable these special queries here:
@@ -416,12 +421,6 @@ login_cookie_path =
416
  ; "remember me" option checked
417
  login_session_not_remembered_idle_timeout = 3600
418
 
419
- ; email address that appears as a Sender in the password recovery email
420
- ; if specified, {DOMAIN} will be replaced by the current Matomo domain
421
- login_password_recovery_email_address = "password-recovery@{DOMAIN}"
422
- ; name that appears as a Sender in the password recovery email
423
- login_password_recovery_email_name = Matomo
424
-
425
  ; email address that appears as a Reply-to in the password recovery email
426
  ; if specified, {DOMAIN} will be replaced by the current Matomo domain
427
  login_password_recovery_replyto_email_address = "no-reply@{DOMAIN}"
@@ -881,6 +880,12 @@ create_new_visit_when_website_referrer_changes = 0
881
  ; Whether to force a new visit at midnight for every visitor. Default 1.
882
  create_new_visit_after_midnight = 1
883
 
 
 
 
 
 
 
884
  ; maximum length of a Page Title or a Page URL recorded in the log_action.name table
885
  page_maximum_length = 1024;
886
 
@@ -984,7 +989,7 @@ host = ; SMTP server address
984
  type = ; SMTP Auth type. By default: NONE. For example: LOGIN
985
  username = ; SMTP username
986
  password = ; SMTP password
987
- encryption = ; SMTP transport-layer encryption, either 'ssl', 'tls', or empty (i.e., none).
988
 
989
  [proxy]
990
  type = BASIC ; proxy type for outbound/outgoing connections; currently, only BASIC is supported
356
  ; If you need any other period, or want to ensure one of those is always archived, you can define them here
357
  archiving_custom_ranges[] =
358
 
359
+ ; If configured, archiving queries will be aborted after the configured amount of seconds. Set it to -1 if the query time
360
+ ; should not be limited. Note: This feature requires a recent MySQL version (5.7 or newer). Some MySQL forks like MariaDB
361
+ ; might not support this feature which uses the MAX_EXECUTION_TIME hint.
362
+ archiving_query_max_execution_time = 7200
363
+
364
  ; By default Matomo runs OPTIMIZE TABLE SQL queries to free spaces after deleting some data.
365
  ; If your Matomo tracks millions of pages, the OPTIMIZE TABLE queries might run for hours (seen in "SHOW FULL PROCESSLIST \g")
366
  ; so you can disable these special queries here:
421
  ; "remember me" option checked
422
  login_session_not_remembered_idle_timeout = 3600
423
 
 
 
 
 
 
 
424
  ; email address that appears as a Reply-to in the password recovery email
425
  ; if specified, {DOMAIN} will be replaced by the current Matomo domain
426
  login_password_recovery_replyto_email_address = "no-reply@{DOMAIN}"
880
  ; Whether to force a new visit at midnight for every visitor. Default 1.
881
  create_new_visit_after_midnight = 1
882
 
883
+ ; Will force the creation of a new visit once a visit had this many actions.
884
+ ; Increasing this number can slow down the tracking in Matomo and put more load on the database.
885
+ ; Increase this limit if it's expected that you have visits with more than this many actions.
886
+ ; Set to 0 or a negative value to allow unlimited actions.
887
+ create_new_visit_after_x_actions = 10000
888
+
889
  ; maximum length of a Page Title or a Page URL recorded in the log_action.name table
890
  page_maximum_length = 1024;
891
 
989
  type = ; SMTP Auth type. By default: NONE. For example: LOGIN
990
  username = ; SMTP username
991
  password = ; SMTP password
992
+ encryption = ; SMTP transport-layer encryption, either 'none', 'ssl', 'tls', or empty (i.e., auto).
993
 
994
  [proxy]
995
  type = BASIC ; proxy type for outbound/outgoing connections; currently, only BASIC is supported
app/core/CliMulti/Process.php CHANGED
@@ -8,6 +8,7 @@
8
  namespace Piwik\CliMulti;
9
 
10
  use Piwik\CliMulti;
 
11
  use Piwik\Filesystem;
12
  use Piwik\SettingsServer;
13
 
@@ -45,6 +46,15 @@ class Process
45
  $this->markAsNotStarted();
46
  }
47
 
 
 
 
 
 
 
 
 
 
48
  public function getPid()
49
  {
50
  return $this->pid;
@@ -178,6 +188,12 @@ class Process
178
 
179
  public static function isSupported()
180
  {
 
 
 
 
 
 
181
  if (SettingsServer::isWindows()) {
182
  return false;
183
  }
8
  namespace Piwik\CliMulti;
9
 
10
  use Piwik\CliMulti;
11
+ use Piwik\Container\StaticContainer;
12
  use Piwik\Filesystem;
13
  use Piwik\SettingsServer;
14
 
46
  $this->markAsNotStarted();
47
  }
48
 
49
+ private static function isForcingAsyncProcessMode()
50
+ {
51
+ try {
52
+ return (bool) StaticContainer::get('test.vars.forceCliMultiViaCurl');
53
+ } catch (\Exception $ex) {
54
+ return false;
55
+ }
56
+ }
57
+
58
  public function getPid()
59
  {
60
  return $this->pid;
188
 
189
  public static function isSupported()
190
  {
191
+ if (defined('PIWIK_TEST_MODE')
192
+ && self::isForcingAsyncProcessMode()
193
+ ) {
194
+ return false;
195
+ }
196
+
197
  if (SettingsServer::isWindows()) {
198
  return false;
199
  }
app/core/CliMulti/RequestCommand.php CHANGED
@@ -103,6 +103,8 @@ class RequestCommand extends ConsoleCommand
103
  Url::setHost($hostname);
104
 
105
  $query = $input->getArgument('url-query');
 
 
106
  $query = UrlHelper::getArrayFromQueryString($query); // NOTE: this method can create the StaticContainer now
107
  foreach ($query as $name => $value) {
108
  $_GET[$name] = urldecode($value);
103
  Url::setHost($hostname);
104
 
105
  $query = $input->getArgument('url-query');
106
+ $_SERVER['QUERY_STRING'] = $query;
107
+
108
  $query = UrlHelper::getArrayFromQueryString($query); // NOTE: this method can create the StaticContainer now
109
  foreach ($query as $name => $value) {
110
  $_GET[$name] = urldecode($value);
app/core/CronArchive.php CHANGED
@@ -211,6 +211,11 @@ class CronArchive
211
  */
212
  private $cliMultiRequestParser;
213
 
 
 
 
 
 
214
  /**
215
  * Constructor.
216
  *
@@ -235,7 +240,8 @@ class CronArchive
235
 
236
  $this->rawLogDao = new RawLogDao();
237
 
238
- $this->cliMultiRequestParser = new RequestParser($this->makeCliMulti()->supportsAsync());
 
239
 
240
  $this->archiveFilter = new ArchiveFilter();
241
  }
@@ -654,7 +660,7 @@ class CronArchive
654
  {
655
  $request = "?module=API&method=CoreAdminHome.archiveReports&idSite=$idSite&period=$period&date=" . $date . "&format=json";
656
  if ($segment) {
657
- $request .= '&segment=' . urlencode(urlencode($segment));
658
  }
659
  if (!empty($plugin)) {
660
  $request .= "&plugin=" . $plugin;
@@ -696,7 +702,7 @@ class CronArchive
696
  if (empty($response)) {
697
  $message .= "The response was empty. This usually means a server error. A solution to this error is generally to increase the value of 'memory_limit' in your php.ini file. ";
698
 
699
- if($this->makeCliMulti()->supportsAsync()) {
700
  $message .= " For more information and the error message please check in your PHP CLI error log file. As this core:archive command triggers PHP processes over the CLI, you can find where PHP CLI logs are stored by running this command: php -i | grep error_log";
701
  } else {
702
  $message .= " For more information and the error message please check your web server's error Log file. As this core:archive command triggers PHP processes over HTTP, you can find the error message in your Matomo's web server error logs. ";
@@ -735,7 +741,7 @@ class CronArchive
735
  $websiteIds = array_intersect($websiteIds, $allWebsites);
736
 
737
  if (!empty($this->shouldSkipSpecifiedSites)) {
738
- $websiteIds = array_intersect($websiteIds, $this->shouldSkipSpecifiedSites);
739
  }
740
 
741
  /**
211
  */
212
  private $cliMultiRequestParser;
213
 
214
+ /**
215
+ * @var bool|mixed
216
+ */
217
+ private $supportsAsync;
218
+
219
  /**
220
  * Constructor.
221
  *
240
 
241
  $this->rawLogDao = new RawLogDao();
242
 
243
+ $this->supportsAsync = $this->makeCliMulti()->supportsAsync();
244
+ $this->cliMultiRequestParser = new RequestParser($this->supportsAsync);
245
 
246
  $this->archiveFilter = new ArchiveFilter();
247
  }
660
  {
661
  $request = "?module=API&method=CoreAdminHome.archiveReports&idSite=$idSite&period=$period&date=" . $date . "&format=json";
662
  if ($segment) {
663
+ $request .= '&segment=' . urlencode($segment);
664
  }
665
  if (!empty($plugin)) {
666
  $request .= "&plugin=" . $plugin;
702
  if (empty($response)) {
703
  $message .= "The response was empty. This usually means a server error. A solution to this error is generally to increase the value of 'memory_limit' in your php.ini file. ";
704
 
705
+ if($this->supportsAsync) {
706
  $message .= " For more information and the error message please check in your PHP CLI error log file. As this core:archive command triggers PHP processes over the CLI, you can find where PHP CLI logs are stored by running this command: php -i | grep error_log";
707
  } else {
708
  $message .= " For more information and the error message please check your web server's error Log file. As this core:archive command triggers PHP processes over HTTP, you can find the error message in your Matomo's web server error logs. ";
741
  $websiteIds = array_intersect($websiteIds, $allWebsites);
742
 
743
  if (!empty($this->shouldSkipSpecifiedSites)) {
744
+ $websiteIds = array_diff($websiteIds, $this->shouldSkipSpecifiedSites);
745
  }
746
 
747
  /**
app/core/CronArchive/QueueConsumer.php CHANGED
@@ -108,6 +108,8 @@ class QueueConsumer
108
  */
109
  private $currentSiteArchivingStartTime;
110
 
 
 
111
  public function __construct(LoggerInterface $logger, $websiteIdArchiveList, $countOfProcesses, $pid, Model $model,
112
  SegmentArchiving $segmentArchiving, CronArchive $cronArchive, RequestParser $cliMultiRequestParser,
113
  ArchiveFilter $archiveFilter = null)
@@ -138,6 +140,8 @@ class QueueConsumer
138
  return null;
139
  }
140
 
 
 
141
  /**
142
  * This event is triggered before the cron archiving process starts archiving data for a single
143
  * site.
@@ -298,7 +302,7 @@ class QueueConsumer
298
 
299
  $this->logger->info("Finished archiving for site {idSite}, {requests} API requests, {timer} [{processed} / {totalNum} done]", [
300
  'idSite' => $this->idSite,
301
- 'processed' => $this->websiteIdArchiveList->getNumProcessedWebsites(),
302
  'totalNum' => $this->websiteIdArchiveList->getNumSites(),
303
  'timer' => $this->siteTimer,
304
  'requests' => $this->siteRequests,
@@ -386,7 +390,7 @@ class QueueConsumer
386
  return $loader->canSkipThisArchive(); // if no point in archiving, skip
387
  }
388
 
389
- private function shouldSkipArchiveBecauseLowerPeriodOrSegmentIsInProgress(array $archiveToProcess)
390
  {
391
  $inProgressArchives = $this->cliMultiRequestParser->getInProgressArchivingCommands();
392
 
108
  */
109
  private $currentSiteArchivingStartTime;
110
 
111
+ private $processedSiteCount = 0;
112
+
113
  public function __construct(LoggerInterface $logger, $websiteIdArchiveList, $countOfProcesses, $pid, Model $model,
114
  SegmentArchiving $segmentArchiving, CronArchive $cronArchive, RequestParser $cliMultiRequestParser,
115
  ArchiveFilter $archiveFilter = null)
140
  return null;
141
  }
142
 
143
+ ++$this->processedSiteCount;
144
+
145
  /**
146
  * This event is triggered before the cron archiving process starts archiving data for a single
147
  * site.
302
 
303
  $this->logger->info("Finished archiving for site {idSite}, {requests} API requests, {timer} [{processed} / {totalNum} done]", [
304
  'idSite' => $this->idSite,
305
+ 'processed' => $this->processedSiteCount,
306
  'totalNum' => $this->websiteIdArchiveList->getNumSites(),
307
  'timer' => $this->siteTimer,
308
  'requests' => $this->siteRequests,
390
  return $loader->canSkipThisArchive(); // if no point in archiving, skip
391
  }
392
 
393
+ public function shouldSkipArchiveBecauseLowerPeriodOrSegmentIsInProgress(array $archiveToProcess)
394
  {
395
  $inProgressArchives = $this->cliMultiRequestParser->getInProgressArchivingCommands();
396
 
app/core/DataAccess/ArchivingDbAdapter.php CHANGED
@@ -11,7 +11,9 @@ namespace Piwik\DataAccess;
11
 
12
  use Piwik\ArchiveProcessor\ArchivingStatus;
13
  use Piwik\Concurrency\Lock;
 
14
  use Piwik\Db\AdapterInterface;
 
15
  use Psr\Log\LoggerInterface;
16
 
17
  class ArchivingDbAdapter
@@ -31,11 +33,17 @@ class ArchivingDbAdapter
31
  */
32
  private $logger;
33
 
 
 
 
 
 
34
  public function __construct($wrapped, Lock $archivingLock = null, LoggerInterface $logger = null)
35
  {
36
  $this->wrapped = $wrapped;
37
  $this->archivingLock = $archivingLock;
38
  $this->logger = $logger;
 
39
  }
40
 
41
  public function __call($name, $arguments)
@@ -46,6 +54,7 @@ class ArchivingDbAdapter
46
  public function exec($sql)
47
  {
48
  $this->reexpireLock();
 
49
  $this->logSql($sql);
50
 
51
  return call_user_func_array([$this->wrapped, __FUNCTION__], func_get_args());
@@ -54,6 +63,7 @@ class ArchivingDbAdapter
54
  public function query($sql)
55
  {
56
  $this->reexpireLock();
 
57
  $this->logSql($sql);
58
 
59
  return call_user_func_array([$this->wrapped, __FUNCTION__], func_get_args());
@@ -62,6 +72,7 @@ class ArchivingDbAdapter
62
  public function fetchAll($sql)
63
  {
64
  $this->reexpireLock();
 
65
  $this->logSql($sql);
66
 
67
  return call_user_func_array([$this->wrapped, __FUNCTION__], func_get_args());
@@ -70,6 +81,7 @@ class ArchivingDbAdapter
70
  public function fetchRow($sql)
71
  {
72
  $this->reexpireLock();
 
73
  $this->logSql($sql);
74
 
75
  return call_user_func_array([$this->wrapped, __FUNCTION__], func_get_args());
@@ -78,6 +90,7 @@ class ArchivingDbAdapter
78
  public function fetchOne($sql)
79
  {
80
  $this->reexpireLock();
 
81
  $this->logSql($sql);
82
 
83
  return call_user_func_array([$this->wrapped, __FUNCTION__], func_get_args());
@@ -86,6 +99,7 @@ class ArchivingDbAdapter
86
  public function fetchAssoc($sql)
87
  {
88
  $this->reexpireLock();
 
89
  $this->logSql($sql);
90
 
91
  return call_user_func_array([$this->wrapped, __FUNCTION__], func_get_args());
11
 
12
  use Piwik\ArchiveProcessor\ArchivingStatus;
13
  use Piwik\Concurrency\Lock;
14
+ use Piwik\Config;
15
  use Piwik\Db\AdapterInterface;
16
+ use Piwik\DbHelper;
17
  use Psr\Log\LoggerInterface;
18
 
19
  class ArchivingDbAdapter
33
  */
34
  private $logger;
35
 
36
+ /**
37
+ * @var int
38
+ */
39
+ private $maxExecutionTime;
40
+
41
  public function __construct($wrapped, Lock $archivingLock = null, LoggerInterface $logger = null)
42
  {
43
  $this->wrapped = $wrapped;
44
  $this->archivingLock = $archivingLock;
45
  $this->logger = $logger;
46
+ $this->maxExecutionTime = (float) Config::getInstance()->General['archiving_query_max_execution_time'];
47
  }
48
 
49
  public function __call($name, $arguments)
54
  public function exec($sql)
55
  {
56
  $this->reexpireLock();
57
+ $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
58
  $this->logSql($sql);
59
 
60
  return call_user_func_array([$this->wrapped, __FUNCTION__], func_get_args());
63
  public function query($sql)
64
  {
65
  $this->reexpireLock();
66
+ $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
67
  $this->logSql($sql);
68
 
69
  return call_user_func_array([$this->wrapped, __FUNCTION__], func_get_args());
72
  public function fetchAll($sql)
73
  {
74
  $this->reexpireLock();
75
+ $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
76
  $this->logSql($sql);
77
 
78
  return call_user_func_array([$this->wrapped, __FUNCTION__], func_get_args());
81
  public function fetchRow($sql)
82
  {
83
  $this->reexpireLock();
84
+ $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
85
  $this->logSql($sql);
86
 
87
  return call_user_func_array([$this->wrapped, __FUNCTION__], func_get_args());
90
  public function fetchOne($sql)
91
  {
92
  $this->reexpireLock();
93
+ $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
94
  $this->logSql($sql);
95
 
96
  return call_user_func_array([$this->wrapped, __FUNCTION__], func_get_args());
99
  public function fetchAssoc($sql)
100
  {
101
  $this->reexpireLock();
102
+ $sql = DbHelper::addMaxExecutionTimeHintToQuery($sql, $this->maxExecutionTime);
103
  $this->logSql($sql);
104
 
105
  return call_user_func_array([$this->wrapped, __FUNCTION__], func_get_args());
app/core/Http.php CHANGED
@@ -608,6 +608,11 @@ class Http
608
 
609
  if ($rangeBytes) {
610
  curl_setopt($ch, CURLOPT_RANGE, $rangeBytes);
 
 
 
 
 
611
  }
612
 
613
  // Case core:archive command is triggering archiving on https:// and the certificate is not valid
@@ -708,8 +713,8 @@ class Http
708
  @fclose($file);
709
 
710
  $fileSize = filesize($destinationPath);
711
- if ((($contentLength > 0) && ($fileLength != $contentLength))
712
- || ($fileSize != $fileLength)
713
  ) {
714
  throw new Exception('File size error: ' . $destinationPath . '; expected ' . $contentLength . ' bytes; received ' . $fileLength . ' bytes; saved ' . $fileSize . ' bytes to file');
715
  }
608
 
609
  if ($rangeBytes) {
610
  curl_setopt($ch, CURLOPT_RANGE, $rangeBytes);
611
+ } else {
612
+ // see https://github.com/matomo-org/matomo/pull/17009 for more info
613
+ // NOTE: we only do this when CURLOPT_RANGE is not being used, because when using both the
614
+ // response is empty.
615
+ $curl_options[CURLOPT_ENCODING] = "";
616
  }
617
 
618
  // Case core:archive command is triggering archiving on https:// and the certificate is not valid
713
  @fclose($file);
714
 
715
  $fileSize = filesize($destinationPath);
716
+ if ($contentLength > 0
717
+ && $fileSize != $contentLength
718
  ) {
719
  throw new Exception('File size error: ' . $destinationPath . '; expected ' . $contentLength . ' bytes; received ' . $fileLength . ' bytes; saved ' . $fileSize . ' bytes to file');
720
  }
app/core/Mail/Transport.php CHANGED
@@ -107,7 +107,7 @@ class Transport
107
  /**
108
  * @return void
109
  */
110
- private function initSmtpTransport($phpMailer)
111
  {
112
  $mailConfig = Config::getInstance()->mail;
113
 
@@ -133,7 +133,11 @@ class Transport
133
  }
134
 
135
  if (!empty($mailConfig['encryption'])) {
136
- $phpMailer->SMTPSecure = $mailConfig['encryption'];
 
 
 
 
137
  }
138
 
139
  if (!empty($mailConfig['port'])) {
107
  /**
108
  * @return void
109
  */
110
+ private function initSmtpTransport(PHPMailer $phpMailer)
111
  {
112
  $mailConfig = Config::getInstance()->mail;
113
 
133
  }
134
 
135
  if (!empty($mailConfig['encryption'])) {
136
+ if (strtolower($mailConfig['encryption']) === 'none') {
137
+ $phpMailer->SMTPAutoTLS = false; // force using no encryption
138
+ } else {
139
+ $phpMailer->SMTPSecure = $mailConfig['encryption'];
140
+ }
141
  }
142
 
143
  if (!empty($mailConfig['port'])) {
app/core/Period/Factory.php CHANGED
@@ -167,7 +167,11 @@ abstract class Factory
167
  $oPeriod = new Range('range', $date, $timezone, Date::factory('today', $timezone));
168
  } else {
169
  if (!($date instanceof Date)) {
170
- $date = Date::factory($date, $timezone);
 
 
 
 
171
  }
172
  $oPeriod = Factory::build($period, $date);
173
  }
167
  $oPeriod = new Range('range', $date, $timezone, Date::factory('today', $timezone));
168
  } else {
169
  if (!($date instanceof Date)) {
170
+ if (preg_match('/^(now|today|yesterday|yesterdaySameTime|last[ -]?(?:week|month|year))$/i', $date)) {
171
+ $date = Date::factory($date, $timezone);
172
+ } else {
173
+ $date = Date::factory($date);
174
+ }
175
  }
176
  $oPeriod = Factory::build($period, $date);
177
  }
app/core/SettingsServer.php CHANGED
@@ -196,32 +196,62 @@ class SettingsServer
196
  * Prior to PHP 5.2.1, or on Windows, --enable-memory-limit is not a
197
  * compile-time default, so ini_get('memory_limit') may return false.
198
  *
199
- * @see http://www.php.net/manual/en/faq.using.php#faq.using.shorthandbytes
200
  * @return int|bool memory limit in megabytes, or false if there is no limit
201
  */
202
  public static function getMemoryLimitValue()
203
  {
204
  if (($memory = ini_get('memory_limit')) > 0) {
205
- // handle shorthand byte options (case-insensitive)
206
- $shorthandByteOption = substr($memory, -1);
207
- switch ($shorthandByteOption) {
208
- case 'G':
209
- case 'g':
210
- return substr($memory, 0, -1) * 1024;
211
- case 'M':
212
- case 'm':
213
- return substr($memory, 0, -1);
214
- case 'K':
215
- case 'k':
216
- return substr($memory, 0, -1) / 1024;
217
- }
218
- return $memory / 1048576;
219
  }
220
 
221
  // no memory limit
222
  return false;
223
  }
224
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
225
  /**
226
  * Set maximum script execution time.
227
  *
196
  * Prior to PHP 5.2.1, or on Windows, --enable-memory-limit is not a
197
  * compile-time default, so ini_get('memory_limit') may return false.
198
  *
 
199
  * @return int|bool memory limit in megabytes, or false if there is no limit
200
  */
201
  public static function getMemoryLimitValue()
202
  {
203
  if (($memory = ini_get('memory_limit')) > 0) {
204
+ return self::getMegaBytesFromShorthandByte($memory);
 
 
 
 
 
 
 
 
 
 
 
 
 
205
  }
206
 
207
  // no memory limit
208
  return false;
209
  }
210
 
211
+ /**
212
+ * Get php post_max_size (in Megabytes)
213
+ *
214
+ * @return int|bool max upload size in megabytes, or false if there is no limit
215
+ */
216
+ public static function getPostMaxUploadSize()
217
+ {
218
+ if (($maxPostSize = ini_get('post_max_size')) > 0) {
219
+ return self::getMegaBytesFromShorthandByte($maxPostSize);
220
+ }
221
+
222
+ // no max upload size
223
+ return false;
224
+ }
225
+
226
+ /**
227
+ * @see http://www.php.net/manual/en/faq.using.php#faq.using.shorthandbytes
228
+ * @param $value
229
+ * @return false|float|int
230
+ */
231
+ private static function getMegaBytesFromShorthandByte($value)
232
+ {
233
+ $value = str_replace(' ', '', $value);
234
+
235
+ $shorthandByteOption = substr($value, -1);
236
+ switch ($shorthandByteOption) {
237
+ case 'G':
238
+ case 'g':
239
+ return substr($value, 0, -1) * 1024;
240
+ case 'M':
241
+ case 'm':
242
+ return substr($value, 0, -1);
243
+ case 'K':
244
+ case 'k':
245
+ return substr($value, 0, -1) / 1024;
246
+ }
247
+
248
+ if (is_numeric($value)) {
249
+ return (int) $value / 1048576;
250
+ }
251
+
252
+ return false;
253
+ }
254
+
255
  /**
256
  * Set maximum script execution time.
257
  *
app/core/Tracker/TableLogAction.php CHANGED
@@ -43,7 +43,7 @@ class TableLogAction
43
 
44
  $actionIds = self::queryIdsAction($actionsNameAndType);
45
 
46
- list($queriedIds, $fieldNamesToInsert) = self::processIdsToInsert($actionsNameAndType, $actionIds);
47
 
48
  $insertedIds = self::insertNewIdsAction($actionsNameAndType, $fieldNamesToInsert);
49
  $queriedIds = $queriedIds + $insertedIds;
@@ -95,7 +95,7 @@ class TableLogAction
95
  $inserted = array();
96
 
97
  foreach ($fieldNamesToInsert as $fieldName) {
98
- list($name, $type, $urlPrefix) = $actionsNameAndType[$fieldName];
99
 
100
  $actionId = self::getModel()->createNewIdAction($name, $type, $urlPrefix);
101
 
@@ -116,7 +116,7 @@ class TableLogAction
116
  {
117
  $toQuery = array();
118
  foreach ($actionsNameAndType as &$actionNameType) {
119
- list($name, $type, $urlPrefix) = $actionNameType;
120
  $toQuery[] = array('name' => $name, 'type' => $type);
121
  }
122
 
@@ -184,14 +184,20 @@ class TableLogAction
184
  $valueToMatch = preg_replace('@^http[s]?://(www\.)?@i', '', $valueToMatch);
185
  }
186
 
 
187
  $valueToMatch = self::normaliseActionString($actionType, $valueToMatch);
188
  if ($matchType == SegmentExpression::MATCH_EQUAL
189
  || $matchType == SegmentExpression::MATCH_NOT_EQUAL
190
  ) {
191
  $idAction = self::getModel()->getIdActionMatchingNameAndType($valueToMatch, $actionType);
192
- // Action is not found (eg. &segment=pageTitle==Větrnásssssss)
 
193
  if (empty($idAction)) {
194
- $idAction = null;
 
 
 
 
195
  }
196
  return $idAction;
197
  }
43
 
44
  $actionIds = self::queryIdsAction($actionsNameAndType);
45
 
46
+ [$queriedIds, $fieldNamesToInsert] = self::processIdsToInsert($actionsNameAndType, $actionIds);
47
 
48
  $insertedIds = self::insertNewIdsAction($actionsNameAndType, $fieldNamesToInsert);
49
  $queriedIds = $queriedIds + $insertedIds;
95
  $inserted = array();
96
 
97
  foreach ($fieldNamesToInsert as $fieldName) {
98
+ [$name, $type, $urlPrefix] = $actionsNameAndType[$fieldName];
99
 
100
  $actionId = self::getModel()->createNewIdAction($name, $type, $urlPrefix);
101
 
116
  {
117
  $toQuery = array();
118
  foreach ($actionsNameAndType as &$actionNameType) {
119
+ [$name, $type, $urlPrefix] = $actionNameType;
120
  $toQuery[] = array('name' => $name, 'type' => $type);
121
  }
122
 
184
  $valueToMatch = preg_replace('@^http[s]?://(www\.)?@i', '', $valueToMatch);
185
  }
186
 
187
+ $unsanitizedValue = $valueToMatch;
188
  $valueToMatch = self::normaliseActionString($actionType, $valueToMatch);
189
  if ($matchType == SegmentExpression::MATCH_EQUAL
190
  || $matchType == SegmentExpression::MATCH_NOT_EQUAL
191
  ) {
192
  $idAction = self::getModel()->getIdActionMatchingNameAndType($valueToMatch, $actionType);
193
+ // If action can't be found normalized try search for it with original value
194
+ // This can eg happen for outlinks that contain a & see https://github.com/matomo-org/matomo/issues/11806
195
  if (empty($idAction)) {
196
+ $idAction = self::getModel()->getIdActionMatchingNameAndType($unsanitizedValue, $actionType);
197
+ // Action is not found (eg. &segment=pageTitle==Větrnásssssss)
198
+ if (empty($idAction)) {
199
+ $idAction = null;
200
+ }
201
  }
202
  return $idAction;
203
  }
app/core/Tracker/VisitExcluded.php CHANGED
@@ -349,12 +349,13 @@ class VisitExcluded
349
  * Returns true if the specified user agent should be excluded for the current site or not.
350
  *
351
  * Visits whose user agent string contains one of the excluded_user_agents strings for the
352
- * site being tracked (or one of the global strings) will be excluded.
 
353
  *
354
  * @internal param string $this ->userAgent The user agent string.
355
  * @return bool
356
  */
357
- protected function isUserAgentExcluded()
358
  {
359
  $excludedAgents = $this->getAttributes('excluded_user_agents', 'global_excluded_user_agents');
360
 
@@ -364,6 +365,10 @@ class VisitExcluded
364
  if (stripos($this->userAgent, $excludedUserAgent) !== false) {
365
  return true;
366
  }
 
 
 
 
367
  }
368
  }
369
 
349
  * Returns true if the specified user agent should be excluded for the current site or not.
350
  *
351
  * Visits whose user agent string contains one of the excluded_user_agents strings for the
352
+ * site being tracked (or one of the global strings) will be excluded. Regular expressions
353
+ * are also supported.
354
  *
355
  * @internal param string $this ->userAgent The user agent string.
356
  * @return bool
357
  */
358
+ protected function isUserAgentExcluded(): bool
359
  {
360
  $excludedAgents = $this->getAttributes('excluded_user_agents', 'global_excluded_user_agents');
361
 
365
  if (stripos($this->userAgent, $excludedUserAgent) !== false) {
366
  return true;
367
  }
368
+ // if the string is a valid regex, and the user agent matches, this visit should be excluded
369
+ if (@preg_match($excludedUserAgent, null) !== false) {
370
+ return preg_match($excludedUserAgent, $this->userAgent) ? true : false;
371
+ }
372
  }
373
  }
374
 
app/core/Tracker/VisitorRecognizer.php CHANGED
@@ -104,7 +104,17 @@ class VisitorRecognizer
104
  $shouldMatchOneFieldOnly = $this->shouldLookupOneVisitorFieldOnly($isVisitorIdToLookup, $request);
105
  list($timeLookBack, $timeLookAhead) = $this->getWindowLookupThisVisit($request);
106
 
 
 
107
  $visitRow = $this->model->findVisitor($idSite, $configId, $idVisitor, $userId, $persistedVisitAttributes, $shouldMatchOneFieldOnly, $isVisitorIdToLookup, $timeLookBack, $timeLookAhead);
 
 
 
 
 
 
 
 
108
  $this->visitRow = $visitRow;
109
 
110
  if ($visitRow
104
  $shouldMatchOneFieldOnly = $this->shouldLookupOneVisitorFieldOnly($isVisitorIdToLookup, $request);
105
  list($timeLookBack, $timeLookAhead) = $this->getWindowLookupThisVisit($request);
106
 
107
+ $maxActions = TrackerConfig::getConfigValue('create_new_visit_after_x_actions');
108
+
109
  $visitRow = $this->model->findVisitor($idSite, $configId, $idVisitor, $userId, $persistedVisitAttributes, $shouldMatchOneFieldOnly, $isVisitorIdToLookup, $timeLookBack, $timeLookAhead);
110
+
111
+ if (!empty($maxActions) && $maxActions > 0
112
+ && !empty($visitRow['visit_total_actions'])
113
+ && $maxActions <= $visitRow['visit_total_actions']) {
114
+ $this->visitRow = false;
115
+ return false;
116
+ }
117
+
118
  $this->visitRow = $visitRow;
119
 
120
  if ($visitRow
app/core/Version.php CHANGED
@@ -20,7 +20,7 @@ final class Version
20
  * The current Matomo version.
21
  * @var string
22
  */
23
- const VERSION = '4.1.0';
24
  const MAJOR_VERSION = 4;
25
 
26
  public function isStableVersion($version)
20
  * The current Matomo version.
21
  * @var string
22
  */
23
+ const VERSION = '4.1.1';
24
  const MAJOR_VERSION = 4;
25
 
26
  public function isStableVersion($version)
app/lang/ar.json CHANGED
@@ -871,7 +871,7 @@
871
  "TV": "تلفاز",
872
  "UserAgent": "وكيل-المستخدم",
873
  "WidgetBrowsers": "متصفحات الزوار",
874
- "WidgetBrowsersDocumentation": "يحوي هذا التقرير معلومات عن ماهية نوع المستعرض الذي استخدمه زوارك. يُذكَر كل إصدار من المستعرض لوحده."
875
  },
876
  "Diagnostics": {
877
  "ConfigFileTitle": "ملف الضبط",
871
  "TV": "تلفاز",
872
  "UserAgent": "وكيل-المستخدم",
873
  "WidgetBrowsers": "متصفحات الزوار",
874
+ "WidgetBrowserVersionsDocumentation": "يحوي هذا التقرير معلومات عن ماهية نوع المستعرض الذي استخدمه زوارك. يُذكَر كل إصدار من المستعرض لوحده."
875
  },
876
  "Diagnostics": {
877
  "ConfigFileTitle": "ملف الضبط",
app/lang/be.json CHANGED
@@ -409,7 +409,7 @@
409
  "dataTableLabelTypes": "Тып",
410
  "OperatingSystems": "Па аперацыйных сістэмах",
411
  "WidgetBrowsers": "Браўзары карыстачоў",
412
- "WidgetBrowsersDocumentation": "Гэтая справаздача змяшчае інфармацыю аб тым, які браўзэр выкарыстоўвалі наведвальнікі. Кожная версія браўзэра пералічана асобна."
413
  },
414
  "Feedback": {
415
  "DoYouHaveBugReportOrFeatureRequest": "Ці ёсць у вас памылка аб якой неабходна певедаміць?",
409
  "dataTableLabelTypes": "Тып",
410
  "OperatingSystems": "Па аперацыйных сістэмах",
411
  "WidgetBrowsers": "Браўзары карыстачоў",
412
+ "WidgetBrowserVersionsDocumentation": "Гэтая справаздача змяшчае інфармацыю аб тым, які браўзэр выкарыстоўвалі наведвальнікі. Кожная версія браўзэра пералічана асобна."
413
  },
414
  "Feedback": {
415
  "DoYouHaveBugReportOrFeatureRequest": "Ці ёсць у вас памылка аб якой неабходна певедаміць?",
app/lang/bg.json CHANGED
@@ -861,7 +861,7 @@
861
  "Tablet": "Таблет",
862
  "TV": "ТВ",
863
  "WidgetBrowsers": "Браузъри на посетителите",
864
- "WidgetBrowsersDocumentation": "Този отчет показва информация, за това какъв браузър са използвали вашите потребители. Всеки браузер е показан поотделно."
865
  },
866
  "Ecommerce": {
867
  "Sales": "Продажби"
861
  "Tablet": "Таблет",
862
  "TV": "ТВ",
863
  "WidgetBrowsers": "Браузъри на посетителите",
864
+ "WidgetBrowserVersionsDocumentation": "Този отчет показва информация, за това какъв браузър са използвали вашите потребители. Всеки браузер е показан поотделно."
865
  },
866
  "Ecommerce": {
867
  "Sales": "Продажби"
app/lang/ca.json CHANGED
@@ -752,7 +752,7 @@
752
  "UserAgent": "Agent d'usuari",
753
  "XVisitsFromDevices": "%1$s de visites provenen de %2$s dispositius",
754
  "WidgetBrowsers": "Navegadors",
755
- "WidgetBrowsersDocumentation": "Aquest informe conté informació sobre quin tipus de navegador està utilitzant els vostres visitants. Cada versió del navegador es llista per separat."
756
  },
757
  "Events": {
758
  "Event": "Esdeveniment",
752
  "UserAgent": "Agent d'usuari",
753
  "XVisitsFromDevices": "%1$s de visites provenen de %2$s dispositius",
754
  "WidgetBrowsers": "Navegadors",
755
+ "WidgetBrowserVersionsDocumentation": "Aquest informe conté informació sobre quin tipus de navegador està utilitzant els vostres visitants. Cada versió del navegador es llista per separat."
756
  },
757
  "Events": {
758
  "Event": "Esdeveniment",
app/lang/cs.json CHANGED
@@ -1313,7 +1313,7 @@
1313
  "MobileApp": "Mobilní aplikace",
1314
  "XVisitsFromDevices": "%1$s návštěv ze zařízení %2$s",
1315
  "WidgetBrowsers": "Web prohlížeče návštěvníků",
1316
- "WidgetBrowsersDocumentation": "Toto hlášení obsahuje informace o tom, jaký druh prohlížeče vaši návštěvníci použili. Každá verze je počítána samostatně."
1317
  },
1318
  "Diagnostics": {
1319
  "ConfigFileTitle": "Konfigurační soubor",
@@ -3328,7 +3328,6 @@
3328
  "KeepURLFragmentsLong": "Zachovat URL fragmenty stránek při sledování",
3329
  "ListOfIpsToBeExcludedOnAllWebsites": "IP adresy uvedené níže budou vynechány ze záznamu pro všechny weby.",
3330
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "URL parametry uvedené níže budou vynechány z URL pro všechny www adresy",
3331
- "ListOfQueryParametersToExclude": "Vložte seznam url parametrů dotazu, každý na samostatném řádku, které mají být vyloučeny z hlášení URL. Regulární výrazy, jako třeba %s, jsou podporovány.",
3332
  "LogAnalytics": "Analitiky protokolu",
3333
  "LogAnalyticsDescription": "Pokud nelze použít javascriptovou sledovací metodu, můžete místo toho použít %1$sanalitiku protokolu%2$s jako alternativní způsob sledování vašich uživatelů.",
3334
  "MainDescription": "Vaše analýzy webu potřebují Web! Přidejte, aktualizujte, nebo vymažte je a zobrazte si JavaScriptový kód pro vložení do vaších stránek.",
1313
  "MobileApp": "Mobilní aplikace",
1314
  "XVisitsFromDevices": "%1$s návštěv ze zařízení %2$s",
1315
  "WidgetBrowsers": "Web prohlížeče návštěvníků",
1316
+ "WidgetBrowserVersionsDocumentation": "Toto hlášení obsahuje informace o tom, jaký druh prohlížeče vaši návštěvníci použili. Každá verze je počítána samostatně."
1317
  },
1318
  "Diagnostics": {
1319
  "ConfigFileTitle": "Konfigurační soubor",
3328
  "KeepURLFragmentsLong": "Zachovat URL fragmenty stránek při sledování",
3329
  "ListOfIpsToBeExcludedOnAllWebsites": "IP adresy uvedené níže budou vynechány ze záznamu pro všechny weby.",
3330
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "URL parametry uvedené níže budou vynechány z URL pro všechny www adresy",
 
3331
  "LogAnalytics": "Analitiky protokolu",
3332
  "LogAnalyticsDescription": "Pokud nelze použít javascriptovou sledovací metodu, můžete místo toho použít %1$sanalitiku protokolu%2$s jako alternativní způsob sledování vašich uživatelů.",
3333
  "MainDescription": "Vaše analýzy webu potřebují Web! Přidejte, aktualizujte, nebo vymažte je a zobrazte si JavaScriptový kód pro vložení do vaších stránek.",
app/lang/da.json CHANGED
@@ -112,6 +112,7 @@
112
  "Continue": "Fortsæt",
113
  "ContinueToPiwik": "Fortsæt til Matomo",
114
  "CurrentlyUsingUnsecureHttp": "Du bruger i øjeblikket Matomo gennem en usikker HTTP forbindelse. Dette gør din Matomo sårbar overfor hackere. Du kan også risikere brud på privatlivslovgivning eftersom nogle funktioner omkring cookies ikke vil fungere. Vi anbefaler at du indstiller Matomo til at benytte SSL (HTTPS) for at forbedre sikkerheden.",
 
115
  "CreatedByUser": "oprettet af %s",
116
  "CurrentMonth": "Denne måned",
117
  "CurrentWeek": "Nuværende uge",
@@ -132,7 +133,10 @@
132
  "DaysHours": "%1$s dage %2$s timer",
133
  "DaysSinceFirstVisit": "Dage siden første besøg",
134
  "DaysSinceLastEcommerceOrder": "Dage siden sidste e-handel ordre",
 
135
  "DaysSinceLastVisit": "Dage siden sidste besøg",
 
 
136
  "Default": "Standard",
137
  "DefaultAppended": "(standard)",
138
  "Delete": "Slet",
@@ -512,7 +516,10 @@
512
  "ClickToRemoveComp": "Klik for at fjerne denne sammenligning.",
513
  "MaximumNumberOfSegmentsComparedIs": "Det maksimale antal segmenter som kan sammenlignes samtidigt er %s.",
514
  "CompareDatesParamMustMatchComparePeriods": "%1$s forespørgselsparameter længde skal matche %2$s forespørgselsparameter længde.",
515
- "MaximumNumberOfPeriodsComparedIs": "Det maksimale antal af perioder som kan sammenlignes samtidigt er %s."
 
 
 
516
  },
517
  "Mobile": {
518
  "AboutPiwikMobile": "Om Matomo Mobil",
@@ -906,6 +913,7 @@
906
  "ShowExportUrl": "Vis eksport URL",
907
  "HideExportUrl": "Skjul eksport URL",
908
  "HomeShortcut": "Hjem",
 
909
  "IncludeRowsWithLowPopulation": "Rækker med lav population er skjult %s Vis alle rækker",
910
  "InjectedHostEmailBody": "Hej, jeg forsøgte at få adgang Matomo i dag og stødte på den ukendte værtsnavn advarsel.",
911
  "InjectedHostEmailSubject": "Matomo blev åbnet fra et ukendt værtsnavn: %s",
@@ -918,6 +926,8 @@
918
  "VisitTypeReturning": "Tilbagevendende",
919
  "VisitTypeReturningCustomer": "Tilbagevendende kunder",
920
  "MainNavigation": "Hovednavigation",
 
 
921
  "Menu": "Menu",
922
  "NoPrivilegesAskPiwikAdmin": "Du er logget på som '%1$s' men det ser ikke ud som du har adgang til Matomo. %2$s Spørg Matomo administratoren (klik for at sende e-mail)%3$s for at give dig 'se' adgang til et websted.",
923
  "OnlyForSuperUserAccess": "Dette modul vises i standarddashboardet kun til brugere med superbrugeradgang.",
@@ -1239,7 +1249,7 @@
1239
  "MobileApp": "Mobilapp",
1240
  "XVisitsFromDevices": "%1$s besøg fra %2$s enheder",
1241
  "WidgetBrowsers": "Besøgendes browser",
1242
- "WidgetBrowsersDocumentation": "Rapporten indeholder oplysninger om hvilken browser de besøgende bruger. Hver version er angivet særskilt."
1243
  },
1244
  "Diagnostics": {
1245
  "ConfigFileTitle": "Konfigurationsfil",
@@ -1319,7 +1329,10 @@
1319
  "ProfessionalServicesOfferIntro": "Hvilke ydelser kan du gøre brug af?",
1320
  "ContactUs": "Kontakt os",
1321
  "VisitTheForums": "Besøg %1$sforummet%2$s og få hjælp fra andre Matomo-brugere",
1322
- "Forums": "Forum"
 
 
 
1323
  },
1324
  "GeoIp2": {
1325
  "AssumingNonApache": "Kan ikke finde apache_get_modules funktion, antager ikke-Apache webserver.",
@@ -2856,6 +2869,7 @@
2856
  "ActionInstall": "Installer",
2857
  "AllowedUploadFormats": "Du kan via denne side overføre en programudvidelse eller tema i .zip-format.",
2858
  "Authors": "Forfattere",
 
2859
  "BackToMarketplace": "Tilbage til markedspladsen",
2860
  "BrowseMarketplace": "Browse Markedsplads",
2861
  "ByXDevelopers": "af %s udviklere",
@@ -2881,6 +2895,7 @@
2881
  "PluginVersionInfo": "%1$s fra %2$s",
2882
  "PluginWebsite": "Programudvidelsens hjemmeside",
2883
  "Screenshots": "Skærmbilleder",
 
2884
  "StepDownloadingPluginFromMarketplace": "Henter programudvidelse fra markedspladsen",
2885
  "StepDownloadingThemeFromMarketplace": "Henter tema fra markedspladsen",
2886
  "StepUnzippingPlugin": "Udpakker programudvidelse",
@@ -2970,13 +2985,25 @@
2970
  "AnonymizeIpInlineHelp": "Anonymiser besøgendes IP-adresser for at efterkomme den lokale lovgivning om privatlivets fred\/retningslinjer.",
2971
  "AnonymizeIpMaskLengtDescription": "Vælg hvor mange bytes af de besøgendes IP-adresser der skal maskeres.",
2972
  "AnonymizeIpMaskLength": "%1$s bytes - f.eks %2$s",
 
2973
  "AskingForConsent": "Samtykkeanmodning",
2974
  "ClickHereSettings": "Klik her for at få adgang til %s indstillinger.",
 
 
 
 
 
 
2975
  "AnonymizeUserId": "Erstat bruger-ID med et pseudonym",
 
 
2976
  "CurrentDBSize": "Nuværende databasestørrelse",
2977
  "DBPurged": "Databasen er opryddet.",
 
2978
  "DeleteDataInterval": "Slet gamle data hver",
2979
  "DeleteOldVisitorLogs": "Slet gamle besøgslogfiler",
 
 
2980
  "DeleteLogDescription2": "Når automatisk log sletning aktiveres, så sørg for, at alle tidligere daglige rapporter er blevet behandlet, således at ingen data går tabt.",
2981
  "DeleteLogsOlderThan": "Slet logfiler ældre end",
2982
  "DeleteMaxRows": "Maksimale antal rækker der slettes på én gang:",
@@ -2989,15 +3016,27 @@
2989
  "DoNotTrack_Enable": "Aktiver spor ikke understøttelse",
2990
  "DoNotTrack_Enabled": "Du respekterer beskyttelse af dine brugeres personlige oplysninger, bravo!",
2991
  "DoNotTrack_EnabledMoreInfo": "Når brugere har indstillet deres browser til “jeg ønsker ikke at blive sporet” (DoNotTrack er aktiveret), vil Matomo ikke spore disse besøg.",
2992
- "DoNotTrack_SupportDNTPreference": "Understøt spor ikke præference",
2993
  "EstimatedDBSizeAfterPurge": "Anslået database størrelse efter oprydning",
2994
  "EstimatedSpaceSaved": "Anslået sparet plads",
2995
  "GeolocationAnonymizeIpNote": "Bemærk: geolokalisering vil have omtrent de samme resultater med 1 byte anonymiseret. Med 2 byte eller mere, vil geolokalisering være unøjagtig.",
2996
  "GDPR": "GDPR",
2997
  "GdprManager": "GDPR-administration",
 
 
2998
  "GdprOverview": "GDPR-overblik",
 
 
2999
  "GdprTools": "GDPR-værktøjer",
3000
  "GetPurgeEstimate": "Overslag på rensning",
 
 
 
 
 
 
 
 
3001
  "KeepBasicMetrics": "Behold grundlæggende målinger (besøg, sidevisninger, afvisningsprocent, mål konverteringer, eHandel konverteringer osv.)",
3002
  "KeepReportSegments": "For beholdte data ovenfor, beholdes desuden segmenterede rapporter",
3003
  "LastDelete": "Sidste sletningen var d.",
@@ -3011,15 +3050,23 @@
3011
  "ReportsDataSavedEstimate": "Database størrelse",
3012
  "SaveSettingsBeforePurge": "Indstillinger for datasletning er ændret. Gem før oprydning.",
3013
  "SeeAlsoOurOfficialGuidePrivacy": "Se også vores officielle vejledning: %1$sWeb Analytics Privacy%2$s",
 
 
3014
  "TeaserHeadline": "Privatlivsindstillinger",
3015
  "UseAnonymizedIpForVisitEnrichment": "Brug også anonymiserede IP-adresser ved berigelse af besøg.",
3016
  "UseAnonymizeIp": "Anonymisere besøgendes IP-adresser",
3017
  "UseAnonymizeTrackingData": "Anonymiser sporingsdata",
3018
  "PseudonymizeUserId": "Erstat bruger-ID med et pseudonym",
 
 
3019
  "UseDeleteReports": "Slet regelmæssigt gamle rapporter fra databasen",
 
3020
  "PrivacyPolicyUrl": "Privatlivspolitik-URL",
3021
  "PrivacyPolicyUrlDescription": "Link til din privatlivspolitik.",
3022
- "PrivacyPolicy": "Privatlivspolitik"
 
 
 
3023
  },
3024
  "Referrers": {
3025
  "AllReferrersReportDocumentation": "Rapporten viser alle henvisninger i én samlet rapport, over alle hjemmesider, Søg i nøgleord og kampagner som bruges af de besøgende til at finde hjemmesiden.",
@@ -3228,7 +3275,6 @@
3228
  "KeepURLFragmentsLong": "Behold URL-fragmenter ved sporing",
3229
  "ListOfIpsToBeExcludedOnAllWebsites": "Indtast IP-adresser, som skal udelukkes fra at blive sporet på alle hjemmesider.",
3230
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "URL-søgeparameterne nedenfor vil blive udelukket fra URL'er på alle hjemmesider.",
3231
- "ListOfQueryParametersToExclude": "Angiv listen af URL-parametre (én pr. linje), der skal ekskluderes fra side-URL-rapporter. Du kan bruge regulære udtryk, såsom %s.",
3232
  "LogAnalytics": "Log-analyser",
3233
  "LogAnalyticsDescription": "Hvis JavaScript tracking metode ikke er mulig, kan du %1$s bruge serverlog analyser %2$s som en alternativ metode til at tracke dine website-brugere.",
3234
  "MainDescription": "Din hjemmesideanalyse kræver hjemmesider! Tilføj, opdater, slet hjemmesider og vis JavaScript-koden, som skal indsættes på dine sider.",
@@ -3544,7 +3590,8 @@
3544
  "SuperUserIntro2": "Brug denne funktion med omtanke.",
3545
  "HasSuperUserAccess": "Har superbrugeradgang",
3546
  "ShowAll": "Vis alle",
3547
- "Username": "Brugernavn"
 
3548
  },
3549
  "VisitFrequency": {
3550
  "ColumnActionsByReturningVisits": "Handlinger af tilbagevendende besøg",
112
  "Continue": "Fortsæt",
113
  "ContinueToPiwik": "Fortsæt til Matomo",
114
  "CurrentlyUsingUnsecureHttp": "Du bruger i øjeblikket Matomo gennem en usikker HTTP forbindelse. Dette gør din Matomo sårbar overfor hackere. Du kan også risikere brud på privatlivslovgivning eftersom nogle funktioner omkring cookies ikke vil fungere. Vi anbefaler at du indstiller Matomo til at benytte SSL (HTTPS) for at forbedre sikkerheden.",
115
+ "CreationDate": "Oprettelsesdato",
116
  "CreatedByUser": "oprettet af %s",
117
  "CurrentMonth": "Denne måned",
118
  "CurrentWeek": "Nuværende uge",
133
  "DaysHours": "%1$s dage %2$s timer",
134
  "DaysSinceFirstVisit": "Dage siden første besøg",
135
  "DaysSinceLastEcommerceOrder": "Dage siden sidste e-handel ordre",
136
+ "SecondsSinceLastEcommerceOrder": "Sekunder siden sidste e-handelsordre",
137
  "DaysSinceLastVisit": "Dage siden sidste besøg",
138
+ "SecondsSinceLastVisit": "Sekunder siden sidste besøg",
139
+ "SecondsSinceFirstVisit": "Sekunder siden første besøg",
140
  "Default": "Standard",
141
  "DefaultAppended": "(standard)",
142
  "Delete": "Slet",
516
  "ClickToRemoveComp": "Klik for at fjerne denne sammenligning.",
517
  "MaximumNumberOfSegmentsComparedIs": "Det maksimale antal segmenter som kan sammenlignes samtidigt er %s.",
518
  "CompareDatesParamMustMatchComparePeriods": "%1$s forespørgselsparameter længde skal matche %2$s forespørgselsparameter længde.",
519
+ "MaximumNumberOfPeriodsComparedIs": "Det maksimale antal af perioder som kan sammenlignes samtidigt er %s.",
520
+ "Custom": "Brugerdefineret",
521
+ "PreviousPeriod": "Forrige periode",
522
+ "PreviousYear": "Forrige år"
523
  },
524
  "Mobile": {
525
  "AboutPiwikMobile": "Om Matomo Mobil",
913
  "ShowExportUrl": "Vis eksport URL",
914
  "HideExportUrl": "Skjul eksport URL",
915
  "HomeShortcut": "Hjem",
916
+ "SupportUsOn": "Støt os på",
917
  "IncludeRowsWithLowPopulation": "Rækker med lav population er skjult %s Vis alle rækker",
918
  "InjectedHostEmailBody": "Hej, jeg forsøgte at få adgang Matomo i dag og stødte på den ukendte værtsnavn advarsel.",
919
  "InjectedHostEmailSubject": "Matomo blev åbnet fra et ukendt værtsnavn: %s",
926
  "VisitTypeReturning": "Tilbagevendende",
927
  "VisitTypeReturningCustomer": "Tilbagevendende kunder",
928
  "MainNavigation": "Hovednavigation",
929
+ "YourDonationWillHelp": "Din støtte går direkte til at finansiere nye funktioner og forbedringer for denne open source-statistsystem. Det betyder, at brugerne altid vil have glæde af et værktøj, der respekterer privatliv og lader dig bevare kontrol over dine data.",
930
+ "ThanksFromAllOfUs": "Tak fra alle os hos Matomo!",
931
  "Menu": "Menu",
932
  "NoPrivilegesAskPiwikAdmin": "Du er logget på som '%1$s' men det ser ikke ud som du har adgang til Matomo. %2$s Spørg Matomo administratoren (klik for at sende e-mail)%3$s for at give dig 'se' adgang til et websted.",
933
  "OnlyForSuperUserAccess": "Dette modul vises i standarddashboardet kun til brugere med superbrugeradgang.",
1249
  "MobileApp": "Mobilapp",
1250
  "XVisitsFromDevices": "%1$s besøg fra %2$s enheder",
1251
  "WidgetBrowsers": "Besøgendes browser",
1252
+ "WidgetBrowserVersionsDocumentation": "Rapporten indeholder oplysninger om hvilken browser de besøgende bruger. Hver version er angivet særskilt."
1253
  },
1254
  "Diagnostics": {
1255
  "ConfigFileTitle": "Konfigurationsfil",
1329
  "ProfessionalServicesOfferIntro": "Hvilke ydelser kan du gøre brug af?",
1330
  "ContactUs": "Kontakt os",
1331
  "VisitTheForums": "Besøg %1$sforummet%2$s og få hjælp fra andre Matomo-brugere",
1332
+ "Forums": "Forum",
1333
+ "HowCanWeHelp": "Hvad kan vi hjælpe med?",
1334
+ "SearchHelpResources": "Søg i hjælpeartikler på matomo.org",
1335
+ "PopularHelpTopics": "Populære hjælpeartikler"
1336
  },
1337
  "GeoIp2": {
1338
  "AssumingNonApache": "Kan ikke finde apache_get_modules funktion, antager ikke-Apache webserver.",
2869
  "ActionInstall": "Installer",
2870
  "AllowedUploadFormats": "Du kan via denne side overføre en programudvidelse eller tema i .zip-format.",
2871
  "Authors": "Forfattere",
2872
+ "Browse": "Gennemse",
2873
  "BackToMarketplace": "Tilbage til markedspladsen",
2874
  "BrowseMarketplace": "Browse Markedsplads",
2875
  "ByXDevelopers": "af %s udviklere",
2895
  "PluginVersionInfo": "%1$s fra %2$s",
2896
  "PluginWebsite": "Programudvidelsens hjemmeside",
2897
  "Screenshots": "Skærmbilleder",
2898
+ "SortByLastUpdated": "Senest opdateret",
2899
  "StepDownloadingPluginFromMarketplace": "Henter programudvidelse fra markedspladsen",
2900
  "StepDownloadingThemeFromMarketplace": "Henter tema fra markedspladsen",
2901
  "StepUnzippingPlugin": "Udpakker programudvidelse",
2985
  "AnonymizeIpInlineHelp": "Anonymiser besøgendes IP-adresser for at efterkomme den lokale lovgivning om privatlivets fred\/retningslinjer.",
2986
  "AnonymizeIpMaskLengtDescription": "Vælg hvor mange bytes af de besøgendes IP-adresser der skal maskeres.",
2987
  "AnonymizeIpMaskLength": "%1$s bytes - f.eks %2$s",
2988
+ "AnonymizeReferrer": "Anonymiser henvisning",
2989
  "AskingForConsent": "Samtykkeanmodning",
2990
  "ClickHereSettings": "Klik her for at få adgang til %s indstillinger.",
2991
+ "WhenDoINeedConsent": "Hvornår skal jeg bede om samtykke?",
2992
+ "HowDoIAskForConsent": "Hvordan beder jeg brugerne om samtykke?",
2993
+ "HowDoIAskForConsentIntroduction": "Læs alt om at %1$sbede om samtykke til cookies og sporing i vores integrationsvejledning%2$s.",
2994
+ "AnonymizeReferrerExcludeNone": "Anonymiser ikke henvisning",
2995
+ "AnonymizeIp": "Anonymiser IP",
2996
+ "AnonymizeLocation": "Anonymiser lokation",
2997
  "AnonymizeUserId": "Erstat bruger-ID med et pseudonym",
2998
+ "AwarenessDocumentation": "Opmærksomhed og dokumentation",
2999
+ "AwarenessDocumentationIntro": "Informer dine brugere klart og tydeligt, og gør dine kolleger bevidst om, hvilken data der indsamles, og hvad den bliver brugt til:",
3000
  "CurrentDBSize": "Nuværende databasestørrelse",
3001
  "DBPurged": "Databasen er opryddet.",
3002
+ "DeleteDataDescription": "Du kan konfigurere Matomo til regelmæssigt at slette gammel rådatat og\/eller aggregerede rapporter for at begrænse størrelsen på din database eller for at overholde privatlivslovgivning såsom GDPR.",
3003
  "DeleteDataInterval": "Slet gamle data hver",
3004
  "DeleteOldVisitorLogs": "Slet gamle besøgslogfiler",
3005
+ "DeleteOldRawData": "Slet regelmæssigt gammelt rådata",
3006
+ "DeleteOldAggregatedReports": "Slet gammelt aggregeret rapportdata",
3007
  "DeleteLogDescription2": "Når automatisk log sletning aktiveres, så sørg for, at alle tidligere daglige rapporter er blevet behandlet, således at ingen data går tabt.",
3008
  "DeleteLogsOlderThan": "Slet logfiler ældre end",
3009
  "DeleteMaxRows": "Maksimale antal rækker der slettes på én gang:",
3016
  "DoNotTrack_Enable": "Aktiver spor ikke understøttelse",
3017
  "DoNotTrack_Enabled": "Du respekterer beskyttelse af dine brugeres personlige oplysninger, bravo!",
3018
  "DoNotTrack_EnabledMoreInfo": "Når brugere har indstillet deres browser til “jeg ønsker ikke at blive sporet” (DoNotTrack er aktiveret), vil Matomo ikke spore disse besøg.",
3019
+ "DoNotTrack_SupportDNTPreference": "Understøt spor ikke-præference",
3020
  "EstimatedDBSizeAfterPurge": "Anslået database størrelse efter oprydning",
3021
  "EstimatedSpaceSaved": "Anslået sparet plads",
3022
  "GeolocationAnonymizeIpNote": "Bemærk: geolokalisering vil have omtrent de samme resultater med 1 byte anonymiseret. Med 2 byte eller mere, vil geolokalisering være unøjagtig.",
3023
  "GDPR": "GDPR",
3024
  "GdprManager": "GDPR-administration",
3025
+ "GdprChecklists": "GDPR-tjeklister",
3026
+ "GdprChecklistDesc1": "Hvis du behandler persondata om EU-borgere via Matomo, selv hvis din virksomhed ligger uden for Europa, skal du leve op til kravene i GDPR, og denne vejledning vil hjælpe dig på vej.",
3027
  "GdprOverview": "GDPR-overblik",
3028
+ "GdprOverviewIntro1": "Databeskyttelsesforordningen (GDPR) er et regelsæt, der styrker og standardiserer databeskyttelsen for personer i EU.",
3029
+ "GdprOverviewIntro2": "Hvis du sikrer, at Matomo ikke registrerer persondata, behøver du ikke bekymre dig om GDPR for Matomo (hvis du ikke registrerer IP-adresser, bruger-id'er, geolokaliseringsdata mv.).",
3030
  "GdprTools": "GDPR-værktøjer",
3031
  "GetPurgeEstimate": "Overslag på rensning",
3032
+ "IndividualsRights": "Registreredes rettigheder",
3033
+ "IndividualsRightsIntro": "Udøv dine brugeres rettigheder med vores GDPR-venlige procedurer:",
3034
+ "IndividualsRightsInform": "Ret til at blive informeret: informer dine brugere med en klar privatlivsbesked.",
3035
+ "IndividualsRightsAccess": "Ret til indsigt: %1$ssøg efter registrerede%2$s og eksporter al deres data.",
3036
+ "IndividualsRightsErasure": "Ret til sletning: %1$ssøg efter registrerede%2$s og slet deres data helt eller delvist.",
3037
+ "IndividualsRightsRectification": "Ret til berigtigelse: du kan %1$ssøge efter registrerede%2$s og slette deres data helt eller delvist.",
3038
+ "IndividualsRightsPortability": "Ret til dataportabilitet: %1$ssøg efter registrerede%2$s og eksporter al deres data.",
3039
+ "IndividualsRightsObject": "Retten til at gøre indsigelse: %1$slad dine brugere at fravælge sporing%2$s under din privatlivspolitik.",
3040
  "KeepBasicMetrics": "Behold grundlæggende målinger (besøg, sidevisninger, afvisningsprocent, mål konverteringer, eHandel konverteringer osv.)",
3041
  "KeepReportSegments": "For beholdte data ovenfor, beholdes desuden segmenterede rapporter",
3042
  "LastDelete": "Sidste sletningen var d.",
3050
  "ReportsDataSavedEstimate": "Database størrelse",
3051
  "SaveSettingsBeforePurge": "Indstillinger for datasletning er ændret. Gem før oprydning.",
3052
  "SeeAlsoOurOfficialGuidePrivacy": "Se også vores officielle vejledning: %1$sWeb Analytics Privacy%2$s",
3053
+ "SecurityProcedures": "Sikkerhedsprocedurer",
3054
+ "SecurityProceduresIntro": "Informer dine brugere klart og tydeligt, og gør dine kolleger bevidst om, hvilken data der indsamles, og hvad den bliver brugt til:",
3055
  "TeaserHeadline": "Privatlivsindstillinger",
3056
  "UseAnonymizedIpForVisitEnrichment": "Brug også anonymiserede IP-adresser ved berigelse af besøg.",
3057
  "UseAnonymizeIp": "Anonymisere besøgendes IP-adresser",
3058
  "UseAnonymizeTrackingData": "Anonymiser sporingsdata",
3059
  "PseudonymizeUserId": "Erstat bruger-ID med et pseudonym",
3060
+ "TrackingOptOut": "Lad brugere fravælge sporing",
3061
+ "UseDeleteLog": "Sletter regelmæssigt gammelt rådata fra databasen",
3062
  "UseDeleteReports": "Slet regelmæssigt gamle rapporter fra databasen",
3063
+ "UsersOptOut": "Brugerfravalg",
3064
  "PrivacyPolicyUrl": "Privatlivspolitik-URL",
3065
  "PrivacyPolicyUrlDescription": "Link til din privatlivspolitik.",
3066
+ "TermsAndConditionUrl": "Vilkår og betingelser-URL",
3067
+ "TermsAndConditionUrlDescription": "Link til dine vilkår og betingelser.",
3068
+ "PrivacyPolicy": "Privatlivspolitik",
3069
+ "TermsAndConditions": "Vilkår og betingelser"
3070
  },
3071
  "Referrers": {
3072
  "AllReferrersReportDocumentation": "Rapporten viser alle henvisninger i én samlet rapport, over alle hjemmesider, Søg i nøgleord og kampagner som bruges af de besøgende til at finde hjemmesiden.",
3275
  "KeepURLFragmentsLong": "Behold URL-fragmenter ved sporing",
3276
  "ListOfIpsToBeExcludedOnAllWebsites": "Indtast IP-adresser, som skal udelukkes fra at blive sporet på alle hjemmesider.",
3277
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "URL-søgeparameterne nedenfor vil blive udelukket fra URL'er på alle hjemmesider.",
 
3278
  "LogAnalytics": "Log-analyser",
3279
  "LogAnalyticsDescription": "Hvis JavaScript tracking metode ikke er mulig, kan du %1$s bruge serverlog analyser %2$s som en alternativ metode til at tracke dine website-brugere.",
3280
  "MainDescription": "Din hjemmesideanalyse kræver hjemmesider! Tilføj, opdater, slet hjemmesider og vis JavaScript-koden, som skal indsættes på dine sider.",
3590
  "SuperUserIntro2": "Brug denne funktion med omtanke.",
3591
  "HasSuperUserAccess": "Har superbrugeradgang",
3592
  "ShowAll": "Vis alle",
3593
+ "Username": "Brugernavn",
3594
+ "NewsletterSignupTitle": "Tilmelding til nyhedsbrev"
3595
  },
3596
  "VisitFrequency": {
3597
  "ColumnActionsByReturningVisits": "Handlinger af tilbagevendende besøg",
app/lang/de.json CHANGED
@@ -1359,7 +1359,7 @@
1359
  "XVisitsFromDevices": "%1$s Besuche von %2$s Geräten",
1360
  "Wearable": "Tragbare Geräte",
1361
  "WidgetBrowsers": "Besucher-Browser",
1362
- "WidgetBrowsersDocumentation": "Dieser Bericht enthält Informationen über die Browser Ihrer Besucher. Jede Version eines Browsers wird separat aufgelistet."
1363
  },
1364
  "Diagnostics": {
1365
  "ConfigFileTitle": "Konfigurationsdatei",
@@ -3732,7 +3732,6 @@
3732
  "KeepURLFragmentsLong": "URL Fragmente beim Tracking behalten",
3733
  "ListOfIpsToBeExcludedOnAllWebsites": "Die untenstehenden IPs werden auf allen Websites ignoriert.",
3734
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Die untenstehenden GET-Parameter werden von allen URLs aller Websites ignoriert.",
3735
- "ListOfQueryParametersToExclude": "Geben Sie die Liste der URL Query Parameter an, einen pro Zeile, um sie von der URL Berichtsseite auszuschließen. Reguläre Ausdrücke so wie %s werden unterstützt.",
3736
  "LogAnalytics": "Log-Analyse",
3737
  "LogAnalyticsDescription": "Wenn das Tracking per Javascript nicht möglich ist, können Sie %1$sServer Log Analytics %2$s als alternative Methode einsetzen, um die Besucher Ihrer Webseite zu analysieren.",
3738
  "MainDescription": "Ihre Webanalyse benötigt Websites! Websites können hinzugefügt, aktualisiert und gelöscht werden. Hier wird auch der JavaScript-Code gezeigt, der in Ihre Websites eingefügt werden muss.",
1359
  "XVisitsFromDevices": "%1$s Besuche von %2$s Geräten",
1360
  "Wearable": "Tragbare Geräte",
1361
  "WidgetBrowsers": "Besucher-Browser",
1362
+ "WidgetBrowserVersionsDocumentation": "Dieser Bericht enthält Informationen über die Browser Ihrer Besucher. Jede Version eines Browsers wird separat aufgelistet."
1363
  },
1364
  "Diagnostics": {
1365
  "ConfigFileTitle": "Konfigurationsdatei",
3732
  "KeepURLFragmentsLong": "URL Fragmente beim Tracking behalten",
3733
  "ListOfIpsToBeExcludedOnAllWebsites": "Die untenstehenden IPs werden auf allen Websites ignoriert.",
3734
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Die untenstehenden GET-Parameter werden von allen URLs aller Websites ignoriert.",
 
3735
  "LogAnalytics": "Log-Analyse",
3736
  "LogAnalyticsDescription": "Wenn das Tracking per Javascript nicht möglich ist, können Sie %1$sServer Log Analytics %2$s als alternative Methode einsetzen, um die Besucher Ihrer Webseite zu analysieren.",
3737
  "MainDescription": "Ihre Webanalyse benötigt Websites! Websites können hinzugefügt, aktualisiert und gelöscht werden. Hier wird auch der JavaScript-Code gezeigt, der in Ihre Websites eingefügt werden muss.",
app/lang/el.json CHANGED
@@ -32,6 +32,7 @@
32
  "ChooseLanguage": "Επιλογή γλώσσας",
33
  "ChoosePeriod": "Επιλογή περιόδου",
34
  "ClickHere": "Πατήστε εδώ για περισσότερες πληροφορίες.",
 
35
  "DoubleClickToChangePeriod": "Κάντε διπλό κλικ για εφαρμογή της περιόδου.",
36
  "Close": "Κλείσιμο",
37
  "ClickToSearch": "Κάντε κλικ για αναζήτηση",
@@ -627,6 +628,7 @@
627
  "UserAuthentication": "Πιστοποίηση χρήστη",
628
  "UsingTokenAuth": "Αν θέλετε να %1$s ζητήσετε δεδομένα από ένα σενάριο, μια εργασία crontab, κτλ. %2$s χρειάζεται να προσθέσετε την παράμετρο %3$s στα URLs των κλήσεων API που απαιτούν αυθεντικοποίηση.",
629
  "Glossary": "Γλωσσάρι",
 
630
  "LearnAboutCommonlyUsedTerms2": "Μάθετε σχετικά με τους συχνότερα χρησιμοποιούμενους όρους για να εκμεταλλευτείτε στο έπακρον το Matomo Analytics.",
631
  "EvolutionMetricName": "%s Πρόοδος"
632
  },
@@ -672,6 +674,7 @@
672
  "ExitPagesReportDocumentation": "Η αναφορά περιέχει πληροφορίες για τις σελίδες εξόδου σε συγκεκριμένη χρονική περίοδο. Μια σελίδα εξόδου είναι η τελευταία σελίδα που βλέπει ένας χρήστης κατά την επίσκεψή του. %s Παρακάτω εμφανίζονται με δομή φακέλων οι διευθύνσεις URL εξόδου.",
673
  "ExitPageTitles": "Τίτλοι σελίδας εξόδου",
674
  "ExitPageTitlesReportDocumentation": "Αυτή η αναφορά περιέχει πληφορορίες για τους τίτλους των σελίδων εξόδου που συνέβησαν κατά την ορισμένη περίοδο.",
 
675
  "OneSearch": "1 αναζήτηση",
676
  "OutlinkDocumentation": "Ένας εξωτερικός σύνδεσμος είναι ένας σύνδεσμος που οδηγεί τον επισκέπτη εκτός της ιστοσελίδας (σε άλλη).",
677
  "OutlinksReportDocumentation": "Αυτή η αναφορά δείχνει μια ιεραρχημένη λίστα με εξωτερικούς συνδέσμους διευθύνσεων ιστοσελίδων που πατήθηκαν από τους επισκέπτες σας.",
@@ -740,8 +743,10 @@
740
  "ContentInteractions": "Αλληλεπιδράσεις σε Περιεχόμενο",
741
  "InteractionRate": "Ρυθμός αλληλεπίδρασης",
742
  "ContentName": "Όνομα Περιεχομένου",
 
743
  "ContentNames": "Ονόματα περιεχομένου",
744
  "ContentPiece": "Κομμάτι Περιεχομένου",
 
745
  "ContentPieces": "Τεμάχια περιεχομένου",
746
  "ContentTarget": "Στόχος Περιεχομένου",
747
  "ContentTargets": "Στόχοι περιεχομένου",
@@ -1042,6 +1047,7 @@
1042
  "MissingRequirementsNotice": "Παρακαλούμε αναβαθμίστε το %1$s %2$s σε νεότερη έκδοση, απαιτείται το %1$s %3$s.",
1043
  "MissingRequirementsPleaseInstallNotice": "Παρακαλούμε εγκαταστήστε τα %1$s %2$s καθώς απαιτούνται από το %3$s.",
1044
  "NoZipFileSelected": "Επιλέξτε ένα αρχείο ZIP.",
 
1045
  "NumUpdatesAvailable": "%s διαθέσιμες ενημερώσεις",
1046
  "NoPluginSettings": "Δεν υπάρχουν ρυθμίσεις που μπορούν να παραμετροποιηθούν",
1047
  "Origin": "Προέλευση",
@@ -1329,18 +1335,23 @@
1329
  "Device": "Συσκευή",
1330
  "DeviceBrand": "Μάρκα συσκευής",
1331
  "DeviceBrands": "Μάρκες συσκευής",
 
1332
  "DeviceDetection": "Εντοπισμός συσκευής",
1333
  "DeviceModel": "Μοντέλο συσκευής",
1334
  "DeviceModels": "Μοντέλα συσκευής",
 
1335
  "DevicesDetection": "Συσκευές επισκεπτών",
1336
  "DeviceType": "Τύπος συσκευής",
1337
  "DeviceTypes": "Τύποι συσκευής",
 
1338
  "FeaturePhone": "Τηλέφωνο",
1339
  "OperatingSystemFamilies": "Οικογένειες Λειτουργικών Συστημάτων",
1340
  "OperatingSystemFamily": "Οικογένεια Λειτουργικού Συστήματος",
 
1341
  "OperatingSystemCode": "Κωδικός λειτουργικού συστήματος",
1342
  "OperatingSystems": "Λειτουργικά συστήματα",
1343
  "OperatingSystemVersions": "Εκδόσεις Λειτουργικών Συστημάτων",
 
1344
  "PluginDescription": "Παρέχει εκτεταμένες πληροφορίες σχετικά με τις συσκευές χρήστη, όπως Μάρκα (κατασκευαστής), Μοντέλο (έκδοση συσκευής), τύπος συσκευής (τηλεόραση, κονσόλες, έξυπνα τηλέφωνα, υπολογιστές, κτλ.) και περισσότερα.",
1345
  "SmartDisplay": "Έξυπνη οθόνη",
1346
  "Smartphone": "Έξυπνο κινητό",
@@ -1362,7 +1373,8 @@
1362
  "XVisitsFromDevices": "%1$s επισκέψεις από %2$s συσκευές",
1363
  "Wearable": "Φορέσιμος",
1364
  "WidgetBrowsers": "Φυλλομετρητές επισκεπτών",
1365
- "WidgetBrowsersDocumentation": "Αυτή η αναφορά περιέχει πληροφορίες για το φυλλομετρητή που χρησιμοποιούσαν οι επισκέπτες. Κάθε έκδοση φυλλομετρητή κατατάσσεται διαφορετικά."
 
1366
  },
1367
  "Diagnostics": {
1368
  "ConfigFileTitle": "Αρχείο ρυθμίσεων",
@@ -1416,10 +1428,13 @@
1416
  "Event": "Γεγονός",
1417
  "EventAction": "Ενέργεια Συμβάντος",
1418
  "EventActions": "Ενέργειες Συμβάντος",
 
1419
  "EventCategories": "Κατηγορίες Συμβάντος",
 
1420
  "EventCategory": "Κατηγορία Συμβάντος",
1421
  "EventName": "Όνομα Συμβάντος",
1422
  "EventNames": "Ονόματα Συμβάντος",
 
1423
  "EventUrl": "URL συμβάντος",
1424
  "EventUrls": "URL συμβάντων",
1425
  "Events": "Συμβάντα",
@@ -1584,6 +1599,7 @@
1584
  "ConversionsOverview": "Επισκόπηση μετατροπών",
1585
  "ConversionsOverviewBy": "Επισκόπηση μετατροπών ανά τμήμα",
1586
  "DaysToConv": "Ημέρες για Μετατροπή",
 
1587
  "Details": "Λεπτομέρειες στόχου",
1588
  "DefaultGoalConvertedOncePerVisit": "(προεπιλογή) Ο Στόχος μετατρέπεται μόνο μια φορά την ημέρα",
1589
  "DefaultRevenueLabel": "Προεπιλεγμένο κέρδος στόχου",
@@ -1651,6 +1667,7 @@
1651
  "GoalsAdjective": "Στόχοι %s",
1652
  "VisitPageTitle": "Επίσκεψη σε έναν Δοθέν Τίτλο Σελίδας",
1653
  "VisitsUntilConv": "Επισκέψεις για Μετατροπή",
 
1654
  "VisitUrl": "Επίσκεψη σε μια δοθείσα διεύθυνση URL (σελίδα ή ομάδα σελίδων)",
1655
  "VisitDurationMatchAttr": "Παραμονή για ένα δεδομένο χρονικό διάστημα",
1656
  "VisitDuration": "η διάρκεια παραμονής είναι",
@@ -1664,7 +1681,8 @@
1664
  "EventValueAsRevenueHelp2": "Σημείωση: Αν ορίζονται και το προκαθορισμένο κέρδος στόχου και η τιμή συμβάντος, θα χρησιμοποιηθεί η τιμή συμβάντος. Αν η επιλογή είναι ενεργή και δεν αποστέλλεται τιμή συμβάντος σε μια αίτηση, θα χρησιμοποιηθεί το προκαθορισμένο κέρδος (αν έχει οριστεί).",
1665
  "AtLeastMinutes": "τουλάχιστον %1$s λεπτά. Χρησιμοποιήστε δεκαδικά για δευτερόλεπτα, για παράδειγμα, %2$s για 30 δευτερόλεπτα.",
1666
  "TimeInMinutes": "Χρόνος σε Λεπτά",
1667
- "ClickToViewThisGoal": "Πατήστε για να δείτε τον στόχο."
 
1668
  },
1669
  "ImageGraph": {
1670
  "ColumnOrdinateMissing": "Η στήλη '%1$s' δεν βρέθηκε στην αναφορά. Δοκιμάστε οποιαδήποτε από τις %2$s",
@@ -3266,7 +3284,9 @@
3266
  "Evolution": "Πρόοδος",
3267
  "LoadingWebsites": "Γίνεται φόρτωση των ιστοτόπων",
3268
  "PluginDescription": "Δείτε και συγκρίνετε όλους τους ιστοτόπους σας και τις εφαρμογές σας σε αυτό τον χρήσιμο πίνακα 'Όλοι οι Ιστοτόποι'.",
3269
- "TopLinkTooltip": "Σύγκριση στατιστικών Ιστού για όλες τις ιστοσελίδες σας."
 
 
3270
  },
3271
  "Overlay": {
3272
  "Clicks": "%s πατήματα",
@@ -3461,6 +3481,8 @@
3461
  "UseDeleteLog": "Τακτική διαγραφή παλιών ανεπεξέργαστων δεδομένων από τη βάση δεδομένων",
3462
  "UseDeleteReports": "Τακτική διαγραφή παλαιών αναφορών από τη βάση δεδομένων",
3463
  "UsersOptOut": "Opt-out χρηστών",
 
 
3464
  "PrivacyPolicyUrl": "Διεύθυνση URL Πολιτικής Ιδιωτικότητας",
3465
  "PrivacyPolicyUrlDescription": "Ένας σύνδεσμος για την σελίδα Πολιτικής Ιδιωτικότητας.",
3466
  "TermsAndConditionUrl": "Διεύθυνση URL Όρων Χρήσης",
@@ -3468,6 +3490,7 @@
3468
  "PrivacyPolicyUrlDescriptionSuffix": "Αν το ορίσετε, θα εμφανίζεται στο κάτω μέρος της σελίδας εισόδου χρήστη και στις σελίδες που ο χρήστης '%1$s' έχει πρόσβαση.",
3469
  "ShowInEmbeddedWidgets": "Εμφάνιση στα ενσωματωμένα γραφικά συστατικά",
3470
  "ShowInEmbeddedWidgetsDescription": "Αν είναι τσεκαρισμένο, θα εμφανίζεται ένας σύνδεσμος για την Πολιτική Ιδιωτικότητας και Όρων Χρήσης στο κάτω μέρος των ενσωματωμένων γραφικών συστατικών.",
 
3471
  "PrivacyPolicy": "Πολιτική Ιδιωτικότητας",
3472
  "TermsAndConditions": "Όροι Χρήσης"
3473
  },
@@ -3516,6 +3539,7 @@
3516
  "ReferrerNames": "Ονόματα αναφορών",
3517
  "Referrers": "Παραπομπείς",
3518
  "ReferrersOverview": "Επισκόπηση Παραπομπών",
 
3519
  "ReferrerTypes": "Τύποι Καναλιών",
3520
  "ReferrerURLs": "URL παραπομπών",
3521
  "SearchEngines": "Μηχανές αναζήτησης",
@@ -3563,7 +3587,8 @@
3563
  "Resolutions": "Αναλύσεις οθόνης",
3564
  "WidgetGlobalVisitors": "Γενικές ρυθμίσεις χρηστών",
3565
  "WidgetGlobalVisitorsDocumentation": "Αυτή η αναφορά δείχνει τις πιο συχνές καθολικές ρυθμίσεις που έχουν οι επισκέπτες σας. Μια ρύθμιση είναι ο συνδυασμός του λειτουργικού συστήματος, του τύπου φυλλομετρητή και της ανάλυσης οθόνης.",
3566
- "WidgetResolutions": "Αναλύσεις οθόνης"
 
3567
  },
3568
  "SEO": {
3569
  "PluginDescription": "Το πρόσθετο εξάγει και εμφανίζει μετρικές SEO: ταξινόμηση ιστού από το Alexa, Google Pagerank, αριθμός σελίδων στο ευρετήριο και σύνδεσμοι του επιλεγμένου ιστοτόπου.",
@@ -3725,6 +3750,7 @@
3725
  "Format_Utc": "UTC%s",
3726
  "GlobalExcludedUserAgentHelp1": "Εισάγετε τον κατάλογο των user agents που δεν θα παρακολουθούνται από το Matomo.",
3727
  "GlobalExcludedUserAgentHelp2": "Μπορείτε να το χρησιμοποιήσετε για να αποκλείσετε κάποια bots από την παρακολούθηση.",
 
3728
  "GlobalListExcludedIps": "Γενικός κατάλογος Αποκλεισμένων Διευθύνσεων IP",
3729
  "GlobalListExcludedQueryParameters": "Καθολικός κατάλογος από παραμέτρους Ερωτήματος URL για αποκλεισμό",
3730
  "GlobalListExcludedUserAgents": "Καθολική λίστα πελατών χρήστη για αποκλεισμό",
@@ -3743,7 +3769,7 @@
3743
  "KeepURLFragmentsLong": "Κρατήστε Τμήματα του URL της σελίδας κατά την παρακολούθηση διευθύνσεων URL Σελίδων",
3744
  "ListOfIpsToBeExcludedOnAllWebsites": "Οι παρακάτω διευθύνσεις IP θα αποκλειστούν από την ανίχνευση σε όλες τις ιστοσελίδες.",
3745
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Οι παράμετροι Ερωτήματος URLs παρακάτω θα αποκλειστούν από URLs σε όλες τις ιστοσελίδες.",
3746
- "ListOfQueryParametersToExclude": "Εισάγετε τη λίστα των παραμέτρων ερωτήματος στη διεύθυνση URL, μία ανά γραμμή, για να μη συμπεριληφθούν στις Αναφορές Σελίδων Διευθύνσεων URL. Κανονικές εκφράσεις όπως %s υποστηρίζονται.",
3747
  "LogAnalytics": "Ημερολόγιο Αναλυτικών",
3748
  "LogAnalyticsDescription": "Αν η μέθοδος με Javascript δεν είναι δυνατή, μπορείτε να %1$sχρησιμοποιήσετε το ημερολόγιο αναλυτικών του διακομιστή%2$s ως εναλλακτική μέθοδο για την παρακολούθηση των χρηστών του ιστοτόπου σας.",
3749
  "MainDescription": "Το σύστημα αναλυτικών αναφορών χρειάζεται ιστοσελίδες! Προσθέστε, ενημερώστε, διαγράψτε ιστοσελίδες και εμφανίστε τον κώδικα Javascript που θα εισαχθεί στις ιστοσελίδες σας.",
@@ -4559,6 +4585,7 @@
4559
  "UserId": {
4560
  "UserId": "Αναγνωριστικό χρήστη",
4561
  "UserReportTitle": "Αναγνωριστικά χρηστών",
 
4562
  "PluginDescription": "Εμφανίζει τις αναφορές χρηστών"
4563
  },
4564
  "UserLanguage": {
@@ -4788,7 +4815,8 @@
4788
  "ReturnVisits": "επιστρεφόμενες επισκέψεις",
4789
  "SubmenuFrequency": "Συχνότητα",
4790
  "WidgetGraphReturning": "Γράφημα επιστρεφόμενων επισκέψεων",
4791
- "WidgetOverview": "Επισκόπηση συχνότητας"
 
4792
  },
4793
  "VisitTime": {
4794
  "ColumnLocalTime": "Τοπική ώρα",
@@ -4868,6 +4896,7 @@
4868
  "PluginDescription": "Αναφέρει γενικές μετρικές αναλυτικών: επισκέψεις, μοναδικοί επισκέπτες, αριθμός ενεργειών, ρυθμός αναπήδησης, κτλ.",
4869
  "VisitsSummary": "Περίληψη επισκέψεων",
4870
  "VisitsSummaryDocumentation": "Αυτή είναι μια επισκόπηση της εξέλιξης των επισκέψεων.",
 
4871
  "WidgetLastVisits": "Διάγραμμα τελευταίων επισκέψεων",
4872
  "WidgetOverviewGraph": "Επισκόπηση με διάγραμμα",
4873
  "WidgetVisits": "Επισκόπηση επισκέψεων"
32
  "ChooseLanguage": "Επιλογή γλώσσας",
33
  "ChoosePeriod": "Επιλογή περιόδου",
34
  "ClickHere": "Πατήστε εδώ για περισσότερες πληροφορίες.",
35
+ "CompareTo": "Σύγκριση με:",
36
  "DoubleClickToChangePeriod": "Κάντε διπλό κλικ για εφαρμογή της περιόδου.",
37
  "Close": "Κλείσιμο",
38
  "ClickToSearch": "Κάντε κλικ για αναζήτηση",
628
  "UserAuthentication": "Πιστοποίηση χρήστη",
629
  "UsingTokenAuth": "Αν θέλετε να %1$s ζητήσετε δεδομένα από ένα σενάριο, μια εργασία crontab, κτλ. %2$s χρειάζεται να προσθέσετε την παράμετρο %3$s στα URLs των κλήσεων API που απαιτούν αυθεντικοποίηση.",
630
  "Glossary": "Γλωσσάρι",
631
+ "MainMetricsReportDocumentation": "Αυτή η αναφορά δείχνει μια σύνοψη γύρω από τις σημαντικότερες μετρικές σε όλες τις κατηγορίες και πρόσθετα.",
632
  "LearnAboutCommonlyUsedTerms2": "Μάθετε σχετικά με τους συχνότερα χρησιμοποιούμενους όρους για να εκμεταλλευτείτε στο έπακρον το Matomo Analytics.",
633
  "EvolutionMetricName": "%s Πρόοδος"
634
  },
674
  "ExitPagesReportDocumentation": "Η αναφορά περιέχει πληροφορίες για τις σελίδες εξόδου σε συγκεκριμένη χρονική περίοδο. Μια σελίδα εξόδου είναι η τελευταία σελίδα που βλέπει ένας χρήστης κατά την επίσκεψή του. %s Παρακάτω εμφανίζονται με δομή φακέλων οι διευθύνσεις URL εξόδου.",
675
  "ExitPageTitles": "Τίτλοι σελίδας εξόδου",
676
  "ExitPageTitlesReportDocumentation": "Αυτή η αναφορά περιέχει πληφορορίες για τους τίτλους των σελίδων εξόδου που συνέβησαν κατά την ορισμένη περίοδο.",
677
+ "MainMetricsReportDocumentation": "Αυτή η αναφορά δείχνει μια βασική σύνοψη των ενεργειών που οι επισκέπτες σας προέβησαν στον ιστοτόπο σας.",
678
  "OneSearch": "1 αναζήτηση",
679
  "OutlinkDocumentation": "Ένας εξωτερικός σύνδεσμος είναι ένας σύνδεσμος που οδηγεί τον επισκέπτη εκτός της ιστοσελίδας (σε άλλη).",
680
  "OutlinksReportDocumentation": "Αυτή η αναφορά δείχνει μια ιεραρχημένη λίστα με εξωτερικούς συνδέσμους διευθύνσεων ιστοσελίδων που πατήθηκαν από τους επισκέπτες σας.",
743
  "ContentInteractions": "Αλληλεπιδράσεις σε Περιεχόμενο",
744
  "InteractionRate": "Ρυθμός αλληλεπίδρασης",
745
  "ContentName": "Όνομα Περιεχομένου",
746
+ "ContentNameReportDocumentation": "Αυτή η αναφορά δείχνει τα ονόματα του περιεχομένου που είδαν οι επισκέπτες σας και αλληλεπίδρασαν με αυτά.",
747
  "ContentNames": "Ονόματα περιεχομένου",
748
  "ContentPiece": "Κομμάτι Περιεχομένου",
749
+ "ContentPieceReportDocumentation": "Αυτή η αναφορά δείχνει τα τμήματα του περιεχομένου που είδαν οι επισκέπτες σας και αλληλεπίδρασαν με αυτά.",
750
  "ContentPieces": "Τεμάχια περιεχομένου",
751
  "ContentTarget": "Στόχος Περιεχομένου",
752
  "ContentTargets": "Στόχοι περιεχομένου",
1047
  "MissingRequirementsNotice": "Παρακαλούμε αναβαθμίστε το %1$s %2$s σε νεότερη έκδοση, απαιτείται το %1$s %3$s.",
1048
  "MissingRequirementsPleaseInstallNotice": "Παρακαλούμε εγκαταστήστε τα %1$s %2$s καθώς απαιτούνται από το %3$s.",
1049
  "NoZipFileSelected": "Επιλέξτε ένα αρχείο ZIP.",
1050
+ "FileExceedsUploadLimit": "Το επιλεγμένο αρχείο υπερβαίνει το όριο του διακομιστή σας.",
1051
  "NumUpdatesAvailable": "%s διαθέσιμες ενημερώσεις",
1052
  "NoPluginSettings": "Δεν υπάρχουν ρυθμίσεις που μπορούν να παραμετροποιηθούν",
1053
  "Origin": "Προέλευση",
1335
  "Device": "Συσκευή",
1336
  "DeviceBrand": "Μάρκα συσκευής",
1337
  "DeviceBrands": "Μάρκες συσκευής",
1338
+ "DeviceBrandReportDocumentation": "Αυτή η αναφορά δείχνει τις μάρκες \/ κατασκευαστές των συσκευών που οι επισκέπτες σας χρησιμοποιούν. Στις περισσότερες περιπτώσεις, η πληροφορία είναι διαθέσιμη μόνο για μη επιτραπέζιες συσκευές.",
1339
  "DeviceDetection": "Εντοπισμός συσκευής",
1340
  "DeviceModel": "Μοντέλο συσκευής",
1341
  "DeviceModels": "Μοντέλα συσκευής",
1342
+ "DeviceModelReportDocumentation": "Αυτή η αναφορά δείχνει τις συσκευές που χρησιμοποιούν οι επισκέπτες σας. Κάθε μοντέλο συνδυάζεται με την μάρκα της συσκευής, καθώς ορισμένα ονόματα μοντέλων χρησιμοποιούνται από διαφορετικές μάρκες.",
1343
  "DevicesDetection": "Συσκευές επισκεπτών",
1344
  "DeviceType": "Τύπος συσκευής",
1345
  "DeviceTypes": "Τύποι συσκευής",
1346
+ "DeviceTypeReportDocumentation": "Αυτή η αναφορά δείχνει τους τύπους συσκευών που χρησιμοποιούν οι επισκέπτες σας. Η αναφορά θα δείχνει όλους τους τύπους συσκευών που μπορεί το Matomo να εντοπίζει, ακόμη και αν δεν υπήρχαν επισκέψεις για ένα συγκεκριμένο τύπο.",
1347
  "FeaturePhone": "Τηλέφωνο",
1348
  "OperatingSystemFamilies": "Οικογένειες Λειτουργικών Συστημάτων",
1349
  "OperatingSystemFamily": "Οικογένεια Λειτουργικού Συστήματος",
1350
+ "OperatingSystemFamiliesReportDocumentation": "Αυτή η αναφορά δείχνει τα λειτουργικά συστήματα που χρησιμοποιούν οι επισκέπτες σας, ομαδοποιημένα ανά οικογένεια λειτουργικών συστημάτων. Μια οικογένεια λειτουργικού συστήματος αποτελείται από διαφορετικές εκδόσεις ή διανομές.",
1351
  "OperatingSystemCode": "Κωδικός λειτουργικού συστήματος",
1352
  "OperatingSystems": "Λειτουργικά συστήματα",
1353
  "OperatingSystemVersions": "Εκδόσεις Λειτουργικών Συστημάτων",
1354
+ "OperatingSystemVersionsReportDocumentation": "Αυτή η αναφορά δείχνει τα λειτουργικά συστήματα που χρησιμοποιούν οι επισκέπτες σας. Κάθε έκδοση και κατανομή εμφανίζεται ξεχωριστά.",
1355
  "PluginDescription": "Παρέχει εκτεταμένες πληροφορίες σχετικά με τις συσκευές χρήστη, όπως Μάρκα (κατασκευαστής), Μοντέλο (έκδοση συσκευής), τύπος συσκευής (τηλεόραση, κονσόλες, έξυπνα τηλέφωνα, υπολογιστές, κτλ.) και περισσότερα.",
1356
  "SmartDisplay": "Έξυπνη οθόνη",
1357
  "Smartphone": "Έξυπνο κινητό",
1373
  "XVisitsFromDevices": "%1$s επισκέψεις από %2$s συσκευές",
1374
  "Wearable": "Φορέσιμος",
1375
  "WidgetBrowsers": "Φυλλομετρητές επισκεπτών",
1376
+ "WidgetBrowsersDocumentation": "Αυτή η αναφορά περιέχει πληροφορίες για το είδος του φυλλομετρητή που χρησιμοποιούσαν οι επισκέπτες.",
1377
+ "WidgetBrowserVersionsDocumentation": "Αυτή η αναφορά περιέχει πληροφορίες για το φυλλομετρητή που χρησιμοποιούσαν οι επισκέπτες. Κάθε έκδοση φυλλομετρητή κατατάσσεται ξεχωριστά."
1378
  },
1379
  "Diagnostics": {
1380
  "ConfigFileTitle": "Αρχείο ρυθμίσεων",
1428
  "Event": "Γεγονός",
1429
  "EventAction": "Ενέργεια Συμβάντος",
1430
  "EventActions": "Ενέργειες Συμβάντος",
1431
+ "EventActionsReportDocumentation": "Αυτή η αναφορά δείχνει τον αριθμό των φορών που συνέβη κάθε ενέργεια συμβάντος. Μπορείτε να δείτε τις ενέργειες και ονόματα συμβάντων που ιχνηλατήθηκαν μαζί με κάθε ενέργεια συμβάντος σε κάθε υποπίνακα του πίνακα. Μπορείτε να αλλάξετε το τι εμφανίζεται αλλάζοντας την δευτερεύουσα διάσταση με τον σύνδεσμο στο κάτω μέρος της αναφοράς.",
1432
  "EventCategories": "Κατηγορίες Συμβάντος",
1433
+ "EventCategoriesReportDocumentation": "Αυτή η αναφορά δείχνει τις κατηγορίες κάθε ιχνηλατούμενου συμβάντος και πόσες φορές αυτό συνέβη. Μπορείτε να δείτε τις ενέργειες και ονόματα συμβάντων που ιχνηλατήθηκαν μαζί με κάθε κατηγορία συμβάντος σε κάθε υποπίνακα του πίνακα. Μπορείτε να αλλάξετε το τι εμφανίζεται αλλάζοντας την δευτερεύουσα διάσταση με τον σύνδεσμο στο κάτω μέρος της αναφοράς.",
1434
  "EventCategory": "Κατηγορία Συμβάντος",
1435
  "EventName": "Όνομα Συμβάντος",
1436
  "EventNames": "Ονόματα Συμβάντος",
1437
+ "EventNamesReportDocumentation": "Αυτή η αναφορά δείχνει τα συσχετισμένα ονόματα με κάθε ιχνηλατούμενο συμβάν και πόσες φορές αυτά συνέβησαν. Μπορείτε να δείτε τις ενέργειες συμβάντος και τις κατηγορίες που ιχνηλατήθηκαν μαζί με κάθε όνομα συμβάντος σε κάθε υποπίνακα του πίνακα. Μπορείτε να αλλάξετε το τι εμφανίζεται αλλάζοντας την δευτερεύουσα διάσταση με τον σύνδεσμο στο κάτω μέρος της αναφοράς.",
1438
  "EventUrl": "URL συμβάντος",
1439
  "EventUrls": "URL συμβάντων",
1440
  "Events": "Συμβάντα",
1599
  "ConversionsOverview": "Επισκόπηση μετατροπών",
1600
  "ConversionsOverviewBy": "Επισκόπηση μετατροπών ανά τμήμα",
1601
  "DaysToConv": "Ημέρες για Μετατροπή",
1602
+ "DaysToConvReportDocumentation": "Αυτή η αναφορά δείχνει πόσες ημέρες πέρασαν προτού οι επισκέπτες σας μετατρέψουν ένα στόχο.",
1603
  "Details": "Λεπτομέρειες στόχου",
1604
  "DefaultGoalConvertedOncePerVisit": "(προεπιλογή) Ο Στόχος μετατρέπεται μόνο μια φορά την ημέρα",
1605
  "DefaultRevenueLabel": "Προεπιλεγμένο κέρδος στόχου",
1667
  "GoalsAdjective": "Στόχοι %s",
1668
  "VisitPageTitle": "Επίσκεψη σε έναν Δοθέν Τίτλο Σελίδας",
1669
  "VisitsUntilConv": "Επισκέψεις για Μετατροπή",
1670
+ "VisitsUntilConvReportDocumentation": "Αυτή η αναφορά δείχνει τον αριθμό των επισκέψεων που έκανε κάποιος επισκέπτης πριν την μετατροπή ενός στόχου.",
1671
  "VisitUrl": "Επίσκεψη σε μια δοθείσα διεύθυνση URL (σελίδα ή ομάδα σελίδων)",
1672
  "VisitDurationMatchAttr": "Παραμονή για ένα δεδομένο χρονικό διάστημα",
1673
  "VisitDuration": "η διάρκεια παραμονής είναι",
1681
  "EventValueAsRevenueHelp2": "Σημείωση: Αν ορίζονται και το προκαθορισμένο κέρδος στόχου και η τιμή συμβάντος, θα χρησιμοποιηθεί η τιμή συμβάντος. Αν η επιλογή είναι ενεργή και δεν αποστέλλεται τιμή συμβάντος σε μια αίτηση, θα χρησιμοποιηθεί το προκαθορισμένο κέρδος (αν έχει οριστεί).",
1682
  "AtLeastMinutes": "τουλάχιστον %1$s λεπτά. Χρησιμοποιήστε δεκαδικά για δευτερόλεπτα, για παράδειγμα, %2$s για 30 δευτερόλεπτα.",
1683
  "TimeInMinutes": "Χρόνος σε Λεπτά",
1684
+ "ClickToViewThisGoal": "Πατήστε για να δείτε τον στόχο.",
1685
+ "OverviewReportDocumentation": "Αυτή η αναφορά δείχνει μια σύνοψη του πόσο καλά οι επισκέπτες μετατρέπουν ένα στόχο."
1686
  },
1687
  "ImageGraph": {
1688
  "ColumnOrdinateMissing": "Η στήλη '%1$s' δεν βρέθηκε στην αναφορά. Δοκιμάστε οποιαδήποτε από τις %2$s",
3284
  "Evolution": "Πρόοδος",
3285
  "LoadingWebsites": "Γίνεται φόρτωση των ιστοτόπων",
3286
  "PluginDescription": "Δείτε και συγκρίνετε όλους τους ιστοτόπους σας και τις εφαρμογές σας σε αυτό τον χρήσιμο πίνακα 'Όλοι οι Ιστοτόποι'.",
3287
+ "TopLinkTooltip": "Σύγκριση στατιστικών Ιστού για όλες τις ιστοσελίδες σας.",
3288
+ "SingleWebsitesDashboardDocumentation": "Αυτή η αναφορά δείχνει μια πληροφοριακή σύνοψη ενός συγκεκριμένου ιστοτόπου, περιέχοντας τις περισσότερες γενικές μετρικές γύρω από τους επισκέπτες σας.",
3289
+ "AllWebsitesDashboardDocumentation": "Αυτή η αναφορά δείχνει μια πληροφοριακή σύνοψη για κάθε έναν από τους ιστοτόπους σας, περιέχοντας τις περισσότερες γενικές μετρικές γύρω από τους επισκέπτες σας."
3290
  },
3291
  "Overlay": {
3292
  "Clicks": "%s πατήματα",
3481
  "UseDeleteLog": "Τακτική διαγραφή παλιών ανεπεξέργαστων δεδομένων από τη βάση δεδομένων",
3482
  "UseDeleteReports": "Τακτική διαγραφή παλαιών αναφορών από τη βάση δεδομένων",
3483
  "UsersOptOut": "Opt-out χρηστών",
3484
+ "ImprintUrl": "Διεύθυνση URL Σφραγίδας",
3485
+ "ImprintUrlDescription": "Ένας σύνδεσμος για τη σελίδα Σφραγίδας σας.",
3486
  "PrivacyPolicyUrl": "Διεύθυνση URL Πολιτικής Ιδιωτικότητας",
3487
  "PrivacyPolicyUrlDescription": "Ένας σύνδεσμος για την σελίδα Πολιτικής Ιδιωτικότητας.",
3488
  "TermsAndConditionUrl": "Διεύθυνση URL Όρων Χρήσης",
3490
  "PrivacyPolicyUrlDescriptionSuffix": "Αν το ορίσετε, θα εμφανίζεται στο κάτω μέρος της σελίδας εισόδου χρήστη και στις σελίδες που ο χρήστης '%1$s' έχει πρόσβαση.",
3491
  "ShowInEmbeddedWidgets": "Εμφάνιση στα ενσωματωμένα γραφικά συστατικά",
3492
  "ShowInEmbeddedWidgetsDescription": "Αν είναι τσεκαρισμένο, θα εμφανίζεται ένας σύνδεσμος για την Πολιτική Ιδιωτικότητας και Όρων Χρήσης στο κάτω μέρος των ενσωματωμένων γραφικών συστατικών.",
3493
+ "Imprint": "Σφραγίδα",
3494
  "PrivacyPolicy": "Πολιτική Ιδιωτικότητας",
3495
  "TermsAndConditions": "Όροι Χρήσης"
3496
  },
3539
  "ReferrerNames": "Ονόματα αναφορών",
3540
  "Referrers": "Παραπομπείς",
3541
  "ReferrersOverview": "Επισκόπηση Παραπομπών",
3542
+ "ReferrersOverviewDocumentation": "Αυτή η αναφορά δείχνει τα κανάλια εκμάθησης που χρησιμοποίησαν οι επισκέπτες σας για να έρθουν στον ιστοτόπο σας και τον αριθμό των επισκέψεων από κάθε τύπο καναλιού.",
3543
  "ReferrerTypes": "Τύποι Καναλιών",
3544
  "ReferrerURLs": "URL παραπομπών",
3545
  "SearchEngines": "Μηχανές αναζήτησης",
3587
  "Resolutions": "Αναλύσεις οθόνης",
3588
  "WidgetGlobalVisitors": "Γενικές ρυθμίσεις χρηστών",
3589
  "WidgetGlobalVisitorsDocumentation": "Αυτή η αναφορά δείχνει τις πιο συχνές καθολικές ρυθμίσεις που έχουν οι επισκέπτες σας. Μια ρύθμιση είναι ο συνδυασμός του λειτουργικού συστήματος, του τύπου φυλλομετρητή και της ανάλυσης οθόνης.",
3590
+ "WidgetResolutions": "Αναλύσεις οθόνης",
3591
+ "WidgetResolutionsDocumentation": "Αυτή η αναφορά δείχνει τις αναλύσεις οθόνης που χρησιμοποιούσαν οι επισκέπτες σας κατά την επίσκεψή τους στον ιστοτόπο."
3592
  },
3593
  "SEO": {
3594
  "PluginDescription": "Το πρόσθετο εξάγει και εμφανίζει μετρικές SEO: ταξινόμηση ιστού από το Alexa, Google Pagerank, αριθμός σελίδων στο ευρετήριο και σύνδεσμοι του επιλεγμένου ιστοτόπου.",
3750
  "Format_Utc": "UTC%s",
3751
  "GlobalExcludedUserAgentHelp1": "Εισάγετε τον κατάλογο των user agents που δεν θα παρακολουθούνται από το Matomo.",
3752
  "GlobalExcludedUserAgentHelp2": "Μπορείτε να το χρησιμοποιήσετε για να αποκλείσετε κάποια bots από την παρακολούθηση.",
3753
+ "GlobalExcludedUserAgentHelp3": "Υποστηριζονται κανονικές εκφράσεις όπως το %s.",
3754
  "GlobalListExcludedIps": "Γενικός κατάλογος Αποκλεισμένων Διευθύνσεων IP",
3755
  "GlobalListExcludedQueryParameters": "Καθολικός κατάλογος από παραμέτρους Ερωτήματος URL για αποκλεισμό",
3756
  "GlobalListExcludedUserAgents": "Καθολική λίστα πελατών χρήστη για αποκλεισμό",
3769
  "KeepURLFragmentsLong": "Κρατήστε Τμήματα του URL της σελίδας κατά την παρακολούθηση διευθύνσεων URL Σελίδων",
3770
  "ListOfIpsToBeExcludedOnAllWebsites": "Οι παρακάτω διευθύνσεις IP θα αποκλειστούν από την ανίχνευση σε όλες τις ιστοσελίδες.",
3771
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Οι παράμετροι Ερωτήματος URLs παρακάτω θα αποκλειστούν από URLs σε όλες τις ιστοσελίδες.",
3772
+ "ListOfQueryParametersToExclude": "Εισάγετε τη λίστα παραμέτρων της ηλεκτρονικής διεύθυνσης URL, μία ανά γραμμή για να μην συμπεριλαμβάνονται στις αναφορές των ηλεκτρονικών διευθύνσεων URL των σελίδων. Υποστηρίζονται κανονικές εκφράσεις όπως το %s.",
3773
  "LogAnalytics": "Ημερολόγιο Αναλυτικών",
3774
  "LogAnalyticsDescription": "Αν η μέθοδος με Javascript δεν είναι δυνατή, μπορείτε να %1$sχρησιμοποιήσετε το ημερολόγιο αναλυτικών του διακομιστή%2$s ως εναλλακτική μέθοδο για την παρακολούθηση των χρηστών του ιστοτόπου σας.",
3775
  "MainDescription": "Το σύστημα αναλυτικών αναφορών χρειάζεται ιστοσελίδες! Προσθέστε, ενημερώστε, διαγράψτε ιστοσελίδες και εμφανίστε τον κώδικα Javascript που θα εισαχθεί στις ιστοσελίδες σας.",
4585
  "UserId": {
4586
  "UserId": "Αναγνωριστικό χρήστη",
4587
  "UserReportTitle": "Αναγνωριστικά χρηστών",
4588
+ "UserReportDocumentation": "Αυτή η αναφορά δείχνει τις επισκέψεις και άλλες γενικές μετρικές για κάθε αναγνωριστικό χρήστη.",
4589
  "PluginDescription": "Εμφανίζει τις αναφορές χρηστών"
4590
  },
4591
  "UserLanguage": {
4815
  "ReturnVisits": "επιστρεφόμενες επισκέψεις",
4816
  "SubmenuFrequency": "Συχνότητα",
4817
  "WidgetGraphReturning": "Γράφημα επιστρεφόμενων επισκέψεων",
4818
+ "WidgetOverview": "Επισκόπηση συχνότητας",
4819
+ "VisitFrequencyReportDocumentation": "Αυτή η αναφορά δείχνει γενικές μετρικές όπως επισκέψεις για επιστρεφόμενους επισκέπτες δίπλα δίπλα με τις ίδιες μετρικές για τους νέους επισκέπτες. Μάθετε πως οι επιστρεφόμενοι επισκέπτες αποδίδουν συνολικά συγκριτικά με τους νέους."
4820
  },
4821
  "VisitTime": {
4822
  "ColumnLocalTime": "Τοπική ώρα",
4896
  "PluginDescription": "Αναφέρει γενικές μετρικές αναλυτικών: επισκέψεις, μοναδικοί επισκέπτες, αριθμός ενεργειών, ρυθμός αναπήδησης, κτλ.",
4897
  "VisitsSummary": "Περίληψη επισκέψεων",
4898
  "VisitsSummaryDocumentation": "Αυτή είναι μια επισκόπηση της εξέλιξης των επισκέψεων.",
4899
+ "VisitsSummaryReportDocumentation": "Αυτή η αναφορά δείχνει μια πολύ γενική σύνοψη γύρω από την συμπεριφορά των επισκεπτών σας.",
4900
  "WidgetLastVisits": "Διάγραμμα τελευταίων επισκέψεων",
4901
  "WidgetOverviewGraph": "Επισκόπηση με διάγραμμα",
4902
  "WidgetVisits": "Επισκόπηση επισκέψεων"
app/lang/en.json CHANGED
@@ -32,6 +32,7 @@
32
  "ChooseLanguage": "Choose language",
33
  "ChoosePeriod": "Choose period",
34
  "ClickHere": "Click here for more information.",
 
35
  "DoubleClickToChangePeriod": "Double click to apply this period.",
36
  "Close": "Close",
37
  "ClickToSearch": "Click to search",
@@ -627,6 +628,7 @@
627
  "UserAuthentication": "User authentication",
628
  "UsingTokenAuth": "If you want to %1$s request data within a script, a crontab, etc. %2$s you need to add the URL parameter %3$s to the API calls URLs that require authentication.",
629
  "Glossary": "Glossary",
 
630
  "LearnAboutCommonlyUsedTerms2": "Learn about the commonly used terms to make the most of Matomo Analytics.",
631
  "EvolutionMetricName": "%s Evolution"
632
  },
@@ -672,6 +674,7 @@
672
  "ExitPagesReportDocumentation": "This report contains information about the exit pages that occurred during the specified period. An exit page is the last page that a user views during their visit. %s The exit URLs are displayed as a folder structure.",
673
  "ExitPageTitles": "Exit page titles",
674
  "ExitPageTitlesReportDocumentation": "This report contains information about the titles of exit pages that occurred during the specified period.",
 
675
  "OneSearch": "1 search",
676
  "OutlinkDocumentation": "An outlink is a link that leads the visitor away from your website (to another domain).",
677
  "OutlinksReportDocumentation": "This report shows a hierarchical list of outlink URLs that were clicked by your visitors.",
@@ -740,8 +743,10 @@
740
  "ContentInteractions": "Content Interactions",
741
  "InteractionRate": "Interaction Rate",
742
  "ContentName": "Content Name",
 
743
  "ContentNames": "Content Names",
744
  "ContentPiece": "Content Piece",
 
745
  "ContentPieces": "Content Pieces",
746
  "ContentTarget": "Content Target",
747
  "ContentTargets": "Content Targets",
@@ -1042,6 +1047,7 @@
1042
  "MissingRequirementsNotice": "Please update %1$s %2$s to a newer version, %1$s %3$s is required.",
1043
  "MissingRequirementsPleaseInstallNotice": "Please install %1$s %2$s as it is required by %3$s.",
1044
  "NoZipFileSelected": "Please select a ZIP file.",
 
1045
  "NumUpdatesAvailable": "%s Update(s) available",
1046
  "NoPluginSettings": "No plugin settings that can be configured",
1047
  "Origin": "Origin",
@@ -1329,18 +1335,23 @@
1329
  "Device": "Device",
1330
  "DeviceBrand": "Device brand",
1331
  "DeviceBrands": "Device brands",
 
1332
  "DeviceDetection": "Device detection",
1333
  "DeviceModel": "Device model",
1334
  "DeviceModels": "Device models",
 
1335
  "DevicesDetection": "Visitor Devices",
1336
  "DeviceType": "Device type",
1337
  "DeviceTypes": "Device types",
 
1338
  "FeaturePhone": "Feature phone",
1339
  "OperatingSystemFamilies": "Operating System families",
1340
  "OperatingSystemFamily": "Operating system family",
 
1341
  "OperatingSystemCode": "Operating system code",
1342
  "OperatingSystems": "Operating systems",
1343
  "OperatingSystemVersions": "Operating System versions",
 
1344
  "PluginDescription": "Provides extended information about user devices, such as Brand (manufacturer), Model (device version), device type (tv, consoles, smart phones, desktop, etc) and more.",
1345
  "SmartDisplay": "Smart display",
1346
  "Smartphone": "Smartphone",
@@ -1362,7 +1373,8 @@
1362
  "XVisitsFromDevices": "%1$s visits from %2$s devices",
1363
  "Wearable": "Wearable",
1364
  "WidgetBrowsers": "Visitor Browser",
1365
- "WidgetBrowsersDocumentation": "This report contains information about what kind of browser your visitors were using. Each browser version is listed separately."
 
1366
  },
1367
  "Diagnostics": {
1368
  "ConfigFileTitle": "Config file",
@@ -1416,10 +1428,13 @@
1416
  "Event": "Event",
1417
  "EventAction": "Event Action",
1418
  "EventActions": "Event Actions",
 
1419
  "EventCategories": "Event Categories",
 
1420
  "EventCategory": "Event Category",
1421
  "EventName": "Event Name",
1422
  "EventNames": "Event Names",
 
1423
  "EventUrl": "Event URL",
1424
  "EventUrls": "Event URLs",
1425
  "Events": "Events",
@@ -1584,6 +1599,7 @@
1584
  "ConversionsOverview": "Conversions Overview",
1585
  "ConversionsOverviewBy": "Conversions overview by type of visit",
1586
  "DaysToConv": "Days to Conversion",
 
1587
  "Details": "Goal details",
1588
  "DefaultGoalConvertedOncePerVisit": "(default) Goal can only be converted once per visit",
1589
  "DefaultRevenueLabel": "Goal default revenue",
@@ -1651,6 +1667,7 @@
1651
  "GoalsAdjective": "Goals %s",
1652
  "VisitPageTitle": "Visit a given Page Title",
1653
  "VisitsUntilConv": "Visits to Conversion",
 
1654
  "VisitUrl": "Visit a given URL (page or group of pages)",
1655
  "VisitDurationMatchAttr": "Stay for a certain amount of time",
1656
  "VisitDuration": "visit duration is",
@@ -1664,7 +1681,8 @@
1664
  "EventValueAsRevenueHelp2": "Note: If both a default goal revenue and event value are defined, the event value will be used. If this option is enabled and no event value is sent in a request, the default revenue will be used (if defined).",
1665
  "AtLeastMinutes": "at least %1$s minutes. Use decimals to match seconds, for example, %2$s to match 30 seconds.",
1666
  "TimeInMinutes": "Time in Minutes",
1667
- "ClickToViewThisGoal": "Click to view this goal."
 
1668
  },
1669
  "ImageGraph": {
1670
  "ColumnOrdinateMissing": "The column '%1$s' was not found in this report. Try any of %2$s",
@@ -3264,7 +3282,9 @@
3264
  "Evolution": "Evolution",
3265
  "LoadingWebsites": "Loading websites",
3266
  "PluginDescription": "View and compare all your websites and apps in this useful 'All Websites' dashboard. ",
3267
- "TopLinkTooltip": "Compare Web Analytics stats for all of your Websites."
 
 
3268
  },
3269
  "Overlay": {
3270
  "Clicks": "%s clicks",
@@ -3287,19 +3307,19 @@
3287
  },
3288
  "PagePerformance": {
3289
  "ColumnAveragePageLoadTime": "Avg. page load time",
3290
- "ColumnAveragePageLoadTimeDocumentation": "Average time (in seconds) how long it takes from requesting a page until the page is fully rendered within the browser",
3291
  "ColumnAverageTimeNetwork": "Avg. network time",
3292
- "ColumnAverageTimeNetworkDocumentation": "Average time (in seconds) how long it takes to connect to server. This includes the time needed to lookup DNS and establish a TCP connection. This value might be 0 after the first request to a domain as the browser might cache the connection.",
3293
  "ColumnAverageTimeServer": "Avg. server time",
3294
- "ColumnAverageTimeServerDocumentation": "Average time (in seconds) how long it takes the server to generate page. This is the time between the server receiving the request and start serving the response.",
3295
  "ColumnAverageTimeTransfer": "Avg. transfer time",
3296
- "ColumnAverageTimeTransferDocumentation": "Average time (in seconds) how long it takes the browser to download the response from the server. This is the time from receiving the first byte till the response is complete.",
3297
  "ColumnAverageTimeDomProcessing": "Avg. DOM processing time",
3298
- "ColumnAverageTimeDomProcessingDocumentation": "Average time (in seconds) how long the browser spends loading the webpage after the response was fully received until the user can starting interacting with it.",
3299
  "ColumnAverageTimeDomCompletion": "Avg. DOM completion time",
3300
- "ColumnAverageTimeDomCompletionDocumentation": "Average time (in seconds) how long it takes for the browser to load media and execute any Javascript code listening for the DOMContentLoaded event after the the webpage was loaded and the user can already interact with it.",
3301
  "ColumnAverageTimeOnLoad": "Avg. on load time",
3302
- "ColumnAverageTimeOnLoadDocumentation": "Average time (in seconds) how long it takes the browser to execute Javascript code waiting for the window.load event. This event is triggered once the DOM was completely rendered.",
3303
  "ColumnViewsWithTimeNetwork": "Pageviews with network time",
3304
  "ColumnViewsWithTimeServer": "Pageviews with server time",
3305
  "ColumnViewsWithTimeTransfer": "Pageviews with transfer time",
@@ -3317,6 +3337,7 @@
3317
  "PluginDescription": "Adds some page performance reports",
3318
  "PerformanceTable": "Table with performance metrics",
3319
  "Overview": "Performance overview",
 
3320
  "Performance": "Performance",
3321
  "HelpNote": "Some of those metrics might not always be available. You can find more information in our %1$sonline guide%2$s.",
3322
  "RowActionTitle": "Open page performance report",
@@ -3497,6 +3518,8 @@
3497
  "UseDeleteLog": "Regularly delete old raw data from the database",
3498
  "UseDeleteReports": "Regularly delete old reports from the database",
3499
  "UsersOptOut": "Users opt-out",
 
 
3500
  "PrivacyPolicyUrl": "Privacy Policy URL",
3501
  "PrivacyPolicyUrlDescription": "A link to your Privacy Policy page.",
3502
  "TermsAndConditionUrl": "Terms & Conditions URL",
@@ -3504,6 +3527,7 @@
3504
  "PrivacyPolicyUrlDescriptionSuffix": "If you set this, it will be displayed at the bottom of the login page and on pages that the '%1$s' user can access.",
3505
  "ShowInEmbeddedWidgets": "Show in embedded widgets",
3506
  "ShowInEmbeddedWidgetsDescription": "If checked, a link to your Privacy Policy and your Terms & Conditions will be displayed at the bottom of embedded widgets.",
 
3507
  "PrivacyPolicy": "Privacy Policy",
3508
  "TermsAndConditions": "Terms & Conditions"
3509
  },
@@ -3555,6 +3579,7 @@
3555
  "ReferrerNames": "Referrer Names",
3556
  "Referrers": "Referrers",
3557
  "ReferrersOverview": "Referrers Overview",
 
3558
  "ReferrerTypes": "Channel Types",
3559
  "ReferrerURLs": "Referrer URLs",
3560
  "SearchEngines": "Search Engines",
@@ -3602,7 +3627,8 @@
3602
  "Resolutions": "Resolutions",
3603
  "WidgetGlobalVisitors": "Visitor Configuration",
3604
  "WidgetGlobalVisitorsDocumentation": "This report shows the most common overall configurations that your visitors had. A configuration is the combination of an operating system, a browser type and a screen resolution.",
3605
- "WidgetResolutions": "Screen Resolution"
 
3606
  },
3607
  "SEO": {
3608
  "PluginDescription": "This Plugin extracts and displays SEO metrics: Alexa web ranking, Google Pagerank, number of Indexed pages and backlinks of the currently selected website.",
@@ -3764,6 +3790,7 @@
3764
  "Format_Utc": "UTC%s",
3765
  "GlobalExcludedUserAgentHelp1": "Enter the list of user agents to exclude from being tracked by Matomo.",
3766
  "GlobalExcludedUserAgentHelp2": "You can use this to exclude some bots from being tracked.",
 
3767
  "GlobalListExcludedIps": "Global list of Excluded IPs",
3768
  "GlobalListExcludedQueryParameters": "Global list of Query URL parameters to exclude",
3769
  "GlobalListExcludedUserAgents": "Global list of user agents to exclude",
@@ -3782,7 +3809,7 @@
3782
  "KeepURLFragmentsLong": "Keep Page URL fragments when tracking Page URLs",
3783
  "ListOfIpsToBeExcludedOnAllWebsites": "The IPs below will be excluded from being tracked on all websites.",
3784
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "The Query URLs parameters below will be excluded from URLs on all websites.",
3785
- "ListOfQueryParametersToExclude": "Enter the list of URL Query Parameters, one per line, to exclude from the Page URLs reports. Regular expressions such as %s are suported.",
3786
  "LogAnalytics": "Log Analytics",
3787
  "LogAnalyticsDescription": "If the Javascript tracking method isn’t feasible, you can %1$suse server log analytics%2$s as an alternative method for tracking your website’s users.",
3788
  "MainDescription": "Your Web Analytics reports need Websites! Add, update, delete Websites, and show the JavaScript to insert in your pages.",
@@ -4607,6 +4634,7 @@
4607
  "UserId": {
4608
  "UserId": "UserId",
4609
  "UserReportTitle": "User IDs",
 
4610
  "PluginDescription": "Shows user reports"
4611
  },
4612
  "UserLanguage": {
@@ -4836,7 +4864,8 @@
4836
  "ReturnVisits": "returning visits",
4837
  "SubmenuFrequency": "Frequency",
4838
  "WidgetGraphReturning": "Returning Visits Over Time",
4839
- "WidgetOverview": "Frequency Overview"
 
4840
  },
4841
  "VisitTime": {
4842
  "ColumnLocalTime": "Local time",
@@ -4916,6 +4945,7 @@
4916
  "PluginDescription": "Reports general analytics metrics: visits, unique visitors, number of actions, bounce rate, etc.",
4917
  "VisitsSummary": "Visits Summary",
4918
  "VisitsSummaryDocumentation": "This is an overview of the visit evolution.",
 
4919
  "WidgetLastVisits": "Visits Over Time",
4920
  "WidgetOverviewGraph": "Visits Overview (with graph)",
4921
  "WidgetVisits": "Visits Overview"
32
  "ChooseLanguage": "Choose language",
33
  "ChoosePeriod": "Choose period",
34
  "ClickHere": "Click here for more information.",
35
+ "CompareTo": "Compare to:",
36
  "DoubleClickToChangePeriod": "Double click to apply this period.",
37
  "Close": "Close",
38
  "ClickToSearch": "Click to search",
628
  "UserAuthentication": "User authentication",
629
  "UsingTokenAuth": "If you want to %1$s request data within a script, a crontab, etc. %2$s you need to add the URL parameter %3$s to the API calls URLs that require authentication.",
630
  "Glossary": "Glossary",
631
+ "MainMetricsReportDocumentation": "This report gives you an overview over the most important metrics across all categories and plugins.",
632
  "LearnAboutCommonlyUsedTerms2": "Learn about the commonly used terms to make the most of Matomo Analytics.",
633
  "EvolutionMetricName": "%s Evolution"
634
  },
674
  "ExitPagesReportDocumentation": "This report contains information about the exit pages that occurred during the specified period. An exit page is the last page that a user views during their visit. %s The exit URLs are displayed as a folder structure.",
675
  "ExitPageTitles": "Exit page titles",
676
  "ExitPageTitlesReportDocumentation": "This report contains information about the titles of exit pages that occurred during the specified period.",
677
+ "MainMetricsReportDocumentation": "This report provides a very basic overview of what actions your visitors take on your website.",
678
  "OneSearch": "1 search",
679
  "OutlinkDocumentation": "An outlink is a link that leads the visitor away from your website (to another domain).",
680
  "OutlinksReportDocumentation": "This report shows a hierarchical list of outlink URLs that were clicked by your visitors.",
743
  "ContentInteractions": "Content Interactions",
744
  "InteractionRate": "Interaction Rate",
745
  "ContentName": "Content Name",
746
+ "ContentNameReportDocumentation": "This report shows the names of the content your visitors viewed and interacted with.",
747
  "ContentNames": "Content Names",
748
  "ContentPiece": "Content Piece",
749
+ "ContentPieceReportDocumentation": "This report shows the pieces of content your visitors viewed and interacted with.",
750
  "ContentPieces": "Content Pieces",
751
  "ContentTarget": "Content Target",
752
  "ContentTargets": "Content Targets",
1047
  "MissingRequirementsNotice": "Please update %1$s %2$s to a newer version, %1$s %3$s is required.",
1048
  "MissingRequirementsPleaseInstallNotice": "Please install %1$s %2$s as it is required by %3$s.",
1049
  "NoZipFileSelected": "Please select a ZIP file.",
1050
+ "FileExceedsUploadLimit": "The selected file exceeds the upload limit of your server.",
1051
  "NumUpdatesAvailable": "%s Update(s) available",
1052
  "NoPluginSettings": "No plugin settings that can be configured",
1053
  "Origin": "Origin",
1335
  "Device": "Device",
1336
  "DeviceBrand": "Device brand",
1337
  "DeviceBrands": "Device brands",
1338
+ "DeviceBrandReportDocumentation": "This report shows the brands \/ manufacturers of the devices your visitors were using. In most cases this information is only available for non-desktop devices.",
1339
  "DeviceDetection": "Device detection",
1340
  "DeviceModel": "Device model",
1341
  "DeviceModels": "Device models",
1342
+ "DeviceModelReportDocumentation": "This report shows the devices your visitors are using. Each model is displayed combined with the device brand as some model names are used by multiple brands.",
1343
  "DevicesDetection": "Visitor Devices",
1344
  "DeviceType": "Device type",
1345
  "DeviceTypes": "Device types",
1346
+ "DeviceTypeReportDocumentation": "This report shows the types of devices your visitors were using. This report will always show all device types Matomo is able to detect, even if there were no visits with a specific type.",
1347
  "FeaturePhone": "Feature phone",
1348
  "OperatingSystemFamilies": "Operating System families",
1349
  "OperatingSystemFamily": "Operating system family",
1350
+ "OperatingSystemFamiliesReportDocumentation": "This report shows you the operating systems your visitors are using grouped by operating system family. An operating system family consists of different versions or distributions.",
1351
  "OperatingSystemCode": "Operating system code",
1352
  "OperatingSystems": "Operating systems",
1353
  "OperatingSystemVersions": "Operating System versions",
1354
+ "OperatingSystemVersionsReportDocumentation": "This report shows you the operating systems your visitors are using. Each version and distribution is shown separately.",
1355
  "PluginDescription": "Provides extended information about user devices, such as Brand (manufacturer), Model (device version), device type (tv, consoles, smart phones, desktop, etc) and more.",
1356
  "SmartDisplay": "Smart display",
1357
  "Smartphone": "Smartphone",
1373
  "XVisitsFromDevices": "%1$s visits from %2$s devices",
1374
  "Wearable": "Wearable",
1375
  "WidgetBrowsers": "Visitor Browser",
1376
+ "WidgetBrowsersDocumentation": "This report contains information about what kind of browser your visitors were using.",
1377
+ "WidgetBrowserVersionsDocumentation": "This report contains information about what kind of browser your visitors were using. Each browser version is listed separately."
1378
  },
1379
  "Diagnostics": {
1380
  "ConfigFileTitle": "Config file",
1428
  "Event": "Event",
1429
  "EventAction": "Event Action",
1430
  "EventActions": "Event Actions",
1431
+ "EventActionsReportDocumentation": "This report shows you the number of times each event action occurred. You can view the event categories and names that were tracked along with each event action in the row's subtable. You can change which is shown by changing the secondary dimension with the link at the bottom of the report.",
1432
  "EventCategories": "Event Categories",
1433
+ "EventCategoriesReportDocumentation": "This report shows the categories of each tracked event and how many times they occurred. You can view the event actions and names that were tracked along with each event category in each row's subtable. You can change which is shown by changing the secondary dimension with the link at the bottom of the report.",
1434
  "EventCategory": "Event Category",
1435
  "EventName": "Event Name",
1436
  "EventNames": "Event Names",
1437
+ "EventNamesReportDocumentation": "This report shows you the names associated with each tracked event and how many times they occurred. You can view the event actions and categories that were tracked along with each event name in each row's subtable. You can change which is shown by changing the secondary dimension with the link at the bottom of the report.",
1438
  "EventUrl": "Event URL",
1439
  "EventUrls": "Event URLs",
1440
  "Events": "Events",
1599
  "ConversionsOverview": "Conversions Overview",
1600
  "ConversionsOverviewBy": "Conversions overview by type of visit",
1601
  "DaysToConv": "Days to Conversion",
1602
+ "DaysToConvReportDocumentation": "This report shows how many days pass before your visitors convert a goal.",
1603
  "Details": "Goal details",
1604
  "DefaultGoalConvertedOncePerVisit": "(default) Goal can only be converted once per visit",
1605
  "DefaultRevenueLabel": "Goal default revenue",
1667
  "GoalsAdjective": "Goals %s",
1668
  "VisitPageTitle": "Visit a given Page Title",
1669
  "VisitsUntilConv": "Visits to Conversion",
1670
+ "VisitsUntilConvReportDocumentation": "This report shows the number of visits made before a visitor converts a goal.",
1671
  "VisitUrl": "Visit a given URL (page or group of pages)",
1672
  "VisitDurationMatchAttr": "Stay for a certain amount of time",
1673
  "VisitDuration": "visit duration is",
1681
  "EventValueAsRevenueHelp2": "Note: If both a default goal revenue and event value are defined, the event value will be used. If this option is enabled and no event value is sent in a request, the default revenue will be used (if defined).",
1682
  "AtLeastMinutes": "at least %1$s minutes. Use decimals to match seconds, for example, %2$s to match 30 seconds.",
1683
  "TimeInMinutes": "Time in Minutes",
1684
+ "ClickToViewThisGoal": "Click to view this goal.",
1685
+ "OverviewReportDocumentation": "This report gives an overview of how well your visitors convert a specific goal."
1686
  },
1687
  "ImageGraph": {
1688
  "ColumnOrdinateMissing": "The column '%1$s' was not found in this report. Try any of %2$s",
3282
  "Evolution": "Evolution",
3283
  "LoadingWebsites": "Loading websites",
3284
  "PluginDescription": "View and compare all your websites and apps in this useful 'All Websites' dashboard. ",
3285
+ "TopLinkTooltip": "Compare Web Analytics stats for all of your Websites.",
3286
+ "SingleWebsitesDashboardDocumentation": "This report gives you an informational overview for a specific website, containing the most general metrics about your visitors.",
3287
+ "AllWebsitesDashboardDocumentation": "This report gives you an informational overview for each of your websites, containing the most general metrics about your visitors."
3288
  },
3289
  "Overlay": {
3290
  "Clicks": "%s clicks",
3307
  },
3308
  "PagePerformance": {
3309
  "ColumnAveragePageLoadTime": "Avg. page load time",
3310
+ "ColumnAveragePageLoadTimeDocumentation": "Average time (in seconds) it takes from requesting a page until the page is fully rendered within the browser",
3311
  "ColumnAverageTimeNetwork": "Avg. network time",
3312
+ "ColumnAverageTimeNetworkDocumentation": "Average time (in seconds) it takes to connect to the server. This includes the time needed to lookup DNS and establish a TCP connection. This value might be 0 after the first request to a domain as the browser might cache the connection.",
3313
  "ColumnAverageTimeServer": "Avg. server time",
3314
+ "ColumnAverageTimeServerDocumentation": "Average time (in seconds) it takes the server to generate the page. This is the time between the server receiving the request and starting to serve the response.",
3315
  "ColumnAverageTimeTransfer": "Avg. transfer time",
3316
+ "ColumnAverageTimeTransferDocumentation": "Average time (in seconds) it takes the browser to download the response from the server. This is the time from receiving the first byte till the response is complete.",
3317
  "ColumnAverageTimeDomProcessing": "Avg. DOM processing time",
3318
+ "ColumnAverageTimeDomProcessingDocumentation": "Average time (in seconds) the browser spends loading the webpage after the response was fully received and before the user can start interacting with it.",
3319
  "ColumnAverageTimeDomCompletion": "Avg. DOM completion time",
3320
+ "ColumnAverageTimeDomCompletionDocumentation": "Average time (in seconds) it takes for the browser to load media and execute any Javascript code listening for the DOMContentLoaded event after the webpage was loaded and the user can already interact with it.",
3321
  "ColumnAverageTimeOnLoad": "Avg. on load time",
3322
+ "ColumnAverageTimeOnLoadDocumentation": "Average time (in seconds) it takes the browser to execute Javascript code waiting for the window.load event. This event is triggered once the DOM has completely rendered.",
3323
  "ColumnViewsWithTimeNetwork": "Pageviews with network time",
3324
  "ColumnViewsWithTimeServer": "Pageviews with server time",
3325
  "ColumnViewsWithTimeTransfer": "Pageviews with transfer time",
3337
  "PluginDescription": "Adds some page performance reports",
3338
  "PerformanceTable": "Table with performance metrics",
3339
  "Overview": "Performance overview",
3340
+ "OverviewDocumentation": "This report provides an overview of how fast your webpages become visible to your visitors. This includes both how long it takes for browsers to download your webpages and how long it takes for browsers to display them.",
3341
  "Performance": "Performance",
3342
  "HelpNote": "Some of those metrics might not always be available. You can find more information in our %1$sonline guide%2$s.",
3343
  "RowActionTitle": "Open page performance report",
3518
  "UseDeleteLog": "Regularly delete old raw data from the database",
3519
  "UseDeleteReports": "Regularly delete old reports from the database",
3520
  "UsersOptOut": "Users opt-out",
3521
+ "ImprintUrl": "Imprint URL",
3522
+ "ImprintUrlDescription": "A link to your Imprint page.",
3523
  "PrivacyPolicyUrl": "Privacy Policy URL",
3524
  "PrivacyPolicyUrlDescription": "A link to your Privacy Policy page.",
3525
  "TermsAndConditionUrl": "Terms & Conditions URL",
3527
  "PrivacyPolicyUrlDescriptionSuffix": "If you set this, it will be displayed at the bottom of the login page and on pages that the '%1$s' user can access.",
3528
  "ShowInEmbeddedWidgets": "Show in embedded widgets",
3529
  "ShowInEmbeddedWidgetsDescription": "If checked, a link to your Privacy Policy and your Terms & Conditions will be displayed at the bottom of embedded widgets.",
3530
+ "Imprint": "Imprint",
3531
  "PrivacyPolicy": "Privacy Policy",
3532
  "TermsAndConditions": "Terms & Conditions"
3533
  },
3579
  "ReferrerNames": "Referrer Names",
3580
  "Referrers": "Referrers",
3581
  "ReferrersOverview": "Referrers Overview",
3582
+ "ReferrersOverviewDocumentation": "This report shows what acquisition channels your visitors used to get to your website, and the number of visits each channel type is responsible for.",
3583
  "ReferrerTypes": "Channel Types",
3584
  "ReferrerURLs": "Referrer URLs",
3585
  "SearchEngines": "Search Engines",
3627
  "Resolutions": "Resolutions",
3628
  "WidgetGlobalVisitors": "Visitor Configuration",
3629
  "WidgetGlobalVisitorsDocumentation": "This report shows the most common overall configurations that your visitors had. A configuration is the combination of an operating system, a browser type and a screen resolution.",
3630
+ "WidgetResolutions": "Screen Resolution",
3631
+ "WidgetResolutionsDocumentation": "This report shows the screen resolutions your visitors used when viewing your website."
3632
  },
3633
  "SEO": {
3634
  "PluginDescription": "This Plugin extracts and displays SEO metrics: Alexa web ranking, Google Pagerank, number of Indexed pages and backlinks of the currently selected website.",
3790
  "Format_Utc": "UTC%s",
3791
  "GlobalExcludedUserAgentHelp1": "Enter the list of user agents to exclude from being tracked by Matomo.",
3792
  "GlobalExcludedUserAgentHelp2": "You can use this to exclude some bots from being tracked.",
3793
+ "GlobalExcludedUserAgentHelp3": "Regular expressions such as %s are supported.",
3794
  "GlobalListExcludedIps": "Global list of Excluded IPs",
3795
  "GlobalListExcludedQueryParameters": "Global list of Query URL parameters to exclude",
3796
  "GlobalListExcludedUserAgents": "Global list of user agents to exclude",
3809
  "KeepURLFragmentsLong": "Keep Page URL fragments when tracking Page URLs",
3810
  "ListOfIpsToBeExcludedOnAllWebsites": "The IPs below will be excluded from being tracked on all websites.",
3811
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "The Query URLs parameters below will be excluded from URLs on all websites.",
3812
+ "ListOfQueryParametersToExclude": "Enter the list of URL Query Parameters, one per line, to exclude from the Page URLs reports. Regular expressions such as %s are supported.",
3813
  "LogAnalytics": "Log Analytics",
3814
  "LogAnalyticsDescription": "If the Javascript tracking method isn’t feasible, you can %1$suse server log analytics%2$s as an alternative method for tracking your website’s users.",
3815
  "MainDescription": "Your Web Analytics reports need Websites! Add, update, delete Websites, and show the JavaScript to insert in your pages.",
4634
  "UserId": {
4635
  "UserId": "UserId",
4636
  "UserReportTitle": "User IDs",
4637
+ "UserReportDocumentation": "This report shows visits and other general metrics for every individual User ID.",
4638
  "PluginDescription": "Shows user reports"
4639
  },
4640
  "UserLanguage": {
4864
  "ReturnVisits": "returning visits",
4865
  "SubmenuFrequency": "Frequency",
4866
  "WidgetGraphReturning": "Returning Visits Over Time",
4867
+ "WidgetOverview": "Frequency Overview",
4868
+ "VisitFrequencyReportDocumentation": "This report shows general metrics like visits for returning visitors side by side with the same metrics for new visitors. Learn how returning visitors perform overall compared to new visitors."
4869
  },
4870
  "VisitTime": {
4871
  "ColumnLocalTime": "Local time",
4945
  "PluginDescription": "Reports general analytics metrics: visits, unique visitors, number of actions, bounce rate, etc.",
4946
  "VisitsSummary": "Visits Summary",
4947
  "VisitsSummaryDocumentation": "This is an overview of the visit evolution.",
4948
+ "VisitsSummaryReportDocumentation": "This report provides a very general overview of how your visitors behave.",
4949
  "WidgetLastVisits": "Visits Over Time",
4950
  "WidgetOverviewGraph": "Visits Overview (with graph)",
4951
  "WidgetVisits": "Visits Overview"
app/lang/es-ar.json CHANGED
@@ -1288,7 +1288,7 @@
1288
  "MobileApp": "Aplicación móvil",
1289
  "XVisitsFromDevices": "%1$s visitas desde %2$s dispositivos",
1290
  "WidgetBrowsers": "Navegador web de los visitantes",
1291
- "WidgetBrowsersDocumentation": "Este informe contiene información acerca de qué tipo de navegador web están usando tus visitantes. Cada versión de navegador web está alistado separadamente."
1292
  },
1293
  "Diagnostics": {
1294
  "ConfigFileTitle": "Archivo de configuración",
@@ -3415,7 +3415,6 @@
3415
  "KeepURLFragmentsLong": "Conservar fragmentos de la dirección web de página cuando se rastrean las mismas",
3416
  "ListOfIpsToBeExcludedOnAllWebsites": "Las IPs a continuación quedarán excluidas de ser rastreadas en todos los sitios web.",
3417
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Los parámetros de consulta de direcciones web a continuación serán excluidos de las direcciones web de los sitios.",
3418
- "ListOfQueryParametersToExclude": "Ingresá la lista de parámetros de direcciones web de consulta, uno por línea, para excluirlas de los informes de direcciones web de páginas. Expresiones regulares como %s son soportadas.",
3419
  "LogAnalytics": "Análisis de registros",
3420
  "LogAnalyticsDescription": "Si el método de rastreo de JavaScript no es posible, podés usar el %1$sanálisis de registro%2$s como un método alternativo de rastreo de los usuarios de tu sitio web.",
3421
  "MainDescription": "¡Tus informes de análisis Web necesitan Sitios web! Agregá, actualizá, eliminá sitios web, y mostrá el código JavaScript para insertar en tus páginas.",
1288
  "MobileApp": "Aplicación móvil",
1289
  "XVisitsFromDevices": "%1$s visitas desde %2$s dispositivos",
1290
  "WidgetBrowsers": "Navegador web de los visitantes",
1291
+ "WidgetBrowserVersionsDocumentation": "Este informe contiene información acerca de qué tipo de navegador web están usando tus visitantes. Cada versión de navegador web está alistado separadamente."
1292
  },
1293
  "Diagnostics": {
1294
  "ConfigFileTitle": "Archivo de configuración",
3415
  "KeepURLFragmentsLong": "Conservar fragmentos de la dirección web de página cuando se rastrean las mismas",
3416
  "ListOfIpsToBeExcludedOnAllWebsites": "Las IPs a continuación quedarán excluidas de ser rastreadas en todos los sitios web.",
3417
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Los parámetros de consulta de direcciones web a continuación serán excluidos de las direcciones web de los sitios.",
 
3418
  "LogAnalytics": "Análisis de registros",
3419
  "LogAnalyticsDescription": "Si el método de rastreo de JavaScript no es posible, podés usar el %1$sanálisis de registro%2$s como un método alternativo de rastreo de los usuarios de tu sitio web.",
3420
  "MainDescription": "¡Tus informes de análisis Web necesitan Sitios web! Agregá, actualizá, eliminá sitios web, y mostrá el código JavaScript para insertar en tus páginas.",
app/lang/es.json CHANGED
@@ -1319,7 +1319,7 @@
1319
  "MobileApp": "Aplicación móvil",
1320
  "XVisitsFromDevices": "%1$s visitas desde %2$s dispositivos",
1321
  "WidgetBrowsers": "Navegador del visitante",
1322
- "WidgetBrowsersDocumentation": "Este informe contiene información acerca de qué tipo de navegador el visitante está utilizando. Cada versión de navegador está alistado separadamente."
1323
  },
1324
  "Diagnostics": {
1325
  "ConfigFileTitle": "Archivo de configuración",
@@ -3527,7 +3527,6 @@
3527
  "KeepURLFragmentsLong": "Mantener fragmentos de la URL de página cuando se rastrean las URLs de página",
3528
  "ListOfIpsToBeExcludedOnAllWebsites": "Las IPs a continuación quedarán excluidas de ser rastreadas en todos los sitios de internet.",
3529
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Los parámetros de consulta URL a continuación serán excluidos de las URLs de todos los sitios de internet.",
3530
- "ListOfQueryParametersToExclude": "Introduce la lista de parámetros del \"QueryString\" de la URL, uno por línea, para excluirlos de los reportes de URLs de página. Se soportan expresiones regulares como %s.",
3531
  "LogAnalytics": "Análisis de ficheros históricos",
3532
  "LogAnalyticsDescription": "Si el método de seguimiento por javascript no es factible, puedes %1$susar el análisis de los ficheros históricos del servidor%2$s",
3533
  "MainDescription": "¡Su informe de análisis necesita sitios de internet! Agregue, actualice, elimine sitios y muestre el código JavaScript a insertar en sus páginas.",
1319
  "MobileApp": "Aplicación móvil",
1320
  "XVisitsFromDevices": "%1$s visitas desde %2$s dispositivos",
1321
  "WidgetBrowsers": "Navegador del visitante",
1322
+ "WidgetBrowserVersionsDocumentation": "Este informe contiene información acerca de qué tipo de navegador el visitante está utilizando. Cada versión de navegador está alistado separadamente."
1323
  },
1324
  "Diagnostics": {
1325
  "ConfigFileTitle": "Archivo de configuración",
3527
  "KeepURLFragmentsLong": "Mantener fragmentos de la URL de página cuando se rastrean las URLs de página",
3528
  "ListOfIpsToBeExcludedOnAllWebsites": "Las IPs a continuación quedarán excluidas de ser rastreadas en todos los sitios de internet.",
3529
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Los parámetros de consulta URL a continuación serán excluidos de las URLs de todos los sitios de internet.",
 
3530
  "LogAnalytics": "Análisis de ficheros históricos",
3531
  "LogAnalyticsDescription": "Si el método de seguimiento por javascript no es factible, puedes %1$susar el análisis de los ficheros históricos del servidor%2$s",
3532
  "MainDescription": "¡Su informe de análisis necesita sitios de internet! Agregue, actualice, elimine sitios y muestre el código JavaScript a insertar en sus páginas.",
app/lang/fa.json CHANGED
@@ -1078,7 +1078,7 @@
1078
  "TV": "تلویزیون",
1079
  "UserAgent": "کاربر-نمایندگی",
1080
  "WidgetBrowsers": "مرورگر بازدید کننده",
1081
- "WidgetBrowsersDocumentation": "این گزارش حاوی اطلاعات در مورد چه نوع مرورگر بازدید کنندگان خود را با استفاده از. هر مرورگر بطور جداگانه ذکر شده است."
1082
  },
1083
  "Events": {
1084
  "AvgValue": "میانگین",
1078
  "TV": "تلویزیون",
1079
  "UserAgent": "کاربر-نمایندگی",
1080
  "WidgetBrowsers": "مرورگر بازدید کننده",
1081
+ "WidgetBrowserVersionsDocumentation": "این گزارش حاوی اطلاعات در مورد چه نوع مرورگر بازدید کنندگان خود را با استفاده از. هر مرورگر بطور جداگانه ذکر شده است."
1082
  },
1083
  "Events": {
1084
  "AvgValue": "میانگین",
app/lang/fi.json CHANGED
@@ -1293,7 +1293,7 @@
1293
  "XVisitsFromDevices": "Käyntien määrä: %1$s, laitteelta tyyppiä %2$s",
1294
  "Wearable": "Puettava",
1295
  "WidgetBrowsers": "Kävijöiden selaimet",
1296
- "WidgetBrowsersDocumentation": "Tämä raportti näyttää, mitä selaimia kävijöilläsi oli. Jokainen selaimen versio näytetään erikseen."
1297
  },
1298
  "Diagnostics": {
1299
  "ConfigFileTitle": "Asetustiedosto",
1293
  "XVisitsFromDevices": "Käyntien määrä: %1$s, laitteelta tyyppiä %2$s",
1294
  "Wearable": "Puettava",
1295
  "WidgetBrowsers": "Kävijöiden selaimet",
1296
+ "WidgetBrowserVersionsDocumentation": "Tämä raportti näyttää, mitä selaimia kävijöilläsi oli. Jokainen selaimen versio näytetään erikseen."
1297
  },
1298
  "Diagnostics": {
1299
  "ConfigFileTitle": "Asetustiedosto",
app/lang/fr.json CHANGED
@@ -1343,7 +1343,7 @@
1343
  "MobileApp": "Application mobile",
1344
  "XVisitsFromDevices": "%1$svisites de %2$spériphériques",
1345
  "WidgetBrowsers": "Navigateurs du visiteur",
1346
- "WidgetBrowsersDocumentation": "Ce rapport contient des informations à propos de quel type de navigateur vos visiteurs utilisent. Chaque version du navigateur est listée séparément."
1347
  },
1348
  "Diagnostics": {
1349
  "ConfigFileTitle": "Fichier de configuration",
@@ -3582,7 +3582,6 @@
3582
  "KeepURLFragmentsLong": "Conserver les fragments d'URL lors du suivi",
3583
  "ListOfIpsToBeExcludedOnAllWebsites": "Les adresses IP ci-dessous seront exclues des statistiques sur tous les sites web.",
3584
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Les paramètres ci-dessous seront exclus des statistiques de tous les sites web.",
3585
- "ListOfQueryParametersToExclude": "Entrez la liste de vos paramètres d'URL à exclure des rapports d'URL de page, un par ligne. Les expressions régulières comme %s sont supportées.",
3586
  "LogAnalytics": "Analyse des logs",
3587
  "LogAnalyticsDescription": "S'il n'est pas possible d'utiliser le code de suivi JavaScript, vous pouvez utiliser %1$sl'analyse des logs serveur%2$s comme solution alternative pour suivre les utilisateurs de vos sites web.",
3588
  "MainDescription": "Matomo a besoin de sites pour générer des rapports ! Ajoutez, éditez et supprimez des sites, et voyez le code JavaScript à inclure dans vos pages.",
1343
  "MobileApp": "Application mobile",
1344
  "XVisitsFromDevices": "%1$svisites de %2$spériphériques",
1345
  "WidgetBrowsers": "Navigateurs du visiteur",
1346
+ "WidgetBrowserVersionsDocumentation": "Ce rapport contient des informations à propos de quel type de navigateur vos visiteurs utilisent. Chaque version du navigateur est listée séparément."
1347
  },
1348
  "Diagnostics": {
1349
  "ConfigFileTitle": "Fichier de configuration",
3582
  "KeepURLFragmentsLong": "Conserver les fragments d'URL lors du suivi",
3583
  "ListOfIpsToBeExcludedOnAllWebsites": "Les adresses IP ci-dessous seront exclues des statistiques sur tous les sites web.",
3584
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Les paramètres ci-dessous seront exclus des statistiques de tous les sites web.",
 
3585
  "LogAnalytics": "Analyse des logs",
3586
  "LogAnalyticsDescription": "S'il n'est pas possible d'utiliser le code de suivi JavaScript, vous pouvez utiliser %1$sl'analyse des logs serveur%2$s comme solution alternative pour suivre les utilisateurs de vos sites web.",
3587
  "MainDescription": "Matomo a besoin de sites pour générer des rapports ! Ajoutez, éditez et supprimez des sites, et voyez le code JavaScript à inclure dans vos pages.",
app/lang/id.json CHANGED
@@ -1007,7 +1007,7 @@
1007
  "TV": "Tv",
1008
  "MobileApp": "Aplikasi Mobil",
1009
  "WidgetBrowsers": "Peramban Pengunjung",
1010
- "WidgetBrowsersDocumentation": "Laporan ini mengandung informasi tentabg jenis peramban yang pengunjung Anda gunakan. Setiap versi peramban diurutkan terpisah."
1011
  },
1012
  "Diagnostics": {
1013
  "ConfigFileTitle": "Berkas konfigurasi",
1007
  "TV": "Tv",
1008
  "MobileApp": "Aplikasi Mobil",
1009
  "WidgetBrowsers": "Peramban Pengunjung",
1010
+ "WidgetBrowserVersionsDocumentation": "Laporan ini mengandung informasi tentabg jenis peramban yang pengunjung Anda gunakan. Setiap versi peramban diurutkan terpisah."
1011
  },
1012
  "Diagnostics": {
1013
  "ConfigFileTitle": "Berkas konfigurasi",
app/lang/it.json CHANGED
@@ -1306,7 +1306,7 @@
1306
  "XVisitsFromDevices": "%1$s visite da %2$s dispositivi",
1307
  "Wearable": "Indossabile",
1308
  "WidgetBrowsers": "Browser dei visitatori",
1309
- "WidgetBrowsersDocumentation": "Questo report contiene informazioni sul tipo di browser che i tuoi visitatori hanno utilizzato. Ciascuna versione del browser è elencata separatamente."
1310
  },
1311
  "Diagnostics": {
1312
  "ConfigFileTitle": "File di configurazione",
@@ -3643,7 +3643,6 @@
3643
  "KeepURLFragmentsLong": "Conserva i frammenti di URL Pagina quando si tracciano gli URL Pagina",
3644
  "ListOfIpsToBeExcludedOnAllWebsites": "I seguenti indirizzi IP verranno esclusi dal tracking su tutti i siti.",
3645
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "I parametri URL Query qui sotto saranno esclusi dagli URL su tutti i siti.",
3646
- "ListOfQueryParametersToExclude": "Crea un elenco con i Parametri Query URL, uno per riga, da escludere dai report URL Pagina. Sono supportate le espressioni regolari come %s.",
3647
  "LogAnalytics": "Statistiche Log",
3648
  "LogAnalyticsDescription": "Se il tracciamento Javascript non è fattibile, puoi %1$sutilizzare le statistiche server log%2$s come metodo alternativo per tracciare i visitatori del tuo sito web.",
3649
  "MainDescription": "Per generare i report dei tuoi siti web, devi configurarli in Matomo! Aggiungi, aggiorna, cancella i siti web e visualizza il codice JavaScript da inserire nelle tue pagine.",
1306
  "XVisitsFromDevices": "%1$s visite da %2$s dispositivi",
1307
  "Wearable": "Indossabile",
1308
  "WidgetBrowsers": "Browser dei visitatori",
1309
+ "WidgetBrowserVersionsDocumentation": "Questo report contiene informazioni sul tipo di browser che i tuoi visitatori hanno utilizzato. Ciascuna versione del browser è elencata separatamente."
1310
  },
1311
  "Diagnostics": {
1312
  "ConfigFileTitle": "File di configurazione",
3643
  "KeepURLFragmentsLong": "Conserva i frammenti di URL Pagina quando si tracciano gli URL Pagina",
3644
  "ListOfIpsToBeExcludedOnAllWebsites": "I seguenti indirizzi IP verranno esclusi dal tracking su tutti i siti.",
3645
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "I parametri URL Query qui sotto saranno esclusi dagli URL su tutti i siti.",
 
3646
  "LogAnalytics": "Statistiche Log",
3647
  "LogAnalyticsDescription": "Se il tracciamento Javascript non è fattibile, puoi %1$sutilizzare le statistiche server log%2$s come metodo alternativo per tracciare i visitatori del tuo sito web.",
3648
  "MainDescription": "Per generare i report dei tuoi siti web, devi configurarli in Matomo! Aggiungi, aggiorna, cancella i siti web e visualizza il codice JavaScript da inserire nelle tue pagine.",
app/lang/ja.json CHANGED
@@ -1322,7 +1322,7 @@
1322
  "MobileApp": "モバイルアプリ",
1323
  "XVisitsFromDevices": "%2$s デバイスからの %1$s ビジット",
1324
  "WidgetBrowsers": "ブラウザ",
1325
- "WidgetBrowsersDocumentation": "ビジターが使用しているブラウザについてのリポートです。各ブラウザのバージョンは別途記載されています。"
1326
  },
1327
  "Diagnostics": {
1328
  "ConfigFileTitle": "コンフィグファイル",
@@ -3540,7 +3540,6 @@
3540
  "KeepURLFragmentsLong": "ページ URL をトラッキングする際は、ページ URL フラグメントを保持してください。",
3541
  "ListOfIpsToBeExcludedOnAllWebsites": "次の IP は、全ウェブサイトのトラッキングから除外されます。",
3542
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "次のクエリー URL パラメータは、全ウェブサイトの URL から除外されます。",
3543
- "ListOfQueryParametersToExclude": "ページ URL レポートから除外する URL クエリパラメータのリストを 1 行に 1 つずつ入力します。 %s などの正規表現がサポートされています。",
3544
  "LogAnalytics": "ログ解析",
3545
  "LogAnalyticsDescription": "もし Javascript によるトラッキングができない場合は、ウェブサイトのユーザーをトラッキングするための代替方法として%1$sサーバーログ解析%2$sが使えます。",
3546
  "MainDescription": "ウェブ解析リポートにはウェブサイトが必要です! ウェブサイトの追加、更新、削除と、ページに挿入する Javascript を表示します。",
1322
  "MobileApp": "モバイルアプリ",
1323
  "XVisitsFromDevices": "%2$s デバイスからの %1$s ビジット",
1324
  "WidgetBrowsers": "ブラウザ",
1325
+ "WidgetBrowserVersionsDocumentation": "ビジターが使用しているブラウザについてのリポートです。各ブラウザのバージョンは別途記載されています。"
1326
  },
1327
  "Diagnostics": {
1328
  "ConfigFileTitle": "コンフィグファイル",
3540
  "KeepURLFragmentsLong": "ページ URL をトラッキングする際は、ページ URL フラグメントを保持してください。",
3541
  "ListOfIpsToBeExcludedOnAllWebsites": "次の IP は、全ウェブサイトのトラッキングから除外されます。",
3542
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "次のクエリー URL パラメータは、全ウェブサイトの URL から除外されます。",
 
3543
  "LogAnalytics": "ログ解析",
3544
  "LogAnalyticsDescription": "もし Javascript によるトラッキングができない場合は、ウェブサイトのユーザーをトラッキングするための代替方法として%1$sサーバーログ解析%2$sが使えます。",
3545
  "MainDescription": "ウェブ解析リポートにはウェブサイトが必要です! ウェブサイトの追加、更新、削除と、ページに挿入する Javascript を表示します。",
app/lang/ko.json CHANGED
@@ -966,7 +966,7 @@
966
  "UserAgent": "사용자 에이전트",
967
  "MobileApp": "모바일 앱",
968
  "WidgetBrowsers": "방문자 브라우저",
969
- "WidgetBrowsersDocumentation": "사용자가 어떤 브라우저를 사용하는지에 대한 보고서입니다. 각 브라우저의 버전은 별도로 기재되어 있습니다."
970
  },
971
  "Feedback": {
972
  "DoYouHaveBugReportOrFeatureRequest": "발견한 버그나 기능에 대한 의견을 보고하시겠습니까?",
966
  "UserAgent": "사용자 에이전트",
967
  "MobileApp": "모바일 앱",
968
  "WidgetBrowsers": "방문자 브라우저",
969
+ "WidgetBrowserVersionsDocumentation": "사용자가 어떤 브라우저를 사용하는지에 대한 보고서입니다. 각 브라우저의 버전은 별도로 기재되어 있습니다."
970
  },
971
  "Feedback": {
972
  "DoYouHaveBugReportOrFeatureRequest": "발견한 버그나 기능에 대한 의견을 보고하시겠습니까?",
app/lang/lv.json CHANGED
@@ -547,7 +547,7 @@
547
  "dataTableLabelTypes": "Tips",
548
  "OperatingSystems": "Operētājsistēmas",
549
  "WidgetBrowsers": "Apmeklētāju pārlūki",
550
- "WidgetBrowsersDocumentation": "Šajā atskaitē ir informācija par to kādus pārlūkus Jūsu apmeklētāji izmanto. Katra pārlūka versija ir izdalīta atsevišķi."
551
  },
552
  "Feedback": {
553
  "DoYouHaveBugReportOrFeatureRequest": "Vai Jums ir kļūdas ziņojums vai papildus funkcionalitātes pieprasījums?",
547
  "dataTableLabelTypes": "Tips",
548
  "OperatingSystems": "Operētājsistēmas",
549
  "WidgetBrowsers": "Apmeklētāju pārlūki",
550
+ "WidgetBrowserVersionsDocumentation": "Šajā atskaitē ir informācija par to kādus pārlūkus Jūsu apmeklētāji izmanto. Katra pārlūka versija ir izdalīta atsevišķi."
551
  },
552
  "Feedback": {
553
  "DoYouHaveBugReportOrFeatureRequest": "Vai Jums ir kļūdas ziņojums vai papildus funkcionalitātes pieprasījums?",
app/lang/nb.json CHANGED
@@ -1074,7 +1074,7 @@
1074
  "UserAgent": "Bruker-agent",
1075
  "MobileApp": "Mobil-app",
1076
  "WidgetBrowsers": "Besøkendes nettlesere",
1077
- "WidgetBrowsersDocumentation": "Denne rapporten inneholder informasjon om hva slags nettleser som dine besøkere bruker. Alle nettleserversjoner er opplistet separat."
1078
  },
1079
  "Diagnostics": {
1080
  "ConfigFileTitle": "Konfigurasjonsfil",
1074
  "UserAgent": "Bruker-agent",
1075
  "MobileApp": "Mobil-app",
1076
  "WidgetBrowsers": "Besøkendes nettlesere",
1077
+ "WidgetBrowserVersionsDocumentation": "Denne rapporten inneholder informasjon om hva slags nettleser som dine besøkere bruker. Alle nettleserversjoner er opplistet separat."
1078
  },
1079
  "Diagnostics": {
1080
  "ConfigFileTitle": "Konfigurasjonsfil",
app/lang/nl.json CHANGED
@@ -1277,7 +1277,7 @@
1277
  "MobileApp": "Mobiele app",
1278
  "XVisitsFromDevices": "%1$s bezoeken van %2$s apparaten",
1279
  "WidgetBrowsers": "Browser bezoeker",
1280
- "WidgetBrowsersDocumentation": "Dit rapport bevat informatie over het type browsers dat door door uw bezoekers werd gebruikt. Elke browserversie wordt apart vermeld."
1281
  },
1282
  "Diagnostics": {
1283
  "ConfigFileTitle": "Configuratiebestand",
1277
  "MobileApp": "Mobiele app",
1278
  "XVisitsFromDevices": "%1$s bezoeken van %2$s apparaten",
1279
  "WidgetBrowsers": "Browser bezoeker",
1280
+ "WidgetBrowserVersionsDocumentation": "Dit rapport bevat informatie over het type browsers dat door door uw bezoekers werd gebruikt. Elke browserversie wordt apart vermeld."
1281
  },
1282
  "Diagnostics": {
1283
  "ConfigFileTitle": "Configuratiebestand",
app/lang/pl.json CHANGED
@@ -1281,7 +1281,7 @@
1281
  "MobileApp": "Aplikacja mobilna",
1282
  "XVisitsFromDevices": "%1$s wizyt z %2$s urządzeń",
1283
  "WidgetBrowsers": "Przeglądarki odwiedzających",
1284
- "WidgetBrowsersDocumentation": "Ten raport zawiera informacje o rodzajach przeglądarek używanych przez Twoich odwiedzających. Każda wersja przeglądarki prezentowana jest osobno."
1285
  },
1286
  "Diagnostics": {
1287
  "ConfigFileTitle": "Plik konfiguracyjny",
@@ -3355,7 +3355,6 @@
3355
  "KeepURLFragmentsLong": "Zachowaj fragmenty adresu URL podczas śledzenia",
3356
  "ListOfIpsToBeExcludedOnAllWebsites": "Adresy IP z listy poniżej zostaną wykluczone ze śledzonych na wszystkich stronach.",
3357
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Parametry dotyczące listy zapytań z adresami URL przedstawione poniżej zostaną wykluczone ze statystyk na wszystkich stronach.",
3358
- "ListOfQueryParametersToExclude": "Wprowadź listę parametrów zapytania z adresu, po jednym w linii, które mają być pominięte przy śledzeniu. Wyrażenia regularne takie jak %s są wspierane.",
3359
  "LogAnalytics": "Analiza logów",
3360
  "LogAnalyticsDescription": "Jeśli śledzenie przy pomocy kodu JavaScript nie jest dostępne, możesz %1$sskorzystać z analizy logów serwera%2$s, jako alternatywnej metody śledzenia użytkowników serwisu.",
3361
  "MainDescription": "Twoje raporty z analityką statystyczną stron wymagają posiadania serwisu internetowego! Dodaj, zaktualizuj, zmień serwis internetowy, i wyświetl kod JavaScript do umieszczenia na stronach.",
1281
  "MobileApp": "Aplikacja mobilna",
1282
  "XVisitsFromDevices": "%1$s wizyt z %2$s urządzeń",
1283
  "WidgetBrowsers": "Przeglądarki odwiedzających",
1284
+ "WidgetBrowserVersionsDocumentation": "Ten raport zawiera informacje o rodzajach przeglądarek używanych przez Twoich odwiedzających. Każda wersja przeglądarki prezentowana jest osobno."
1285
  },
1286
  "Diagnostics": {
1287
  "ConfigFileTitle": "Plik konfiguracyjny",
3355
  "KeepURLFragmentsLong": "Zachowaj fragmenty adresu URL podczas śledzenia",
3356
  "ListOfIpsToBeExcludedOnAllWebsites": "Adresy IP z listy poniżej zostaną wykluczone ze śledzonych na wszystkich stronach.",
3357
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Parametry dotyczące listy zapytań z adresami URL przedstawione poniżej zostaną wykluczone ze statystyk na wszystkich stronach.",
 
3358
  "LogAnalytics": "Analiza logów",
3359
  "LogAnalyticsDescription": "Jeśli śledzenie przy pomocy kodu JavaScript nie jest dostępne, możesz %1$sskorzystać z analizy logów serwera%2$s, jako alternatywnej metody śledzenia użytkowników serwisu.",
3360
  "MainDescription": "Twoje raporty z analityką statystyczną stron wymagają posiadania serwisu internetowego! Dodaj, zaktualizuj, zmień serwis internetowy, i wyświetl kod JavaScript do umieszczenia na stronach.",
app/lang/pt-br.json CHANGED
@@ -1295,7 +1295,7 @@
1295
  "MobileApp": "Aplicativo móvel",
1296
  "XVisitsFromDevices": "%1$s visitas de %2$s dispositivos",
1297
  "WidgetBrowsers": "Navegador dos Visitantes",
1298
- "WidgetBrowsersDocumentation": "Este relatório contém informações sobre o tipo de navegador que os visitantes estavam usando. Cada versão do navegador é listada separadamente."
1299
  },
1300
  "Diagnostics": {
1301
  "ConfigFileTitle": "Arquivo de configuração",
@@ -3538,7 +3538,6 @@
3538
  "KeepURLFragmentsLong": "Mantenha fragmentos de URL da página quando estiver rastreando URLs de páginas",
3539
  "ListOfIpsToBeExcludedOnAllWebsites": "Os IPs abaixo serão excluídos por terem sido rastreados em todos os sites.",
3540
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Os parâmetros Query URL abaixo serão excluídos das URLs em todos os sites.",
3541
- "ListOfQueryParametersToExclude": "Entre com a lista de parâmetros URL Query, um por linha, para excluir os relatórios das páginas URL. Expressões regulares tais como %s são suportadas.",
3542
  "LogAnalytics": "Análise de registro",
3543
  "LogAnalyticsDescription": "Se o método de rastreamento Javascript não for viável, você pode %1$susar análise de registro do servidor%2$s como um método alternativo para rastrear os usuários do seu site.",
3544
  "MainDescription": "Seus relatórios de Web Analytics precisam de sites! Adicione, atualize, exclua sites, e mostre o JavaScript a ser inserido em suas páginas.",
1295
  "MobileApp": "Aplicativo móvel",
1296
  "XVisitsFromDevices": "%1$s visitas de %2$s dispositivos",
1297
  "WidgetBrowsers": "Navegador dos Visitantes",
1298
+ "WidgetBrowserVersionsDocumentation": "Este relatório contém informações sobre o tipo de navegador que os visitantes estavam usando. Cada versão do navegador é listada separadamente."
1299
  },
1300
  "Diagnostics": {
1301
  "ConfigFileTitle": "Arquivo de configuração",
3538
  "KeepURLFragmentsLong": "Mantenha fragmentos de URL da página quando estiver rastreando URLs de páginas",
3539
  "ListOfIpsToBeExcludedOnAllWebsites": "Os IPs abaixo serão excluídos por terem sido rastreados em todos os sites.",
3540
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Os parâmetros Query URL abaixo serão excluídos das URLs em todos os sites.",
 
3541
  "LogAnalytics": "Análise de registro",
3542
  "LogAnalyticsDescription": "Se o método de rastreamento Javascript não for viável, você pode %1$susar análise de registro do servidor%2$s como um método alternativo para rastrear os usuários do seu site.",
3543
  "MainDescription": "Seus relatórios de Web Analytics precisam de sites! Adicione, atualize, exclua sites, e mostre o JavaScript a ser inserido em suas páginas.",
app/lang/pt.json CHANGED
@@ -1317,7 +1317,7 @@
1317
  "XVisitsFromDevices": "%1$s visitas de %2$s dispositivos",
1318
  "Wearable": "Dispositivo utilizável",
1319
  "WidgetBrowsers": "Navegador do visitante",
1320
- "WidgetBrowsersDocumentation": "Este relatório contém informações sobre o tipo de navegadores que os seus visitantes estavam a utilizar. Cada versão do navegador é listada separadamente."
1321
  },
1322
  "Diagnostics": {
1323
  "ConfigFileTitle": "Ficheiro de configuração",
@@ -3638,7 +3638,6 @@
3638
  "KeepURLFragmentsLong": "Manter fragmentos de endereços de páginas no acompanhamento dos endereços das páginas",
3639
  "ListOfIpsToBeExcludedOnAllWebsites": "Os IPs abaixo serão excluídos do acompanhamento em todos os sites.",
3640
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Os parâmetros de consulta de endereços abaixo serão excluídos dos endereços de todos os sites.",
3641
- "ListOfQueryParametersToExclude": "Introduza a lista de parâmetros de consulta de endereços, um por linha, para excluir dos relatórios de endereços de páginas. Expressões regulares como %s são suportadas.",
3642
  "LogAnalytics": "Análise de registos",
3643
  "LogAnalyticsDescription": "Se o método de monitorização por JavaScript não for possível, pode %1$sutilizar a analítica de registo do servidor%2$s como um método alternativo para a monitorização dos utilizadores do seu <i>site<\/i> da Web.",
3644
  "MainDescription": "Os seus relatórios de Analíticas Web necessitam de site! Adicione, atualize, elimine site e mostre o JavaScript para inserir nas suas páginas.",
1317
  "XVisitsFromDevices": "%1$s visitas de %2$s dispositivos",
1318
  "Wearable": "Dispositivo utilizável",
1319
  "WidgetBrowsers": "Navegador do visitante",
1320
+ "WidgetBrowserVersionsDocumentation": "Este relatório contém informações sobre o tipo de navegadores que os seus visitantes estavam a utilizar. Cada versão do navegador é listada separadamente."
1321
  },
1322
  "Diagnostics": {
1323
  "ConfigFileTitle": "Ficheiro de configuração",
3638
  "KeepURLFragmentsLong": "Manter fragmentos de endereços de páginas no acompanhamento dos endereços das páginas",
3639
  "ListOfIpsToBeExcludedOnAllWebsites": "Os IPs abaixo serão excluídos do acompanhamento em todos os sites.",
3640
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Os parâmetros de consulta de endereços abaixo serão excluídos dos endereços de todos os sites.",
 
3641
  "LogAnalytics": "Análise de registos",
3642
  "LogAnalyticsDescription": "Se o método de monitorização por JavaScript não for possível, pode %1$sutilizar a analítica de registo do servidor%2$s como um método alternativo para a monitorização dos utilizadores do seu <i>site<\/i> da Web.",
3643
  "MainDescription": "Os seus relatórios de Analíticas Web necessitam de site! Adicione, atualize, elimine site e mostre o JavaScript para inserir nas suas páginas.",
app/lang/ro.json CHANGED
@@ -917,7 +917,7 @@
917
  "TV": "Tv",
918
  "UserAgent": "User-Agent",
919
  "WidgetBrowsers": "Browsere vizitatori",
920
- "WidgetBrowsersDocumentation": "Acest raport conține informații cu privire la ce fel de browser utilizeaza de vizitatori . Fiecare versiune de browser este listată separat."
921
  },
922
  "Diagnostics": {
923
  "ConfigFileTitle": "Fişier configurări",
917
  "TV": "Tv",
918
  "UserAgent": "User-Agent",
919
  "WidgetBrowsers": "Browsere vizitatori",
920
+ "WidgetBrowserVersionsDocumentation": "Acest raport conține informații cu privire la ce fel de browser utilizeaza de vizitatori . Fiecare versiune de browser este listată separat."
921
  },
922
  "Diagnostics": {
923
  "ConfigFileTitle": "Fişier configurări",
app/lang/ru.json CHANGED
@@ -134,6 +134,8 @@
134
  "DaysSinceFirstVisit": "Дней с момента первого посещения",
135
  "DaysSinceLastEcommerceOrder": "Дней с момента последнего электронного заказа.",
136
  "DaysSinceLastVisit": "Дней прошло с момента последнего посещения",
 
 
137
  "Default": "По умолчанию",
138
  "DefaultAppended": "(по умолчанию)",
139
  "Delete": "Удалить",
@@ -506,7 +508,9 @@
506
  "Comparisons": "Сравнение",
507
  "ClickToRemoveComp": "Нажмите, чтобы удалить это сравнение.",
508
  "MaximumNumberOfSegmentsComparedIs": "Максимальное количество сегментов, которые можно сравнивать одновременно, равно%s.",
509
- "MaximumNumberOfPeriodsComparedIs": "Максимальне количество периодов, которые можно сравнить одновременно: %s."
 
 
510
  },
511
  "Mobile": {
512
  "AboutPiwikMobile": "О Matomo Mobile",
@@ -1307,7 +1311,7 @@
1307
  "MobileApp": "Мобильное приложение",
1308
  "XVisitsFromDevices": "%1$s посещений с %2$s устройств",
1309
  "WidgetBrowsers": "Браузер посетителя",
1310
- "WidgetBrowsersDocumentation": "Этот отчёт содержит информацию по браузерам, которые используют ваши посетители. Каждая версия браузера отображается отдельно."
1311
  },
1312
  "Diagnostics": {
1313
  "ConfigFileTitle": "Файл конфигурации",
@@ -3408,7 +3412,6 @@
3408
  "KeepURLFragmentsLong": "Сохранять фрагменты URL при отслеживании страниц",
3409
  "ListOfIpsToBeExcludedOnAllWebsites": "IP адреса ниже будут исключены из статистики и не будут учитываться при сборе данных на всех сайтах.",
3410
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Запросы URL-параметров ниже будут исключены и не будут учитываться при сборе статистики на всех сайтах.",
3411
- "ListOfQueryParametersToExclude": "Введите список параметров запроса URL, по одному в каждой строке, чтобы исключить из отчетов URL-адреса страниц. Регулярные выражения, такие как %s — поддерживаются.",
3412
  "LogAnalytics": "Журнал аналитики",
3413
  "LogAnalyticsDescription": "Если метод отслеживания с помощью Javascript невозможен, то можете использовать %1$sлоги сервера%2$s в качестве альтернативного метода для отслеживания пользователей вашего сайта.",
3414
  "MainDescription": "Для ведения статистики требуется добавить сайты. Добавляйте, обновляйте, удаляйте информацию о сайтах, а также просмотрите JavaScript-код для вставки на ваши страницы.",
134
  "DaysSinceFirstVisit": "Дней с момента первого посещения",
135
  "DaysSinceLastEcommerceOrder": "Дней с момента последнего электронного заказа.",
136
  "DaysSinceLastVisit": "Дней прошло с момента последнего посещения",
137
+ "SecondsSinceLastVisit": "Прошло секунд с момента последнего посещения",
138
+ "SecondsSinceFirstVisit": "Прошло секунд с момента первого посещения",
139
  "Default": "По умолчанию",
140
  "DefaultAppended": "(по умолчанию)",
141
  "Delete": "Удалить",
508
  "Comparisons": "Сравнение",
509
  "ClickToRemoveComp": "Нажмите, чтобы удалить это сравнение.",
510
  "MaximumNumberOfSegmentsComparedIs": "Максимальное количество сегментов, которые можно сравнивать одновременно, равно%s.",
511
+ "MaximumNumberOfPeriodsComparedIs": "Максимальне количество периодов, которые можно сравнить одновременно: %s.",
512
+ "PreviousPeriod": "Предыдущий Период",
513
+ "PreviousYear": "Предыдущий Год"
514
  },
515
  "Mobile": {
516
  "AboutPiwikMobile": "О Matomo Mobile",
1311
  "MobileApp": "Мобильное приложение",
1312
  "XVisitsFromDevices": "%1$s посещений с %2$s устройств",
1313
  "WidgetBrowsers": "Браузер посетителя",
1314
+ "WidgetBrowserVersionsDocumentation": "Этот отчёт содержит информацию по браузерам, которые используют ваши посетители. Каждая версия браузера отображается отдельно."
1315
  },
1316
  "Diagnostics": {
1317
  "ConfigFileTitle": "Файл конфигурации",
3412
  "KeepURLFragmentsLong": "Сохранять фрагменты URL при отслеживании страниц",
3413
  "ListOfIpsToBeExcludedOnAllWebsites": "IP адреса ниже будут исключены из статистики и не будут учитываться при сборе данных на всех сайтах.",
3414
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Запросы URL-параметров ниже будут исключены и не будут учитываться при сборе статистики на всех сайтах.",
 
3415
  "LogAnalytics": "Журнал аналитики",
3416
  "LogAnalyticsDescription": "Если метод отслеживания с помощью Javascript невозможен, то можете использовать %1$sлоги сервера%2$s в качестве альтернативного метода для отслеживания пользователей вашего сайта.",
3417
  "MainDescription": "Для ведения статистики требуется добавить сайты. Добавляйте, обновляйте, удаляйте информацию о сайтах, а также просмотрите JavaScript-код для вставки на ваши страницы.",
app/lang/sq.json CHANGED
@@ -32,6 +32,7 @@
32
  "ChooseLanguage": "Zgjidhni gjuhën",
33
  "ChoosePeriod": "Zgjidhni periudhë",
34
  "ClickHere": "Për më tepër të dhëna, klikoni këtu.",
 
35
  "DoubleClickToChangePeriod": "Dyklikoni që të zbatohet kjo periudhë.",
36
  "Close": "Mbylle",
37
  "ClickToSearch": "Klikoni për kërkim",
@@ -627,6 +628,7 @@
627
  "UserAuthentication": "Mirëfilltësim përdoruesi",
628
  "UsingTokenAuth": "Nëse doni %1$s të kërkoni të dhëna brenda një programthi, një crontab-i, etj. %2$s lypset të shtoni parametrin e URL-së %3$s te URL-të thirrëse të API-t që lypin doemos mirëfilltësim.",
629
  "Glossary": "Fjalorth",
 
630
  "LearnAboutCommonlyUsedTerms2": "Mësoni më tepër rreth termash të përdorur rëndom, që të përfitoni maksimumin prej Matomo Analytics.",
631
  "EvolutionMetricName": "Ecuri e %s"
632
  },
@@ -1041,6 +1043,7 @@
1041
  "MissingRequirementsNotice": "Ju lutemi, përditësojeni %1$s %2$s me një version më të ri, është i domosdoshëm %1$s %3$s.",
1042
  "MissingRequirementsPleaseInstallNotice": "Ju lutemi, instaloni %1$s %2$s pasi është i domosdoshëm për %3$s.",
1043
  "NoZipFileSelected": "Ju lutemi, përzgjidhni një kartelë ZIP.",
 
1044
  "NumUpdatesAvailable": "%s Përditësim(e) gati",
1045
  "NoPluginSettings": "S’ka rregullime shtojce që mund të formësohen",
1046
  "Origin": "Origjina",
@@ -1328,18 +1331,23 @@
1328
  "Device": "Pajisje",
1329
  "DeviceBrand": "Markë pajisjeje",
1330
  "DeviceBrands": "Marka pajisjesh",
 
1331
  "DeviceDetection": "Zbulim pajisjeje",
1332
  "DeviceModel": "Model pajisjeje",
1333
  "DeviceModels": "Modele pajisjesh",
 
1334
  "DevicesDetection": "Pajisje Vizitorësh",
1335
  "DeviceType": "Lloj pajisjeje",
1336
  "DeviceTypes": "Lloje pajisjesh",
 
1337
  "FeaturePhone": "Telefon",
1338
  "OperatingSystemFamilies": "Familje Sistemesh Operativë",
1339
  "OperatingSystemFamily": "Familje Sistemi Operativ",
 
1340
  "OperatingSystemCode": "Kod sistemi operativ",
1341
  "OperatingSystems": "Sisteme operativë",
1342
  "OperatingSystemVersions": "Versione Sistemesh Operativë",
 
1343
  "PluginDescription": "Furnizon të dhëna të zgjeruara rreth pajisje përdoruesish, të tilla si Marka (prodhuesi), Modeli (version pajisjeje), lloj pajisjeje (tv, konsola, telefon të mençur, desktop, etj) dhe të tjera.",
1344
  "SmartDisplay": "Ekran i mençur",
1345
  "Smartphone": "Telefon i mençur",
@@ -1359,7 +1367,8 @@
1359
  "MediaPlayer": "Lojtës Mediash",
1360
  "XVisitsFromDevices": "%1$s vizita nga %2$s pajisje",
1361
  "WidgetBrowsers": "Shfletues Vizitori",
1362
- "WidgetBrowsersDocumentation": "Ky raport përmban të dhëna rreth llojeve shfletuesit që përdornin vizitorët tuaj. Secili version i një shfletuesi tregohet veçmas."
 
1363
  },
1364
  "Diagnostics": {
1365
  "ConfigFileTitle": "Kartelë formësimesh",
@@ -3711,6 +3720,7 @@
3711
  "Format_Utc": "UTC%s",
3712
  "GlobalExcludedUserAgentHelp1": "Jepni listën e agjentëve të përdoruesit që duhen përjashtuar nga ndjekja prej Matomo-s.",
3713
  "GlobalExcludedUserAgentHelp2": "Këtë mund ta përdorni për përjashtim bot-esh nga ndjekja.",
 
3714
  "GlobalListExcludedIps": "Listë globale IP-sh të përjashtuara",
3715
  "GlobalListExcludedQueryParameters": "Listë globale parametrash URL-sh Kërkese që duhen përjashtuar",
3716
  "GlobalListExcludedUserAgents": "Listë globale agjentësh përdoruesish për përjashtim",
@@ -3729,7 +3739,7 @@
3729
  "KeepURLFragmentsLong": "Mbaji fragmentet e URL-ve të Faqeve kur ndiqen URL Faqesh",
3730
  "ListOfIpsToBeExcludedOnAllWebsites": "IP-të më poshtë do të përjashtohen në krejt sajtet nga ndjekja.",
3731
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Parametrat për URL-ra Kërkesash më poshtë do të përjashtohen nga URL-të për krejt sajtet.",
3732
- "ListOfQueryParametersToExclude": "Jepni listën e Parametrave URL Query, një për rresht, që duhen përjashtuar nga raportet URL Faqesh. Mbulohen shprehje të rregullta si %s.",
3733
  "LogAnalytics": "Analiza Regjistri",
3734
  "LogAnalyticsDescription": "Nëse metoda Javascript e ndjekjeve s’është e mundur, si metodë alternative për ndjekjen e përdoruesve të sajtit tuaj mund të %1$spërdorni analizat e regjistrit të shërbyesit%2$s.",
3735
  "MainDescription": "Raportet tuaja Analizash Web lypin sajte! Shtoni, përditësoni, hiqni sajte, dhe shfaqni JavaScript-in për futje në faqet tuaja.",
@@ -4545,6 +4555,7 @@
4545
  "UserId": {
4546
  "UserId": "ID përdoruesi",
4547
  "UserReportTitle": "ID-ra përdoruesish",
 
4548
  "PluginDescription": "Shfaq raporte përdoruesi"
4549
  },
4550
  "UserLanguage": {
32
  "ChooseLanguage": "Zgjidhni gjuhën",
33
  "ChoosePeriod": "Zgjidhni periudhë",
34
  "ClickHere": "Për më tepër të dhëna, klikoni këtu.",
35
+ "CompareTo": "Krahasoje me:",
36
  "DoubleClickToChangePeriod": "Dyklikoni që të zbatohet kjo periudhë.",
37
  "Close": "Mbylle",
38
  "ClickToSearch": "Klikoni për kërkim",
628
  "UserAuthentication": "Mirëfilltësim përdoruesi",
629
  "UsingTokenAuth": "Nëse doni %1$s të kërkoni të dhëna brenda një programthi, një crontab-i, etj. %2$s lypset të shtoni parametrin e URL-së %3$s te URL-të thirrëse të API-t që lypin doemos mirëfilltësim.",
630
  "Glossary": "Fjalorth",
631
+ "MainMetricsReportDocumentation": "Ky raport ju jep një përmbledhje të statistikave më të rëndësishme nëpër krejt kategoritë dhe shtojcat.",
632
  "LearnAboutCommonlyUsedTerms2": "Mësoni më tepër rreth termash të përdorur rëndom, që të përfitoni maksimumin prej Matomo Analytics.",
633
  "EvolutionMetricName": "Ecuri e %s"
634
  },
1043
  "MissingRequirementsNotice": "Ju lutemi, përditësojeni %1$s %2$s me një version më të ri, është i domosdoshëm %1$s %3$s.",
1044
  "MissingRequirementsPleaseInstallNotice": "Ju lutemi, instaloni %1$s %2$s pasi është i domosdoshëm për %3$s.",
1045
  "NoZipFileSelected": "Ju lutemi, përzgjidhni një kartelë ZIP.",
1046
+ "FileExceedsUploadLimit": "Kartela e përzgjedhur tejkalon kufi ngarkimesh të shërbyesit tuaj.",
1047
  "NumUpdatesAvailable": "%s Përditësim(e) gati",
1048
  "NoPluginSettings": "S’ka rregullime shtojce që mund të formësohen",
1049
  "Origin": "Origjina",
1331
  "Device": "Pajisje",
1332
  "DeviceBrand": "Markë pajisjeje",
1333
  "DeviceBrands": "Marka pajisjesh",
1334
+ "DeviceBrandReportDocumentation": "Ky raport shfaq markat \/ prodhuesit e pajisjeve që përdornin vizitorët tuaj. Në shumicën e rasteve ky informacion është i passhëm vetëm për pajisje jo desktop.",
1335
  "DeviceDetection": "Zbulim pajisjeje",
1336
  "DeviceModel": "Model pajisjeje",
1337
  "DeviceModels": "Modele pajisjesh",
1338
+ "DeviceModelReportDocumentation": "Ky raport shfaq pajisjet që përdorin vizitorët tuaj. Secili model shfaqet me markën e pajisjes, ngaqë disa emra modelesh përdoren nga shumë marka.",
1339
  "DevicesDetection": "Pajisje Vizitorësh",
1340
  "DeviceType": "Lloj pajisjeje",
1341
  "DeviceTypes": "Lloje pajisjesh",
1342
+ "DeviceTypeReportDocumentation": "Ky raport shfaq llojet e pajisjeve që përdornin vizitorët tuaj. Ky raport do të shfaqë përherë krejt llojet e pajisjeve që është në gjendje të pikasë Matomo-ja, edhe pse s’pati vizita me një lloj të caktuar.",
1343
  "FeaturePhone": "Telefon",
1344
  "OperatingSystemFamilies": "Familje Sistemesh Operativë",
1345
  "OperatingSystemFamily": "Familje Sistemi Operativ",
1346
+ "OperatingSystemFamiliesReportDocumentation": "Ky raport shfaq sistemet operative që përdorin vizitorët tuaj, grupuar sipas familjeve të sistemit. Një familje sistemi operativ përbëhet nga versioni ose shpërndarje të ndryshme.",
1347
  "OperatingSystemCode": "Kod sistemi operativ",
1348
  "OperatingSystems": "Sisteme operativë",
1349
  "OperatingSystemVersions": "Versione Sistemesh Operativë",
1350
+ "OperatingSystemVersionsReportDocumentation": "Ky raport ju shfaq sistemet operative që po përdorin vizitorët tuaj. Çdo version dhe shpërndarje shfaqet më vete.",
1351
  "PluginDescription": "Furnizon të dhëna të zgjeruara rreth pajisje përdoruesish, të tilla si Marka (prodhuesi), Modeli (version pajisjeje), lloj pajisjeje (tv, konsola, telefon të mençur, desktop, etj) dhe të tjera.",
1352
  "SmartDisplay": "Ekran i mençur",
1353
  "Smartphone": "Telefon i mençur",
1367
  "MediaPlayer": "Lojtës Mediash",
1368
  "XVisitsFromDevices": "%1$s vizita nga %2$s pajisje",
1369
  "WidgetBrowsers": "Shfletues Vizitori",
1370
+ "WidgetBrowsersDocumentation": "Ky raport përmban të dhëna rreth ç’lloje shfletuesish përdornin vizitorët tuaj.",
1371
+ "WidgetBrowserVersionsDocumentation": "Ky raport përmban të dhëna rreth llojeve të shfletuesit që përdornin vizitorët tuaj. Secili version i një shfletuesi tregohet veçmas."
1372
  },
1373
  "Diagnostics": {
1374
  "ConfigFileTitle": "Kartelë formësimesh",
3720
  "Format_Utc": "UTC%s",
3721
  "GlobalExcludedUserAgentHelp1": "Jepni listën e agjentëve të përdoruesit që duhen përjashtuar nga ndjekja prej Matomo-s.",
3722
  "GlobalExcludedUserAgentHelp2": "Këtë mund ta përdorni për përjashtim bot-esh nga ndjekja.",
3723
+ "GlobalExcludedUserAgentHelp3": "Shprehje të rregullta të tilla si %s mbulohen.",
3724
  "GlobalListExcludedIps": "Listë globale IP-sh të përjashtuara",
3725
  "GlobalListExcludedQueryParameters": "Listë globale parametrash URL-sh Kërkese që duhen përjashtuar",
3726
  "GlobalListExcludedUserAgents": "Listë globale agjentësh përdoruesish për përjashtim",
3739
  "KeepURLFragmentsLong": "Mbaji fragmentet e URL-ve të Faqeve kur ndiqen URL Faqesh",
3740
  "ListOfIpsToBeExcludedOnAllWebsites": "IP-të më poshtë do të përjashtohen në krejt sajtet nga ndjekja.",
3741
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Parametrat për URL-ra Kërkesash më poshtë do të përjashtohen nga URL-të për krejt sajtet.",
3742
+ "ListOfQueryParametersToExclude": "Jepni listën e Parametrave për Kërkesë URL, një për rresht, që përjashtohen prej raportesh URL-sh Faqesh. Shprehje të rregullta të tilla si %s mbulohen.",
3743
  "LogAnalytics": "Analiza Regjistri",
3744
  "LogAnalyticsDescription": "Nëse metoda Javascript e ndjekjeve s’është e mundur, si metodë alternative për ndjekjen e përdoruesve të sajtit tuaj mund të %1$spërdorni analizat e regjistrit të shërbyesit%2$s.",
3745
  "MainDescription": "Raportet tuaja Analizash Web lypin sajte! Shtoni, përditësoni, hiqni sajte, dhe shfaqni JavaScript-in për futje në faqet tuaja.",
4555
  "UserId": {
4556
  "UserId": "ID përdoruesi",
4557
  "UserReportTitle": "ID-ra përdoruesish",
4558
+ "UserReportDocumentation": "Ky raport shfaq vizita dhe vlera të tjera të përgjithshme për çdo ID individuale Përdoruesi.",
4559
  "PluginDescription": "Shfaq raporte përdoruesi"
4560
  },
4561
  "UserLanguage": {
app/lang/sr.json CHANGED
@@ -1094,7 +1094,7 @@
1094
  "UserAgent": "Korisnički agent",
1095
  "MobileApp": "Mobilna aplikacija",
1096
  "WidgetBrowsers": "Brauzeri posetilaca",
1097
- "WidgetBrowsersDocumentation": "Ovaj izveštaj prikazuje koje brauzere koriste vaši posetioci. Svaka verzija brauzera je prikazana posebno."
1098
  },
1099
  "Diagnostics": {
1100
  "ConfigFileTitle": "Datoteka sa podešavanjima",
@@ -3057,7 +3057,6 @@
3057
  "KeepURLFragmentsLong": "Zadrži URL fragmente prilikom praćenja",
3058
  "ListOfIpsToBeExcludedOnAllWebsites": "Sledeće IP adrese će biti izuzete iz praćenja na svim sajtovima.",
3059
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Sledeći parametri će biti izuzeti iz praćenja na svim sajtovima.",
3060
- "ListOfQueryParametersToExclude": "Navedite listu parametara, jedan po liniji, koje treba izuzeti iz izveštaja. Dozvoljeni su regularni izrazi poput %s.",
3061
  "LogAnalytics": "Analiza zapisa",
3062
  "LogAnalyticsDescription": "Ukoliko praćenje pomoću javaskripta nije moguće, možete %1$skoristiti analizu serverskih zapisa%2$s kao alternativnu metodu praćenja posetilaca vašeg sajta.",
3063
  "MainDescription": "Potrebni su vam sajtovi da biste mogli da pratite izveštaje. Dodajte, izmenite ili uklonite sajtove, pogledajte JavaScript kod koji je potrebno postaviti na vaše stranice.",
1094
  "UserAgent": "Korisnički agent",
1095
  "MobileApp": "Mobilna aplikacija",
1096
  "WidgetBrowsers": "Brauzeri posetilaca",
1097
+ "WidgetBrowserVersionsDocumentation": "Ovaj izveštaj prikazuje koje brauzere koriste vaši posetioci. Svaka verzija brauzera je prikazana posebno."
1098
  },
1099
  "Diagnostics": {
1100
  "ConfigFileTitle": "Datoteka sa podešavanjima",
3057
  "KeepURLFragmentsLong": "Zadrži URL fragmente prilikom praćenja",
3058
  "ListOfIpsToBeExcludedOnAllWebsites": "Sledeće IP adrese će biti izuzete iz praćenja na svim sajtovima.",
3059
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Sledeći parametri će biti izuzeti iz praćenja na svim sajtovima.",
 
3060
  "LogAnalytics": "Analiza zapisa",
3061
  "LogAnalyticsDescription": "Ukoliko praćenje pomoću javaskripta nije moguće, možete %1$skoristiti analizu serverskih zapisa%2$s kao alternativnu metodu praćenja posetilaca vašeg sajta.",
3062
  "MainDescription": "Potrebni su vam sajtovi da biste mogli da pratite izveštaje. Dodajte, izmenite ili uklonite sajtove, pogledajte JavaScript kod koji je potrebno postaviti na vaše stranice.",
app/lang/sv.json CHANGED
@@ -133,7 +133,10 @@
133
  "DaysHours": "%1$s dagar %2$s timmar",
134
  "DaysSinceFirstVisit": "Dagar sedan första besöket",
135
  "DaysSinceLastEcommerceOrder": "Antalet dagar sedan senaste ordern",
 
136
  "DaysSinceLastVisit": "Dagar sedan senaste besöket",
 
 
137
  "Default": "Standard",
138
  "DefaultAppended": "(standard)",
139
  "Delete": "Ta bort",
@@ -514,7 +517,10 @@
514
  "MaximumNumberOfSegmentsComparedIs": "Max %s segment kan jämföras samtidigt.",
515
  "CompareDatesParamMustMatchComparePeriods": "Längden av frågeparametern %1$s måste matcha länden av %2$s.",
516
  "MaximumNumberOfPeriodsComparedIs": "Max %s perioder kan jämföras samtidigt.",
517
- "Custom": "Anpassad"
 
 
 
518
  },
519
  "Mobile": {
520
  "AboutPiwikMobile": "Om Matomo Mobile",
@@ -703,7 +709,8 @@
703
  "WidgetSearchNoResultKeywords": "Nyckelord utan resultat",
704
  "ActionType": "Åtgärdstyp",
705
  "ActionTypes": "Typer av handlingar",
706
- "Behaviour": "Beteende"
 
707
  },
708
  "Annotations": {
709
  "AddAnnotationsFor": "Lägg till en anteckning för %s...",
@@ -1324,7 +1331,7 @@
1324
  "MobileApp": "Mobilapp",
1325
  "XVisitsFromDevices": "%1$s besök från %2$s enheter",
1326
  "WidgetBrowsers": "Webbläsare",
1327
- "WidgetBrowsersDocumentation": "Denna rapport innehåller information om vilken typ av webbläsare dina besökare använde. Varje version av webbläsare är listad separat."
1328
  },
1329
  "Diagnostics": {
1330
  "ConfigFileTitle": "Konfigurationsfil",
@@ -3449,7 +3456,6 @@
3449
  "KeepURLFragmentsLong": "Behåll sidans URL fragment när du spårar sidans URL.",
3450
  "ListOfIpsToBeExcludedOnAllWebsites": "IP-adresserna som är listade nedan kommer att bli exkluderade från spårning på samtliga webbplatser.",
3451
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Webbadressernas parametrar nedan kommer att uteslutas från webbadresser på alla webbplatser.",
3452
- "ListOfQueryParametersToExclude": "Ange en lista med URL-parametrar som du vill utesluta från Sid URL rapporterna. En parameter per rad, Regular expressions som t.ex. %s är tillåtna.",
3453
  "LogAnalytics": "Loggfilsanalys",
3454
  "LogAnalyticsDescription": "Om Javascript-spårning inte är möjlig kan du %1$s använda loggfilsanalys %2$s som en alternativ metod för att spåra webbplatsens användare.",
3455
  "MainDescription": "Dina rapporter kräver att du har webbplatser upplagda! Lägg till, uppdatera, ta bort webbplatser, och visa JavaScript spårningskoden för att inkludera den på din webbplats.",
133
  "DaysHours": "%1$s dagar %2$s timmar",
134
  "DaysSinceFirstVisit": "Dagar sedan första besöket",
135
  "DaysSinceLastEcommerceOrder": "Antalet dagar sedan senaste ordern",
136
+ "SecondsSinceLastEcommerceOrder": "Sekunder sedan senaste e-handelsordern",
137
  "DaysSinceLastVisit": "Dagar sedan senaste besöket",
138
+ "SecondsSinceLastVisit": "Sekunder sedan senaste besöket",
139
+ "SecondsSinceFirstVisit": "Sekunder sedan första besöket",
140
  "Default": "Standard",
141
  "DefaultAppended": "(standard)",
142
  "Delete": "Ta bort",
517
  "MaximumNumberOfSegmentsComparedIs": "Max %s segment kan jämföras samtidigt.",
518
  "CompareDatesParamMustMatchComparePeriods": "Längden av frågeparametern %1$s måste matcha länden av %2$s.",
519
  "MaximumNumberOfPeriodsComparedIs": "Max %s perioder kan jämföras samtidigt.",
520
+ "Custom": "Anpassad",
521
+ "PreviousPeriod": "Föregående period",
522
+ "PreviousYear": "Föregående år",
523
+ "ViewAccessRequired": "Den använda token_auth har för mycket rättigheter för att användas i en icke-API-URL. Använd ett app-specifikt lösenord för en användare som bara har läsrättigheter."
524
  },
525
  "Mobile": {
526
  "AboutPiwikMobile": "Om Matomo Mobile",
709
  "WidgetSearchNoResultKeywords": "Nyckelord utan resultat",
710
  "ActionType": "Åtgärdstyp",
711
  "ActionTypes": "Typer av handlingar",
712
+ "Behaviour": "Beteende",
713
+ "TimeSpentInReferringAction": "Tid lagd i hänvisningsaktivitet"
714
  },
715
  "Annotations": {
716
  "AddAnnotationsFor": "Lägg till en anteckning för %s...",
1331
  "MobileApp": "Mobilapp",
1332
  "XVisitsFromDevices": "%1$s besök från %2$s enheter",
1333
  "WidgetBrowsers": "Webbläsare",
1334
+ "WidgetBrowserVersionsDocumentation": "Denna rapport innehåller information om vilken typ av webbläsare dina besökare använde. Varje version av webbläsare är listad separat."
1335
  },
1336
  "Diagnostics": {
1337
  "ConfigFileTitle": "Konfigurationsfil",
3456
  "KeepURLFragmentsLong": "Behåll sidans URL fragment när du spårar sidans URL.",
3457
  "ListOfIpsToBeExcludedOnAllWebsites": "IP-adresserna som är listade nedan kommer att bli exkluderade från spårning på samtliga webbplatser.",
3458
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Webbadressernas parametrar nedan kommer att uteslutas från webbadresser på alla webbplatser.",
 
3459
  "LogAnalytics": "Loggfilsanalys",
3460
  "LogAnalyticsDescription": "Om Javascript-spårning inte är möjlig kan du %1$s använda loggfilsanalys %2$s som en alternativ metod för att spåra webbplatsens användare.",
3461
  "MainDescription": "Dina rapporter kräver att du har webbplatser upplagda! Lägg till, uppdatera, ta bort webbplatser, och visa JavaScript spårningskoden för att inkludera den på din webbplats.",
app/lang/tl.json CHANGED
@@ -781,7 +781,7 @@
781
  "TV": "Tv",
782
  "UserAgent": "User-Agent",
783
  "WidgetBrowsers": "Browser ng Bisita",
784
- "WidgetBrowsersDocumentation": "Ang ulat na ito ay naglalaman ng mga impormasyon tungkol sa kung anong browser ang gamit ng iyong bisita. Bawat browser bersyon ay magkakahiwalay na naka-lista."
785
  },
786
  "Events": {
787
  "AvgEventValue": "Average na value ng event ay: %s",
781
  "TV": "Tv",
782
  "UserAgent": "User-Agent",
783
  "WidgetBrowsers": "Browser ng Bisita",
784
+ "WidgetBrowserVersionsDocumentation": "Ang ulat na ito ay naglalaman ng mga impormasyon tungkol sa kung anong browser ang gamit ng iyong bisita. Bawat browser bersyon ay magkakahiwalay na naka-lista."
785
  },
786
  "Events": {
787
  "AvgEventValue": "Average na value ng event ay: %s",
app/lang/tr.json CHANGED
@@ -909,6 +909,7 @@
909
  "DataTableHowToSearch": "Arama yapmak için enter tuşuna basın ya da arama simgesine tıklayın",
910
  "DataTableShowDimensions": "Boyutlar birleştirildi %s Boyutları ayırarak görüntüle",
911
  "DataTableCombineDimensions": "Boyutlar ayrı görüntüleniyor %s Boyutları birleştirerek görüntüle",
 
912
  "Default": "varsayılan",
913
  "DonateCall1": "Matomo her zaman ücretsiz kullanılabilecek ancak bu durum geliştirmenin ücretsiz olduğu anlamına gelmiyor.",
914
  "DonateCall2": "Gelişip ilerleyebilmesi için Matomo projesi sürekli desteğinize gerek duyuyor.",
@@ -1361,7 +1362,7 @@
1361
  "XVisitsFromDevices": "%2$s aygıttan %1$s ziyaret",
1362
  "Wearable": "Giyilebilir",
1363
  "WidgetBrowsers": "Ziyaretçi Tarayıcısı",
1364
- "WidgetBrowsersDocumentation": "Bu rapor ziyaretçilerinizin kullandığı tarayıcı türlerini kapsar. Tarayıcı sürümleri ayrı ayrı listelenmiştir."
1365
  },
1366
  "Diagnostics": {
1367
  "ConfigFileTitle": "Ayar Dosyası",
@@ -3742,7 +3743,6 @@
3742
  "KeepURLFragmentsLong": "Sayfa adresleri izlenirken sayfa adresi bölünmeleri korunsun",
3743
  "ListOfIpsToBeExcludedOnAllWebsites": "Aşağıdaki IP adresi hiç bir web sitesinde izlenmeyecek.",
3744
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Aşağıdaki sorgu adresi parametreleri hiç bir web sitesinde izlenmeyecek.",
3745
- "ListOfQueryParametersToExclude": "Sayfa adresi raporlarına katılmayacak sorgu adresi parametrelerini ayrı satırlara yazın. %s gibi kurallı ifadeler desteklenir.",
3746
  "LogAnalytics": "Günlük İstatistikleri",
3747
  "LogAnalyticsDescription": "JavaScript izleme yöntemi kullanılamıyorsa, web sitesine gelen kullanıcıları izlemek için alternatif olarak %1$ssunucu günlüğü istatistiklerini%2$s kullanabilirsiniz.",
3748
  "MainDescription": "Web istatistik raporlarının oluşturulabilmesi için web sitelerinin tanımlanması gerekir. Web sitesi ekleme, güncelleme, kaldırma ve sayfalarınıza eklenecek JavaScript Kodu işlemleri bu bölümden yapılabilir.",
909
  "DataTableHowToSearch": "Arama yapmak için enter tuşuna basın ya da arama simgesine tıklayın",
910
  "DataTableShowDimensions": "Boyutlar birleştirildi %s Boyutları ayırarak görüntüle",
911
  "DataTableCombineDimensions": "Boyutlar ayrı görüntüleniyor %s Boyutları birleştirerek görüntüle",
912
+ "DateInvalid": "Belirtilen tarih ve sıklık kambinasyonu geçersiz. Lütfen tarih seçicisinden geçerli bir tarih seçin.",
913
  "Default": "varsayılan",
914
  "DonateCall1": "Matomo her zaman ücretsiz kullanılabilecek ancak bu durum geliştirmenin ücretsiz olduğu anlamına gelmiyor.",
915
  "DonateCall2": "Gelişip ilerleyebilmesi için Matomo projesi sürekli desteğinize gerek duyuyor.",
1362
  "XVisitsFromDevices": "%2$s aygıttan %1$s ziyaret",
1363
  "Wearable": "Giyilebilir",
1364
  "WidgetBrowsers": "Ziyaretçi Tarayıcısı",
1365
+ "WidgetBrowserVersionsDocumentation": "Bu rapor ziyaretçilerinizin kullandığı tarayıcı türlerini kapsar. Tarayıcı sürümleri ayrı ayrı listelenmiştir."
1366
  },
1367
  "Diagnostics": {
1368
  "ConfigFileTitle": "Ayar Dosyası",
3743
  "KeepURLFragmentsLong": "Sayfa adresleri izlenirken sayfa adresi bölünmeleri korunsun",
3744
  "ListOfIpsToBeExcludedOnAllWebsites": "Aşağıdaki IP adresi hiç bir web sitesinde izlenmeyecek.",
3745
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Aşağıdaki sorgu adresi parametreleri hiç bir web sitesinde izlenmeyecek.",
 
3746
  "LogAnalytics": "Günlük İstatistikleri",
3747
  "LogAnalyticsDescription": "JavaScript izleme yöntemi kullanılamıyorsa, web sitesine gelen kullanıcıları izlemek için alternatif olarak %1$ssunucu günlüğü istatistiklerini%2$s kullanabilirsiniz.",
3748
  "MainDescription": "Web istatistik raporlarının oluşturulabilmesi için web sitelerinin tanımlanması gerekir. Web sitesi ekleme, güncelleme, kaldırma ve sayfalarınıza eklenecek JavaScript Kodu işlemleri bu bölümden yapılabilir.",
app/lang/uk.json CHANGED
@@ -1225,7 +1225,7 @@
1225
  "MobileApp": "Мобільний Додаток",
1226
  "XVisitsFromDevices": "%1$s візитів з %2$s пристроїв",
1227
  "WidgetBrowsers": "Браузери відвідувачів",
1228
- "WidgetBrowsersDocumentation": "Цей звіт містить інформацію по браузерам, які використовують ваші відвідувачі. Кожна версія браузера відображається окремо."
1229
  },
1230
  "Diagnostics": {
1231
  "ConfigFileTitle": "Файл конфігурації",
@@ -3128,7 +3128,6 @@
3128
  "KeepURLFragmentsLong": "Зберігати додаткові фрагменти url при відстеженні сторінок",
3129
  "ListOfIpsToBeExcludedOnAllWebsites": "IP адреси нижче будуть виключені з статистики і не будуть враховуватися при зборі даних на всіх сайтах.",
3130
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Запити URL-параметрів нижче будуть виключені і не будуть враховуватися при зборі статистики на всіх сайтах.",
3131
- "ListOfQueryParametersToExclude": "Введіть список параметрів запиту URL, по одному в кожному рядку, щоб виключити зі звітів URL сторінки. Регулярні вирази, такі як %s підтримуються.",
3132
  "LogAnalytics": "Журнал анлітики",
3133
  "MainDescription": "Для ведення статистики потрібно додати сайти. Додавайте, оновлюйте, видаляйте інформацію про сайти, а також перегляньте JavaScript-код для вставки на ваші сторінки.",
3134
  "MenuManage": "Управління",
1225
  "MobileApp": "Мобільний Додаток",
1226
  "XVisitsFromDevices": "%1$s візитів з %2$s пристроїв",
1227
  "WidgetBrowsers": "Браузери відвідувачів",
1228
+ "WidgetBrowserVersionsDocumentation": "Цей звіт містить інформацію по браузерам, які використовують ваші відвідувачі. Кожна версія браузера відображається окремо."
1229
  },
1230
  "Diagnostics": {
1231
  "ConfigFileTitle": "Файл конфігурації",
3128
  "KeepURLFragmentsLong": "Зберігати додаткові фрагменти url при відстеженні сторінок",
3129
  "ListOfIpsToBeExcludedOnAllWebsites": "IP адреси нижче будуть виключені з статистики і не будуть враховуватися при зборі даних на всіх сайтах.",
3130
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "Запити URL-параметрів нижче будуть виключені і не будуть враховуватися при зборі статистики на всіх сайтах.",
 
3131
  "LogAnalytics": "Журнал анлітики",
3132
  "MainDescription": "Для ведення статистики потрібно додати сайти. Додавайте, оновлюйте, видаляйте інформацію про сайти, а також перегляньте JavaScript-код для вставки на ваші сторінки.",
3133
  "MenuManage": "Управління",
app/lang/vi.json CHANGED
@@ -871,7 +871,7 @@
871
  "OperatingSystemFamily": "Hệ điều hành gia đình",
872
  "OperatingSystems": "Các hệ điều hành",
873
  "WidgetBrowsers": "Trình duyệt khách truy cập",
874
- "WidgetBrowsersDocumentation": "Báo cáo này chứa thông tin về loại trình duyệt mà khách truy cập của bạn sử dụng. Mỗi phiên bản trình duyệt được liệt kê một cách riêng biệt."
875
  },
876
  "Diagnostics": {
877
  "ConfigFileTitle": "Tập tin cấu hình",
871
  "OperatingSystemFamily": "Hệ điều hành gia đình",
872
  "OperatingSystems": "Các hệ điều hành",
873
  "WidgetBrowsers": "Trình duyệt khách truy cập",
874
+ "WidgetBrowserVersionsDocumentation": "Báo cáo này chứa thông tin về loại trình duyệt mà khách truy cập của bạn sử dụng. Mỗi phiên bản trình duyệt được liệt kê một cách riêng biệt."
875
  },
876
  "Diagnostics": {
877
  "ConfigFileTitle": "Tập tin cấu hình",
app/lang/zh-cn.json CHANGED
@@ -1359,7 +1359,7 @@
1359
  "XVisitsFromDevices": "来自%2$s设备的%1$s次访问",
1360
  "Wearable": "适合的",
1361
  "WidgetBrowsers": "访客浏览器",
1362
- "WidgetBrowsersDocumentation": "此报表包含访客所用的浏览器信息,每个浏览器版本单独列出。"
1363
  },
1364
  "Diagnostics": {
1365
  "ConfigFileTitle": "配置文件",
@@ -3731,7 +3731,6 @@
3731
  "KeepURLFragmentsLong": "跟踪网址时保留网址标签",
3732
  "ListOfIpsToBeExcludedOnAllWebsites": "以下的IP地址将被排除在所有网站统计外。",
3733
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "以下的网址查询参数将会被所有网站忽略。",
3734
- "ListOfQueryParametersToExclude": "请输入URL查询参数的列表,一行一个,这些URL将被排除在页面报告之外。像%s的正则表达式也是支持的。",
3735
  "LogAnalytics": "日志分析",
3736
  "LogAnalyticsDescription": "如果无法使用Javascript跟踪方法,则可以%1$s使用服务器日志分析%2$s作为跟踪网站用户的另一种方法。",
3737
  "MainDescription": "使用网站分析报表功能,必须有网站!在这里添加、修改、删除网站,或者显示需要加入页面代码里的 Javascript 跟踪代码。",
1359
  "XVisitsFromDevices": "来自%2$s设备的%1$s次访问",
1360
  "Wearable": "适合的",
1361
  "WidgetBrowsers": "访客浏览器",
1362
+ "WidgetBrowserVersionsDocumentation": "此报表包含访客所用的浏览器信息,每个浏览器版本单独列出。"
1363
  },
1364
  "Diagnostics": {
1365
  "ConfigFileTitle": "配置文件",
3731
  "KeepURLFragmentsLong": "跟踪网址时保留网址标签",
3732
  "ListOfIpsToBeExcludedOnAllWebsites": "以下的IP地址将被排除在所有网站统计外。",
3733
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "以下的网址查询参数将会被所有网站忽略。",
 
3734
  "LogAnalytics": "日志分析",
3735
  "LogAnalyticsDescription": "如果无法使用Javascript跟踪方法,则可以%1$s使用服务器日志分析%2$s作为跟踪网站用户的另一种方法。",
3736
  "MainDescription": "使用网站分析报表功能,必须有网站!在这里添加、修改、删除网站,或者显示需要加入页面代码里的 Javascript 跟踪代码。",
app/lang/zh-tw.json CHANGED
@@ -693,7 +693,7 @@
693
  "SubmenuPagesEntry": "到達網頁",
694
  "SubmenuPagesExit": "離站網頁",
695
  "SubmenuPageTitles": "網頁標題",
696
- "SubmenuSitesearch": "搜尋網站",
697
  "WidgetEntryPageTitles": "到達網頁標題",
698
  "WidgetExitPageTitles": "離站網頁標題",
699
  "WidgetPagesEntry": "到達網頁",
@@ -905,6 +905,7 @@
905
  "DataTableHowToSearch": "按下 Enter 鍵或點擊搜尋圖示來搜尋",
906
  "DataTableShowDimensions": "目前顯示綜合的維度 %s 分別顯示各個維度",
907
  "DataTableCombineDimensions": "目前顯示個別的維度 %s 顯示綜合的維度",
 
908
  "Default": "預設",
909
  "DonateCall1": "使用 Matomo 永遠不花你任何一毛錢,但那不表示我們開發不需要花到半毛錢。",
910
  "DonateCall2": "Matomo 需要你的持續支持以成長茁壯。",
@@ -912,6 +913,7 @@
912
  "EndShortcut": "End 鍵",
913
  "EnterZenMode": "進入勿擾模式(隱藏選單)",
914
  "ExitZenMode": "離開勿擾模式(顯示選單)",
 
915
  "ExcludeRowsWithLowPopulation": "已顯示所有列 %s 排除較低人數",
916
  "ExternalHelp": "幫助(在新分頁中開啟)",
917
  "FlattenDataTable": "報表目前已分層 %s 平面化顯示",
@@ -970,6 +972,8 @@
970
  "PivotBySubtable": "此報表尚未圖形化 %1$s 以 %2$s 圖形化",
971
  "SystemSummaryWidget": "系統摘要",
972
  "SystemSummaryNWebsites": "%d 個網站",
 
 
973
  "SystemSummaryNActivatedPlugins": "%d 個外掛已啟用",
974
  "SystemSummaryPiwikVersion": "Matomo 版本",
975
  "SystemSummaryMysqlVersion": "MySQL 版本",
@@ -1341,6 +1345,7 @@
1341
  "GenericDevice": "通用 %s",
1342
  "MobileDevice": "行動裝置",
1343
  "Tablet": "平板電腦",
 
1344
  "Phablet": "平板手機",
1345
  "TV": "電視",
1346
  "UserAgent": "User Agent",
@@ -1352,7 +1357,7 @@
1352
  "XVisitsFromDevices": "來自%2$s裝置的%1$s個訪問數",
1353
  "Wearable": "穿戴式裝置",
1354
  "WidgetBrowsers": "訪客瀏覽器",
1355
- "WidgetBrowsersDocumentation": "這份報表包含訪客所使用的瀏覽器資訊。每個瀏覽器的版本都會分開排列。"
1356
  },
1357
  "Diagnostics": {
1358
  "ConfigFileTitle": "設定檔",
@@ -1752,6 +1757,7 @@
1752
  "SystemCheckGzuncompressHelp": "你必須啟用 zlib 擴充功能和 gzuncompress 功能。",
1753
  "SystemCheckHashHelp": "你必須配置並重建 PHP 經由執行 --disable-hash 選項來啟用 hash() 支援。",
1754
  "SystemCheckIconvHelp": "你需要設定及重建 PHP,然後啟用 iconv 支援,--with-iconv。",
 
1755
  "SystemCheckMailHelp": "意見回饋及忘記密碼的訊息若沒有 mail() 將無法寄送。",
1756
  "SystemCheckMbstring": "mbstring",
1757
  "SystemCheckMbstringHelp": "處理多字節的使用者介面或 API 回應資料必須使用 mbstring 擴充功能。並請檢查 php.ini 中的 mbstring.func_overload 已將值設定為「0」。",
@@ -1787,6 +1793,8 @@
1787
  "SystemCheckWriteDirs": "具寫入存取權限的資料夾",
1788
  "SystemCheckWriteDirsHelp": "要在你的 GNU\/Linux 系統修正這個錯誤,嘗試輸入以下指令",
1789
  "SystemCheckZlibHelp": "你需要設定及重建 PHP,然後啟用 zlib 支援,--with-zlib。",
 
 
1790
  "SystemCheckCronArchiveProcessCLI": "透過 CLI 管理程序",
1791
  "SystemCheckPhpSetting": "要預防一些嚴重問題,你必須變更 php.ini 檔案中的以下設定:%s",
1792
  "SystemCheckUpdateHttps": "透過 HTTPS 更新",
@@ -1808,7 +1816,9 @@
1808
  "WelcomeToCommunity": "歡迎來到 Matomo 社區!",
1809
  "CannotConnectToDb": "無法連接資料庫",
1810
  "CannotConnectToDbResolvingExplanation": "這可能是暫時性的問題,試試%1$s重新整理頁面%2$s。如果問題持續發生請聯絡你的 Matomo 管理員。",
1811
- "EmailPrivacyNotice": "你的 Email 將只用於向你寄送電子報,為此我們需要分享你的 Email 給第三方供應商。此供應商目前是 Mad Mimi,但是未來有可能變更。我們不會透漏你的 Email 給其他人,或將你的 Email 用於電子報以外的其他用途。你隨時可以取消訂閱。參考我們的%1$s隱私權政策%2$s以取得更多資訊。"
 
 
1812
  },
1813
  "Intl": {
1814
  "Continent_afr": "非洲",
@@ -2948,6 +2958,7 @@
2948
  "LastHours": "最近 %s 小時",
2949
  "LastMinutes": "最近 %s 分鐘",
2950
  "LastVisit": "最後訪問",
 
2951
  "LoadMoreVisits": "載入更多訪客",
2952
  "LimitedSummary": "這份資料內的資訊概括過去 %1$s 次訪問。這個使用者擁有更多訪問次數。",
2953
  "LimitedVisitsShown": "只顯示過去 %1$s 次訪問。這個使用者擁有更多訪問次數。",
@@ -2966,11 +2977,15 @@
2966
  "ActionsAndDuration": "%2$s內 %1$s 個活動數",
2967
  "SimpleRealTimeWidget_Message": "%1$s 和 %2$s 在過去 %3$s",
2968
  "ViewVisitorProfile": "查看訪客資料",
 
 
2969
  "VisitedPages": "到達網頁",
2970
  "RevisitedPages": "網頁瀏覽數超過一次",
2971
  "ToggleActions": "切換所有活動的顯示狀態",
2972
  "TopVisitedPages": "熱門訪問網頁",
2973
  "VisitsLog": "訪客紀錄",
 
 
2974
  "QueryMaxExecutionTimeExceeded": "查詢花了太久時間。",
2975
  "QueryMaxExecutionTimeExceededReasonDateRange": "如果日期間距太長,可能會發生這種問題。請嘗試選擇較小的日期間距。",
2976
  "QueryMaxExecutionTimeExceededReasonSegment": "如果區隔內沒有任何訪問記錄,可能會發生這種問題。請嘗試修正你選擇的區隔。",
@@ -3043,6 +3058,9 @@
3043
  "AddToCart": "加到購物車",
3044
  "AllowedUploadFormats": "你可以在這個頁面上上傳 .zip 格式的外掛或主題。",
3045
  "Authors": "作者",
 
 
 
3046
  "BackToMarketplace": "回到市集",
3047
  "BrowseMarketplace": "瀏覽市集",
3048
  "ByXDevelopers": "來自 %s 位開發人員",
@@ -3053,6 +3071,7 @@
3053
  "ConfirmRemoveLicense": "你確定要移除註冊碼嗎?你將無法再收到任何你已購買外掛的更新。",
3054
  "Developer": "開發人員",
3055
  "DevelopersLearnHowToDevelopPlugins": "開發人員:了解如何透過%1$s開發外掛和主題%2$s來擴展和自訂 Matomo。",
 
3056
  "Marketplace": "市集",
3057
  "PaidPlugins": "高級功能",
3058
  "FeaturedPlugin": "特色外掛",
@@ -3223,14 +3242,29 @@
3223
  "AnonymizeIpInlineHelp": "隱藏訪客 IP 地址最後的字節以符合你本地隱私權法規\/政策。",
3224
  "AnonymizeIpMaskLengtDescription": "選擇要隱藏多少字節的 IP 位址。",
3225
  "AnonymizeIpMaskLength": "%1$s 字節,例如 %2$s",
 
 
3226
  "AskingForConsent": "要求同意",
3227
  "ConsentExplanation": "「要求同意」意謂提供每個人關於他們的個人資料將會如何處理和控制的選項。",
3228
  "ClickHereSettings": "點擊這裡查看 %s 設定。",
3229
  "WhenDoINeedConsent": "我該何時要求使用者同意?",
3230
  "HowDoIAskForConsent": "我該如何要求使用者同意?",
 
 
 
 
 
 
 
 
 
3231
  "AnonymizeUserId": "以假名取代使用者 ID",
3232
  "AnonymizeProcessInfo": "此動作可能會需要很長一段時間,且不會立即完成。你可以在下方查看目前的進度。匿名化工作通常能在一小時內完成。",
3233
  "AnonymizeDataNow": "匿名化選中網站與時間的歷史資料",
 
 
 
 
3234
  "CurrentDBSize": "目前資料庫大小",
3235
  "DBPurged": "資料庫已清理。",
3236
  "DeleteBothConfirm": "你將啟用原始資料刪除和報表刪除功能。這將永久刪除舊資料,你將無法再查看舊有分析資料。確定要繼續嗎?",
@@ -3259,6 +3293,7 @@
3259
  "DoNotTrack_SupportDNTPreference": "支援不追蹤(Do Not Track)設定",
3260
  "EstimatedDBSizeAfterPurge": "清理後資料庫預估大小",
3261
  "EstimatedSpaceSaved": "預估節省空間",
 
3262
  "GeolocationAnonymizeIpNote": "注意:選擇 1 字節時地理位置將會顯示與實際位置大略相同的結果。選擇 2 字節或以上,地理位置可能會不準確。",
3263
  "GDPR": "GDPR",
3264
  "GdprManager": "GDPR 管理",
@@ -3438,6 +3473,7 @@
3438
  "Segment_Deletion_Error": "這個區隔不能對其他使用者刪除或隱藏,因為他已經用於建立報表信件 %s。請先將區隔從報表中移除後再重試。",
3439
  "Segment_Help": "你可以選擇一個現有的自訂區隔來套用到此報表信件上。你可以在展示版中%1$s(點此開啟)%2$s建立或編輯自定區隔,並點擊「%3$s」按鈕後,選擇「%4$s」。",
3440
  "SegmentAppliedToReports": "區隔「%s」已套用至報表。",
 
3441
  "SendReportNow": "立即寄送報表",
3442
  "SendReportTo": "寄送報表至",
3443
  "SentToMe": "寄給我自己",
@@ -3455,7 +3491,9 @@
3455
  "NoTokenProvided": "網址內沒有提供 token。",
3456
  "NoSubscriptionFound": "沒有任何訂閱項目。可能報表已經取消訂閱或是刪除。",
3457
  "EvolutionGraphsShowForEachInPeriod": "顯示上一%3$s%1$s每日%2$s的發展趨勢圖表",
3458
- "EvolutionGraphsShowForPreviousN": "顯示過去 N %s的發展趨勢圖表"
 
 
3459
  },
3460
  "SegmentEditor": {
3461
  "AddANDorORCondition": "增加【%s】條件",
@@ -3537,7 +3575,6 @@
3537
  "KeepURLFragmentsLong": "追蹤網頁網址時保留網頁網址片段",
3538
  "ListOfIpsToBeExcludedOnAllWebsites": "以下的 IP 位址將會被所有網站排除。",
3539
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "以下的網址查詢參數將會被所有網站排除。",
3540
- "ListOfQueryParametersToExclude": "輸入網址查詢參數列表,一行一個,將從網頁網址報表中被排除。支援正規表示式如 %s。",
3541
  "LogAnalytics": "紀錄檔分析",
3542
  "LogAnalyticsDescription": "如果無法使用 Javascript 來追蹤,你可以改用%1$s伺服器紀錄檔追蹤%2$s的方式來追蹤你的網站使用者。",
3543
  "MainDescription": "你需要網站來查看網頁分析報表!新增、更新或刪除網站,並取得 JavaScript 追蹤程式碼插入在你的網頁之中。",
693
  "SubmenuPagesEntry": "到達網頁",
694
  "SubmenuPagesExit": "離站網頁",
695
  "SubmenuPageTitles": "網頁標題",
696
+ "SubmenuSitesearch": "站內搜尋",
697
  "WidgetEntryPageTitles": "到達網頁標題",
698
  "WidgetExitPageTitles": "離站網頁標題",
699
  "WidgetPagesEntry": "到達網頁",
905
  "DataTableHowToSearch": "按下 Enter 鍵或點擊搜尋圖示來搜尋",
906
  "DataTableShowDimensions": "目前顯示綜合的維度 %s 分別顯示各個維度",
907
  "DataTableCombineDimensions": "目前顯示個別的維度 %s 顯示綜合的維度",
908
+ "DateInvalid": "指定的日期與期間組合無效。請至日期工具內選擇另一個有效的日期。",
909
  "Default": "預設",
910
  "DonateCall1": "使用 Matomo 永遠不花你任何一毛錢,但那不表示我們開發不需要花到半毛錢。",
911
  "DonateCall2": "Matomo 需要你的持續支持以成長茁壯。",
913
  "EndShortcut": "End 鍵",
914
  "EnterZenMode": "進入勿擾模式(隱藏選單)",
915
  "ExitZenMode": "離開勿擾模式(顯示選單)",
916
+ "ExceptionNotAllowlistedIP": "你無法使用這個 Matomo,因為你的 IP %s 不在白名單內。",
917
  "ExcludeRowsWithLowPopulation": "已顯示所有列 %s 排除較低人數",
918
  "ExternalHelp": "幫助(在新分頁中開啟)",
919
  "FlattenDataTable": "報表目前已分層 %s 平面化顯示",
972
  "PivotBySubtable": "此報表尚未圖形化 %1$s 以 %2$s 圖形化",
973
  "SystemSummaryWidget": "系統摘要",
974
  "SystemSummaryNWebsites": "%d 個網站",
975
+ "SystemSummaryNSegments": "%1$d 個區隔",
976
+ "SystemSummaryNSegmentsWithBreakdown": "%1$d 個區隔 (已預先處理 %2$s 個,即時處理 %3$s 個)",
977
  "SystemSummaryNActivatedPlugins": "%d 個外掛已啟用",
978
  "SystemSummaryPiwikVersion": "Matomo 版本",
979
  "SystemSummaryMysqlVersion": "MySQL 版本",
1345
  "GenericDevice": "通用 %s",
1346
  "MobileDevice": "行動裝置",
1347
  "Tablet": "平板電腦",
1348
+ "Peripheral": "周邊設備",
1349
  "Phablet": "平板手機",
1350
  "TV": "電視",
1351
  "UserAgent": "User Agent",
1357
  "XVisitsFromDevices": "來自%2$s裝置的%1$s個訪問數",
1358
  "Wearable": "穿戴式裝置",
1359
  "WidgetBrowsers": "訪客瀏覽器",
1360
+ "WidgetBrowserVersionsDocumentation": "這份報表包含訪客所使用的瀏覽器資訊。每個瀏覽器的版本都會分開排列。"
1361
  },
1362
  "Diagnostics": {
1363
  "ConfigFileTitle": "設定檔",
1757
  "SystemCheckGzuncompressHelp": "你必須啟用 zlib 擴充功能和 gzuncompress 功能。",
1758
  "SystemCheckHashHelp": "你必須配置並重建 PHP 經由執行 --disable-hash 選項來啟用 hash() 支援。",
1759
  "SystemCheckIconvHelp": "你需要設定及重建 PHP,然後啟用 iconv 支援,--with-iconv。",
1760
+ "SystemCheckJsonHelp": "Matomo 必須使用 php-json 擴充功能來讀寫 JSON 資料。",
1761
  "SystemCheckMailHelp": "意見回饋及忘記密碼的訊息若沒有 mail() 將無法寄送。",
1762
  "SystemCheckMbstring": "mbstring",
1763
  "SystemCheckMbstringHelp": "處理多字節的使用者介面或 API 回應資料必須使用 mbstring 擴充功能。並請檢查 php.ini 中的 mbstring.func_overload 已將值設定為「0」。",
1793
  "SystemCheckWriteDirs": "具寫入存取權限的資料夾",
1794
  "SystemCheckWriteDirsHelp": "要在你的 GNU\/Linux 系統修正這個錯誤,嘗試輸入以下指令",
1795
  "SystemCheckZlibHelp": "你需要設定及重建 PHP,然後啟用 zlib 支援,--with-zlib。",
1796
+ "SystemCheckCronArchiveProcess": "建立工作排程",
1797
+ "FasterReportLoading": "加速報告載入",
1798
  "SystemCheckCronArchiveProcessCLI": "透過 CLI 管理程序",
1799
  "SystemCheckPhpSetting": "要預防一些嚴重問題,你必須變更 php.ini 檔案中的以下設定:%s",
1800
  "SystemCheckUpdateHttps": "透過 HTTPS 更新",
1816
  "WelcomeToCommunity": "歡迎來到 Matomo 社區!",
1817
  "CannotConnectToDb": "無法連接資料庫",
1818
  "CannotConnectToDbResolvingExplanation": "這可能是暫時性的問題,試試%1$s重新整理頁面%2$s。如果問題持續發生請聯絡你的 Matomo 管理員。",
1819
+ "EmailPrivacyNotice": "你的 Email 將只用於向你寄送電子報,為此我們需要分享你的 Email 給第三方供應商。此供應商目前是 Mad Mimi,但是未來有可能變更。我們不會透漏你的 Email 給其他人,或將你的 Email 用於電子報以外的其他用途。你隨時可以取消訂閱。參考我們的%1$s隱私權政策%2$s以取得更多資訊。",
1820
+ "PerformanceSettingsDesc1": "有關效能的最終提示:你的 Matomo 已經安裝完成,且準備好追蹤、報告你的網站活動;若你覺得 Matomo 效能不彰,你可以額外準備 %1$sCLI 彙整指令%2$s。此功能不會幫你即時產生報表,而是於背景定時執行。",
1821
+ "PerformanceSettingsDesc2": "安裝程式無法幫你自動增加 Matomo 指令到工作排程器,但是你能 %1$s閱讀我們的 FAQ 來瞭解如何自己設定。%2$s"
1822
  },
1823
  "Intl": {
1824
  "Continent_afr": "非洲",
2958
  "LastHours": "最近 %s 小時",
2959
  "LastMinutes": "最近 %s 分鐘",
2960
  "LastVisit": "最後訪問",
2961
+ "LinkVisitorLog": "檢視詳細訪客紀錄",
2962
  "LoadMoreVisits": "載入更多訪客",
2963
  "LimitedSummary": "這份資料內的資訊概括過去 %1$s 次訪問。這個使用者擁有更多訪問次數。",
2964
  "LimitedVisitsShown": "只顯示過去 %1$s 次訪問。這個使用者擁有更多訪問次數。",
2977
  "ActionsAndDuration": "%2$s內 %1$s 個活動數",
2978
  "SimpleRealTimeWidget_Message": "%1$s 和 %2$s 在過去 %3$s",
2979
  "ViewVisitorProfile": "查看訪客資料",
2980
+ "DisableVisitorProfile": "僅關閉訪客個人資料",
2981
+ "DisableVisitorProfileDescription": "你可以關閉訪客個人檔案功能。所有有關訪客紀錄的功能仍可以正常運作。",
2982
  "VisitedPages": "到達網頁",
2983
  "RevisitedPages": "網頁瀏覽數超過一次",
2984
  "ToggleActions": "切換所有活動的顯示狀態",
2985
  "TopVisitedPages": "熱門訪問網頁",
2986
  "VisitsLog": "訪客紀錄",
2987
+ "DisableVisitsLogAndProfile": "關閉訪客紀錄與個人資料",
2988
+ "DisableVisitsLogAndProfileDescription": "你可以關閉訪客紀錄與個人檔案功能。這麼做也會關閉相關的功能,例如電子商務紀錄、訪客區隔紀錄、即時地圖、即時小工具。用以遵守你的本地個資法規。",
2989
  "QueryMaxExecutionTimeExceeded": "查詢花了太久時間。",
2990
  "QueryMaxExecutionTimeExceededReasonDateRange": "如果日期間距太長,可能會發生這種問題。請嘗試選擇較小的日期間距。",
2991
  "QueryMaxExecutionTimeExceededReasonSegment": "如果區隔內沒有任何訪問記錄,可能會發生這種問題。請嘗試修正你選擇的區隔。",
3058
  "AddToCart": "加到購物車",
3059
  "AllowedUploadFormats": "你可以在這個頁面上上傳 .zip 格式的外掛或主題。",
3060
  "Authors": "作者",
3061
+ "Browse": "瀏覽",
3062
+ "SupportMatomoThankYou": "任何購買都有助於 Matomo 開源專案的未來。感謝你的支持!",
3063
+ "LatestMarketplaceUpdates": "市集最新消息",
3064
  "BackToMarketplace": "回到市集",
3065
  "BrowseMarketplace": "瀏覽市集",
3066
  "ByXDevelopers": "來自 %s 位開發人員",
3071
  "ConfirmRemoveLicense": "你確定要移除註冊碼嗎?你將無法再收到任何你已購買外掛的更新。",
3072
  "Developer": "開發人員",
3073
  "DevelopersLearnHowToDevelopPlugins": "開發人員:了解如何透過%1$s開發外掛和主題%2$s來擴展和自訂 Matomo。",
3074
+ "NoticeRemoveMarketplaceFromReportingMenu": "欲從報表選單移除市集選項,你可以安裝 %1$sWhite Labe%2$s 外掛。",
3075
  "Marketplace": "市集",
3076
  "PaidPlugins": "高級功能",
3077
  "FeaturedPlugin": "特色外掛",
3242
  "AnonymizeIpInlineHelp": "隱藏訪客 IP 地址最後的字節以符合你本地隱私權法規\/政策。",
3243
  "AnonymizeIpMaskLengtDescription": "選擇要隱藏多少字節的 IP 位址。",
3244
  "AnonymizeIpMaskLength": "%1$s 字節,例如 %2$s",
3245
+ "AnonymizeIpMaskFully": "完全隱藏 IP 位址",
3246
+ "AnonymizeReferrer": "參照連結匿名化",
3247
  "AskingForConsent": "要求同意",
3248
  "ConsentExplanation": "「要求同意」意謂提供每個人關於他們的個人資料將會如何處理和控制的選項。",
3249
  "ClickHereSettings": "點擊這裡查看 %s 設定。",
3250
  "WhenDoINeedConsent": "我該何時要求使用者同意?",
3251
  "HowDoIAskForConsent": "我該如何要求使用者同意?",
3252
+ "AnonymizeSites": "匿名化站台的資料",
3253
+ "AnonymizeRowDataFrom": "匿名化所有原始資料由:",
3254
+ "AnonymizeRowDataTo": "匿名化所有原始資料至:",
3255
+ "AnonymizeReferrerExcludeNone": "不要匿名化參照連結",
3256
+ "AnonymizeReferrerExcludeQuery": "從參照連結移除參數",
3257
+ "AnonymizeReferrerExcludePath": "僅保留參照連結 URL 內的網域名稱",
3258
+ "AnonymizeReferrerExcludeAll": "不儲存參照連結,但仍會偵測參照連結的種類",
3259
+ "AnonymizeIp": "IP 匿名化",
3260
+ "AnonymizeLocation": "地理位置匿名化",
3261
  "AnonymizeUserId": "以假名取代使用者 ID",
3262
  "AnonymizeProcessInfo": "此動作可能會需要很長一段時間,且不會立即完成。你可以在下方查看目前的進度。匿名化工作通常能在一小時內完成。",
3263
  "AnonymizeDataNow": "匿名化選中網站與時間的歷史資料",
3264
+ "UnsetVisitColumns": "消除訪問欄位",
3265
+ "UnsetVisitColumnsHelp": "此動作無法還原。在訪問選單中選擇你想要消除資料的資料庫欄位,每個選中的欄位將會被設為預設值。請注意:若同一欄位出現於 「轉換目標」,該欄位也將會被刪除。",
3266
+ "UnsetActionColumns": "消除活動欄位",
3267
+ "UnsetActionColumnsHelp": "此動作無法還原。在活動選單中選擇你想要消除資料的資料庫欄位,每個選中的欄位將會被設為預設值。",
3268
  "CurrentDBSize": "目前資料庫大小",
3269
  "DBPurged": "資料庫已清理。",
3270
  "DeleteBothConfirm": "你將啟用原始資料刪除和報表刪除功能。這將永久刪除舊資料,你將無法再查看舊有分析資料。確定要繼續嗎?",
3293
  "DoNotTrack_SupportDNTPreference": "支援不追蹤(Do Not Track)設定",
3294
  "EstimatedDBSizeAfterPurge": "清理後資料庫預估大小",
3295
  "EstimatedSpaceSaved": "預估節省空間",
3296
+ "ForceCookielessTracking": "強制不使用 Cookie 追蹤",
3297
  "GeolocationAnonymizeIpNote": "注意:選擇 1 字節時地理位置將會顯示與實際位置大略相同的結果。選擇 2 字節或以上,地理位置可能會不準確。",
3298
  "GDPR": "GDPR",
3299
  "GdprManager": "GDPR 管理",
3473
  "Segment_Deletion_Error": "這個區隔不能對其他使用者刪除或隱藏,因為他已經用於建立報表信件 %s。請先將區隔從報表中移除後再重試。",
3474
  "Segment_Help": "你可以選擇一個現有的自訂區隔來套用到此報表信件上。你可以在展示版中%1$s(點此開啟)%2$s建立或編輯自定區隔,並點擊「%3$s」按鈕後,選擇「%4$s」。",
3475
  "SegmentAppliedToReports": "區隔「%s」已套用至報表。",
3476
+ "SegmentDeleted": "區隔刪除",
3477
  "SendReportNow": "立即寄送報表",
3478
  "SendReportTo": "寄送報表至",
3479
  "SentToMe": "寄給我自己",
3491
  "NoTokenProvided": "網址內沒有提供 token。",
3492
  "NoSubscriptionFound": "沒有任何訂閱項目。可能報表已經取消訂閱或是刪除。",
3493
  "EvolutionGraphsShowForEachInPeriod": "顯示上一%3$s%1$s每日%2$s的發展趨勢圖表",
3494
+ "EvolutionGraphsShowForPreviousN": "顯示過去 N %s的發展趨勢圖表",
3495
+ "ReportPeriod": "報告間隔",
3496
+ "ReportPeriodHelp": "此報表內資料涵蓋的間隔。預設值會跟 Email 的間隔一樣,因此每周寄送的報告會包含上周產生的資訊。"
3497
  },
3498
  "SegmentEditor": {
3499
  "AddANDorORCondition": "增加【%s】條件",
3575
  "KeepURLFragmentsLong": "追蹤網頁網址時保留網頁網址片段",
3576
  "ListOfIpsToBeExcludedOnAllWebsites": "以下的 IP 位址將會被所有網站排除。",
3577
  "ListOfQueryParametersToBeExcludedOnAllWebsites": "以下的網址查詢參數將會被所有網站排除。",
 
3578
  "LogAnalytics": "紀錄檔分析",
3579
  "LogAnalyticsDescription": "如果無法使用 Javascript 來追蹤,你可以改用%1$s伺服器紀錄檔追蹤%2$s的方式來追蹤你的網站使用者。",
3580
  "MainDescription": "你需要網站來查看網頁分析報表!新增、更新或刪除網站,並取得 JavaScript 追蹤程式碼插入在你的網頁之中。",
app/plugins/API/Reports/Get.php CHANGED
@@ -32,7 +32,7 @@ class Get extends Report
32
 
33
  $this->categoryId = 'API';
34
  $this->name = Piwik::translate('General_MainMetrics');
35
- $this->documentation = '';
36
 
37
  $this->processedMetrics = array();
38
  foreach ($this->reportsToMerge as $report) {
32
 
33
  $this->categoryId = 'API';
34
  $this->name = Piwik::translate('General_MainMetrics');
35
+ $this->documentation = Piwik::translate('API_MainMetricsReportDocumentation');
36
 
37
  $this->processedMetrics = array();
38
  foreach ($this->reportsToMerge as $report) {
app/plugins/Actions/Reports/Get.php CHANGED
@@ -18,7 +18,7 @@ class Get extends Base
18
  parent::init();
19
 
20
  $this->name = Piwik::translate('General_Actions') . ' - ' . Piwik::translate('General_MainMetrics');
21
- $this->documentation = ''; // TODO
22
  $this->order = 1;
23
  $this->processedMetrics = array(
24
  new AveragePageGenerationTime()
18
  parent::init();
19
 
20
  $this->name = Piwik::translate('General_Actions') . ' - ' . Piwik::translate('General_MainMetrics');
21
+ $this->documentation = Piwik::translate('Actions_MainMetricsReportDocumentation');
22
  $this->order = 1;
23
  $this->processedMetrics = array(
24
  new AveragePageGenerationTime()
app/plugins/Contents/Reports/GetContentNames.php CHANGED
@@ -24,8 +24,7 @@ class GetContentNames extends Base
24
  parent::init();
25
 
26
  $this->name = Piwik::translate('Contents_ContentName');
27
- $this->dimension = null;
28
- // TODO $this->documentation = Piwik::translate('ContentsDocumentation');
29
  $this->dimension = new ContentName();
30
  $this->order = 35;
31
  $this->actionToLoadSubTables = 'getContentNames';
24
  parent::init();
25
 
26
  $this->name = Piwik::translate('Contents_ContentName');
27
+ $this->documentation = Piwik::translate('Contents_ContentNameReportDocumentation');
 
28
  $this->dimension = new ContentName();
29
  $this->order = 35;
30
  $this->actionToLoadSubTables = 'getContentNames';
app/plugins/Contents/Reports/GetContentPieces.php CHANGED
@@ -24,8 +24,7 @@ class GetContentPieces extends Base
24
  parent::init();
25
 
26
  $this->name = Piwik::translate('Contents_ContentPiece');
27
- $this->dimension = null;
28
- // TODO $this->documentation = Piwik::translate('ContentsDocumentation');
29
  $this->dimension = new ContentPiece();
30
  $this->order = 36;
31
  $this->actionToLoadSubTables = 'getContentPieces';
24
  parent::init();
25
 
26
  $this->name = Piwik::translate('Contents_ContentPiece');
27
+ $this->documentation = Piwik::translate('Contents_ContentPieceReportDocumentation');
 
28
  $this->dimension = new ContentPiece();
29
  $this->order = 36;
30
  $this->actionToLoadSubTables = 'getContentPieces';
app/plugins/CoreAdminHome/Controller.php CHANGED
@@ -121,9 +121,10 @@ class Controller extends ControllerAdmin
121
  'Cram-md5' => 'Cram-md5',
122
  );
123
  $view->mailEncryptions = array(
124
- '' => '',
125
  'ssl' => 'SSL',
126
- 'tls' => 'TLS'
 
127
  );
128
  $mail = new Mail();
129
  $view->mailHost = $mail->getMailHost();
121
  'Cram-md5' => 'Cram-md5',
122
  );
123
  $view->mailEncryptions = array(
124
+ '' => 'auto',
125
  'ssl' => 'SSL',
126
+ 'tls' => 'TLS',
127
+ 'none' => 'none',
128
  );
129
  $mail = new Mail();
130
  $view->mailHost = $mail->getMailHost();
app/plugins/CoreHome/CoreHome.php CHANGED
@@ -453,6 +453,7 @@ class CoreHome extends \Piwik\Plugin
453
  $translationKeys[] = 'General_DoubleClickToChangePeriod';
454
  $translationKeys[] = 'General_Apply';
455
  $translationKeys[] = 'General_Period';
 
456
  $translationKeys[] = 'CoreHome_DateInvalid';
457
  $translationKeys[] = 'CoreHome_EnterZenMode';
458
  $translationKeys[] = 'CoreHome_ExitZenMode';
453
  $translationKeys[] = 'General_DoubleClickToChangePeriod';
454
  $translationKeys[] = 'General_Apply';
455
  $translationKeys[] = 'General_Period';
456
+ $translationKeys[] = 'General_CompareTo';
457
  $translationKeys[] = 'CoreHome_DateInvalid';
458
  $translationKeys[] = 'CoreHome_EnterZenMode';
459
  $translationKeys[] = 'CoreHome_ExitZenMode';
app/plugins/CoreHome/angularjs/period-selector/period-selector.directive.html CHANGED
@@ -72,7 +72,7 @@
72
  type="checkbox"
73
  ng-model="periodSelector.isComparing"
74
  />
75
- <span>Compare to:</span>
76
  </label>
77
 
78
  <div
72
  type="checkbox"
73
  ng-model="periodSelector.isComparing"
74
  />
75
+ <span>{{ 'General_CompareTo'|translate }}</span>
76
  </label>
77
 
78
  <div
app/plugins/CoreHome/stylesheets/layout.less CHANGED
@@ -194,7 +194,7 @@ nav {
194
  }
195
 
196
  > li {
197
- display: inline-block;
198
  width: 100%;
199
  .border-radius(0px);
200
  border: 0;
@@ -327,6 +327,21 @@ nav {
327
  content: "\e63b";
328
  }
329
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
330
  }
331
  }
332
 
194
  }
195
 
196
  > li {
197
+ display: block;
198
  width: 100%;
199
  .border-radius(0px);
200
  border: 0;
327
  content: "\e63b";
328
  }
329
  }
330
+
331
+ .collapsible {
332
+ margin: 0;
333
+ border: 0;
334
+ }
335
+
336
+ .collapsible-header {
337
+ border-bottom: 0;
338
+ cursor: pointer!important;
339
+ }
340
+
341
+ .collapsible-body {
342
+ border-bottom: 0;
343
+ padding: 0;
344
+ }
345
  }
346
  }
347
 
app/plugins/CoreHome/templates/_menu.twig CHANGED
@@ -1,9 +1,10 @@
1
- {% macro menu(menu, anchorlink, cssClass, currentModule, currentAction) %}
2
  <div id="secondNavBar" class="{{ cssClass }} z-depth-1">
3
- <ul class="navbar hide-on-med-and-down" aria-label="{{ 'CoreHome_MainNavigation'|translate|e('html_attr') }}" role="menu">
4
  {% for level1,level2 in menu %}
5
 
6
  {% set hasSubmenuItem = false %}
 
7
  {% for name,urlParameters in level2 %}
8
  {% if name|slice(0,1) != '_' %}
9
  {% set hasSubmenuItem = true %}
@@ -11,18 +12,19 @@
11
  {% endfor %}
12
 
13
  {% if hasSubmenuItem %}
14
- <li class="menuTab" role="menuitem">
15
-
16
- <a class="item" tabindex="5">
17
  <span class="menu-icon {{ level2._icon|default('icon-arrow-right') }}"></span>{{ level1|translate }}
18
  <span class="hidden">
19
  {{ 'CoreHome_Menu'|translate }}
20
  </span>
21
  </a>
22
- <ul role="menu">
23
  {% for name,urlParameters in level2 %}
24
  {% if name|slice(0,1) != '_' %}
25
- <li {% if urlParameters._url.module is defined and urlParameters._url.module == currentModule and urlParameters._url.action is defined and urlParameters._url.action == currentAction %}class="active"{% endif %}
 
 
26
  role="menuitem"
27
  >
28
  <a class="item" tabindex="5" target="_self"
@@ -40,6 +42,9 @@
40
  {% endif %}
41
  {% endfor %}
42
  </ul>
 
 
 
43
  </li>
44
  {% endif %}
45
  {% endfor %}
1
+ {% macro menu(menu, anchorlink, cssClass, currentModule, currentAction, collapsible) %}
2
  <div id="secondNavBar" class="{{ cssClass }} z-depth-1">
3
+ <ul class="navbar {% if collapsible %}collapsible collapsible-accordion{% endif %} hide-on-med-and-down" aria-label="{{ 'CoreHome_MainNavigation'|translate|e('html_attr') }}" role="menu">
4
  {% for level1,level2 in menu %}
5
 
6
  {% set hasSubmenuItem = false %}
7
+ {% set hasActive = false %}
8
  {% for name,urlParameters in level2 %}
9
  {% if name|slice(0,1) != '_' %}
10
  {% set hasSubmenuItem = true %}
12
  {% endfor %}
13
 
14
  {% if hasSubmenuItem %}
15
+ {% set subMenu %}
16
+ <a class="item {% if collapsible %}collapsible-header{% endif %}" tabindex="5">
 
17
  <span class="menu-icon {{ level2._icon|default('icon-arrow-right') }}"></span>{{ level1|translate }}
18
  <span class="hidden">
19
  {{ 'CoreHome_Menu'|translate }}
20
  </span>
21
  </a>
22
+ <ul role="menu" {% if collapsible %}class="collapsible-body"{% endif %}>
23
  {% for name,urlParameters in level2 %}
24
  {% if name|slice(0,1) != '_' %}
25
+ {% set isActive = urlParameters._url.module is defined and urlParameters._url.module == currentModule and urlParameters._url.action is defined and urlParameters._url.action == currentAction %}
26
+ {% set hasActive = hasActive or isActive %}
27
+ <li {% if isActive %}class="active"{% endif %}
28
  role="menuitem"
29
  >
30
  <a class="item" tabindex="5" target="_self"
42
  {% endif %}
43
  {% endfor %}
44
  </ul>
45
+ {% endset %}
46
+ <li class="menuTab {% if hasActive %}active{% endif %}" role="menuitem">
47
+ {{ subMenu }}
48
  </li>
49
  {% endif %}
50
  {% endfor %}
app/plugins/CorePluginsAdmin/Controller.php CHANGED
@@ -28,6 +28,7 @@ use Piwik\Plugins\Marketplace\Controller as MarketplaceController;
28
  use Piwik\Plugins\Marketplace\Plugins;
29
  use Piwik\Settings\Storage\Backend\PluginSettingsTable;
30
  use Piwik\SettingsPiwik;
 
31
  use Piwik\Translation\Translator;
32
  use Piwik\Url;
33
  use Piwik\Version;
@@ -236,6 +237,7 @@ class Controller extends Plugin\ControllerAdmin
236
  }
237
 
238
  $view->isPluginUploadEnabled = CorePluginsAdmin::isPluginUploadEnabled();
 
239
  $view->installNonce = Nonce::getNonce(MarketplaceController::INSTALL_NONCE);
240
 
241
  return $view;
28
  use Piwik\Plugins\Marketplace\Plugins;
29
  use Piwik\Settings\Storage\Backend\PluginSettingsTable;
30
  use Piwik\SettingsPiwik;
31
+ use Piwik\SettingsServer;
32
  use Piwik\Translation\Translator;
33
  use Piwik\Url;
34
  use Piwik\Version;
237
  }
238
 
239
  $view->isPluginUploadEnabled = CorePluginsAdmin::isPluginUploadEnabled();
240
+ $view->uploadLimit = SettingsServer::getPostMaxUploadSize();
241
  $view->installNonce = Nonce::getNonce(MarketplaceController::INSTALL_NONCE);
242
 
243
  return $view;
app/plugins/CorePluginsAdmin/CorePluginsAdmin.php CHANGED
@@ -72,6 +72,7 @@ class CorePluginsAdmin extends Plugin
72
  public function getClientSideTranslationKeys(&$translations)
73
  {
74
  $translations[] = 'CorePluginsAdmin_NoZipFileSelected';
 
75
  $translations[] = 'CorePluginsAdmin_NoPluginSettings';
76
  $translations[] = 'CoreAdminHome_PluginSettingsIntro';
77
  $translations[] = 'CoreAdminHome_PluginSettingsSaveSuccess';
72
  public function getClientSideTranslationKeys(&$translations)
73
  {
74
  $translations[] = 'CorePluginsAdmin_NoZipFileSelected';
75
+ $translations[] = 'CorePluginsAdmin_FileExceedsUploadLimit';
76
  $translations[] = 'CorePluginsAdmin_NoPluginSettings';
77
  $translations[] = 'CoreAdminHome_PluginSettingsIntro';
78
  $translations[] = 'CoreAdminHome_PluginSettingsSaveSuccess';
app/plugins/CoreUpdater/Controller.php CHANGED
@@ -268,11 +268,6 @@ class Controller extends \Piwik\Plugin\Controller
268
 
269
  public function index()
270
  {
271
- $language = Common::getRequestVar('language', '');
272
- if (!empty($language)) {
273
- LanguagesManager::setLanguageForSession($language);
274
- }
275
-
276
  try {
277
  return $this->runUpdaterAndExit();
278
  } catch(NoUpdatesFoundException $e) {
268
 
269
  public function index()
270
  {
 
 
 
 
 
271
  try {
272
  return $this->runUpdaterAndExit();
273
  } catch(NoUpdatesFoundException $e) {
app/plugins/CoreUpdater/Model.php CHANGED
@@ -28,6 +28,7 @@ class Model
28
  Filesystem::unlinkTargetFilesNotPresentInSource($source . '/core', $target . '/core');
29
  Filesystem::unlinkTargetFilesNotPresentInSource($source . '/libs', $target . '/libs');
30
  Filesystem::unlinkTargetFilesNotPresentInSource($source . '/vendor', $target . '/vendor');
 
31
 
32
  foreach ($this->getPluginsFromDirectoy($source) as $pluginDir) {
33
  Filesystem::unlinkTargetFilesNotPresentInSource($source . $pluginDir, $target . $pluginDir);
28
  Filesystem::unlinkTargetFilesNotPresentInSource($source . '/core', $target . '/core');
29
  Filesystem::unlinkTargetFilesNotPresentInSource($source . '/libs', $target . '/libs');
30
  Filesystem::unlinkTargetFilesNotPresentInSource($source . '/vendor', $target . '/vendor');
31
+ Filesystem::unlinkTargetFilesNotPresentInSource($source . '/node_modules', $target . '/node_modules');
32
 
33
  foreach ($this->getPluginsFromDirectoy($source) as $pluginDir) {
34
  Filesystem::unlinkTargetFilesNotPresentInSource($source . $pluginDir, $target . $pluginDir);
app/plugins/CoreVisualizations/Visualizations/Sparklines.php CHANGED
@@ -77,7 +77,7 @@ class Sparklines extends ViewDataTable
77
  }
78
  }
79
 
80
- $view->allMetricsDocumentation = Metrics::getDefaultMetricsDocumentation();
81
 
82
  $this->requestConfig->request_parameters_to_modify['columns'] = $columnsList;
83
  $this->requestConfig->request_parameters_to_modify['format_metrics'] = '1';
77
  }
78
  }
79
 
80
+ $view->allMetricsDocumentation = array_merge(Metrics::getDefaultMetricsDocumentation(), $this->config->metrics_documentation);
81
 
82
  $this->requestConfig->request_parameters_to_modify['columns'] = $columnsList;
83
  $this->requestConfig->request_parameters_to_modify['format_metrics'] = '1';
app/plugins/DevicesDetection/Reports/GetBrand.php CHANGED
@@ -19,7 +19,7 @@ class GetBrand extends Base
19
  parent::init();
20
  $this->dimension = new DeviceBrand();
21
  $this->name = Piwik::translate('DevicesDetection_DeviceBrand');
22
- $this->documentation = ''; // TODO
23
  $this->order = 4;
24
  $this->hasGoalMetrics = true;
25
  $this->subcategoryId = 'DevicesDetection_Devices';
19
  parent::init();
20
  $this->dimension = new DeviceBrand();
21
  $this->name = Piwik::translate('DevicesDetection_DeviceBrand');
22
+ $this->documentation = Piwik::translate('DevicesDetection_DeviceBrandReportDocumentation');
23
  $this->order = 4;
24
  $this->hasGoalMetrics = true;
25
  $this->subcategoryId = 'DevicesDetection_Devices';
app/plugins/DevicesDetection/Reports/GetBrowserVersions.php CHANGED
@@ -20,7 +20,7 @@ class GetBrowserVersions extends Base
20
  parent::init();
21
  $this->dimension = new BrowserVersion();
22
  $this->name = Piwik::translate('DevicesDetection_BrowserVersion');
23
- $this->documentation = ''; // TODO
24
  $this->order = 6;
25
  $this->subcategoryId = 'DevicesDetection_Software';
26
  }
20
  parent::init();
21
  $this->dimension = new BrowserVersion();
22
  $this->name = Piwik::translate('DevicesDetection_BrowserVersion');
23
+ $this->documentation = Piwik::translate('DevicesDetection_WidgetBrowserVersionsDocumentation');
24
  $this->order = 6;
25
  $this->subcategoryId = 'DevicesDetection_Software';
26
  }
app/plugins/DevicesDetection/Reports/GetBrowsers.php CHANGED
@@ -20,7 +20,7 @@ class GetBrowsers extends Base
20
  parent::init();
21
  $this->dimension = new BrowserName();
22
  $this->name = Piwik::translate('DevicesDetection_Browsers');
23
- $this->documentation = Piwik::translate('DevicesDetection_WidgetBrowsersDocumentation', '<br />');
24
  $this->order = 5;
25
  $this->subcategoryId = 'DevicesDetection_Software';
26
  $this->hasGoalMetrics = true;
20
  parent::init();
21
  $this->dimension = new BrowserName();
22
  $this->name = Piwik::translate('DevicesDetection_Browsers');
23
+ $this->documentation = Piwik::translate('DevicesDetection_WidgetBrowsersDocumentation');
24
  $this->order = 5;
25
  $this->subcategoryId = 'DevicesDetection_Software';
26
  $this->hasGoalMetrics = true;
app/plugins/DevicesDetection/Reports/GetModel.php CHANGED
@@ -19,7 +19,7 @@ class GetModel extends Base
19
  parent::init();
20
  $this->dimension = new DeviceModel();
21
  $this->name = Piwik::translate('DevicesDetection_DeviceModel');
22
- $this->documentation = ''; // TODO
23
  $this->order = 2;
24
  $this->hasGoalMetrics = true;
25
  $this->subcategoryId = 'DevicesDetection_Devices';
19
  parent::init();
20
  $this->dimension = new DeviceModel();
21
  $this->name = Piwik::translate('DevicesDetection_DeviceModel');
22
+ $this->documentation = Piwik::translate('DevicesDetection_DeviceModelReportDocumentation');
23
  $this->order = 2;
24
  $this->hasGoalMetrics = true;
25
  $this->subcategoryId = 'DevicesDetection_Devices';
app/plugins/DevicesDetection/Reports/GetOsFamilies.php CHANGED
@@ -20,7 +20,7 @@ class GetOsFamilies extends Base
20
  parent::init();
21
  $this->dimension = new Os();
22
  $this->name = Piwik::translate('DevicesDetection_OperatingSystemFamilies');
23
- $this->documentation = ''; // TODO
24
  $this->order = 8;
25
 
26
  $this->subcategoryId = 'DevicesDetection_Software';
20
  parent::init();
21
  $this->dimension = new Os();
22
  $this->name = Piwik::translate('DevicesDetection_OperatingSystemFamilies');
23
+ $this->documentation = Piwik::translate('DevicesDetection_OperatingSystemFamiliesReportDocumentation');
24
  $this->order = 8;
25
 
26
  $this->subcategoryId = 'DevicesDetection_Software';
app/plugins/DevicesDetection/Reports/GetOsVersions.php CHANGED
@@ -20,7 +20,7 @@ class GetOsVersions extends Base
20
  parent::init();
21
  $this->dimension = new OsVersion();
22
  $this->name = Piwik::translate('DevicesDetection_OperatingSystemVersions');
23
- $this->documentation = ''; // TODO
24
  $this->order = 2;
25
 
26
  $this->subcategoryId = 'DevicesDetection_Software';
20
  parent::init();
21
  $this->dimension = new OsVersion();
22
  $this->name = Piwik::translate('DevicesDetection_OperatingSystemVersions');
23
+ $this->documentation = Piwik::translate('DevicesDetection_OperatingSystemVersionsReportDocumentation');
24
  $this->order = 2;
25
 
26
  $this->subcategoryId = 'DevicesDetection_Software';
app/plugins/DevicesDetection/Reports/GetType.php CHANGED
@@ -20,7 +20,7 @@ class GetType extends Base
20
  parent::init();
21
  $this->dimension = new DeviceType();
22
  $this->name = Piwik::translate('DevicesDetection_DeviceType');
23
- $this->documentation = ''; // TODO
24
  $this->order = 0;
25
  $this->hasGoalMetrics = true;
26
  $this->subcategoryId = 'DevicesDetection_Devices';
20
  parent::init();
21
  $this->dimension = new DeviceType();
22
  $this->name = Piwik::translate('DevicesDetection_DeviceType');
23
+ $this->documentation = Piwik::translate('DevicesDetection_DeviceTypeReportDocumentation');
24
  $this->order = 0;
25
  $this->hasGoalMetrics = true;
26
  $this->subcategoryId = 'DevicesDetection_Devices';
app/plugins/Events/Reports/GetAction.php CHANGED
@@ -19,7 +19,7 @@ class GetAction extends Base
19
  parent::init();
20
  $this->dimension = new EventAction();
21
  $this->name = Piwik::translate('Events_EventActions');
22
- $this->documentation = ''; // TODO
23
  $this->metrics = array('nb_events', 'sum_event_value', 'min_event_value', 'max_event_value', 'nb_events_with_value');
24
  if (Common::getRequestVar('secondaryDimension', false) == 'eventCategory') {
25
  $this->actionToLoadSubTables = 'getCategoryFromNameId';
19
  parent::init();
20
  $this->dimension = new EventAction();
21
  $this->name = Piwik::translate('Events_EventActions');
22
+ $this->documentation = Piwik::translate('Events_EventActionsReportDocumentation');
23
  $this->metrics = array('nb_events', 'sum_event_value', 'min_event_value', 'max_event_value', 'nb_events_with_value');
24
  if (Common::getRequestVar('secondaryDimension', false) == 'eventCategory') {
25
  $this->actionToLoadSubTables = 'getCategoryFromNameId';
app/plugins/Events/Reports/GetCategory.php CHANGED
@@ -19,7 +19,7 @@ class GetCategory extends Base
19
  parent::init();
20
  $this->dimension = new EventCategory();
21
  $this->name = Piwik::translate('Events_EventCategories');
22
- $this->documentation = ''; // TODO
23
  $this->metrics = array('nb_events', 'sum_event_value', 'min_event_value', 'max_event_value', 'nb_events_with_value');
24
  if (Common::getRequestVar('secondaryDimension', false) == 'eventName') {
25
  $this->actionToLoadSubTables = 'getNameFromCategoryId';
19
  parent::init();
20
  $this->dimension = new EventCategory();
21
  $this->name = Piwik::translate('Events_EventCategories');
22
+ $this->documentation = Piwik::translate('Events_EventCategoriesReportDocumentation');
23
  $this->metrics = array('nb_events', 'sum_event_value', 'min_event_value', 'max_event_value', 'nb_events_with_value');
24
  if (Common::getRequestVar('secondaryDimension', false) == 'eventName') {
25
  $this->actionToLoadSubTables = 'getNameFromCategoryId';
app/plugins/Events/Reports/GetName.php CHANGED
@@ -19,7 +19,7 @@ class GetName extends Base
19
  parent::init();
20
  $this->dimension = new EventName();
21
  $this->name = Piwik::translate('Events_EventNames');
22
- $this->documentation = ''; // TODO
23
  $this->metrics = array('nb_events', 'sum_event_value', 'min_event_value', 'max_event_value', 'nb_events_with_value');
24
  if (Common::getRequestVar('secondaryDimension', false) == 'eventCategory') {
25
  $this->actionToLoadSubTables = 'getCategoryFromNameId';
19
  parent::init();
20
  $this->dimension = new EventName();
21
  $this->name = Piwik::translate('Events_EventNames');
22
+ $this->documentation = Piwik::translate('Events_EventNamesReportDocumentation');
23
  $this->metrics = array('nb_events', 'sum_event_value', 'min_event_value', 'max_event_value', 'nb_events_with_value');
24
  if (Common::getRequestVar('secondaryDimension', false) == 'eventCategory') {
25
  $this->actionToLoadSubTables = 'getCategoryFromNameId';
app/plugins/Feedback/API.php CHANGED
@@ -67,7 +67,6 @@ class API extends \Piwik\Plugin\API
67
  $subject = '[ Feedback Feature - Matomo ] ' . $subject;
68
  $body = Common::unsanitizeInputValue($body) . "\n"
69
  . 'Matomo ' . Version::VERSION . "\n"
70
- . 'IP: ' . IP::getIpFromHeader() . "\n"
71
  . 'URL: ' . Url::getReferrer() . "\n";
72
 
73
  $mail = new Mail();
67
  $subject = '[ Feedback Feature - Matomo ] ' . $subject;
68
  $body = Common::unsanitizeInputValue($body) . "\n"
69
  . 'Matomo ' . Version::VERSION . "\n"
 
70
  . 'URL: ' . Url::getReferrer() . "\n";
71
 
72
  $mail = new Mail();
app/plugins/Goals/Reports/Get.php CHANGED
@@ -35,7 +35,7 @@ class Get extends Base
35
 
36
  $this->name = Piwik::translate('Goals_Goals');
37
  $this->processedMetrics = array('conversion_rate');
38
- $this->documentation = ''; // TODO
39
  $this->order = 1;
40
  $this->orderGoal = 50;
41
  $this->metrics = array('nb_conversions', 'nb_visits_converted', 'revenue');
35
 
36
  $this->name = Piwik::translate('Goals_Goals');
37
  $this->processedMetrics = array('conversion_rate');
38
+ $this->documentation = Piwik::translate('Goals_OverviewReportDocumentation');
39
  $this->order = 1;
40
  $this->orderGoal = 50;
41
  $this->metrics = array('nb_conversions', 'nb_visits_converted', 'revenue');
app/plugins/Goals/Reports/GetDaysToConversion.php CHANGED
@@ -22,6 +22,7 @@ class GetDaysToConversion extends Base
22
  parent::init();
23
 
24
  $this->name = Piwik::translate('Goals_DaysToConv');
 
25
  $this->dimension = new DaysToConversion();
26
  $this->constantRowsCount = true;
27
  $this->processedMetrics = false;
22
  parent::init();
23
 
24
  $this->name = Piwik::translate('Goals_DaysToConv');
25
+ $this->documentation = Piwik::translate('Goals_DaysToConvReportDocumentation');
26
  $this->dimension = new DaysToConversion();
27
  $this->constantRowsCount = true;
28
  $this->processedMetrics = false;
app/plugins/Goals/Reports/GetVisitsUntilConversion.php CHANGED
@@ -22,6 +22,7 @@ class GetVisitsUntilConversion extends Base
22
  parent::init();
23
 
24
  $this->name = Piwik::translate('Goals_VisitsUntilConv');
 
25
  $this->dimension = new VisitsUntilConversion();
26
  $this->constantRowsCount = true;
27
  $this->processedMetrics = array();
22
  parent::init();
23
 
24
  $this->name = Piwik::translate('Goals_VisitsUntilConv');
25
+ $this->documentation = Piwik::translate('Goals_VisitsUntilConvReportDocumentation');
26
  $this->dimension = new VisitsUntilConversion();
27
  $this->constantRowsCount = true;
28
  $this->processedMetrics = array();
app/plugins/Live/Model.php CHANGED
@@ -58,9 +58,9 @@ class Model
58
  $date = 'yesterdaySameTime';
59
  }
60
 
61
- list($dateStart, $dateEnd) = $this->getStartAndEndDate($idSite, $period, $date);
62
 
63
- $queries = $this->splitDatesIntoMultipleQueries($dateStart, $dateEnd, $limit, $offset);
64
 
65
  $foundVisits = array();
66
 
@@ -75,14 +75,14 @@ class Model
75
  $updatedOffset = 0; // we've already skipped enough rows
76
  }
77
 
78
- list($sql, $bind) = $this->makeLogVisitsQueryString($idSite, $queryRange[0], $queryRange[1], $segment, $updatedOffset, $updatedLimit, $visitorId, $minTimestamp, $filterSortOrder);
79
 
80
  $visits = $this->executeLogVisitsQuery($sql, $bind, $segment, $dateStart, $dateEnd, $minTimestamp, $limit);
81
 
82
  if (!empty($offset) && empty($visits)) {
83
  // find out if there are any matches
84
  $updatedOffset = 0;
85
- list($sql, $bind) = $this->makeLogVisitsQueryString($idSite, $queryRange[0], $queryRange[1], $segment, $updatedOffset, $updatedLimit, $visitorId, $minTimestamp, $filterSortOrder);
86
 
87
  $visits = $this->executeLogVisitsQuery($sql, $bind, $segment, $dateStart, $dateEnd, $minTimestamp, $limit);
88
  if (!empty($visits)) {
@@ -213,7 +213,7 @@ class Model
213
  return true;
214
  }
215
 
216
- public function splitDatesIntoMultipleQueries($dateStart, $dateEnd, $limit, $offset)
217
  {
218
  $virtualDateEnd = $dateEnd;
219
  if (empty($dateEnd)) {
@@ -230,33 +230,64 @@ class Model
230
  if ($limit
231
  && $hasStartEndDateMoreThanOneDayInBetween
232
  ) {
233
- $virtualDateEnd = $virtualDateEnd->subDay(1);
234
- $queries[] = array($virtualDateEnd, $dateEnd); // need to use ",endDate" in case endDate is not set
 
235
 
236
- if ($virtualDateStart->addDay(7)->isEarlier($virtualDateEnd)) {
237
- $queries[] = array($virtualDateEnd->subDay(7), $virtualDateEnd->subSeconds(1));
238
- $virtualDateEnd = $virtualDateEnd->subDay(7);
239
- }
240
 
241
- if (!$offset) {
242
- // only when no offset
243
- // we would in worst case - if not enough visits are found to bypass the offset - execute below queries too often.
244
- // like we would need to execute each of the queries twice just to find out if there are some visits that
245
- // need to be skipped...
 
 
 
 
 
 
 
 
 
 
246
 
247
- if ($virtualDateStart->addDay(30)->isEarlier($virtualDateEnd)) {
248
- $queries[] = array($virtualDateEnd->subDay(30), $virtualDateEnd->subSeconds(1));
249
- $virtualDateEnd = $virtualDateEnd->subDay(30);
250
  }
251
- if ($virtualDateStart->addPeriod(1, 'year')->isEarlier($virtualDateEnd)) {
252
- $queries[] = array($virtualDateEnd->subYear(1), $virtualDateEnd->subSeconds(1));
253
- $virtualDateEnd = $virtualDateEnd->subYear(1);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  }
255
- }
256
 
257
- if ($virtualDateStart->isEarlier($virtualDateEnd)) {
258
- // need to use ",endDate" in case startDate is not set in which case we do not want to have any limit
259
- $queries[] = array($dateStart, $virtualDateEnd->subSeconds(1));
 
260
  }
261
  } else {
262
  $queries[] = array($dateStart, $dateEnd);
@@ -348,7 +379,7 @@ class Model
348
  return 0;
349
  }
350
 
351
- list($whereIdSites, $idSites) = $this->getIdSitesWhereClause($idSite, $from);
352
 
353
  $now = null;
354
  try {
@@ -459,9 +490,9 @@ class Model
459
  */
460
  public function makeLogVisitsQueryString($idSite, $startDate, $endDate, $segment, $offset, $limit, $visitorId, $minTimestamp, $filterSortOrder)
461
  {
462
- list($whereClause, $bindIdSites) = $this->getIdSitesWhereClause($idSite);
463
 
464
- list($whereBind, $where) = $this->getWhereClauseAndBind($whereClause, $bindIdSites, $startDate, $endDate, $visitorId, $minTimestamp);
465
 
466
  if (strtolower($filterSortOrder) !== 'asc') {
467
  $filterSortOrder = 'DESC';
58
  $date = 'yesterdaySameTime';
59
  }
60
 
61
+ [$dateStart, $dateEnd] = $this->getStartAndEndDate($idSite, $period, $date);
62
 
63
+ $queries = $this->splitDatesIntoMultipleQueries($dateStart, $dateEnd, $limit, $offset, $filterSortOrder);
64
 
65
  $foundVisits = array();
66
 
75
  $updatedOffset = 0; // we've already skipped enough rows
76
  }
77
 
78
+ [$sql, $bind] = $this->makeLogVisitsQueryString($idSite, $queryRange[0], $queryRange[1], $segment, $updatedOffset, $updatedLimit, $visitorId, $minTimestamp, $filterSortOrder);
79
 
80
  $visits = $this->executeLogVisitsQuery($sql, $bind, $segment, $dateStart, $dateEnd, $minTimestamp, $limit);
81
 
82
  if (!empty($offset) && empty($visits)) {
83
  // find out if there are any matches
84
  $updatedOffset = 0;
85
+ [$sql, $bind] = $this->makeLogVisitsQueryString($idSite, $queryRange[0], $queryRange[1], $segment, $updatedOffset, $updatedLimit, $visitorId, $minTimestamp, $filterSortOrder);
86
 
87
  $visits = $this->executeLogVisitsQuery($sql, $bind, $segment, $dateStart, $dateEnd, $minTimestamp, $limit);
88
  if (!empty($visits)) {
213
  return true;
214
  }
215
 
216
+ public function splitDatesIntoMultipleQueries($dateStart, $dateEnd, $limit, $offset, $filterSortOrder)
217
  {
218
  $virtualDateEnd = $dateEnd;
219
  if (empty($dateEnd)) {
230
  if ($limit
231
  && $hasStartEndDateMoreThanOneDayInBetween
232
  ) {
233
+ if (strtolower($filterSortOrder) !== 'asc') {
234
+ $virtualDateEnd = $virtualDateEnd->subDay(1);
235
+ $queries[] = [$virtualDateEnd, $dateEnd]; // need to use ",endDate" in case endDate is not set
236
 
237
+ if ($virtualDateStart->addDay(7)->isEarlier($virtualDateEnd)) {
238
+ $queries[] = [$virtualDateEnd->subDay(7), $virtualDateEnd->subSeconds(1)];
239
+ $virtualDateEnd = $virtualDateEnd->subDay(7);
240
+ }
241
 
242
+ if (!$offset) {
243
+ // only when no offset
244
+ // we would in worst case - if not enough visits are found to bypass the offset - execute below queries too often.
245
+ // like we would need to execute each of the queries twice just to find out if there are some visits that
246
+ // need to be skipped...
247
+
248
+ if ($virtualDateStart->addDay(30)->isEarlier($virtualDateEnd)) {
249
+ $queries[] = [$virtualDateEnd->subDay(30), $virtualDateEnd->subSeconds(1)];
250
+ $virtualDateEnd = $virtualDateEnd->subDay(30);
251
+ }
252
+ if ($virtualDateStart->addPeriod(1, 'year')->isEarlier($virtualDateEnd)) {
253
+ $queries[] = [$virtualDateEnd->subYear(1), $virtualDateEnd->subSeconds(1)];
254
+ $virtualDateEnd = $virtualDateEnd->subYear(1);
255
+ }
256
+ }
257
 
258
+ if ($virtualDateStart->isEarlier($virtualDateEnd)) {
259
+ // need to use ",endDate" in case startDate is not set in which case we do not want to have any limit
260
+ $queries[] = [$dateStart, $virtualDateEnd->subSeconds(1)];
261
  }
262
+ } else {
263
+ $queries[] = [$virtualDateStart, $virtualDateStart->addDay(1)->subSeconds(1)];
264
+ $virtualDateStart = $virtualDateStart->addDay(1);
265
+
266
+ if ($virtualDateStart->addDay(7)->isEarlier($virtualDateEnd)) {
267
+ $queries[] = [$virtualDateStart, $virtualDateStart->addDay(7)->subSeconds(1)];
268
+ $virtualDateStart = $virtualDateStart->addDay(7);
269
+ }
270
+
271
+ if (!$offset) {
272
+ // only when no offset
273
+ // we would in worst case - if not enough visits are found to bypass the offset - execute below queries too often.
274
+ // like we would need to execute each of the queries twice just to find out if there are some visits that
275
+ // need to be skipped...
276
+
277
+ if ($virtualDateStart->addDay(30)->isEarlier($virtualDateEnd)) {
278
+ $queries[] = [$virtualDateStart, $virtualDateStart->addDay(30)->subSeconds(1)];
279
+ $virtualDateStart = $virtualDateStart->addDay(30);
280
+ }
281
+ if ($virtualDateStart->addPeriod(1, 'year')->isEarlier($virtualDateEnd)) {
282
+ $queries[] = [$virtualDateStart, $virtualDateStart->addPeriod(1, 'year')->subSeconds(1)];
283
+ $virtualDateStart = $virtualDateStart->addPeriod(1, 'year');
284
+ }
285
  }
 
286
 
287
+ if ($virtualDateStart->isEarlier($virtualDateEnd)) {
288
+ // need to use ",endDate" in case startDate is not set in which case we do not want to have any limit
289
+ $queries[] = [$virtualDateStart, $dateEnd];
290
+ }
291
  }
292
  } else {
293
  $queries[] = array($dateStart, $dateEnd);
379
  return 0;
380
  }
381
 
382
+ [$whereIdSites, $idSites] = $this->getIdSitesWhereClause($idSite, $from);
383
 
384
  $now = null;
385
  try {
490
  */
491
  public function makeLogVisitsQueryString($idSite, $startDate, $endDate, $segment, $offset, $limit, $visitorId, $minTimestamp, $filterSortOrder)
492
  {
493
+ [$whereClause, $bindIdSites] = $this->getIdSitesWhereClause($idSite);
494
 
495
+ [$whereBind, $where] = $this->getWhereClauseAndBind($whereClause, $bindIdSites, $startDate, $endDate, $visitorId, $minTimestamp);
496
 
497
  if (strtolower($filterSortOrder) !== 'asc') {
498
  $filterSortOrder = 'DESC';
app/plugins/Login/PasswordResetter.php CHANGED
@@ -89,7 +89,7 @@ class PasswordResetter
89
  /**
90
  * The name to use in the From: part of the confirm password reset email.
91
  *
92
- * Defaults to the `[General] login_password_recovery_email_name` INI config option.
93
  *
94
  * @var string
95
  */
@@ -98,7 +98,7 @@ class PasswordResetter
98
  /**
99
  * The from email to use in the confirm password reset email.
100
  *
101
- * Defaults to the `[General] login_password_recovery_email_address` INI config option.
102
  *
103
  * @var
104
  */
@@ -130,14 +130,7 @@ class PasswordResetter
130
  $this->confirmPasswordAction = $confirmPasswordAction;
131
  }
132
 
133
- if (empty($emailFromName)) {
134
- $emailFromName = Config::getInstance()->General['login_password_recovery_email_name'];
135
- }
136
  $this->emailFromName = $emailFromName;
137
-
138
- if (empty($emailFromAddress)) {
139
- $emailFromAddress = Config::getInstance()->General['login_password_recovery_email_address'];
140
- }
141
  $this->emailFromAddress = $emailFromAddress;
142
 
143
  if (empty($passwordHelper)) {
@@ -457,7 +450,11 @@ class PasswordResetter
457
  ) . "</p>";
458
  $mail->setWrappedHtmlBody($bodyText);
459
 
460
- $mail->setFrom($this->emailFromAddress, $this->emailFromName);
 
 
 
 
461
 
462
  $replytoEmailName = Config::getInstance()->General['login_password_recovery_replyto_email_name'];
463
  $replytoEmailAddress = Config::getInstance()->General['login_password_recovery_replyto_email_address'];
89
  /**
90
  * The name to use in the From: part of the confirm password reset email.
91
  *
92
+ * Defaults to the `[General] noreply_email_name` INI config option.
93
  *
94
  * @var string
95
  */
98
  /**
99
  * The from email to use in the confirm password reset email.
100
  *
101
+ * Defaults to the `[General] noreply_email_address` INI config option.
102
  *
103
  * @var
104
  */
130
  $this->confirmPasswordAction = $confirmPasswordAction;
131
  }
132
 
 
 
 
133
  $this->emailFromName = $emailFromName;
 
 
 
 
134
  $this->emailFromAddress = $emailFromAddress;
135
 
136
  if (empty($passwordHelper)) {
450
  ) . "</p>";
451
  $mail->setWrappedHtmlBody($bodyText);
452
 
453
+ if ($this->emailFromAddress || $this->emailFromName) {
454
+ $mail->setFrom($this->emailFromAddress, $this->emailFromName);
455
+ } else {
456
+ $mail->setDefaultFromPiwik();
457
+ }
458
 
459
  $replytoEmailName = Config::getInstance()->General['login_password_recovery_replyto_email_name'];
460
  $replytoEmailAddress = Config::getInstance()->General['login_password_recovery_replyto_email_address'];
app/plugins/Marketplace/Controller.php CHANGED
@@ -26,6 +26,7 @@ use Piwik\Plugins\Marketplace\Input\PurchaseType;
26
  use Piwik\Plugins\Marketplace\Input\Sort;
27
  use Piwik\ProxyHttp;
28
  use Piwik\SettingsPiwik;
 
29
  use Piwik\Url;
30
  use Piwik\View;
31
  use Exception;
@@ -287,6 +288,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
287
  $view->isAutoUpdatePossible = SettingsPiwik::isAutoUpdatePossible();
288
  $view->isAutoUpdateEnabled = SettingsPiwik::isAutoUpdateEnabled();
289
  $view->isPluginUploadEnabled = CorePluginsAdmin::isPluginUploadEnabled();
 
290
  $view->inReportingMenu = (bool) Common::getRequestVar('embed', 0, 'int');
291
 
292
  return $view->render();
26
  use Piwik\Plugins\Marketplace\Input\Sort;
27
  use Piwik\ProxyHttp;
28
  use Piwik\SettingsPiwik;
29
+ use Piwik\SettingsServer;
30
  use Piwik\Url;
31
  use Piwik\View;
32
  use Exception;
288
  $view->isAutoUpdatePossible = SettingsPiwik::isAutoUpdatePossible();
289
  $view->isAutoUpdateEnabled = SettingsPiwik::isAutoUpdateEnabled();
290
  $view->isPluginUploadEnabled = CorePluginsAdmin::isPluginUploadEnabled();
291
+ $view->uploadLimit = SettingsServer::getPostMaxUploadSize();
292
  $view->inReportingMenu = (bool) Common::getRequestVar('embed', 0, 'int');
293
 
294
  return $view->render();
app/plugins/Marketplace/templates/_updateCommunicationEmail.twig CHANGED
@@ -10,14 +10,14 @@
10
  {% if hasThemeUpdate %}
11
  <p>
12
  {{ 'CoreUpdater_NotificationClickToUpdateThemes'|translate }}<br/>
13
- {{ host }}index.php?module=CorePluginsAdmin&action=themes
14
  </p>
15
  {% endif %}
16
 
17
  {% if hasPluginUpdate %}
18
  <p>
19
  {{ 'CoreUpdater_NotificationClickToUpdatePlugins'|translate }}<br/>
20
- {{ host }}index.php?module=CorePluginsAdmin&action=plugins
21
  </p>
22
  {% endif %}
23
 
10
  {% if hasThemeUpdate %}
11
  <p>
12
  {{ 'CoreUpdater_NotificationClickToUpdateThemes'|translate }}<br/>
13
+ <a href="{{ host|e('html_attr') }}index.php?module=CorePluginsAdmin&action=themes">{{ host }}index.php?module=CorePluginsAdmin&action=themes</a>
14
  </p>
15
  {% endif %}
16
 
17
  {% if hasPluginUpdate %}
18
  <p>
19
  {{ 'CoreUpdater_NotificationClickToUpdatePlugins'|translate }}<br/>
20
+ <a href="{{ host|e('html_attr') }}index.php?module=CorePluginsAdmin&action=plugins">{{ host }}index.php?module=CorePluginsAdmin&action=plugins</a>
21
  </p>
22
  {% endif %}
23
 
app/plugins/Marketplace/templates/uploadPluginDialog.twig CHANGED
@@ -6,7 +6,7 @@
6
 
7
  <form enctype="multipart/form-data" method="post" id="uploadPluginForm"
8
  action="{{ linkTo({'module':'CorePluginsAdmin', 'action':'uploadPlugin', 'nonce': installNonce}) }}">
9
- <input type="file" name="pluginZip">
10
  <br />
11
  <div piwik-field uicontrol="password" name="confirmPassword" autocomplete="off"
12
  data-title="{{ 'Login_ConfirmPasswordToContinue'|translate|e('html_attr') }}"
6
 
7
  <form enctype="multipart/form-data" method="post" id="uploadPluginForm"
8
  action="{{ linkTo({'module':'CorePluginsAdmin', 'action':'uploadPlugin', 'nonce': installNonce}) }}">
9
+ <input type="file" name="pluginZip" data-max-size="{{ uploadLimit }}">
10
  <br />
11
  <div piwik-field uicontrol="password" name="confirmPassword" autocomplete="off"
12
  data-title="{{ 'Login_ConfirmPasswordToContinue'|translate|e('html_attr') }}"
app/plugins/Morpheus/templates/admin.twig CHANGED
@@ -34,7 +34,7 @@
34
 
35
  {% if showMenu is not defined or showMenu %}
36
  {% import '@CoreHome/_menu.twig' as menu %}
37
- {{ menu.menu(adminMenu, false, 'Menu--admin', currentModule, currentAction) }}
38
  {% endif %}
39
 
40
 
34
 
35
  {% if showMenu is not defined or showMenu %}
36
  {% import '@CoreHome/_menu.twig' as menu %}
37
+ {{ menu.menu(adminMenu, false, 'Menu--admin', currentModule, currentAction, hasSomeAdminAccess) }}
38
  {% endif %}
39
 
40
 
app/plugins/MultiSites/Reports/GetAll.php CHANGED
@@ -18,7 +18,7 @@ class GetAll extends Base
18
  parent::init();
19
  $this->dimension = new Website();
20
  $this->name = Piwik::translate('General_AllWebsitesDashboard');
21
- $this->documentation = ''; // TODO
22
  $this->constantRowsCount = false;
23
  $this->order = 4;
24
  }
18
  parent::init();
19
  $this->dimension = new Website();
20
  $this->name = Piwik::translate('General_AllWebsitesDashboard');
21
+ $this->documentation = Piwik::translate('MultiSites_AllWebsitesDashboardDocumentation');
22
  $this->constantRowsCount = false;
23
  $this->order = 4;
24
  }
app/plugins/MultiSites/Reports/GetOne.php CHANGED
@@ -18,7 +18,7 @@ class GetOne extends Base
18
  parent::init();
19
  $this->dimension = new Website();
20
  $this->name = Piwik::translate('General_SingleWebsitesDashboard');
21
- $this->documentation = ''; // TODO
22
  $this->constantRowsCount = false;
23
  $this->order = 5;
24
  }
18
  parent::init();
19
  $this->dimension = new Website();
20
  $this->name = Piwik::translate('General_SingleWebsitesDashboard');
21
+ $this->documentation = Piwik::translate('MultiSites_SingleWebsitesDashboardDocumentation');
22
  $this->constantRowsCount = false;
23
  $this->order = 5;
24
  }
app/plugins/PagePerformance/Controller.php CHANGED
@@ -47,14 +47,15 @@ class Controller extends PluginController
47
  {
48
  $apiMethod = Common::getRequestVar('apiMethod');
49
  $period = Common::getRequestVar('period');
 
50
 
51
  $params = [
52
  'method' => $apiMethod,
53
- 'period' => $period,
54
  'label' => Common::getRequestVar('label', ''),
55
  'idSite' => $this->idSite,
56
  'segment' => Common::getRequestVar('segment', ''),
57
- 'date' => 'range' === $period ? $this->strDate : EvolutionViz::getDateRangeAndLastN($period, $this->strDate)[0],
58
  'format' => 'original',
59
  'serialize' => '0',
60
  ];
47
  {
48
  $apiMethod = Common::getRequestVar('apiMethod');
49
  $period = Common::getRequestVar('period');
50
+ $date = Common::getRequestVar('date');
51
 
52
  $params = [
53
  'method' => $apiMethod,
54
+ 'period' => 'range' === $period ? 'day' : $period,
55
  'label' => Common::getRequestVar('label', ''),
56
  'idSite' => $this->idSite,
57
  'segment' => Common::getRequestVar('segment', ''),
58
+ 'date' => 'range' === $period ? $date : EvolutionViz::getDateRangeAndLastN($period, $date)[0],
59
  'format' => 'original',
60
  'serialize' => '0',
61
  ];
app/plugins/PagePerformance/Reports/Get.php CHANGED
@@ -29,7 +29,7 @@ class Get extends \Piwik\Plugin\Report
29
  $this->order = 5;
30
 
31
  $this->name = Piwik::translate('PagePerformance_Overview');
32
- $this->documentation = '';
33
  $this->onlineGuideUrl = 'https://matomo.org/faq/how-to/how-do-i-see-page-performance-reports/';
34
  $this->processedMetrics = Metrics::getAllPagePerformanceMetrics();
35
  $this->metrics = Metrics::getAllPagePerformanceMetrics();
29
  $this->order = 5;
30
 
31
  $this->name = Piwik::translate('PagePerformance_Overview');
32
+ $this->documentation = Piwik::translate('PagePerformance_OverviewDocumentation');
33
  $this->onlineGuideUrl = 'https://matomo.org/faq/how-to/how-do-i-see-page-performance-reports/';
34
  $this->processedMetrics = Metrics::getAllPagePerformanceMetrics();
35
  $this->metrics = Metrics::getAllPagePerformanceMetrics();
app/plugins/PrivacyManager/PrivacyManager.php CHANGED
@@ -716,14 +716,16 @@ class PrivacyManager extends Plugin
716
  return;
717
  }
718
 
 
719
  $privacyPolicyUrl = $settings->privacyPolicyUrl->getValue();
720
  $termsAndConditionUrl = $settings->termsAndConditionUrl->getValue();
721
 
722
- if (empty($privacyPolicyUrl) && empty($termsAndConditionUrl)) {
723
  return;
724
  }
725
 
726
  $view = new View('@PrivacyManager/footerLinks.twig');
 
727
  $view->privacyPolicyUrl = $privacyPolicyUrl;
728
  $view->termsAndCondition = $termsAndConditionUrl;
729
  $out .= $view->render();
716
  return;
717
  }
718
 
719
+ $imprintUrl = $settings->imprintUrl->getValue();
720
  $privacyPolicyUrl = $settings->privacyPolicyUrl->getValue();
721
  $termsAndConditionUrl = $settings->termsAndConditionUrl->getValue();
722
 
723
+ if (empty($imprintUrl) && empty($privacyPolicyUrl) && empty($termsAndConditionUrl)) {
724
  return;
725
  }
726
 
727
  $view = new View('@PrivacyManager/footerLinks.twig');
728
+ $view->imprintUrl = $imprintUrl;
729
  $view->privacyPolicyUrl = $privacyPolicyUrl;
730
  $view->termsAndCondition = $termsAndConditionUrl;
731
  $out .= $view->render();
app/plugins/PrivacyManager/SystemSettings.php CHANGED
@@ -20,6 +20,9 @@ use Piwik\Settings\FieldConfig;
20
  */
21
  class SystemSettings extends \Piwik\Settings\Plugin\SystemSettings
22
  {
 
 
 
23
  /** @var SystemSetting */
24
  public $privacyPolicyUrl;
25
 
@@ -31,11 +34,22 @@ class SystemSettings extends \Piwik\Settings\Plugin\SystemSettings
31
 
32
  protected function init()
33
  {
 
34
  $this->privacyPolicyUrl = $this->createPrivacyPolicyUrlSetting();
35
  $this->termsAndConditionUrl = $this->createTermsAndConditionUrlSetting();
36
  $this->showInEmbeddedWidgets = $this->createShowInEmbeddedWidgetsSetting();
37
  }
38
 
 
 
 
 
 
 
 
 
 
 
39
  private function createPrivacyPolicyUrlSetting(): SystemSetting
40
  {
41
  return $this->makeSetting('privacyPolicyUrl', $default = '', FieldConfig::TYPE_STRING, function (FieldConfig $field) {
20
  */
21
  class SystemSettings extends \Piwik\Settings\Plugin\SystemSettings
22
  {
23
+ /** @var SystemSetting */
24
+ public $imprintUrl;
25
+
26
  /** @var SystemSetting */
27
  public $privacyPolicyUrl;
28
 
34
 
35
  protected function init()
36
  {
37
+ $this->imprintUrl = $this->createImprintUrlSetting();
38
  $this->privacyPolicyUrl = $this->createPrivacyPolicyUrlSetting();
39
  $this->termsAndConditionUrl = $this->createTermsAndConditionUrlSetting();
40
  $this->showInEmbeddedWidgets = $this->createShowInEmbeddedWidgetsSetting();
41
  }
42
 
43
+ private function createImprintUrlSetting(): SystemSetting
44
+ {
45
+ return $this->makeSetting('ImprintUrl', $default = '', FieldConfig::TYPE_STRING, function (FieldConfig $field) {
46
+ $field->title = Piwik::translate('PrivacyManager_ImprintUrl');
47
+ $field->uiControl = FieldConfig::UI_CONTROL_TEXT;
48
+ $field->description = Piwik::translate('PrivacyManager_ImprintUrlDescription') . ' ' .
49
+ Piwik::translate('PrivacyManager_PrivacyPolicyUrlDescriptionSuffix', ['anonymous']);
50
+ });
51
+ }
52
+
53
  private function createPrivacyPolicyUrlSetting(): SystemSetting
54
  {
55
  return $this->makeSetting('privacyPolicyUrl', $default = '', FieldConfig::TYPE_STRING, function (FieldConfig $field) {
app/plugins/PrivacyManager/templates/footerLinks.twig CHANGED
@@ -1,4 +1,6 @@
1
  <div id="footerLinks">
 
 
2
  {% if privacyPolicyUrl|default('') is not empty %}<a target="_blank" rel="noreferrer noopener" href="{{ privacyPolicyUrl|safelink|e('html_attr') }}">{{ 'PrivacyManager_PrivacyPolicy'|translate }}</a>{% endif %}
3
  {% if privacyPolicyUrl|default('') is not empty and termsAndCondition|default('') is not empty %}|{% endif %}
4
  {% if termsAndCondition|default('') is not empty %}<a target="_blank" rel="noreferrer noopener" href="{{ termsAndCondition|safelink|e('html_attr') }}">{{ 'PrivacyManager_TermsAndConditions'|translate }}</a>{% endif %}
1
  <div id="footerLinks">
2
+ {% if imprintUrl|default('') is not empty %}<a target="_blank" rel="noreferrer noopener" href="{{ imprintUrl|safelink|e('html_attr') }}">{{ 'PrivacyManager_Imprint'|translate }}</a>{% endif %}
3
+ {% if imprintUrl|default('') is not empty and (privacyPolicyUrl|default('') is not empty or termsAndCondition|default('') is not empty) %}|{% endif %}
4
  {% if privacyPolicyUrl|default('') is not empty %}<a target="_blank" rel="noreferrer noopener" href="{{ privacyPolicyUrl|safelink|e('html_attr') }}">{{ 'PrivacyManager_PrivacyPolicy'|translate }}</a>{% endif %}
5
  {% if privacyPolicyUrl|default('') is not empty and termsAndCondition|default('') is not empty %}|{% endif %}
6
  {% if termsAndCondition|default('') is not empty %}<a target="_blank" rel="noreferrer noopener" href="{{ termsAndCondition|safelink|e('html_attr') }}">{{ 'PrivacyManager_TermsAndConditions'|translate }}</a>{% endif %}
app/plugins/Referrers/Reports/Get.php CHANGED
@@ -38,7 +38,7 @@ class Get extends Base
38
  parent::init();
39
 
40
  $this->name = Piwik::translate('Referrers_ReferrersOverview');
41
- $this->documentation = '';
42
  $this->processedMetrics = [
43
  // none
44
  ];
38
  parent::init();
39
 
40
  $this->name = Piwik::translate('Referrers_ReferrersOverview');
41
+ $this->documentation = Piwik::translate('Referrers_ReferrersOverviewDocumentation');
42
  $this->processedMetrics = [
43
  // none
44
  ];
app/plugins/Referrers/SearchEngine.php CHANGED
@@ -205,7 +205,9 @@ class SearchEngine extends Singleton
205
 
206
  $searchEngineName = $definitions['name'];
207
  $variableNames = $definitions['params'];
208
- $keywordsHiddenFor = !empty($definitions['hiddenkeyword']) ? $definitions['hiddenkeyword'] : array();
 
 
209
 
210
  $key = null;
211
  if ($searchEngineName === 'Google Images') {
205
 
206
  $searchEngineName = $definitions['name'];
207
  $variableNames = $definitions['params'];
208
+ $keywordsHiddenFor = !empty($definitions['hiddenkeyword']) ? $definitions['hiddenkeyword'] : array(
209
+ '/^$/', '/'
210
+ );
211
 
212
  $key = null;
213
  if ($searchEngineName === 'Google Images') {
app/plugins/Resolution/Reports/GetResolution.php CHANGED
@@ -20,7 +20,7 @@ class GetResolution extends Base
20
  parent::init();
21
  $this->dimension = new Resolution();
22
  $this->name = Piwik::translate('Resolution_WidgetResolutions');
23
- $this->documentation = ''; // TODO
24
  $this->order = 8;
25
 
26
  $this->subcategoryId = 'DevicesDetection_Devices';
20
  parent::init();
21
  $this->dimension = new Resolution();
22
  $this->name = Piwik::translate('Resolution_WidgetResolutions');
23
+ $this->documentation = Piwik::translate('Resolution_WidgetResolutionsDocumentation');
24
  $this->order = 8;
25
 
26
  $this->subcategoryId = 'DevicesDetection_Devices';
app/plugins/SitesManager/SitesManager.php CHANGED
@@ -385,6 +385,7 @@ class SitesManager extends \Piwik\Plugin
385
  $translationKeys[] = "SitesManager_GlobalExcludedUserAgentHelp1";
386
  $translationKeys[] = "SitesManager_GlobalListExcludedUserAgents_Desc";
387
  $translationKeys[] = "SitesManager_GlobalExcludedUserAgentHelp2";
 
388
  $translationKeys[] = "SitesManager_WebsitesManagement";
389
  $translationKeys[] = "SitesManager_MainDescription";
390
  $translationKeys[] = "SitesManager_YouCurrentlyHaveAccessToNWebsites";
385
  $translationKeys[] = "SitesManager_GlobalExcludedUserAgentHelp1";
386
  $translationKeys[] = "SitesManager_GlobalListExcludedUserAgents_Desc";
387
  $translationKeys[] = "SitesManager_GlobalExcludedUserAgentHelp2";
388
+ $translationKeys[] = "SitesManager_GlobalExcludedUserAgentHelp3";
389
  $translationKeys[] = "SitesManager_WebsitesManagement";
390
  $translationKeys[] = "SitesManager_MainDescription";
391
  $translationKeys[] = "SitesManager_YouCurrentlyHaveAccessToNWebsites";
app/plugins/SitesManager/templates/help/excluded-user-agents-help.html CHANGED
@@ -4,4 +4,5 @@
4
  <br/><br/>
5
 
6
  {{ 'SitesManager_GlobalListExcludedUserAgents_Desc'|translate }} {{ 'SitesManager_GlobalExcludedUserAgentHelp2'|translate }}
 
7
  </div>
4
  <br/><br/>
5
 
6
  {{ 'SitesManager_GlobalListExcludedUserAgents_Desc'|translate }} {{ 'SitesManager_GlobalExcludedUserAgentHelp2'|translate }}
7
+ {{ 'SitesManager_GlobalExcludedUserAgentHelp3'|translate:'/bot|spider|crawl|scanner/i' }}
8
  </div>
app/plugins/UserId/Reports/GetUsers.php CHANGED
@@ -27,7 +27,7 @@ class GetUsers extends Base
27
 
28
  $this->name = Piwik::translate('UserId_UserReportTitle');
29
  $this->subcategoryId = 'UserId_UserReportTitle';
30
- $this->documentation = '';
31
  $this->dimension = new UserId();
32
  $this->metrics = array('label', 'nb_visits', 'nb_actions', 'nb_visits_converted');
33
  $this->supportsFlatten = false;
27
 
28
  $this->name = Piwik::translate('UserId_UserReportTitle');
29
  $this->subcategoryId = 'UserId_UserReportTitle';
30
+ $this->documentation = Piwik::translate('UserId_UserReportDocumentation');
31
  $this->dimension = new UserId();
32
  $this->metrics = array('label', 'nb_visits', 'nb_actions', 'nb_visits_converted');
33
  $this->supportsFlatten = false;
app/plugins/VisitFrequency/Reports/Get.php CHANGED
@@ -27,9 +27,9 @@ class Get extends \Piwik\Plugin\Report
27
  protected function init()
28
  {
29
  parent::init();
30
- $this->categoryId = 'General_Actions';
31
  $this->name = Piwik::translate('VisitFrequency_ColumnReturningVisits');
32
- $this->documentation = ''; // TODO
33
  $this->processedMetrics = array(
34
  new ReturningMetric(new AverageTimeOnSite(), API::RETURNING_COLUMN_SUFFIX),
35
  new ReturningMetric(new ActionsPerVisit(), API::RETURNING_COLUMN_SUFFIX),
27
  protected function init()
28
  {
29
  parent::init();
30
+ $this->categoryId = 'General_Actions';
31
  $this->name = Piwik::translate('VisitFrequency_ColumnReturningVisits');
32
+ $this->documentation = Piwik::translate('VisitFrequency_VisitFrequencyReportDocumentation');
33
  $this->processedMetrics = array(
34
  new ReturningMetric(new AverageTimeOnSite(), API::RETURNING_COLUMN_SUFFIX),
35
  new ReturningMetric(new ActionsPerVisit(), API::RETURNING_COLUMN_SUFFIX),
app/plugins/VisitsSummary/Reports/Get.php CHANGED
@@ -36,7 +36,7 @@ class Get extends \Piwik\Plugin\Report
36
  parent::init();
37
  $this->categoryId = 'General_Visitors';
38
  $this->name = Piwik::translate('VisitsSummary_VisitsSummary');
39
- $this->documentation = ''; // TODO
40
  $this->processedMetrics = array(
41
  new BounceRate(),
42
  new ActionsPerVisit(),
@@ -82,8 +82,7 @@ class Get extends \Piwik\Plugin\Report
82
  $this->addSparklineColumns($view);
83
  $view->config->addTranslations($this->getSparklineTranslations());
84
 
85
- $numberFormatter = NumberFormatter::getInstance();
86
- $view->config->filters[] = function (DataTable $table) use ($view, $numberFormatter) {
87
  $firstRow = $table->getFirstRow();
88
 
89
  if (($firstRow->getColumn('nb_pageviews')
@@ -103,6 +102,25 @@ class Get extends \Piwik\Plugin\Report
103
  $view->config->replaceSparklineMetric(array('nb_users'), '');
104
  }
105
  };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  }
107
  }
108
 
36
  parent::init();
37
  $this->categoryId = 'General_Visitors';
38
  $this->name = Piwik::translate('VisitsSummary_VisitsSummary');
39
+ $this->documentation = Piwik::translate('VisitsSummary_VisitsSummaryReportDocumentation');
40
  $this->processedMetrics = array(
41
  new BounceRate(),
42
  new ActionsPerVisit(),
82
  $this->addSparklineColumns($view);
83
  $view->config->addTranslations($this->getSparklineTranslations());
84
 
85
+ $view->config->filters[] = function (DataTable $table) use ($view) {
 
86
  $firstRow = $table->getFirstRow();
87
 
88
  if (($firstRow->getColumn('nb_pageviews')
102
  $view->config->replaceSparklineMetric(array('nb_users'), '');
103
  }
104
  };
105
+
106
+ // Remove metric tooltips
107
+ $view->config->metrics_documentation['nb_actions'] = '';
108
+ $view->config->metrics_documentation['nb_visits'] = '';
109
+ $view->config->metrics_documentation['nb_users'] = '';
110
+ $view->config->metrics_documentation['nb_uniq_visitors'] = '';
111
+ $view->config->metrics_documentation['avg_time_generation'] = '';
112
+ $view->config->metrics_documentation['avg_time_on_site'] = '';
113
+ $view->config->metrics_documentation['max_actions'] = '';
114
+ $view->config->metrics_documentation['nb_actions_per_visit'] = '';
115
+ $view->config->metrics_documentation['nb_downloads'] = '';
116
+ $view->config->metrics_documentation['nb_uniq_downloads'] = '';
117
+ $view->config->metrics_documentation['nb_outlinks'] = '';
118
+ $view->config->metrics_documentation['nb_uniq_outlinks'] = '';
119
+ $view->config->metrics_documentation['nb_keywords'] = '';
120
+ $view->config->metrics_documentation['nb_searches'] = '';
121
+ $view->config->metrics_documentation['nb_pageviews'] = '';
122
+ $view->config->metrics_documentation['nb_uniq_pageviews'] = '';
123
+ $view->config->metrics_documentation['bounce_rate'] = '';
124
  }
125
  }
126
 
app/plugins/WebsiteMeasurable/MeasurableSettings.php CHANGED
@@ -235,7 +235,9 @@ class MeasurableSettings extends \Piwik\Settings\Measurable\MeasurableSettings
235
  . '<br /><br />'
236
  . Piwik::translate('SitesManager_GlobalListExcludedUserAgents_Desc')
237
  . '<br />'
238
- . Piwik::translate('SitesManager_GlobalExcludedUserAgentHelp2');
 
 
239
  $field->uiControl = FieldConfig::UI_CONTROL_TEXTAREA;
240
  $field->uiControlAttributes = array('cols' => '20', 'rows' => '4');
241
  $field->transform = function ($value) use ($self) {
235
  . '<br /><br />'
236
  . Piwik::translate('SitesManager_GlobalListExcludedUserAgents_Desc')
237
  . '<br />'
238
+ . Piwik::translate('SitesManager_GlobalExcludedUserAgentHelp2') . " "
239
+ . Piwik::translate('SitesManager_GlobalExcludedUserAgentHelp3', "/bot|spider|crawl|scanner/i")
240
+ ;
241
  $field->uiControl = FieldConfig::UI_CONTROL_TEXTAREA;
242
  $field->uiControlAttributes = array('cols' => '20', 'rows' => '4');
243
  $field->transform = function ($value) use ($self) {
app/vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInitbca50353402dfe6dd0703749723d31b9::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit1423767b62a00489251ad7f3403e836a::getLoader();
app/vendor/bin/lessc DELETED
@@ -1,191 +0,0 @@
1
- #!/usr/bin/env php
2
- <?php
3
-
4
- require_once dirname(__FILE__) . '/../lib/Less/Autoloader.php';
5
- Less_Autoloader::register();
6
-
7
- // Create our environment
8
- $env = array('compress' => false, 'relativeUrls' => false);
9
- $silent = false;
10
- $watch = false;
11
- $rootpath = '';
12
-
13
- // Check for arguments
14
- array_shift($argv);
15
- if (!count($argv)) {
16
- $argv[] = '-h';
17
- }
18
-
19
- // parse arguments
20
- foreach ($argv as $key => $arg) {
21
- if (preg_match('/^--?([a-z][0-9a-z-]*)(?:=([^\s]+))?$/i', $arg, $matches)) {
22
- $option = $matches[1];
23
- $value = isset($matches[2]) ? $matches[2] : false;
24
- unset($argv[$key]);
25
-
26
- switch ($option) {
27
- case 'h':
28
- case 'help':
29
- echo <<<EOD
30
- Usage: lessc [options] sources [destination]
31
-
32
- -h, --help Print help (this message) and exit.
33
- -s, --silent Suppress output of error messages.
34
- -v, --version Print version number and exit.
35
- -x, --compress Compress output by removing some whitespaces.
36
- --include-path=PATHS Set include paths. Separated by `:'. Use `;' on Windows.
37
- --strict-imports Force evaluation of imports.
38
- -sm=on|off Turn on or off strict math, where in strict mode, math
39
- --strict-math=on|off requires brackets. This option may default to on and then
40
- be removed in the future.
41
- -su=on|off Allow mixed units, e.g. 1px+1em or 1px*1px which have units
42
- --strict-units=on|off that cannot be represented.
43
- -ru, --relative-urls re-write relative urls to the base less file.
44
- -rp, --rootpath=URL Set rootpath for url rewriting in relative imports and urls.
45
- Works with or without the relative-urls option.
46
- -w, --watch Watch input files for changes.
47
-
48
-
49
- EOD;
50
- exit;
51
- case 's':
52
- case 'silent':
53
- $silent = true;
54
- break;
55
-
56
- case 'w':
57
- case 'watch':
58
- $watch = true;
59
- break;
60
-
61
- case 'v':
62
- case 'version':
63
- echo "lessc " . Less_Version::version . " (less.php)\n\n";
64
- exit;
65
-
66
- case 'rp':
67
- case 'rootpath':
68
- $rootpath = $value;
69
- break;
70
-
71
-
72
- //parser options
73
- case 'compress':
74
- $env['compress'] = true;
75
- break;
76
-
77
- case 'ru':
78
- case 'relative-urls':
79
- $env['relativeUrls'] = true;
80
- break;
81
-
82
- case 'su':
83
- case 'strict-units':
84
- $env['strictUnits'] = ($value === 'on');
85
- break;
86
-
87
- case 'sm':
88
- case 'strict-math':
89
- $env['strictMath'] = ($value === 'on');
90
- break;
91
-
92
- case 'x':
93
- case 'include-path':
94
- $env['import_dirs'] = preg_split('#;|\:#', $value);
95
- break;
96
-
97
- }
98
- }
99
- }
100
-
101
- if (count($argv) > 1) {
102
- $output = array_pop($argv);
103
- $inputs = $argv;
104
- }
105
- else {
106
- $inputs = $argv;
107
- $output = false;
108
- }
109
-
110
- if (!count($inputs)) {
111
- echo("lessc: no input files\n");
112
- exit;
113
- }
114
-
115
- if ($watch) {
116
- if (!$output) {
117
- echo("lessc: you must specify the output file if --watch is given\n");
118
- exit;
119
- }
120
-
121
- $lastAction = 0;
122
-
123
- echo("lessc: watching input files\n");
124
-
125
- while (1) {
126
- clearstatcache();
127
-
128
- $updated = false;
129
- foreach ($inputs as $input) {
130
- if ($input == '-') {
131
- if (count($inputs) == 1) {
132
- echo("lessc: during watching files is not possible to watch stdin\n");
133
- exit;
134
- }
135
- else {
136
- continue;
137
- }
138
- }
139
-
140
- if (filemtime($input) > $lastAction) {
141
- $updated = true;
142
- break;
143
- }
144
- }
145
-
146
- if ($updated) {
147
- $lastAction = time();
148
- $parser = new Less_Parser($env);
149
- foreach ($inputs as $input) {
150
- try {
151
- $parser->parseFile($input, $rootpath);
152
- }
153
- catch (Exception $e) {
154
- echo("lessc: " . $e->getMessage() . " \n");
155
- continue; // Invalid processing
156
- }
157
- }
158
-
159
- file_put_contents($output, $parser->getCss());
160
- echo("lessc: output file recompiled\n");
161
- }
162
-
163
- sleep(1);
164
- }
165
- }
166
- else {
167
- $parser = new Less_Parser($env);
168
- foreach ($inputs as $input) {
169
- if ($input == '-') {
170
- $content = file_get_contents('php://stdin');
171
- $parser->parse($content);
172
- }
173
- else {
174
- try {
175
- $parser->parseFile($input);
176
- }
177
- catch (Exception $e) {
178
- if (!$silent) {
179
- echo("lessc: " . ((string)$e) . " \n");
180
- }
181
- }
182
- }
183
- }
184
-
185
- if ($output) {
186
- file_put_contents($output, $parser->getCss());
187
- }
188
- else {
189
- echo $parser->getCss();
190
- }
191
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/vendor/composer/InstalledVersions.php CHANGED
@@ -24,12 +24,12 @@ class InstalledVersions
24
  private static $installed = array (
25
  'root' =>
26
  array (
27
- 'pretty_version' => '4.1.0-rc2',
28
- 'version' => '4.1.0.0-RC2',
29
  'aliases' =>
30
  array (
31
  ),
32
- 'reference' => '2cb0cb8f9202deae21f93ef2368d5fe9f683d380',
33
  'name' => 'matomo/matomo',
34
  ),
35
  'versions' =>
@@ -99,12 +99,12 @@ private static $installed = array (
99
  ),
100
  'matomo/device-detector' =>
101
  array (
102
- 'pretty_version' => '4.0.2',
103
- 'version' => '4.0.2.0',
104
  'aliases' =>
105
  array (
106
  ),
107
- 'reference' => '20572bbf8607cfc2f91a11fc75e9a3c6592bdc7a',
108
  ),
109
  'matomo/ini' =>
110
  array (
@@ -117,12 +117,12 @@ private static $installed = array (
117
  ),
118
  'matomo/matomo' =>
119
  array (
120
- 'pretty_version' => '4.1.0-rc2',
121
- 'version' => '4.1.0.0-RC2',
122
  'aliases' =>
123
  array (
124
  ),
125
- 'reference' => '2cb0cb8f9202deae21f93ef2368d5fe9f683d380',
126
  ),
127
  'matomo/matomo-php-tracker' =>
128
  array (
@@ -288,7 +288,7 @@ private static $installed = array (
288
  array (
289
  'replaced' =>
290
  array (
291
- 0 => '4.0.2',
292
  ),
293
  ),
294
  'piwik/referrer-spam-blacklist' =>
24
  private static $installed = array (
25
  'root' =>
26
  array (
27
+ 'pretty_version' => '4.1.1',
28
+ 'version' => '4.1.1.0',
29
  'aliases' =>
30
  array (
31
  ),
32
+ 'reference' => '0a0d7ea3b85264e6b5aff757a6283949217a2ddd',
33
  'name' => 'matomo/matomo',
34
  ),
35
  'versions' =>
99
  ),
100
  'matomo/device-detector' =>
101
  array (
102
+ 'pretty_version' => '4.1.0',
103
+ 'version' => '4.1.0.0',
104
  'aliases' =>
105
  array (
106
  ),
107
+ 'reference' => '6b3facc35e7a465bc4223fddfa5fa88c5b327554',
108
  ),
109
  'matomo/ini' =>
110
  array (
117
  ),
118
  'matomo/matomo' =>
119
  array (
120
+ 'pretty_version' => '4.1.1',
121
+ 'version' => '4.1.1.0',
122
  'aliases' =>
123
  array (
124
  ),
125
+ 'reference' => '0a0d7ea3b85264e6b5aff757a6283949217a2ddd',
126
  ),
127
  'matomo/matomo-php-tracker' =>
128
  array (
288
  array (
289
  'replaced' =>
290
  array (
291
+ 0 => '4.1.0',
292
  ),
293
  ),
294
  'piwik/referrer-spam-blacklist' =>
app/vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInitbca50353402dfe6dd0703749723d31b9
6
  {
7
  private static $loader;
8
 
@@ -22,9 +22,9 @@ class ComposerAutoloaderInitbca50353402dfe6dd0703749723d31b9
22
  return self::$loader;
23
  }
24
 
25
- spl_autoload_register(array('ComposerAutoloaderInitbca50353402dfe6dd0703749723d31b9', 'loadClassLoader'), true, false);
26
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
- spl_autoload_unregister(array('ComposerAutoloaderInitbca50353402dfe6dd0703749723d31b9', 'loadClassLoader'));
28
 
29
  $includePaths = require __DIR__ . '/include_paths.php';
30
  $includePaths[] = get_include_path();
@@ -34,7 +34,7 @@ class ComposerAutoloaderInitbca50353402dfe6dd0703749723d31b9
34
  if ($useStaticLoader) {
35
  require __DIR__ . '/autoload_static.php';
36
 
37
- call_user_func(\Composer\Autoload\ComposerStaticInitbca50353402dfe6dd0703749723d31b9::getInitializer($loader));
38
  } else {
39
  $map = require __DIR__ . '/autoload_namespaces.php';
40
  foreach ($map as $namespace => $path) {
@@ -55,19 +55,19 @@ class ComposerAutoloaderInitbca50353402dfe6dd0703749723d31b9
55
  $loader->register(false);
56
 
57
  if ($useStaticLoader) {
58
- $includeFiles = Composer\Autoload\ComposerStaticInitbca50353402dfe6dd0703749723d31b9::$files;
59
  } else {
60
  $includeFiles = require __DIR__ . '/autoload_files.php';
61
  }
62
  foreach ($includeFiles as $fileIdentifier => $file) {
63
- composerRequirebca50353402dfe6dd0703749723d31b9($fileIdentifier, $file);
64
  }
65
 
66
  return $loader;
67
  }
68
  }
69
 
70
- function composerRequirebca50353402dfe6dd0703749723d31b9($fileIdentifier, $file)
71
  {
72
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
73
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit1423767b62a00489251ad7f3403e836a
6
  {
7
  private static $loader;
8
 
22
  return self::$loader;
23
  }
24
 
25
+ spl_autoload_register(array('ComposerAutoloaderInit1423767b62a00489251ad7f3403e836a', 'loadClassLoader'), true, false);
26
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
+ spl_autoload_unregister(array('ComposerAutoloaderInit1423767b62a00489251ad7f3403e836a', 'loadClassLoader'));
28
 
29
  $includePaths = require __DIR__ . '/include_paths.php';
30
  $includePaths[] = get_include_path();
34
  if ($useStaticLoader) {
35
  require __DIR__ . '/autoload_static.php';
36
 
37
+ call_user_func(\Composer\Autoload\ComposerStaticInit1423767b62a00489251ad7f3403e836a::getInitializer($loader));
38
  } else {
39
  $map = require __DIR__ . '/autoload_namespaces.php';
40
  foreach ($map as $namespace => $path) {
55
  $loader->register(false);
56
 
57
  if ($useStaticLoader) {
58
+ $includeFiles = Composer\Autoload\ComposerStaticInit1423767b62a00489251ad7f3403e836a::$files;
59
  } else {
60
  $includeFiles = require __DIR__ . '/autoload_files.php';
61
  }
62
  foreach ($includeFiles as $fileIdentifier => $file) {
63
+ composerRequire1423767b62a00489251ad7f3403e836a($fileIdentifier, $file);
64
  }
65
 
66
  return $loader;
67
  }
68
  }
69
 
70
+ function composerRequire1423767b62a00489251ad7f3403e836a($fileIdentifier, $file)
71
  {
72
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
73
  require $file;
app/vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInitbca50353402dfe6dd0703749723d31b9
8
  {
9
  public static $files = array (
10
  '04c6c5c2f7095ccf6c481d3e53e1776f' => __DIR__ . '/..' . '/mustangostang/spyc/Spyc.php',
@@ -3252,11 +3252,11 @@ class ComposerStaticInitbca50353402dfe6dd0703749723d31b9
3252
  public static function getInitializer(ClassLoader $loader)
3253
  {
3254
  return \Closure::bind(function () use ($loader) {
3255
- $loader->prefixLengthsPsr4 = ComposerStaticInitbca50353402dfe6dd0703749723d31b9::$prefixLengthsPsr4;
3256
- $loader->prefixDirsPsr4 = ComposerStaticInitbca50353402dfe6dd0703749723d31b9::$prefixDirsPsr4;
3257
- $loader->prefixesPsr0 = ComposerStaticInitbca50353402dfe6dd0703749723d31b9::$prefixesPsr0;
3258
- $loader->fallbackDirsPsr0 = ComposerStaticInitbca50353402dfe6dd0703749723d31b9::$fallbackDirsPsr0;
3259
- $loader->classMap = ComposerStaticInitbca50353402dfe6dd0703749723d31b9::$classMap;
3260
 
3261
  }, null, ClassLoader::class);
3262
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit1423767b62a00489251ad7f3403e836a
8
  {
9
  public static $files = array (
10
  '04c6c5c2f7095ccf6c481d3e53e1776f' => __DIR__ . '/..' . '/mustangostang/spyc/Spyc.php',
3252
  public static function getInitializer(ClassLoader $loader)
3253
  {
3254
  return \Closure::bind(function () use ($loader) {
3255
+ $loader->prefixLengthsPsr4 = ComposerStaticInit1423767b62a00489251ad7f3403e836a::$prefixLengthsPsr4;
3256
+ $loader->prefixDirsPsr4 = ComposerStaticInit1423767b62a00489251ad7f3403e836a::$prefixDirsPsr4;
3257
+ $loader->prefixesPsr0 = ComposerStaticInit1423767b62a00489251ad7f3403e836a::$prefixesPsr0;
3258
+ $loader->fallbackDirsPsr0 = ComposerStaticInit1423767b62a00489251ad7f3403e836a::$fallbackDirsPsr0;
3259
+ $loader->classMap = ComposerStaticInit1423767b62a00489251ad7f3403e836a::$classMap;
3260
 
3261
  }, null, ClassLoader::class);
3262
  }
app/vendor/composer/installed.json CHANGED
@@ -475,17 +475,17 @@
475
  },
476
  {
477
  "name": "matomo/device-detector",
478
- "version": "4.0.2",
479
- "version_normalized": "4.0.2.0",
480
  "source": {
481
  "type": "git",
482
  "url": "https://github.com/matomo-org/device-detector.git",
483
- "reference": "20572bbf8607cfc2f91a11fc75e9a3c6592bdc7a"
484
  },
485
  "dist": {
486
  "type": "zip",
487
- "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/20572bbf8607cfc2f91a11fc75e9a3c6592bdc7a",
488
- "reference": "20572bbf8607cfc2f91a11fc75e9a3c6592bdc7a",
489
  "shasum": ""
490
  },
491
  "require": {
@@ -496,7 +496,7 @@
496
  "piwik/device-detector": "self.version"
497
  },
498
  "require-dev": {
499
- "matthiasmullie/scrapbook": "@stable",
500
  "mayflower/mo4-coding-standard": "dev-master#275cb9d",
501
  "phpstan/phpstan": "^0.12.52",
502
  "phpunit/phpunit": "^8.5.8",
@@ -508,7 +508,7 @@
508
  "doctrine/cache": "Can directly be used for caching purpose",
509
  "ext-yaml": "Necessary for using the Pecl YAML parser"
510
  },
511
- "time": "2020-12-07T09:40:38+00:00",
512
  "type": "library",
513
  "installation-source": "dist",
514
  "autoload": {
475
  },
476
  {
477
  "name": "matomo/device-detector",
478
+ "version": "4.1.0",
479
+ "version_normalized": "4.1.0.0",
480
  "source": {
481
  "type": "git",
482
  "url": "https://github.com/matomo-org/device-detector.git",
483
+ "reference": "6b3facc35e7a465bc4223fddfa5fa88c5b327554"
484
  },
485
  "dist": {
486
  "type": "zip",
487
+ "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/6b3facc35e7a465bc4223fddfa5fa88c5b327554",
488
+ "reference": "6b3facc35e7a465bc4223fddfa5fa88c5b327554",
489
  "shasum": ""
490
  },
491
  "require": {
496
  "piwik/device-detector": "self.version"
497
  },
498
  "require-dev": {
499
+ "matthiasmullie/scrapbook": "^1.4.7",
500
  "mayflower/mo4-coding-standard": "dev-master#275cb9d",
501
  "phpstan/phpstan": "^0.12.52",
502
  "phpunit/phpunit": "^8.5.8",
508
  "doctrine/cache": "Can directly be used for caching purpose",
509
  "ext-yaml": "Necessary for using the Pecl YAML parser"
510
  },
511
+ "time": "2021-01-08T14:14:55+00:00",
512
  "type": "library",
513
  "installation-source": "dist",
514
  "autoload": {
app/vendor/composer/installed.php CHANGED
@@ -1,12 +1,12 @@
1
  <?php return array (
2
  'root' =>
3
  array (
4
- 'pretty_version' => '4.1.0-rc2',
5
- 'version' => '4.1.0.0-RC2',
6
  'aliases' =>
7
  array (
8
  ),
9
- 'reference' => '2cb0cb8f9202deae21f93ef2368d5fe9f683d380',
10
  'name' => 'matomo/matomo',
11
  ),
12
  'versions' =>
@@ -76,12 +76,12 @@
76
  ),
77
  'matomo/device-detector' =>
78
  array (
79
- 'pretty_version' => '4.0.2',
80
- 'version' => '4.0.2.0',
81
  'aliases' =>
82
  array (
83
  ),
84
- 'reference' => '20572bbf8607cfc2f91a11fc75e9a3c6592bdc7a',
85
  ),
86
  'matomo/ini' =>
87
  array (
@@ -94,12 +94,12 @@
94
  ),
95
  'matomo/matomo' =>
96
  array (
97
- 'pretty_version' => '4.1.0-rc2',
98
- 'version' => '4.1.0.0-RC2',
99
  'aliases' =>
100
  array (
101
  ),
102
- 'reference' => '2cb0cb8f9202deae21f93ef2368d5fe9f683d380',
103
  ),
104
  'matomo/matomo-php-tracker' =>
105
  array (
@@ -265,7 +265,7 @@
265
  array (
266
  'replaced' =>
267
  array (
268
- 0 => '4.0.2',
269
  ),
270
  ),
271
  'piwik/referrer-spam-blacklist' =>
1
  <?php return array (
2
  'root' =>
3
  array (
4
+ 'pretty_version' => '4.1.1',
5
+ 'version' => '4.1.1.0',
6
  'aliases' =>
7
  array (
8
  ),
9
+ 'reference' => '0a0d7ea3b85264e6b5aff757a6283949217a2ddd',
10
  'name' => 'matomo/matomo',
11
  ),
12
  'versions' =>
76
  ),
77
  'matomo/device-detector' =>
78
  array (
79
+ 'pretty_version' => '4.1.0',
80
+ 'version' => '4.1.0.0',
81
  'aliases' =>
82
  array (
83
  ),
84
+ 'reference' => '6b3facc35e7a465bc4223fddfa5fa88c5b327554',
85
  ),
86
  'matomo/ini' =>
87
  array (
94
  ),
95
  'matomo/matomo' =>
96
  array (
97
+ 'pretty_version' => '4.1.1',
98
+ 'version' => '4.1.1.0',
99
  'aliases' =>
100
  array (
101
  ),
102
+ 'reference' => '0a0d7ea3b85264e6b5aff757a6283949217a2ddd',
103
  ),
104
  'matomo/matomo-php-tracker' =>
105
  array (
265
  array (
266
  'replaced' =>
267
  array (
268
+ 0 => '4.1.0',
269
  ),
270
  ),
271
  'piwik/referrer-spam-blacklist' =>
app/vendor/matomo/device-detector/DeviceDetector.php CHANGED
@@ -62,7 +62,7 @@ class DeviceDetector
62
  /**
63
  * Current version number of DeviceDetector
64
  */
65
- public const VERSION = '4.0.2';
66
 
67
  /**
68
  * Constant used as value for unknown browser / os
@@ -839,7 +839,7 @@ class DeviceDetector
839
  /**
840
  * Assume all devices running iOS / Mac OS are from Apple
841
  */
842
- if (empty($this->brand) && \in_array($osName, ['Apple TV', 'iOS', 'Mac'])) {
843
  $this->brand = 'Apple';
844
  }
845
 
62
  /**
63
  * Current version number of DeviceDetector
64
  */
65
+ public const VERSION = '4.1.0';
66
 
67
  /**
68
  * Constant used as value for unknown browser / os
839
  /**
840
  * Assume all devices running iOS / Mac OS are from Apple
841
  */
842
+ if (empty($this->brand) && \in_array($osName, ['Apple TV', 'watchOS', 'iOS', 'Mac'])) {
843
  $this->brand = 'Apple';
844
  }
845
 
app/vendor/matomo/device-detector/Parser/Client/Browser.php CHANGED
@@ -92,6 +92,7 @@ class Browser extends AbstractClientParser
92
  'CN' => 'CoolNovo',
93
  'CO' => 'CometBird',
94
  'CB' => 'COS Browser',
 
95
  'CP' => 'ChromePlus',
96
  'CR' => 'Chromium',
97
  'CY' => 'Cyberfox',
@@ -196,6 +197,7 @@ class Browser extends AbstractClientParser
196
  'MY' => 'Mypal',
197
  'MR' => 'Monument Browser',
198
  'MW' => 'MAUI WAP Browser',
 
199
  'NR' => 'NFS Browser',
200
  'NB' => 'Nokia Browser',
201
  'NO' => 'Nokia OSS Browser',
@@ -210,6 +212,7 @@ class Browser extends AbstractClientParser
210
  'OC' => 'Oculus Browser',
211
  'O1' => 'Opera Mini iOS',
212
  'OB' => 'Obigo',
 
213
  'OD' => 'Odyssey Web Browser',
214
  'OF' => 'Off By One',
215
  'HH' => 'OhHai Browser',
@@ -239,6 +242,7 @@ class Browser extends AbstractClientParser
239
  'PA' => 'Palmscape',
240
  'PX' => 'Phoenix',
241
  'PB' => 'Phoenix Browser',
 
242
  'PO' => 'Polaris',
243
  'PT' => 'Polarity',
244
  'PI' => 'PrivacyWall',
@@ -255,11 +259,13 @@ class Browser extends AbstractClientParser
255
  'RM' => 'RockMelt',
256
  'SB' => 'Samsung Browser',
257
  'SA' => 'Sailfish Browser',
 
258
  'SC' => 'SEMC-Browser',
259
  'SE' => 'Sogou Explorer',
260
  'SF' => 'Safari',
261
  'S5' => 'Safe Exam Browser',
262
  'SW' => 'SalamWeb',
 
263
  'SH' => 'Shiira',
264
  'S1' => 'SimpleBrowser',
265
  'SY' => 'Sizzy',
@@ -283,6 +289,7 @@ class Browser extends AbstractClientParser
283
  'ST' => 'Streamy',
284
  'SX' => 'Swiftfox',
285
  'SZ' => 'Seznam Browser',
 
286
  'TO' => 't-online.de Browser',
287
  'TA' => 'Tao Browser',
288
  'TF' => 'TenFourFox',
@@ -342,7 +349,8 @@ class Browser extends AbstractClientParser
342
  'CL', 'SU', 'EU', 'UB', 'LO', 'VG', 'TV', 'A0', '1B',
343
  'S4', 'EE', 'AE', 'VM', 'O0', 'TG', 'GB', 'SY', 'HH',
344
  'YJ', 'LL', 'TU', 'XV', 'C2', 'QU', 'YN', 'JB', 'MR',
345
- 'S6', '7S', 'NM', 'PB', 'UR', 'NR', 'SG',
 
346
  ],
347
  'Firefox' => [
348
  'FF', 'FE', 'FM', 'SX', 'FB', 'PX', 'MB', 'EI', 'WF',
92
  'CN' => 'CoolNovo',
93
  'CO' => 'CometBird',
94
  'CB' => 'COS Browser',
95
+ 'C3' => 'Chim Lac',
96
  'CP' => 'ChromePlus',
97
  'CR' => 'Chromium',
98
  'CY' => 'Cyberfox',
197
  'MY' => 'Mypal',
198
  'MR' => 'Monument Browser',
199
  'MW' => 'MAUI WAP Browser',
200
+ 'NW' => 'Navigateur Web',
201
  'NR' => 'NFS Browser',
202
  'NB' => 'Nokia Browser',
203
  'NO' => 'Nokia OSS Browser',
212
  'OC' => 'Oculus Browser',
213
  'O1' => 'Opera Mini iOS',
214
  'OB' => 'Obigo',
215
+ 'O2' => 'Odin',
216
  'OD' => 'Odyssey Web Browser',
217
  'OF' => 'Off By One',
218
  'HH' => 'OhHai Browser',
242
  'PA' => 'Palmscape',
243
  'PX' => 'Phoenix',
244
  'PB' => 'Phoenix Browser',
245
+ 'PF' => 'PlayFree Browser',
246
  'PO' => 'Polaris',
247
  'PT' => 'Polarity',
248
  'PI' => 'PrivacyWall',
259
  'RM' => 'RockMelt',
260
  'SB' => 'Samsung Browser',
261
  'SA' => 'Sailfish Browser',
262
+ 'S8' => 'Seewo Browser',
263
  'SC' => 'SEMC-Browser',
264
  'SE' => 'Sogou Explorer',
265
  'SF' => 'Safari',
266
  'S5' => 'Safe Exam Browser',
267
  'SW' => 'SalamWeb',
268
+ 'SV' => 'SFive',
269
  'SH' => 'Shiira',
270
  'S1' => 'SimpleBrowser',
271
  'SY' => 'Sizzy',
289
  'ST' => 'Streamy',
290
  'SX' => 'Swiftfox',
291
  'SZ' => 'Seznam Browser',
292
+ 'TR' => 'T-Browser',
293
  'TO' => 't-online.de Browser',
294
  'TA' => 'Tao Browser',
295
  'TF' => 'TenFourFox',
349
  'CL', 'SU', 'EU', 'UB', 'LO', 'VG', 'TV', 'A0', '1B',
350
  'S4', 'EE', 'AE', 'VM', 'O0', 'TG', 'GB', 'SY', 'HH',
351
  'YJ', 'LL', 'TU', 'XV', 'C2', 'QU', 'YN', 'JB', 'MR',
352
+ 'S6', '7S', 'NM', 'PB', 'UR', 'NR', 'SG', 'S8', 'C3',
353
+ 'SS', 'O2', 'SV', 'TR',
354
  ],
355
  'Firefox' => [
356
  'FF', 'FE', 'FM', 'SX', 'FB', 'PX', 'MB', 'EI', 'WF',
app/vendor/matomo/device-detector/Parser/Device/AbstractDeviceParser.php CHANGED
@@ -79,159 +79,174 @@ abstract class AbstractDeviceParser extends AbstractParser
79
  * @var array
80
  */
81
  public static $deviceBrands = [
82
- '36' => '360',
83
- '88' => '8848',
84
  '3Q' => '3Q',
85
  '4G' => '4Good',
 
 
 
86
  '41' => 'A1',
 
87
  'AE' => 'Ace',
88
- 'AA' => 'AllCall',
89
- '3A' => 'AllDocube',
90
  'AC' => 'Acer',
91
- '00' => 'Accent',
92
  'A9' => 'Advan',
93
  'AD' => 'Advance',
94
- '60' => 'Andowl',
95
  'A3' => 'AGM',
96
  'AZ' => 'Ainol',
97
  'AI' => 'Airness',
 
98
  '0A' => 'AIS',
99
  'AW' => 'Aiwa',
100
  'AK' => 'Akai',
101
  '1A' => 'Alba',
102
  'AL' => 'Alcatel',
103
  '20' => 'Alcor',
 
 
104
  '4A' => 'Aligator',
 
 
105
  'A2' => 'Allview',
106
  'A7' => 'Allwinner',
107
  'A1' => 'Altech UEC',
 
108
  'A5' => 'altron',
109
- '3L' => 'Alfawise',
110
- 'AN' => 'Arnova',
111
- '7A' => 'Anry',
112
- '5A' => 'ArmPhone',
113
- '40' => 'Artel',
114
- '2A' => 'Atom',
115
  'KN' => 'Amazon',
116
  'AG' => 'AMGOO',
117
  '9A' => 'Amigoo',
118
  'AO' => 'Amoi',
 
 
 
119
  '3N' => 'Aoson',
120
  'AP' => 'Apple',
121
  'AR' => 'Archos',
122
- 'AS' => 'ARRIS',
123
  'AB' => 'Arian Space',
124
- 'AT' => 'Airties',
125
- '6A' => 'AT&T',
126
  'A6' => 'Ark',
127
- 'A4' => 'Ask',
 
 
 
 
128
  '8A' => 'Asano',
 
 
129
  'A8' => 'Assistant',
130
- 'A0' => 'ANS',
131
  'AU' => 'Asus',
132
- 'AH' => 'AVH',
 
 
133
  'ZA' => 'Avenzo',
 
134
  'AV' => 'Avvio',
135
- 'AX' => 'Audiovox',
136
  'AY' => 'Axxion',
137
  'AM' => 'Azumi Mobile',
 
 
138
  'BB' => 'BBK',
139
  '0B' => 'BB Mobile',
 
140
  'BE' => 'Becker',
141
  'B5' => 'Beeline',
142
  'B0' => 'Beelink',
143
- 'BI' => 'Bird',
 
 
 
 
 
 
144
  '1B' => 'Billion',
 
 
145
  'BT' => 'Bitel',
146
- 'B8' => 'BIHEE',
147
  'B7' => 'Bitmore',
148
- 'BG' => 'BGH',
149
- 'BL' => 'Beetel',
 
 
150
  'BP' => 'Blaupunkt',
 
151
  'B3' => 'Bluboo',
152
- 'BF' => 'Black Fox',
153
- 'B6' => 'BDF',
 
154
  'BM' => 'Bmobile',
155
- 'BN' => 'Barnes & Noble',
156
- 'BO' => 'BangOlufsen',
157
  'B9' => 'Bobarry',
158
- 'BQ' => 'BenQ',
159
- 'BS' => 'BenQ-Siemens',
160
- 'BU' => 'Blu',
161
- 'BD' => 'Bluegood',
162
- 'B2' => 'Blackview',
163
  'B4' => 'bogo',
164
  'BW' => 'Boway',
165
- 'BZ' => 'Bezkam',
166
  'BX' => 'bq',
 
167
  'BV' => 'Bravis',
168
  'BR' => 'Brondi',
169
  'B1' => 'Bush',
170
- 'CB' => 'CUBOT',
171
- 'CF' => 'Carrefour',
172
  'CP' => 'Captiva',
 
173
  'CS' => 'Casio',
174
  'R4' => 'Casper',
175
  'CA' => 'Cat',
176
- 'C9' => 'CAGI',
177
  'CE' => 'Celkon',
178
- 'CC' => 'ConCorde',
179
  'C2' => 'Changhong',
180
- '2C' => 'Ghong',
181
  'CH' => 'Cherry Mobile',
 
182
  '1C' => 'Chuwi',
183
  'L8' => 'Clarmin',
184
  'CD' => 'Cloudfone',
185
  '6C' => 'Cloudpad',
186
  'C0' => 'Clout',
187
- 'CK' => 'Cricket',
188
- 'C1' => 'Crosscall',
189
- 'CL' => 'Compal',
190
  'CN' => 'CnM',
191
- 'CM' => 'Crius Mea',
192
- 'C3' => 'China Mobile',
193
- 'CR' => 'CreNova',
194
- '0C' => 'Crony',
195
- 'CT' => 'Capitel',
196
- 'CQ' => 'Compaq',
197
- '3C' => 'Contixo',
198
- '4C' => 'Conquest',
199
- 'CO' => 'Coolpad',
200
- 'C5' => 'Condor',
201
- 'CW' => 'Cowon',
202
- 'CU' => 'Cube',
203
  'CY' => 'Coby Kyros',
204
  'C6' => 'Comio',
 
 
205
  'C7' => 'ComTrade Tesla',
206
  'C8' => 'Concord',
 
 
 
 
 
 
 
207
  'CX' => 'Crescent',
208
- 'C4' => 'Cyrus',
 
 
 
 
 
209
  'CV' => 'CVTE',
 
210
  'D5' => 'Daewoo',
211
  'DA' => 'Danew',
212
  'DT' => 'Datang',
213
  'D7' => 'Datawind',
214
  'D1' => 'Datsun',
 
 
215
  'DE' => 'Denver',
 
216
  'DW' => 'DeWalt',
217
  'DX' => 'DEXP',
218
- 'DS' => 'Desay',
219
- 'DB' => 'Dbtel',
220
- 'DC' => 'DoCoMo',
221
- 'D9' => 'Dolamee',
222
- 'D0' => 'Doopro',
223
  'DG' => 'Dialog',
224
  'DI' => 'Dicam',
225
  'D4' => 'Digi',
226
  'D3' => 'Digicel',
 
227
  'DD' => 'Digiland',
228
  'D2' => 'Digma',
 
229
  'D6' => 'Divisat',
230
- 'DL' => 'Dell',
231
- 'DN' => 'DNS',
232
  'DM' => 'DMM',
233
- 'DO' => 'Doogee',
 
234
  'DF' => 'Doffler',
 
 
 
235
  'DV' => 'Doov',
236
  'DP' => 'Dopod',
237
  'DR' => 'Doro',
@@ -239,618 +254,672 @@ abstract class AbstractDeviceParser extends AbstractParser
239
  'DU' => 'Dune HD',
240
  'EB' => 'E-Boda',
241
  '2E' => 'E-Ceros',
242
- '5E' => '2E',
 
243
  'EA' => 'EBEST',
244
- 'EC' => 'Ericsson',
245
- 'E7' => 'Ergo',
246
- 'ED' => 'Energizer',
247
  'E4' => 'Echo Mobiles',
248
  'ES' => 'ECS',
249
  'E6' => 'EE',
250
- 'EI' => 'Ezio',
251
  'EM' => 'Eks Mobility',
252
- 'EL' => 'Elephone',
253
- '4E' => 'Eltex',
254
  'L0' => 'Element',
255
  'EG' => 'Elenberg',
256
- 'EP' => 'Easypix',
257
- 'EK' => 'EKO',
 
258
  'E1' => 'Energy Sistem',
259
  '3E' => 'Enot',
 
 
 
260
  'ER' => 'Ericy',
261
  'EE' => 'Essential',
 
262
  '6E' => 'eSTAR',
263
  'EN' => 'Eton',
264
- 'E2' => 'Essentielb',
265
- '1E' => 'Etuline',
266
  'ET' => 'eTouch',
 
 
 
267
  'EV' => 'Evertek',
268
  'E3' => 'Evolio',
269
  'EO' => 'Evolveo',
 
 
270
  'EH' => 'EXO',
271
  'EX' => 'Explay',
272
- 'E0' => 'EvroMedia',
273
  'E5' => 'Extrem',
 
274
  'EZ' => 'Ezze',
275
- 'E8' => 'E-tel',
276
- 'E9' => 'Evercoss',
277
- 'EU' => 'Eurostar',
278
- 'XE' => 'ExMobile',
279
  'FA' => 'Fairphone',
280
  'FM' => 'Famoco',
 
281
  'FE' => 'Fengxiang',
 
282
  'FI' => 'FiGO',
 
 
283
  'F3' => 'FireFly Mobile',
284
  'FL' => 'Fly',
285
- 'F1' => 'FinePower',
286
- 'FT' => 'Freetel',
287
- 'F7' => 'Fero',
288
- 'FR' => 'Forstar',
289
- 'FO' => 'Foxconn',
290
- 'F2' => 'FORME',
291
  'FN' => 'FNB',
292
- 'FU' => 'Fujitsu',
293
  'FD' => 'Fondi',
294
  'F0' => 'Fonos',
 
 
 
 
 
 
295
  'GT' => 'G-TiDE',
296
  'GM' => 'Garmin-Asus',
297
  'GA' => 'Gateway',
298
  'GD' => 'Gemini',
299
  'GN' => 'General Mobile',
300
- 'GE' => 'Geotel',
301
  'G2' => 'GEOFOX',
 
302
  'GH' => 'Ghia',
303
- 'GI' => 'Gionee',
304
  'GG' => 'Gigabyte',
305
  'GS' => 'Gigaset',
306
  'GZ' => 'Ginzzu',
 
307
  'G4' => 'Globex',
308
  'GC' => 'GOCLEVER',
309
  'GL' => 'Goly',
310
- 'GO' => 'Google',
311
  'G5' => 'Gome',
312
  'G1' => 'GoMobile',
 
 
313
  'GR' => 'Gradiente',
314
  'GP' => 'Grape',
315
  'G6' => 'Gree',
316
- 'G0' => 'Goophone',
317
  'GU' => 'Grundig',
318
  'HF' => 'Hafury',
319
  'HA' => 'Haier',
320
- 'HS' => 'Hasee',
321
- 'HK' => 'Hardkernel',
322
  'HE' => 'HannSpree',
323
- 'HI' => 'Hisense',
 
 
 
324
  'HL' => 'Hi-Level',
325
  'H2' => 'Highscreen',
326
  '1H' => 'Hipstreet',
 
 
327
  'H1' => 'Hoffmann',
328
- 'HM' => 'Homtom',
329
  'H0' => 'Hometech',
 
 
330
  'HO' => 'Hosin',
331
- 'HW' => 'How',
332
  'HV' => 'Hotwav',
333
- 'HZ' => 'Hoozo',
334
  'HP' => 'HP',
335
  'HT' => 'HTC',
336
  'HD' => 'Huadoo',
337
  'HU' => 'Huawei',
338
  'HX' => 'Humax',
 
339
  'HY' => 'Hyrican',
340
  'HN' => 'Hyundai',
341
- 'IG' => 'iGet',
342
- 'IA' => 'Ikea',
343
- 'IB' => 'iBall',
344
  '3I' => 'i-Cherry',
345
  'IJ' => 'i-Joy',
346
- 'IC' => 'iDroid',
 
 
347
  'IY' => 'iBerry',
348
  '7I' => 'iBrit',
 
 
 
349
  'IH' => 'iHunt',
 
350
  'IK' => 'iKoMo',
351
- 'IE' => 'iView',
352
- '0J' => 'iVooMi',
353
- 'I8' => 'iVA',
354
- '1I' => 'iMars',
355
- 'IM' => 'i-mate',
356
  '2I' => 'iLife',
357
- 'I1' => 'iOcean',
358
- 'I2' => 'IconBIT',
359
  'IL' => 'IMO Mobile',
360
- 'I7' => 'iLA',
 
361
  'IW' => 'iNew',
362
- 'IP' => 'iPro',
363
  'IF' => 'Infinix',
364
  'I0' => 'InFocus',
 
365
  'I5' => 'InnJoo',
366
  'IN' => 'Innostream',
367
- 'IS' => 'Insignia',
368
  'I4' => 'Inoi',
369
- 'IR' => 'iRola',
370
- 'IU' => 'iRulu',
371
- 'I6' => 'Irbis',
372
- '5I' => 'Iris',
373
- 'II' => 'Inkti',
374
- 'IX' => 'Intex',
375
- '4I' => 'Invin',
376
- 'IO' => 'i-mobile',
377
  'IQ' => 'INQ',
378
- '8Q' => 'IQM',
379
  'IT' => 'Intek',
 
380
  'IV' => 'Inverto',
381
- 'I3' => 'Impression',
 
 
 
 
 
 
 
 
382
  'IZ' => 'iTel',
383
  '0I' => 'iTruck',
 
 
 
384
  'I9' => 'iZotron',
385
  'JA' => 'JAY-Tech',
 
386
  'JI' => 'Jiayu',
387
  'JG' => 'Jinga',
 
388
  'JO' => 'Jolla',
389
  'J5' => 'Just5',
390
- 'JF' => 'JFone',
391
- 'JK' => 'JKL',
392
- 'KL' => 'Kalley',
393
- '0K' => 'Klipad',
394
  'K4' => 'Kaan',
395
  'K7' => 'Kaiomy',
 
396
  'K6' => 'Kanji',
397
  'KA' => 'Karbonn',
398
  'K5' => 'KATV1',
 
399
  'KD' => 'KDDI',
 
 
 
400
  'K1' => 'Kiano',
401
- 'KV' => 'Kivi',
402
  'KI' => 'Kingsun',
 
 
403
  'KC' => 'Kocaso',
 
404
  'KG' => 'Kogan',
405
- 'KO' => 'Konka',
406
  'KM' => 'Komu',
407
- 'KB' => 'Koobee',
 
 
 
408
  'K9' => 'Kooper',
409
- 'KT' => 'K-Touch',
410
- 'KH' => 'KT-Tech',
411
- 'KK' => 'Kodak',
412
  'KP' => 'KOPO',
413
- 'KW' => 'Konrow',
414
  'KR' => 'Koridy',
415
  'K2' => 'KRONO',
416
- 'KS' => 'Kempler & Strauss',
417
- 'K3' => 'Keneksi',
418
  'K8' => 'Kuliao',
 
419
  'KU' => 'Kumai',
420
  'KY' => 'Kyocera',
421
- 'KZ' => 'Kazam',
422
  '1K' => 'Kzen',
423
- 'KE' => 'Krüger&Matz',
424
- 'KX' => 'Kenxinda',
425
  'LQ' => 'LAIQ',
426
- 'L2' => 'Landvo',
427
  'L6' => 'Land Rover',
428
- 'LV' => 'Lava',
429
  'LA' => 'Lanix',
430
  'LK' => 'Lark',
 
431
  'LC' => 'LCT',
432
  'L5' => 'Leagoo',
433
  'LD' => 'Ledstar',
434
  'L1' => 'LeEco',
 
435
  'L4' => 'Lemhoov',
436
- 'LE' => 'Lenovo',
437
  'LN' => 'Lenco',
 
438
  'LT' => 'Leotec',
 
439
  'L7' => 'Lephone',
440
  'LZ' => 'Lesia',
441
- 'LP' => 'Le Pan',
 
442
  'LG' => 'LG',
443
  'LI' => 'Lingwin',
 
444
  'LO' => 'Loewe',
445
- 'LM' => 'Logicom',
446
  '1L' => 'Logic',
447
- 'L3' => 'Lexand',
448
- 'LX' => 'Lexibook',
449
- 'LY' => 'LYF',
450
- 'LU' => 'Lumus',
451
  '0L' => 'Lumigon',
 
452
  'L9' => 'Luna',
 
 
 
453
  'MN' => 'M4tel',
454
  'XM' => 'Macoox',
455
  'MJ' => 'Majestic',
456
- 'MA' => 'Manta Multimedia',
457
- '6X' => 'Maxtron',
458
- '50' => 'Matrix',
459
  '5M' => 'Mann',
 
460
  '2M' => 'Masstel',
461
- 'MW' => 'Maxwest',
462
  '7M' => 'Maxcom',
 
463
  '0D' => 'MAXVI',
 
464
  'M0' => 'Maze',
465
- 'MB' => 'Mobistel',
466
- '9M' => 'Mobo',
467
- '0M' => 'Mecool',
468
  'M3' => 'Mecer',
 
 
 
469
  'MD' => 'Medion',
470
  'M2' => 'MEEG',
471
- 'M1' => 'Meizu',
472
  '3M' => 'Meitu',
473
- 'ME' => 'Metz',
474
- '09' => 'meanIT',
475
  '0E' => 'Melrose',
 
 
476
  'MX' => 'MEU',
477
  'MI' => 'MicroMax',
478
- '8M' => 'Mito',
479
  '1X' => 'Minix',
 
 
 
 
 
480
  'M5' => 'MIXC',
481
  '1Z' => 'MiXzo',
482
- 'MH' => 'Mobiola',
 
483
  '4M' => 'Mobicel',
484
  'M6' => 'Mobiistar',
485
- 'MC' => 'Mediacom',
486
- 'MK' => 'MediaTek',
487
- 'MO' => 'Mio',
488
- 'M7' => 'Miray',
489
- 'MM' => 'Mpman',
490
- 'LS' => 'MLS',
491
  'M4' => 'Modecom',
492
  'MF' => 'Mofut',
493
  'MR' => 'Motorola',
494
  'MV' => 'Movic',
495
- 'MS' => 'Microsoft',
496
- 'M9' => 'MTC',
497
- 'MP' => 'MegaFon',
498
  'MZ' => 'MSI',
499
- 'MU' => 'Memup',
500
- 'MT' => 'Mitsubishi',
501
- 'ML' => 'MLLED',
502
- 'MQ' => 'M.T.T.',
503
  'N4' => 'MTN',
504
- 'MY' => 'MyPhone',
505
- '3T' => 'MyTab',
506
  '1M' => 'MYFON',
507
- 'MG' => 'MyWigo',
508
  'M8' => 'Myria',
509
  '6M' => 'Mystery',
510
- '1R' => 'Multilaser',
511
- 'N3' => 'Navon',
512
- '6N' => 'Navitech',
513
- '7N' => 'NorthTech',
514
  'N7' => 'National',
515
- 'N5' => 'NOA',
 
516
  'NE' => 'NEC',
517
- '4N' => 'NextTab',
518
- '5N' => 'Nos',
519
- '1N' => 'Neomi',
520
  'NF' => 'Neffos',
 
521
  'NA' => 'Netgear',
522
  'NU' => 'NeuImage',
 
 
 
 
 
 
 
 
 
 
523
  'NG' => 'NGM',
524
  'NZ' => 'NG Optics',
525
- 'N6' => 'Nobby',
526
- 'NO' => 'Nous',
527
  'NI' => 'Nintendo',
528
- '0N' => 'Newman',
529
  'N1' => 'Noain',
530
- 'N2' => 'Nextbit',
531
- 'NK' => 'Nokia',
532
- 'NV' => 'Nvidia',
533
  'NB' => 'Noblex',
 
534
  'NM' => 'Nomi',
535
  '2N' => 'Nomu',
536
- 'N0' => 'Nuvo',
 
 
 
 
537
  'NL' => 'NUU Mobile',
 
 
538
  'NY' => 'NYX Mobile',
539
- 'NN' => 'Nikon',
540
- 'N9' => 'Newland',
541
- 'NW' => 'Newgen',
542
- 'NS' => 'NewsMy',
543
- 'NX' => 'Nexian',
544
- 'N8' => 'NEXON',
545
- 'NT' => 'NextBook',
546
  'O3' => 'O+',
 
 
547
  'OB' => 'Obi',
548
  'O1' => 'Odys',
549
  'OA' => 'Okapia',
550
  'OD' => 'Onda',
551
  'ON' => 'OnePlus',
552
  'OX' => 'Onix',
 
 
553
  'OH' => 'Openbox',
554
  'OP' => 'OPPO',
555
- 'O4' => 'ONN',
556
  'OR' => 'Orange',
557
  'O5' => 'Orbic',
558
  'OS' => 'Ordissimo',
559
- 'OT' => 'O2',
560
  'OK' => 'Ouki',
561
  'OE' => 'Oukitel',
562
  'OU' => 'OUYA',
563
- 'OO' => 'Opsson',
564
  'OV' => 'Overmax',
565
  '30' => 'Ovvi',
 
566
  'OY' => 'Oysters',
567
  'O6' => 'Oyyu',
568
- 'OW' => 'öwn',
569
- 'O2' => 'Owwo',
570
  'OZ' => 'OzoneHD',
 
 
571
  'PN' => 'Panacom',
572
  'PA' => 'Panasonic',
 
573
  'PB' => 'PCBOX',
574
  'PC' => 'PCD',
575
  'PD' => 'PCD Argentina',
576
  'PE' => 'PEAQ',
577
  'PG' => 'Pentagram',
578
- 'PH' => 'Philips',
579
- '4P' => 'Philco',
580
  '1P' => 'Phicomm',
 
 
 
 
581
  'PI' => 'Pioneer',
582
- 'PX' => 'Pixus',
583
  '8P' => 'Pixelphone',
584
- 'PL' => 'Polaroid',
585
- 'P5' => 'Polytron',
586
- 'P9' => 'Primepad',
587
- '2P' => 'Prixton',
588
- 'P6' => 'Proline',
589
- 'PM' => 'Palm',
590
- '0P' => 'POCO',
591
- '3P' => 'Positivo BGH',
592
- 'PO' => 'phoneOne',
593
- '5P' => 'Phonemax',
594
- 'PT' => 'Pantech',
595
  'PY' => 'Ployer',
596
  'P4' => 'Plum',
597
  'P8' => 'PocketBook',
 
598
  'PV' => 'Point of View',
 
599
  'PP' => 'PolyPad',
 
600
  'P2' => 'Pomp',
601
- 'P3' => 'PPTV',
602
  'PS' => 'Positivo',
 
 
 
603
  'PR' => 'Prestigio',
 
604
  '6P' => 'Primux',
605
- 'P7' => 'Protruly',
 
606
  'P1' => 'ProScan',
 
607
  'PU' => 'PULID',
608
- '7P' => 'P-UP',
609
  'QB' => 'Q.Bell',
610
  'QI' => 'Qilive',
611
- 'QT' => 'Qtek',
612
- 'QH' => 'Q-Touch',
613
  'QM' => 'QMobile',
 
614
  'QA' => 'Quantum',
615
  'QU' => 'Quechua',
616
  'QO' => 'Qumo',
 
617
  'RA' => 'Ramos',
618
- 'RE' => 'Realme',
619
- 'R8' => 'RED',
620
  'R9' => 'Ravoz',
621
  'RZ' => 'Razer',
622
  'RC' => 'RCA Tablets',
 
623
  'RB' => 'Readboy',
 
 
 
624
  'RI' => 'Rikomagic',
 
625
  'RN' => 'Rinno',
 
 
626
  'RV' => 'Riviera',
627
- 'RM' => 'RIM',
628
- 'RK' => 'Roku',
629
- 'RO' => 'Rover',
630
- 'R6' => 'RoverPad',
631
  'RR' => 'Roadrover',
632
  'R1' => 'Rokit',
 
633
  'R3' => 'Rombica',
634
- 'RT' => 'RT Project',
635
- 'RX' => 'Ritmix',
636
- 'R7' => 'Ritzviva',
637
  'R5' => 'Ross&Moor',
638
- 'R2' => 'R-TV',
 
 
639
  'RG' => 'RugGear',
640
  'RU' => 'Runbo',
641
  'RY' => 'Ryte',
642
- 'SQ' => 'Santin',
 
 
643
  'SA' => 'Samsung',
644
  'S0' => 'Sanei',
 
 
 
 
645
  'CZ' => 'Schneider',
646
  'SD' => 'Sega',
 
 
647
  'SL' => 'Selfix',
648
- 'SE' => 'Sony Ericsson',
649
- '01' => 'Senkatel',
650
  'S1' => 'Sencor',
651
- 'SF' => 'Softbank',
 
 
 
652
  'SX' => 'SFR',
653
- 'SG' => 'Sagem',
654
  'SH' => 'Sharp',
655
  '7S' => 'Shift Phones',
656
  'RS' => 'Shtrikh-M',
657
  '3S' => 'Shuttle',
 
658
  'SI' => 'Siemens',
659
- 'SJ' => 'Silent Circle',
660
  '1S' => 'Sigma',
661
- 'SN' => 'Sendo',
662
- '0S' => 'SEMP TCL',
663
- 'S6' => 'Senseit',
664
- 'EW' => 'Senwa',
665
  'SW' => 'Sky',
666
  'SK' => 'Skyworth',
 
 
 
 
667
  'SC' => 'Smartfren',
668
- 'SO' => 'Sony',
 
 
669
  'OI' => 'Sonim',
 
 
670
  'X2' => 'Soundmax',
671
  '8S' => 'Soyes',
672
- 'SP' => 'Spice',
673
  '6S' => 'Spectrum',
674
- '9S' => 'Sugar',
675
- '5S' => 'Sunvell',
676
- '0H' => 'Sunstech',
677
- 'SU' => 'SuperSonic',
678
- 'S5' => 'Supra',
679
- 'SV' => 'Selevision',
680
- '9G' => 'Selenga',
681
- 'SY' => 'Sanyo',
682
- 'SM' => 'Symphony',
683
- '4S' => 'Syrox',
684
- 'SR' => 'Smart',
685
- 'S7' => 'Smartisan',
686
  'S4' => 'Star',
687
  'OL' => 'Starlight',
 
 
688
  'SB' => 'STF Mobile',
689
  'S8' => 'STK',
690
- 'S9' => 'Savio',
691
- '2S' => 'Starway',
692
- 'ST' => 'Storex',
693
  'S2' => 'Stonex',
694
- 'S3' => 'SunVan',
 
695
  'SZ' => 'Sumvision',
 
 
 
 
 
 
696
  'SS' => 'SWISSMOBILITY',
697
  '1W' => 'Swisstone',
698
- 'QS' => 'SQOOL',
699
- '0W' => 'Swipe',
700
- '10' => 'Simbans',
701
- 'X1' => 'Safaricom',
702
- 'TA' => 'Tesla',
703
  'TK' => 'Takara',
704
- '4T' => 'Tronsmart',
705
- '5R' => 'Transpeed',
706
  'T5' => 'TB Touch',
707
  'TC' => 'TCL',
 
 
 
 
 
708
  'T7' => 'Teclast',
709
- 'TE' => 'Telit',
710
- '9T' => 'Tetratab',
711
- 'T4' => 'ThL',
712
- 'TH' => 'TiPhone',
713
  'TB' => 'Tecno Mobile',
714
- 'TP' => 'TechPad',
715
- 'TD' => 'Tesco',
716
- 'T0' => 'TD Systems',
717
- 'TI' => 'TIANYU',
718
- '2T' => 'Tinai',
719
- 'TF' => 'Tinmo',
720
- 'TG' => 'Telego',
721
- 'TL' => 'Telefunken',
722
  '2L' => 'Tele2',
 
 
723
  'T2' => 'Telenor',
724
- 'TM' => 'T-Mobile',
 
 
 
 
 
725
  'TN' => 'Thomson',
 
 
726
  '8T' => 'Time2',
727
  'TQ' => 'Timovi',
728
- 'TY' => 'Tooky',
729
- '0T' => 'Tone',
 
730
  'T1' => 'Tolino',
 
 
731
  'T9' => 'Top House',
732
  'TO' => 'Toplux',
733
  '7T' => 'Torex',
734
- 'T8' => 'Touchmate',
735
  'TS' => 'Toshiba',
736
- 'TT' => 'TechnoTrend',
737
- '5C' => 'TTEC',
738
  'T6' => 'TrekStor',
739
  'T3' => 'Trevi',
 
 
 
 
740
  'TU' => 'Tunisie Telecom',
741
- 'TR' => 'Turbo-X',
742
  '1T' => 'Turbo',
 
743
  '5T' => 'TurboKids',
744
- '11' => 'True',
745
  'TV' => 'TVC',
746
  'TW' => 'TWM',
747
  '6T' => 'Twoe',
748
- 'TX' => 'TechniSat',
749
- 'TZ' => 'teXet',
750
  'UC' => 'U.S. Cellular',
751
- 'UH' => 'Uhappy',
752
- 'U1' => 'Uhans',
753
  'UG' => 'Ugoos',
 
 
754
  'UL' => 'Ulefone',
755
- 'UO' => 'Unnecto',
756
- 'UN' => 'Unowhy',
757
- 'US' => 'Uniscope',
758
  'UX' => 'Unimax',
 
759
  'U2' => 'UNIWA',
760
- 'UM' => 'UMIDIGI',
761
  'UU' => 'Unonu',
 
762
  'UK' => 'UTOK',
763
- 'UA' => 'Umax',
764
  'UT' => 'UTStarcom',
765
- 'UZ' => 'Unihertz',
766
  'VA' => 'Vastking',
767
- 'VD' => 'Videocon',
768
- 'VE' => 'Vertu',
769
  'VN' => 'Venso',
770
- 'V5' => 'Vivax',
771
- '0V' => 'Vipro',
772
- 'VI' => 'Vitelcom',
773
- 'V7' => 'Vinga',
774
- 'VK' => 'VK Mobile',
775
- 'VS' => 'ViewSonic',
776
- 'VH' => 'Vsmart',
777
- 'V9' => 'Vsun',
778
- 'V8' => 'Vesta',
779
- 'VT' => 'Vestel',
780
- 'VR' => 'Vernee',
781
- 'V4' => 'Verizon',
782
  '4V' => 'Verico',
 
 
 
 
783
  'VL' => 'Verykool',
 
 
784
  'V6' => 'VGO TEL',
785
- 'VV' => 'Vivo',
786
- '3V' => 'VVETIME',
787
- 'VX' => 'Vertex',
 
788
  'V3' => 'Vinsoc',
 
 
 
 
 
 
 
 
 
 
789
  'V2' => 'Vonino',
790
  '1V' => 'Vontar',
791
  'VG' => 'Vorago',
792
  '2V' => 'Vorke',
793
  'V1' => 'Voto',
794
  'VO' => 'Voxtel',
795
- 'VF' => 'Vodafone',
796
- 'VM' => 'Vodacom',
797
- 'V0' => 'VKworld',
798
  'VY' => 'Voyo',
799
- 'VZ' => 'Vizio',
800
- 'VW' => 'Videoweb',
801
  'VU' => 'Vulcan',
 
802
  'WA' => 'Walton',
803
- 'WF' => 'Wileyfox',
804
- 'WN' => 'Wink',
805
  'WM' => 'Weimei',
806
  'WE' => 'WellcoM',
807
- 'W0' => 'Wiseasy',
808
  'WY' => 'Wexler',
 
809
  'W2' => 'Wigor',
810
  'WI' => 'Wiko',
 
811
  'WS' => 'Winds',
812
- 'WP' => 'Wieppo',
 
 
 
813
  'WL' => 'Wolder',
814
  'WG' => 'Wolfgang',
815
  'WO' => 'Wonu',
816
  'W1' => 'Woo',
817
- 'WX' => 'Woxter',
818
  'WR' => 'Wortmann',
 
 
 
819
  'XV' => 'X-View',
820
- 'XI' => 'Xiaomi',
 
821
  'XL' => 'Xiaolajiao',
 
822
  'XN' => 'Xion',
823
  'XO' => 'Xolo',
824
  'XR' => 'Xoro',
825
- 'XG' => 'Xgody',
826
- 'YA' => 'Yarvik',
827
  'YD' => 'Yandex',
 
828
  'Y2' => 'Yes',
829
  'YE' => 'Yezz',
 
 
 
830
  'Y1' => 'Yu',
831
  'YU' => 'Yuandao',
832
  'YS' => 'Yusun',
833
- 'YO' => 'Yota',
834
- 'YT' => 'Ytone',
835
  'YX' => 'Yxtel',
836
  '0Z' => 'Zatec',
 
837
  'ZE' => 'Zeemi',
 
838
  'ZK' => 'Zenek',
 
839
  'ZF' => 'Zfiner',
840
- 'ZO' => 'Zonda',
841
  'ZI' => 'Zidoo',
842
  'ZX' => 'Ziox',
 
843
  'ZP' => 'Zopo',
844
  'ZT' => 'ZTE',
845
  'ZU' => 'Zuum',
846
- 'ZN' => 'Zen',
847
  'ZY' => 'Zync',
848
  'ZQ' => 'ZYQ',
849
- 'XS' => 'Xshitou',
850
- 'XT' => 'X-TIGI',
851
- '4X' => 'Xtouch',
852
- 'XB' => 'NEXBOX',
853
- 'X3' => 'X-BO',
854
  // legacy brands, might be removed in future versions
855
  'WB' => 'Web TV',
856
  'XX' => 'Unknown',
79
  * @var array
80
  */
81
  public static $deviceBrands = [
82
+ '5E' => '2E',
 
83
  '3Q' => '3Q',
84
  '4G' => '4Good',
85
+ '04' => '4ife',
86
+ '36' => '360',
87
+ '88' => '8848',
88
  '41' => 'A1',
89
+ '00' => 'Accent',
90
  'AE' => 'Ace',
 
 
91
  'AC' => 'Acer',
 
92
  'A9' => 'Advan',
93
  'AD' => 'Advance',
 
94
  'A3' => 'AGM',
95
  'AZ' => 'Ainol',
96
  'AI' => 'Airness',
97
+ 'AT' => 'Airties',
98
  '0A' => 'AIS',
99
  'AW' => 'Aiwa',
100
  'AK' => 'Akai',
101
  '1A' => 'Alba',
102
  'AL' => 'Alcatel',
103
  '20' => 'Alcor',
104
+ '6L' => 'ALDI SÜD',
105
+ '3L' => 'Alfawise',
106
  '4A' => 'Aligator',
107
+ 'AA' => 'AllCall',
108
+ '3A' => 'AllDocube',
109
  'A2' => 'Allview',
110
  'A7' => 'Allwinner',
111
  'A1' => 'Altech UEC',
112
+ '66' => 'Altice',
113
  'A5' => 'altron',
 
 
 
 
 
 
114
  'KN' => 'Amazon',
115
  'AG' => 'AMGOO',
116
  '9A' => 'Amigoo',
117
  'AO' => 'Amoi',
118
+ '60' => 'Andowl',
119
+ '7A' => 'Anry',
120
+ 'A0' => 'ANS',
121
  '3N' => 'Aoson',
122
  'AP' => 'Apple',
123
  'AR' => 'Archos',
 
124
  'AB' => 'Arian Space',
 
 
125
  'A6' => 'Ark',
126
+ '5A' => 'ArmPhone',
127
+ 'AN' => 'Arnova',
128
+ 'AS' => 'ARRIS',
129
+ '40' => 'Artel',
130
+ '21' => 'Artizlee',
131
  '8A' => 'Asano',
132
+ '90' => 'Asanzo',
133
+ 'A4' => 'Ask',
134
  'A8' => 'Assistant',
 
135
  'AU' => 'Asus',
136
+ '6A' => 'AT&T',
137
+ '2A' => 'Atom',
138
+ 'AX' => 'Audiovox',
139
  'ZA' => 'Avenzo',
140
+ 'AH' => 'AVH',
141
  'AV' => 'Avvio',
 
142
  'AY' => 'Axxion',
143
  'AM' => 'Azumi Mobile',
144
+ 'BO' => 'BangOlufsen',
145
+ 'BN' => 'Barnes & Noble',
146
  'BB' => 'BBK',
147
  '0B' => 'BB Mobile',
148
+ 'B6' => 'BDF',
149
  'BE' => 'Becker',
150
  'B5' => 'Beeline',
151
  'B0' => 'Beelink',
152
+ 'BL' => 'Beetel',
153
+ 'BQ' => 'BenQ',
154
+ 'BS' => 'BenQ-Siemens',
155
+ 'BZ' => 'Bezkam',
156
+ 'BG' => 'BGH',
157
+ '6B' => 'Bigben',
158
+ 'B8' => 'BIHEE',
159
  '1B' => 'Billion',
160
+ 'BH' => 'BioRugged',
161
+ 'BI' => 'Bird',
162
  'BT' => 'Bitel',
 
163
  'B7' => 'Bitmore',
164
+ 'BK' => 'Bkav',
165
+ '5B' => 'Black Bear',
166
+ 'BF' => 'Black Fox',
167
+ 'B2' => 'Blackview',
168
  'BP' => 'Blaupunkt',
169
+ 'BU' => 'Blu',
170
  'B3' => 'Bluboo',
171
+ '2B' => 'Bluedot',
172
+ 'BD' => 'Bluegood',
173
+ 'LB' => 'Bluewave',
174
  'BM' => 'Bmobile',
 
 
175
  'B9' => 'Bobarry',
 
 
 
 
 
176
  'B4' => 'bogo',
177
  'BW' => 'Boway',
 
178
  'BX' => 'bq',
179
+ '8B' => 'Brandt',
180
  'BV' => 'Bravis',
181
  'BR' => 'Brondi',
182
  'B1' => 'Bush',
183
+ 'C9' => 'CAGI',
184
+ 'CT' => 'Capitel',
185
  'CP' => 'Captiva',
186
+ 'CF' => 'Carrefour',
187
  'CS' => 'Casio',
188
  'R4' => 'Casper',
189
  'CA' => 'Cat',
190
+ '7C' => 'Celcus',
191
  'CE' => 'Celkon',
 
192
  'C2' => 'Changhong',
 
193
  'CH' => 'Cherry Mobile',
194
+ 'C3' => 'China Mobile',
195
  '1C' => 'Chuwi',
196
  'L8' => 'Clarmin',
197
  'CD' => 'Cloudfone',
198
  '6C' => 'Cloudpad',
199
  'C0' => 'Clout',
 
 
 
200
  'CN' => 'CnM',
 
 
 
 
 
 
 
 
 
 
 
 
201
  'CY' => 'Coby Kyros',
202
  'C6' => 'Comio',
203
+ 'CL' => 'Compal',
204
+ 'CQ' => 'Compaq',
205
  'C7' => 'ComTrade Tesla',
206
  'C8' => 'Concord',
207
+ 'CC' => 'ConCorde',
208
+ 'C5' => 'Condor',
209
+ '4C' => 'Conquest',
210
+ '3C' => 'Contixo',
211
+ 'CO' => 'Coolpad',
212
+ 'CW' => 'Cowon',
213
+ 'CR' => 'CreNova',
214
  'CX' => 'Crescent',
215
+ 'CK' => 'Cricket',
216
+ 'CM' => 'Crius Mea',
217
+ '0C' => 'Crony',
218
+ 'C1' => 'Crosscall',
219
+ 'CU' => 'Cube',
220
+ 'CB' => 'CUBOT',
221
  'CV' => 'CVTE',
222
+ 'C4' => 'Cyrus',
223
  'D5' => 'Daewoo',
224
  'DA' => 'Danew',
225
  'DT' => 'Datang',
226
  'D7' => 'Datawind',
227
  'D1' => 'Datsun',
228
+ 'DB' => 'Dbtel',
229
+ 'DL' => 'Dell',
230
  'DE' => 'Denver',
231
+ 'DS' => 'Desay',
232
  'DW' => 'DeWalt',
233
  'DX' => 'DEXP',
 
 
 
 
 
234
  'DG' => 'Dialog',
235
  'DI' => 'Dicam',
236
  'D4' => 'Digi',
237
  'D3' => 'Digicel',
238
+ 'DH' => 'Digihome',
239
  'DD' => 'Digiland',
240
  'D2' => 'Digma',
241
+ '1D' => 'Diva',
242
  'D6' => 'Divisat',
 
 
243
  'DM' => 'DMM',
244
+ 'DN' => 'DNS',
245
+ 'DC' => 'DoCoMo',
246
  'DF' => 'Doffler',
247
+ 'D9' => 'Dolamee',
248
+ 'DO' => 'Doogee',
249
+ 'D0' => 'Doopro',
250
  'DV' => 'Doov',
251
  'DP' => 'Dopod',
252
  'DR' => 'Doro',
254
  'DU' => 'Dune HD',
255
  'EB' => 'E-Boda',
256
  '2E' => 'E-Ceros',
257
+ 'E8' => 'E-tel',
258
+ 'EP' => 'Easypix',
259
  'EA' => 'EBEST',
 
 
 
260
  'E4' => 'Echo Mobiles',
261
  'ES' => 'ECS',
262
  'E6' => 'EE',
263
+ 'EK' => 'EKO',
264
  'EM' => 'Eks Mobility',
265
+ '7E' => 'ELARI',
 
266
  'L0' => 'Element',
267
  'EG' => 'Elenberg',
268
+ 'EL' => 'Elephone',
269
+ '4E' => 'Eltex',
270
+ 'ED' => 'Energizer',
271
  'E1' => 'Energy Sistem',
272
  '3E' => 'Enot',
273
+ '8E' => 'Epik One',
274
+ 'E7' => 'Ergo',
275
+ 'EC' => 'Ericsson',
276
  'ER' => 'Ericy',
277
  'EE' => 'Essential',
278
+ 'E2' => 'Essentielb',
279
  '6E' => 'eSTAR',
280
  'EN' => 'Eton',
 
 
281
  'ET' => 'eTouch',
282
+ '1E' => 'Etuline',
283
+ 'EU' => 'Eurostar',
284
+ 'E9' => 'Evercoss',
285
  'EV' => 'Evertek',
286
  'E3' => 'Evolio',
287
  'EO' => 'Evolveo',
288
+ 'E0' => 'EvroMedia',
289
+ 'XE' => 'ExMobile',
290
  'EH' => 'EXO',
291
  'EX' => 'Explay',
 
292
  'E5' => 'Extrem',
293
+ 'EI' => 'Ezio',
294
  'EZ' => 'Ezze',
 
 
 
 
295
  'FA' => 'Fairphone',
296
  'FM' => 'Famoco',
297
+ '17' => 'FarEasTone',
298
  'FE' => 'Fengxiang',
299
+ 'F7' => 'Fero',
300
  'FI' => 'FiGO',
301
+ 'F1' => 'FinePower',
302
+ 'FX' => 'Finlux',
303
  'F3' => 'FireFly Mobile',
304
  'FL' => 'Fly',
 
 
 
 
 
 
305
  'FN' => 'FNB',
 
306
  'FD' => 'Fondi',
307
  'F0' => 'Fonos',
308
+ 'F2' => 'FORME',
309
+ 'FR' => 'Forstar',
310
+ 'RF' => 'Fortis',
311
+ 'FO' => 'Foxconn',
312
+ 'FT' => 'Freetel',
313
+ 'FU' => 'Fujitsu',
314
  'GT' => 'G-TiDE',
315
  'GM' => 'Garmin-Asus',
316
  'GA' => 'Gateway',
317
  'GD' => 'Gemini',
318
  'GN' => 'General Mobile',
 
319
  'G2' => 'GEOFOX',
320
+ 'GE' => 'Geotel',
321
  'GH' => 'Ghia',
322
+ '2C' => 'Ghong',
323
  'GG' => 'Gigabyte',
324
  'GS' => 'Gigaset',
325
  'GZ' => 'Ginzzu',
326
+ 'GI' => 'Gionee',
327
  'G4' => 'Globex',
328
  'GC' => 'GOCLEVER',
329
  'GL' => 'Goly',
 
330
  'G5' => 'Gome',
331
  'G1' => 'GoMobile',
332
+ 'GO' => 'Google',
333
+ 'G0' => 'Goophone',
334
  'GR' => 'Gradiente',
335
  'GP' => 'Grape',
336
  'G6' => 'Gree',
 
337
  'GU' => 'Grundig',
338
  'HF' => 'Hafury',
339
  'HA' => 'Haier',
 
 
340
  'HE' => 'HannSpree',
341
+ 'HK' => 'Hardkernel',
342
+ 'HS' => 'Hasee',
343
+ 'H6' => 'Helio',
344
+ 'ZH' => 'Hezire',
345
  'HL' => 'Hi-Level',
346
  'H2' => 'Highscreen',
347
  '1H' => 'Hipstreet',
348
+ 'HI' => 'Hisense',
349
+ 'HC' => 'Hitachi',
350
  'H1' => 'Hoffmann',
 
351
  'H0' => 'Hometech',
352
+ 'HM' => 'Homtom',
353
+ 'HZ' => 'Hoozo',
354
  'HO' => 'Hosin',
355
+ 'H3' => 'Hotel',
356
  'HV' => 'Hotwav',
357
+ 'HW' => 'How',
358
  'HP' => 'HP',
359
  'HT' => 'HTC',
360
  'HD' => 'Huadoo',
361
  'HU' => 'Huawei',
362
  'HX' => 'Humax',
363
+ 'HR' => 'Hurricane',
364
  'HY' => 'Hyrican',
365
  'HN' => 'Hyundai',
 
 
 
366
  '3I' => 'i-Cherry',
367
  'IJ' => 'i-Joy',
368
+ 'IM' => 'i-mate',
369
+ 'IO' => 'i-mobile',
370
+ 'IB' => 'iBall',
371
  'IY' => 'iBerry',
372
  '7I' => 'iBrit',
373
+ 'I2' => 'IconBIT',
374
+ 'IC' => 'iDroid',
375
+ 'IG' => 'iGet',
376
  'IH' => 'iHunt',
377
+ 'IA' => 'Ikea',
378
  'IK' => 'iKoMo',
379
+ 'I7' => 'iLA',
 
 
 
 
380
  '2I' => 'iLife',
381
+ '1I' => 'iMars',
 
382
  'IL' => 'IMO Mobile',
383
+ 'I3' => 'Impression',
384
+ '6I' => 'Inco',
385
  'IW' => 'iNew',
 
386
  'IF' => 'Infinix',
387
  'I0' => 'InFocus',
388
+ 'II' => 'Inkti',
389
  'I5' => 'InnJoo',
390
  'IN' => 'Innostream',
 
391
  'I4' => 'Inoi',
 
 
 
 
 
 
 
 
392
  'IQ' => 'INQ',
393
+ 'IS' => 'Insignia',
394
  'IT' => 'Intek',
395
+ 'IX' => 'Intex',
396
  'IV' => 'Inverto',
397
+ '4I' => 'Invin',
398
+ 'I1' => 'iOcean',
399
+ 'IP' => 'iPro',
400
+ '8Q' => 'IQM',
401
+ 'I6' => 'Irbis',
402
+ '5I' => 'Iris',
403
+ 'IR' => 'iRola',
404
+ 'IU' => 'iRulu',
405
+ '9I' => 'iSWAG',
406
  'IZ' => 'iTel',
407
  '0I' => 'iTruck',
408
+ 'I8' => 'iVA',
409
+ 'IE' => 'iView',
410
+ '0J' => 'iVooMi',
411
  'I9' => 'iZotron',
412
  'JA' => 'JAY-Tech',
413
+ 'JF' => 'JFone',
414
  'JI' => 'Jiayu',
415
  'JG' => 'Jinga',
416
+ 'JK' => 'JKL',
417
  'JO' => 'Jolla',
418
  'J5' => 'Just5',
419
+ 'JV' => 'JVC',
420
+ 'KT' => 'K-Touch',
 
 
421
  'K4' => 'Kaan',
422
  'K7' => 'Kaiomy',
423
+ 'KL' => 'Kalley',
424
  'K6' => 'Kanji',
425
  'KA' => 'Karbonn',
426
  'K5' => 'KATV1',
427
+ 'KZ' => 'Kazam',
428
  'KD' => 'KDDI',
429
+ 'KS' => 'Kempler & Strauss',
430
+ 'K3' => 'Keneksi',
431
+ 'KX' => 'Kenxinda',
432
  'K1' => 'Kiano',
 
433
  'KI' => 'Kingsun',
434
+ 'KV' => 'Kivi',
435
+ '0K' => 'Klipad',
436
  'KC' => 'Kocaso',
437
+ 'KK' => 'Kodak',
438
  'KG' => 'Kogan',
 
439
  'KM' => 'Komu',
440
+ 'KO' => 'Konka',
441
+ 'KW' => 'Konrow',
442
+ 'KB' => 'Koobee',
443
+ '7K' => 'Koolnee',
444
  'K9' => 'Kooper',
 
 
 
445
  'KP' => 'KOPO',
 
446
  'KR' => 'Koridy',
447
  'K2' => 'KRONO',
448
+ 'KE' => 'Krüger&Matz',
449
+ 'KH' => 'KT-Tech',
450
  'K8' => 'Kuliao',
451
+ '8K' => 'Kult',
452
  'KU' => 'Kumai',
453
  'KY' => 'Kyocera',
 
454
  '1K' => 'Kzen',
 
 
455
  'LQ' => 'LAIQ',
 
456
  'L6' => 'Land Rover',
457
+ 'L2' => 'Landvo',
458
  'LA' => 'Lanix',
459
  'LK' => 'Lark',
460
+ 'LV' => 'Lava',
461
  'LC' => 'LCT',
462
  'L5' => 'Leagoo',
463
  'LD' => 'Ledstar',
464
  'L1' => 'LeEco',
465
+ '4B' => 'Leff',
466
  'L4' => 'Lemhoov',
 
467
  'LN' => 'Lenco',
468
+ 'LE' => 'Lenovo',
469
  'LT' => 'Leotec',
470
+ 'LP' => 'Le Pan',
471
  'L7' => 'Lephone',
472
  'LZ' => 'Lesia',
473
+ 'L3' => 'Lexand',
474
+ 'LX' => 'Lexibook',
475
  'LG' => 'LG',
476
  'LI' => 'Lingwin',
477
+ '5L' => 'Linsar',
478
  'LO' => 'Loewe',
 
479
  '1L' => 'Logic',
480
+ 'LM' => 'Logicom',
 
 
 
481
  '0L' => 'Lumigon',
482
+ 'LU' => 'Lumus',
483
  'L9' => 'Luna',
484
+ 'LR' => 'Luxor',
485
+ 'LY' => 'LYF',
486
+ 'MQ' => 'M.T.T.',
487
  'MN' => 'M4tel',
488
  'XM' => 'Macoox',
489
  'MJ' => 'Majestic',
 
 
 
490
  '5M' => 'Mann',
491
+ 'MA' => 'Manta Multimedia',
492
  '2M' => 'Masstel',
493
+ '50' => 'Matrix',
494
  '7M' => 'Maxcom',
495
+ '6X' => 'Maxtron',
496
  '0D' => 'MAXVI',
497
+ 'MW' => 'Maxwest',
498
  'M0' => 'Maze',
499
+ '09' => 'meanIT',
 
 
500
  'M3' => 'Mecer',
501
+ '0M' => 'Mecool',
502
+ 'MC' => 'Mediacom',
503
+ 'MK' => 'MediaTek',
504
  'MD' => 'Medion',
505
  'M2' => 'MEEG',
506
+ 'MP' => 'MegaFon',
507
  '3M' => 'Meitu',
508
+ 'M1' => 'Meizu',
 
509
  '0E' => 'Melrose',
510
+ 'MU' => 'Memup',
511
+ 'ME' => 'Metz',
512
  'MX' => 'MEU',
513
  'MI' => 'MicroMax',
514
+ 'MS' => 'Microsoft',
515
  '1X' => 'Minix',
516
+ 'OM' => 'Mintt',
517
+ 'MO' => 'Mio',
518
+ 'M7' => 'Miray',
519
+ '8M' => 'Mito',
520
+ 'MT' => 'Mitsubishi',
521
  'M5' => 'MIXC',
522
  '1Z' => 'MiXzo',
523
+ 'ML' => 'MLLED',
524
+ 'LS' => 'MLS',
525
  '4M' => 'Mobicel',
526
  'M6' => 'Mobiistar',
527
+ 'MH' => 'Mobiola',
528
+ 'MB' => 'Mobistel',
529
+ '6W' => 'MobiWire',
530
+ '9M' => 'Mobo',
 
 
531
  'M4' => 'Modecom',
532
  'MF' => 'Mofut',
533
  'MR' => 'Motorola',
534
  'MV' => 'Movic',
535
+ 'MM' => 'Mpman',
 
 
536
  'MZ' => 'MSI',
537
+ 'M9' => 'MTC',
 
 
 
538
  'N4' => 'MTN',
539
+ '1R' => 'Multilaser',
 
540
  '1M' => 'MYFON',
541
+ 'MY' => 'MyPhone',
542
  'M8' => 'Myria',
543
  '6M' => 'Mystery',
544
+ '3T' => 'MyTab',
545
+ 'MG' => 'MyWigo',
 
 
546
  'N7' => 'National',
547
+ '6N' => 'Navitech',
548
+ 'N3' => 'Navon',
549
  'NE' => 'NEC',
 
 
 
550
  'NF' => 'Neffos',
551
+ '1N' => 'Neomi',
552
  'NA' => 'Netgear',
553
  'NU' => 'NeuImage',
554
+ 'NW' => 'Newgen',
555
+ 'N9' => 'Newland',
556
+ '0N' => 'Newman',
557
+ 'NS' => 'NewsMy',
558
+ 'XB' => 'NEXBOX',
559
+ 'NX' => 'Nexian',
560
+ 'N8' => 'NEXON',
561
+ 'N2' => 'Nextbit',
562
+ 'NT' => 'NextBook',
563
+ '4N' => 'NextTab',
564
  'NG' => 'NGM',
565
  'NZ' => 'NG Optics',
566
+ 'NN' => 'Nikon',
 
567
  'NI' => 'Nintendo',
568
+ 'N5' => 'NOA',
569
  'N1' => 'Noain',
570
+ 'N6' => 'Nobby',
 
 
571
  'NB' => 'Noblex',
572
+ 'NK' => 'Nokia',
573
  'NM' => 'Nomi',
574
  '2N' => 'Nomu',
575
+ 'NR' => 'Nordmende',
576
+ '7N' => 'NorthTech',
577
+ '5N' => 'Nos',
578
+ 'NO' => 'Nous',
579
+ 'NJ' => 'NuAns',
580
  'NL' => 'NUU Mobile',
581
+ 'N0' => 'Nuvo',
582
+ 'NV' => 'Nvidia',
583
  'NY' => 'NYX Mobile',
 
 
 
 
 
 
 
584
  'O3' => 'O+',
585
+ 'OT' => 'O2',
586
+ 'O7' => 'Oale',
587
  'OB' => 'Obi',
588
  'O1' => 'Odys',
589
  'OA' => 'Okapia',
590
  'OD' => 'Onda',
591
  'ON' => 'OnePlus',
592
  'OX' => 'Onix',
593
+ 'O4' => 'ONN',
594
+ '2O' => 'OpelMobile',
595
  'OH' => 'Openbox',
596
  'OP' => 'OPPO',
597
+ 'OO' => 'Opsson',
598
  'OR' => 'Orange',
599
  'O5' => 'Orbic',
600
  'OS' => 'Ordissimo',
 
601
  'OK' => 'Ouki',
602
  'OE' => 'Oukitel',
603
  'OU' => 'OUYA',
 
604
  'OV' => 'Overmax',
605
  '30' => 'Ovvi',
606
+ 'O2' => 'Owwo',
607
  'OY' => 'Oysters',
608
  'O6' => 'Oyyu',
 
 
609
  'OZ' => 'OzoneHD',
610
+ '7P' => 'P-UP',
611
+ 'PM' => 'Palm',
612
  'PN' => 'Panacom',
613
  'PA' => 'Panasonic',
614
+ 'PT' => 'Pantech',
615
  'PB' => 'PCBOX',
616
  'PC' => 'PCD',
617
  'PD' => 'PCD Argentina',
618
  'PE' => 'PEAQ',
619
  'PG' => 'Pentagram',
 
 
620
  '1P' => 'Phicomm',
621
+ '4P' => 'Philco',
622
+ 'PH' => 'Philips',
623
+ '5P' => 'Phonemax',
624
+ 'PO' => 'phoneOne',
625
  'PI' => 'Pioneer',
 
626
  '8P' => 'Pixelphone',
627
+ 'PX' => 'Pixus',
628
+ '9P' => 'Planet Computers',
 
 
 
 
 
 
 
 
 
629
  'PY' => 'Ployer',
630
  'P4' => 'Plum',
631
  'P8' => 'PocketBook',
632
+ '0P' => 'POCO',
633
  'PV' => 'Point of View',
634
+ 'PL' => 'Polaroid',
635
  'PP' => 'PolyPad',
636
+ 'P5' => 'Polytron',
637
  'P2' => 'Pomp',
638
+ 'P0' => 'Poppox',
639
  'PS' => 'Positivo',
640
+ '3P' => 'Positivo BGH',
641
+ 'P3' => 'PPTV',
642
+ 'FP' => 'Premio',
643
  'PR' => 'Prestigio',
644
+ 'P9' => 'Primepad',
645
  '6P' => 'Primux',
646
+ '2P' => 'Prixton',
647
+ 'P6' => 'Proline',
648
  'P1' => 'ProScan',
649
+ 'P7' => 'Protruly',
650
  'PU' => 'PULID',
651
+ 'QH' => 'Q-Touch',
652
  'QB' => 'Q.Bell',
653
  'QI' => 'Qilive',
 
 
654
  'QM' => 'QMobile',
655
+ 'QT' => 'Qtek',
656
  'QA' => 'Quantum',
657
  'QU' => 'Quechua',
658
  'QO' => 'Qumo',
659
+ 'R2' => 'R-TV',
660
  'RA' => 'Ramos',
 
 
661
  'R9' => 'Ravoz',
662
  'RZ' => 'Razer',
663
  'RC' => 'RCA Tablets',
664
+ '2R' => 'Reach',
665
  'RB' => 'Readboy',
666
+ 'RE' => 'Realme',
667
+ 'R8' => 'RED',
668
+ 'RD' => 'Reeder',
669
  'RI' => 'Rikomagic',
670
+ 'RM' => 'RIM',
671
  'RN' => 'Rinno',
672
+ 'RX' => 'Ritmix',
673
+ 'R7' => 'Ritzviva',
674
  'RV' => 'Riviera',
 
 
 
 
675
  'RR' => 'Roadrover',
676
  'R1' => 'Rokit',
677
+ 'RK' => 'Roku',
678
  'R3' => 'Rombica',
 
 
 
679
  'R5' => 'Ross&Moor',
680
+ 'RO' => 'Rover',
681
+ 'R6' => 'RoverPad',
682
+ 'RT' => 'RT Project',
683
  'RG' => 'RugGear',
684
  'RU' => 'Runbo',
685
  'RY' => 'Ryte',
686
+ 'X1' => 'Safaricom',
687
+ 'SG' => 'Sagem',
688
+ '4L' => 'Salora',
689
  'SA' => 'Samsung',
690
  'S0' => 'Sanei',
691
+ '12' => 'Sansui',
692
+ 'SQ' => 'Santin',
693
+ 'SY' => 'Sanyo',
694
+ 'S9' => 'Savio',
695
  'CZ' => 'Schneider',
696
  'SD' => 'Sega',
697
+ '9G' => 'Selenga',
698
+ 'SV' => 'Selevision',
699
  'SL' => 'Selfix',
700
+ '0S' => 'SEMP TCL',
 
701
  'S1' => 'Sencor',
702
+ 'SN' => 'Sendo',
703
+ '01' => 'Senkatel',
704
+ 'S6' => 'Senseit',
705
+ 'EW' => 'Senwa',
706
  'SX' => 'SFR',
 
707
  'SH' => 'Sharp',
708
  '7S' => 'Shift Phones',
709
  'RS' => 'Shtrikh-M',
710
  '3S' => 'Shuttle',
711
+ '13' => 'Sico',
712
  'SI' => 'Siemens',
 
713
  '1S' => 'Sigma',
714
+ '70' => 'Silelis',
715
+ 'SJ' => 'Silent Circle',
716
+ '10' => 'Simbans',
717
+ '31' => 'Siragon',
718
  'SW' => 'Sky',
719
  'SK' => 'Skyworth',
720
+ '14' => 'Smadl',
721
+ '19' => 'Smailo',
722
+ 'SR' => 'Smart',
723
+ '80' => 'SMARTEC',
724
  'SC' => 'Smartfren',
725
+ 'S7' => 'Smartisan',
726
+ 'SF' => 'Softbank',
727
+ '16' => 'Solone',
728
  'OI' => 'Sonim',
729
+ 'SO' => 'Sony',
730
+ 'SE' => 'Sony Ericsson',
731
  'X2' => 'Soundmax',
732
  '8S' => 'Soyes',
733
+ 'FS' => 'SPC',
734
  '6S' => 'Spectrum',
735
+ 'SP' => 'Spice',
736
+ 'QS' => 'SQOOL',
 
 
 
 
 
 
 
 
 
 
737
  'S4' => 'Star',
738
  'OL' => 'Starlight',
739
+ '18' => 'Starmobile',
740
+ '2S' => 'Starway',
741
  'SB' => 'STF Mobile',
742
  'S8' => 'STK',
 
 
 
743
  'S2' => 'Stonex',
744
+ 'ST' => 'Storex',
745
+ '9S' => 'Sugar',
746
  'SZ' => 'Sumvision',
747
+ '0H' => 'Sunstech',
748
+ 'S3' => 'SunVan',
749
+ '5S' => 'Sunvell',
750
+ 'SU' => 'SuperSonic',
751
+ 'S5' => 'Supra',
752
+ '0W' => 'Swipe',
753
  'SS' => 'SWISSMOBILITY',
754
  '1W' => 'Swisstone',
755
+ 'SM' => 'Symphony',
756
+ '4S' => 'Syrox',
757
+ 'TM' => 'T-Mobile',
 
 
758
  'TK' => 'Takara',
759
+ '9N' => 'Tanix',
 
760
  'T5' => 'TB Touch',
761
  'TC' => 'TCL',
762
+ 'T0' => 'TD Systems',
763
+ 'TX' => 'TechniSat',
764
+ 'TT' => 'TechnoTrend',
765
+ 'TP' => 'TechPad',
766
+ '9E' => 'Techwood',
767
  'T7' => 'Teclast',
 
 
 
 
768
  'TB' => 'Tecno Mobile',
 
 
 
 
 
 
 
 
769
  '2L' => 'Tele2',
770
+ 'TL' => 'Telefunken',
771
+ 'TG' => 'Telego',
772
  'T2' => 'Telenor',
773
+ 'TE' => 'Telit',
774
+ 'TD' => 'Tesco',
775
+ 'TA' => 'Tesla',
776
+ '9T' => 'Tetratab',
777
+ 'TZ' => 'teXet',
778
+ 'T4' => 'ThL',
779
  'TN' => 'Thomson',
780
+ 'O0' => 'Thuraya',
781
+ 'TI' => 'TIANYU',
782
  '8T' => 'Time2',
783
  'TQ' => 'Timovi',
784
+ '2T' => 'Tinai',
785
+ 'TF' => 'Tinmo',
786
+ 'TH' => 'TiPhone',
787
  'T1' => 'Tolino',
788
+ '0T' => 'Tone',
789
+ 'TY' => 'Tooky',
790
  'T9' => 'Top House',
791
  'TO' => 'Toplux',
792
  '7T' => 'Torex',
 
793
  'TS' => 'Toshiba',
794
+ 'T8' => 'Touchmate',
795
+ '5R' => 'Transpeed',
796
  'T6' => 'TrekStor',
797
  'T3' => 'Trevi',
798
+ 'TJ' => 'Trifone',
799
+ '4T' => 'Tronsmart',
800
+ '11' => 'True',
801
+ '5C' => 'TTEC',
802
  'TU' => 'Tunisie Telecom',
 
803
  '1T' => 'Turbo',
804
+ 'TR' => 'Turbo-X',
805
  '5T' => 'TurboKids',
 
806
  'TV' => 'TVC',
807
  'TW' => 'TWM',
808
  '6T' => 'Twoe',
809
+ '15' => 'Tymes',
 
810
  'UC' => 'U.S. Cellular',
 
 
811
  'UG' => 'Ugoos',
812
+ 'U1' => 'Uhans',
813
+ 'UH' => 'Uhappy',
814
  'UL' => 'Ulefone',
815
+ 'UA' => 'Umax',
816
+ 'UM' => 'UMIDIGI',
817
+ 'UZ' => 'Unihertz',
818
  'UX' => 'Unimax',
819
+ 'US' => 'Uniscope',
820
  'U2' => 'UNIWA',
821
+ 'UO' => 'Unnecto',
822
  'UU' => 'Unonu',
823
+ 'UN' => 'Unowhy',
824
  'UK' => 'UTOK',
 
825
  'UT' => 'UTStarcom',
826
+ '5V' => 'VAIO',
827
  'VA' => 'Vastking',
 
 
828
  'VN' => 'Venso',
 
 
 
 
 
 
 
 
 
 
 
 
829
  '4V' => 'Verico',
830
+ 'V4' => 'Verizon',
831
+ 'VR' => 'Vernee',
832
+ 'VX' => 'Vertex',
833
+ 'VE' => 'Vertu',
834
  'VL' => 'Verykool',
835
+ 'V8' => 'Vesta',
836
+ 'VT' => 'Vestel',
837
  'V6' => 'VGO TEL',
838
+ 'VD' => 'Videocon',
839
+ 'VW' => 'Videoweb',
840
+ 'VS' => 'ViewSonic',
841
+ 'V7' => 'Vinga',
842
  'V3' => 'Vinsoc',
843
+ '0V' => 'Vipro',
844
+ 'VI' => 'Vitelcom',
845
+ '8V' => 'Viumee',
846
+ 'V5' => 'Vivax',
847
+ 'VV' => 'Vivo',
848
+ 'VZ' => 'Vizio',
849
+ 'VK' => 'VK Mobile',
850
+ 'V0' => 'VKworld',
851
+ 'VM' => 'Vodacom',
852
+ 'VF' => 'Vodafone',
853
  'V2' => 'Vonino',
854
  '1V' => 'Vontar',
855
  'VG' => 'Vorago',
856
  '2V' => 'Vorke',
857
  'V1' => 'Voto',
858
  'VO' => 'Voxtel',
 
 
 
859
  'VY' => 'Voyo',
860
+ 'VH' => 'Vsmart',
861
+ 'V9' => 'Vsun',
862
  'VU' => 'Vulcan',
863
+ '3V' => 'VVETIME',
864
  'WA' => 'Walton',
 
 
865
  'WM' => 'Weimei',
866
  'WE' => 'WellcoM',
867
+ 'WT' => 'Westpoint',
868
  'WY' => 'Wexler',
869
+ 'WP' => 'Wieppo',
870
  'W2' => 'Wigor',
871
  'WI' => 'Wiko',
872
+ 'WF' => 'Wileyfox',
873
  'WS' => 'Winds',
874
+ 'WN' => 'Wink',
875
+ '9W' => 'Winmax',
876
+ 'W0' => 'Wiseasy',
877
+ '2W' => 'Wizz',
878
  'WL' => 'Wolder',
879
  'WG' => 'Wolfgang',
880
  'WO' => 'Wonu',
881
  'W1' => 'Woo',
 
882
  'WR' => 'Wortmann',
883
+ 'WX' => 'Woxter',
884
+ 'X3' => 'X-BO',
885
+ 'XT' => 'X-TIGI',
886
  'XV' => 'X-View',
887
+ 'X4' => 'X.Vision',
888
+ 'XG' => 'Xgody',
889
  'XL' => 'Xiaolajiao',
890
+ 'XI' => 'Xiaomi',
891
  'XN' => 'Xion',
892
  'XO' => 'Xolo',
893
  'XR' => 'Xoro',
894
+ 'XS' => 'Xshitou',
895
+ '4X' => 'Xtouch',
896
  'YD' => 'Yandex',
897
+ 'YA' => 'Yarvik',
898
  'Y2' => 'Yes',
899
  'YE' => 'Yezz',
900
+ 'YK' => 'Yoka TV',
901
+ 'YO' => 'Yota',
902
+ 'YT' => 'Ytone',
903
  'Y1' => 'Yu',
904
  'YU' => 'Yuandao',
905
  'YS' => 'Yusun',
 
 
906
  'YX' => 'Yxtel',
907
  '0Z' => 'Zatec',
908
+ 'PZ' => 'Zebra',
909
  'ZE' => 'Zeemi',
910
+ 'ZN' => 'Zen',
911
  'ZK' => 'Zenek',
912
+ 'ZL' => 'Zentality',
913
  'ZF' => 'Zfiner',
 
914
  'ZI' => 'Zidoo',
915
  'ZX' => 'Ziox',
916
+ 'ZO' => 'Zonda',
917
  'ZP' => 'Zopo',
918
  'ZT' => 'ZTE',
919
  'ZU' => 'Zuum',
 
920
  'ZY' => 'Zync',
921
  'ZQ' => 'ZYQ',
922
+ 'OW' => 'öwn',
 
 
 
 
923
  // legacy brands, might be removed in future versions
924
  'WB' => 'Web TV',
925
  'XX' => 'Unknown',
app/vendor/matomo/device-detector/Parser/OperatingSystem.php CHANGED
@@ -51,11 +51,14 @@ class OperatingSystem extends AbstractParser
51
  'COS' => 'Chrome OS',
52
  'CYN' => 'CyanogenMod',
53
  'DEB' => 'Debian',
 
54
  'DFB' => 'DragonFly',
55
  'FED' => 'Fedora',
56
  'FOS' => 'Firefox OS',
57
  'FIR' => 'Fire OS',
 
58
  'BSD' => 'FreeBSD',
 
59
  'GNT' => 'Gentoo',
60
  'GTV' => 'Google TV',
61
  'HPX' => 'HP-UX',
@@ -95,6 +98,7 @@ class OperatingSystem extends AbstractParser
95
  'SAB' => 'Sabayon',
96
  'SSE' => 'SUSE',
97
  'SAF' => 'Sailfish OS',
 
98
  'SLW' => 'Slackware',
99
  'SOS' => 'Solaris',
100
  'SYL' => 'Syllable',
@@ -107,7 +111,9 @@ class OperatingSystem extends AbstractParser
107
  'TIZ' => 'Tizen',
108
  'TOS' => 'TmaxOS',
109
  'UBT' => 'Ubuntu',
 
110
  'WTV' => 'WebTV',
 
111
  'WIN' => 'Windows',
112
  'WCE' => 'Windows CE',
113
  'WIO' => 'Windows IoT',
@@ -134,17 +140,17 @@ class OperatingSystem extends AbstractParser
134
  'BlackBerry' => ['BLB', 'QNX'],
135
  'Brew' => ['BMP'],
136
  'BeOS' => ['BEO', 'HAI'],
137
- 'Chrome OS' => ['COS'],
138
  'Firefox OS' => ['FOS', 'KOS'],
139
  'Gaming Console' => ['WII', 'PS3'],
140
  'Google TV' => ['GTV'],
141
  'IBM' => ['OS2'],
142
- 'iOS' => ['IOS'],
143
  'RISC OS' => ['ROS'],
144
  'GNU/Linux' => [
145
  'LIN', 'ARL', 'DEB', 'KNO', 'MIN', 'UBT', 'KBT', 'XBT', 'LBT', 'FED',
146
  'RHT', 'VLN', 'MDR', 'GNT', 'SAB', 'SLW', 'SSE', 'CES', 'BTR', 'SAF',
147
- 'ORD', 'TOS', 'RSO',
148
  ],
149
  'Mac' => ['MAC'],
150
  'Mobile Gaming Console' => ['PSP', 'NDS', 'XBX'],
@@ -155,6 +161,7 @@ class OperatingSystem extends AbstractParser
155
  'WebTV' => ['WTV'],
156
  'Windows' => ['WIN'],
157
  'Windows Mobile' => ['WPH', 'WMO', 'WCE', 'WRT', 'WIO'],
 
158
  ];
159
 
160
  /**
@@ -268,10 +275,18 @@ class OperatingSystem extends AbstractParser
268
  */
269
  protected function parsePlatform(): string
270
  {
271
- if ($this->matchUserAgent('arm')) {
272
  return 'ARM';
273
  }
274
 
 
 
 
 
 
 
 
 
275
  if ($this->matchUserAgent('WOW64|x64|win64|amd64|x86_64')) {
276
  return 'x64';
277
  }
51
  'COS' => 'Chrome OS',
52
  'CYN' => 'CyanogenMod',
53
  'DEB' => 'Debian',
54
+ 'DEE' => 'Deepin',
55
  'DFB' => 'DragonFly',
56
  'FED' => 'Fedora',
57
  'FOS' => 'Firefox OS',
58
  'FIR' => 'Fire OS',
59
+ 'FRE' => 'Freebox',
60
  'BSD' => 'FreeBSD',
61
+ 'FYD' => 'FydeOS',
62
  'GNT' => 'Gentoo',
63
  'GTV' => 'Google TV',
64
  'HPX' => 'HP-UX',
98
  'SAB' => 'Sabayon',
99
  'SSE' => 'SUSE',
100
  'SAF' => 'Sailfish OS',
101
+ 'SEE' => 'SeewoOS',
102
  'SLW' => 'Slackware',
103
  'SOS' => 'Solaris',
104
  'SYL' => 'Syllable',
111
  'TIZ' => 'Tizen',
112
  'TOS' => 'TmaxOS',
113
  'UBT' => 'Ubuntu',
114
+ 'WAS' => 'watchOS',
115
  'WTV' => 'WebTV',
116
+ 'WHS' => 'Whale OS',
117
  'WIN' => 'Windows',
118
  'WCE' => 'Windows CE',
119
  'WIO' => 'Windows IoT',
140
  'BlackBerry' => ['BLB', 'QNX'],
141
  'Brew' => ['BMP'],
142
  'BeOS' => ['BEO', 'HAI'],
143
+ 'Chrome OS' => ['COS', 'FYD', 'SEE'],
144
  'Firefox OS' => ['FOS', 'KOS'],
145
  'Gaming Console' => ['WII', 'PS3'],
146
  'Google TV' => ['GTV'],
147
  'IBM' => ['OS2'],
148
+ 'iOS' => ['IOS', 'WAS'],
149
  'RISC OS' => ['ROS'],
150
  'GNU/Linux' => [
151
  'LIN', 'ARL', 'DEB', 'KNO', 'MIN', 'UBT', 'KBT', 'XBT', 'LBT', 'FED',
152
  'RHT', 'VLN', 'MDR', 'GNT', 'SAB', 'SLW', 'SSE', 'CES', 'BTR', 'SAF',
153
+ 'ORD', 'TOS', 'RSO', 'DEE', 'FRE',
154
  ],
155
  'Mac' => ['MAC'],
156
  'Mobile Gaming Console' => ['PSP', 'NDS', 'XBX'],
161
  'WebTV' => ['WTV'],
162
  'Windows' => ['WIN'],
163
  'Windows Mobile' => ['WPH', 'WMO', 'WCE', 'WRT', 'WIO'],
164
+ 'Other Smart TV' => ['WHS'],
165
  ];
166
 
167
  /**
275
  */
276
  protected function parsePlatform(): string
277
  {
278
+ if ($this->matchUserAgent('arm|aarch64|Watch ?OS|Watch1,[12]')) {
279
  return 'ARM';
280
  }
281
 
282
+ if ($this->matchUserAgent('mips')) {
283
+ return 'MIPS';
284
+ }
285
+
286
+ if ($this->matchUserAgent('sh4')) {
287
+ return 'SuperH';
288
+ }
289
+
290
  if ($this->matchUserAgent('WOW64|x64|win64|amd64|x86_64')) {
291
  return 'x64';
292
  }
app/vendor/matomo/device-detector/README.md CHANGED
@@ -8,7 +8,10 @@ DeviceDetector
8
 
9
  ## Code Status
10
 
11
- [![Build Status](https://travis-ci.org/matomo-org/device-detector.svg?branch=master)](https://travis-ci.org/matomo-org/device-detector)
 
 
 
12
  [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/matomo-org/device-detector.svg)](http://isitmaintained.com/project/matomo-org/device-detector "Average time to resolve an issue")
13
  [![Percentage of issues still open](http://isitmaintained.com/badge/open/matomo-org/device-detector.svg)](http://isitmaintained.com/project/matomo-org/device-detector "Percentage of issues still open")
14
 
@@ -203,15 +206,15 @@ There are already a few ports of this tool to other languages:
203
 
204
  The lists below are auto generated and updated from time to time. Some of them might not be complete.
205
 
206
- *Last update: 2020/12/05*
207
 
208
  ### List of detected operating systems:
209
 
210
- AIX, Android, AmigaOS, Apple TV, Arch Linux, BackTrack, Bada, BeOS, BlackBerry OS, BlackBerry Tablet OS, Brew, CentOS, Chrome OS, CyanogenMod, Debian, DragonFly, Fedora, Firefox OS, Fire OS, FreeBSD, Gentoo, Google TV, HP-UX, Haiku OS, IRIX, Inferno, KaiOS, Knoppix, Kubuntu, GNU/Linux, Lubuntu, VectorLinux, Mac, Maemo, Mandriva, MeeGo, MocorDroid, Mint, MildWild, MorphOS, NetBSD, MTK / Nucleus, MRE, Nintendo, Nintendo Mobile, OS/2, OSF1, OpenBSD, Ordissimo, PlayStation Portable, PlayStation, Red Hat, RISC OS, Rosa, Remix OS, RazoDroiD, Sabayon, SUSE, Sailfish OS, Slackware, Solaris, Syllable, Symbian, Symbian OS, Symbian OS Series 40, Symbian OS Series 60, Symbian^3, ThreadX, Tizen, TmaxOS, Ubuntu, WebTV, Windows, Windows CE, Windows IoT, Windows Mobile, Windows Phone, Windows RT, Xbox, Xubuntu, YunOs, iOS, palmOS, webOS
211
 
212
  ### List of detected browsers:
213
 
214
- 115 Browser, 2345 Browser, 360 Phone Browser, 360 Browser, Avant Browser, ABrowse, ANT Fresco, ANTGalio, Aloha Browser, Aloha Browser Lite, Amaya, Amigo, Android Browser, AOL Desktop, AOL Shield, Arora, Arctic Fox, Amiga Voyager, Amiga Aweb, Atom, Atomic Web Browser, Avast Secure Browser, AVG Secure Browser, Beaker Browser, Beamrise, BlackBerry Browser, Baidu Browser, Baidu Spark, Basilisk, Beonex, BlackHawk, Bunjalloo, B-Line, Blue Browser, Borealis Navigator, Brave, BriskBard, BrowseX, Browzar, Camino, CCleaner, Centaury, Coc Coc, Colibri, Comodo Dragon, Coast, Charon, CM Browser, Chrome Frame, Headless Chrome, Chrome, Chrome Mobile iOS, Conkeror, Chrome Mobile, CoolNovo, CometBird, COS Browser, ChromePlus, Chromium, Cyberfox, Cheshire, Crusta, Crazy Browser, Cunaguaro, Chrome Webview, dbrowser, Deepnet Explorer, Delta Browser, Dolphin, Dorado, Dooble, Dillo, DuckDuckGo Privacy Browser, Ecosia, Epic, Elinks, Element Browser, Elements Browser, eZ Browser, EUI Browser, GNOME Web, Espial TV Browser, Falkon, Faux Browser, Firefox Mobile iOS, Firebird, Fluid, Fennec, Firefox, Firefox Focus, Firefox Reality, Firefox Rocket, Flock, Firefox Mobile, Fireweb, Fireweb Navigator, FreeU, Galeon, Ghostery Privacy Browser, Glass Browser, Google Earth, GOG Galaxy, Hawk Turbo Browser, hola! Browser, HotJava, Huawei Browser, IBrowse, iCab, iCab Mobile, Iridium, Iron Mobile, IceCat, IceDragon, Isivioo, Iceweasel, Internet Explorer, IE Mobile, Iron, Japan Browser, Jasmine, Jig Browser, Jig Browser Plus, Jio Browser, K.Browser, Kindle Browser, K-meleon, Konqueror, Kapiko, Kinza, Kiwi, Kylo, Kazehakase, Cheetah Browser, LieBaoFast, LG Browser, Light, Links, Lovense Browser, LuaKit, Lulumi, Lunascape, Lunascape Lite, Lynx, mCent, MicroB, NCSA Mosaic, Meizu Browser, Mercury, Mobile Safari, Midori, Mobicip, MIUI Browser, Mobile Silk, Minimo, Mint Browser, Maxthon, MxNitro, Mypal, Monument Browser, MAUI WAP Browser, NFS Browser, Nokia Browser, Nokia OSS Browser, Nokia Ovi Browser, Nox Browser, NetSurf, NetFront, NetFront Life, NetPositive, Netscape, NTENT Browser, Oculus Browser, Opera Mini iOS, Obigo, Odyssey Web Browser, Off By One, OhHai Browser, ONE Browser, Opera GX, Opera Neon, Opera Devices, Opera Mini, Opera Mobile, Opera, Opera Next, Opera Touch, Ordissimo, Oregano, Origin In-Game Overlay, Origyn Web Browser, Openwave Mobile Browser, OmniWeb, Otter Browser, Palm Blazer, Pale Moon, Polypane, Oppo Browser, Palm Pre, Puffin, Palm WebPro, Palmscape, Phoenix, Phoenix Browser, Polaris, Polarity, PrivacyWall, Microsoft Edge, QQ Browser Mini, QQ Browser, Qutebrowser, Quark, QupZilla, Qwant Mobile, QtWebEngine, Realme Browser, Rekonq, RockMelt, Samsung Browser, Sailfish Browser, SEMC-Browser, Sogou Explorer, Safari, Safe Exam Browser, SalamWeb, Shiira, SimpleBrowser, Sizzy, Skyfire, Seraphic Sraf, Sleipnir, Slimjet, 7Star, Smart Lenovo Browser, Snowshoe, Sogou Mobile Browser, Splash, Sputnik Browser, Sunrise, SuperBird, Super Fast Browser, surf, Stargon, START Internet Browser, Steam In-Game Overlay, Streamy, Swiftfox, Seznam Browser, t-online.de Browser, Tao Browser, TenFourFox, Tenta Browser, Tizen Browser, Tungsten, ToGate, TweakStyle, TV Bro, UBrowser, UC Browser, UC Browser Mini, UC Browser Turbo, Uzbl, Vivaldi, vivo Browser, Vision Mobile Browser, VMware AirWatch, Wear Internet Browser, Web Explorer, WebPositive, Waterfox, Whale Browser, wOSBrowser, WeTab Browser, Yahoo! Japan Browser, Yandex Browser, Yandex Browser Lite, Yaani Browser, Yolo Browser, Xiino, Xvast, Zvu
215
 
216
  ### List of detected browser engines:
217
 
@@ -227,7 +230,7 @@ Audacious, Banshee, Boxee, Clementine, Deezer, FlyCast, Foobar2000, Google Podca
227
 
228
  ### List of detected mobile apps:
229
 
230
- AndroidDownloadManager, AntennaPod, Apple News, Baidu Box App, BeyondPod, BingWebApp, bPod, CastBox, Castro, Castro 2, CrosswalkApp, DingTalk, DoggCatcher, douban App, Facebook, Facebook Messenger, FeedR, Flipboard App, Google Go, Google Play Newsstand, Google Plus, Google Search App, HeyTapBrowser, iCatcher, Instacast, Instagram App, Line, LinkedIn, NewsArticle App, Overcast, Pinterest, Player FM, Pocket Casts, Podcast & Radio Addict, Podcast Republic, Podcasts, Podcat, Podcatcher Deluxe, Podkicker, Roblox, RSSRadio, Sina Weibo, Siri, Snapchat, SogouSearch App, tieba, TopBuzz, Twitter, U-Cursos, UnityPlayer, Viber, WeChat, WhatsApp, Yahoo! Japan, Yelp Mobile, YouTube and *mobile apps using [AFNetworking](https://github.com/AFNetworking/AFNetworking)*
231
 
232
  ### List of detected PIMs (personal information manager):
233
 
@@ -239,8 +242,8 @@ Akregator, Apple PubSub, BashPodder, Breaker, Downcast, FeedDemon, Feeddler RSS
239
 
240
  ### List of brands with detected devices:
241
 
242
- 2E, 3Q, 4Good, 360, 8848, A1, Accent, Ace, Acer, Advan, Advance, AGM, Ainol, Airness, Airties, AIS, Aiwa, Akai, Alba, Alcatel, Alcor, Alfawise, Aligator, AllCall, AllDocube, Allview, Allwinner, Altech UEC, altron, Amazon, AMGOO, Amigoo, Amoi, Anry, ANS, Aoson, Apple, Archos, Arian Space, Ark, ArmPhone, Arnova, ARRIS, Artel, Asano, Ask, Assistant, Asus, AT&T, Atom, Audiovox, Avenzo, AVH, Avvio, Axxion, Azumi Mobile, BangOlufsen, Barnes & Noble, BBK, BB Mobile, BDF, Becker, Beeline, Beelink, Beetel, BenQ, BenQ-Siemens, Bezkam, BGH, BIHEE, Billion, Bird, Bitel, Bitmore, Black Fox, Blackview, Blaupunkt, Blu, Bluboo, Bluegood, Bmobile, Bobarry, bogo, Boway, bq, Bravis, Brondi, Bush, CAGI, Capitel, Captiva, Carrefour, Casio, Casper, Cat, Celkon, Changhong, Cherry Mobile, China Mobile, Chuwi, Clarmin, Cloudfone, Cloudpad, Clout, CnM, Coby Kyros, Comio, Compal, Compaq, ComTrade Tesla, Concord, ConCorde, Condor, Conquest, Contixo, Coolpad, Cowon, CreNova, Crescent, Cricket, Crius Mea, Crony, Crosscall, Cube, CUBOT, CVTE, Cyrus, Daewoo, Danew, Datang, Datawind, Datsun, Dbtel, Dell, Denver, Desay, DeWalt, DEXP, Dialog, Dicam, Digi, Digicel, Digiland, Digma, Divisat, DMM, DNS, DoCoMo, Doffler, Dolamee, Doogee, Doopro, Doov, Dopod, Doro, Droxio, Dune HD, E-Boda, E-Ceros, E-tel, Easypix, EBEST, Echo Mobiles, ECS, EE, EKO, Eks Mobility, Element, Elenberg, Elephone, Eltex, Energizer, Energy Sistem, Enot, Ergo, Ericsson, Ericy, Essential, Essentielb, eSTAR, Eton, eTouch, Etuline, Eurostar, Evercoss, Evertek, Evolio, Evolveo, EvroMedia, ExMobile, EXO, Explay, Extrem, Ezio, Ezze, Fairphone, Famoco, Fengxiang, Fero, FiGO, FinePower, FireFly Mobile, Fly, FNB, Fondi, Fonos, FORME, Forstar, Foxconn, Freetel, Fujitsu, G-TiDE, Garmin-Asus, Gateway, Gemini, General Mobile, GEOFOX, Geotel, Ghia, Ghong, Gigabyte, Gigaset, Ginzzu, Gionee, Globex, GOCLEVER, Goly, Gome, GoMobile, Google, Goophone, Gradiente, Grape, Gree, Grundig, Hafury, Haier, HannSpree, Hasee, Hi-Level, Highscreen, Hipstreet, Hisense, Hoffmann, Hometech, Homtom, Hoozo, Hosin, Hotwav, How, HP, HTC, Huadoo, Huawei, Humax, Hyrican, Hyundai, i-Cherry, i-Joy, i-mate, i-mobile, iBall, iBerry, iBrit, IconBIT, iDroid, iGet, iHunt, Ikea, iKoMo, iLA, iLife, iMars, IMO Mobile, Impression, iNew, Infinix, InFocus, Inkti, InnJoo, Innostream, Inoi, INQ, Insignia, Intek, Intex, Inverto, Invin, iOcean, iPro, IQM, Irbis, Iris, iRola, iRulu, iTel, iTruck, iVA, iView, iVooMi, iZotron, JAY-Tech, JFone, Jiayu, Jinga, JKL, Jolla, Just5, K-Touch, Kaan, Kaiomy, Kalley, Kanji, Karbonn, KATV1, Kazam, KDDI, Kempler & Strauss, Keneksi, Kenxinda, Kiano, Kingsun, Kivi, Klipad, Kocaso, Kodak, Kogan, Komu, Konka, Konrow, Koobee, Kooper, KOPO, Koridy, KRONO, Krüger&Matz, KT-Tech, Kuliao, Kumai, Kyocera, Kzen, LAIQ, Land Rover, Landvo, Lanix, Lark, Lava, LCT, Leagoo, Ledstar, LeEco, Lemhoov, Lenco, Lenovo, Leotec, Le Pan, Lephone, Lesia, Lexand, Lexibook, LG, Lingwin, Loewe, Logic, Logicom, Lumigon, Lumus, Luna, LYF, M.T.T., M4tel, Macoox, Majestic, Mann, Manta Multimedia, Masstel, Matrix, Maxcom, Maxtron, MAXVI, Maxwest, Maze, meanIT, Mecer, Mecool, Mediacom, MediaTek, Medion, MEEG, MegaFon, Meitu, Meizu, Melrose, Memup, Metz, MEU, MicroMax, Microsoft, Minix, Mio, Miray, Mito, Mitsubishi, MIXC, MiXzo, MLLED, MLS, Mobicel, Mobiistar, Mobiola, Mobistel, Mobo, Modecom, Mofut, Motorola, Movic, Mpman, MSI, MTC, MTN, Multilaser, MYFON, MyPhone, Myria, Mystery, MyTab, MyWigo, National, Navitech, Navon, NEC, Neffos, Neomi, Netgear, NeuImage, Newgen, Newland, Newman, NewsMy, NEXBOX, Nexian, NEXON, Nextbit, NextBook, NextTab, NGM, NG Optics, Nikon, Nintendo, NOA, Noain, Nobby, Noblex, Nokia, Nomi, Nomu, Nos, Nous, NUU Mobile, Nuvo, Nvidia, NYX Mobile, O+, O2, Obi, Odys, Okapia, Onda, OnePlus, Onix, ONN, Openbox, OPPO, Opsson, Orange, Orbic, Ordissimo, Ouki, Oukitel, OUYA, Overmax, Ovvi, Owwo, Oysters, Oyyu, OzoneHD, P-UP, Palm, Panacom, Panasonic, Pantech, PCBOX, PCD, PCD Argentina, PEAQ, Pentagram, Phicomm, Philco, Philips, Phonemax, phoneOne, Pioneer, Pixelphone, Pixus, Ployer, Plum, PocketBook, POCO, Point of View, Polaroid, PolyPad, Polytron, Pomp, Positivo, Positivo BGH, PPTV, Prestigio, Primepad, Primux, Prixton, Proline, ProScan, Protruly, PULID, Q-Touch, Q.Bell, Qilive, QMobile, Qtek, Quantum, Quechua, Qumo, R-TV, Ramos, Ravoz, Razer, RCA Tablets, Readboy, Realme, RED, Rikomagic, RIM, Rinno, Ritmix, Ritzviva, Riviera, Roadrover, Rokit, Roku, Rombica, Ross&Moor, Rover, RoverPad, RT Project, RugGear, Runbo, Ryte, Safaricom, Sagem, Samsung, Sanei, Santin, Sanyo, Savio, Schneider, Sega, Selenga, Selevision, Selfix, SEMP TCL, Sencor, Sendo, Senkatel, Senseit, Senwa, SFR, Sharp, Shift Phones, Shtrikh-M, Shuttle, Siemens, Sigma, Silent Circle, Simbans, Sky, Skyworth, Smart, Smartfren, Smartisan, Softbank, Sonim, Sony, Sony Ericsson, Soundmax, Soyes, Spectrum, Spice, SQOOL, Star, Starlight, Starway, STF Mobile, STK, Stonex, Storex, Sugar, Sumvision, Sunstech, SunVan, Sunvell, SuperSonic, Supra, Swipe, SWISSMOBILITY, Swisstone, Symphony, Syrox, T-Mobile, Takara, TB Touch, TCL, TD Systems, TechniSat, TechnoTrend, TechPad, Teclast, Tecno Mobile, Tele2, Telefunken, Telego, Telenor, Telit, Tesco, Tesla, Tetratab, teXet, ThL, Thomson, TIANYU, Time2, Timovi, Tinai, Tinmo, TiPhone, Tolino, Tone, Tooky, Top House, Toplux, Torex, Toshiba, Touchmate, Transpeed, TrekStor, Trevi, Tronsmart, True, TTEC, Tunisie Telecom, Turbo, Turbo-X, TurboKids, TVC, TWM, Twoe, U.S. Cellular, Ugoos, Uhans, Uhappy, Ulefone, Umax, UMIDIGI, Unihertz, Unimax, Uniscope, Unknown, Unnecto, Unonu, Unowhy, UTOK, UTStarcom, Vastking, Venso, Verico, Verizon, Vernee, Vertex, Vertu, Verykool, Vesta, Vestel, VGO TEL, Videocon, Videoweb, ViewSonic, Vinga, Vinsoc, Vipro, Vitelcom, Vivax, Vivo, Vizio, VK Mobile, VKworld, Vodacom, Vodafone, Vonino, Vontar, Vorago, Vorke, Voto, Voxtel, Voyo, Vsmart, Vsun, Vulcan, VVETIME, Walton, Web TV, Weimei, WellcoM, Wexler, Wieppo, Wigor, Wiko, Wileyfox, Winds, Wink, Wiseasy, Wolder, Wolfgang, Wonu, Woo, Wortmann, Woxter, X-BO, X-TIGI, X-View, Xgody, Xiaolajiao, Xiaomi, Xion, Xolo, Xoro, Xshitou, Xtouch, Yandex, Yarvik, Yes, Yezz, Yota, Ytone, Yu, Yuandao, Yusun, Yxtel, Zatec, Zeemi, Zen, Zenek, Zfiner, Zidoo, Ziox, Zonda, Zopo, ZTE, Zuum, Zync, ZYQ, öwn
243
 
244
  ### List of detected bots:
245
 
246
- 360Spider, Aboundexbot, Acoon, AddThis.com, ADMantX, ADmantX Service Fetcher, aHrefs Bot, Alexa Crawler, Alexa Site Audit, Amazon Route53 Health Check, Amorank Spider, Analytics SEO Crawler, ApacheBench, Applebot, Arachni, archive.org bot, Ask Jeeves, AspiegelBot, Awario, Awario, Backlink-Check.de, BacklinkCrawler, Baidu Spider, Barkrowler, BazQux Reader, BingBot, BitlyBot, Blekkobot, BLEXBot Crawler, Bloglovin, Blogtrottr, BoardReader, BoardReader Blog Indexer, Bountii Bot, BrandVerity, Browsershots, BUbiNG, Buck, Butterfly Robot, Bytespider, CareerBot, Castro 2, Catchpoint, CATExplorador, ccBot crawler, Charlotte, Cliqzbot, CloudFlare Always Online, CloudFlare AMP Fetcher, Collectd, CommaFeed, CSS Certificate Spider, Cốc Cốc Bot, Datadog Agent, Datanyze, Dataprovider, Daum, Dazoobot, Discobot, Domain Re-Animator Bot, Domains Project, DotBot, DuckDuckGo Bot, Easou Spider, eCairn-Grabber, EMail Exractor, EmailWolf, Embedly, evc-batch, ExaBot, ExactSeek Crawler, Ezooms, eZ Publish Link Validator, Facebook External Hit, Feedbin, FeedBurner, Feedly, Feedspot, Feed Wrangler, Fever, Findxbot, Flipboard, FreshRSS, Generic Bot, Generic Bot, Genieo Web filter, Gigablast, Gigabot, Gluten Free Crawler, Gmail Image Proxy, Goo, Googlebot, Google Cloud Scheduler, Google Favicon, Google PageSpeed Insights, Google Partner Monitoring, Google Search Console, Google Stackdriver Monitoring, Google Structured Data Testing Tool, Grammarly, Grapeshot, GTmetrix, Heritrix, Heureka Feed, HTTPMon, HubPages, HubSpot, ICC-Crawler, ichiro, IDG/IT, IIS Site Analysis, Inktomi Slurp, inoreader, IP-Guide Crawler, IPS Agent, Kaspersky, Kouio, Larbin web crawler, LCC, Let's Encrypt Validation, Lighthouse, Linkdex Bot, LinkedIn Bot, LTX71, Lycos, Magpie-Crawler, MagpieRSS, Mail.Ru Bot, masscan, Mastodon Bot, Meanpath Bot, MetaInspector, MetaJobBot, Mixrank Bot, MJ12 Bot, Mnogosearch, MojeekBot, Monitor.Us, Munin, Nagios check_http, NalezenCzBot, nbertaupete95, Netcraft Survey Bot, netEstate, NetLyzer FastProbe, NetResearchServer, Netvibes, NewsBlur, NewsGator, NLCrawler, Nmap, Nutch-based Bot, Nuzzel, oBot, Octopus, Omgili bot, Openindex Spider, OpenLinkProfiler, OpenWebSpider, Orange Bot, Outbrain, PagePeeker, PaperLiBot, Petal Bot, Phantomas, PHP Server Monitor, Picsearch bot, Pingdom Bot, Pinterest, PocketParser, Pompos, PritTorrent, PRTG Network Monitor, QuerySeekerSpider, Quora Link Preview, Qwantify, Rainmeter, RamblerMail Image Proxy, Reddit Bot, Riddler, Robozilla, Rogerbot, ROI Hunter, RSSRadio Bot, SafeDNSBot, Scooter, ScoutJet, Scrapy, Screaming Frog SEO Spider, ScreenerBot, Semantic Scholar Bot, Semrush Bot, Sensika Bot, Sentry Bot, Seobility, SEOENGBot, SEOkicks-Robot, Seoscanners.net, Serendeputy Bot, Server Density, Seznam Bot, Seznam Email Proxy, Seznam Zbozi.cz, ShopAlike, Shopify Partner, ShopWiki, SilverReader, SimplePie, SISTRIX Crawler, SISTRIX Optimizer, Site24x7 Website Monitoring, Siteimprove, SiteSucker, Sixy.ch, Skype URI Preview, Slackbot, SMTBot, Snapchat Proxy, Sogou Spider, Soso Spider, Sparkler, Speedy, Spinn3r, Spotify, Sprinklr, Sputnik Bot, sqlmap, SSL Labs, Startpagina Linkchecker, StatusCake, Superfeedr Bot, Survey Bot, Tarmot Gezgin, TelegramBot, The Knowledge AI, theoldreader, TinEye Crawler, Tiny Tiny RSS, TLSProbe, TraceMyFile, Trendiction Bot, TurnitinBot, TweetedTimes Bot, Tweetmeme Bot, Twingly Recon, Twitterbot, UkrNet Mail Proxy, UniversalFeedParser, Uptimebot, Uptime Robot, URLAppendBot, Vagabondo, Velen Public Web Crawler, Vercel Bot, Visual Site Mapper Crawler, VK Share Button, W3C CSS Validator, W3C I18N Checker, W3C Link Checker, W3C Markup Validation Service, W3C MobileOK Checker, W3C Unified Validator, Wappalyzer, WebbCrawler, Weborama, WebPageTest, WebSitePulse, WebThumbnail, WeSEE:Search, WikiDo, Willow Internet Crawler, WooRank, WordPress, Wotbox, XenForo, YaCy, Yahoo! Cache System, Yahoo! Japan BRW, Yahoo! Link Preview, Yahoo! Slurp, Yahoo Gemini, Yandex Bot, Yeti/Naverbot, Yottaa Site Monitor, Youdao Bot, Yourls, Yunyun Bot, Zao, Ze List, zgrab, Zookabot, ZumBot
8
 
9
  ## Code Status
10
 
11
+ ![PHPUnit](https://github.com/matomo-org/device-detector/workflows/PHPUnit/badge.svg?branch=master)
12
+ ![PHPStan](https://github.com/matomo-org/device-detector/workflows/PHPStan%20check/badge.svg?branch=master)
13
+ ![PHPCS](https://github.com/matomo-org/device-detector/workflows/PHPCS%20check/badge.svg?branch=master)
14
+ ![YAML Lint](https://github.com/matomo-org/device-detector/workflows/YAML%20Lint/badge.svg?branch=master)
15
  [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/matomo-org/device-detector.svg)](http://isitmaintained.com/project/matomo-org/device-detector "Average time to resolve an issue")
16
  [![Percentage of issues still open](http://isitmaintained.com/badge/open/matomo-org/device-detector.svg)](http://isitmaintained.com/project/matomo-org/device-detector "Percentage of issues still open")
17
 
206
 
207
  The lists below are auto generated and updated from time to time. Some of them might not be complete.
208
 
209
+ *Last update: 2021/01/08*
210
 
211
  ### List of detected operating systems:
212
 
213
+ AIX, Android, AmigaOS, Apple TV, Arch Linux, BackTrack, Bada, BeOS, BlackBerry OS, BlackBerry Tablet OS, Brew, CentOS, Chrome OS, CyanogenMod, Debian, Deepin, DragonFly, Fedora, Firefox OS, Fire OS, Freebox, FreeBSD, FydeOS, Gentoo, Google TV, HP-UX, Haiku OS, IRIX, Inferno, KaiOS, Knoppix, Kubuntu, GNU/Linux, Lubuntu, VectorLinux, Mac, Maemo, Mandriva, MeeGo, MocorDroid, Mint, MildWild, MorphOS, NetBSD, MTK / Nucleus, MRE, Nintendo, Nintendo Mobile, OS/2, OSF1, OpenBSD, Ordissimo, PlayStation Portable, PlayStation, Red Hat, RISC OS, Rosa, Remix OS, RazoDroiD, Sabayon, SUSE, Sailfish OS, SeewoOS, Slackware, Solaris, Syllable, Symbian, Symbian OS, Symbian OS Series 40, Symbian OS Series 60, Symbian^3, ThreadX, Tizen, TmaxOS, Ubuntu, watchOS, WebTV, Whale OS, Windows, Windows CE, Windows IoT, Windows Mobile, Windows Phone, Windows RT, Xbox, Xubuntu, YunOs, iOS, palmOS, webOS
214
 
215
  ### List of detected browsers:
216
 
217
+ 115 Browser, 2345 Browser, 360 Phone Browser, 360 Browser, Avant Browser, ABrowse, ANT Fresco, ANTGalio, Aloha Browser, Aloha Browser Lite, Amaya, Amigo, Android Browser, AOL Desktop, AOL Shield, Arora, Arctic Fox, Amiga Voyager, Amiga Aweb, Atom, Atomic Web Browser, Avast Secure Browser, AVG Secure Browser, Beaker Browser, Beamrise, BlackBerry Browser, Baidu Browser, Baidu Spark, Basilisk, Beonex, BlackHawk, Bunjalloo, B-Line, Blue Browser, Borealis Navigator, Brave, BriskBard, BrowseX, Browzar, Camino, CCleaner, Centaury, Coc Coc, Colibri, Comodo Dragon, Coast, Charon, CM Browser, Chrome Frame, Headless Chrome, Chrome, Chrome Mobile iOS, Conkeror, Chrome Mobile, CoolNovo, CometBird, COS Browser, Chim Lac, ChromePlus, Chromium, Cyberfox, Cheshire, Crusta, Crazy Browser, Cunaguaro, Chrome Webview, dbrowser, Deepnet Explorer, Delta Browser, Dolphin, Dorado, Dooble, Dillo, DuckDuckGo Privacy Browser, Ecosia, Epic, Elinks, Element Browser, Elements Browser, eZ Browser, EUI Browser, GNOME Web, Espial TV Browser, Falkon, Faux Browser, Firefox Mobile iOS, Firebird, Fluid, Fennec, Firefox, Firefox Focus, Firefox Reality, Firefox Rocket, Flock, Firefox Mobile, Fireweb, Fireweb Navigator, FreeU, Galeon, Ghostery Privacy Browser, Glass Browser, Google Earth, GOG Galaxy, Hawk Turbo Browser, hola! Browser, HotJava, Huawei Browser, IBrowse, iCab, iCab Mobile, Iridium, Iron Mobile, IceCat, IceDragon, Isivioo, Iceweasel, Internet Explorer, IE Mobile, Iron, Japan Browser, Jasmine, Jig Browser, Jig Browser Plus, Jio Browser, K.Browser, Kindle Browser, K-meleon, Konqueror, Kapiko, Kinza, Kiwi, Kode Browser, Kylo, Kazehakase, Cheetah Browser, LieBaoFast, LG Browser, Light, Links, Lovense Browser, LuaKit, Lulumi, Lunascape, Lunascape Lite, Lynx, mCent, MicroB, NCSA Mosaic, Meizu Browser, Mercury, Mobile Safari, Midori, Mobicip, MIUI Browser, Mobile Silk, Minimo, Mint Browser, Maxthon, MxNitro, Mypal, Monument Browser, MAUI WAP Browser, Navigateur Web, NFS Browser, Nokia Browser, Nokia OSS Browser, Nokia Ovi Browser, Nox Browser, NetSurf, NetFront, NetFront Life, NetPositive, Netscape, NTENT Browser, Oculus Browser, Opera Mini iOS, Obigo, Odin, Odyssey Web Browser, Off By One, OhHai Browser, ONE Browser, Opera GX, Opera Neon, Opera Devices, Opera Mini, Opera Mobile, Opera, Opera Next, Opera Touch, Ordissimo, Oregano, Origin In-Game Overlay, Origyn Web Browser, Openwave Mobile Browser, OmniWeb, Otter Browser, Palm Blazer, Pale Moon, Polypane, Oppo Browser, Palm Pre, Puffin, Palm WebPro, Palmscape, Phoenix, Phoenix Browser, PlayFree Browser, Polaris, Polarity, PrivacyWall, Microsoft Edge, QQ Browser Mini, QQ Browser, Qutebrowser, Quark, QupZilla, Qwant Mobile, QtWebEngine, Realme Browser, Rekonq, RockMelt, Samsung Browser, Sailfish Browser, Seewo Browser, SEMC-Browser, Sogou Explorer, Safari, Safe Exam Browser, SalamWeb, SFive, Shiira, SimpleBrowser, Sizzy, Skyfire, Seraphic Sraf, Sleipnir, Slimjet, 7Star, Smart Lenovo Browser, Snowshoe, Sogou Mobile Browser, Splash, Sputnik Browser, Sunrise, SuperBird, Super Fast Browser, surf, Stargon, START Internet Browser, Steam In-Game Overlay, Streamy, Swiftfox, Seznam Browser, T-Browser, t-online.de Browser, Tao Browser, TenFourFox, Tenta Browser, Tizen Browser, Tungsten, ToGate, TweakStyle, TV Bro, UBrowser, UC Browser, UC Browser Mini, UC Browser Turbo, UR Browser, Uzbl, Vivaldi, vivo Browser, Vision Mobile Browser, VMware AirWatch, Wear Internet Browser, Web Explorer, WebPositive, Waterfox, Whale Browser, wOSBrowser, WeTab Browser, Yahoo! Japan Browser, Yandex Browser, Yandex Browser Lite, Yaani Browser, Yolo Browser, Xiino, Xvast, Zvu
218
 
219
  ### List of detected browser engines:
220
 
230
 
231
  ### List of detected mobile apps:
232
 
233
+ AndroidDownloadManager, AntennaPod, Apple News, Baidu Box App, BeyondPod, BingWebApp, bPod, CastBox, Castro, Castro 2, CrosswalkApp, DingTalk, DoggCatcher, douban App, Facebook, Facebook Messenger, FeedR, Flipboard App, Google Go, Google Play Newsstand, Google Plus, Google Search App, HeyTapBrowser, iCatcher, Instacast, Instagram App, Instapaper, Keeper Password Manager, Kik, Line, LinkedIn, NewsArticle App, Overcast, Pinterest, Player FM, Pocket Casts, Podcast & Radio Addict, Podcast Republic, Podcasts, Podcat, Podcatcher Deluxe, Podkicker, Roblox, RSSRadio, Sina Weibo, Siri, Skyeng Teachers, Snapchat, SogouSearch App, tieba, TopBuzz, Twitter, U-Cursos, UnityPlayer, Viber, WeChat, WeChat Share Extension, WhatsApp, Yahoo! Japan, Yelp Mobile, YouTube and *mobile apps using [AFNetworking](https://github.com/AFNetworking/AFNetworking)*
234
 
235
  ### List of detected PIMs (personal information manager):
236
 
242
 
243
  ### List of brands with detected devices:
244
 
245
+ 2E, 3Q, 4Good, 4ife, 360, 8848, A1, Accent, Ace, Acer, Advan, Advance, AGM, Ainol, Airness, Airties, AIS, Aiwa, Akai, Alba, Alcatel, Alcor, ALDI SÜD, Alfawise, Aligator, AllCall, AllDocube, Allview, Allwinner, Altech UEC, Altice, altron, Amazon, AMGOO, Amigoo, Amoi, Andowl, Anry, ANS, Aoson, Apple, Archos, Arian Space, Ark, ArmPhone, Arnova, ARRIS, Artel, Artizlee, Asano, Asanzo, Ask, Assistant, Asus, AT&T, Atom, Audiovox, Avenzo, AVH, Avvio, Axxion, Azumi Mobile, BangOlufsen, Barnes & Noble, BBK, BB Mobile, BDF, Becker, Beeline, Beelink, Beetel, BenQ, BenQ-Siemens, Bezkam, BGH, Bigben, BIHEE, Billion, BioRugged, Bird, Bitel, Bitmore, Bkav, Black Bear, Black Fox, Blackview, Blaupunkt, Blu, Bluboo, Bluedot, Bluegood, Bluewave, Bmobile, Bobarry, bogo, Boway, bq, Brandt, Bravis, Brondi, Bush, CAGI, Capitel, Captiva, Carrefour, Casio, Casper, Cat, Celcus, Celkon, Changhong, Cherry Mobile, China Mobile, Chuwi, Clarmin, Cloudfone, Cloudpad, Clout, CnM, Coby Kyros, Comio, Compal, Compaq, ComTrade Tesla, Concord, ConCorde, Condor, Conquest, Contixo, Coolpad, Cowon, CreNova, Crescent, Cricket, Crius Mea, Crony, Crosscall, Cube, CUBOT, CVTE, Cyrus, Daewoo, Danew, Datang, Datawind, Datsun, Dbtel, Dell, Denver, Desay, DeWalt, DEXP, Dialog, Dicam, Digi, Digicel, Digihome, Digiland, Digma, Diva, Divisat, DMM, DNS, DoCoMo, Doffler, Dolamee, Doogee, Doopro, Doov, Dopod, Doro, Droxio, Dune HD, E-Boda, E-Ceros, E-tel, Easypix, EBEST, Echo Mobiles, ECS, EE, EKO, Eks Mobility, ELARI, Element, Elenberg, Elephone, Eltex, Energizer, Energy Sistem, Enot, Epik One, Ergo, Ericsson, Ericy, Essential, Essentielb, eSTAR, Eton, eTouch, Etuline, Eurostar, Evercoss, Evertek, Evolio, Evolveo, EvroMedia, ExMobile, EXO, Explay, Extrem, Ezio, Ezze, Fairphone, Famoco, FarEasTone, Fengxiang, Fero, FiGO, FinePower, Finlux, FireFly Mobile, Fly, FNB, Fondi, Fonos, FORME, Forstar, Fortis, Foxconn, Freetel, Fujitsu, G-TiDE, Garmin-Asus, Gateway, Gemini, General Mobile, GEOFOX, Geotel, Ghia, Ghong, Gigabyte, Gigaset, Ginzzu, Gionee, Globex, GOCLEVER, Goly, Gome, GoMobile, Google, Goophone, Gradiente, Grape, Gree, Grundig, Hafury, Haier, HannSpree, Hardkernel, Hasee, Helio, Hezire, Hi-Level, Highscreen, Hipstreet, Hisense, Hitachi, Hoffmann, Hometech, Homtom, Hoozo, Hosin, Hotel, Hotwav, How, HP, HTC, Huadoo, Huawei, Humax, Hurricane, Hyrican, Hyundai, i-Cherry, i-Joy, i-mate, i-mobile, iBall, iBerry, iBrit, IconBIT, iDroid, iGet, iHunt, Ikea, iKoMo, iLA, iLife, iMars, IMO Mobile, Impression, Inco, iNew, Infinix, InFocus, Inkti, InnJoo, Innostream, Inoi, INQ, Insignia, Intek, Intex, Inverto, Invin, iOcean, iPro, IQM, Irbis, Iris, iRola, iRulu, iSWAG, iTel, iTruck, iVA, iView, iVooMi, iZotron, JAY-Tech, JFone, Jiayu, Jinga, JKL, Jolla, Just5, JVC, K-Touch, Kaan, Kaiomy, Kalley, Kanji, Karbonn, KATV1, Kazam, KDDI, Kempler & Strauss, Keneksi, Kenxinda, Kiano, Kingsun, Kivi, Klipad, Kocaso, Kodak, Kogan, Komu, Konka, Konrow, Koobee, Koolnee, Kooper, KOPO, Koridy, KRONO, Krüger&Matz, KT-Tech, Kuliao, Kult, Kumai, Kyocera, Kzen, LAIQ, Land Rover, Landvo, Lanix, Lark, Lava, LCT, Leagoo, Ledstar, LeEco, Leff, Lemhoov, Lenco, Lenovo, Leotec, Le Pan, Lephone, Lesia, Lexand, Lexibook, LG, Lingwin, Linsar, Loewe, Logic, Logicom, Lumigon, Lumus, Luna, Luxor, LYF, M.T.T., M4tel, Macoox, Majestic, Mann, Manta Multimedia, Masstel, Matrix, Maxcom, Maxtron, MAXVI, Maxwest, Maze, meanIT, Mecer, Mecool, Mediacom, MediaTek, Medion, MEEG, MegaFon, Meitu, Meizu, Melrose, Memup, Metz, MEU, MicroMax, Microsoft, Minix, Mintt, Mio, Miray, Mito, Mitsubishi, MIXC, MiXzo, MLLED, MLS, Mobicel, Mobiistar, Mobiola, Mobistel, MobiWire, Mobo, Modecom, Mofut, Motorola, Movic, Mpman, MSI, MTC, MTN, Multilaser, MYFON, MyPhone, Myria, Mystery, MyTab, MyWigo, National, Navitech, Navon, NEC, Neffos, Neomi, Netgear, NeuImage, Newgen, Newland, Newman, NewsMy, NEXBOX, Nexian, NEXON, Nextbit, NextBook, NextTab, NGM, NG Optics, Nikon, Nintendo, NOA, Noain, Nobby, Noblex, Nokia, Nomi, Nomu, Nordmende, NorthTech, Nos, Nous, NuAns, NUU Mobile, Nuvo, Nvidia, NYX Mobile, O+, O2, Oale, Obi, Odys, Okapia, Onda, OnePlus, Onix, ONN, OpelMobile, Openbox, OPPO, Opsson, Orange, Orbic, Ordissimo, Ouki, Oukitel, OUYA, Overmax, Ovvi, Owwo, Oysters, Oyyu, OzoneHD, P-UP, Palm, Panacom, Panasonic, Pantech, PCBOX, PCD, PCD Argentina, PEAQ, Pentagram, Phicomm, Philco, Philips, Phonemax, phoneOne, Pioneer, Pixelphone, Pixus, Planet Computers, Ployer, Plum, PocketBook, POCO, Point of View, Polaroid, PolyPad, Polytron, Pomp, Poppox, Positivo, Positivo BGH, PPTV, Premio, Prestigio, Primepad, Primux, Prixton, Proline, ProScan, Protruly, PULID, Q-Touch, Q.Bell, Qilive, QMobile, Qtek, Quantum, Quechua, Qumo, R-TV, Ramos, Ravoz, Razer, RCA Tablets, Reach, Readboy, Realme, RED, Reeder, Rikomagic, RIM, Rinno, Ritmix, Ritzviva, Riviera, Roadrover, Rokit, Roku, Rombica, Ross&Moor, Rover, RoverPad, RT Project, RugGear, Runbo, Ryte, Safaricom, Sagem, Salora, Samsung, Sanei, Sansui, Santin, Sanyo, Savio, Schneider, Sega, Selenga, Selevision, Selfix, SEMP TCL, Sencor, Sendo, Senkatel, Senseit, Senwa, SFR, Sharp, Shift Phones, Shtrikh-M, Shuttle, Sico, Siemens, Sigma, Silelis, Silent Circle, Simbans, Siragon, Sky, Skyworth, Smadl, Smailo, Smart, SMARTEC, Smartfren, Smartisan, Softbank, Solone, Sonim, Sony, Sony Ericsson, Soundmax, Soyes, SPC, Spectrum, Spice, SQOOL, Star, Starlight, Starmobile, Starway, STF Mobile, STK, Stonex, Storex, Sugar, Sumvision, Sunstech, SunVan, Sunvell, SuperSonic, Supra, Swipe, SWISSMOBILITY, Swisstone, Symphony, Syrox, T-Mobile, Takara, Tanix, TB Touch, TCL, TD Systems, TechniSat, TechnoTrend, TechPad, Techwood, Teclast, Tecno Mobile, Tele2, Telefunken, Telego, Telenor, Telit, Tesco, Tesla, Tetratab, teXet, ThL, Thomson, Thuraya, TIANYU, Time2, Timovi, Tinai, Tinmo, TiPhone, Tolino, Tone, Tooky, Top House, Toplux, Torex, Toshiba, Touchmate, Transpeed, TrekStor, Trevi, Trifone, Tronsmart, True, TTEC, Tunisie Telecom, Turbo, Turbo-X, TurboKids, TVC, TWM, Twoe, Tymes, U.S. Cellular, Ugoos, Uhans, Uhappy, Ulefone, Umax, UMIDIGI, Unihertz, Unimax, Uniscope, UNIWA, Unknown, Unnecto, Unonu, Unowhy, UTOK, UTStarcom, VAIO, Vastking, Venso, Verico, Verizon, Vernee, Vertex, Vertu, Verykool, Vesta, Vestel, VGO TEL, Videocon, Videoweb, ViewSonic, Vinga, Vinsoc, Vipro, Vitelcom, Viumee, Vivax, Vivo, Vizio, VK Mobile, VKworld, Vodacom, Vodafone, Vonino, Vontar, Vorago, Vorke, Voto, Voxtel, Voyo, Vsmart, Vsun, Vulcan, VVETIME, Walton, Web TV, Weimei, WellcoM, Westpoint, Wexler, Wieppo, Wigor, Wiko, Wileyfox, Winds, Wink, Winmax, Wiseasy, Wizz, Wolder, Wolfgang, Wonu, Woo, Wortmann, Woxter, X-BO, X-TIGI, X-View, X.Vision, Xgody, Xiaolajiao, Xiaomi, Xion, Xolo, Xoro, Xshitou, Xtouch, Yandex, Yarvik, Yes, Yezz, Yoka TV, Yota, Ytone, Yu, Yuandao, Yusun, Yxtel, Zatec, Zebra, Zeemi, Zen, Zenek, Zentality, Zfiner, Zidoo, Ziox, Zonda, Zopo, ZTE, Zuum, Zync, ZYQ, öwn
246
 
247
  ### List of detected bots:
248
 
249
+ 360Spider, Aboundexbot, Acoon, Adbeat, AddThis.com, ADMantX, ADmantX Service Fetcher, aHrefs Bot, Alexa Crawler, Alexa Site Audit, Amazon Route53 Health Check, Amorank Spider, Analytics SEO Crawler, ApacheBench, Applebot, Arachni, archive.org bot, Ask Jeeves, AspiegelBot, Awario, Awario, Backlink-Check.de, BacklinkCrawler, Baidu Spider, Barkrowler, BazQux Reader, BDCbot, BingBot, BitlyBot, Blekkobot, BLEXBot Crawler, Bloglovin, Blogtrottr, BoardReader, BoardReader Blog Indexer, Bountii Bot, BrandVerity, Browsershots, BUbiNG, Buck, BuiltWith, Butterfly Robot, Bytespider, CareerBot, Castro 2, Catchpoint, CATExplorador, ccBot crawler, Charlotte, Cliqzbot, CloudFlare Always Online, CloudFlare AMP Fetcher, Cloudflare Diagnostics, Collectd, CommaFeed, ContentKing, CSS Certificate Spider, Cốc Cốc Bot, Datadog Agent, Datanyze, Dataprovider, Daum, Dazoobot, Discobot, Domain Re-Animator Bot, Domains Project, DotBot, DuckDuckGo Bot, Easou Spider, eCairn-Grabber, EMail Exractor, EmailWolf, Embedly, evc-batch, ExaBot, ExactSeek Crawler, Ezooms, eZ Publish Link Validator, Facebook External Hit, Feedbin, FeedBurner, Feedly, Feedspot, Feed Wrangler, Fever, Findxbot, Flipboard, FreshRSS, Generic Bot, Generic Bot, Genieo Web filter, Gigablast, Gigabot, Gluten Free Crawler, Gmail Image Proxy, Goo, Googlebot, Google Cloud Scheduler, Google Favicon, Google PageSpeed Insights, Google Partner Monitoring, Google Search Console, Google Stackdriver Monitoring, Google Structured Data Testing Tool, Grammarly, Grapeshot, GTmetrix, Heritrix, Heureka Feed, HTTPMon, HubPages, HubSpot, ICC-Crawler, ichiro, IDG/IT, IIS Site Analysis, Inktomi Slurp, inoreader, IP-Guide Crawler, IPS Agent, Kaspersky, Kouio, Larbin web crawler, LCC, Let's Encrypt Validation, Lighthouse, Linkdex Bot, LinkedIn Bot, LTX71, Lycos, Magpie-Crawler, MagpieRSS, Mail.Ru Bot, masscan, Mastodon Bot, Meanpath Bot, MetaInspector, MetaJobBot, MicroAdBot, Mixrank Bot, MJ12 Bot, Mnogosearch, MojeekBot, Monitor.Us, Munin, Nagios check_http, NalezenCzBot, nbertaupete95, Netcraft Survey Bot, netEstate, NetLyzer FastProbe, NetResearchServer, Netvibes, NewsBlur, NewsGator, NLCrawler, Nmap, Nutch-based Bot, Nuzzel, oBot, Octopus, Omgili bot, Openindex Spider, OpenLinkProfiler, OpenWebSpider, Orange Bot, Outbrain, PagePeeker, PaperLiBot, parse.ly, Petal Bot, Phantomas, PHP Server Monitor, Picsearch bot, PingAdmin.Ru, Pingdom Bot, Pinterest, PocketParser, Pompos, PritTorrent, PRTG Network Monitor, QuerySeekerSpider, Quora Link Preview, Qwantify, Rainmeter, RamblerMail Image Proxy, Reddit Bot, Riddler, Robozilla, Rogerbot, ROI Hunter, RSSRadio Bot, SafeDNSBot, Scooter, ScoutJet, Scrapy, Screaming Frog SEO Spider, ScreenerBot, Semantic Scholar Bot, Semrush Bot, Sensika Bot, Sentry Bot, Seobility, SEOENGBot, SEOkicks-Robot, Seoscanners.net, Serendeputy Bot, Server Density, Seznam Bot, Seznam Email Proxy, Seznam Zbozi.cz, ShopAlike, Shopify Partner, ShopWiki, SilverReader, SimplePie, SISTRIX Crawler, SISTRIX Optimizer, Site24x7 Website Monitoring, Siteimprove, SiteSucker, Sixy.ch, Skype URI Preview, Slackbot, SMTBot, Snapchat Proxy, Sogou Spider, Soso Spider, Sparkler, Speedy, Spinn3r, Spotify, Sprinklr, Sputnik Bot, sqlmap, SSL Labs, Startpagina Linkchecker, StatusCake, Superfeedr Bot, Survey Bot, Tarmot Gezgin, TelegramBot, The Knowledge AI, theoldreader, TinEye Crawler, Tiny Tiny RSS, TLSProbe, TraceMyFile, Trendiction Bot, TurnitinBot, TweetedTimes Bot, Tweetmeme Bot, Twingly Recon, Twitterbot, UkrNet Mail Proxy, UniversalFeedParser, Uptimebot, Uptime Robot, URLAppendBot, Vagabondo, Velen Public Web Crawler, Vercel Bot, Visual Site Mapper Crawler, VK Share Button, W3C CSS Validator, W3C I18N Checker, W3C Link Checker, W3C Markup Validation Service, W3C MobileOK Checker, W3C Unified Validator, Wappalyzer, WebbCrawler, WebDataStats, Weborama, WebPageTest, WebSitePulse, WebThumbnail, WeSEE:Search, WikiDo, Willow Internet Crawler, WooRank, WordPress, Wotbox, XenForo, YaCy, Yahoo! Cache System, Yahoo! Japan BRW, Yahoo! Link Preview, Yahoo! Slurp, Yahoo Gemini, Yandex Bot, Yeti/Naverbot, Yottaa Site Monitor, Youdao Bot, Yourls, Yunyun Bot, Zao, Ze List, zgrab, Zookabot, ZumBot
app/vendor/matomo/device-detector/regexes/bots.yml CHANGED
@@ -8,7 +8,7 @@
8
  - regex: '360Spider(-Image|-Video)?'
9
  name: '360Spider'
10
  category: 'Search bot'
11
- url: 'http://www.so.com/help/help_3_2.html'
12
  producer:
13
  name: 'Online Media Group, Inc.'
14
  url: ''
@@ -40,26 +40,26 @@
40
  - regex: 'AhrefsBot'
41
  name: 'aHrefs Bot'
42
  category: 'Crawler'
43
- url: 'http://ahrefs.com/robot'
44
  producer:
45
  name: 'Ahrefs Pte Ltd'
46
- url: 'http://ahrefs.com/robot'
47
 
48
  - regex: 'ia_archiver|alexabot|verifybot'
49
  name: 'Alexa Crawler'
50
  category: 'Search bot'
51
- url: 'https://alexa.zendesk.com/hc/en-us/sections/200100794-Crawlers'
52
  producer:
53
  name: 'Alexa Internet'
54
- url: 'http://www.alexa.com'
55
 
56
  - regex: 'alexa site audit'
57
  name: 'Alexa Site Audit'
58
  category: 'Site Monitor'
59
- url: 'http://www.alexa.com/help/webmasters'
60
  producer:
61
  name: 'Alexa Internet'
62
- url: 'http://www.alexa.com'
63
 
64
  - regex: 'Amazon[ -]Route ?53[ -]Health[ -]Check[ -]Service'
65
  name: 'Amazon Route53 Health Check'
@@ -82,23 +82,23 @@
82
  url: 'https://httpd.apache.org/docs/2.4/programs/ab.html'
83
  producer:
84
  name: 'The Apache Software Foundation'
85
- url: 'http://www.apache.org/foundation/'
86
 
87
  - regex: 'Applebot'
88
  name: 'Applebot'
89
  category: 'Crawler'
90
- url: 'http://www.apple.com/go/applebot'
91
  producer:
92
  name: 'Apple Inc'
93
- url: 'http://www.apple.com'
94
 
95
  - regex: 'Arachni'
96
  name: 'Arachni'
97
  category: 'Security Checker'
98
- url: 'http://www.arachni-scanner.com'
99
  producer:
100
  name: 'Sarosys LLC'
101
- url: 'http://www.sarosys.com/'
102
 
103
  - regex: 'AspiegelBot'
104
  name: 'AspiegelBot'
@@ -127,10 +127,10 @@
127
  - regex: 'archive\.org_bot|special_archiver'
128
  name: 'archive.org bot'
129
  category: 'Crawler'
130
- url: 'http://www.archive.org/details/archive.org_bot'
131
  producer:
132
  name: 'The Internet Archive'
133
- url: 'http://www.archive.org'
134
 
135
  - regex: 'Ask Jeeves/Teoma'
136
  name: 'Ask Jeeves'
@@ -217,7 +217,7 @@
217
  category: 'Crawler'
218
  producer:
219
  name: 'BoardReader'
220
- url: 'http://boardreader.com/'
221
 
222
  - regex: 'BountiiBot'
223
  name: 'Bountii Bot'
@@ -283,6 +283,14 @@
283
  name: 'CloudFlare'
284
  url: 'http://www.cloudflare.com'
285
 
 
 
 
 
 
 
 
 
286
  - regex: 'CloudFlare-AlwaysOnline'
287
  name: 'CloudFlare Always Online'
288
  category: 'Site Monitor'
@@ -339,7 +347,6 @@
339
  name: 'Datanyze'
340
  url: 'https://www.datanyze.com'
341
 
342
-
343
  - regex: 'Dataprovider'
344
  name: 'Dataprovider'
345
  category: 'Crawler'
@@ -649,7 +656,7 @@
649
  name: 'Visual Meta'
650
  url: 'https://www.shopalike.cz/'
651
 
652
- - regex: 'AdsBot-Google(-Mobile)?|Adwords-(DisplayAds|Express|Instant)|Google Web Preview|Google[ -]Publisher[ -]Plugin|Google-(Adwords|AMPHTML|Assess|HotelAdsVerifier|Read-Aloud|Shopping-Quality|Site-Verification|speakr|Test|Youtube-Links)|(APIs|DuplexWeb|Feedfetcher|Mediapartners)-Google|Googlebot(-Mobile|-Image|-Video|-News)?|GoogleProducer|Google.*/\+/web/snippet'
653
  name: 'Googlebot'
654
  category: 'Search bot'
655
  url: 'http://www.google.com/bot.html'
@@ -663,7 +670,7 @@
663
  url: 'https://webarchive.jira.com/wiki/display/Heritrix/Heritrix'
664
  producer:
665
  name: 'The Internet Archive'
666
- url: 'http://www.archive.org'
667
 
668
  - regex: 'HubSpot '
669
  name: 'HubSpot'
@@ -672,7 +679,6 @@
672
  name: 'HubSpot Inc.'
673
  url: 'https://www.hubspot.com'
674
 
675
-
676
  - regex: 'HTTPMon'
677
  name: 'HTTPMon'
678
  category: 'Site Monitor'
@@ -1971,10 +1977,10 @@
1971
  - regex: 'BoardReader Favicon Fetcher'
1972
  name: 'BoardReader'
1973
  category: 'Search bot'
1974
- url: 'http://boardreader.com/'
1975
  producer:
1976
  name: 'Effyis Inc'
1977
- url: 'http://boardreader.com/'
1978
 
1979
  - regex: 'IDG/IT'
1980
  name: 'IDG/IT'
@@ -2019,7 +2025,7 @@
2019
  - regex: 'oBot'
2020
  name: 'oBot'
2021
  category: 'Search bot'
2022
- url: 'http://www.xforce-security.com/crawler/'
2023
  producer:
2024
  name: 'IBM Germany Research & Development GmbH'
2025
  url: 'https://exchange.xforce.ibmcloud.com/'
@@ -2062,7 +2068,7 @@
2062
  url: 'https://nutch.apache.org'
2063
  producer:
2064
  name: 'The Apache Software Foundation'
2065
- url: 'http://www.apache.org/foundation/'
2066
 
2067
  - regex: 'Seobility'
2068
  name: 'Seobility'
@@ -2077,7 +2083,7 @@
2077
  - regex: 'Grammarly'
2078
  name: 'Grammarly'
2079
  category: 'Service bot'
2080
- url: 'http://www.grammarly.com'
2081
 
2082
  - regex: 'Robozilla'
2083
  name: 'Robozilla'
@@ -2096,7 +2102,7 @@
2096
  - regex: 'SerendeputyBot'
2097
  name: 'Serendeputy Bot'
2098
  category: 'Crawler'
2099
- url: 'http://serendeputy.com/about/serendeputy-bot'
2100
 
2101
  - regex: 'ias-va.*admantx.*service-fetcher'
2102
  name: 'ADmantX Service Fetcher'
@@ -2118,6 +2124,67 @@
2118
  category: 'Crawler'
2119
  url: 'http://www.exensa.com/crawl'
2120
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2121
  # Generic detections
2122
 
2123
  - regex: '[a-z0-9\-_]*((?<!cu|power[ _]|m[ _])bot(?![ _]TAB|[ _]?5[0-9])|crawler|crawl|checker|archiver|transcoder|spider)([^a-z]|$)'
8
  - regex: '360Spider(-Image|-Video)?'
9
  name: '360Spider'
10
  category: 'Search bot'
11
+ url: 'https://www.so.com/help/help_3_2.html'
12
  producer:
13
  name: 'Online Media Group, Inc.'
14
  url: ''
40
  - regex: 'AhrefsBot'
41
  name: 'aHrefs Bot'
42
  category: 'Crawler'
43
+ url: 'https://ahrefs.com/robot'
44
  producer:
45
  name: 'Ahrefs Pte Ltd'
46
+ url: 'https://ahrefs.com/robot'
47
 
48
  - regex: 'ia_archiver|alexabot|verifybot'
49
  name: 'Alexa Crawler'
50
  category: 'Search bot'
51
+ url: 'https://support.alexa.com/hc/en-us/sections/200100794-Crawlers'
52
  producer:
53
  name: 'Alexa Internet'
54
+ url: 'https://www.alexa.com'
55
 
56
  - regex: 'alexa site audit'
57
  name: 'Alexa Site Audit'
58
  category: 'Site Monitor'
59
+ url: 'https://support.alexa.com/hc/en-us/articles/200450194'
60
  producer:
61
  name: 'Alexa Internet'
62
+ url: 'https://www.alexa.com'
63
 
64
  - regex: 'Amazon[ -]Route ?53[ -]Health[ -]Check[ -]Service'
65
  name: 'Amazon Route53 Health Check'
82
  url: 'https://httpd.apache.org/docs/2.4/programs/ab.html'
83
  producer:
84
  name: 'The Apache Software Foundation'
85
+ url: 'https://www.apache.org/foundation/'
86
 
87
  - regex: 'Applebot'
88
  name: 'Applebot'
89
  category: 'Crawler'
90
+ url: 'https://support.apple.com/en-us/HT204683'
91
  producer:
92
  name: 'Apple Inc'
93
+ url: 'https://www.apple.com'
94
 
95
  - regex: 'Arachni'
96
  name: 'Arachni'
97
  category: 'Security Checker'
98
+ url: 'https://www.arachni-scanner.com/'
99
  producer:
100
  name: 'Sarosys LLC'
101
+ url: 'https://www.sarosys.com/'
102
 
103
  - regex: 'AspiegelBot'
104
  name: 'AspiegelBot'
127
  - regex: 'archive\.org_bot|special_archiver'
128
  name: 'archive.org bot'
129
  category: 'Crawler'
130
+ url: 'https://archive.org/details/archive.org_bot'
131
  producer:
132
  name: 'The Internet Archive'
133
+ url: 'https://archive.org'
134
 
135
  - regex: 'Ask Jeeves/Teoma'
136
  name: 'Ask Jeeves'
217
  category: 'Crawler'
218
  producer:
219
  name: 'BoardReader'
220
+ url: 'https://boardreader.com/'
221
 
222
  - regex: 'BountiiBot'
223
  name: 'Bountii Bot'
283
  name: 'CloudFlare'
284
  url: 'http://www.cloudflare.com'
285
 
286
+ - regex: 'CloudflareDiagnostics'
287
+ name: 'Cloudflare Diagnostics'
288
+ category: 'Site Monitor'
289
+ url: 'https://www.cloudflare.com/'
290
+ producer:
291
+ name: 'Cloudflare'
292
+ url: 'https://www.cloudflare.com'
293
+
294
  - regex: 'CloudFlare-AlwaysOnline'
295
  name: 'CloudFlare Always Online'
296
  category: 'Site Monitor'
347
  name: 'Datanyze'
348
  url: 'https://www.datanyze.com'
349
 
 
350
  - regex: 'Dataprovider'
351
  name: 'Dataprovider'
352
  category: 'Crawler'
656
  name: 'Visual Meta'
657
  url: 'https://www.shopalike.cz/'
658
 
659
+ - regex: 'AdsBot-Google(-Mobile)?|Adwords-(DisplayAds|Express|Instant)|Google Web Preview|Google[ -]Publisher[ -]Plugin|Google-(Ads-Qualify|Adwords|AMPHTML|Assess|HotelAdsVerifier|Read-Aloud|Shopping-Quality|Site-Verification|speakr|Test|Youtube-Links)|(APIs|DuplexWeb|Feedfetcher|Mediapartners)-Google|Googlebot(-Mobile|-Image|-Video|-News)?|GoogleProducer|Google.*/\+/web/snippet'
660
  name: 'Googlebot'
661
  category: 'Search bot'
662
  url: 'http://www.google.com/bot.html'
670
  url: 'https://webarchive.jira.com/wiki/display/Heritrix/Heritrix'
671
  producer:
672
  name: 'The Internet Archive'
673
+ url: 'https://archive.org'
674
 
675
  - regex: 'HubSpot '
676
  name: 'HubSpot'
679
  name: 'HubSpot Inc.'
680
  url: 'https://www.hubspot.com'
681
 
 
682
  - regex: 'HTTPMon'
683
  name: 'HTTPMon'
684
  category: 'Site Monitor'
1977
  - regex: 'BoardReader Favicon Fetcher'
1978
  name: 'BoardReader'
1979
  category: 'Search bot'
1980
+ url: 'https://boardreader.com/'
1981
  producer:
1982
  name: 'Effyis Inc'
1983
+ url: 'https://boardreader.com/'
1984
 
1985
  - regex: 'IDG/IT'
1986
  name: 'IDG/IT'
2025
  - regex: 'oBot'
2026
  name: 'oBot'
2027
  category: 'Search bot'
2028
+ url: 'https://www.xforce-security.com/crawler/'
2029
  producer:
2030
  name: 'IBM Germany Research & Development GmbH'
2031
  url: 'https://exchange.xforce.ibmcloud.com/'
2068
  url: 'https://nutch.apache.org'
2069
  producer:
2070
  name: 'The Apache Software Foundation'
2071
+ url: 'https://www.apache.org/foundation/'
2072
 
2073
  - regex: 'Seobility'
2074
  name: 'Seobility'
2083
  - regex: 'Grammarly'
2084
  name: 'Grammarly'
2085
  category: 'Service bot'
2086
+ url: 'https://www.grammarly.com'
2087
 
2088
  - regex: 'Robozilla'
2089
  name: 'Robozilla'
2102
  - regex: 'SerendeputyBot'
2103
  name: 'Serendeputy Bot'
2104
  category: 'Crawler'
2105
+ url: 'https://serendeputy.com/about/serendeputy-bot'
2106
 
2107
  - regex: 'ias-va.*admantx.*service-fetcher'
2108
  name: 'ADmantX Service Fetcher'
2124
  category: 'Crawler'
2125
  url: 'http://www.exensa.com/crawl'
2126
 
2127
+ - regex: 'BDCbot'
2128
+ name: 'BDCbot'
2129
+ category: 'Crawler'
2130
+ url: 'https://bigweb.bigdatacorp.com.br/pages/faq.aspx'
2131
+ producer:
2132
+ name: 'BIG Data Solucoes Em Tecnologia de Informatica LTDA'
2133
+ url: 'https://bigdatacorp.com.br/'
2134
+
2135
+ - regex: 'adbeat'
2136
+ name: 'Adbeat'
2137
+ category: 'Crawler'
2138
+ url: 'https://www.adbeat.com/operation_policy'
2139
+ producer:
2140
+ name: 'PPC Labs LLC'
2141
+ url: 'https://www.adbeat.com/'
2142
+
2143
+ - regex: 'BW/(?:(\d+[\.\d]+))'
2144
+ name: 'BuiltWith'
2145
+ category: 'Crawler'
2146
+ url: 'https://builtwith.com/biup'
2147
+ producer:
2148
+ name: 'BuiltWith Pty Ltd'
2149
+ url: 'https://builtwith.com/'
2150
+
2151
+ - regex: 'https://whatis.contentkingapp.com'
2152
+ name: 'ContentKing'
2153
+ category: 'Site Monitor'
2154
+ url: 'https://whatis.contentkingapp.com/'
2155
+ producer:
2156
+ name: 'ContentKing BV'
2157
+ url: 'https://www.contentkingapp.com/'
2158
+
2159
+ - regex: 'MicroAdBot'
2160
+ name: 'MicroAdBot'
2161
+ category: 'Crawler'
2162
+ url: 'https://www.microad.co.jp/'
2163
+ producer:
2164
+ name: 'MicroAd, Inc.'
2165
+ url: 'https://www.microad.co.jp/'
2166
+
2167
+ - regex: 'PingAdmin.Ru'
2168
+ name: 'PingAdmin.Ru'
2169
+ category: 'Site Monitor'
2170
+ url: 'https://ping-admin.ru/'
2171
+
2172
+ - regex: 'WebDataStats'
2173
+ name: 'WebDataStats'
2174
+ category: 'Crawler'
2175
+ url: 'https://webdatastats.com/policy.html'
2176
+ producer:
2177
+ name: 'WebTehRazrabotka LLC'
2178
+ url: 'https://webdatastats.com/'
2179
+
2180
+ - regex: 'parse.ly scraper'
2181
+ name: 'parse.ly'
2182
+ category: 'Crawler'
2183
+ url: 'https://www.parse.ly/help/integration/crawler'
2184
+ producer:
2185
+ name: 'Parsely, Inc.'
2186
+ url: 'https://www.parse.ly/'
2187
+
2188
  # Generic detections
2189
 
2190
  - regex: '[a-z0-9\-_]*((?<!cu|power[ _]|m[ _])bot(?![ _]TAB|[ _]?5[0-9])|crawler|crawl|checker|archiver|transcoder|spider)([^a-z]|$)'
app/vendor/matomo/device-detector/regexes/client/browser_engine.yml CHANGED
@@ -14,7 +14,7 @@
14
  - regex: 'Trident'
15
  name: 'Trident'
16
 
17
- - regex: 'Blink'
18
  name: 'Blink'
19
 
20
  - regex: '(?:Apple)?WebKit'
14
  - regex: 'Trident'
15
  name: 'Trident'
16
 
17
+ - regex: '(?<!SmartHu)Blink'
18
  name: 'Blink'
19
 
20
  - regex: '(?:Apple)?WebKit'
app/vendor/matomo/device-detector/regexes/client/browsers.yml CHANGED
@@ -5,6 +5,62 @@
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
  ###############
7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  # Kode Browser (https://www.kodebrowser.com/ | https://play.google.com/store/apps/details?id=com.app.downloadmanager | https://apps.apple.com/us/app/kode-browser-fast-private/id625458492)
9
  - regex: '(?:Kode(?:iOS)?/(?:(\d+[\.\d]+))?|TansoDL)'
10
  name: 'Kode Browser'
@@ -30,7 +86,7 @@
30
  # Browzar (https://www.browzar.com/)
31
  - regex: 'Browzar'
32
  name: 'Browzar'
33
- version: '$1'
34
 
35
  # Stargon (http://www.stargon.org/ | https://play.google.com/store/apps/details?id=net.onecook.browser)
36
  - regex: 'Stargon/(?:(\d+[\.\d]+))?'
@@ -1733,13 +1789,6 @@
1733
  name: 'SEMC-Browser'
1734
  version: '$1'
1735
 
1736
- #Seraphic Sraf
1737
- - regex: 'Sraf(?:[/ ](\d+[\.\d]+))?'
1738
- name: 'Seraphic Sraf'
1739
- version: '$1'
1740
- engine:
1741
- default: 'Blink'
1742
-
1743
  #Shiira
1744
  - regex: 'Shiira(?:[/ ](\d+[\.\d]+))?'
1745
  name: 'Shiira'
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
  ###############
7
 
8
+
9
+ # PlayFree Browser
10
+ - regex: 'PlayFreeBrowser/(?:(\d+[\.\d]+))?'
11
+ name: 'PlayFree Browser'
12
+ version: '$1'
13
+
14
+ # Chim Lac (https://chimlac.com.vn/)
15
+ - regex: '(?:chimlac_browser|chimlac)/(?:(\d+[\.\d]+))'
16
+ name: 'Chim Lac'
17
+ version: '$1'
18
+ engine:
19
+ default: 'Blink'
20
+
21
+ # Odin (https://www.hisense.com/)
22
+ - regex: 'Odin/(?:(\d+[\.\d]+))'
23
+ name: 'Odin'
24
+ version: '$1'
25
+ engine:
26
+ default: 'Blink'
27
+
28
+ # T-Browser (https://play.google.com/store/apps/details?id=com.tcl.browser)
29
+ - regex: 'Tbrowser/(\d+[\.\d]+)'
30
+ name: 'T-Browser'
31
+ version: '$1'
32
+ engine:
33
+ default: 'Blink'
34
+
35
+ # SFive (https://sfive.vn/)
36
+ - regex: 'SFive(?:_Android)?/.+ Chrome/(\d+[\.\d]+)'
37
+ name: 'SFive'
38
+ version: '$1'
39
+ engine:
40
+ default: 'Blink'
41
+ - regex: 'SFive_IOS/(\d+[\.\d]+)'
42
+ name: 'SFive'
43
+ version: '$1'
44
+
45
+ # Navigateur Web
46
+ - regex: 'Navigateur web/(?:(\d+[\.\d]+))?'
47
+ name: 'Navigateur Web'
48
+ version: '$1'
49
+
50
+ #Seraphic Sraf (https://www.seraphic-corp.com/)
51
+ - regex: 'Sraf(?:[/ ](\d+[\.\d]+))?'
52
+ name: 'Seraphic Sraf'
53
+ version: '$1'
54
+ engine:
55
+ default: 'Blink'
56
+
57
+ # Seewo Browser (http://e.seewo.com/)
58
+ - regex: 'SeewoBrowser/(?:(\d+[\.\d]+))?'
59
+ name: 'Seewo Browser'
60
+ version: '$1'
61
+ engine:
62
+ default: 'Blink'
63
+
64
  # Kode Browser (https://www.kodebrowser.com/ | https://play.google.com/store/apps/details?id=com.app.downloadmanager | https://apps.apple.com/us/app/kode-browser-fast-private/id625458492)
65
  - regex: '(?:Kode(?:iOS)?/(?:(\d+[\.\d]+))?|TansoDL)'
66
  name: 'Kode Browser'
86
  # Browzar (https://www.browzar.com/)
87
  - regex: 'Browzar'
88
  name: 'Browzar'
89
+ version: ''
90
 
91
  # Stargon (http://www.stargon.org/ | https://play.google.com/store/apps/details?id=net.onecook.browser)
92
  - regex: 'Stargon/(?:(\d+[\.\d]+))?'
1789
  name: 'SEMC-Browser'
1790
  version: '$1'
1791
 
 
 
 
 
 
 
 
1792
  #Shiira
1793
  - regex: 'Shiira(?:[/ ](\d+[\.\d]+))?'
1794
  name: 'Shiira'
app/vendor/matomo/device-detector/regexes/client/feed_readers.yml CHANGED
@@ -113,7 +113,7 @@
113
  url: 'http://readkitapp.com/'
114
  type: 'Feed Reader App'
115
 
116
- - regex: 'Reeder(?:[/ ](\d+[\.\d]+))?'
117
  name: 'Reeder'
118
  version: '$1'
119
  url: 'http://reederapp.com/'
113
  url: 'http://readkitapp.com/'
114
  type: 'Feed Reader App'
115
 
116
+ - regex: 'Reeder[/ ](\d+[\.\d]+)'
117
  name: 'Reeder'
118
  version: '$1'
119
  url: 'http://reederapp.com/'
app/vendor/matomo/device-detector/regexes/client/mobile_apps.yml CHANGED
@@ -56,6 +56,9 @@
56
  - regex: 'MicroMessenger/([^ ]+)'
57
  name: 'WeChat'
58
  version: '$1'
 
 
 
59
 
60
  # DingTalk
61
  - regex: 'DingTalk/([0-9\.]+)'
@@ -101,146 +104,111 @@
101
  - regex: 'Instacast(?:HD)?/(\d\.[\d\.abc]+) CFNetwork/([\d\.]+) Darwin/([\d\.]+)'
102
  name: 'Instacast'
103
  version: '$1'
104
- -
105
- regex: 'Podcasts/([\d\.]+)'
106
  name: 'Podcasts'
107
  version: '$1'
108
- -
109
- regex: 'Pocket Casts(?:, (?:Android|iOS) v([\d\.]+))?'
110
  name: 'Pocket Casts'
111
  version: '$1'
112
- -
113
- regex: 'Podcat/([\d\.]+)'
114
  name: 'Podcat'
115
  version: '$1'
116
 
117
- -
118
- regex: 'BeyondPod'
119
  name: 'BeyondPod'
120
  version:
121
- -
122
- regex: 'AntennaPod/?([\d\.]+)?'
123
  name: 'AntennaPod'
124
  version: '$1'
125
- -
126
- regex: 'Overcast/([\d\.]+)'
127
  name: 'Overcast'
128
  version: '$1'
129
- -
130
- regex: '(?:CastBox|fm.castbox.audiobook.radio.podcast)/?([\d\.]+)?'
131
  name: 'CastBox'
132
  version: '$1'
133
- -
134
- regex: 'Player FM'
135
  name: 'Player FM'
136
  version: ''
137
- -
138
- regex: 'Podkicker(?: Pro)?/([\d\.]+)'
139
  name: 'Podkicker'
140
  version: '$1'
141
- -
142
- regex: 'PodcastRepublic/([\d\.]+)'
143
  name: 'Podcast Republic'
144
  version: '$1'
145
- -
146
- regex: 'Castro/(\d+)'
147
  name: 'Castro'
148
  version: '$1'
149
- -
150
- regex: 'Castro 2 ([\d\.]+)/[\d]+ Like iTunes'
151
  name: 'Castro 2'
152
  version: '$1'
153
- -
154
- regex: 'Castro 2'
155
  name: 'Castro 2'
156
  version: ''
157
- -
158
- regex: 'DoggCatcher'
159
  name: 'DoggCatcher'
160
  version:
161
- -
162
- regex: 'PodcastAddict/v([\d]+)'
163
  name: 'Podcast & Radio Addict'
164
  version: '$1'
165
- -
166
- regex: 'Podcat/([\d]+) CFNetwork/([\d\.]+) Darwin/([\d\.]+)'
167
  name: 'Podcat'
168
  version: '$1'
169
- -
170
- regex: 'i[cC]atcher[^\d]+([\d\.]+)'
171
  name: 'iCatcher'
172
  version: '$1'
173
- -
174
- regex: 'YelpApp/([\d\.]+)'
175
  name: 'Yelp Mobile'
176
  version: '$1'
177
- -
178
- regex: 'jp.co.yahoo.android.yjtop/([\d\.]+)'
179
  name: 'Yahoo! Japan'
180
  version: '$1'
181
- -
182
- regex: 'RSSRadio/([\d]+)?'
183
  name: 'RSSRadio'
184
  version: '$1'
185
- -
186
- regex: 'SogouSearch Android[\d\.]+ version([\d\.]+)?'
187
  name: 'SogouSearch App'
188
  version: '$1'
189
- -
190
- regex: 'NewsArticle/([\d\.]+)?'
191
  name: 'NewsArticle App'
192
  version: '$1'
193
- -
194
- regex: 'tieba/([\d\.]+)?'
195
  name: 'tieba'
196
  version: '$1'
197
- -
198
- regex: 'com\.douban\.group/([\d\.]+)?'
199
  name: 'douban App'
200
  version: '$1'
201
- -
202
- regex: 'BingWeb/([\d\.]+)?'
203
  name: 'BingWebApp'
204
  version: '$1'
205
- -
206
- regex: 'GSA/([\d\.]+)?'
207
  name: 'Google Search App'
208
  version: '$1'
209
- -
210
- regex: 'Flipboard/([\d\.]+)?'
211
  name: 'Flipboard App'
212
  version: '$1'
213
- -
214
- regex: 'Instagram[ /]([\d\.]+)?'
215
  name: 'Instagram App'
216
  version: '$1'
217
- -
218
- regex: 'baiduboxapp/([\d\.]+)?'
219
  name: 'Baidu Box App'
220
  version: '$1'
221
- -
222
- regex: 'Crosswalk(?!.*(?:Streamy|QwantMobile))/([\d\.]+)?'
223
  name: 'CrosswalkApp'
224
  version: '$1'
225
- -
226
- regex: 'Twitter for iPhone[/]?([\d\.]+)?'
227
  name: 'Twitter'
228
  version: '$1'
229
- -
230
- regex: 'Twitter/([\d\.]+)'
231
  name: 'Twitter'
232
  version: '$1'
233
- -
234
- regex: 'TwitterAndroid[/]?([\d\.]+)?'
235
  name: 'Twitter'
236
  version: '$1'
237
 
238
- -
239
- regex: 'TopBuzz/([\d\.]+)'
240
  name: 'TopBuzz'
241
  version: '$1'
242
- -
243
- regex: 'Snapchat/([\d\.]+)'
244
  name: 'Snapchat'
245
  version: '$1'
246
 
@@ -275,3 +243,22 @@
275
  - regex: 'LinkedIn/([\d\.]+)'
276
  name: 'LinkedIn'
277
  version: '$1'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  - regex: 'MicroMessenger/([^ ]+)'
57
  name: 'WeChat'
58
  version: '$1'
59
+ - regex: 'WeChatShareExtensionNew/([^ ]+)'
60
+ name: 'WeChat Share Extension'
61
+ version: '$1'
62
 
63
  # DingTalk
64
  - regex: 'DingTalk/([0-9\.]+)'
104
  - regex: 'Instacast(?:HD)?/(\d\.[\d\.abc]+) CFNetwork/([\d\.]+) Darwin/([\d\.]+)'
105
  name: 'Instacast'
106
  version: '$1'
107
+ - regex: 'Podcasts/([\d\.]+)'
 
108
  name: 'Podcasts'
109
  version: '$1'
110
+ - regex: 'Pocket Casts(?:, (?:Android|iOS) v([\d\.]+))?'
 
111
  name: 'Pocket Casts'
112
  version: '$1'
113
+ - regex: 'Podcat/([\d\.]+)'
 
114
  name: 'Podcat'
115
  version: '$1'
116
 
117
+ - regex: 'BeyondPod'
 
118
  name: 'BeyondPod'
119
  version:
120
+ - regex: 'AntennaPod/?([\d\.]+)?'
 
121
  name: 'AntennaPod'
122
  version: '$1'
123
+ - regex: 'Overcast/([\d\.]+)'
 
124
  name: 'Overcast'
125
  version: '$1'
126
+ - regex: '(?:CastBox|fm.castbox.audiobook.radio.podcast)/?([\d\.]+)?'
 
127
  name: 'CastBox'
128
  version: '$1'
129
+ - regex: 'Player FM'
 
130
  name: 'Player FM'
131
  version: ''
132
+ - regex: 'Podkicker(?: Pro)?/([\d\.]+)'
 
133
  name: 'Podkicker'
134
  version: '$1'
135
+ - regex: 'PodcastRepublic/([\d\.]+)'
 
136
  name: 'Podcast Republic'
137
  version: '$1'
138
+ - regex: 'Castro/(\d+)'
 
139
  name: 'Castro'
140
  version: '$1'
141
+ - regex: 'Castro 2 ([\d\.]+)/[\d]+ Like iTunes'
 
142
  name: 'Castro 2'
143
  version: '$1'
144
+ - regex: 'Castro 2'
 
145
  name: 'Castro 2'
146
  version: ''
147
+ - regex: 'DoggCatcher'
 
148
  name: 'DoggCatcher'
149
  version:
150
+ - regex: 'PodcastAddict/v([\d]+)'
 
151
  name: 'Podcast & Radio Addict'
152
  version: '$1'
153
+ - regex: 'Podcat/([\d]+) CFNetwork/([\d\.]+) Darwin/([\d\.]+)'
 
154
  name: 'Podcat'
155
  version: '$1'
156
+ - regex: 'i[cC]atcher[^\d]+([\d\.]+)'
 
157
  name: 'iCatcher'
158
  version: '$1'
159
+ - regex: 'YelpApp/([\d\.]+)'
 
160
  name: 'Yelp Mobile'
161
  version: '$1'
162
+ - regex: 'jp.co.yahoo.android.yjtop/([\d\.]+)'
 
163
  name: 'Yahoo! Japan'
164
  version: '$1'
165
+ - regex: 'RSSRadio/([\d]+)?'
 
166
  name: 'RSSRadio'
167
  version: '$1'
168
+ - regex: 'SogouSearch Android[\d\.]+ version([\d\.]+)?'
 
169
  name: 'SogouSearch App'
170
  version: '$1'
171
+ - regex: 'NewsArticle/([\d\.]+)?'
 
172
  name: 'NewsArticle App'
173
  version: '$1'
174
+ - regex: 'tieba/([\d\.]+)?'
 
175
  name: 'tieba'
176
  version: '$1'
177
+ - regex: 'com\.douban\.group/([\d\.]+)?'
 
178
  name: 'douban App'
179
  version: '$1'
180
+ - regex: 'BingWeb/([\d\.]+)?'
 
181
  name: 'BingWebApp'
182
  version: '$1'
183
+ - regex: 'GSA/([\d\.]+)?'
 
184
  name: 'Google Search App'
185
  version: '$1'
186
+ - regex: 'Flipboard/([\d\.]+)?'
 
187
  name: 'Flipboard App'
188
  version: '$1'
189
+ - regex: 'Instagram[ /]([\d\.]+)?'
 
190
  name: 'Instagram App'
191
  version: '$1'
192
+ - regex: 'baiduboxapp/([\d\.]+)?'
 
193
  name: 'Baidu Box App'
194
  version: '$1'
195
+ - regex: 'Crosswalk(?!.*(?:Streamy|QwantMobile))/([\d\.]+)?'
 
196
  name: 'CrosswalkApp'
197
  version: '$1'
198
+ - regex: 'Twitter for iPhone[/]?([\d\.]+)?'
 
199
  name: 'Twitter'
200
  version: '$1'
201
+ - regex: 'Twitter/([\d\.]+)'
 
202
  name: 'Twitter'
203
  version: '$1'
204
+ - regex: 'TwitterAndroid[/]?([\d\.]+)?'
 
205
  name: 'Twitter'
206
  version: '$1'
207
 
208
+ - regex: 'TopBuzz/([\d\.]+)'
 
209
  name: 'TopBuzz'
210
  version: '$1'
211
+ - regex: 'Snapchat/([\d\.]+)'
 
212
  name: 'Snapchat'
213
  version: '$1'
214
 
243
  - regex: 'LinkedIn/([\d\.]+)'
244
  name: 'LinkedIn'
245
  version: '$1'
246
+
247
+ # https://apps.apple.com/ru/app/instapaper/id288545208
248
+ - regex: 'Instapaper/([\d\.]+)'
249
+ name: 'Instapaper'
250
+ version: '$1'
251
+
252
+ # https://apps.apple.com/us/app/keeper-password-manager/id287170072
253
+ - regex: 'Keeper/([\d\.]+)'
254
+ name: 'Keeper Password Manager'
255
+ version: '$1'
256
+
257
+ # https://apps.apple.com/us/app/skyeng-teachers/id1483049537
258
+ - regex: 'Skyeng Teachers/([\d\.]+)'
259
+ name: 'Skyeng Teachers'
260
+ version: '$1'
261
+
262
+ - regex: 'Kik/([\d\.]+) \(Android'
263
+ name: 'Kik'
264
+ version: '$1'
app/vendor/matomo/device-detector/regexes/device/mobiles.yml CHANGED
@@ -5,15 +5,23 @@
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
  ###############
7
 
8
- # Ace (https://www.acemobile.fr/)
9
  Ace:
10
- regex: 'BUZZ 1 (?:Lite|Plus)'
11
- device: 'smartphone'
12
- models:
13
- - regex: 'BUZZ 1 Lite'
14
- model: 'Buzz 1 Lite'
15
- - regex: 'BUZZ 1 Plus'
16
- model: 'Buzz 1 Plus'
 
 
 
 
 
 
 
 
17
 
18
  'Tunisie Telecom':
19
  regex: 'StarTrail TT(?:[);/ ]|$)'
@@ -64,9 +72,9 @@ SFR:
64
  - regex: '((?:StarShine|StarTrail|STARADDICT|StarText|StarNaute|StarXtrem)[^;/]*) Build'
65
  model: '$1'
66
 
67
- # HTC
68
  HTC:
69
- regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G(?:[);/ ]|$)|(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/)]+)(?: Build|\))|(Amaze[ _]4G|One ?[XELSV\+]+)(?:[);/ ]|$)|SPV E6[05]0|(One M8|X525a|PG86100|PC36100|XV6975|PJ83100|2PYB2|2PZC5|0PJA10|0PJA2|HTV33|0PM92|0PCV1|601HT|0PAJ5|HTL2[23]|HTV32|2PQ93|X2-HT)(?:[);/ ]|$)'
70
  device: 'smartphone'
71
  models:
72
  # explicit smartphone models
@@ -108,12 +116,16 @@ HTC:
108
  model: 'Vox'
109
  - regex: '2PYB2'
110
  model: 'Bolt'
 
 
111
  - regex: '0PM92(?:[);/ ]|$)'
112
  model: 'Desire 626S'
113
  - regex: '0PCV1(?:[);/ ]|$)'
114
  model: 'Desire 510'
115
  - regex: '608t(?:[);/ ]|$)'
116
  model: 'Desire 608t'
 
 
117
 
118
  - regex: 'NexusHD2' # custom rom for hd2
119
  model: 'HD2'
@@ -160,6 +172,8 @@ HTC:
160
  model: 'One E8'
161
  - regex: 'HTV32(?:[);/ ]|$)'
162
  model: '10'
 
 
163
 
164
  # microsoft
165
  Microsoft:
@@ -502,12 +516,52 @@ TiPhone:
502
 
503
  # Apple
504
  Apple:
505
- regex: '(?:iTunes-)?Apple[ _]?TV|(?:Apple-|iTunes-)?(?<!like )(?:iPad|iPhone)|iPh[0-9],[0-9]|CFNetwork|HomePod'
506
  models:
507
  - regex: 'HomePod'
508
  device: 'smart speaker'
509
  model: 'HomePod'
510
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
511
  # specific smartphone devices
512
  - regex: '(?:Apple-)?iPh(?:one)?1[C,_]1'
513
  model: 'iPhone'
@@ -584,6 +638,18 @@ Apple:
584
  - regex: '(?:Apple-)?iPh(?:one)?12[C,_][8]'
585
  model: 'iPhone SE (2020)'
586
  device: 'phablet'
 
 
 
 
 
 
 
 
 
 
 
 
587
 
588
  # specific tablet devices
589
  - regex: '(?:Apple-)?iPad1[C,_]1'
@@ -1066,15 +1132,15 @@ Airness:
1066
 
1067
  # Aiwa
1068
  Aiwa:
1069
- regex: '(?:AW790|M300|AWM533|AW500)(?:[);/ ]|$)'
1070
  device: 'smartphone'
1071
  models:
1072
  - regex: 'AW790(?:[);/ ]|$)'
1073
  model: 'AW790'
1074
  - regex: 'AW500(?:[);/ ]|$)'
1075
  model: 'AW500'
1076
- - regex: 'AWM533(?:[);/ ]|$)'
1077
- model: 'AWM533'
1078
  - regex: 'M300(?:[);/ ]|$)'
1079
  model: 'M300'
1080
  device: 'phablet'
@@ -1118,7 +1184,7 @@ Arian Space:
1118
 
1119
  # Alcatel (alcatelmobile.com)
1120
  Alcatel:
1121
- regex: 'Alcatel|Alc(?!or )[a-z0-9]+|One[ _]?Touch|idol3|TIMXL|(?:(?:4003[AJ]|4009[ADEFIKMSX]|4013[DEJKMX]|4014[ADEKMX]|4015[ADNTX]|4016[ADX]|4017[ADEFSX]|4018[ADEFMX]|4024[EDX]|4027[ADNX]|4028[AEJS]|4032[ADEX]|4034L|4034[ADEFGX]|4035[ADXY]|4045[ADEX]|4047[ADFGNX]|4049[DEGMX]|4060[SW]|A466BG|A621BL|4114E|5001[ADJTU]|5002[ADF]|5003[ADG]|5006D|5007[AU]|5008[DUY]|5009[AD]|5010[DEGSUX]|5011A|5012[DFG]|5015[ADEX]|5016[AXJ]|5017[ABDEOX]|5019D|5022[EDX]|5023[EF]|5024[ADJF]|5025[DEG]|5026[ADJ]|5027B|5028[AYD]|5029[EYD]|5030D|5032W|5033[AEFXDJGMOTXY]|5034D|5036D|5038[ADEX]|5039[D]|5041[CD]|5042[ADEFGWXT]|5044[ADGIKOPSTY]|5045[ADFGIJTXY]|5046[ADGIJSTUY]|5047[DIUY]|5048[AYUI]|5049[EGSWZ]|5050[ASXY]|5051[ADEJMTWX]|5052[ADY]|5053[AKY]|5054[ADNSTWX]|5056[ADEGIJMNTUWX]|5057M|5058[AIY]|5059[ADXYZIST]|5060D|5061[KU]|5065[ADNWX]|5070D|5080[ADFQUX]|5085[ABCDGHIJNOQY]|5086[ADY]|5090[AIY]|5095[IKY]|5098[OS]|5099[ADYUI]|5116J|5145A|6016[ADEX]|6036[AXY]|6037[BKY]|6039[AHJKY]|6042D|6043[AD]|6044D|6045[BFIKOYX]|6050[AFY]|6055[ABDHIKPUYZ]|6058[ADX]|6060S|6062W|6070K|7040[ADEFKRT]|7041[DX]|7042A|7043[AEKY]|7044[AX]|7045Y|7048[ASWX]|7053D|7055A|7070X|8030Y|8050[DEGX]|8063|8088[XQ]|9001[DIX]|9002X|9003[AX]|9024O|9005X|9026X|9007[ATX]|9008[ADIJNTUX]|9009G|9010X|9020A|9022X|9027[FTWX]|9203A|A(?:464BG|570BL|50[13]DL|57[17]VL|574BL)|I213|I216X)(?:_(?:EEA|RU))?)(?:[);/ ]|$)'
1122
  device: 'smartphone'
1123
  models:
1124
  - regex: '5022[EDX]|5070D'
@@ -1189,8 +1255,12 @@ Alcatel:
1189
  model: 'One Touch Dawn'
1190
  - regex: '5024[ADF]|5028Y'
1191
  model: '1S'
 
 
1192
  - regex: '5002[AD]'
1193
  model: '1B (2020)'
 
 
1194
  - regex: '5002F'
1195
  model: '1A (2020)'
1196
  - regex: '5034D'
@@ -1275,6 +1345,12 @@ Alcatel:
1275
  - regex: '9009G'
1276
  model: '1T'
1277
  device: 'tablet'
 
 
 
 
 
 
1278
  - regex: '9022X'
1279
  model: 'One Touch Pixi 3 8"'
1280
  device: 'phablet'
@@ -1389,6 +1465,8 @@ Alcatel:
1389
  model: 'One Touch 813'
1390
  - regex: 'OT871A'
1391
  model: 'One Touch 871A'
 
 
1392
  - regex: '(?:Alcatel[ _])?One[ _]?Touch[ _]((?:T[0-9]+|TAB[^/;]+|EVO[78](?:HD)?)) Build'
1393
  device: 'tablet'
1394
  model: 'One Touch $1'
@@ -1422,15 +1500,15 @@ Alcatel:
1422
  model: 'Go Flip'
1423
  - regex: '5044[GS]'
1424
  model: 'U50'
1425
- - regex: '5033[ADXJEFGMOTXY]'
1426
  model: '1'
1427
  - regex: '5009[AD]'
1428
  model: '1C'
1429
- - regex: '5008[DUY]'
1430
  model: '1X (2019)'
1431
  - regex: '5007[AU]'
1432
  model: '1V (2020)'
1433
- - regex: '5003[ADG]'
1434
  model: '1C (2019)'
1435
  - regex: '5006D'
1436
  model: '3C (2019)'
@@ -1442,14 +1520,14 @@ Alcatel:
1442
  model: '1SE (2020)'
1443
  - regex: '5001[ADJTU]'
1444
  model: '1V'
1445
- - regex: '5059[ADXYZIT]'
1446
  model: '1X'
1447
  - regex: '5059S'
1448
  model: 'Avalon V'
1449
- - regex: '5060D'
1450
  model: '5V'
1451
  device: 'phablet'
1452
- - regex: '5052[ADY]|5053[AKY]'
1453
  model: '3'
1454
  - regex: '5029E'
1455
  model: '3 (2020)'
@@ -1459,7 +1537,7 @@ Alcatel:
1459
  model: '3V'
1460
  - regex: '5026[ADJ]'
1461
  model: '3C'
1462
- - regex: '5039[D]'
1463
  model: '3L'
1464
  device: 'phablet'
1465
  - regex: '5058[AIY]'
@@ -1654,13 +1732,16 @@ Allview:
1654
 
1655
  # Allwinner
1656
  Allwinner:
1657
- regex: '(?:QUAD-CORE A64 p3|ZY-07B)(?:[);/ ]|$)'
1658
  device: 'tablet'
1659
  models:
1660
  - regex: 'QUAD-CORE A64 p3'
1661
  model: 'A64 QUAD-CORE p3'
1662
  - regex: 'ZY-07B'
1663
  model: 'ZY-07B'
 
 
 
1664
 
1665
  # altron
1666
  altron:
@@ -1729,6 +1810,8 @@ Ainol:
1729
  models:
1730
  - regex: 'Numy 3G AX1'
1731
  model: 'Novo 7 Numy AX1 3G'
 
 
1732
  - regex: 'NOVO10 Spark'
1733
  model: 'Novo 10 Spark'
1734
  - regex: 'AX10PRO'
@@ -1741,6 +1824,8 @@ Ainol:
1741
  model: 'Numy 3G Talos 2'
1742
  - regex: 'NUMY3GAX9(?:[);/ ]|$)'
1743
  model: 'Numy 3G AX9'
 
 
1744
  - regex: '(Novo 10 Hero QuadCore)'
1745
  model: '$1'
1746
  - regex: 'Aurora-II'
@@ -1973,7 +2058,7 @@ Garmin-Asus:
1973
 
1974
  # Asus
1975
  Asus:
1976
- regex: 'Asus|Transformer|ZenFone Max|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|(?:K0[01][0-9a-z]|P(?:00[18ACIL]|01[MTVWYZ]|01MA|01T_1|02[13478])(?: Build|\))|X015D|X018D|X003|X00[7ABT]D|Z00D|Z00[MTY]D|Z01[7FGHKMR]D)(?:[);/ ]|$)|G55[023]KL|ZB(631|602|633|55[135]|50[01])KL|ZC(55[134]|520|600)KL|ZA550KL|ZE(520|620|55[2345])KL|ZD55[23]KL|ZS661KS|ZS(6[0236]0|55[10])KL|ZB(500KG|601KL)|MeMo Pad FHD 10 LTE|Z00[SV]D'
1977
  device: 'smartphone'
1978
  models:
1979
  # explicit tablet models
@@ -2073,6 +2158,9 @@ Asus:
2073
  - regex: 'ASUS Tablet P1801-T'
2074
  model: 'Transformer AiO P1801 18.4"'
2075
  device: 'tablet'
 
 
 
2076
 
2077
  # explicit phablet models
2078
  - regex: 'ME371MG(?:[);/ ]|$)'
@@ -2094,6 +2182,10 @@ Asus:
2094
  # explicit smartphone models
2095
  - regex: '(?:ASUS_)?T00N'
2096
  model: 'PadFone S'
 
 
 
 
2097
  - regex: '(?:ASUS_)?A002(A)?'
2098
  model: 'ZenFone AR'
2099
  - regex: '(?:ASUS_)?A006'
@@ -2120,7 +2212,7 @@ Asus:
2120
  model: 'ZenFone Lite L1'
2121
  - regex: '(?:ASUS_)Z00YD'
2122
  model: 'Live'
2123
- - regex: '(?:ASUS_)?(?:Z00[ERLMT]D|Z011D)'
2124
  model: 'ZenFone 2 Laser'
2125
  - regex: '(?:ASUS_)?(?:T00[IQ1]|Z01KD)'
2126
  model: 'ZenFone 4'
@@ -2215,7 +2307,7 @@ Asus:
2215
  - regex: '(?:Asus|Transformer) ((?:Pad |Prime )?TF[0-9a-z]+)'
2216
  device: 'tablet'
2217
  model: 'Transformer $1'
2218
- - regex: 'Chromebook Flip (C100PA|C302)'
2219
  device: 'desktop'
2220
  model: 'Chromebook Flip $1'
2221
 
@@ -2247,9 +2339,11 @@ AVH:
2247
 
2248
  # Avvio
2249
  Avvio:
2250
- regex: 'Avvio[ _]?([a-z0-9\-]+)'
2251
  device: 'smartphone'
2252
  models:
 
 
2253
  - regex: 'Avvio[ _]PAD'
2254
  model: 'PAD'
2255
  device: 'tablet'
@@ -2309,15 +2403,15 @@ Bitel:
2309
 
2310
  # Blu
2311
  Blu:
2312
- regex: 'BLU[ _]|(?:blu|Dash)[ _]([^/;)]+)(?: Build|[;)])|Studio (5.0K|5.5|View XL|Mega|C 8\+8|C HD|C|G|Selfie LTE|Touch|M HD|M5 Plus|J[1258]|X|X8 HD)|Advance (4.0 ?[LM]|5.[02](?: HD)?|A4|L5)|ENERGY (DIAMOND|XL)|LIFE XL|B110DL|Dash (?:X[2L]|L3)|PURE XL|Life One X2|GRAND (?:5.5 HD|XL LTE)|R1 (HD|PLUS)|Tank Xtreme 5.0|Tank Xtreme Pro|STUDIO SELFIE|Touchbook M7 Pro'
2313
  device: 'smartphone'
2314
  models:
2315
- - regex: 'Advance (4.0 ?[LM]|4.0|5.[02](?: HD)?|A4|L5)'
2316
  model: 'Advance $1'
2317
- - regex: 'Studio (5.0 C|5.5|View XL|Mega|C 8\+8|C HD|C|G|Touch|M HD|M5 Plus|J[1258]|X|X8 HD)'
2318
  model: 'Studio $1'
2319
- - regex: 'Studio (5.0)K'
2320
- model: 'Studio $1 K'
2321
  - regex: 'STUDIO SELFIE LTE'
2322
  model: 'Studio Selfie LTE'
2323
  - regex: 'STUDIO ONE'
@@ -2326,8 +2420,8 @@ Blu:
2326
  model: 'Studio Selfie $1'
2327
  - regex: 'STUDIO SELFIE'
2328
  model: 'Studio Selfie'
2329
- - regex: 'BLU_STUDIO_XL'
2330
- model: 'Studio XL'
2331
  - regex: 'ENERGY DIAMOND'
2332
  model: 'Energy Diamond'
2333
  - regex: 'ENERGY XL'
@@ -2338,14 +2432,22 @@ Blu:
2338
  model: 'Energy X Plus'
2339
  - regex: 'LIFE XL'
2340
  model: 'Life XL'
 
 
 
 
2341
  - regex: 'Dash XL'
2342
  model: 'Dash XL'
2343
  - regex: 'PURE XL'
2344
  model: 'Pure XL'
2345
  - regex: 'Life One X2'
2346
  model: 'Life One X2'
 
 
2347
  - regex: 'LIFE ONE'
2348
  model: 'Life One'
 
 
2349
  - regex: 'NEO X PLUS'
2350
  model: 'Neo X Plus'
2351
  - regex: 'NEO (XL|X)'
@@ -2356,28 +2458,41 @@ Blu:
2356
  model: 'Grand X LTE'
2357
  - regex: 'Grand XL LTE'
2358
  model: 'Grand XL LTE'
 
 
2359
  - regex: 'B110DL'
2360
  model: 'View Mega'
2361
  - regex: 'R1 HD'
2362
  model: 'R1 HD'
2363
  - regex: 'R1 PLUS'
2364
  model: 'R1 Plus'
 
 
2365
  - regex: 'Tank Xtreme 5.0'
2366
  model: 'Tank Xtreme 5.0'
2367
  - regex: 'Tank Xtreme Pro'
2368
  model: 'Tank Xtreme Pro'
2369
  - regex: 'VIVO AIR LTE'
2370
  model: 'Vivo Air LTE'
 
 
 
 
2371
 
2372
  - regex: 'Touchbook M7 Pro'
2373
  model: 'Touchbook M7 Pro'
2374
  device: 'tablet'
 
 
 
2375
 
2376
- - regex: 'DASH[ _]([^/;]+) Build'
2377
  model: 'Dash $1'
2378
- - regex: 'DASH (5.0|L3|L|M|X2|X)'
 
2379
  model: 'Dash $1'
2380
- - regex: 'blu[ _]([^/;]+) Build'
 
2381
  model: '$1'
2382
 
2383
  # Bluegood
@@ -2441,7 +2556,7 @@ Bluboo:
2441
 
2442
  # Black Fox
2443
  'Black Fox':
2444
- regex: 'BMM[ _-]?(?:44[123]D|44[12]S|431D|533D|54[12]S|541[ABW]|54[123]D|543S|531[ABD])(?:[);/ ]|$)'
2445
  device: 'smartphone'
2446
  models:
2447
  - regex: 'BMM443D'
@@ -2472,6 +2587,8 @@ Bluboo:
2472
  model: 'B3'
2473
  - regex: 'BMM541W'
2474
  model: 'B7R Fox'
 
 
2475
  - regex: 'BMM[ _-]?(533D|431D|54[12]S)(?:[);/ ]|$)'
2476
  model: 'BMM $1'
2477
 
@@ -2810,9 +2927,9 @@ BenQ:
2810
  - regex: 'BENQ(?:[ \-])?([a-z0-9]+)'
2811
  model: '$1'
2812
 
2813
- # Blaupunkt
2814
  Blaupunkt:
2815
- regex: 'Blaupunkt|Atlantis[_ ](?:1001A|1010A|A10\.G40[23])|SLplus02|Discovery[_ ](?:A10_302|111C|1000C|1001A?)|Endeavour[_ ](?:785|101[GLM]|1000|1001|101[03]|1100)|Polaris[_ ]803'
2816
  device: 'tablet'
2817
  models:
2818
  - regex: 'Discovery[_ ]111C'
@@ -2825,6 +2942,8 @@ Blaupunkt:
2825
  model: 'Discovery 1001A'
2826
  - regex: 'Discovery[_ ]1001'
2827
  model: 'Discovery 1001'
 
 
2828
  - regex: 'Endeavour[_ ](101[GLM]|785|100[01]|101[03]|1100)'
2829
  model: 'Endeavour $1'
2830
  - regex: 'Polaris[_ ](803)'
@@ -2833,7 +2952,7 @@ Blaupunkt:
2833
  model: 'Atlantis $1'
2834
  - regex: 'SLplus02'
2835
  model: 'SL Plus 02'
2836
- - regex: 'Blaupunkt (SL 0[124]|SM 01)'
2837
  device: 'smartphone'
2838
  model: '$1'
2839
 
@@ -3182,8 +3301,8 @@ bq:
3182
  - regex: 'Aquaris M8'
3183
  model: 'Aquaris M8'
3184
  device: 'tablet'
3185
- - regex: 'Aquaris_A4.5'
3186
- model: 'Aquaris A4.5'
3187
  - regex: 'BQ(?:ru)?[_ ]5590(?:[);/ ]|$)'
3188
  model: 'Spring'
3189
  - regex: 'BQ[S]?-(?:6016L|5520)(?:[);/ ]|$)'
@@ -3252,7 +3371,7 @@ bq:
3252
  device: 'tablet'
3253
  - regex: '(?:bq )?(Aquaris[^/;]*) Build'
3254
  model: '$1'
3255
- - regex: 'Aquaris (E(4.5|[56])|M(5|10)|U2 Lite|U2|U (Lite|Plus)|V Plus|X5 Plus|X5|X Pro|[CMUVX])'
3256
  model: 'Aquaris $1'
3257
  - regex: 'bq ([^/;]+) Build'
3258
  model: '$1'
@@ -3260,9 +3379,12 @@ bq:
3260
 
3261
  # Bush
3262
  Bush:
3263
- regex: 'Bush[ _-]'
3264
  device: 'smartphone'
3265
  models:
 
 
 
3266
  - regex: 'BUSH ([^;/)]+)Tablet(?: Build|[);])'
3267
  model: '$1Tablet'
3268
  device: 'tablet'
@@ -3308,7 +3430,7 @@ Casper:
3308
  regex: 'CASPER[_ ]|VIA[- _](T7D|A[34]|E3|F[123]|G4|M4|[LS]8|S7|P2|V8C|A1_Plus|A1|S10|S|T17_M|T1[07]|T7|T7-3G|T8B|T8D-3G)(?:[);/ ]|$)'
3309
  device: 'smartphone'
3310
  models:
3311
- - regex: 'CASPER[_ ]VIA_(G1_Plus|G1|E1|[AE]2|M[123]|V[35689]|V10|G3)(?:[);/ ]|$)'
3312
  model: 'VIA $1'
3313
  - regex: 'CASPER_VIA_E1c'
3314
  model: 'VIA E1C'
@@ -3324,8 +3446,6 @@ Casper:
3324
  - regex: 'VIA[- _](T7D|S10|[LS]8|S7|T17_M|T1[07]|T7|T8B)(?:[);/ ]|$)'
3325
  model: 'VIA $1'
3326
  device: 'tablet'
3327
- - regex: 'VIA[_ ](A[34]|E3|F[123]|G4|M4|P2|S|V8C|A1_Plus|A1)'
3328
- model: 'VIA $1'
3329
 
3330
  # Cat (Caterpillar, Catphones)
3331
  Cat:
@@ -3387,49 +3507,63 @@ Changhong:
3387
 
3388
  # Cherry Mobile
3389
  'Cherry Mobile':
3390
- regex: 'Cherry|Flare([ _])?(2X|4|A[123]|J[1235]|P[13]|S[4568]|X2)|Flare[ _](?:S Play|S5 Plus|S5|HD_MAX|LITE|XL Plus|X_V2)|Fusion Bolt|OMEGA HD 4'
3391
  device: 'smartphone'
3392
  models:
3393
- - regex: 'Cherry(?: ?Mobile)?[ _]?([^/;]+) Build'
3394
- model: '$1'
3395
  - regex: '(Flare2X)'
3396
  model: '$1'
 
 
3397
  - regex: 'Flare_HD_MAX'
3398
  model: 'Flare HD Max'
3399
  - regex: 'FLARE LITE'
3400
  model: 'Flare Lite'
3401
  - regex: 'Flare S Play'
3402
  model: 'Flare S Play'
 
 
 
 
 
 
 
 
 
 
3403
  - regex: 'Flare XL Plus'
3404
  model: 'Flare XL Plus'
3405
  - regex: 'Flare[ _]X[_ ]V2'
3406
  model: 'Flare X V2'
3407
- - regex: 'Flare[ _](A2|J3|P1|S[46])[ _]Lite'
3408
  model: 'Flare $1 Lite'
3409
- - regex: 'Flare[ _](J[12]|S5)[ _]mini'
3410
  model: 'Flare $1 Mini'
3411
- - regex: 'Flare J2S'
3412
- model: 'Flare J2s'
3413
  - regex: 'Flare S4 Max LTE'
3414
  model: 'Flare S4 Max LTE'
3415
- - regex: 'Flare S4 Max'
3416
- model: 'Flare S4 Max'
3417
  - regex: 'FlareS5LiteDTV'
3418
  model: 'Flare S5 Lite DTV'
3419
- - regex: 'Flare S5 Plus'
3420
- model: 'Flare S5 Plus'
3421
- - regex: 'Flare_S6_Plus'
3422
- model: 'Flare S6 Plus'
3423
  - regex: 'FLARE S6 POWER'
3424
  model: 'Flare S6 Power'
3425
- - regex: 'Flare(?:[ _])?(4|A[13]|J[135]|P[13]|S[4568]|X2)'
3426
  model: 'Flare $1'
3427
  - regex: 'OMEGA HD 4'
3428
  model: 'Omega HD 4'
3429
- - regex: '(Fusion Bolt)'
 
 
3430
  model: '$1'
3431
  device: 'tablet'
3432
 
 
 
 
3433
  # China Mobile
3434
  'China Mobile':
3435
  regex: '(M812C|1501_M02|9930i|A1303|A309W|M651CY) Build'
@@ -3455,9 +3589,7 @@ Comio:
3455
  model: 'CT701G Plus'
3456
  device: 'tablet'
3457
 
3458
- - regex: 'Comio[ _-]?([^;/)]+) Build'
3459
- model: '$1'
3460
- - regex: 'Comio[ _-]?([^;/)]+)'
3461
  model: '$1'
3462
 
3463
  # Compal
@@ -3468,9 +3600,11 @@ Compal:
3468
 
3469
  # Artel
3470
  Artel:
3471
- regex: 'Artel[_ ]|\w+_ARTEL_\w+'
3472
  device: 'smartphone'
3473
  models:
 
 
3474
  - regex: 'Artel[_ ](Quadro(?: Pro)?|Tesla|Air|Tomchi|Premium|U3_4G|Z5|Sentinel (?:X 8G|X D5|X))'
3475
  model: '$1'
3476
  - regex: 'Artel[_ ]Komi3'
@@ -3485,7 +3619,7 @@ Artel:
3485
 
3486
  # ComTrade Tesla
3487
  ComTrade Tesla:
3488
- regex: 'Tesla|Impulse 7.85 3G|Smartphone_6.1|SP(?:6.2|6.2_Lite)|TTL(?:713G|8)'
3489
  device: 'smartphone'
3490
  models:
3491
  - regex: 'TeslaEvo5.0'
@@ -3496,6 +3630,9 @@ ComTrade Tesla:
3496
  - regex: '(Impulse 7.85 3G)'
3497
  model: '$1'
3498
  device: 'tablet'
 
 
 
3499
  - regex: 'Tesla_SP([^/;]+)L Build'
3500
  model: 'Smartphone $1 Lite'
3501
  - regex: 'Smartphone_6.1'
@@ -3633,6 +3770,8 @@ Condor:
3633
  model: 'Griffe T7'
3634
  - regex: 'Griffe T8 Plus'
3635
  model: 'Griffe T8 Plus'
 
 
3636
  - regex: 'Griffe T9'
3637
  model: 'Griffe T9'
3638
  - regex: 'PGN\-?522'
@@ -3667,8 +3806,14 @@ Condor:
3667
  model: 'Plume L1'
3668
  - regex: 'Plume L2 Pro'
3669
  model: 'Plume L2 Pro'
 
 
3670
  - regex: 'Plume L3 Plus'
3671
  model: 'Plume L3 Plus'
 
 
 
 
3672
  - regex: 'Plume P8 Pro'
3673
  model: 'Plume P8 Pro'
3674
 
@@ -3677,7 +3822,7 @@ Condor:
3677
 
3678
  # Coolpad
3679
  Coolpad:
3680
- regex: '(?:YL-)?Coolpad|(?:Cool_9S|8190Q|1831-A0|8676-[AM]01|CP8298_I00|CP3648A|CP8676_I0[23]|REVVLPLUS C3701A|VCR-[AI]0|C105-E0|C106-[79]|MTS-T0|cp3705A[S]?|ORL-C0|DLS-E0|8298-M02|5560S)(?:[);/ ]|$)|(8295|5860S) Build'
3681
  device: 'smartphone'
3682
  models:
3683
  - regex: 'VCR-[AI]0'
@@ -3691,6 +3836,8 @@ Coolpad:
3691
  model: '8190Q'
3692
  - regex: 'DLS-E0(?:[);/ ]|$)'
3693
  model: 'N5'
 
 
3694
  - regex: 'CP3705A[S]?(?:[);/ ]|$)'
3695
  model: 'Legacy'
3696
  - regex: 'CP3648A(?:[);/ ]|$)'
@@ -3727,8 +3874,8 @@ Clarmin:
3727
  regex: 'Clarmin'
3728
  device: 'smartphone'
3729
  models:
3730
- - regex: 'Clarmin_B6'
3731
- model: 'B6'
3732
 
3733
  # Cricket
3734
  Cricket:
@@ -3760,13 +3907,17 @@ Crosscall:
3760
  - regex: 'Trekker-([MSX][1234](?: Core)?)'
3761
  model: 'Trekker-$1'
3762
 
3763
- # AllDocube (https://www.alldocube.com/)
3764
  AllDocube:
3765
- regex: '(?:T1001XS?|iPlay_20|U1006H?)(?:[);/ ]|$)'
3766
  device: 'tablet'
3767
  models:
3768
  - regex: 'T1001XS(?:[);/ ]|$)'
3769
  model: 'M5XS'
 
 
 
 
3770
  - regex: 'T1001X(?:[);/ ]|$)'
3771
  model: 'M5X'
3772
  - regex: 'U1006H?(?:[);/ ]|$)'
@@ -3942,12 +4093,12 @@ Danew:
3942
  device: 'tablet'
3943
  model: 'Geodroid A5'
3944
 
3945
- # Denver Electronics
3946
  Denver:
3947
  regex: '(?:TA[CDQ]-[0-9]+)|P(?:.+)TAQ-(?:[0-9]+)'
3948
  device: 'tablet'
3949
  models:
3950
- - regex: 'P(?:.+)TAQ-(10172MK3|10242MK2|70242MK2|[0-9]+)(?:[);/ ]|$)'
3951
  model: 'TAQ-$1'
3952
  - regex: '(TA[CDQ]-[0-9]+)'
3953
  model: '$1'
@@ -3989,7 +4140,7 @@ Desay:
3989
 
3990
  # DEXP
3991
  DEXP:
3992
- regex: 'DEXP|(?:Ursus|Ixion)[ _]([^;/)]+)|H135[ _]Build|Larus_TV1|IxionML4.7|M150Storm|(?:SENIOR|F4[38]D8000K|VA[12]10|VA170|ML450|MS[56]50|BL[123]50|BS155|BS160|BS[1256]50|AL[12]40|AL[23]50|AS155|AS260| (?:N280i|P380i|R110|B450|B340|A1[45]0))(?:[);/ ]|$)'
3993
  device: 'smartphone'
3994
  models:
3995
  - regex: 'Ixion[_ ]([^;/]+)(?: Build|\))'
@@ -4029,7 +4180,7 @@ DEXP:
4029
  - regex: 'H135[ _]Build'
4030
  model: 'Atlas'
4031
  device: 'desktop'
4032
- - regex: '(BL[123]50|BS155|BS160|BS[1256]50|AL[12]40|A1[45]0)(?:[);/ ]|$)'
4033
  model: '$1'
4034
  - regex: 'DEXP[ _]([^;/]+) Build'
4035
  model: '$1'
@@ -4076,12 +4227,13 @@ Digicel:
4076
 
4077
  # Digiland
4078
  Digiland:
4079
- regex: 'DL1008M'
4080
- device: 'smartphone'
4081
  models:
4082
  - regex: 'DL1008M'
4083
- device: 'tablet'
4084
  model: 'DL1008M'
 
 
4085
 
4086
  # Digma
4087
  Digma:
@@ -4293,15 +4445,15 @@ Doro:
4293
 
4294
  # DNS
4295
  DNS:
4296
- regex: '(?:DNS|AirTab)[ _\-]([^;/)]+)(?: Build|\))|(?:S4505M|S4004M|SD01M)(?:[);/ ]|$)'
4297
  device: 'smartphone'
4298
  models:
4299
  - regex: '(?:DNS[_ ])?(S4505M|S4004M|SD01M|S4502|S4003|S4003)(?:[);/ ]|$)'
4300
  model: '$1'
4301
- - regex: 'AirTab[ _\-]([^;/]+)Build'
4302
  model: 'AirTab $1'
4303
  device: 'tablet'
4304
- - regex: 'DNS[ _\-]([^;/]+)Build'
4305
  model: '$1'
4306
 
4307
  # E-Boda
@@ -4340,16 +4492,18 @@ EBEST:
4340
 
4341
  # Echo Mobiles
4342
  Echo Mobiles:
4343
- regex: 'ECHO[ _](HOLI|HORIZON|MAX|MOSS|NOTE|POWER|SMART|DUNE|JAVA)|HORIZON_M'
4344
  device: 'smartphone'
4345
  models:
4346
  - regex: 'ECHO_HORIZON_LITE'
4347
  model: 'HORIZON Lite'
4348
- - regex: '(HORIZON_M)(?:[);/ ]|$)'
4349
  model: '$1'
 
 
4350
  - regex: 'ECHO_SMART_4G'
4351
  model: 'SMART 4G'
4352
- - regex: 'ECHO[ _](HOLI|MAX|MOSS|NOTE|POWER|SMART|DUNE|JAVA)'
4353
  model: '$1'
4354
 
4355
  # ECS
@@ -4399,10 +4553,11 @@ Elephone:
4399
  model: 'P6000 01'
4400
  - regex: 'P6000 ?Pro(?:[);/ ]|$)'
4401
  model: 'P6000 Pro'
4402
- - regex: '(?:Elephone[ _])?(P[68]000|S2)(?:[);/ ]|$)'
4403
  model: '$1'
4404
- - regex: 'Elephone[ _\-]([^/;]+) Build'
4405
  model: '$1'
 
4406
  # Element
4407
  Element:
4408
  regex: 'AFTRS'
@@ -4516,7 +4671,7 @@ Senseit:
4516
 
4517
  # Sony & Sony Ericsson (combined as they are mixed up)
4518
  Sony:
4519
- regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|(?:[4-9]0[12])SO|C1[569]0[45]|C2[01]0[45]|C230[45]|C530[236]|C550[23]|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D240[36]|D25(?:02|33)|D510[236]|D530[36]|D5316|D5322|D5503|D58[03]3|D65(?:0[23]|43|63)|D66[03458]3|D66[14]6|D6708|E(?:20[0345]3|2006|210[45]|2115|2124|230[36]|2312|23[356]3|530[36]|53[3456]3|5506|55[356]3|56[46305][36]|58[02]3|65[35]3|66[0358]3|68[358]3)|I[34]312|I4332|F311[12356]|F331[13]|F321[12356]|F5[13]21|F5122|F813[12]|F833[12]|G312[135]|G311[26]|G322[136]|G3212|G331[123]|G3412|G3416|G342[136]|G823[12]|G834[123]|G8[14]4[12]|H(?:3113|3123|3133|3213|3223|3311|3321|4113|4133|4213|4233|4311|4331|4413|4433|82[167]6|83[12]4|8416|9436)|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]+[0-9]*(?: Build|\))|X?L39H|XM50[ht]|W960|portalmmm/2\.0 K|S3[69]h|SOG01|SOL2[246]|SOV3[1-9]|SOV4[0-3]|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[12]C|[345]D|[234]E|[1-5]F|[1-5]G|[1-4]H|[1-4]J|[1-5]K|1M|[1-3]L)|R800[aix]|J3173|J82[17]0|J9110|J92[16]0|J81[17]0|I[34]113|I3[12]23|I42[19]3|H9493|H8296|H8166|H4493|LiveWithWalkman|BRAVIA|SGP771|E3 Dual|A001SO|I4193|E6508|SOT31|SO-[45]1A|XQ-A[DT]51|XQ-AT42|XQ-AS72|XQ-A[TSU]52|SOL25|SOG02|A002SO|NW-A100Series'
4520
  device: 'smartphone'
4521
  models:
4522
  # SONY ERICSSON: explicit smartphone models
@@ -4654,7 +4809,7 @@ Sony:
4654
  model: 'Xperia 10'
4655
  - regex: '(?:Sony(?:Ericsson)?)?J3173(?:[);/ ]|$)'
4656
  model: 'Xperia Ace'
4657
- - regex: '(?:A001SO|XQ-A[TU]52|SO-41A|SOV43)(?:[);/ ]|$)'
4658
  model: 'Xperia 10 II'
4659
  - regex: '(?:Sony(?:Ericsson)?)?I(?:42[19]3|3223)'
4660
  model: 'Xperia 10 Plus'
@@ -4672,7 +4827,7 @@ Sony:
4672
  model: 'Xperia 5 Dual'
4673
  - regex: '(?:Sony(?:Ericsson)?)?(?:J82[17]0|SO-01M|SOV41|901SO)'
4674
  model: 'Xperia 5'
4675
- - regex: '(?:Sony(?:Ericsson)?)?(?:SOG02|A002SO|XQ-AS[75]2)'
4676
  model: 'Xperia 5 II'
4677
  - regex: '(?:Sony(?:Ericsson)?)?(?:SOV42|902SO)'
4678
  model: 'Xperia 8'
@@ -4802,6 +4957,9 @@ Sony:
4802
  - regex: 'Xperia Z2 Tablet Wifi'
4803
  model: 'Xperia Z2 Tablet WiFi'
4804
  device: 'tablet'
 
 
 
4805
  - regex: '(?:Sony(?:Ericsson)?)?(?:D65(?:0[23]|43)|SO-03F)|Xperia Z2(?:[);/ ]|$)'
4806
  model: 'Xperia Z2'
4807
  - regex: 'D6563'
@@ -5142,7 +5300,7 @@ Evolveo:
5142
 
5143
  # Explay
5144
  Explay:
5145
- regex: 'Explay|[\w]+-EXPLAY-FIN|ActiveD[ _]|Atlant |Informer[ _][0-9]+|CinemaTV 3G|Surfer[ _][0-9\.]|sQuad[ _][0-9\.]|Onliner[1-3]|RioPlay|Leader|Infinityll|Imperium[78]'
5146
  device: 'tablet'
5147
  models:
5148
  - regex: 'ActiveD[ _]7.4[ _]3G'
@@ -5166,6 +5324,9 @@ Explay:
5166
  - regex: 'Atlant(?:[);/ ]|$)'
5167
  device: 'smartphone'
5168
  model: 'Atlant'
 
 
 
5169
 
5170
  - regex: '[\w]+-EXPLAY-FIN'
5171
  device: 'feature phone'
@@ -5189,6 +5350,8 @@ EvroMedia:
5189
  models:
5190
  - regex: 'Playpad 3G GOO'
5191
  model: 'Play Pad 3G Goo'
 
 
5192
  - regex: 'Play Pad PRO'
5193
  model: 'Play Pad Pro'
5194
  - regex: 'PLAY_PAD_PRO_XL'
@@ -5312,7 +5475,7 @@ FNB:
5312
 
5313
  # Fujitsu
5314
  Fujitsu:
5315
- regex: '(?:F-01[FHJKL]|F-02[EFGHLK]|F-03[DEFGKH]|F-04[EGKJ]|F-05[DEFJ]|F-06E|F-07[DE]|F-08D|F-09[DE]|F-10D|F-[45]1A|F-11D|F-12C|M532|FARTM933KZ|901FJ|arrows(?:RX|M03|M0[45](?:-PREMIUM)?)|801FJ)(?:[);/ ]|$)'
5316
  device: 'smartphone'
5317
  models:
5318
  - regex: 'F-51A(?:[);/ ]|$)'
@@ -5321,8 +5484,14 @@ Fujitsu:
5321
  model: 'Arrows NX F-01F'
5322
  - regex: 'F-01L(?:[);/ ]|$)'
5323
  model: 'Easy Phone F-01L'
 
 
5324
  - regex: 'F-03K(?:[);/ ]|$)'
5325
  model: 'Easy Phone F-03K'
 
 
 
 
5326
  - regex: 'F-01J(?:[);/ ]|$)'
5327
  model: 'Arrows NX F-01J'
5328
  - regex: 'F-01K(?:[);/ ]|$)'
@@ -5333,6 +5502,8 @@ Fujitsu:
5333
  model: 'Arrows X F-02E'
5334
  - regex: 'F-02G(?:[);/ ]|$)'
5335
  model: 'Arrows NX F-02G'
 
 
5336
  - regex: 'F-02H(?:[);/ ]|$)'
5337
  model: 'Arrows NX F-02H'
5338
  - regex: 'F-03D(?:[);/ ]|$)'
@@ -5392,17 +5563,8 @@ Fujitsu:
5392
  - regex: 'arrowsM(0[45])(?:[);/ ]|$)'
5393
  model: 'Arrows M$1'
5394
 
5395
- - regex: 'F-02F(?:[);/ ]|$)'
5396
- model: 'Arrows Tab F-02F'
5397
- device: 'tablet'
5398
- - regex: 'F-02K(?:[);/ ]|$)'
5399
- model: 'Arrows Tab F-02K'
5400
- device: 'tablet'
5401
- - regex: 'F-03G(?:[);/ ]|$)'
5402
- model: 'Arrows Tab F-03G'
5403
- device: 'tablet'
5404
- - regex: 'F-05E(?:[);/ ]|$)'
5405
- model: 'Arrows Tab F-05E'
5406
  device: 'tablet'
5407
  - regex: 'FARTM933KZ'
5408
  model: 'Arrows Tab M504/HA4'
@@ -5433,7 +5595,7 @@ Gemini:
5433
 
5434
  # General Mobile
5435
  General Mobile:
5436
- regex: 'GM 5 Plus|GM8 go|GM [68] d|GM 8|General Mobile 4G'
5437
  device: 'smartphone'
5438
  models:
5439
  - regex: 'GM 5 Plus'
@@ -5444,6 +5606,10 @@ General Mobile:
5444
  model: 'GM 8'
5445
  - regex: 'GM8 go'
5446
  model: 'GM 8 Go'
 
 
 
 
5447
  - regex: 'General Mobile 4G Dual'
5448
  model: '4G Dual'
5449
  - regex: 'General Mobile 4G'
@@ -5474,21 +5640,21 @@ Ghia:
5474
 
5475
  # Gigabyte
5476
  Gigabyte:
5477
- regex: 'GSmart[ _][a-z0-9 ]+(?: Build|\))|Gigabyte-[a-z0-9]+|Simba SX1|Classic[_ ](?:Joy|Pro)'
5478
  device: 'smartphone'
5479
  models:
5480
- - regex: '(GSmart[ _][a-z0-9 ]+)(?: Build|\))'
5481
  model: '$1'
5482
  - regex: 'Gigabyte-([a-z0-9]+)'
5483
  model: '$1'
5484
- - regex: '(Classic[ _](?:Joy|Pro))'
5485
  model: '$1'
5486
  - regex: 'Simba SX1'
5487
  model: 'GSmart Simba SX1'
5488
 
5489
  # Gigaset
5490
  Gigaset:
5491
- regex: 'Gigaset|(?:GS5[357]-6|GS[23]70(?:_Plus)?)(?:[);/ ]|$)'
5492
  device: 'smartphone'
5493
  models:
5494
  - regex: 'Gigaset QV(1030|830)'
@@ -5497,7 +5663,7 @@ Gigaset:
5497
 
5498
  - regex: 'G(S[23]70)[_ ]Plus(?:[);/ ]|$)'
5499
  model: 'G$1 Plus'
5500
- - regex: 'GS([23]70)(?:[);/ ]|$)'
5501
  model: 'GS$1'
5502
  - regex: 'GS57-6'
5503
  model: 'ME Pro'
@@ -5668,6 +5834,8 @@ Google:
5668
  model: 'Pixel 3a'
5669
  - regex: 'Pixel 4 XL'
5670
  model: 'Pixel 4 XL'
 
 
5671
  - regex: 'pixel 4a'
5672
  model: 'Pixel 4a'
5673
  - regex: 'G011A'
@@ -5881,7 +6049,7 @@ Homtom:
5881
  regex: 'Homtom|(?:HT[0-9]{1,2})(?: ?Pro)?(?:[);/ ]|$)'
5882
  device: 'smartphone'
5883
  models:
5884
- - regex: '(?:Homtom[_ ])?HT([0-9]{1,2}(?: ?Pro)?)(?:[);/ ]|$)'
5885
  model: 'HT$1'
5886
  - regex: 'Homtom ([^;/]+) Build'
5887
  model: '$1'
@@ -5897,9 +6065,13 @@ Hosin:
5897
 
5898
  # Hoozo
5899
  Hoozo:
5900
- regex: 'HOOZO[_ ](MT232|MT116|MT Pad 116 LTE|X1001)(?:[);/ ]|$)'
5901
  device: 'tablet'
5902
- model: '$1'
 
 
 
 
5903
 
5904
  # Minix (minix.us)
5905
  Minix:
@@ -5929,7 +6101,7 @@ Minix:
5929
 
5930
  # Huawei
5931
  Huawei:
5932
- regex: '(HW-)?(?:Huawei|MediaPad T1|Ideos|Honor[ _]?|(?:(?:AGS|AGS2|ALE|ALP|AMN|ANE|ARE|ARS|ASK|ATH|ATU|AUM|BAC|BAH[23]?|BG2|BGO|B[ZK]K|BKL|BL[ALN]|BND|BTV|CA[GMNZ]|CH[CM]|CHE[12]?|CLT|CMR|COL|COR|CPN|CRO|CRR|CUN|DIG|DLI|DRA|DUA|DUB|DUK|EDI|ELE|EML|EVA|EVR|FDR|FIG|FLA|FRD|GEM|GRA|HDN|HLK|HMA|Hol|HRY|HWI|H[36]0|INE|JAT|JDN|JDN2|JKM|JMM|JSN|KII|KIW|KNT|KOB|KSA|LDN|LEO|LIO|LLD|LND|LON|LRA|LUA|LY[AO]|MAR|MHA|MRD|MYA|NCE|NEM|NEO|NXT|PAR|PCT|PIC|PLE|PLK|POT|PRA|RIO|RNE|RVL|SCC|SCL|SCM|SEA|SHT|SLA|SNE|SPN|STF|STK|TAG|TIT|TNY|TRT|VCE|VEN|VIE|VKY|VNS|VOG|VRD|VTR|WAS|YAL|G(?:527|620S|621|630|735)|Y(?:221|330|550|6[23]5))-(?:[A-Z]{0,2}[0-9]{1,4}[A-Z]{0,3}?)|H1711|U(?:8230|8500|8661|8665|8667|8800|8818|8860|9200|9508))(?:[);/ ]|$))|hi6210sft|PE-(UL00|TL[12]0|TL00M)|T1-(A21[Lw]|A23L|701u|823L)|G7-(?:L01|TL00)|HW-01K|JNY-(LX[12]|AL10)|OXF-AN[01]0|TAS-(A[LN]00|L29|TL00)|WLZ-(AL10|AN00)|NIC-LX1A|MRX-(AL09|W09)|CDY-(?:[AT]N00|AN90|NX9A)|GLK-[AT]L00|JER-[AT]N10|ELS-(?:[AT]N[10]0|NX9|N39|N04)|AKA-(AL10|L29)|MON-(W|AL)19|BMH-AN[12]0|AQM-([AT]L[01]0|LX1)|MOA-(AL00|LX9N)|NTS-AL00|ART-(?:[AT]L00[xm]|L29N?)|JEF-(?:[AT]N00|AN20)|MED-(?:[AT]L00|LX9N?)|EBG-AN[01]0|ANA-(?:[AT]N00|NX9)|BZ[AK]-W00|BZT-(W09|AL[01]0)|HDL-(AL09|W09)|HWV3[123]|HW-02L|TEL-[AT]N(?:00a?|10)|KKG-AN00|MXW-AN00|JKM-AL00[ab]|TAH-(?:N29|AN00)m|C8817D|T1-821W|d-01J|d-02[HK]|HWT31|Y320-U10|Y541-U02|VAT-L19|70[14]HW|60[58]HW|TNNH-AN00|LIO-(?:[TA]L00|[LN]29|AN00)|KOB2-[LW]09|PPA-LX2|AGS3-L09|DNN-LX9|NEY-NX9'
5933
  device: 'smartphone'
5934
  models:
5935
  - regex: 'POT-[TA]L00a(?:[);/ ]|$)'
@@ -5994,6 +6166,8 @@ Huawei:
5994
  model: 'Enjoy 8e'
5995
  - regex: 'MRD-[TA]L00(?:[);/ ]|$)'
5996
  model: 'Enjoy 9e'
 
 
5997
  - regex: 'U8665(?:[);/ ]|$)'
5998
  model: 'Fusion 2'
5999
  - regex: 'MED-LX9N?(?:[);/ ]|$)'
@@ -6052,6 +6226,8 @@ Huawei:
6052
  model: 'Honor 4A'
6053
  - regex: '(?:Honor_|HW-)?CHM-U01(?:_TD)?(?:[);/ ]|$)'
6054
  model: 'Honor 4C'
 
 
6055
  - regex: 'AQM-AL10(?:[);/ ]|$)'
6056
  model: 'Honor 4T Pro'
6057
  - regex: '(CHE2?-[UT]L00[HM]?|CHE1-CL[12]0|CHE2-L(?:1[12]|23)|Che1-L04|CHE-TL00)(?:[);/ ]|$)'
@@ -6110,13 +6286,13 @@ Huawei:
6110
  model: 'Honor 8A Pro'
6111
  - regex: 'BKK-(?:AL[10]0|L21|L22|LX2|TL00)(?:[);/ ]|$)'
6112
  model: 'Honor 8C'
6113
- - regex: 'KSA-(LX[29]|AL00)(?:[);/ ]|$)'
6114
  model: 'Honor 8S'
6115
  - regex: 'JSN-L(?:2[123]|42)|JSN-[TA]L00[a]?(?:[);/ ]|$)'
6116
  model: 'Honor 8X'
6117
- - regex: 'ARE-(?:AL[10]0|L22HN|TL00)(?:[);/ ]|$)'
6118
  model: 'Honor 8X Max'
6119
- - regex: 'STF-(?:AL[10]0|L09|TL10)(?:[);/ ]|$)'
6120
  model: 'Honor 9'
6121
  - regex: 'MOA-LX9N(?:[);/ ]|$)'
6122
  model: 'Honor 9A'
@@ -6130,7 +6306,7 @@ Huawei:
6130
  model: 'Honor 9S'
6131
  - regex: 'HLK-AL00a?(?:[);/ ]|$)'
6132
  model: 'Honor 9X'
6133
- - regex: 'HLK-AL10(?:[);/ ]|$)'
6134
  model: 'Honor 9X Pro'
6135
  - regex: 'CAM-UL00(?:[);/ ]|$)'
6136
  model: 'Honor Holly 3'
@@ -6164,7 +6340,7 @@ Huawei:
6164
  model: 'Honor Play 7'
6165
  - regex: 'JAT-[AT]L00(?:[);/ ]|$)'
6166
  model: 'Honor Play 8A'
6167
- - regex: 'MOA-AL00(?:[);/ ]|$)'
6168
  model: 'Honor Play 9A'
6169
  - regex: 'BKL-(?:AL00|AL20|AL30|L09|TL10)(?:[);/ ]|$)'
6170
  model: 'Honor V10'
@@ -6232,13 +6408,15 @@ Huawei:
6232
  model: 'Mate 30 Pro'
6233
  - regex: 'LIO-N29(?:[);/ ]|$)'
6234
  model: 'Mate 30 Pro 5G'
 
 
6235
  - regex: 'NXT-(?:AL10|L29)(?:[);/ ]|$)'
6236
  model: 'Mate 8'
6237
  - regex: 'MHA-(?:L[02]9|[AT]L00)(?:[);/ ]|$)'
6238
  model: 'Mate 9'
6239
  - regex: 'BLL-L23(?:[);/ ]|$)'
6240
  model: 'Mate 9 Lite'
6241
- - regex: 'LON-(?:AL00|L29)(?:[);/ ]|$)'
6242
  model: 'Mate 9 Pro'
6243
  - regex: 'NEO-AL00(?:[);/ ]|$)'
6244
  model: 'Mate RS'
@@ -6278,7 +6456,7 @@ Huawei:
6278
  model: 'Nova 5'
6279
  - regex: 'SEA-AL10(?:[);/ ]|$)'
6280
  model: 'Nova 5 Pro'
6281
- - regex: 'GLK-[AT]L00(?:[);/ ]|$)'
6282
  model: 'Nova 5i'
6283
  - regex: 'SPN-TL00(?:[);/ ]|$)'
6284
  model: 'Nova 5i Pro'
@@ -6344,7 +6522,7 @@ Huawei:
6344
  model: 'P40 Pro Plus'
6345
  - regex: 'GRA-(?:L09|UL00)(?:[);/ ]|$)'
6346
  model: 'P8'
6347
- - regex: '(?:ALE-L(?:02|21|23)|ALE-UL00|ALE-TL00)(?:[);/ ]|$)'
6348
  model: 'P8 Lite (2015)'
6349
  - regex: '(?:PRA-L(?:A1|X2|X1|X3)|hi6210sft)(?:[);/ ]|$)'
6350
  model: 'P8 Lite (2017)'
@@ -6390,7 +6568,7 @@ Huawei:
6390
  model: 'Y5 Pro (2017)'
6391
  - regex: 'CUN-(?:L(?:0[123]|2[123]|33)|U29)(?:[);/ ]|$)'
6392
  model: 'Y5II'
6393
- - regex: 'SCC-U21(?:[);/ ]|$)'
6394
  model: 'Y6'
6395
  - regex: 'MYA-L11(?:[);/ ]|$)'
6396
  model: 'Y6 (2016)'
@@ -6418,7 +6596,7 @@ Huawei:
6418
  model: 'Y7 (2017)'
6419
  - regex: 'LDN-L(?:01|X3)(?:[);/ ]|$)'
6420
  model: 'Y7 (2018)'
6421
- - regex: 'DUB-(?:LX[13]|TL00)(?:[);/ ]|$)'
6422
  model: 'Y7 (2019)'
6423
  - regex: '(LDN-(?:AL00|L21)|TRT-TL10)(?:[);/ ]|$)'
6424
  model: 'Y7 Prime'
@@ -6428,6 +6606,8 @@ Huawei:
6428
  model: 'Y7 Pro (2019)'
6429
  - regex: 'DUB-AL20(?:[);/ ]|$)'
6430
  model: 'Y7 Pro (2019)'
 
 
6431
  - regex: 'AQM-LX1(?:[);/ ]|$)'
6432
  model: 'Y8p'
6433
  - regex: 'FLA-(LX[123]|AL20|TL10)(?:[);/ ]|$)'
@@ -6455,6 +6635,9 @@ Huawei:
6455
  - regex: 'JDN-(?:AL00|W09)(?:[);/ ]|$)'
6456
  model: 'Honor Pad 2'
6457
  device: 'tablet'
 
 
 
6458
  - regex: 'MON-(W|AL)19(?:[);/ ]|$)'
6459
  device: 'tablet'
6460
  model: 'MatePad C5 8'
@@ -6506,12 +6689,15 @@ Huawei:
6506
  - regex: '(AGS2-AL00|JDN2-W09)HN(?:[);/ ]|$)'
6507
  device: 'tablet'
6508
  model: 'Honor Tab 5'
6509
- - regex: 'AGS2-(?:[LW]09|L03)(?:[);/ ]|$)'
6510
  device: 'tablet'
6511
  model: 'MediaPad T5 10'
6512
  - regex: 'KOB2-[LW]09(?:[);/ ]|$)'
6513
  device: 'tablet'
6514
  model: 'MediaPad T 8.0"'
 
 
 
6515
  - regex: 'AGS-(?:L0[39]|W09)(?:[);/ ]|$)'
6516
  device: 'tablet'
6517
  model: 'MediaPad T3 10'
@@ -6551,6 +6737,9 @@ Huawei:
6551
  - regex: '(?:d-01J|d-02[HK])(?:[);/ ]|$)'
6552
  device: 'tablet'
6553
  model: 'D Tab Compact'
 
 
 
6554
 
6555
 
6556
  # smart watch regex
@@ -6569,18 +6758,20 @@ Huawei:
6569
  model: 'Ascend Mate $1'
6570
  - regex: 'Huawei[ _\-]?([^/;]*) Build'
6571
  model: '$1'
6572
- - regex: '(?:HW-)?Huawei(?:/1\.0/0?(?:Huawei))?[_\- /]?([a-z0-9\-_]+)'
6573
  model: '$1'
6574
  - regex: 'Huawei; ([a-z0-9 \-]+)'
6575
  model: '$1'
6576
 
6577
  # Hyundai
6578
  Hyundai:
6579
- regex: 'Hyundai|Ultra (?:Active|Air|Charm|Dream|Energy|Latitude|Link|Live|Shadow|Shine|Storm|Style|Sync|Trend|Vision|Wave)|G(24027|2552[34])K|W25042L|HP554O'
6580
  device: 'smartphone'
6581
  models:
6582
  - regex: 'Ultra (Active|Air|Charm|Dream|Energy Lite|Energy Plus|Energy|Latitude|Link|Live II|Live|Shadow|Shine|Storm|Style|Sync|Trend|Vision|Wave)'
6583
  model: 'Ultra $1'
 
 
6584
  - regex: 'G25523K'
6585
  model: 'Eternity G23'
6586
  - regex: 'G25524K'
@@ -6591,6 +6782,22 @@ Hyundai:
6591
  model: 'Eternity W42'
6592
  - regex: 'HP554O'
6593
  model: 'HP554O'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6594
  - regex: 'Hyundai ([^;/]+) Build'
6595
  model: '$1'
6596
  device: 'tablet'
@@ -6632,13 +6839,19 @@ Hyundai:
6632
 
6633
  # iBall
6634
  iBall:
6635
- regex: 'iBall[ _]([^;/)]+)[ _]Build|(?:Snap_4G2|6351-Q400i)(?:[);/ ]|$)'
6636
  device: 'tablet'
6637
  models:
6638
- - regex: '(Snap_4G2)(?:[);/ ]|$)'
6639
  model: '$1'
6640
  - regex: '6351-Q400i(?:[);/ ]|$)'
6641
  model: 'Slide'
 
 
 
 
 
 
6642
  - regex: 'iBall[ _]([^;/)]+)[ _]Build'
6643
  model: '$1'
6644
 
@@ -6667,7 +6880,7 @@ iRulu:
6667
 
6668
  # Irbis
6669
  Irbis:
6670
- regex: 'IRBIS|TZ(1(?:0[04]|42|5[01]|84|65|7[01345-89]|8[356]|9[12578])|49|7(?:1[12467]|2[01567]|37|4[257]|5[23457]|6[12]|72|7[17]|8[1]|9[47])|8(?:[34]1|5[3-8]|6[45]|7[2478]|8[1-5]|9[0127])|96[0-9])|TZ85|TZ13|TZ(?:one|art|HIT|81L)|(SP(?:0[56]|2[01]|4[1-36]|40[12]|45[345]|49[34]|50|51[0147]|531|54[12]|55[0124]|571))(?:[);/ ]|$)'
6671
  device: 'tablet'
6672
  models:
6673
  - regex: '(TZ(?:[0-9]+)|TZ(?:one|art|HIT|81L))(?:[);/ ]|$)'
@@ -6688,7 +6901,7 @@ iBerry:
6688
 
6689
  # iHunt
6690
  iHunt:
6691
- regex: 'iHunt|One_ Love_|TITAN_P11000_PRO|Like_(3|4U|3_Pro)|X300 Elite|S10_Tank_2019|S60_Discovery_2019|AlienXLite2020'
6692
  device: 'smartphone'
6693
  models:
6694
  - regex: 'iHunt_Like'
@@ -6711,6 +6924,14 @@ iHunt:
6711
  model: 'S60 Discovery (2019)'
6712
  - regex: 'AlienXLite2020'
6713
  model: 'Alien X Lite (2020)'
 
 
 
 
 
 
 
 
6714
 
6715
  # IconBIT
6716
  IconBIT:
@@ -6890,15 +7111,17 @@ M4tel:
6890
  - regex: 'M4_B([23])'
6891
  model: 'B$1'
6892
 
6893
- # IMO Mobile
6894
  IMO Mobile:
6895
  regex: '(?:IMO)(?:[);/ ]|$)'
6896
  device: 'smartphone'
6897
  models:
6898
- - regex: 'IMO[ _]Q2 Plus(?:[);/ ]|$)'
6899
- model: 'Q2 Plus'
6900
  - regex: 'IMO[ _]Q2(?:[);/ ]|$)'
6901
  model: 'Q2'
 
 
6902
  - regex: 'IMO[ _]FEEL A2(?:[);/ ]|$)'
6903
  model: 'Feel A2'
6904
  - regex: 'IMO[ _]S50(?:[);/ ]|$)'
@@ -6953,7 +7176,7 @@ iNew:
6953
 
6954
  # iPro
6955
  iPro:
6956
- regex: 'Kylin[ _]5.[05]|Jade7s'
6957
  device: 'smartphone'
6958
  models:
6959
  - regex: 'Kylin_5.0S'
@@ -6962,7 +7185,14 @@ iPro:
6962
  model: 'Kylin $1'
6963
  - regex: 'Jade7s'
6964
  model: 'Jade 7s'
6965
-
 
 
 
 
 
 
 
6966
 
6967
  # Infinix
6968
  Infinix:
@@ -7267,14 +7497,11 @@ iOcean:
7267
  - regex: 'iOCEAN[ _\-]?([^);/ ]+)'
7268
  model: '$1'
7269
 
7270
- # iView
7271
  iView:
7272
- regex: '733TPC'
7273
- device: 'smartphone'
7274
- models:
7275
- - regex: '733TPC'
7276
- device: 'tablet'
7277
- model: '733TPC'
7278
 
7279
  # Impression
7280
  Impression:
@@ -7377,13 +7604,21 @@ Just5:
7377
  - regex: 'BLASTER'
7378
  model: 'Blaster'
7379
 
7380
- # Kalley
7381
  Kalley:
7382
- regex: 'ELEMENT Q'
7383
  device: 'smartphone'
7384
  models:
7385
  - regex: 'ELEMENT Q'
7386
  model: 'Element Q'
 
 
 
 
 
 
 
 
7387
 
7388
  # Kaan
7389
  Kaan:
@@ -7616,9 +7851,15 @@ K-Touch:
7616
  - regex: 'K-?Touch[ _]([a-z0-9]+)'
7617
  model: '$1'
7618
 
 
 
 
 
 
 
7619
  # kyocera (kyocera.co.jp, kyocera.com)
7620
  Kyocera:
7621
- regex: 'Kyocera|KWC-|QC-|(?:NP501KC|302KC|503KC|602KC|705KC|C51[27]0|C5155|C5215|C67[35]0|C6522N?|C6530N|C6740N?|C6743|E6[89]10|KYL2[13]|KYV3[13-9]|KYT3[123]|KYF3[123579]|KYY2[1-4]|S2151|KC-S701|S4-KC|KYV40U?|KYV4[1-8]|KYV4[47][-_]u|KC-S301AE|X3-KC|S6-KC|E6560[CT]|E6782[L]?|E6790(?:TM)?|704KC|A001KC)(?:[);/ ]|$)'
7622
  device: 'smartphone'
7623
  models:
7624
  # explicit smartphone models
@@ -7634,6 +7875,8 @@ Kyocera:
7634
  model: 'Digno G'
7635
  - regex: '503KC(?:[);/ ]|$)'
7636
  model: 'Digno E'
 
 
7637
  - regex: '704KC(?:[);/ ]|$)'
7638
  model: 'Digno J'
7639
  - regex: '302KC(?:[);/ ]|$)'
@@ -7642,8 +7885,12 @@ Kyocera:
7642
  model: 'Digno'
7643
  - regex: 'KYV36(?:[);/ ]|$)'
7644
  model: 'Digno Rafre'
 
 
7645
  - regex: 'KYV39(?:[);/ ]|$)'
7646
  model: 'Miraie F'
 
 
7647
  - regex: 'C5170(?:[);/ ]|$)'
7648
  model: 'Hydro'
7649
  - regex: 'C5215(?:[);/ ]|$)'
@@ -7700,7 +7947,7 @@ Kyocera:
7700
  model: 'Qua Phone'
7701
  - regex: 'KYV42(?:[);/ ]|$)'
7702
  model: 'Qua Phone QX'
7703
- - regex: 'KYV44(?:_u)?(?:[);/ ]|$)'
7704
  model: 'Qua Phone QZ'
7705
  - regex: 'KYT33(?:[);/ ]|$)'
7706
  model: 'Qua Tab QZ10'
@@ -7749,14 +7996,16 @@ Kyocera:
7749
  model: 'KZ $1'
7750
  - regex: 'Kyocera(?:[\-/])?([a-z0-9]+)'
7751
  model: '$1'
7752
- - regex: '(?:KWC|QC)-([a-z0-9]+)'
7753
- model: '$1'
7754
 
7755
  # Krüger&Matz (Kruger&Matz)
7756
  Krüger&Matz:
7757
- regex: 'Kruger[ _&]Matz|KrugerMatz[ _]|FLOW5PLUS|FLOW7|FLOW6S|DRIVE[_ ]6S?|MOVE_|LIVE_6plus|LIVE 5 PLUS|LIVE4_KM043[89]|KM(?:106[67]|1065G|0701_1|0702|0805_1)'
7758
  device: 'smartphone'
7759
  models:
 
 
7760
  - regex: 'MOVE_6_mini'
7761
  model: 'MOVE 6 Mini'
7762
  - regex: 'MOVE[_ ]([78]|6S)'
@@ -7767,6 +8016,8 @@ Krüger&Matz:
7767
  model: 'DRIVE $1'
7768
  - regex: 'FLOW5PLUS(?:[);/ ]|$)'
7769
  model: 'FLOW 5 Plus'
 
 
7770
  - regex: 'FLOW[ _]?([476][S]?)(?:[);/ ]|$)'
7771
  model: 'FLOW $1'
7772
  - regex: 'LIVE4_(KM043[89])(?:[);/ ]|$)'
@@ -7779,6 +8030,8 @@ Krüger&Matz:
7779
  model: 'LIVE 5 Plus'
7780
  - regex: 'LIVE_6plus(?:[);/ ]|$)'
7781
  model: 'LIVE 6 Plus' # KM0454
 
 
7782
 
7783
  - regex: 'KM(106[67])(?:[);/ ]|$)'
7784
  device: 'tablet'
@@ -7816,7 +8069,7 @@ AIS:
7816
 
7817
  # Lava (Lavamobiles.com)
7818
  Lava:
7819
- regex: 'Lava[ _]|LAVAA1|(?:DISCOVER136|KKT QUADRA)|iris[ _]?([^/;]+)(?:\)| Build)|A(?:67|76) Build|X1 Selfie Build|X41 Plus Build|(?:Flair Z1|PixelV1|Z61_2GB|A97 IPS)(?:[);/ ]|$)'
7820
  device: 'smartphone'
7821
  models:
7822
  - regex: 'Flair Z1(?:[);/ ]|$)'
@@ -7827,8 +8080,8 @@ Lava:
7827
  model: 'A67'
7828
  - regex: 'A76 Build'
7829
  model: 'A76'
7830
- - regex: 'PixelV1(?:[);/ ]|$)'
7831
- model: 'Pixel V1'
7832
  - regex: 'X1 Selfie Build'
7833
  model: 'Iris X1 Selfie'
7834
  - regex: 'X41 Plus Build'
@@ -7839,6 +8092,16 @@ Lava:
7839
  model: 'R1'
7840
  - regex: 'Z61_2GB(?:[);/ ]|$)'
7841
  model: 'Z61'
 
 
 
 
 
 
 
 
 
 
7842
 
7843
  - regex: 'DISCOVER136'
7844
  device: 'feature phone'
@@ -7877,15 +8140,15 @@ Land Rover:
7877
 
7878
  # lanix
7879
  Lanix:
7880
- regex: 'LANIX-([a-z0-9]+)|Ilium[ _]|X120C|Alpha 950'
7881
  device: 'smartphone'
7882
  models:
7883
- - regex: 'ILIUM[ _]PAD[ _]([^;/]+) Build'
7884
  model: 'Ilium Pad $1'
7885
  device: 'tablet'
7886
  - regex: 'X120C'
7887
  model: 'Ilium X120C'
7888
- - regex: 'Ilium[ _](Alpha 3|L(?:200|6[12]0|9[125]0|1[0124]00|1050|1120)|LT5[012]0|M[13579]|S(?:106|520|6[27]0)|X(?:1[12]0|2[0126]0|5[12]0|500B|710))'
7889
  model: 'Ilium $1'
7890
  - regex: 'ILIUM[ _]([^;/]+) Build'
7891
  model: 'Ilium $1'
@@ -7954,7 +8217,7 @@ LCT:
7954
 
7955
  # Leagoo
7956
  Leagoo:
7957
- regex: 'LEAGOO[ _-]?|(?:M5 EDGE|KIICAA (POWER|MIX)|Leapad[ _]7s|Elite 1|Venture 1|Z10-E)(?:[);/ ]|$)'
7958
  device: 'smartphone'
7959
  models:
7960
  - regex: 'LEAGOO[- _]M8[_-]?Pro(?:[);/ ]|$)'
@@ -7969,8 +8232,8 @@ Leagoo:
7969
  model: 'KICCAA Power'
7970
  - regex: 'KIICAA MIX'
7971
  model: 'KICCAA Mix'
7972
- - regex: 'Elite 1(?:[);/ ]|$)'
7973
- model: 'Elite 1'
7974
  - regex: 'Venture 1(?:[);/ ]|$)'
7975
  model: 'Venture 1'
7976
  - regex: '(Z10-E)(?:[);/ ]|$)'
@@ -8054,9 +8317,9 @@ Lenco:
8054
  device: 'tablet'
8055
  model: '$1'
8056
 
8057
- # lenovo
8058
  Lenovo:
8059
- regex: '(?:LNV-)?Lenovo|IdeaTab|IdeaPad|Thinkpad|Yoga Tablet|Tab2A[0-9]-[0-9]{2}[a-z]?|ZUK[ -_]|(?:TB2-X30L|TB3-710I|YT3-X50[ML]|K50a40|TB-(?:X103F|8504F|X304F|X704V|X704A)|A5500-H|A2107A-H|S6000|Z2 Plus|Vibe P1|VIBE C|VIBE [ZX]2|Vibe K5(?: Plus)?|P2A42|L18011|[5-8]01LV|Z2131|K350t|K31-t3|TAB 2 A8-50LC)(?:[);/ ]|$)'
8060
  device: 'smartphone'
8061
  models:
8062
  - regex: 'Lenovo ?G780'
@@ -8065,7 +8328,7 @@ Lenovo:
8065
  - regex: 'Lenovo ?A3500-FL'
8066
  model: 'IdeaTab A7-40'
8067
  device: 'tablet'
8068
- - regex: 'Lenovo ?A3500-(H|HV|F)'
8069
  model: 'IdeaTab A7-50'
8070
  device: 'tablet'
8071
  - regex: '(?:Lenovo[ _])?A5500-[HF]'
@@ -8077,6 +8340,9 @@ Lenovo:
8077
  - regex: 'A2107A-H'
8078
  model: 'A2107'
8079
  device: 'tablet'
 
 
 
8080
  - regex: 'TB2-X30[FL]'
8081
  model: 'Tab 2 A10-30'
8082
  device: 'tablet'
@@ -8089,19 +8355,40 @@ Lenovo:
8089
  - regex: 'TB3-710[IF]'
8090
  model: 'TAB3 7 Essential'
8091
  device: 'tablet'
 
 
 
 
 
 
 
 
 
8092
  - regex: 'TAB 2 A8-50LC'
8093
  model: 'TAB2 A8-50LC'
8094
  device: 'tablet'
8095
  - regex: '501LV(?:[);/ ]|$)'
8096
  model: 'TAB2 8.0"'
8097
  device: 'tablet'
 
 
 
8098
  - regex: '(?:TB3-850[FM]|601LV)(?:[);/ ]|$)'
8099
  model: 'TAB3 8'
8100
  device: 'tablet'
8101
- - regex: 'Lenovo TB-X304[FL]'
 
 
 
8102
  model: 'TAB4 10'
8103
  device: 'tablet'
8104
- - regex: '(?:TB-X704[VL]|701LV)(?:[);/ ]|$)'
 
 
 
 
 
 
8105
  model: 'TAB4 10 Plus'
8106
  device: 'tablet'
8107
  - regex: '801LV(?:[);/ ]|$)'
@@ -8116,6 +8403,21 @@ Lenovo:
8116
  - regex: 'TB-X605F(?:[);/ ]|$)'
8117
  model: 'Tab M10'
8118
  device: 'tablet'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8119
  - regex: 'Lenovo ?B8000(-[FH])?'
8120
  model: 'Yoga Tablet 10'
8121
  device: 'tablet'
@@ -8140,6 +8442,9 @@ Lenovo:
8140
  - regex: 'YT3-850M'
8141
  model: 'Yoga Tab 3 10'
8142
  device: 'tablet'
 
 
 
8143
 
8144
  - regex: 'S6000(?:[);/ ]|$)'
8145
  model: 'IdeaTab S6000'
@@ -8153,25 +8458,22 @@ Lenovo:
8153
  - regex: 'ThinkPad ?Tablet([^;/]*) Build'
8154
  model: 'ThinkPad Tablet$1'
8155
  device: 'tablet'
8156
- - regex: 'IdeaPad ?([^;/]*) Build'
8157
- model: 'IdeaPad $1'
8158
- device: 'tablet'
8159
- - regex: 'Lenovo TAB ?([^/;]*) Build'
8160
- model: 'TAB $1'
8161
- device: 'tablet'
8162
  - regex: 'Lenovo ?A3300-(?:GV|H)'
8163
  model: 'TAB 2 A7-30'
8164
  device: 'tablet'
 
 
 
8165
  - regex: 'TB-8504F'
8166
  model: 'TAB 4 8'
8167
  device: 'tablet'
8168
  - regex: 'TB-X304F'
8169
- model: 'TAB 4 10'
8170
  device: 'tablet'
8171
- - regex: 'Lenovo TB-X505F'
8172
  model: 'M10'
8173
  device: 'tablet'
8174
- - regex: 'Lenovo TB-X104[FXL]'
8175
  model: 'E10'
8176
  device: 'tablet'
8177
  - regex: 'Tab2A([0-9]-[0-9]{2}[a-z]?)'
@@ -8183,8 +8485,8 @@ Lenovo:
8183
  - regex: 'Yoga Tablet([^;/]+) Build'
8184
  model: 'Yoga Tablet$1'
8185
  device: 'tablet'
8186
- - regex: 'Lenovo TB\-X704F Build/NMF26F'
8187
- model: 'Tab 4 10 Plus'
8188
  device: 'tablet'
8189
  - regex: 'Lenovo (TB[0-9]?\-[a-z0-9\-]+) Build'
8190
  model: '$1'
@@ -8209,6 +8511,8 @@ Lenovo:
8209
  model: 'K4 Note'
8210
  - regex: 'K350t(?:[);/ ]|$)'
8211
  model: 'K5'
 
 
8212
  - regex: 'A7020a4[08](?:[);/ ]|$)'
8213
  model: 'K5 Note'
8214
  - regex: 'K31-t3(?:[);/ ]|$)'
@@ -8251,11 +8555,25 @@ Lenovo:
8251
  model: 'A3'
8252
  - regex: 'PB2-670M(?:[);/ ]|$)'
8253
  model: 'Phab 2'
 
 
 
 
 
 
 
 
 
 
 
 
 
8254
  - regex: 'Lenovo ([^/;]*) Build'
8255
  model: '$1'
8256
  - regex: '(?:LNV-|Lenovo-)?Lenovo[ \-_]?([a-z0-9_+\-]+)'
8257
  model: '$1'
8258
 
 
8259
  # Lexand
8260
  Lexand:
8261
  regex: '(?:SC7 PRO HD|S5A[1-4]|S4A[1-5]|S6A1|A811|A802)(?:[);/ ]|$)|Lexand ([^;/]+) Build'
@@ -8347,7 +8665,7 @@ Lexibook:
8347
 
8348
  # LG
8349
  LG:
8350
- regex: 'LG|portalmmm/2\.0 (?:KE|KG|KP|L3)|(?:VX[0-9]+|L-0[12]D|L-07C|P713|(LM-[A-Z][0-9]{3}[A-Z]{0,3}(?:\(FGN?\)|\(G\)|\.FN|\.F(?:GN?)?)?)|LM-(X625N1|G820QM[0127]))(?:[);/ ]|$)|NetCast|RS98[78]|RS500|VS(?:50[01]|835|876|880|98[0578]|99[056]|(410|415|425|500|880)PP)|VS820|VS870 4G|Nexsus 5|LML(41[34]D|211B|713D|212V)L|VK810 4G|VK815|X5-LG|L-05D|L-03K|L-01[LJK]|L-[45]1A|901LG|A001LG|802LG|402LG|LGT32|L-02K|L-01F|LM-V40'
8351
  device: 'smartphone'
8352
  models:
8353
  - regex: 'LG-D325'
@@ -8366,7 +8684,7 @@ LG:
8366
  model: 'G2'
8367
  - regex: 'LG-D6(?:18|20)'
8368
  model: 'G2 Mini'
8369
- - regex: 'LG-D85[0125]|VS985'
8370
  model: 'G3'
8371
  - regex: 'LG-D72[2458]'
8372
  model: 'G3 Beat'
@@ -8380,7 +8698,7 @@ LG:
8380
  model: 'G4s'
8381
  - regex: 'LG-H735'
8382
  model: 'G4 Beat'
8383
- - regex: 'LG-H8(?:20|30|5[08]|60)|VS987|RS988'
8384
  model: 'G5'
8385
  - regex: 'LG-H84[05]'
8386
  model: 'G5 SE'
@@ -8396,7 +8714,7 @@ LG:
8396
  model: 'G8S ThinQ'
8397
  - regex: '901LG(?:[);/ ]|$)'
8398
  model: 'G8X ThinQ'
8399
- - regex: 'VS501'
8400
  model: 'K20'
8401
  - regex: '(?:LG-)?H502'
8402
  model: 'Magna'
@@ -8424,6 +8742,8 @@ LG:
8424
  model: 'V20'
8425
  - regex: 'LM-Q710(?:\(FGN\)|[\.]?FGN)'
8426
  model: 'Q Stylus Plus'
 
 
8427
  - regex: 'LM-Q[67]10\.FG(?:[);/ ]|$)'
8428
  model: 'Q7'
8429
  - regex: 'LM-(Q725[KL]|Q610.FGN)(?:[);/ ]|$)'
@@ -8466,7 +8786,7 @@ LG:
8466
  model: 'X4'
8467
  - regex: 'LM-X(415[LS]|410L)'
8468
  model: 'X4+'
8469
- - regex: 'LM-X410\.FN'
8470
  model: 'K11'
8471
  - regex: 'LM-X(?:320|410[UP]M)'
8472
  model: 'K30'
@@ -8597,6 +8917,9 @@ LG:
8597
  - regex: 'VS870 4G'
8598
  model: 'Lucid 2'
8599
 
 
 
 
8600
  - regex: 'LG-V490'
8601
  model: 'G Pad 8.0'
8602
  device: 'tablet'
@@ -8668,11 +8991,11 @@ Lingwin:
8668
 
8669
  # Logicom
8670
  Logicom:
8671
- regex: 'LOGICOM[_ ]|(TAB950|TAB1062|E731|E812|E912|E1031|POWER BOT|La Tab 72|(?:B|C|M|ID|VR)[ _]?BOT[ _]?(?:TAB[ _])?([0-9]+\+?)(?:PLUS)?|KT712A_4\.4|L-?IXIR[0-9]*|L-ITE|L-EGANTONE-R|L-?EMENT|L-EMENT551|Le[ _]?(?:Hop|Lift|Hola|Moov[2]?|Must 2|Fit FR|Spark|Prime|Smooth(?: FR)?))[_);/ ]'
8672
  device: 'tablet'
8673
  models:
8674
- - regex: 'La Tab 72'
8675
- model: 'La Tab 72'
8676
  - regex: 'LOGICOM_LA_TAB_LINK_71'
8677
  model: 'La Tab Link 71'
8678
  - regex: 'KT712A_4.4'
@@ -8683,7 +9006,7 @@ Logicom:
8683
  model: 'L-ixir Tab $1'
8684
  - regex: 'L-ITE[ _]([^;/]+) Build'
8685
  model: 'L-ite Tab $1'
8686
- - regex: 'L-EMENT ?(400|551)(?:[);/ ]|$)'
8687
  model: 'L-ement $1'
8688
  device: 'smartphone'
8689
  - regex: 'L-?EMENT[ _](?:TAB)?([^;/]+) Build'
@@ -8753,9 +9076,9 @@ Konka:
8753
  device: 'feature phone'
8754
  model: '$1'
8755
 
8756
- # Konrow
8757
  Konrow:
8758
- regex: '(?:BIGCOOL|COOLFIVE|COOL-K|Just5|Link5)(?:[);/ ]|$)'
8759
  device: 'smartphone'
8760
  models:
8761
  - regex: 'BIGCOOL(?:[);/ ]|$)'
@@ -8768,10 +9091,14 @@ Konrow:
8768
  model: 'Just 5'
8769
  - regex: 'Link5(?:[);/ ]|$)'
8770
  model: 'Link 5'
 
 
 
 
8771
 
8772
  # Karbonn (karbonnmobiles.com)
8773
  Karbonn:
8774
- regex: '(?:Browser-)?Karbonn|K9 Kavach 4G|K9 Music 4G|K9 Smart|K9 VIRAAT 4G|Aura Sleek Plus|Aura Note Play|Titanium[ _](?:3D-Plex|Octane Plus|Vista 4G|Jumbo|S360|S1[059]|S35|S20[13]|S22|S1|S200 HD)|K-lite F3'
8775
  device: 'smartphone'
8776
  models:
8777
  - regex: 'K9 Kavach 4G'
@@ -8788,6 +9115,8 @@ Karbonn:
8788
  model: 'K9 Smart Yuva'
8789
  - regex: 'K9 Smart'
8790
  model: 'K9 Smart'
 
 
8791
  - regex: 'Aura Sleek Plus'
8792
  model: 'Aura Sleek Plus'
8793
  - regex: 'Aura Note Play'
@@ -8804,6 +9133,8 @@ Karbonn:
8804
  model: 'Titanium Jumbo 2'
8805
  - regex: 'Titanium Jumbo'
8806
  model: 'Titanium Jumbo'
 
 
8807
  - regex: 'Titanium Octane Plus'
8808
  model: 'Titanium Octane Plus'
8809
  - regex: 'Titanium[ _]3D-Plex'
@@ -8923,25 +9254,29 @@ Masstel:
8923
 
8924
  # Maxwest
8925
  Maxwest:
8926
- regex: '(?:Astro_5N_LTE|Virtue Z5|Astro X55s|Nitro_4)(?:[);/ ]|$)'
8927
  device: 'smartphone'
8928
  models:
8929
  - regex: 'Astro_5N_LTE'
8930
  model: 'Astro 5N LTE'
 
 
8931
  - regex: 'Virtue Z5'
8932
  model: 'Virtue Z5'
8933
  - regex: 'Astro X55s'
8934
  model: 'Astro X55s'
8935
  - regex: 'Nitro_4'
8936
  model: 'Nitro 4'
 
 
8937
 
8938
  # Maze
8939
  Maze:
8940
- regex: '(?:SSB-500|Alpha[_ ]X|Maze Alpha|SSB504R)(?:[);/ ]|$)'
8941
  device: 'smartphone'
8942
  models:
8943
- - regex: 'SSB-500(?:[);/ ]|$)'
8944
- model: 'SSB-500'
8945
  - regex: 'SSB504R(?:[);/ ]|$)'
8946
  model: 'Speed'
8947
  - regex: 'Alpha[_ ]X(?:[);/ ]|$)'
@@ -8951,7 +9286,7 @@ Maze:
8951
 
8952
  # Mediacom
8953
  Mediacom:
8954
- regex: '(?:SmartPad7503G|M-SP10MXA|SmartPad970s2(?:3G)?|M[_-][MPS]P[0-9a-z]+|M-IPRO[0-9a-z]+)(?:[);/ ]|$)'
8955
  device: 'tablet'
8956
  models:
8957
  - regex: 'SmartPad7503G(?:[);/ ]|$)'
@@ -8966,6 +9301,10 @@ Mediacom:
8966
  model: 'SmartPad 9.7 Mobile'
8967
  - regex: 'M-SP10MXA(?:[);/ ]|$)'
8968
  model: 'SmartPad MX 10'
 
 
 
 
8969
  - regex: 'M-MP(?:710|720|725|726|740)GOx?(?:[);/ ]|$)'
8970
  model: 'SmartPad 7.0 Go'
8971
  - regex: 'M-MP876S2(?:[);/ ]|$)'
@@ -8978,6 +9317,8 @@ Mediacom:
8978
  model: 'SmartPad 875 S2 3G'
8979
  - regex: 'M-SP1AGO3G'
8980
  model: 'SmartPad 10 Go 3G'
 
 
8981
  - regex: 'M-MP10[45][01]S2(?:[);/ ]|$)'
8982
  model: 'SmartPad 10.1 S2'
8983
  - regex: 'M-MP1S2[AB]3G(?:[);/ ]|$)'
@@ -9018,6 +9359,9 @@ Mediacom:
9018
  - regex: 'M-PPAG550(?:[);/ ]|$)'
9019
  model: 'PhonePad Duo G550'
9020
  device: 'phablet'
 
 
 
9021
  - regex: 'M-PP2G530(?:[);/ ]|$)'
9022
  model: 'PhonePad Duo G530'
9023
  device: 'phablet'
@@ -9049,9 +9393,12 @@ Mediacom:
9049
  - regex: 'M-PPxG(400|501|[457][PM]?)(?:[);/ ]|$)'
9050
  model: 'PhonePad Duo G$1'
9051
  device: 'smartphone'
9052
- - regex: 'M-PPxS(470|501|5P?)(?:[);/ ]|$)'
9053
  model: 'PhonePad Duo S$1'
9054
  device: 'smartphone'
 
 
 
9055
 
9056
  - regex: 'M-MP([0-9a-z]+)'
9057
  model: 'SmartPad $1'
@@ -9089,7 +9436,7 @@ MEEG:
9089
 
9090
  # Meizu
9091
  Meizu:
9092
- regex: 'Meizu|MZ-[a-z]|(M04[05]|MZ-16th(?: Plus)?|MZ-16[st]|M7[12]1C|M35[1356]|M612C|M578CA|M181[36]|M1822|M681C|M6T|MX[ -]?[2345](?: Pro)?|(?:MZ-)?m[1-6] note|M621C|M1852|M57[18]C|M3[ESX]|M031|m1 metal|M1 E|M2|M2 E|M5s Build|PRO 6|PRO 7-H|MZ-15 (?:Lite|Plus)|MZ-16 X)(?:[);/ ]|$)'
9093
  device: 'smartphone'
9094
  models:
9095
  - regex: '(?:MZ-)?M571C'
@@ -9153,13 +9500,13 @@ Meizu:
9153
  model: 'Note 8'
9154
  - regex: 'MZ-16T(?:[);/ ]|$)'
9155
  model: '16T'
9156
- - regex: 'MZ-16th Plus(?:[);/ ]|$)'
9157
  model: '16th Plus'
9158
  - regex: 'MZ-15 Plus(?:[);/ ]|$)'
9159
  model: '15 Plus'
9160
- - regex: 'MZ-15 Lite(?:[);/ ]|$)'
9161
  model: '15 Lite'
9162
- - regex: 'MZ-16th(?:[);/ ]|$)'
9163
  model: '16th'
9164
  - regex: 'MZ-16 X(?:[);/ ]|$)'
9165
  model: '16X'
@@ -9314,13 +9661,25 @@ Mobiola:
9314
 
9315
  # Mobicel
9316
  Mobicel:
9317
- regex: 'Mobicel_(R1)|(?:Matrix|TRENDY PLUS)(?:[);/ ]|$)'
9318
  device: 'smartphone'
9319
  models:
9320
  - regex: 'Matrix'
9321
  model: 'Matrix'
 
 
 
 
 
 
 
 
9322
  - regex: 'TRENDY PLUS'
9323
  model: 'Trendy Plus'
 
 
 
 
9324
  - regex: 'Mobicel_(R1)'
9325
  model: '$1'
9326
 
@@ -9415,7 +9774,7 @@ Mobistel:
9415
 
9416
  # Mecool
9417
  Mecool:
9418
- regex: '(?:KM9PRO|BB2 PRO|KII PRO|KM9_TV_BOX|M8SPROW|M8S (?:PLUS|PRO) (?:DVB|[LW]|PLUS)|M8S (?:MAX|PRO))(?:[);/ ]|$)'
9419
  device: 'tv'
9420
  models:
9421
  - regex: 'KM9PRO(?:[);/ ]|$)'
@@ -9424,8 +9783,10 @@ Mecool:
9424
  model: 'KM9 TV Box'
9425
  - regex: 'BB2 PRO(?:[);/ ]|$)'
9426
  model: 'BB2 Pro'
9427
- - regex: 'KII PRO(?:[);/ ]|$)'
9428
- model: 'KII Pro'
 
 
9429
  - regex: 'M8SPROW(?:[);/ ]|$)'
9430
  model: 'M8S Pro W'
9431
  - regex: 'M8S PLUS DVB(?:[);/ ]|$)'
@@ -9548,8 +9909,10 @@ Motorola:
9548
  model: 'Moto E'
9549
  - regex: '(?:MOT-|Motorola-)?XT1706'
9550
  model: 'Moto E3 Power'
9551
- - regex: '(?:MOT-|Motorola-)?XT1924-9'
9552
  model: 'Moto E5 Plus'
 
 
9553
  - regex: '(?:MOT-|Motorola-)?XT1030'
9554
  model: 'Droid Mini'
9555
  - regex: '(?:MOT-|Motorola-)?XT1096'
@@ -9622,8 +9985,10 @@ Motorola:
9622
  model: 'Moto $1$2$3'
9623
  - regex: 'Moto ?([CGEXZ])( Plus| Play)?'
9624
  model: 'Moto $1$2'
 
 
9625
 
9626
- - regex: 'Motorola[ _\-]([a-z0-9]+)'
9627
  model: '$1'
9628
  - regex: 'MOTORAZR[ _\-]([a-z0-9]+)'
9629
  model: 'RAZR $1'
@@ -9679,7 +10044,7 @@ MyTab:
9679
 
9680
  # myphone (myphone.com.ph)
9681
  MyPhone:
9682
- regex: '(?:MyPhone|MyPad|MyTab)[ _][^;/)]+( Build|\))|Cube_LTE|myTab10II|HAMMER[ _](Blade2_PRO|IRON_3|Explorer|ENERGY|Titan 2|AXE[_ ](?:M[_ ]LTE|Pro)|Iron 2|Active[2]?(_LTE)?)|C-Smart_pix|myPhone_Fun_8|myA17|myX12|Pocket_2|myT6 DTV|myXI1 (?:Plus|Pro)|myXI3'
9683
  device: 'smartphone'
9684
  models:
9685
  # explicit table models
@@ -9702,6 +10067,8 @@ MyPhone:
9702
  # explicit smartphones models
9703
  - regex: 'Cube_LTE'
9704
  model: 'Cube LTE'
 
 
9705
  - regex: 'HAMMER[ _]ENERGY'
9706
  model: 'Hammer Energy'
9707
  - regex: 'HAMMER_AXE[_ ]M[_ ]LTE'
@@ -9785,7 +10152,7 @@ M.T.T.:
9785
 
9786
  # Navon
9787
  Navon:
9788
- regex: 'Navon[_ ]|(?:Superme_Max|Supreme[_ ](?:Fine|Chief|Pure|Pro)(?:[_ ](?:Mini|Plus))?)(?:[);/ ]|$)'
9789
  device: 'smartphone'
9790
  models:
9791
  - regex: 'Superme_Max(?:[);/ ]|$)'
@@ -9809,6 +10176,10 @@ Navon:
9809
  - regex: 'Navon[_ ]Platinum 10 3G(?:[);/ ]|$)'
9810
  model: 'Platinum 10.1" 3G'
9811
 
 
 
 
 
9812
  # NOA
9813
  NOA:
9814
  regex: 'NOA[ _]|Hummer(?:_2019_R|LE)|NextSE'
@@ -9852,7 +10223,7 @@ Nobby:
9852
 
9853
  # nec
9854
  NEC:
9855
- regex: 'NEC[ _\-]|KGT/2\.0|PC-TE508HAW|portalmmm/1\.0 (?:DB|N)|(?:portalmmm|o2imode)/2.0[ ,]N|(?:N-06C|N-02E)(?:[);/ ]|$)'
9856
  device: 'smartphone'
9857
  models:
9858
  - regex: 'N-06C(?:[);/ ]|$)'
@@ -9865,9 +10236,27 @@ NEC:
9865
  model: '$1'
9866
  - regex: '(?:portalmmm|o2imode)/2\.0[ ,](N[a-z0-9]+)'
9867
  model: '$1'
9868
- - regex: 'PC-TE508HAW(?:[);/ ]|$)'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9869
  device: 'tablet'
9870
  model: 'LAVIE Tab E TE508'
 
 
 
9871
 
9872
  # Neffos (TP-Link)
9873
  Neffos:
@@ -10106,12 +10495,12 @@ Nous:
10106
 
10107
  # Nvidia
10108
  Nvidia:
10109
- regex: '(SHIELD Tablet K1) Build|SHIELD Android TV|Tegra(Note-P1640| Note 7)'
10110
  device: 'tablet'
10111
  models:
10112
  - regex: 'TegraNote-P1640'
10113
  model: 'Tegra Note P1640'
10114
- - regex: '(SHIELD Tablet K1|Tegra Note 7)(?: Build|\))'
10115
  model: '$1'
10116
  - regex: 'SHIELD Android TV'
10117
  model: 'SHIELD Android TV'
@@ -10345,13 +10734,15 @@ Onda:
10345
 
10346
  # OnePlus
10347
  OnePlus:
10348
- regex: '(?:du_)?ONEPLUS|(?:A0001|A200[135]|AC200[13]|A300[03]|A3010|A5000|A600[03]|A601[03]|E100[135]|GM191[03517]|GM190[0135]|GM1920|HD191[013]|HD190[01357]|HD1925|IN201[01357]|IN202[0135])(?: Build|\))'
10349
  device: 'smartphone'
10350
  models:
10351
  - regex: 'AC200[13](?:[);/ ]|$)'
10352
  model: 'Nord 5G'
10353
  - regex: 'IN202[0135](?:[);/ ]|$)'
10354
  model: '8 Pro'
 
 
10355
  - regex: 'IN201[01357](?:[);/ ]|$)'
10356
  model: '8'
10357
  - regex: '(?:GM191[03517]|OnePlus 7 Pro)(?:[);/ ]|$)'
@@ -10741,7 +11132,7 @@ Opsson:
10741
 
10742
  # orange
10743
  Orange:
10744
- regex: 'SPV[ \-]?([a-z0-9]+)|(?<!FBCR/)Orange[ _-](?!Tahiti-LS\))([^/;]+)( Build|\))(?<!Tahiti-LS\))|SC/IHD92|Nura 2|FunTab ([^/;]+) Build'
10745
  device: 'smartphone'
10746
  models:
10747
  - regex: 'SC/IHD92'
@@ -10759,23 +11150,23 @@ Orange:
10759
  model: '$1 $2'
10760
  - regex: 'Orange[ _-](Dive)72(?:[);/ ]|$)'
10761
  model: '$1 72'
10762
- - regex: 'Orange[ _-](Daytona|Dive (30|7[13])|Dublin|Fova|Gova|Hi 4G|Hiro|Kivo|Monte Carlo|Neva 80|Neva play|Nura|Reyo|Rise[_ ](3[034]|40|5[345])|Rono|Roya|San Francisco|Tactile internet 2|Tado|Yomi|Yumo|Zali)(?:[);/ ]|$)'
10763
  model: '$1'
10764
  - regex: 'SPV[ \-]?([a-z0-9]+)'
10765
  model: 'SPV $1'
10766
 
10767
  # Oukitel
10768
  Oukitel:
10769
- regex: 'OUKITEL|(?:(?:C15|C16|K10000|K[46]000)(?:[ _]Pro)|K4000Pro|U20_Plus|WP5000|WP[58] Pro|K[46]000[ _](?:Plus|Lite)|Y4800|K10000|K[4567]000| WP[5-7])(?:[);/ ]|$)'
10770
  device: 'smartphone'
10771
  models:
10772
  - regex: '(C15|C16|K10000|K[46]000|WP[258]|U15)[ _]?Pro(?:[);/ ]|$)'
10773
  model: '$1 Pro'
10774
  - regex: 'OUKITEL K([37])(?:[);/ ]|$)'
10775
  model: 'K$1'
10776
- - regex: '(K10000)[ _]Max(?:[);/ ]|$)'
10777
  model: '$1 Max'
10778
- - regex: '(U20|K[46]000)[_ ]?Plus(?:[);/ ]|$)'
10779
  model: '$1 Plus'
10780
  - regex: '(K4000)[_ ]Lite(?:[);/ ]|$)'
10781
  model: '$1 Lite'
@@ -10851,9 +11242,10 @@ Oysters:
10851
  model: 'T74MAi 3G'
10852
  - regex: 'Oysters ([^/;]+)( Build|\))'
10853
  model: '$1'
10854
- # öwn (own)
 
10855
  öwn:
10856
- regex: 'OWN|S4035[ _][34]G'
10857
  device: 'smartphone'
10858
  models:
10859
  - regex: 'FUN ([67])'
@@ -10868,6 +11260,8 @@ Oysters:
10868
  model: 'One'
10869
  - regex: 'SMART 9'
10870
  model: 'Smart 9'
 
 
10871
 
10872
  # Panacom
10873
  Panacom:
@@ -10880,11 +11274,13 @@ Panacom:
10880
 
10881
  # panasonic
10882
  Panasonic:
10883
- regex: 'Panasonic|PANATV[0-9]+|Viera/|(?:P902i|P-08D|FZ-B2D|FZ-[NX]1|DMC-CM1|P-01J)(?:[);/ ]|$)|Eluga[ _]|P55 Novo 4G'
10884
  device: 'smartphone'
10885
  models:
10886
  - regex: 'P-01J(?:[);/ ]|$)'
10887
  model: 'P-smart Keitai'
 
 
10888
  - regex: 'Eluga[ _-]([^;/]+) Build'
10889
  model: 'Eluga $1'
10890
  - regex: 'Eluga[ _-]([^;/]+)(?:[;/)]|$)'
@@ -10892,6 +11288,8 @@ Panasonic:
10892
  - regex: '(DMC-CM1)'
10893
  model: 'Lumix $1'
10894
  device: 'camera'
 
 
10895
  - regex: '(FZ-[XN]1)(?:[);/ ]|$)'
10896
  model: 'Toughpad $1'
10897
  - regex: 'FZ-B2D(?:[);/ ]|$)'
@@ -10977,6 +11375,51 @@ Pentagram:
10977
  model: '$1'
10978
  device: 'smartphone'
10979
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10980
  # philips
10981
  Philips:
10982
  regex: 'Philips|AND1E(?:[);/ ]|$)|NETTV/|PI3210G|TLE(821L|722G)|TPM1[79]1E|70PUH6774_96|QM16[134]E|Xenium S[25]66|S397|W5510'
@@ -11010,6 +11453,9 @@ Philips:
11010
  - regex: 'Philips, BDP([0-9]{4})'
11011
  model: 'Blu-ray Player (BDP$1)'
11012
  device: 'tv'
 
 
 
11013
  - regex: '(NETTV/[0-9\.]{5})'
11014
  model: 'NetTV Series'
11015
  device: 'tv'
@@ -11052,7 +11498,7 @@ Pioneer:
11052
 
11053
  # Pixus
11054
  Pixus:
11055
- regex: 'Pixus|(Ride[_ ][34]G|Play[ _]Three[ _]v(?:[24].0|3.1))(?:[);/ ]|$)'
11056
  device: 'tablet'
11057
  models:
11058
  - regex: 'Ride[_ ]([34])G'
@@ -11063,6 +11509,8 @@ Pixus:
11063
  model: 'Play Two'
11064
  - regex: 'Play Five'
11065
  model: 'Play Five'
 
 
11066
  - regex: 'Pixus[ _]Sprint'
11067
  model: 'Sprint'
11068
  - regex: 'Touch 7 3G'
@@ -11156,7 +11604,7 @@ ProScan:
11156
 
11157
  # RCA Tablets (RCA)
11158
  'RCA Tablets':
11159
- regex: 'RCT([^;/]+) Build|RCA RLTP4028|RCT6513W87|RCT6973W43MD'
11160
  device: 'smartphone'
11161
  models:
11162
  - regex: 'RCA RLTP4028'
@@ -11164,9 +11612,27 @@ ProScan:
11164
  - regex: 'RCT6513W87'
11165
  device: 'tablet'
11166
  model: 'Galileo Pro 11.5"'
11167
- - regex: 'RCT6973W43MD'
 
 
 
11168
  device: 'tablet'
11169
  model: 'Voyager III 7.0"'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11170
  - regex: 'RCT([^;/]+) Build'
11171
  device: 'tablet'
11172
  model: 'RCT$1'
@@ -11197,12 +11663,12 @@ Rokit:
11197
 
11198
  # Rombica
11199
  Rombica:
11200
- regex: '(Rombica|SSQ-A0500)(?:[);/ ]|$)'
11201
  device: 'tv'
11202
  models:
11203
  - regex: 'SSQ-A0500(?:[);/ ]|$)'
11204
  model: 'Smart Stick 4K'
11205
- - regex: '(Infinity K8|Smart Box (?:v005|Quad|Ultra HD v002|4K V001))(?:[);/ ]|$)'
11206
  model: '$1'
11207
 
11208
  # Rover
@@ -11273,7 +11739,7 @@ Santin:
11273
  model: 'Galaz'
11274
  - regex: 'NEWDUN(?:[);/ ]|$)'
11275
  model: 'Newdun'
11276
- - regex: 'SANTIN[ _][#]?(Dante|Candy U7|Armor|YSL-Y7|ANT.W|N[13]|JS|S6|V9)(?:[);/ ]|$)'
11277
  model: '$1'
11278
 
11279
  # Siemens
@@ -11298,7 +11764,7 @@ Soundmax:
11298
 
11299
  # Samsung
11300
  Samsung:
11301
- regex: 'SAMSUNG(?! ?Browser)|Maple |SC-(?:02[CHMKJG]|03[JLK]|04[ELJ]|05G|52A|01[HFGLKM])|N[57]100|N5110|N9100|S(?:CH|GH|PH|EC|AM|HV|HW|M)-|SMART-TV|GT-|(?<!GOG|GOG )Galaxy|(?:portalmmm|o2imode)/2\.0 [SZ]|sam[rua]|vollo Vi86(?:[);/ ]|$)|(?:OTV-)?SMT-E5015|ISW11SC|SCV4[0-8]|SCV3[1-9]|40[34]SC|SCL2[234]|SCG0[126]|SCT21'
11302
  device: 'smartphone'
11303
  models:
11304
  # explicit tv models
@@ -11825,7 +12291,7 @@ Samsung:
11825
  model: 'Galaxy S6 Edge'
11826
  - regex: '(?:SAMSUNG-)?SM-G928(?:7C|R4|W8|[07ACFGIKLPSTVX])'
11827
  model: 'Galaxy S6 Edge+'
11828
- - regex: '(?:SAMSUNG-)?SM-G930(?:FD|W8|[0AFKLPRSTUVX8])?(?:[);/ ]|$)'
11829
  model: 'Galaxy S7'
11830
  - regex: '(?:SAMSUNG-)?SM-G935(?:R4|W8|[0AFKLPSTUVX])|SC-02H|SCV33'
11831
  model: 'Galaxy S7 Edge'
@@ -11849,13 +12315,15 @@ Samsung:
11849
  model: 'Galaxy S10 Lite'
11850
  - regex: '(?:SAMSUNG-)?(?:SM-G975[0FUWNX]|SCV42|SC-04L)'
11851
  model: 'Galaxy S10+'
11852
- - regex: '(?:SAMSUNG-)?SM-G970[08FUNWX](?:[);/ ]|$)'
11853
  model: 'Galaxy S10e'
11854
  - regex: '(?:SAMSUNG-)?SM-G980F'
11855
  model: 'Galaxy S20'
11856
  - regex: '(?:SAMSUNG-)?SM-G981(?:[0BNUW]|U1)|SCG01'
11857
  model: 'Galaxy S20 5G'
11858
- - regex: '(?:SAMSUNG-)?SM-G988(?:[0BNUW]|U1)'
 
 
11859
  model: 'Galaxy S20 Ultra 5G'
11860
  - regex: '(?:SAMSUNG-)?SM-G985F|SCG02'
11861
  model: 'Galaxy S20+'
@@ -11877,6 +12345,8 @@ Samsung:
11877
  model: 'Galaxy Avant'
11878
  - regex: '(?:SAMSUNG-)?SM-A015[AFGM]'
11879
  model: 'Galaxy A01'
 
 
11880
  - regex: '(?:SAMSUNG-)?SM-A260[FG]'
11881
  model: 'Galaxy A2 Core'
11882
  - regex: '(?:SAMSUNG-)?SM-A300(?:FU|YZ|XU|[09FGHMY])'
@@ -11943,13 +12413,13 @@ Samsung:
11943
  model: 'Galaxy A10s'
11944
  - regex: '(?:SAMSUNG-)?SM-(?:S102DL|A102[NWU])'
11945
  model: 'Galaxy A10e'
11946
- - regex: '(?:SAMSUNG-)?SM-A115F'
11947
  model: 'Galaxy A11'
11948
  - regex: '(?:SAMSUNG-)?SM-(?:A205(?:[FGSWU]|YN|U1)|S205DL)|SC-02M|SCV46'
11949
  model: 'Galaxy A20'
11950
  - regex: '(?:SAMSUNG-)?SM-A215U(?:[);/ ]|$)'
11951
  model: 'Galaxy A21'
11952
- - regex: '(?:SAMSUNG-)?SM-A217F(?:[);/ ]|$)'
11953
  model: 'Galaxy A21s'
11954
  - regex: '(?:SAMSUNG-)?SM-A202[FG]'
11955
  model: 'Galaxy A20e'
@@ -11973,8 +12443,10 @@ Samsung:
11973
  model: 'Galaxy A50s'
11974
  - regex: '(?:SAMSUNG-)?SM-A507FN'
11975
  model: 'Galaxy A50s'
11976
- - regex: '(?:SAMSUNG-)?SM-A515[F]'
11977
  model: 'Galaxy A51'
 
 
11978
  - regex: '(?:SAMSUNG-)?SM-A705(?:GM|[MYF]N|F|[W0X])'
11979
  model: 'Galaxy A70'
11980
  - regex: '(?:SAMSUNG-)?SM-A707[0F]'
@@ -12173,6 +12645,9 @@ Samsung:
12173
  - regex: '(?:SAMSUNG-)?SM-(?:F900[0FU]|F907[BN])|SCV44'
12174
  model: 'Galaxy Fold'
12175
  device: 'phablet'
 
 
 
12176
  - regex: '(?:SAMSUNG-)?GT-I9060(?:[);/ ]|$)'
12177
  model: 'Galaxy Grand Neo'
12178
  device: 'phablet'
@@ -12390,6 +12865,8 @@ Sencor:
12390
  model: 'Element 9.7'
12391
  - regex: '(?:SENCOR[ _])?ELEMENT10[ _]1'
12392
  model: 'Element 10.1'
 
 
12393
 
12394
  - regex: '(?:SENCOR[ _])?ELEMENT[ _]?P([0-9]+)'
12395
  model: 'Element P$1'
@@ -12422,15 +12899,26 @@ Senwa:
12422
  - regex: 'Senwa[ _-]*([^ ;/)]+)(?:[);/ ]|$)'
12423
  model: '$1'
12424
 
12425
- # Sky
12426
  Sky:
12427
- regex: '(SKY|Elite|Fuego)[_ ][3-7]\.[05]([A-Z]{1,2})?|Elite_5_5_Octa|Platinum_(5.0M|M5)'
12428
  device: 'smartphone'
12429
  models:
12430
- - regex: 'Platinum_(5.0M|M5)'
12431
  model: 'Platinum 5.0M'
 
 
 
 
 
 
 
12432
  - regex: 'Elite_5_5_Octa'
12433
  model: 'Elite 5.5 Octa'
 
 
 
 
12434
  - regex: 'Elite[_ ]([3-7]\.[05](?:[A-Z]{1,2})?\+?)'
12435
  model: 'Elite $1'
12436
  - regex: 'Fuego[_ ]([3-7]\.[05](?:[A-Z]{1,2})?\+?)'
@@ -12518,7 +13006,7 @@ Smartisan:
12518
 
12519
  # STF Mobile
12520
  STF Mobile:
12521
- regex: 'Fractal|AERIAL PLUS|Origins Pro'
12522
  device: 'smartphone'
12523
  models:
12524
  - regex: 'Fractal'
@@ -12527,6 +13015,10 @@ STF Mobile:
12527
  model: 'Origins Pro'
12528
  - regex: 'AERIAL PLUS'
12529
  model: 'Aerial Plus'
 
 
 
 
12530
 
12531
  # STK
12532
  STK:
@@ -12599,7 +13091,7 @@ SWISSMOBILITY:
12599
 
12600
  # Thomson
12601
  Thomson:
12602
- regex: '(?:Primo(7|8)|QM73[45]-8G|QM734-2|QM736-8G\(HD\)|8950|MID1002|5014G)(?:[);/ ]|$)|(?:Tlink|Every)[0-9]+'
12603
  device: 'tablet'
12604
  models:
12605
  # already detected as manta device
@@ -12615,8 +13107,10 @@ Thomson:
12615
  model: 'QM735-8G'
12616
  - regex: 'QM736-8G\(HD\)'
12617
  model: 'QM736-8G (HD)'
12618
- - regex: '8950(?:[);/ ]|$)'
12619
  model: '3G 8950'
 
 
12620
 
12621
  - regex: '5014G(?:[);/ ]|$)'
12622
  device: 'smartphone'
@@ -12627,10 +13121,19 @@ Thomson:
12627
  - regex: 'Every([0-9]+)'
12628
  device: 'smartphone'
12629
  model: 'Every$1'
 
 
 
 
 
 
 
 
 
12630
 
12631
  # pantech
12632
  Pantech:
12633
- regex: 'Pantech|P[GN]-|PT-[a-z0-9]{3,}|TX[T]?[0-9]+|IM-[a-z0-9]+(?:[);/ ]|$)|ADR910L'
12634
  device: 'smartphone'
12635
  models:
12636
  # explicit smartphone models
@@ -12664,17 +13167,30 @@ Ployer:
12664
  - regex: 'MOMO([0-9][^);/]*)(?:[);/]|$)'
12665
  model: 'MOMO $1'
12666
 
12667
- # Plum
12668
  Plum:
12669
- regex: 'PLUM '
12670
  device: 'smartphone'
12671
  models:
12672
  - regex: 'Z405'
12673
  model: 'Gator 3'
 
 
 
 
 
 
 
 
 
 
 
 
 
12674
 
12675
  # Polaroid
12676
  Polaroid:
12677
- regex: 'Polaroid|(?:PMID|MIDC)[0-9a-z]+(?:[);/ ]|$)|MID(?:1014|0714)|PRO[VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z])|(?:P(?:400[56]|4526|500[56]|502[56]|504[67]|552[56])A|P902/A900|PSPC(?:505|550|[MZL]20A0|K21NA)|SIGMA 5)(?:[);/ ]|$)'
12678
  device: 'smartphone'
12679
  models:
12680
  # explicit smartphone models
@@ -12721,9 +13237,12 @@ Polaroid:
12721
  - regex: 'PRO([VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z]))'
12722
  model: 'Pro$1'
12723
 
12724
- - regex: '(MID(?:1014|0714))'
 
 
12725
  model: '$1'
12726
  device: 'tablet'
 
12727
  - regex: '((?:PMID|MIDC)[0-9a-z]+)(?:[);/ ]|$)'
12728
  model: '$1'
12729
  device: 'tablet'
@@ -12882,7 +13401,7 @@ Sanyo:
12882
  - regex: 'MobilePhone ([a-z0-9\-]+)'
12883
  model: '$1'
12884
 
12885
- # Qilive (Auchan)
12886
  Qilive:
12887
  regex: 'Qilive [0-9][^;/]*|Q(7S5[5]?IN4G|7T10INP|8T10IN|8S55IN4G2|8S[56]IN4G|10S5[37]IN4G|10S[56]IN4G|10S[56]IN4GR|9S5IN4G|6T7IN)'
12888
  device: 'smartphone'
@@ -12929,9 +13448,13 @@ Qilive:
12929
 
12930
  # QMobile
12931
  QMobile:
12932
- regex: 'QMobile|QTab|Q-Smart|Noir X1S|LUNA PRO|NICE S'
12933
  device: 'smartphone'
12934
  models:
 
 
 
 
12935
  - regex: 'QTab[ _-]([^;/]+) Build'
12936
  model: '$1 Tab'
12937
  device: 'tablet'
@@ -13064,7 +13587,7 @@ Spice:
13064
 
13065
  # Sharp (jp.sharp)
13066
  Sharp:
13067
- regex: 'SHARP|SBM|SH-?[0-9]+[a-z]?(?:[);/ ]|$)|AQUOS|(?:SH-M0[45789]|SH-M1[123]|S[357]-SH|SH-[MZ](10|01)|SH-[CL]02|SH-RM(?:1[12]|02)|[34]04SH|401SH|[45]02SH|306SH|[36]05SH|70[1246]SH|80[138]SH|90[1678]SH|50[3679]SH|SHL22|SHV4[0-8]|SHV3[1-9](?:[-_]u)?|FS80(?:1[08]|32|28|0[29])|TG-L900S|NP601SH|603SH|SHV4[035][-_]u|SW001SH|SHG0[12]|X4-SH|A002SH|SH-A01|DM-01J)(?:[);/ ]|$)'
13068
  device: 'smartphone'
13069
  models:
13070
  # explicit smartphone models
@@ -13076,6 +13599,8 @@ Sharp:
13076
  model: 'Aquos Xx2'
13077
  - regex: '[34]04SH(?:[);/ ]|$)'
13078
  model: 'Aquos Xx'
 
 
13079
  - regex: '507SH(?:[);/ ]|$)'
13080
  model: 'Android One'
13081
  - regex: 'S3-SH(?:[);/ ]|$)'
@@ -13092,7 +13617,9 @@ Sharp:
13092
  model: 'Aquos Sense Lite'
13093
  - regex: 'SH-M07(?:[);/ ]|$)'
13094
  model: 'Aquos Sense Plus'
13095
- - regex: 'SH-M12(?:[);/ ]|$)'
 
 
13096
  model: 'Aquos S3 Dual SIM'
13097
  - regex: '(?:SH-[MZ]10|801SH)(?:[);/ ]|$)'
13098
  model: 'Aquos Zero'
@@ -13106,24 +13633,28 @@ Sharp:
13106
  model: 'Aquos Phone Zeta'
13107
  - regex: 'SH06D(?:[);/ ]|$)'
13108
  model: 'Aquos Phone SH-06D'
13109
- - regex: 'SHL22(?:[);/ ]|$)'
13110
- model: 'Aquos Phone SHL22'
13111
  - regex: 'SH-L02(?:[);/ ]|$)'
13112
  model: 'Aquos L2'
13113
  - regex: '(?:605SH|SH-03J|SHV39)(?:[);/ ]|$)'
13114
  model: 'Aquos R'
13115
  - regex: '(?:605SH|SH-03J|SHV39)(?:[);/ ]|$)'
13116
  model: 'Aquos R'
13117
- - regex: '(?:701SH|SHV41)(?:[);/ ]|$)'
13118
  model: 'Aquos R Compact'
13119
  - regex: '(?:SH-M09|SHV42|706SH|SH-03K)(?:[);/ ]|$)'
13120
  model: 'Aquos R2'
13121
  - regex: '803SH(?:[);/ ]|$)'
13122
  model: 'Aquos R2 Compact'
13123
- - regex: '(?:908SH|SHG01)(?:[);/ ]|$)'
13124
  model: 'Aquos R5G'
 
 
13125
  - regex: 'SH-C02(?:[);/ ]|$)'
13126
  model: 'Aquos V'
 
 
13127
  - regex: '704SH(?:[);/ ]|$)'
13128
  model: 'Simple Smartphone 4'
13129
  - regex: '(?:SH-02J|SH-04G)(?:[);/ ]|$)'
@@ -13134,6 +13665,8 @@ Sharp:
13134
  model: 'Aquos Crystal'
13135
  - regex: '402SH(?:[);/ ]|$)'
13136
  model: 'Aquos Crystal X'
 
 
13137
  - regex: '509SH(?:[);/ ]|$)'
13138
  model: 'Aquos 3'
13139
  - regex: 'NP601SH(?:[);/ ]|$)'
@@ -13146,11 +13679,13 @@ Sharp:
13146
  model: 'Aquos S Mini'
13147
  - regex: '(?:FS8010|SH-M08|SHV43(?:-u)?|SH-01[KL])(?:[);/ ]|$)'
13148
  model: 'Aquos S2'
 
 
13149
  - regex: '(?:SHV46|SH-R?M11|901SH)(?:[);/ ]|$)'
13150
  model: 'Aquos S3 Plus'
13151
  - regex: '(?:SHV44|808SH|SH-04L|SH-03G)(?:[);/ ]|$)'
13152
  model: 'Aquos R3'
13153
- - regex: '(?:FS8032|SH-02M|SHV45(?:-U)?)(?:[);/ ]|$)'
13154
  model: 'Aquos S3'
13155
  - regex: 'FS8018(?:[);/ ]|$)'
13156
  model: 'Aquos S3 Mini'
@@ -13158,6 +13693,8 @@ Sharp:
13158
  model: 'Aquos S3 Basic'
13159
  - regex: 'SH-RM12(?:[);/ ]|$)'
13160
  model: 'Aquos S3 Lite'
 
 
13161
  - regex: 'SH-51A(?:[);/ ]|$)'
13162
  model: 'Aquos R5G'
13163
  - regex: 'SHV3[57](?:_u)?(?:[);/ ]|$)'
@@ -13182,11 +13719,16 @@ Sharp:
13182
  model: 'Aquos 401SH'
13183
  - regex: 'DM-01J'
13184
  model: 'Disney Mobile'
 
 
13185
 
13186
  # explicit tablet models
13187
  - regex: 'SH-08E(?:[);/ ]|$)'
13188
  device: 'tablet'
13189
  model: 'Sharp Aquos Pad'
 
 
 
13190
 
13191
  - regex: '(LC-(?:[0-9]{2})[a-z0-9]+)(?:[);/ ]|$)'
13192
  device: 'tv'
@@ -13237,6 +13779,18 @@ Star:
13237
  - regex: 'N(9[5678]00|8800|9977)(?:[);/ ]|$)'
13238
  model: 'N$1'
13239
 
 
 
 
 
 
 
 
 
 
 
 
 
13240
  # Kindle
13241
  Amazon:
13242
  regex: 'KF(?:OT|ONWI|TT|JWI|JWA|[DFS]OWI|A[PRSU]WI|T[BH]WI|SAW[IA]|GIWI|KAWI|MAWI|MEWI|MUWI|SUWI)(?:[);/ ]|$)|Kindle|Silk/\d+\.\d+|Amazon (?:Tate|Jem)|AFT[ABMNRST]|SD4930UR|AEO(BC|KN)(?:[);/ ]|$)'
@@ -13331,6 +13885,12 @@ Symphony:
13331
  - regex: 'SYMPHONY[ \_]([a-z0-9]+)'
13332
  model: '$1'
13333
 
 
 
 
 
 
 
13334
  # Syrox
13335
  Syrox:
13336
  regex: '(SYX-(?:T70[04]|T10[12]))(?:[);/ ]|$)'
@@ -13373,37 +13933,9 @@ T-Mobile:
13373
  - regex: 'Ignis ([89])'
13374
  model: 'Ignis $1'
13375
 
13376
- # Tcl
13377
- TCL:
13378
- regex: 'TCL[_ -][a-z0-9]+|(?:TCL[_ -][^;/]+ Build)|(?:TCLGalaG60(?:\(9108A\))?|A502DL|T780H|5199I|7040N|5133A|5159[AJ]|5152D|T770H)(?:[);/ ]|$)'
13379
- device: 'smartphone'
13380
- models:
13381
- - regex: 'TCLGalaG60(?:\(9108A\))?(?:[);/ ]|$)'
13382
- model: 'Gala G60'
13383
- - regex: '5199I(?:[);/ ]|$)'
13384
- model: 'C9'
13385
- - regex: '5152D(?:[);/ ]|$)'
13386
- model: 'C5'
13387
- - regex: '5133A(?:[);/ ]|$)'
13388
- model: 'L5'
13389
- - regex: 'T780H(?:[);/ ]|$)'
13390
- model: 'Plex'
13391
- - regex: 'TCL[_ -]([^;/]+) Build'
13392
- model: '$1'
13393
- - regex: 'TCL[_ -]([a-z0-9]+)'
13394
- model: '$1'
13395
- - regex: '(7040N)(?:[);/ ]|$)'
13396
- model: '$1'
13397
- - regex: 'A502DL(?:[);/ ]|$)'
13398
- model: 'LX'
13399
- - regex: '5159[AJ](?:[);/ ]|$)'
13400
- model: 'L9'
13401
- - regex: 'T770H(?:[);/ ]|$)'
13402
- model: '10L'
13403
-
13404
- # Teclast
13405
  Teclast:
13406
- regex: 'Teclast|X98 Air III|X98 Air II\(HG5N\)|Tbook|X80 Power\(B2N4\)|(?:T30|P80X|P20HD)_(?:ROW|EEA)|T10\(E3C6\)|P10S\(N4H5\)|98\(M1E[45789]\)|98\(M3E3\)'
13407
  device: 'tablet'
13408
  models:
13409
  - regex: 'Tbook[_ -]([^;/]+) Build'
@@ -13418,6 +13950,12 @@ Teclast:
13418
  model: 'P10S'
13419
  - regex: 'P20HD_(?:ROW|EEA)'
13420
  model: 'P20HD'
 
 
 
 
 
 
13421
  - regex: '98\(M1E[45789]\)|98\(M3E3\)'
13422
  model: 'TPad 98 10.1" 4G'
13423
  - regex: 'X80 Power\(B2N4\)(?:[);/ ]|$)'
@@ -13475,20 +14013,30 @@ TechPad:
13475
  models:
13476
  - regex: 'S813G'
13477
  model: 'S813G'
 
 
 
 
 
 
 
 
 
 
13478
  - regex: 'Dual C1081HD'
13479
  model: 'XTAB C1081HD'
13480
  - regex: 'XTAB[ _-]([^/;]+) Build'
13481
  model: 'XTAB $1'
13482
- - regex: 'Tech ?pad[ _-]([^/;]+) Build'
13483
  model: '$1'
13484
  device: 'smartphone'
13485
 
13486
  # Tesco
13487
  Tesco:
13488
- regex: 'Hudl ([^/;]+) Build|W032i-C3(?:[);/ ]|$)'
13489
  device: 'tablet'
13490
  models:
13491
- - regex: 'Hudl ([^/;]+) Build'
13492
  model: 'Hudl $1'
13493
  - regex: 'W032i-C3(?:[);/ ]|$)'
13494
  model: 'Op3n Dott'
@@ -13654,13 +14202,13 @@ Telego:
13654
 
13655
  # Telenor
13656
  Telenor:
13657
- regex: '(?<!FBCR/)Telenor'
13658
  device: 'smartphone'
13659
  models:
13660
- - regex: 'Telenor[ _]([^;/]+) Build'
13661
- model: '$1'
13662
- - regex: 'Telenor[ _]([^a-z0-9_]+)\)'
13663
  model: '$1'
 
 
13664
 
13665
  # Telit
13666
  Telit:
@@ -13874,7 +14422,7 @@ UTStarcom:
13874
 
13875
  # Ulefone
13876
  Ulefone:
13877
- regex: 'Ulefone|Gemini Pro|Power_[356]|S10_Pro|(?:Armor(?:(?:[ _])(?:[2367]|X[236]|6[SE]|3WT|3W|X))?|U00[78][ _]Pro|Be[ _]X|Be[ _]Touch(?:[ _][23])?|Be[ _](?:One|Pure)(?:[ _]Lite)?)(?:[);/ ]|$)'
13878
  device: 'smartphone'
13879
  models:
13880
  - regex: 'S10_Pro'
@@ -13899,19 +14447,21 @@ Ulefone:
13899
  model: 'Armor X$1'
13900
  - regex: 'Armor[ _]6S(?:[);/ ]|$)'
13901
  model: 'Armor 6S'
13902
- - regex: 'Armor[ _]6E(?:[);/ ]|$)'
13903
- model: 'Armor 6E'
13904
- - regex: 'Armor[ _]X5(?:[);/ ]|$)'
13905
- model: 'Armor X5'
13906
- - regex: 'Armor[ _]5S(?:[);/ ]|$)'
13907
- model: 'Armor 5S'
 
 
13908
  - regex: 'Armor[ _]X(?:[);/ ]|$)'
13909
  model: 'Armor X'
13910
  - regex: 'Armor[ _]3W(?:[);/ ]|$)'
13911
  model: 'Armor 3W'
13912
  - regex: 'Armor[ _]3WT(?:[);/ ]|$)'
13913
  model: 'Armor 3WT'
13914
- - regex: 'Armor[ _]([2367])(?:[);/ ]|$)'
13915
  model: 'Armor $1'
13916
  - regex: 'Armor(?:[);/ ]|$)'
13917
  model: 'Armor'
@@ -13926,9 +14476,9 @@ Ulefone:
13926
  - regex: 'Ulefone[ _-]?([^;/)]+)(?:[;/)]|$)'
13927
  model: '$1'
13928
 
13929
- # UMIDIGI
13930
  UMIDIGI:
13931
- regex: 'UMI(?:DIGI)?[ _]|A5_Pro|ROME[_ ]X'
13932
  device: 'smartphone'
13933
  models:
13934
  - regex: 'A5_Pro'
@@ -13939,9 +14489,13 @@ UMIDIGI:
13939
  model: 'Touch'
13940
  - regex: 'ROME[_ ]X'
13941
  model: 'Rome X'
 
 
 
 
13942
  - regex: 'UMI_(London|Diamond(?:_X)?)'
13943
  model: '$1'
13944
- - regex: 'UMI(?:DIGI)?[ _]([^/;)]+)(?: Build|\))'
13945
  model: '$1'
13946
 
13947
  # Uniscope
@@ -14044,9 +14598,9 @@ Fengxiang:
14044
 
14045
  # VK Mobile
14046
  VK Mobile:
14047
- regex: 'VK(?!share)[\-]?([a-z0-9 ]+)([;\)/ ]| Build)'
14048
  device: 'feature phone'
14049
- model: '$1'
14050
 
14051
  # Vernee
14052
  Vernee:
@@ -14124,7 +14678,7 @@ Verykool:
14124
 
14125
  # Vestel (vestel.com)
14126
  Vestel:
14127
- regex: 'Vestel[ _]|Venus[ _](GO|E[43]|V[1-9]|Z[1-9]0)|V_?TAB|VP74|VT97PRO|VSP145M|VSP250[GS]|VSP355[GS]|V3_5580_Dual'
14128
  device: 'smartphone'
14129
  models:
14130
  - regex: 'VT97PRO'
@@ -14160,7 +14714,11 @@ Vestel:
14160
  model: 'Venus Z$1'
14161
  - regex: 'Venus[ _]GO'
14162
  model: 'Venus Go'
14163
- - regex: 'Venus[ _]E([34])'
 
 
 
 
14164
  model: 'Venus E$1'
14165
  - regex: 'Vestel_5000_Dual'
14166
  model: '5000 Dual'
@@ -14292,7 +14850,7 @@ Vodafone:
14292
 
14293
  # Vonino
14294
  Vonino:
14295
- regex: 'Vonino|Epic (?:E8|P7)|Gyga[ _](?:X|S|QS|XS)|Jax[ _](?:QS|[SXQN]|Mini)|Magnet[ _]M[19]|Navo_QS|Onyx_(QS|Z)|Orin_QS|Pluri[ _](?:[BCMQ]7|[CQ]8)|Sirius_QS|Volt[ _][XS]|Xavy_(T7|L8)|Xylo[ _][XSPQ]|Zun[ _]X[OS]?|JAX_N'
14296
  device: 'smartphone'
14297
  models:
14298
  - regex: 'Zun[ _]XO'
@@ -14329,7 +14887,7 @@ Vonino:
14329
  - regex: 'Pluri[ _](B|C|M|Q)7'
14330
  model: 'Pluri $17'
14331
  device: 'tablet'
14332
- - regex: 'Pluri[ _](C|Q)8'
14333
  model: 'Pluri $18'
14334
  device: 'tablet'
14335
  - regex: 'Magnet[ _]M([19])'
@@ -14382,11 +14940,18 @@ Voxtel:
14382
 
14383
  # Vulcan
14384
  Vulcan:
14385
- regex: 'VP5004A'
14386
  device: 'smartphone'
14387
  models:
14388
- - regex: 'VP5004A'
14389
- model: 'VP5004A'
 
 
 
 
 
 
 
14390
 
14391
  # Walton
14392
  Walton:
@@ -14440,7 +15005,7 @@ Wexler:
14440
 
14441
  # Wiko (wikomobile.com)
14442
  Wiko:
14443
- regex: '(?:WIKO[_ -])|(?:WIKO-)?CINK_[a-z0-9_]+|(?:WIKO-)?HIGHWAY_[a-z0-9_]+|(?:WIKO-)?(?:Cink([^/;]*)|Highway([^/;]*)|Iggy|Stairway|Rainbow ?(Jam|Lite|Up)?|Darkside|Darkmoon|Darkfull|Darknight|Freddy|FEVER|Jerry[2]?|Sublim|Ozzy|JIMMY|Barry|Birdy|Bloom|Getaway|Goa(?!nna)|Kite|Robby|Lenny[2-9]?|Slide|Sunset[2-9]?|Sunny[2-9]?|Tommy[2-9]?|PULP(?: Fab)?|Wax|HARRY|Ridge(?: Fab)?|U FEEL(?: Prime| Lite)?|U PULSE(?: LITE)?|View2 Go|View XL|View Prime)(?: Plus)?(?: 4G)?(?: Build|$)?|W_(?:C8[06]0|K[346]00|P130|P200|C200SN)|WC300|W-(?:V7[23]0|V8[30]0|P[36]11|K420|K510S?|K130)-(?:TMV|TIM|TVM|EEA|SUN|SWI|OPE|BYT|DU|TH)|WIM Lite|W-K360-TV|W-V600|W-K200|W-U300|U307AS|CINK PEAX 2|HIGHWAY PURE'
14444
  device: 'smartphone'
14445
  models:
14446
  - regex: '(?:WIKO-)?Cink Peax 2'
@@ -14513,6 +15078,8 @@ Wiko:
14513
  model: 'Kite'
14514
  - regex: 'W_K400'
14515
  model: 'Lenny 5'
 
 
14516
  - regex: 'U307AS(?:[);/ ]|$)'
14517
  model: 'Life 2'
14518
  - regex: '(?:WIKO-)?Lenny[ -_]?3 Max'
@@ -14707,11 +15274,20 @@ Woxter:
14707
 
14708
  # X-View
14709
  X-View:
14710
- regex: 'ZEN_U5+'
14711
  device: 'smartphone'
14712
  models:
14713
- - regex: 'ZEN_U5+'
14714
  model: 'ZEN U5+'
 
 
 
 
 
 
 
 
 
14715
 
14716
  # POCO (sub brand Xiaomi)
14717
  POCO:
@@ -14727,7 +15303,7 @@ POCO:
14727
 
14728
  # Xiaomi
14729
  Xiaomi:
14730
- regex: 'Xiaomi(?!/(?:Miui|Mint[ ])Browser)|Mi9 Pro 5G|(?:MI [a-z0-9]+|Mi-4c|MI-One[ _]?[a-z0-9]+|MIX(?: 2S?)?)(?:[);/ ]|$)|HM (?:[^/;]+) (?:Build|MIUI)|(?:2014501|2014011|201481[12378]|201302[23]|2013061) Build|Redmi|MI_NOTE_Pro|POCOPHONE|(?:SHARK )?(KLE|MBU)-[AH]0|SKR-[AH]0|SKW-[AH]0|POCO F1|DLT-[AH]0|MIBOX[234]([_ ]PRO)?|MiTV4[CSX]?|MiTV-(MSSP[01]|AXSO0)|AWM-A0|MI CC 9 Meitu Edition|MiBOX1S|MiTV4A|M2006C3(?:L[IGC]|LVG|MN?G)|M2007J1SC|M2002J9[EG]|HM2014819|WT88047|M2004J(?:7[AB]|19)C|M2006C3MII|M2003J15SC|M2007J3S[CYG]|HM NOTE 1(?:LTE|W)|MI[_ ]PLAY|XIG01'
14731
  device: 'smartphone'
14732
  models:
14733
  # specific smartphone models
@@ -14833,6 +15409,8 @@ Xiaomi:
14833
  model: 'Redmi K20 Pro'
14834
  - regex: 'Redmi K30 5G(?:[);/ ]|$)'
14835
  model: 'Redmi K30 5G'
 
 
14836
 
14837
  - regex: 'MI PAD 4 PLUS(?:[);/ ]|$)'
14838
  model: 'Mi Pad 4 Plus'
@@ -15195,7 +15773,7 @@ Toshiba:
15195
 
15196
  # Vivax (www.vivax.com)
15197
  Vivax:
15198
- regex: 'VIVAX|(?:Fly5[_ ]Lite|Fun[_ ]S500|Point_X2|PRO3)(?:[);/ ]|$)'
15199
  device: 'smartphone'
15200
  models:
15201
  - regex: 'Fly5[_ ]Lite(?:[);/ ]|$)'
@@ -15206,7 +15784,9 @@ Vivax:
15206
  model: 'Fun S500'
15207
  - regex: 'VIVAX[ _]Fly3(?:[);/ ]|$)'
15208
  model: 'Fly 3'
15209
- - regex: 'VIVAX (Point X551)(?:[);/ ]|$)'
 
 
15210
  model: '$1'
15211
  - regex: 'SMART Point X5010(?:[);/ ]|$)'
15212
  model: 'Smart Point X5010'
@@ -15215,6 +15795,10 @@ Vivax:
15215
  - regex: 'VIVAX TABLET TPC 802 3G(?:[);/ ]|$)'
15216
  model: 'TPC-802 3G'
15217
 
 
 
 
 
15218
  # MLS
15219
  MLS:
15220
  regex: 'IQ(?:0705|L550|1010w?|1012N?|1019N|1025|1380|1401|1436|1452a|1453|1470|1502a|1511|1552|1553|1568|1570|1805N|1806|1808|1810B_M|1832|1850|1890|5017|9610|181011N|E[12]00|EL41|G550|GW516|L30|L5[01]|M801|M1001|N700|P50|R300|S300|S1001|W503|W511T|W553N?|W60[38]|W626|M960|D700|9013_4N)(?:[);/ ]|$)'
@@ -15679,7 +16263,7 @@ Zopo:
15679
 
15680
  # ZTE
15681
  ZTE:
15682
- regex: 'ZTE|AxonPhone|([a-z0-9]+)_USA_Cricket|(?:Blade (?:L110|L[2357]|L7A|S6|V[6789]|V8Q|V8 SE|V9 VITA|X7|A(310|460|465|475|520|530|602)|V580|V Ultra|Q Lux)|N9[15]8St|NX(?:403A|404H|406E|40[X2]|507J|503A|505J|506J|508J|510J|512J|511J|513J|521J|523J_V1|529J|531J|541J|5[48]9J|551J|563J|569[HJ]|573J|575J|59[157]J|60[1689]J|61[12679]J|62[79]J|65[19]J|907J)|N818S|N951[0579]|N91[38]0|N9101|N913[267]|N952[01]|N9560|N9810|N799D|[UV]9180|[UV]9815|Z(?:233V|331|5031O|559DL|6621O|667T|768G|792|81[25]|818L|82[08]|83[12359]|85[125]|851M|(557|71[67]|798|836|861|916)BL|986DL|(232|718|828)TL|(?:233|353|558|717|799|837|862|899|917|963)VL|955A|95[678]|965|97[018]|98[1237]|986U|999|936L)|Apex2|G (LTE|Lux)|Vec|Z959|V865M|Z3001S|902ZT|KIS II Max|Kis 3|K3DX-V5G|Z930L|Optus X|Blade[ _](A510|A[35] 2019-T|A6 MAX|A0622|X9)|Z3153V|Nubia Z(?:9|11)|Ctyon-A9|602ZT|MO-01[JK]|Z963U|402ZT|P545|P609|dandelion|901ZT|A001ZT|Z-01K|UZTE V808)(?:[);/ ]|$)'
15683
  device: 'smartphone'
15684
  models:
15685
  # explicit smartphone models
@@ -15689,6 +16273,10 @@ ZTE:
15689
  model: 'Libero 3'
15690
  - regex: '901ZT(?:[);/ ]|$)'
15691
  model: 'Libero S10'
 
 
 
 
15692
  - regex: 'A7020(?:[);/ ]|$)'
15693
  model: 'Blade A7s (2020)'
15694
  - regex: 'ZTE 2050(?:[);/ ]|$)'
@@ -15748,7 +16336,7 @@ ZTE:
15748
  - regex: 'N9810(?:[);/ ]|$)'
15749
  model: 'Vital'
15750
  - regex: 'NX40[X2](?:[);/ ]|$)'
15751
- model: 'Nubia Z5 mini'
15752
  - regex: 'NX(403[AE]|406E|404H)(?:[);/ ]|$)'
15753
  model: 'Nubia Z5S Mini'
15754
  - regex: 'NX503A(?:[);/ ]|$)'
@@ -15756,31 +16344,31 @@ ZTE:
15756
  - regex: 'NX506J(?:[);/ ]|$)'
15757
  model: 'Nubia Z7'
15758
  - regex: 'NX507J(?:[);/ ]|$)'
15759
- model: 'Nubia Z7 mini'
15760
  - regex: 'NX505J(?:[);/ ]|$)'
15761
- model: 'Nubia Z7 max'
15762
  - regex: 'NX508J(?:[);/ ]|$)'
15763
  model: 'Nubia Z9'
15764
  - regex: '(NX5[12]1J|Nubia Z9 mini)(?:[);/ ]|$)'
15765
- model: 'Nubia Z9 mini'
15766
  - regex: '(NX510J|Nubia Z9 Max)(?:[);/ ]|$)'
15767
- model: 'Nubia Z9 max'
15768
  - regex: 'NX512J(?:[);/ ]|$)'
15769
- model: 'Nubia Z9 max dual'
15770
  - regex: 'NX531J(?:[);/ ]|$)'
15771
  model: 'Nubia Z11'
15772
  - regex: 'NX523J_V1'
15773
  model: 'Nubia Z11 Max'
15774
- - regex: 'NX529J(?:[);/ ]|$)'
15775
- model: 'Nubia Z11 mini'
15776
  - regex: '(?:NX549J|Nubia Z11 mini S)(?:[);/ ]|$)'
15777
- model: 'Nubia Z11 mini S'
 
 
15778
  - regex: 'NX606J(?:[);/ ]|$)'
15779
  model: 'Nubia Z18'
15780
  - regex: 'NX616J(?:[);/ ]|$)'
15781
  model: 'Nubia Z18S'
15782
  - regex: 'NX611J(?:[);/ ]|$)'
15783
- model: 'Nubia Z18 mini'
15784
  - regex: 'NX551J(?:[);/ ]|$)'
15785
  model: 'Nubia M2'
15786
  - regex: 'NX563J(?:[);/ ]|$)'
@@ -15891,6 +16479,10 @@ ZTE:
15891
  model: 'Blade L8'
15892
  - regex: 'Blade A3 2019-T(?:[);/ ]|$)'
15893
  model: 'Blade A3 (2019)'
 
 
 
 
15894
  - regex: 'Blade A5 2019-T(?:[);/ ]|$)'
15895
  model: 'Blade A5 (2019)'
15896
  - regex: 'BLADE A0622(?:[);/ ]|$)'
@@ -15925,8 +16517,8 @@ ZTE:
15925
  model: 'Blade V8 SE'
15926
  - regex: 'Blade V9 Vita(?:[);/ ]|$)'
15927
  model: 'Blade V9 Vita'
15928
- - regex: 'Blade V9(?:[);/ ]|$)'
15929
- model: 'Blade V9'
15930
  - regex: 'Blade V10 Vita(?:[);/ ]|$)'
15931
  model: 'Blade V10 Vita'
15932
  - regex: 'BLADE V0820(?:[);/ ]|$)'
@@ -16068,6 +16660,11 @@ ZTE:
16068
  - regex: 'Z6621O(?:[);/ ]|$)'
16069
  model: 'Optus X Vista'
16070
 
 
 
 
 
 
16071
  - regex: 'AxonPhone ([^;/]+) Build'
16072
  model: 'AxonPhone $1'
16073
  - regex: '([a-z0-9]+)_USA_Cricket'
@@ -16083,7 +16680,7 @@ ZTE:
16083
  model: '$1'
16084
 
16085
  Zuum:
16086
- regex: 'Zuum[ _-]|COVET|MAGNO|ONIX S|STEDI|STELLAR Z'
16087
  device: 'smartphone'
16088
  models:
16089
  - regex: 'COVET'
@@ -16096,6 +16693,10 @@ Zuum:
16096
  model: 'Stedi'
16097
  - regex: 'STELLAR Z'
16098
  model: 'Stellar Z'
 
 
 
 
16099
  - regex: 'Zuum[ _-]([^;/]+) Build'
16100
  model: '$1'
16101
  - regex: 'Zuum[ _-]?([^;/)]+)(?:[);/ ]|$)'
@@ -16195,6 +16796,8 @@ Inoi:
16195
  model: '2 Lite (2019)'
16196
  - regex: 'INOI 2 2019'
16197
  model: '2 (2019)'
 
 
16198
  - regex: 'INOI[_ ]([^;/]+)(?: Build|[;)])'
16199
  model: '$1'
16200
 
@@ -16232,11 +16835,9 @@ Starway:
16232
 
16233
  # Savio
16234
  Savio:
16235
- regex: 'TB-PO1 Build'
16236
  device: 'tv'
16237
- models:
16238
- - regex: '(TB-PO1)'
16239
- model: '$1'
16240
 
16241
  # Simbans
16242
  Simbans:
@@ -16264,7 +16865,7 @@ MYFON:
16264
 
16265
  # X-TIGI
16266
  X-TIGI:
16267
- regex: 'X[-_]TIGI|Hope7[_ ]Mate'
16268
  device: 'smartphone'
16269
  models:
16270
  - regex: 'X-TIGI_JOY10_PRO'
@@ -16282,6 +16883,8 @@ X-TIGI:
16282
  model: 'V19'
16283
  - regex: 'X-TIGI[_ ]Photo[_ ]P11'
16284
  model: 'Photo P11'
 
 
16285
  - regex: 'X[-_]TIGI[ _-]([^/;)]+) Build'
16286
  model: '$1'
16287
 
@@ -16338,7 +16941,7 @@ NEXBOX:
16338
 
16339
  # True
16340
  'True':
16341
- regex: 'SMART[ _](MAX 4.0 PLUS|4G GEN C [45].[05]|4G Speedy 5.0 Plus|4G[_ ]Speedy[_ ]5inch)'
16342
  device: 'smartphone'
16343
  models:
16344
  - regex: 'SMART MAX 4.0 PLUS'
@@ -16349,6 +16952,12 @@ NEXBOX:
16349
  model: 'Smart 4G Speedy 5.0 Plus'
16350
  - regex: 'SMART[ _]4G[_ ]Speedy[_ ]5inch'
16351
  model: 'Smart 4G Speedy 5'
 
 
 
 
 
 
16352
 
16353
  Yandex:
16354
  regex: '(YNDX-?000SB)(?:[);/ ]|$)'
@@ -16383,7 +16992,7 @@ BDF:
16383
 
16384
  # Highscreen
16385
  Highscreen:
16386
- regex: 'HIGHSCREEN|(Easy[- ]Power(?:[- ]Pro)?|Pure[_ ]Power|Power Ice(?: Max)?|Easy[_ ]([SFL]|XL)(?:_Pro)?|Razar_Pro|Power Rage(?: Evo)?|Zera-S-Power|Zera[ _][UFS]|Power[ _]?Five[ _]?(?:Pro|Evo|Max|Max(?:Lite|2))|PowerFour|BOOST II(?:se)?|FestXL|Fest-Pro|Tasty|Boost3|Boost 3(?: Pro)? SE|Expanse)(?:[);/ ]|$)'
16387
  device: 'smartphone'
16388
  models:
16389
  - regex: '(Power Ice(?:[ ](?:Max|Evo))?|Power Rage(?: Evo)?|Zera[ _][UFS])(?:[);/ ]|$)'
@@ -16406,6 +17015,8 @@ Highscreen:
16406
  model: 'Power Four'
16407
  - regex: 'Pure[_ ]Power(?:[);/ ]|$)'
16408
  model: 'Pure Power'
 
 
16409
  - regex: 'Razar_Pro(?:[);/ ]|$)'
16410
  model: 'Razar Pro'
16411
  - regex: 'Easy[_ ]([SLF]|XL)[_ ]Pro(?:[);/ ]|$)'
@@ -16434,6 +17045,8 @@ Highscreen:
16434
  model: 'WinWin'
16435
  - regex: 'Expanse(?:[);/ ]|$)'
16436
  model: 'Expanse'
 
 
16437
 
16438
  # CVTE
16439
  CVTE:
@@ -16510,7 +17123,7 @@ Unihertz:
16510
 
16511
  # Chuwi
16512
  Chuwi:
16513
- regex: '(?:CW-(Hi8-super|Hi12|V99|V17HD3G|VX8-3G|V88-QUAD|V9-DUAL|V88S|Vi[78]|[HV]i10 (?:pro|plus))|Hi10 (?:Pro|plus)|HiBox-hero|HiBook pro|Hi8 (?:Air|Pro))(?:[);/ ]|$)'
16514
  device: 'tablet'
16515
  models:
16516
  - regex: '(CW-Hi8-super)(?:[);/ ]|$)'
@@ -16527,8 +17140,12 @@ Chuwi:
16527
  model: '$1 Pro'
16528
  - regex: 'HiBook pro(?:[);/ ]|$)'
16529
  model: 'HiBook Pro'
16530
- - regex: 'Hi8 Air(?:[);/ ]|$)'
16531
- model: 'Hi8 Air'
 
 
 
 
16532
  - regex: 'Hi8 pro(?:[);/ ]|$)'
16533
  model: 'Hi8 Pro'
16534
 
@@ -16603,6 +17220,12 @@ Vinga:
16603
  - regex: 'VMP-011-81'
16604
  model: '011'
16605
 
 
 
 
 
 
 
16606
  # Nuvo
16607
  Nuvo:
16608
  regex: 'Nuvo[_ ](NS35|Blue ND40|Green[_ ]ND[_ ]45)(?:[);/ ]|$)'
@@ -16723,10 +17346,10 @@ Spectrum:
16723
 
16724
  # Kivi
16725
  Kivi:
16726
- regex: '(?:24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55UP50GU|50U600G[RU]|55UR50GR|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|55UC30G|32HK30G|40FK30G|32HR50GU|43UK30G|32FR50(?:WR|BU)|32FK3[02]G)(?:_-Ver0[0-9])?(?:[);/ ]|$)'
16727
  device: 'tv'
16728
  models:
16729
- - regex: '(24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55UP50GU|50U600G[RU]|55UR50GR|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|32FR50(?:WR|BU)|32FK3[02]G)(?:[);/ ]|$)'
16730
  model: '$1'
16731
  - regex: '(55UC30G|40FK30G|43UK30G|32HR50G[RU]|32HK30G|32FK32G)_-Ver0([0-9])(?:[);/ ]|$)'
16732
  model: '$1 v$2'
@@ -16749,7 +17372,7 @@ Kanji:
16749
  - regex: 'KJ-YUBI(?:[);/ ]|$)'
16750
  model: 'Yubi 3G'
16751
 
16752
- #Kaiomy
16753
  Kaiomy:
16754
  regex: 'KaiCloud[ ]?(7[48]4|942)(?:[);/ ]|$)'
16755
  device: 'tablet'
@@ -16763,13 +17386,15 @@ National:
16763
 
16764
  # Vsun
16765
  Vsun:
16766
- regex: '(?:VSUN (?:ILLUSION|RACE|V9)|MARS TOUCH)(?:[);/ ]|$)'
16767
  device: 'smartphone'
16768
  models:
16769
  - regex: 'ILLUSION(?:[);/ ]|$)'
16770
  model: 'Illusion'
16771
  - regex: 'MARS TOUCH(?:[);/ ]|$)'
16772
  model: 'Mars Touch'
 
 
16773
  - regex: 'RACE(?:[);/ ]|$)'
16774
  model: 'Race'
16775
  - regex: '(V9)(?:[);/ ]|$)'
@@ -16861,11 +17486,11 @@ iGet:
16861
 
16862
  # iVA
16863
  iVA:
16864
- regex: '(LAMCY L350|IVA S6)(?:[);/ ]|$)'
16865
  device: 'smartphone'
16866
  models:
16867
- - regex: 'LAMCY L350(?:[);/ ]|$)'
16868
- model: 'Lamcy L350'
16869
  - regex: 'IVA S6(?:[);/ ]|$)'
16870
  model: 'S6'
16871
 
@@ -16909,9 +17534,13 @@ Gome:
16909
 
16910
  # Voyo
16911
  Voyo:
16912
- regex: 'VOYO[_ ](A15)(?:[);/ ]|$)'
16913
  device: 'tablet'
16914
- model: '$1'
 
 
 
 
16915
 
16916
  # Ryte (Ryte Mobile)
16917
  Ryte:
@@ -16937,7 +17566,7 @@ Vontar:
16937
 
16938
  # Vorke
16939
  Vorke:
16940
- regex: 'VORKE (Z[15]|Z6(?: Plus)?)(?:[);/ ]|$)'
16941
  device: 'tv'
16942
  model: '$1'
16943
 
@@ -16955,7 +17584,7 @@ NEXON:
16955
 
16956
  # ONN
16957
  ONN:
16958
- regex: '(ONA19TB00[327])(?:[);/ ]|$)'
16959
  device: 'tablet'
16960
  model: '$1'
16961
 
@@ -17003,9 +17632,13 @@ Goophone:
17003
 
17004
  # PocketBook
17005
  PocketBook:
17006
- regex: 'PocketBook SURFpad 3 \(([\d]+).([\d]+)["]?\)(?:[);/ ]|$)'
17007
  device: 'tablet'
17008
- model: 'Surfpad 3 $1.$2"'
 
 
 
 
17009
 
17010
  # Bitmore
17011
  Bitmore:
@@ -17025,17 +17658,16 @@ Kuliao:
17025
 
17026
  # Sugar
17027
  Sugar:
17028
- regex: 'SUGAR (?:C[12]1|[YF]11|[YFS]9|C6|[FY]7|Y8|Y1[25])(?:[);/ ]|$)'
17029
  device: 'smartphone'
17030
  models:
17031
  - regex: 'SUGAR Y([78]) MAX(?:[);/ ]|$)'
17032
  model: 'Y$1 Max'
17033
  - regex: 'SUGAR F7 Mini(?:[);/ ]|$)'
17034
  model: 'F7 Mini'
17035
- - regex: 'SUGAR (C[12]1|[YF]11|[YFS]9|C6|Y7|Y1[25])(?:[);/ ]|$)'
17036
  model: '$1'
17037
 
17038
-
17039
  # Xshitou
17040
  Xshitou:
17041
  regex: 'Xshitou[_ ](P7)(?:[);/ ]|$)'
@@ -17062,13 +17694,17 @@ Vodacom:
17062
 
17063
  # VKworld
17064
  VKworld:
17065
- regex: '(?:(?:VK700)-MAX|T5SE)(?:[);/ ]|$)'
17066
  device: 'smartphone'
17067
  models:
17068
  - regex: '(VK700)-MAX(?:[);/ ]|$)'
17069
  model: '$1 Max'
 
 
17070
  - regex: 'T5SE(?:[);/ ]|$)'
17071
  model: 'T5 SE'
 
 
17072
 
17073
  # Mito
17074
  Mito:
@@ -17083,14 +17719,17 @@ Mito:
17083
  device: 'tablet'
17084
  model: '$1'
17085
 
17086
- # TWM
17087
  TWM:
17088
- regex: 'Amazing[ _](X[35]s|X[2356]|A5S|A[48]|A4S)(?:[);/ ]|$)'
17089
  device: 'smartphone'
17090
  models:
17091
  - regex: 'Amazing[ _](X[35])s(?:[);/ ]|$)'
17092
  model: 'Amazing $1S'
17093
- - regex: 'Amazing[ _](A5S|X[2356]|A[48]|A4S)(?:[);/ ]|$)'
 
 
 
17094
  model: 'Amazing $1'
17095
 
17096
  # Onix
@@ -17099,11 +17738,19 @@ Onix:
17099
  device: 'tablet'
17100
  model: '$1'
17101
 
 
 
 
 
 
 
17102
  # Mobo
17103
  Mobo:
17104
- regex: '(MT7-442D)(?:[);/ ]|$)'
17105
  device: 'tablet'
17106
- model: '$1'
 
 
17107
 
17108
  # Macoox
17109
  Macoox:
@@ -17141,23 +17788,29 @@ RED:
17141
 
17142
  # Contixo
17143
  Contixo:
17144
- regex: 'Contixo|(?:CX-1045 3G)(?:[);/ ]|$)'
17145
  device: 'tablet'
17146
  models:
17147
  - regex: 'CX-1045 3G(?:[);/ ]|$)'
17148
  model: 'CX-1045 3G'
17149
  - regex: 'CONTIXO GX 1035(?:[);/ ]|$)'
17150
  model: 'GX-1035 4G 10.1"'
 
 
17151
  - regex: 'B105(?:[);/ ]|$)'
17152
  model: 'B105 3G 10.1"'
17153
  - regex: 'B108(?:[);/ ]|$)'
17154
  model: 'B108 4G 10.1"'
17155
  - regex: 'KT107(?: 3G)?(?:[);/ ]|$)'
17156
  model: 'KT107 3G 10.1"'
 
 
17157
  - regex: 'KT715 3G(?:[);/ ]|$)'
17158
  model: 'KT715 3G 7.0"'
17159
  - regex: 'KT995(?:[);/ ]|$)'
17160
  model: 'KT995 3G 10.1"'
 
 
17161
 
17162
  # E-Ceros
17163
  'E-Ceros':
@@ -17408,7 +18061,7 @@ Asano:
17408
 
17409
  # Phonemax
17410
  Phonemax:
17411
- regex: 'PHONEMAX[_ ](Saturn(?:[_ ]X)?|Mars)(?:[);/ ]|$)'
17412
  device: 'smartphone'
17413
  models:
17414
  - regex: 'PHONEMAX[_ ]Saturn[_ ]X(?:[);/ ]|$)'
@@ -17417,6 +18070,8 @@ Phonemax:
17417
  model: 'Saturn'
17418
  - regex: 'PHONEMAX[_ ]Mars(?:[);/ ]|$)'
17419
  model: 'Mars'
 
 
17420
 
17421
  # Vipro (Vipro Mobile)
17422
  Vipro:
@@ -17488,13 +18143,15 @@ Neomi:
17488
 
17489
  # Eltex (eltex-co.ru)
17490
  Eltex:
17491
- regex: '(?:NV501WAC|NV501)(?:[);/ ]|$)'
17492
  device: 'tv'
17493
  models:
17494
- - regex: 'NV501WAC(?:[);/ ]|$)'
17495
- model: 'NV-501-Wac'
17496
  - regex: 'NV501(?:[);/ ]|$)'
17497
  model: 'NV-501'
 
 
17498
 
17499
  # Senkatel
17500
  Senkatel:
@@ -17508,11 +18165,11 @@ Bobarry:
17508
  device: 'tablet'
17509
  model: 'K10 SE'
17510
 
17511
- # Wortmann
17512
  Wortmann:
17513
- regex: 'TERRA PAD 1004(?:[);/ ]|$)'
17514
  device: 'tablet'
17515
- model: 'Terra Pad 1004'
17516
 
17517
  # BB Mobile
17518
  BB Mobile:
@@ -17557,34 +18214,38 @@ Billion:
17557
  device: 'smartphone'
17558
  model: 'Capture Plus'
17559
 
17560
- # Tele2 (mobile operator)
17561
  Tele2:
17562
- regex: 'Tele2[ _](?:Mi[dn]i[ _][12][\._][10]|Mi[dn]i|Maxi(?:[ _](?:Plus|LTE))?)(?:[);/ ]|$)'
17563
  device: 'smartphone'
17564
  models:
17565
- - regex: 'Tele2[ _]Mini[ _]1[_\.]1(?:[);/ ]|$)'
17566
- model: 'Mini 1.1'
17567
- - regex: 'Tele2[ _]Midi[ _]2[_\.]0(?:[);/ ]|$)'
17568
  model: 'Midi 2.0'
17569
- - regex: 'Tele2[ _](Maxi(?:[_ ](?:Plus|LTE))?)(?:[);/ ]|$)'
17570
  model: '$1'
17571
- - regex: 'Tele2[ _](Midi[ _]1\.1|Mi[dn]i)(?:[);/ ]|$)'
17572
  model: '$1'
17573
 
17574
  # Alfawise
17575
  Alfawise:
17576
- regex: '(A95X_R1)(?:[);/ ]|$)'
17577
  device: 'tv'
17578
- model: '$1'
 
 
 
 
17579
 
17580
  # Klipad
17581
  Klipad:
17582
- regex: 'KLIPAD_|(?:KL-V905|KL4889)(?:[);/ ]|$)'
17583
  device: 'smartphone'
17584
  models:
17585
  - regex: '(?:KLIPAD_)?(V355B?|KL600|KL-V905)(?:[);/ ]|$)'
17586
  model: '$1'
17587
- - regex: '(KL4889)(?:[);/ ]|$)'
17588
  device: 'tablet'
17589
  model: '$1'
17590
 
@@ -17602,15 +18263,19 @@ TurboKids:
17602
 
17603
  # Jinga
17604
  Jinga:
17605
- regex: 'Jinga[-_ ]|(?:Optim4G|PassPlus|PicassoNote|Hotz[_ ]M1|WinPRO|Touch4G|Start3G|IGO[ _]L[41])(?:[);/ ]|$)'
17606
  device: 'smartphone'
17607
  models:
17608
  - regex: 'Optim4G(?:[);/ ]|$)'
17609
  model: 'Optim 4G'
 
 
17610
  - regex: 'Hotz[_ ]M1(?:[);/ ]|$)'
17611
  model: 'Hotz M1'
17612
  - regex: 'PassPlus(?:[);/ ]|$)'
17613
  model: 'Pass Plus'
 
 
17614
  - regex: 'WinPRO(?:[);/ ]|$)'
17615
  model: 'Win Pro'
17616
  - regex: 'Touch4G(?:[);/ ]|$)'
@@ -17623,8 +18288,8 @@ Jinga:
17623
  model: 'Iron'
17624
  - regex: 'Jinga Basco neo(?:[);/ ]|$)'
17625
  model: 'Basco Neo'
17626
- - regex: 'Jinga Basco L3(?:[);/ ]|$)'
17627
- model: 'Basco L3'
17628
  - regex: 'Jinga Trezor S1 Plus(?:[);/ ]|$)'
17629
  model: 'Trezor S1 Plus'
17630
  - regex: 'JINGA_IGO_L2(?:[);/ ]|$)'
@@ -17636,9 +18301,13 @@ Jinga:
17636
 
17637
  # Twoe
17638
  Twoe:
17639
- regex: 'TWOE[-_ ](E450R)(?:[);/ ]|$)'
17640
  device: 'smartphone'
17641
- model: '$1'
 
 
 
 
17642
 
17643
  # iTruck
17644
  iTruck:
@@ -17674,9 +18343,13 @@ Primux:
17674
 
17675
  # iMars
17676
  iMars:
17677
- regex: 'IMARS VEGA X7(?:[);/ ]|$)'
17678
  device: 'smartphone'
17679
- model: 'Vega X7'
 
 
 
 
17680
 
17681
  # Logic
17682
  Logic:
@@ -17716,7 +18389,7 @@ Cloudfone:
17716
 
17717
  # Vsmart
17718
  Vsmart:
17719
- regex: '(?:Joy 1\+|Active 1\+|Bee 3)(?:[);/ ]|$)'
17720
  device: 'smartphone'
17721
  models:
17722
  - regex: 'Joy 1\+(?:[);/ ]|$)'
@@ -17725,18 +18398,19 @@ Vsmart:
17725
  model: 'Active 1 Plus'
17726
  - regex: 'Bee 3(?:[);/ ]|$)'
17727
  model: 'Bee 3'
 
 
17728
 
17729
  # MiXzo
17730
  MiXzo:
17731
- regex: '(?:MiXzo[ _])?(?:ME1023|ME1030|MX1037|MX1024|MX10[24]1)([ _][34]G)?(?:[);/ ]|$)'
17732
  device: 'tablet'
17733
  models:
17734
  - regex: 'MiXzo[_ ]ME(1023|1030)(?:[_ ]3G)(?:[);/ ]|$)'
17735
  model: 'ME$1 3G'
17736
  - regex: 'MiXzo[_ ]MX1021(?:[_ ]3G)?(?:[);/ ]|$)'
17737
  model: 'MX1021 3G'
17738
-
17739
- - regex: '(?:MiXzo[ _])?MX(1037|1041|1024)[ _]4G(?:[);/ ]|$)'
17740
  model: 'MX$1 4G'
17741
 
17742
  # Openbox
@@ -17781,17 +18455,21 @@ Aoson:
17781
 
17782
  # FireFly Mobile
17783
  FireFly Mobile:
17784
- regex: '(AURII[ _](?:Passion|Virtuoso|Secret Lite|FORCE|FUSION|F8[_ ]Premium|XCITE)|INTENSE[ _](?:POWER|METAL_2|XT))(?:[);/ ]|$)'
17785
  device: 'smartphone'
17786
  models:
17787
  - regex: 'AURII[ _]FORCE(?:[);/ ]|$)'
17788
- model: 'AURII Force'
 
 
 
 
17789
  - regex: 'AURII[ _]FUSION(?:[);/ ]|$)'
17790
- model: 'AURII Fusion'
17791
  - regex: 'AURII[ _]XCITE(?:[);/ ]|$)'
17792
- model: 'AURII xCite'
17793
- - regex: '(AURII[ _](?:Passion|Virtuoso|Secret Lite|F8[_ ]Premium))(?:[);/ ]|$)'
17794
- model: '$1'
17795
  - regex: 'INTENSE POWER(?:[);/ ]|$)'
17796
  model: 'Intense Power'
17797
  - regex: 'INTENSE_XT(?:[);/ ]|$)'
@@ -17845,9 +18523,13 @@ Dolamee:
17845
 
17846
  # INVIN
17847
  Invin:
17848
- regex: 'INVIN[ _-](X[24]|KM[67])(?:[);/ ]|$)'
17849
  device: 'tv'
17850
- model: '$1'
 
 
 
 
17851
 
17852
  # Doopro
17853
  Doopro:
@@ -17885,11 +18567,21 @@ Nos:
17885
  - regex: 'NOS Roya(?:[);/ ]|$)'
17886
  model: 'Roya'
17887
 
17888
- # Accent
17889
  Accent:
17890
- regex: 'ACCENT_NEON(?:[);/ ]|$)'
17891
  device: 'smartphone'
17892
- model: 'Neon'
 
 
 
 
 
 
 
 
 
 
17893
 
17894
  # Avenzo (www.avenzo.es)
17895
  Avenzo:
@@ -17903,9 +18595,15 @@ Avenzo:
17903
 
17904
  # Beelink
17905
  Beelink:
17906
- regex: 'Beelink (GT1|LAKE I|SEA I|A1)(?:[);/ ]|$)'
17907
  device: 'tv'
17908
- model: '$1'
 
 
 
 
 
 
17909
 
17910
  # MAXVI
17911
  MAXVI:
@@ -18055,15 +18753,19 @@ Pixelphone:
18055
 
18056
  # Iris
18057
  Iris:
18058
- regex: '(?:Vox[_ ](?:5S|Alpha|POP))(?:[);/ ]|$)'
18059
  device: 'smartphone'
18060
  models:
18061
- - regex: 'Vox_5S'
18062
- model: 'Vox 5S'
18063
  - regex: 'VOX Alpha Plus'
18064
  model: 'Vox Alpha Plus'
 
 
18065
  - regex: 'VOX Alpha'
18066
  model: 'Vox Alpha'
 
 
18067
  - regex: 'VOX POP plus'
18068
  model: 'Vox Pop Plus'
18069
  - regex: 'VOX POP Pro'
@@ -18173,13 +18875,15 @@ eSTAR:
18173
 
18174
  # Hometech
18175
  Hometech:
18176
- regex: 'Ideal (?:10S|Tab [79])(?:[);/ ]|$)'
18177
  device: 'tablet'
18178
  models:
18179
- - regex: '(Ideal (?:10S|Tab 9))'
18180
  model: '$1'
18181
  - regex: 'Ideal Tab 7 Ips( 3G)?'
18182
  model: 'Ideal Tab 7 IPS$1'
 
 
18183
 
18184
  # ExMobile
18185
  ExMobile:
@@ -18217,6 +18921,436 @@ Andowl:
18217
  device: 'tv'
18218
  model: '$1'
18219
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18220
  # Hardkernel (www.hardkernel.com)
18221
  Hardkernel:
18222
  regex: 'ODROID[-]?(C2|U2|XU[34])(?:[);/ ]|$)'
@@ -18234,3 +19368,29 @@ Shtrikh-M:
18234
  regex: 'SHTRIH-SMARTPOS-F2(?:[);/ ]|$)'
18235
  device: 'peripheral'
18236
  model: 'Smartpos F2'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
  ###############
7
 
8
+ # Ace or ACE France (www.acemobile.fr)
9
  Ace:
10
+ regex: '(?:BUZZ [12]|BUZZ 2|CLEVER 1|URBAN 1(?: Pro)?)(?:[);/ ]|$)'
11
+ device: 'smartphone'
12
+ models:
13
+ - regex: 'BUZZ ([12]) Lite'
14
+ model: 'Buzz $1 Lite'
15
+ - regex: 'BUZZ ([12]) Plus'
16
+ model: 'Buzz $1 Plus'
17
+ - regex: 'BUZZ ([12])'
18
+ model: 'Buzz $1'
19
+ - regex: 'CLEVER 1'
20
+ model: 'Clever 1'
21
+ - regex: 'URBAN 1 Pro'
22
+ model: 'Urban 1 Pro'
23
+ - regex: 'URBAN 1'
24
+ model: 'Urban 1'
25
 
26
  'Tunisie Telecom':
27
  regex: 'StarTrail TT(?:[);/ ]|$)'
72
  - regex: '((?:StarShine|StarTrail|STARADDICT|StarText|StarNaute|StarXtrem)[^;/]*) Build'
73
  model: '$1'
74
 
75
+ # HTC (htc.com)
76
  HTC:
77
+ regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G(?:[);/ ]|$)|(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/)]+)(?: Build|\))|(Amaze[ _]4G|(?<!BLU LIFE )One ?[XELSV\+]+)(?:[);/ ]|$)|SPV E6[05]0|(One M8|X525a|PG86100|PC36100|XV6975|PJ83100|2PYB2|2PS64|2PZC5|0PJA10|0PJA2|HTV33|0PM92|0PCV1|601HT|0PAJ5|HTL2[23]|HTV3[12]|2PQ93|X2-HT|EXODUS 1)(?:[);/ ]|$)'
78
  device: 'smartphone'
79
  models:
80
  # explicit smartphone models
116
  model: 'Vox'
117
  - regex: '2PYB2'
118
  model: 'Bolt'
119
+ - regex: '2PS64'
120
+ model: '10'
121
  - regex: '0PM92(?:[);/ ]|$)'
122
  model: 'Desire 626S'
123
  - regex: '0PCV1(?:[);/ ]|$)'
124
  model: 'Desire 510'
125
  - regex: '608t(?:[);/ ]|$)'
126
  model: 'Desire 608t'
127
+ - regex: 'EXODUS 1(?:[);/ ]|$)'
128
+ model: 'Exodus 1'
129
 
130
  - regex: 'NexusHD2' # custom rom for hd2
131
  model: 'HD2'
172
  model: 'One E8'
173
  - regex: 'HTV32(?:[);/ ]|$)'
174
  model: '10'
175
+ - regex: 'HTV31(?:[);/ ]|$)'
176
+ model: 'J Butterfly'
177
 
178
  # microsoft
179
  Microsoft:
516
 
517
  # Apple
518
  Apple:
519
+ regex: '(?:iTunes-)?Apple[ _]?TV|(?:Apple-|iTunes-)?(?<!like )(?:iPad|iPhone)|iPh[0-9],[0-9]|CFNetwork|HomePod|Watch ?OS|Watch1,[12]'
520
  models:
521
  - regex: 'HomePod'
522
  device: 'smart speaker'
523
  model: 'HomePod'
524
 
525
+ - regex: 'Watch1,1'
526
+ device: 'wearable'
527
+ model: 'Watch 38mm'
528
+
529
+ - regex: 'Watch1,2'
530
+ device: 'wearable'
531
+ model: 'Watch 42mm'
532
+
533
+ - regex: 'Watch2,6'
534
+ device: 'wearable'
535
+ model: 'Watch Series 1 38mm'
536
+
537
+ - regex: 'Watch2,7'
538
+ device: 'wearable'
539
+ model: 'Watch Series 1 42mm'
540
+
541
+ - regex: 'Watch2,3'
542
+ device: 'wearable'
543
+ model: 'Watch Series 2 38mm'
544
+
545
+ - regex: 'Watch2,4'
546
+ device: 'wearable'
547
+ model: 'Watch Series 2 42mm'
548
+
549
+ - regex: 'Watch3,[13]'
550
+ device: 'wearable'
551
+ model: 'Watch Series 3 38mm'
552
+
553
+ - regex: 'Watch3,[24]'
554
+ device: 'wearable'
555
+ model: 'Watch Series 3 42mm'
556
+
557
+ - regex: 'Watch([456]),[13]'
558
+ device: 'wearable'
559
+ model: 'Watch Series $1 40mm'
560
+
561
+ - regex: 'Watch([456]),[24]'
562
+ device: 'wearable'
563
+ model: 'Watch Series $1 44mm'
564
+
565
  # specific smartphone devices
566
  - regex: '(?:Apple-)?iPh(?:one)?1[C,_]1'
567
  model: 'iPhone'
638
  - regex: '(?:Apple-)?iPh(?:one)?12[C,_][8]'
639
  model: 'iPhone SE (2020)'
640
  device: 'phablet'
641
+ - regex: '(?:Apple-)?iPh(?:one)?13[C,_][1]'
642
+ model: 'iPhone 12 Mini'
643
+ device: 'smartphone'
644
+ - regex: '(?:Apple-)?iPh(?:one)?13[C,_][2]'
645
+ model: 'iPhone 12'
646
+ device: 'phablet'
647
+ - regex: '(?:Apple-)?iPh(?:one)?13[C,_][3]'
648
+ model: 'iPhone 12 Pro'
649
+ device: 'phablet'
650
+ - regex: '(?:Apple-)?iPh(?:one)?13[C,_][4]'
651
+ model: 'iPhone 12 Pro Max'
652
+ device: 'phablet'
653
 
654
  # specific tablet devices
655
  - regex: '(?:Apple-)?iPad1[C,_]1'
1132
 
1133
  # Aiwa
1134
  Aiwa:
1135
+ regex: '(?:AW790|M300|AWM(?:533|50[19]|561)|AW500)(?:[);/ ]|$)'
1136
  device: 'smartphone'
1137
  models:
1138
  - regex: 'AW790(?:[);/ ]|$)'
1139
  model: 'AW790'
1140
  - regex: 'AW500(?:[);/ ]|$)'
1141
  model: 'AW500'
1142
+ - regex: 'AWM(533|50[19]|561)(?:[);/ ]|$)'
1143
+ model: 'AWM$1'
1144
  - regex: 'M300(?:[);/ ]|$)'
1145
  model: 'M300'
1146
  device: 'phablet'
1184
 
1185
  # Alcatel (alcatelmobile.com)
1186
  Alcatel:
1187
+ regex: 'Alcatel|Alc(?!or )[a-z0-9]+|One[ _]?Touch|idol3|TIMXL|(?:(?:4003[AJ]|4009[ADEFIKMSX]|4013[DEJKMX]|4014[ADEKMX]|4015[ADNTX]|4016[ADX]|4017[ADEFSX]|4018[ADEFMX]|4024[EDX]|4027[ADNX]|4028[AEJS]|4032[ADEX]|4034[ADEFGXTL]|4035[ADXY]|4045[ADEX]|4047[ADFGNX]|4049[DEGMX]|4060[SW]|A466BG|A621BL|4114E|5001[ADJTU]|5002[ADF]|5003[ADGU]|5006D|5007[AU]|5008[ADUYT]|5009[AD]|5010[DEGSUX]|5011A|5012[DFG]|5015[ADEX]|5016[AXJ]|5017[ABDEOX]|5019D|5022[EDX]|5023[EF]|5024[ADJF]|5025[DEG]|5026[ADJ]|5027B|5028[AYD]|5029[EYD]|5030D|5032W|5033[AEFXDJGMOTXYQS]|5034D|5036D|5038[ADEX]|5039[DY]|5041[CD]|5042[ADEFGWXT]|5044[ADGIKOPSTY]|5045[ADFGIJTXY]|5046[ADGIJSTUY]|5047[DIUY]|5048[AYUI]|5049[EGSWZ]|5050[ASXY]|5051[ADEJMTWX]|5052[ADY]|5053[ADKY]|5054[ADNSTWX]|5056[ADEGIJMNTUWX]|5057M|5058[AIY]|5059[ADJXYZIST]|5060[ADJ]|5061[KU]|5065[ADNWX]|5070D|5080[ADFQUX]|5085[ABCDGHIJNOQY]|5086[ADY]|5090[AIY]|5095[IKY]|5098[OS]|5099[ADYUI]|5116J|5145A|6016[ADEX]|6036[AXY]|6037[BKY]|6039[AHJKY]|6042D|6043[AD]|6044D|6045[BFIKOYX]|6050[AFY]|6055[ABDHIKPUYZ]|6058[ADX]|6060S|6062W|6070K|7040[ADEFKRT]|7041[DX]|7042A|7043[AEKY]|7044[AX]|7045Y|7048[ASWX]|7053D|7055A|7070X|7071[ADX]|8030Y|8050[DEGX]|8063|8088[XQ]|9001[DIX]|9002X|9003[AX]|9024O|9005X|9026X|9007[ATX]|9008[ADIJNTUX]|9009G|9010X|9020A|9022X|9027[FTWX]|9203A|A(?:464BG|570BL|50[13]DL|57[17]VL|574BL)|I213|I216X|(?<!\.)80(?:82|6[78]))(?:_(?:EEA|RU))?|P360X)(?:[);/ ]|$)'
1188
  device: 'smartphone'
1189
  models:
1190
  - regex: '5022[EDX]|5070D'
1255
  model: 'One Touch Dawn'
1256
  - regex: '5024[ADF]|5028Y'
1257
  model: '1S'
1258
+ - regex: '7071[ADX]'
1259
+ model: 'A7 XL'
1260
  - regex: '5002[AD]'
1261
  model: '1B (2020)'
1262
+ - regex: '4034T'
1263
+ model: '1E'
1264
  - regex: '5002F'
1265
  model: '1A (2020)'
1266
  - regex: '5034D'
1345
  - regex: '9009G'
1346
  model: '1T'
1347
  device: 'tablet'
1348
+ - regex: '(?!<\.)8082(?:_(?:EEA|RU))?(?:[);/ ]|$)'
1349
+ model: '1T 10'
1350
+ device: 'tablet'
1351
+ - regex: '(?!<\.)806[78](?:_(?:EEA|RU))?(?:[);/ ]|$)'
1352
+ model: '1T 7'
1353
+ device: 'tablet'
1354
  - regex: '9022X'
1355
  model: 'One Touch Pixi 3 8"'
1356
  device: 'phablet'
1465
  model: 'One Touch 813'
1466
  - regex: 'OT871A'
1467
  model: 'One Touch 871A'
1468
+ - regex: 'P360X'
1469
+ model: 'One Touch Pop 10'
1470
  - regex: '(?:Alcatel[ _])?One[ _]?Touch[ _]((?:T[0-9]+|TAB[^/;]+|EVO[78](?:HD)?)) Build'
1471
  device: 'tablet'
1472
  model: 'One Touch $1'
1500
  model: 'Go Flip'
1501
  - regex: '5044[GS]'
1502
  model: 'U50'
1503
+ - regex: '5033[ADXJEFGMOTXYQS]'
1504
  model: '1'
1505
  - regex: '5009[AD]'
1506
  model: '1C'
1507
+ - regex: '5008[ADUYT]'
1508
  model: '1X (2019)'
1509
  - regex: '5007[AU]'
1510
  model: '1V (2020)'
1511
+ - regex: '5003[ADGU]'
1512
  model: '1C (2019)'
1513
  - regex: '5006D'
1514
  model: '3C (2019)'
1520
  model: '1SE (2020)'
1521
  - regex: '5001[ADJTU]'
1522
  model: '1V'
1523
+ - regex: '5059[ADJXYZIT]'
1524
  model: '1X'
1525
  - regex: '5059S'
1526
  model: 'Avalon V'
1527
+ - regex: '5060[ADJ]'
1528
  model: '5V'
1529
  device: 'phablet'
1530
+ - regex: '5052[ADY]|5053[ADKY]'
1531
  model: '3'
1532
  - regex: '5029E'
1533
  model: '3 (2020)'
1537
  model: '3V'
1538
  - regex: '5026[ADJ]'
1539
  model: '3C'
1540
+ - regex: '5039[DY]'
1541
  model: '3L'
1542
  device: 'phablet'
1543
  - regex: '5058[AIY]'
1732
 
1733
  # Allwinner
1734
  Allwinner:
1735
+ regex: '(?:QUAD-CORE A64 p3|ZY-07B|UltraOcta-T8)(?:[);/ ]|$)'
1736
  device: 'tablet'
1737
  models:
1738
  - regex: 'QUAD-CORE A64 p3'
1739
  model: 'A64 QUAD-CORE p3'
1740
  - regex: 'ZY-07B'
1741
  model: 'ZY-07B'
1742
+ - regex: 'UltraOcta-T8'
1743
+ device: 'car browser'
1744
+ model: 'Ultra Octa T8'
1745
 
1746
  # altron
1747
  altron:
1810
  models:
1811
  - regex: 'Numy 3G AX1'
1812
  model: 'Novo 7 Numy AX1 3G'
1813
+ - regex: 'Numy[_ ]?3G[_ ]?Sword'
1814
+ model: 'Numy 3G Sword'
1815
  - regex: 'NOVO10 Spark'
1816
  model: 'Novo 10 Spark'
1817
  - regex: 'AX10PRO'
1824
  model: 'Numy 3G Talos 2'
1825
  - regex: 'NUMY3GAX9(?:[);/ ]|$)'
1826
  model: 'Numy 3G AX9'
1827
+ - regex: 'Numy3G_AX10(?:[);/ ]|$)'
1828
+ model: 'Numy 3G AX10'
1829
  - regex: '(Novo 10 Hero QuadCore)'
1830
  model: '$1'
1831
  - regex: 'Aurora-II'
2058
 
2059
  # Asus
2060
  Asus:
2061
+ regex: 'Asus|Transformer|ZenFone Max|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|(?:K0[01][0-9a-z]|P(?:00[18ACIL]|01[MTVWYZ]|01MA|01T_1|02[13478])(?: Build|\))|X015D|X018D|X003|X00[7ABT]D|Z00D|Z00[MTY]D|Z01[7FGHKMR]D)(?:[);/ ]|$)|G55[023]KL|ZB(631|602|633|55[135]|50[01])KL|ZC(55[134]|520|600)KL|ZA550KL|ZE(5[02]0|620|55[2345])KL|ZD55[23]KL|ZS661KS|ZS(6[0236]0|55[10])KL|ZB(500KG|601KL)|MeMo Pad FHD 10 LTE|Z00[SV]D'
2062
  device: 'smartphone'
2063
  models:
2064
  # explicit tablet models
2158
  - regex: 'ASUS Tablet P1801-T'
2159
  model: 'Transformer AiO P1801 18.4"'
2160
  device: 'tablet'
2161
+ - regex: 'ASUS TAB A8'
2162
+ model: 'TAB A8'
2163
+ device: 'tablet'
2164
 
2165
  # explicit phablet models
2166
  - regex: 'ME371MG(?:[);/ ]|$)'
2182
  # explicit smartphone models
2183
  - regex: '(?:ASUS_)?T00N'
2184
  model: 'PadFone S'
2185
+ - regex: '(?:ASUS_)?T00E'
2186
+ model: 'PadFone Mini'
2187
+ - regex: '(?:ASUS[-_])?T00T'
2188
+ model: 'PadFone X Mini'
2189
  - regex: '(?:ASUS_)?A002(A)?'
2190
  model: 'ZenFone AR'
2191
  - regex: '(?:ASUS_)?A006'
2212
  model: 'ZenFone Lite L1'
2213
  - regex: '(?:ASUS_)Z00YD'
2214
  model: 'Live'
2215
+ - regex: '(?:ASUS_)?(?:Z00[ERLMTW]D|Z011D|ZE500KL)'
2216
  model: 'ZenFone 2 Laser'
2217
  - regex: '(?:ASUS_)?(?:T00[IQ1]|Z01KD)'
2218
  model: 'ZenFone 4'
2307
  - regex: '(?:Asus|Transformer) ((?:Pad |Prime )?TF[0-9a-z]+)'
2308
  device: 'tablet'
2309
  model: 'Transformer $1'
2310
+ - regex: 'Chromebook Flip (C10[01]PA|C302)'
2311
  device: 'desktop'
2312
  model: 'Chromebook Flip $1'
2313
 
2339
 
2340
  # Avvio
2341
  Avvio:
2342
+ regex: 'Avvio[ _]?([a-z0-9\-]+)|CHIVAS_55(?:[);/ ]|$)'
2343
  device: 'smartphone'
2344
  models:
2345
+ - regex: 'CHIVAS_55'
2346
+ model: 'Chivas 55'
2347
  - regex: 'Avvio[ _]PAD'
2348
  model: 'PAD'
2349
  device: 'tablet'
2403
 
2404
  # Blu
2405
  Blu:
2406
+ regex: 'BLU[ _]|(?:blu|Dash)[ _]([^/;)]+)(?: Build|[;)])|(?:Studio (5.0K|5.5|View XL|Mega|C 8\+8|[CM] HD|[CGX]|Selfie LTE|Touch|M5 Plus|J[1258]|X8 HD)|Advance (4.0 ?[LM]|5.[02](?: HD)?|A4|L[45])|ENERGY (DIAMOND|XL)|LIFE XL|B110DL|Dash (?:X[2L]|L3)|PURE XL|Life One X2|Grand M3|GRAND (?:5.5 HD|XL LTE)|R1 (?:HD|PLUS)|Tank Xtreme 5.0|Tank Xtreme Pro|STUDIO SELFIE|Touchbook M7 Pro|DASH X PLUS|C[456] 2019)(?:[);/ ]|$)'
2407
  device: 'smartphone'
2408
  models:
2409
+ - regex: 'Advance (4.0 ?[LM]|4.0|5.[02](?: HD)?|A4|L[54])'
2410
  model: 'Advance $1'
2411
+ - regex: '(?:BLU[_ ])?Studio[ _](5.0 C|5.5|View XL|Mega|C 8\+8|C HD|C|G|Touch|M HD|M5 Plus|J[1258]|X8 HD|X5|XL|X)(?:[);/ ]|$)'
2412
  model: 'Studio $1'
2413
+ - regex: '(?:BLU[_ ])?Studio[ _]5.0 ?K(?:[);/ ]|$)'
2414
+ model: 'Studio 5.0 K'
2415
  - regex: 'STUDIO SELFIE LTE'
2416
  model: 'Studio Selfie LTE'
2417
  - regex: 'STUDIO ONE'
2420
  model: 'Studio Selfie $1'
2421
  - regex: 'STUDIO SELFIE'
2422
  model: 'Studio Selfie'
2423
+ - regex: '(?:BLU[_ ])?NEO_ENERGY_MINI'
2424
+ model: 'Neo Energy Mini'
2425
  - regex: 'ENERGY DIAMOND'
2426
  model: 'Energy Diamond'
2427
  - regex: 'ENERGY XL'
2432
  model: 'Energy X Plus'
2433
  - regex: 'LIFE XL'
2434
  model: 'Life XL'
2435
+ - regex: 'DASH X PLUS'
2436
+ model: 'Dash X Plus'
2437
+ - regex: 'DASH 4.5'
2438
+ model: 'Dash 4.5'
2439
  - regex: 'Dash XL'
2440
  model: 'Dash XL'
2441
  - regex: 'PURE XL'
2442
  model: 'Pure XL'
2443
  - regex: 'Life One X2'
2444
  model: 'Life One X2'
2445
+ - regex: 'LIFE ONE X'
2446
+ model: 'Life One X'
2447
  - regex: 'LIFE ONE'
2448
  model: 'Life One'
2449
+ - regex: 'LIFE MARK'
2450
+ model: 'Life Mark'
2451
  - regex: 'NEO X PLUS'
2452
  model: 'Neo X Plus'
2453
  - regex: 'NEO (XL|X)'
2458
  model: 'Grand X LTE'
2459
  - regex: 'Grand XL LTE'
2460
  model: 'Grand XL LTE'
2461
+ - regex: 'Grand M3'
2462
+ model: 'Grand M3'
2463
  - regex: 'B110DL'
2464
  model: 'View Mega'
2465
  - regex: 'R1 HD'
2466
  model: 'R1 HD'
2467
  - regex: 'R1 PLUS'
2468
  model: 'R1 Plus'
2469
+ - regex: 'C([456]) (2019)'
2470
+ model: 'C$1 ($2)'
2471
  - regex: 'Tank Xtreme 5.0'
2472
  model: 'Tank Xtreme 5.0'
2473
  - regex: 'Tank Xtreme Pro'
2474
  model: 'Tank Xtreme Pro'
2475
  - regex: 'VIVO AIR LTE'
2476
  model: 'Vivo Air LTE'
2477
+ - regex: 'Touchbook G7'
2478
+ model: 'Touchbook G7'
2479
+ - regex: '(?:BLU[_ ])?VIVO[ _]SELFIE'
2480
+ model: 'Vivo Selfie'
2481
 
2482
  - regex: 'Touchbook M7 Pro'
2483
  model: 'Touchbook M7 Pro'
2484
  device: 'tablet'
2485
+ - regex: 'STUDIO 7.0 II'
2486
+ model: 'Studio 7.0" II'
2487
+ device: 'tablet'
2488
 
2489
+ - regex: 'DASH (L[45] LTE|5.0|L[45]X|L3|X2|[LMX])(?:[);/ ]|$)'
2490
  model: 'Dash $1'
2491
+
2492
+ - regex: 'DASH[ _]([^/;]+) Build'
2493
  model: 'Dash $1'
2494
+
2495
+ - regex: 'blu[ _]([^/;]+)( Build|[);])'
2496
  model: '$1'
2497
 
2498
  # Bluegood
2556
 
2557
  # Black Fox
2558
  'Black Fox':
2559
+ regex: 'BMM[ _-]?(?:44[123]D|44[12]S|431D|533D|54[12]S|541[ABW]|54[123]D|543S|531[ABD]|532 S)(?:[);/ ]|$)'
2560
  device: 'smartphone'
2561
  models:
2562
  - regex: 'BMM443D'
2587
  model: 'B3'
2588
  - regex: 'BMM541W'
2589
  model: 'B7R Fox'
2590
+ - regex: 'BMM 532 S'
2591
+ model: 'BMM 532S'
2592
  - regex: 'BMM[ _-]?(533D|431D|54[12]S)(?:[);/ ]|$)'
2593
  model: 'BMM $1'
2594
 
2927
  - regex: 'BENQ(?:[ \-])?([a-z0-9]+)'
2928
  model: '$1'
2929
 
2930
+ # Blaupunkt (blaupunkt.com)
2931
  Blaupunkt:
2932
+ regex: 'Blaupunkt|Soundphone S2|Atlantis[_ ](?:1001A|1010A|A10\.G40[23])|SLplus02|Discovery[_ ](?:A10_302|111C|1000C|1001A?)|Endeavour[_ ](?:785|101[GLM]|1000|1001|101[03]|1100)|Polaris[_ ]803'
2933
  device: 'tablet'
2934
  models:
2935
  - regex: 'Discovery[_ ]111C'
2942
  model: 'Discovery 1001A'
2943
  - regex: 'Discovery[_ ]1001'
2944
  model: 'Discovery 1001'
2945
+ - regex: 'Soundphone S2'
2946
+ model: 'Soundphone S2'
2947
  - regex: 'Endeavour[_ ](101[GLM]|785|100[01]|101[03]|1100)'
2948
  model: 'Endeavour $1'
2949
  - regex: 'Polaris[_ ](803)'
2952
  model: 'Atlantis $1'
2953
  - regex: 'SLplus02'
2954
  model: 'SL Plus 02'
2955
+ - regex: 'Blaupunkt[_ ](SL[_ ]0[124]|SM[_ ]0[12])'
2956
  device: 'smartphone'
2957
  model: '$1'
2958
 
3301
  - regex: 'Aquaris M8'
3302
  model: 'Aquaris M8'
3303
  device: 'tablet'
3304
+ - regex: 'Aquaris_([AM])4.5'
3305
+ model: 'Aquaris $14.5'
3306
  - regex: 'BQ(?:ru)?[_ ]5590(?:[);/ ]|$)'
3307
  model: 'Spring'
3308
  - regex: 'BQ[S]?-(?:6016L|5520)(?:[);/ ]|$)'
3371
  device: 'tablet'
3372
  - regex: '(?:bq )?(Aquaris[^/;]*) Build'
3373
  model: '$1'
3374
+ - regex: 'Aquaris (E(4.5|[56])|M(5|10)|U2 Lite|U2|U (Lite|Plus)|V Plus|X5 Plus|X2? Pro|X[25]|[CMUVX])'
3375
  model: 'Aquaris $1'
3376
  - regex: 'bq ([^/;]+) Build'
3377
  model: '$1'
3379
 
3380
  # Bush
3381
  Bush:
3382
+ regex: 'Bush[ _-]|Bush10Nou'
3383
  device: 'smartphone'
3384
  models:
3385
+ - regex: 'Bush10Nou'
3386
+ device: 'tablet'
3387
+ model: '10Nou'
3388
  - regex: 'BUSH ([^;/)]+)Tablet(?: Build|[);])'
3389
  model: '$1Tablet'
3390
  device: 'tablet'
3430
  regex: 'CASPER[_ ]|VIA[- _](T7D|A[34]|E3|F[123]|G4|M4|[LS]8|S7|P2|V8C|A1_Plus|A1|S10|S|T17_M|T1[07]|T7|T7-3G|T8B|T8D-3G)(?:[);/ ]|$)'
3431
  device: 'smartphone'
3432
  models:
3433
+ - regex: '(?:CASPER[_ ])?VIA[_ ](G1_Plus|G1|E1|[AE]2|M[123]|V[35689]|V10|G3|V6X|A[34]|E3|F[123]|G4|M4|P2|S|V8C|A1_Plus|A1)(?:[);/ ]|$)'
3434
  model: 'VIA $1'
3435
  - regex: 'CASPER_VIA_E1c'
3436
  model: 'VIA E1C'
3446
  - regex: 'VIA[- _](T7D|S10|[LS]8|S7|T17_M|T1[07]|T7|T8B)(?:[);/ ]|$)'
3447
  model: 'VIA $1'
3448
  device: 'tablet'
 
 
3449
 
3450
  # Cat (Caterpillar, Catphones)
3451
  Cat:
3507
 
3508
  # Cherry Mobile
3509
  'Cherry Mobile':
3510
+ regex: 'Cherry|Flare([ _])?(2X|4|A[123]|J[123568]|P[13]|S[4-8]|X2|Y[367]|S Play|HD|LITE|XL|X_V2|Y3s|Tab)(?:[ _](?:Pro|Plus|Max|LTE))?|Fusion Bolt|OMEGA HD 4|Spin Max 2'
3511
  device: 'smartphone'
3512
  models:
3513
+
 
3514
  - regex: '(Flare2X)'
3515
  model: '$1'
3516
+ - regex: 'Flare_HD_([45])'
3517
+ model: 'Flare HD $1'
3518
  - regex: 'Flare_HD_MAX'
3519
  model: 'Flare HD Max'
3520
  - regex: 'FLARE LITE'
3521
  model: 'Flare Lite'
3522
  - regex: 'Flare S Play'
3523
  model: 'Flare S Play'
3524
+ - regex: 'Flare[_ ]J([26])S'
3525
+ model: 'Flare J$1s'
3526
+ - regex: 'Flare_(J2|S7)_Prime'
3527
+ model: 'Flare $1 Prime'
3528
+ - regex: 'Flare_S7_Deluxe'
3529
+ model: 'Flare S7 Deluxe'
3530
+ - regex: 'Flare_S7_Power'
3531
+ model: 'Flare S7 Power'
3532
+ - regex: 'Flare[_ ]Y([367])[_ ]Pro'
3533
+ model: 'Flare Y$1 Pro'
3534
  - regex: 'Flare XL Plus'
3535
  model: 'Flare XL Plus'
3536
  - regex: 'Flare[ _]X[_ ]V2'
3537
  model: 'Flare X V2'
3538
+ - regex: 'Flare[ _](A2|J3|P1|S[467])[ _]Lite'
3539
  model: 'Flare $1 Lite'
3540
+ - regex: 'Flare[ _](J[12]|S[57]|Y3|J6)[ _]mini'
3541
  model: 'Flare $1 Mini'
3542
+ - regex: 'Flare_J2_2018'
3543
+ model: 'Flare J2 (2018)'
3544
  - regex: 'Flare S4 Max LTE'
3545
  model: 'Flare S4 Max LTE'
3546
+ - regex: 'Flare[_ ](S[47]|J2)[_ ]Max'
3547
+ model: 'Flare $1 Max'
3548
  - regex: 'FlareS5LiteDTV'
3549
  model: 'Flare S5 Lite DTV'
3550
+ - regex: 'Flare[_ ](S[567]|J6)[_ ]Plus'
3551
+ model: 'Flare $1 Plus'
 
 
3552
  - regex: 'FLARE S6 POWER'
3553
  model: 'Flare S6 Power'
3554
+ - regex: 'Flare(?:[ _])?(4|A[123]|J8 LTE|J[13568]|P[13]|S[4-8]|X2|Y3s|Y7_LTE|Y[673])'
3555
  model: 'Flare $1'
3556
  - regex: 'OMEGA HD 4'
3557
  model: 'Omega HD 4'
3558
+ - regex: 'Spin Max 2'
3559
+ model: 'Spin Max 2'
3560
+ - regex: '(Fusion Bolt|Flare Tab Pro|Flare Tab)'
3561
  model: '$1'
3562
  device: 'tablet'
3563
 
3564
+ - regex: 'Cherry(?:[ _]?Mobile)?[ _]?([^/;]+)(?: Build|[);])'
3565
+ model: '$1'
3566
+
3567
  # China Mobile
3568
  'China Mobile':
3569
  regex: '(M812C|1501_M02|9930i|A1303|A309W|M651CY) Build'
3589
  model: 'CT701G Plus'
3590
  device: 'tablet'
3591
 
3592
+ - regex: 'Comio[ _-]?([^;/)]+)(?: Build|[);])'
 
 
3593
  model: '$1'
3594
 
3595
  # Compal
3600
 
3601
  # Artel
3602
  Artel:
3603
+ regex: 'Artel[_ ]|\w+_ARTEL_\w+|GAP YOQ(?:[);/ ]|$)'
3604
  device: 'smartphone'
3605
  models:
3606
+ - regex: 'GAP YOQ(?:[);/ ]|$)'
3607
+ model: 'Gap Yo Q'
3608
  - regex: 'Artel[_ ](Quadro(?: Pro)?|Tesla|Air|Tomchi|Premium|U3_4G|Z5|Sentinel (?:X 8G|X D5|X))'
3609
  model: '$1'
3610
  - regex: 'Artel[_ ]Komi3'
3619
 
3620
  # ComTrade Tesla
3621
  ComTrade Tesla:
3622
+ regex: 'Tesla|Impulse 7.85 3G|Impulse 10.1 OCTA|Smartphone_6.1|SP(?:6.2|6.2_Lite)|TTL(?:713G|8)'
3623
  device: 'smartphone'
3624
  models:
3625
  - regex: 'TeslaEvo5.0'
3630
  - regex: '(Impulse 7.85 3G)'
3631
  model: '$1'
3632
  device: 'tablet'
3633
+ - regex: 'Impulse 10.1 OCTA'
3634
+ model: 'Impulse 10.1" OCTA'
3635
+ device: 'tablet'
3636
  - regex: 'Tesla_SP([^/;]+)L Build'
3637
  model: 'Smartphone $1 Lite'
3638
  - regex: 'Smartphone_6.1'
3770
  model: 'Griffe T7'
3771
  - regex: 'Griffe T8 Plus'
3772
  model: 'Griffe T8 Plus'
3773
+ - regex: 'Griffe T8'
3774
+ model: 'Griffe T8'
3775
  - regex: 'Griffe T9'
3776
  model: 'Griffe T9'
3777
  - regex: 'PGN\-?522'
3806
  model: 'Plume L1'
3807
  - regex: 'Plume L2 Pro'
3808
  model: 'Plume L2 Pro'
3809
+ - regex: 'Plume L2'
3810
+ model: 'Plume L2'
3811
  - regex: 'Plume L3 Plus'
3812
  model: 'Plume L3 Plus'
3813
+ - regex: 'Plume L3 Smart'
3814
+ model: 'Plume L3 Smart'
3815
+ - regex: 'Plume L3'
3816
+ model: 'Plume L3'
3817
  - regex: 'Plume P8 Pro'
3818
  model: 'Plume P8 Pro'
3819
 
3822
 
3823
  # Coolpad
3824
  Coolpad:
3825
+ regex: '(?:YL-)?Coolpad|(?:Cool_9S|1824-S0|8190Q|1831-A0|8676-[AM]01|CP8298_I00|CP3648A|CP8676_I0[23]|REVVLPLUS C3701A|VCR-[AI]0|C105-E0|C106-[79]| C106|MTS-T0|cp3705A[S]?|ORL-C0|DLS-E0|8298-M02|5560S)(?:[);/ ]|$)|(8295|5860S) Build'
3826
  device: 'smartphone'
3827
  models:
3828
  - regex: 'VCR-[AI]0'
3836
  model: '8190Q'
3837
  - regex: 'DLS-E0(?:[);/ ]|$)'
3838
  model: 'N5'
3839
+ - regex: '1824-S0(?:[);/ ]|$)'
3840
+ model: 'N5C'
3841
  - regex: 'CP3705A[S]?(?:[);/ ]|$)'
3842
  model: 'Legacy'
3843
  - regex: 'CP3648A(?:[);/ ]|$)'
3874
  regex: 'Clarmin'
3875
  device: 'smartphone'
3876
  models:
3877
+ - regex: 'Clarmin[_ ](B6|C1)'
3878
+ model: '$1'
3879
 
3880
  # Cricket
3881
  Cricket:
3907
  - regex: 'Trekker-([MSX][1234](?: Core)?)'
3908
  model: 'Trekker-$1'
3909
 
3910
+ # AllDocube (alldocube.com)
3911
  AllDocube:
3912
+ regex: '(?:T1001XS?|T1006S?|iPlay_20|U1006H?)(?:[);/ ]|$)'
3913
  device: 'tablet'
3914
  models:
3915
  - regex: 'T1001XS(?:[);/ ]|$)'
3916
  model: 'M5XS'
3917
+ - regex: 'T1006S(?:[);/ ]|$)'
3918
+ model: 'M5S'
3919
+ - regex: 'T1006(?:[);/ ]|$)'
3920
+ model: 'M5'
3921
  - regex: 'T1001X(?:[);/ ]|$)'
3922
  model: 'M5X'
3923
  - regex: 'U1006H?(?:[);/ ]|$)'
4093
  device: 'tablet'
4094
  model: 'Geodroid A5'
4095
 
4096
+ # Denver Electronics (denver-electronics.com)
4097
  Denver:
4098
  regex: '(?:TA[CDQ]-[0-9]+)|P(?:.+)TAQ-(?:[0-9]+)'
4099
  device: 'tablet'
4100
  models:
4101
+ - regex: 'P(?:.+)TAQ-(10213GMK2|10172MK3|10242MK2|70242MK2|[0-9]+)(?:[);/ ]|$)'
4102
  model: 'TAQ-$1'
4103
  - regex: '(TA[CDQ]-[0-9]+)'
4104
  model: '$1'
4140
 
4141
  # DEXP
4142
  DEXP:
4143
+ regex: 'DEXP|(?:Ursus|Ixion)[ _]([^;/)]+)|H135[ _]Build|Larus_TV1|IxionML4.7|M150Storm|(?:SENIOR|F4[38]D8000K|VA[12]10|VA170|ML450|MS[56]50|BL[123]50|BS155|BS160|BS[1256]50|AL[12]40|AL[23]50|AS155|AS260|GS15[035]| (?:N280i|P380i|R110|B450|B340|A1[45]0|AS160|GL355))(?:[);/ ]|$)'
4144
  device: 'smartphone'
4145
  models:
4146
  - regex: 'Ixion[_ ]([^;/]+)(?: Build|\))'
4180
  - regex: 'H135[ _]Build'
4181
  model: 'Atlas'
4182
  device: 'desktop'
4183
+ - regex: '(BL[123]50|BS155|BS160|BS[1256]50|AL[12]40|A1[45]0|GS15[035]|AS160|GL355)(?:[);/ ]|$)'
4184
  model: '$1'
4185
  - regex: 'DEXP[ _]([^;/]+) Build'
4186
  model: '$1'
4227
 
4228
  # Digiland
4229
  Digiland:
4230
+ regex: '(?:DL1008M|DL1023)(?:[);/ ]|$)'
4231
+ device: 'tablet'
4232
  models:
4233
  - regex: 'DL1008M'
 
4234
  model: 'DL1008M'
4235
+ - regex: 'DL1023'
4236
+ model: 'DL1023'
4237
 
4238
  # Digma
4239
  Digma:
4445
 
4446
  # DNS
4447
  DNS:
4448
+ regex: '(?:DNS|AirTab)[ _\-]([^;/)]+)|(?:S4505M|S4004M|SD01M)(?:[);/ ]|$)'
4449
  device: 'smartphone'
4450
  models:
4451
  - regex: '(?:DNS[_ ])?(S4505M|S4004M|SD01M|S4502|S4003|S4003)(?:[);/ ]|$)'
4452
  model: '$1'
4453
+ - regex: 'AirTab[ _\-]([^;/]+)(?: Build|[);])'
4454
  model: 'AirTab $1'
4455
  device: 'tablet'
4456
+ - regex: 'DNS[ _\-]([^;/]+)(?: Build|[);])'
4457
  model: '$1'
4458
 
4459
  # E-Boda
4492
 
4493
  # Echo Mobiles
4494
  Echo Mobiles:
4495
+ regex: 'ECHO[ _](HOLI|HORIZON|MAX|MOSS|NOTE|POWER|SMART|DUNE|JAVA|FUSION)|HORIZON_M|Stellar 3G|FEELING'
4496
  device: 'smartphone'
4497
  models:
4498
  - regex: 'ECHO_HORIZON_LITE'
4499
  model: 'HORIZON Lite'
4500
+ - regex: '(HORIZON_M|FEELING)(?:[);/ ]|$)'
4501
  model: '$1'
4502
+ - regex: 'STELLAR 3G'
4503
+ model: 'STELLAR 3G'
4504
  - regex: 'ECHO_SMART_4G'
4505
  model: 'SMART 4G'
4506
+ - regex: 'ECHO[ _](HOLI|MAX|MOSS|NOTE|POWER|SMART|DUNE|JAVA|FUSION)'
4507
  model: '$1'
4508
 
4509
  # ECS
4553
  model: 'P6000 01'
4554
  - regex: 'P6000 ?Pro(?:[);/ ]|$)'
4555
  model: 'P6000 Pro'
4556
+ - regex: '(?:Elephone[ _])?(P[768]000|S2)(?:[);/ ]|$)'
4557
  model: '$1'
4558
+ - regex: 'Elephone[ _\-]([^/;]+)(?: Build|[;)])'
4559
  model: '$1'
4560
+
4561
  # Element
4562
  Element:
4563
  regex: 'AFTRS'
4671
 
4672
  # Sony & Sony Ericsson (combined as they are mixed up)
4673
  Sony:
4674
+ regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|(?:[4-9]0[12])SO|C1[569]0[45]|C2[01]0[45]|C230[45]|C530[236]|C550[23]|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D240[36]|D25(?:02|33)|D510[236]|D530[36]|D5316|D5322|D5503|D58[03]3|D65(?:0[23]|43|63)|D66[03458]3|D66[14]6|D6708|E(?:20[0345]3|2006|210[45]|2115|2124|230[36]|2312|23[356]3|530[36]|53[3456]3|5506|55[356]3|56[46305][36]|58[02]3|65[35]3|66[0358]3|68[358]3)|I[34]312|I4332|F311[12356]|F331[13]|F321[12356]|F5[13]21|F5122|F813[12]|F833[12]|G312[135]|G311[26]|G322[136]|G3212|G331[123]|G3412|G3416|G342[136]|G823[12]|G834[123]|G8[14]4[12]|H(?:3113|3123|3133|3213|3223|3311|3321|4113|4133|4213|4233|4311|4331|4413|4433|82[167]6|83[12]4|8416|9436)|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]+[0-9]*(?: Build|\))|X?L39H|XM50[ht]|W960|portalmmm/2\.0 K|S3[69]h|SOG01|SOL2[246]|SOV3[1-9]|SOV4[0-3]|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[12]C|[345]D|[234]E|[1-5]F|[1-5]G|[1-4]H|[1-4]J|[1-5]K|1M|[1-3]L)|R800[aix]|J3173|J82[17]0|J9110|J92[16]0|J81[17]0|I[34]113|I3[12]23|I42[19]3|H9493|H8296|H8166|H4493|LiveWithWalkman|BRAVIA|SGP771|E3 Dual|A001SO|I4193|E6508|SOT31|SO-[45]1A|SO-52A|XQ-A[DT]51|XQ-AT42|XQ-AU42|XQ-AS72|XQ-A[TSU]52|SOL25|SOG02|A002SO|NW-A100Series'
4675
  device: 'smartphone'
4676
  models:
4677
  # SONY ERICSSON: explicit smartphone models
4809
  model: 'Xperia 10'
4810
  - regex: '(?:Sony(?:Ericsson)?)?J3173(?:[);/ ]|$)'
4811
  model: 'Xperia Ace'
4812
+ - regex: '(?:A001SO|XQ-A[TU]52|XQ-AU42|SO-41A|SOV43)(?:[);/ ]|$)'
4813
  model: 'Xperia 10 II'
4814
  - regex: '(?:Sony(?:Ericsson)?)?I(?:42[19]3|3223)'
4815
  model: 'Xperia 10 Plus'
4827
  model: 'Xperia 5 Dual'
4828
  - regex: '(?:Sony(?:Ericsson)?)?(?:J82[17]0|SO-01M|SOV41|901SO)'
4829
  model: 'Xperia 5'
4830
+ - regex: '(?:Sony(?:Ericsson)?)?(?:SOG02|A002SO|XQ-AS[75]2|SO-52A)'
4831
  model: 'Xperia 5 II'
4832
  - regex: '(?:Sony(?:Ericsson)?)?(?:SOV42|902SO)'
4833
  model: 'Xperia 8'
4957
  - regex: 'Xperia Z2 Tablet Wifi'
4958
  model: 'Xperia Z2 Tablet WiFi'
4959
  device: 'tablet'
4960
+ - regex: 'SGP561'
4961
+ model: 'Xperia Z2 Tablet'
4962
+ device: 'tablet'
4963
  - regex: '(?:Sony(?:Ericsson)?)?(?:D65(?:0[23]|43)|SO-03F)|Xperia Z2(?:[);/ ]|$)'
4964
  model: 'Xperia Z2'
4965
  - regex: 'D6563'
5300
 
5301
  # Explay
5302
  Explay:
5303
+ regex: 'Explay|[\w]+-EXPLAY-FIN|ActiveD[ _]|Atlant |Informer[ _][0-9]+|CinemaTV 3G|Surfer[ _][0-9\.]|sQuad[ _][0-9\.]|Onliner[1-3]|RioPlay|Leader|Infinityll|Imperium[78]|Indigo'
5304
  device: 'tablet'
5305
  models:
5306
  - regex: 'ActiveD[ _]7.4[ _]3G'
5324
  - regex: 'Atlant(?:[);/ ]|$)'
5325
  device: 'smartphone'
5326
  model: 'Atlant'
5327
+ - regex: 'Indigo(?:[);/ ]|$)'
5328
+ device: 'smartphone'
5329
+ model: 'Indigo'
5330
 
5331
  - regex: '[\w]+-EXPLAY-FIN'
5332
  device: 'feature phone'
5350
  models:
5351
  - regex: 'Playpad 3G GOO'
5352
  model: 'Play Pad 3G Goo'
5353
+ - regex: 'Play Pad 3G 2Goo'
5354
+ model: 'Play Pad 3G 2Goo'
5355
  - regex: 'Play Pad PRO'
5356
  model: 'Play Pad Pro'
5357
  - regex: 'PLAY_PAD_PRO_XL'
5475
 
5476
  # Fujitsu
5477
  Fujitsu:
5478
+ regex: '(?:F-01[FHJKL]|F-02[EFGHLK]|F-03[DEFGKHL]|F-04[EGHKJ]|F-05[DEFJ]|F-06[EF]|F-07[DE]|F-08D|F-09[DE]|F-10D|F-[45]1A|F-42A|F-11D|F-12C|M532|FARTM933KZ|901FJ|arrows(?:RX|M03|M0[45](?:-PREMIUM)?)|801FJ|FJL21)(?:[);/ ]|$)'
5479
  device: 'smartphone'
5480
  models:
5481
  - regex: 'F-51A(?:[);/ ]|$)'
5484
  model: 'Arrows NX F-01F'
5485
  - regex: 'F-01L(?:[);/ ]|$)'
5486
  model: 'Easy Phone F-01L'
5487
+ - regex: 'F-06F(?:[);/ ]|$)'
5488
+ model: 'Easy Phone F-06F'
5489
  - regex: 'F-03K(?:[);/ ]|$)'
5490
  model: 'Easy Phone F-03K'
5491
+ - regex: 'F-42A(?:[);/ ]|$)'
5492
+ model: 'Easy Phone F-42A'
5493
+ - regex: 'F-03L(?:[);/ ]|$)'
5494
+ model: 'Arrows Phone F-03L'
5495
  - regex: 'F-01J(?:[);/ ]|$)'
5496
  model: 'Arrows NX F-01J'
5497
  - regex: 'F-01K(?:[);/ ]|$)'
5502
  model: 'Arrows X F-02E'
5503
  - regex: 'F-02G(?:[);/ ]|$)'
5504
  model: 'Arrows NX F-02G'
5505
+ - regex: 'FJL21(?:[);/ ]|$)'
5506
+ model: 'Arrows EF FJL21'
5507
  - regex: 'F-02H(?:[);/ ]|$)'
5508
  model: 'Arrows NX F-02H'
5509
  - regex: 'F-03D(?:[);/ ]|$)'
5563
  - regex: 'arrowsM(0[45])(?:[);/ ]|$)'
5564
  model: 'Arrows M$1'
5565
 
5566
+ - regex: '(F-0[32]F|F-03G|F-04H|F-05E|F-02K)(?:[);/ ]|$)'
5567
+ model: 'Arrows Tab $1'
 
 
 
 
 
 
 
 
 
5568
  device: 'tablet'
5569
  - regex: 'FARTM933KZ'
5570
  model: 'Arrows Tab M504/HA4'
5595
 
5596
  # General Mobile
5597
  General Mobile:
5598
+ regex: 'GM 5 Plus|GM8 go|GM [68] d|GM 8|General Mobile 4G|GM 9 (?:Pro|Plus)'
5599
  device: 'smartphone'
5600
  models:
5601
  - regex: 'GM 5 Plus'
5606
  model: 'GM 8'
5607
  - regex: 'GM8 go'
5608
  model: 'GM 8 Go'
5609
+ - regex: 'GM 9 Pro'
5610
+ model: 'GM 9 Pro'
5611
+ - regex: 'GM 9 Plus'
5612
+ model: 'GM 9 Plus'
5613
  - regex: 'General Mobile 4G Dual'
5614
  model: '4G Dual'
5615
  - regex: 'General Mobile 4G'
5640
 
5641
  # Gigabyte
5642
  Gigabyte:
5643
+ regex: 'GSmart[ _][a-z0-9 ]+(?: Build|\))|Gigabyte-[a-z0-9]+|Simba SX1|GSmart_Classic_Lite|Classic[_ ](?:Joy|Pro)'
5644
  device: 'smartphone'
5645
  models:
5646
+ - regex: '(GSmart[ _][a-z0-9 ]+)(?: Build|[);])'
5647
  model: '$1'
5648
  - regex: 'Gigabyte-([a-z0-9]+)'
5649
  model: '$1'
5650
+ - regex: '(Classic[ _](?:Joy|Pro)|GSmart_Classic_Lite)'
5651
  model: '$1'
5652
  - regex: 'Simba SX1'
5653
  model: 'GSmart Simba SX1'
5654
 
5655
  # Gigaset
5656
  Gigaset:
5657
+ regex: 'Gigaset|(?: GS80|GS1[0189]0|GS1[89]5|GS2[89]0|GS5[357]-6|GS[23]70(?:_Plus)?)(?:[);/ ]|$)'
5658
  device: 'smartphone'
5659
  models:
5660
  - regex: 'Gigaset QV(1030|830)'
5663
 
5664
  - regex: 'G(S[23]70)[_ ]Plus(?:[);/ ]|$)'
5665
  model: 'G$1 Plus'
5666
+ - regex: 'GS([23]70|1[0189]0|1[89]5|2[89]0|80)(?:[);/ ]|$)'
5667
  model: 'GS$1'
5668
  - regex: 'GS57-6'
5669
  model: 'ME Pro'
5834
  model: 'Pixel 3a'
5835
  - regex: 'Pixel 4 XL'
5836
  model: 'Pixel 4 XL'
5837
+ - regex: 'Pixel 4a \(5G\)'
5838
+ model: 'Pixel 4a (5G)'
5839
  - regex: 'pixel 4a'
5840
  model: 'Pixel 4a'
5841
  - regex: 'G011A'
6049
  regex: 'Homtom|(?:HT[0-9]{1,2})(?: ?Pro)?(?:[);/ ]|$)'
6050
  device: 'smartphone'
6051
  models:
6052
+ - regex: '(?:Homtom[_ ])?HT ?([0-9]{1,2}(?: ?Pro)?)(?:[);/ ]|$)'
6053
  model: 'HT$1'
6054
  - regex: 'Homtom ([^;/]+) Build'
6055
  model: '$1'
6065
 
6066
  # Hoozo
6067
  Hoozo:
6068
+ regex: '(?:HOOZO[_ ](MT232|MT116|MT Pad 116 LTE|X1001)|HZ0010)(?:[);/ ]|$)'
6069
  device: 'tablet'
6070
+ models:
6071
+ - regex: 'HOOZO[_ ](MT232|MT116|MT Pad 116 LTE|X1001)(?:[);/ ]|$)'
6072
+ model: '$1'
6073
+ - regex: '(HZ0010)(?:[);/ ]|$)'
6074
+ model: '$1'
6075
 
6076
  # Minix (minix.us)
6077
  Minix:
6101
 
6102
  # Huawei
6103
  Huawei:
6104
+ regex: '(HW-)?(?:Huawei|MediaPad T1|Ideos|Honor[ _]?|(?:(?:AGS|AGS2|ALE|ALP|AMN|ANE|ARE|ARS|ASK|ATH|ATU|AUM|BAC|BAH[23]?|BG2|BGO|B[ZK]K|BKL|BL[ALN]|BND|BTV|CA[GMNZ]|CH[CM]|CHE[12]?|CLT|CMR|COL|COR|CPN|CRO|CRR|CUN|DIG|DLI|DRA|DUA|DUB|DUK|EDI|ELE|EML|EVA|EVR|FDR|FIG|FLA|FRD|GEM|GRA|HDN|HLK|HMA|Hol|HRY|HWI|H[36]0|INE|JAT|JDN|JDN2|JKM|JMM|JSN|KII|KIW|KNT|KOB|KSA|LDN|LEO|LIO|LLD|LND|LON|LRA|LUA|LY[AO]|MAR|MHA|MRD|MYA|NCE|NEM|NEO|NXT|PAR|PCT|PIC|PLE|PLK|POT|PRA|RIO|RNE|RVL|SCC|SCL|SCM|SEA|SHT|SLA|SNE|SPN|STF|STK|TAG|TIT|TNY|TRT|VCE|VEN|VIE|VKY|VNS|VOG|VRD|VTR|WAS|YAL|G(?:527|620S|621|630|735)|Y(?:221|330|550|6[23]5))-(?:[A-Z]{0,2}[0-9]{1,4}[A-Z]{0,3}?)|H1711|U(?:8230|8500|8661|8665|8667|8800|8818|8860|9200|9508))(?:[);/ ]|$))|hi6210sft|PE-(UL00|TL[12]0|TL00M)|T1-(A21[Lw]|A23L|701u|823L)|G7-(?:L01|TL00)|HW-01K|JNY-(LX[12]|AL10)|OXF-AN[01]0|TAS-(A[LN]00|L29|TL00)|WLZ-(AL10|AN00)|NIC-LX1A|MRX-(AL09|W09)|CDY-(?:[AT]N00|AN90|NX9A)|GLK-(?:[AT]L00|LX1U)|JER-[AT]N10|ELS-(?:[AT]N[10]0|NX9|N39|N04)|AKA-(AL10|L29)|MON-(W|AL)19|BMH-AN[12]0|AQM-([AT]L[01]0|LX1)|MOA-(AL[02]0|LX9N)|NTS-AL00|ART-(?:[AT]L00[xm]|L29N?|L28)|JEF-(?:[AT]N00|AN20)|MED-(?:[AT]L00|LX9N?)|EBG-AN[01]0|ANA-(?:[AT]N00|NX9)|BZ[AK]-W00|BZT-(W09|AL[01]0)|HDL-(AL09|W09)|HWV3[123]|HW-02L|TEL-[AT]N(?:00a?|10)|KKG-AN00|MXW-AN00|JKM-AL00[ab]|TAH-(?:N29|AN00)m|C8817D|T1-821W|d-01[JK]|d-02[HK]|KRJ-W09|HWT31|Y320-U10|Y541-U02|VAT-L19|70[14]HW|60[58]HW|NOH-(?:NX9|AN00)|TNNH-AN00|LIO-(?:[TA]L00|[LN]29|AN00)|KOB2-[LW]09|PPA-LX2|AGS3-L09|DNN-LX9|NEY-NX9|LON-AL00|HLK-L41|503HW'
6105
  device: 'smartphone'
6106
  models:
6107
  - regex: 'POT-[TA]L00a(?:[);/ ]|$)'
6166
  model: 'Enjoy 8e'
6167
  - regex: 'MRD-[TA]L00(?:[);/ ]|$)'
6168
  model: 'Enjoy 9e'
6169
+ - regex: 'DVC-TN20(?:[);/ ]|$)'
6170
+ model: 'Enjoy 20 Pro'
6171
  - regex: 'U8665(?:[);/ ]|$)'
6172
  model: 'Fusion 2'
6173
  - regex: 'MED-LX9N?(?:[);/ ]|$)'
6226
  model: 'Honor 4A'
6227
  - regex: '(?:Honor_|HW-)?CHM-U01(?:_TD)?(?:[);/ ]|$)'
6228
  model: 'Honor 4C'
6229
+ - regex: 'Honor 4c Pro(?:[);/ ]|$)'
6230
+ model: 'Honor 4C Pro'
6231
  - regex: 'AQM-AL10(?:[);/ ]|$)'
6232
  model: 'Honor 4T Pro'
6233
  - regex: '(CHE2?-[UT]L00[HM]?|CHE1-CL[12]0|CHE2-L(?:1[12]|23)|Che1-L04|CHE-TL00)(?:[);/ ]|$)'
6286
  model: 'Honor 8A Pro'
6287
  - regex: 'BKK-(?:AL[10]0|L21|L22|LX2|TL00)(?:[);/ ]|$)'
6288
  model: 'Honor 8C'
6289
+ - regex: 'KSA-(LX[239]|AL00)(?:[);/ ]|$)'
6290
  model: 'Honor 8S'
6291
  - regex: 'JSN-L(?:2[123]|42)|JSN-[TA]L00[a]?(?:[);/ ]|$)'
6292
  model: 'Honor 8X'
6293
+ - regex: 'ARE-(?:AL[10]0|L22(?:HN)?|TL00)(?:[);/ ]|$)'
6294
  model: 'Honor 8X Max'
6295
+ - regex: 'STF-(?:AL[10]0|L09S?|TL10)(?:[);/ ]|$)'
6296
  model: 'Honor 9'
6297
  - regex: 'MOA-LX9N(?:[);/ ]|$)'
6298
  model: 'Honor 9A'
6306
  model: 'Honor 9S'
6307
  - regex: 'HLK-AL00a?(?:[);/ ]|$)'
6308
  model: 'Honor 9X'
6309
+ - regex: 'HLK-(?:AL10|L41)(?:[);/ ]|$)'
6310
  model: 'Honor 9X Pro'
6311
  - regex: 'CAM-UL00(?:[);/ ]|$)'
6312
  model: 'Honor Holly 3'
6340
  model: 'Honor Play 7'
6341
  - regex: 'JAT-[AT]L00(?:[);/ ]|$)'
6342
  model: 'Honor Play 8A'
6343
+ - regex: 'MOA-AL[02]0(?:[);/ ]|$)'
6344
  model: 'Honor Play 9A'
6345
  - regex: 'BKL-(?:AL00|AL20|AL30|L09|TL10)(?:[);/ ]|$)'
6346
  model: 'Honor V10'
6408
  model: 'Mate 30 Pro'
6409
  - regex: 'LIO-N29(?:[);/ ]|$)'
6410
  model: 'Mate 30 Pro 5G'
6411
+ - regex: 'NOH-(?:NX9|AN00)(?:[);/ ]|$)'
6412
+ model: 'Mate 40 Pro'
6413
  - regex: 'NXT-(?:AL10|L29)(?:[);/ ]|$)'
6414
  model: 'Mate 8'
6415
  - regex: 'MHA-(?:L[02]9|[AT]L00)(?:[);/ ]|$)'
6416
  model: 'Mate 9'
6417
  - regex: 'BLL-L23(?:[);/ ]|$)'
6418
  model: 'Mate 9 Lite'
6419
+ - regex: 'LON-(?:AL00(?:-PD)?|L29)(?:[);/ ]|$)'
6420
  model: 'Mate 9 Pro'
6421
  - regex: 'NEO-AL00(?:[);/ ]|$)'
6422
  model: 'Mate RS'
6456
  model: 'Nova 5'
6457
  - regex: 'SEA-AL10(?:[);/ ]|$)'
6458
  model: 'Nova 5 Pro'
6459
+ - regex: 'GLK-(?:[AT]L00|LX1U)(?:[);/ ]|$)'
6460
  model: 'Nova 5i'
6461
  - regex: 'SPN-TL00(?:[);/ ]|$)'
6462
  model: 'Nova 5i Pro'
6522
  model: 'P40 Pro Plus'
6523
  - regex: 'GRA-(?:L09|UL00)(?:[);/ ]|$)'
6524
  model: 'P8'
6525
+ - regex: '(?:ALE-L(?:02|21|23)|ALE-UL00|ALE-TL00|503HW)(?:[);/ ]|$)'
6526
  model: 'P8 Lite (2015)'
6527
  - regex: '(?:PRA-L(?:A1|X2|X1|X3)|hi6210sft)(?:[);/ ]|$)'
6528
  model: 'P8 Lite (2017)'
6568
  model: 'Y5 Pro (2017)'
6569
  - regex: 'CUN-(?:L(?:0[123]|2[123]|33)|U29)(?:[);/ ]|$)'
6570
  model: 'Y5II'
6571
+ - regex: '(?:SCC-U21|SCL-U31)(?:[);/ ]|$)'
6572
  model: 'Y6'
6573
  - regex: 'MYA-L11(?:[);/ ]|$)'
6574
  model: 'Y6 (2016)'
6596
  model: 'Y7 (2017)'
6597
  - regex: 'LDN-L(?:01|X3)(?:[);/ ]|$)'
6598
  model: 'Y7 (2018)'
6599
+ - regex: '(?:HUAWEI[ _]?)?DUB-(?:LX[13]|TL00)(?:[);/ ]|$)'
6600
  model: 'Y7 (2019)'
6601
  - regex: '(LDN-(?:AL00|L21)|TRT-TL10)(?:[);/ ]|$)'
6602
  model: 'Y7 Prime'
6606
  model: 'Y7 Pro (2019)'
6607
  - regex: 'DUB-AL20(?:[);/ ]|$)'
6608
  model: 'Y7 Pro (2019)'
6609
+ - regex: 'ART-L28(?:[);/ ]|$)'
6610
+ model: 'Y7p'
6611
  - regex: 'AQM-LX1(?:[);/ ]|$)'
6612
  model: 'Y8p'
6613
  - regex: 'FLA-(LX[123]|AL20|TL10)(?:[);/ ]|$)'
6635
  - regex: 'JDN-(?:AL00|W09)(?:[);/ ]|$)'
6636
  model: 'Honor Pad 2'
6637
  device: 'tablet'
6638
+ - regex: 'KRJ-W09(?:[);/ ]|$)'
6639
+ model: 'Honor Pad V6'
6640
+ device: 'tablet'
6641
  - regex: 'MON-(W|AL)19(?:[);/ ]|$)'
6642
  device: 'tablet'
6643
  model: 'MatePad C5 8'
6689
  - regex: '(AGS2-AL00|JDN2-W09)HN(?:[);/ ]|$)'
6690
  device: 'tablet'
6691
  model: 'Honor Tab 5'
6692
+ - regex: 'AGS2-(?:[LW]09|W19|L03)(?:[);/ ]|$)'
6693
  device: 'tablet'
6694
  model: 'MediaPad T5 10'
6695
  - regex: 'KOB2-[LW]09(?:[);/ ]|$)'
6696
  device: 'tablet'
6697
  model: 'MediaPad T 8.0"'
6698
+ - regex: 'AGR-L09(?:[);/ ]|$)'
6699
+ device: 'tablet'
6700
+ model: 'MediaPad T 10'
6701
  - regex: 'AGS-(?:L0[39]|W09)(?:[);/ ]|$)'
6702
  device: 'tablet'
6703
  model: 'MediaPad T3 10'
6737
  - regex: '(?:d-01J|d-02[HK])(?:[);/ ]|$)'
6738
  device: 'tablet'
6739
  model: 'D Tab Compact'
6740
+ - regex: '(d-01K)(?:[);/ ]|$)'
6741
+ device: 'tablet'
6742
+ model: 'dtab d-01K'
6743
 
6744
 
6745
  # smart watch regex
6758
  model: 'Ascend Mate $1'
6759
  - regex: 'Huawei[ _\-]?([^/;]*) Build'
6760
  model: '$1'
6761
+ - regex: '(?:HW-)?Huawei(?!Browser)(?:/1\.0/0?(?:Huawei))?[_\- /]?([a-z0-9\-_]+)'
6762
  model: '$1'
6763
  - regex: 'Huawei; ([a-z0-9 \-]+)'
6764
  model: '$1'
6765
 
6766
  # Hyundai
6767
  Hyundai:
6768
+ regex: 'Hyundai|Ultra (?:Active|Air|Charm|Dream|Energy|Latitude|Link|Live|Shadow|Shine|Storm|Style|Sync|Trend|Vision|Wave)|G(24027|2552[34])K|W25042L|HP554O|Seoul S8|L503F Plus|HT0701L16|HT0704K08|HT1004L16|Koral_8W2'
6769
  device: 'smartphone'
6770
  models:
6771
  - regex: 'Ultra (Active|Air|Charm|Dream|Energy Lite|Energy Plus|Energy|Latitude|Link|Live II|Live|Shadow|Shine|Storm|Style|Sync|Trend|Vision|Wave)'
6772
  model: 'Ultra $1'
6773
+ - regex: 'Seoul S8'
6774
+ model: 'Seoul S8'
6775
  - regex: 'G25523K'
6776
  model: 'Eternity G23'
6777
  - regex: 'G25524K'
6782
  model: 'Eternity W42'
6783
  - regex: 'HP554O'
6784
  model: 'HP554O'
6785
+ - regex: 'L503F Plus'
6786
+ model: 'L503F Plus'
6787
+
6788
+ # explicit tables models
6789
+ - regex: 'HT0701L16'
6790
+ model: 'Koral 7XL'
6791
+ device: 'tablet'
6792
+ - regex: 'Koral_8W2'
6793
+ model: 'Koral 8W2'
6794
+ device: 'tablet'
6795
+ - regex: 'HT1004L16'
6796
+ model: 'Koral 10XL'
6797
+ device: 'tablet'
6798
+ - regex: 'HT0704K08'
6799
+ model: 'Koral 7M4'
6800
+ device: 'tablet'
6801
  - regex: 'Hyundai ([^;/]+) Build'
6802
  model: '$1'
6803
  device: 'tablet'
6839
 
6840
  # iBall
6841
  iBall:
6842
+ regex: 'iBall[ _]([^;/)]+)[ _]Build|(?:Snap_4G2|6351-Q400i|iT-KSA0003|iT-KSA0012|iT-KSA0066|Avid|Twinkle_i5)(?:[);/ ]|$)'
6843
  device: 'tablet'
6844
  models:
6845
+ - regex: '(Snap_4G2|Avid|Twinkle_i5)(?:[);/ ]|$)'
6846
  model: '$1'
6847
  - regex: '6351-Q400i(?:[);/ ]|$)'
6848
  model: 'Slide'
6849
+ - regex: 'iT-KSA0003(?:[);/ ]|$)'
6850
+ model: 'iTAB BizniZ'
6851
+ - regex: 'iT-KSA0066(?:[);/ ]|$)'
6852
+ model: 'iTAB BizniZ Mini'
6853
+ - regex: 'iT-KSA0012(?:[);/ ]|$)'
6854
+ model: 'iTAB Moviez Pro'
6855
  - regex: 'iBall[ _]([^;/)]+)[ _]Build'
6856
  model: '$1'
6857
 
6880
 
6881
  # Irbis
6882
  Irbis:
6883
+ regex: 'IRBIS|TZ(1(?:0[04]|42|5[01]|84|65|7[01345-89]|8[356]|9[12578])|49|7(?:1[12467]|2[01567]|37|4[257]|5[23457]|6[12]|72|7[17]|8[1]|9[147])|8(?:[34]1|5[3-8]|6[45]|7[2478]|8[1-5]|9[0127])|96[0-9])|TZ85|TZ13|TZ(?:one|art|HIT|81L)|(SP(?:0[56]|2[01]|4[1-36]|40[12]|45[345]|49[34]|50|51[0147]|531|54[12]|55[0124]|571))(?:[);/ ]|$)'
6884
  device: 'tablet'
6885
  models:
6886
  - regex: '(TZ(?:[0-9]+)|TZ(?:one|art|HIT|81L))(?:[);/ ]|$)'
6901
 
6902
  # iHunt
6903
  iHunt:
6904
+ regex: 'iHunt|One_ Love_|TITAN_P11000_PRO|Like_(3|4U|3_Pro)|X300 Elite|S10_Tank_2019|S60_Discovery_2019|AlienXLite2020|Alien X Lite|Alien_X'
6905
  device: 'smartphone'
6906
  models:
6907
  - regex: 'iHunt_Like'
6924
  model: 'S60 Discovery (2019)'
6925
  - regex: 'AlienXLite2020'
6926
  model: 'Alien X Lite (2020)'
6927
+ - regex: 'Alien X Lite PRO'
6928
+ model: 'Alien X Lite Pro'
6929
+ - regex: 'Alien X Lite'
6930
+ model: 'Alien X Lite'
6931
+ - regex: 'Alien_X_ApeX'
6932
+ model: 'Alien X ApeX'
6933
+ - regex: 'Alien_X'
6934
+ model: 'Alien X'
6935
 
6936
  # IconBIT
6937
  IconBIT:
7111
  - regex: 'M4_B([23])'
7112
  model: 'B$1'
7113
 
7114
+ # IMO Mobile or In My Opinion Mobile
7115
  IMO Mobile:
7116
  regex: '(?:IMO)(?:[);/ ]|$)'
7117
  device: 'smartphone'
7118
  models:
7119
+ - regex: 'IMO[ _]Q([23]) Plus(?:[);/ ]|$)'
7120
+ model: 'Q$1 Plus'
7121
  - regex: 'IMO[ _]Q2(?:[);/ ]|$)'
7122
  model: 'Q2'
7123
+ - regex: 'IMO[ _]S2(?:[);/ ]|$)'
7124
+ model: 'S2'
7125
  - regex: 'IMO[ _]FEEL A2(?:[);/ ]|$)'
7126
  model: 'Feel A2'
7127
  - regex: 'IMO[ _]S50(?:[);/ ]|$)'
7176
 
7177
  # iPro
7178
  iPro:
7179
+ regex: '(?:Kylin[ _]5.[05]S?|Jade7s|Amber[67]S?|Amber5S_Pro|Phonenix50S)(?:[);/ ]|$)'
7180
  device: 'smartphone'
7181
  models:
7182
  - regex: 'Kylin_5.0S'
7185
  model: 'Kylin $1'
7186
  - regex: 'Jade7s'
7187
  model: 'Jade 7s'
7188
+ - regex: 'Amber7S'
7189
+ model: 'Amber 7S'
7190
+ - regex: 'Amber5S_Pro'
7191
+ model: 'Amber 5S Pro'
7192
+ - regex: 'Amber6'
7193
+ model: 'Amber 6'
7194
+ - regex: 'Phonenix50S'
7195
+ model: 'Phonenix 50S'
7196
 
7197
  # Infinix
7198
  Infinix:
7497
  - regex: 'iOCEAN[ _\-]?([^);/ ]+)'
7498
  model: '$1'
7499
 
7500
+ # iView (iviewus.com)
7501
  iView:
7502
+ regex: '(733TPC|730TPC|769TPCII|930TPC)(?:[);/ ]|$)'
7503
+ device: 'tablet'
7504
+ model: '$1'
 
 
 
7505
 
7506
  # Impression
7507
  Impression:
7604
  - regex: 'BLASTER'
7605
  model: 'Blaster'
7606
 
7607
+ # Kalley (www.kalley.com.co)
7608
  Kalley:
7609
+ regex: 'KALLEY|(?:ELEMENT Q|ELEMENT_PRO_2|K-BOOK(?:8MG|73G))(?:[);/ ]|$)'
7610
  device: 'smartphone'
7611
  models:
7612
  - regex: 'ELEMENT Q'
7613
  model: 'Element Q'
7614
+ - regex: 'ELEMENT_PRO_2'
7615
+ model: 'Element Pro 2'
7616
+ - regex: 'K-BOOK(8MG|73G)'
7617
+ device: 'tablet'
7618
+ model: 'K-BOOK$1'
7619
+ - regex: 'KALLEY,(55D1240)'
7620
+ device: 'tv'
7621
+ model: '$1'
7622
 
7623
  # Kaan
7624
  Kaan:
7851
  - regex: 'K-?Touch[ _]([a-z0-9]+)'
7852
  model: '$1'
7853
 
7854
+ # Diva
7855
+ Diva:
7856
+ regex: '(QC-(?:703GN|704GA|803GN|1013G|7BHD))(?:[);/ ]|$)'
7857
+ device: 'tablet'
7858
+ model: '$1'
7859
+
7860
  # kyocera (kyocera.co.jp, kyocera.com)
7861
  Kyocera:
7862
+ regex: 'Kyocera|KWC-|QC-[0-9]{4}|(?:QC6035|NP501KC|302KC|503KC|602KC|705KC|901KC|C51[27]0|C5155|C5215|C67[35]0|C6522N?|C6530N|C6740N?|C6743|E6[89]10|KYL2[13]|KYV3[13-9]|KYT3[123]|KYF3[123579]|KYX31|KYY2[1-4]|S2151|KC-S701|S4-KC|KYV40U?|KYV4[1-8]|KYV4[47]|KC-S301AE|X3-KC|S6-KC|E6560[CT]|E6782[L]?|E6790(?:TM)?|[47]04KC|A001KC)(?:[-_]u2?)?(?:[);/ ]|$)'
7863
  device: 'smartphone'
7864
  models:
7865
  # explicit smartphone models
7875
  model: 'Digno G'
7876
  - regex: '503KC(?:[);/ ]|$)'
7877
  model: 'Digno E'
7878
+ - regex: '404KC(?:[);/ ]|$)'
7879
+ model: 'Digno C'
7880
  - regex: '704KC(?:[);/ ]|$)'
7881
  model: 'Digno J'
7882
  - regex: '302KC(?:[);/ ]|$)'
7885
  model: 'Digno'
7886
  - regex: 'KYV36(?:[);/ ]|$)'
7887
  model: 'Digno Rafre'
7888
+ - regex: '901KC(?:[);/ ]|$)'
7889
+ model: 'Digno BX'
7890
  - regex: 'KYV39(?:[);/ ]|$)'
7891
  model: 'Miraie F'
7892
+ - regex: 'KYX31(?:[);/ ]|$)'
7893
+ model: 'Infobar XV'
7894
  - regex: 'C5170(?:[);/ ]|$)'
7895
  model: 'Hydro'
7896
  - regex: 'C5215(?:[);/ ]|$)'
7947
  model: 'Qua Phone'
7948
  - regex: 'KYV42(?:[);/ ]|$)'
7949
  model: 'Qua Phone QX'
7950
+ - regex: 'KYV44(?:_u2?)?(?:[);/ ]|$)'
7951
  model: 'Qua Phone QZ'
7952
  - regex: 'KYT33(?:[);/ ]|$)'
7953
  model: 'Qua Tab QZ10'
7996
  model: 'KZ $1'
7997
  - regex: 'Kyocera(?:[\-/])?([a-z0-9]+)'
7998
  model: '$1'
7999
+ - regex: '(KWC|QC)-?([a-z0-9]+)'
8000
+ model: '$1-$2'
8001
 
8002
  # Krüger&Matz (Kruger&Matz)
8003
  Krüger&Matz:
8004
+ regex: 'Kruger[ _&]Matz|KrugerMatz[ _]|FLOW5PLUS|FLOW7|FLOW6(?:S|Lite)|DRIVE[_ ]6S?|MOVE8mini|MOVE_|LIVE_6plus|LIVE 5 PLUS|LIVE4_KM043[89]|LIVE 7S|KM(?:106[67]|1065G|0701_1|0702|0805_1)'
8005
  device: 'smartphone'
8006
  models:
8007
+ - regex: 'MOVE8mini'
8008
+ model: 'MOVE 8 Mini'
8009
  - regex: 'MOVE_6_mini'
8010
  model: 'MOVE 6 Mini'
8011
  - regex: 'MOVE[_ ]([78]|6S)'
8016
  model: 'DRIVE $1'
8017
  - regex: 'FLOW5PLUS(?:[);/ ]|$)'
8018
  model: 'FLOW 5 Plus'
8019
+ - regex: 'FLOW6Lite(?:[);/ ]|$)'
8020
+ model: 'FLOW 6 Lite'
8021
  - regex: 'FLOW[ _]?([476][S]?)(?:[);/ ]|$)'
8022
  model: 'FLOW $1'
8023
  - regex: 'LIVE4_(KM043[89])(?:[);/ ]|$)'
8030
  model: 'LIVE 5 Plus'
8031
  - regex: 'LIVE_6plus(?:[);/ ]|$)'
8032
  model: 'LIVE 6 Plus' # KM0454
8033
+ - regex: 'LIVE 7S(?:[);/ ]|$)'
8034
+ model: 'LIVE 7S'
8035
 
8036
  - regex: 'KM(106[67])(?:[);/ ]|$)'
8037
  device: 'tablet'
8069
 
8070
  # Lava (Lavamobiles.com)
8071
  Lava:
8072
+ regex: 'Lava[ _]|LAVAA1|(?:DISCOVER136|KKT QUADRA)|iris[ _]?([^/;]+)(?:\)| Build)|A(?:67|76) Build|X1 Selfie Build|X41 Plus Build|(?:Flair Z1|PixelV1|Pixel V2|Z61_2GB|A97 IPS|L[EH]9920(?:[_ ]P)?|L[EH]9910)(?:[);/ ]|$)'
8073
  device: 'smartphone'
8074
  models:
8075
  - regex: 'Flair Z1(?:[);/ ]|$)'
8080
  model: 'A67'
8081
  - regex: 'A76 Build'
8082
  model: 'A76'
8083
+ - regex: 'Pixel ?V([12])(?:[);/ ]|$)'
8084
+ model: 'Pixel V$1'
8085
  - regex: 'X1 Selfie Build'
8086
  model: 'Iris X1 Selfie'
8087
  - regex: 'X41 Plus Build'
8092
  model: 'R1'
8093
  - regex: 'Z61_2GB(?:[);/ ]|$)'
8094
  model: 'Z61'
8095
+ - regex: 'LE9920[ _]P(?:[);/ ]|$)'
8096
+ model: 'V7'
8097
+ - regex: 'LE9920(?:[);/ ]|$)'
8098
+ model: 'Z53'
8099
+ - regex: 'LH9910(?:[);/ ]|$)'
8100
+ model: 'Z52'
8101
+ - regex: 'LE9910(?:[);/ ]|$)'
8102
+ model: 'V8'
8103
+ - regex: 'LH9920(?:[);/ ]|$)'
8104
+ model: 'V+6'
8105
 
8106
  - regex: 'DISCOVER136'
8107
  device: 'feature phone'
8140
 
8141
  # lanix
8142
  Lanix:
8143
+ regex: 'LANIX-([a-z0-9]+)|Ilium[ _]|IliumPad|X120C|Alpha 950'
8144
  device: 'smartphone'
8145
  models:
8146
+ - regex: 'ILIUM[ _]?PAD[ _]?([^;/]+)(?: Build|[;)])'
8147
  model: 'Ilium Pad $1'
8148
  device: 'tablet'
8149
  - regex: 'X120C'
8150
  model: 'Ilium X120C'
8151
+ - regex: 'Ilium[ _](Alpha [15]s|Alpha [379]|L(?:200|6[12]0|9[125]0|1[0124]00|1050|1120)|LT5[012]0|M[13579]|S(?:106|520|6[27]0)|X(?:1[12]0|2[0126]0|5[12]0|500B|710))(?:[);/ ]|$)'
8152
  model: 'Ilium $1'
8153
  - regex: 'ILIUM[ _]([^;/]+) Build'
8154
  model: 'Ilium $1'
8217
 
8218
  # Leagoo
8219
  Leagoo:
8220
+ regex: 'LEAGOO[ _-]?|(?:M5 EDGE|KIICAA (POWER|MIX)|Leapad[ _]7s|Elite [15]|Venture 1|Z10-E)(?:[);/ ]|$)'
8221
  device: 'smartphone'
8222
  models:
8223
  - regex: 'LEAGOO[- _]M8[_-]?Pro(?:[);/ ]|$)'
8232
  model: 'KICCAA Power'
8233
  - regex: 'KIICAA MIX'
8234
  model: 'KICCAA Mix'
8235
+ - regex: 'Elite ([15])(?:[);/ ]|$)'
8236
+ model: 'Elite $1'
8237
  - regex: 'Venture 1(?:[);/ ]|$)'
8238
  model: 'Venture 1'
8239
  - regex: '(Z10-E)(?:[);/ ]|$)'
8317
  device: 'tablet'
8318
  model: '$1'
8319
 
8320
+ # lenovo (lenovo.com)
8321
  Lenovo:
8322
+ regex: '(?:LNV-)?Lenovo|IdeaTab|IdeaPad|Thinkpad|Yoga Tablet|Tab2A[0-9]-[0-9]{2}[a-z]?|ZUK[ -_]|(?:TB2-X30L|TB3-710I|YT3-X50[ML]|K50a40|TB-(?:X103F|8504F|X304F|X704V|X704A)|A5500-H|A2107A-H|A3500-HV|A2109A|S6000|Z2 Plus|Vibe P1|VIBE C|VIBE [ZX]2|Vibe K5(?: Plus)?|P2A42|L38011|L18011|[5-8]01LV|[67]02LV|Z2131|K350t|K31-t3|TAB 2 A8-50LC|S90-A|P70-A|VR-1541F)(?:[);/ ]|$)'
8323
  device: 'smartphone'
8324
  models:
8325
  - regex: 'Lenovo ?G780'
8328
  - regex: 'Lenovo ?A3500-FL'
8329
  model: 'IdeaTab A7-40'
8330
  device: 'tablet'
8331
+ - regex: '(?:Lenovo ?)?A3500-(?:H|HV|F)'
8332
  model: 'IdeaTab A7-50'
8333
  device: 'tablet'
8334
  - regex: '(?:Lenovo[ _])?A5500-[HF]'
8340
  - regex: 'A2107A-H'
8341
  model: 'A2107'
8342
  device: 'tablet'
8343
+ - regex: 'A2109A'
8344
+ model: 'IdeaTab A2109A'
8345
+ device: 'tablet'
8346
  - regex: 'TB2-X30[FL]'
8347
  model: 'Tab 2 A10-30'
8348
  device: 'tablet'
8355
  - regex: 'TB3-710[IF]'
8356
  model: 'TAB3 7 Essential'
8357
  device: 'tablet'
8358
+ - regex: 'TB-7703X'
8359
+ model: 'TAB3 7 Plus'
8360
+ device: 'tablet'
8361
+ - regex: 'TB3-X70L'
8362
+ model: 'TAB3 10 Plus'
8363
+ device: 'tablet'
8364
+ - regex: 'TB-8703X'
8365
+ model: 'TAB3 8 Plus'
8366
+ device: 'tablet'
8367
  - regex: 'TAB 2 A8-50LC'
8368
  model: 'TAB2 A8-50LC'
8369
  device: 'tablet'
8370
  - regex: '501LV(?:[);/ ]|$)'
8371
  model: 'TAB2 8.0"'
8372
  device: 'tablet'
8373
+ - regex: 'TAB 2 A10-70L(?:[);/ ]|$)'
8374
+ model: 'TAB 2 A10'
8375
+ device: 'tablet'
8376
  - regex: '(?:TB3-850[FM]|601LV)(?:[);/ ]|$)'
8377
  model: 'TAB3 8'
8378
  device: 'tablet'
8379
+ - regex: '602LV(?:[);/ ]|$)'
8380
+ model: 'TAB3 8 Dual'
8381
+ device: 'tablet'
8382
+ - regex: 'TB-X304[FL]'
8383
  model: 'TAB4 10'
8384
  device: 'tablet'
8385
+ - regex: 'TB-8504X'
8386
+ model: 'TAB4 8'
8387
+ device: 'tablet'
8388
+ - regex: 'TB-8704X'
8389
+ model: 'TAB4 8 Plus'
8390
+ device: 'tablet'
8391
+ - regex: '(?:TB-X704[FVL]|70[12]LV)(?:[);/ ]|$)'
8392
  model: 'TAB4 10 Plus'
8393
  device: 'tablet'
8394
  - regex: '801LV(?:[);/ ]|$)'
8403
  - regex: 'TB-X605F(?:[);/ ]|$)'
8404
  model: 'Tab M10'
8405
  device: 'tablet'
8406
+ - regex: 'TB-7104I(?:[);/ ]|$)'
8407
+ model: 'Tab E7'
8408
+ device: 'tablet'
8409
+ - regex: 'TB-8304F1(?:[);/ ]|$)'
8410
+ model: 'Tab E8'
8411
+ device: 'tablet'
8412
+ - regex: 'TB-7304X(?:[);/ ]|$)'
8413
+ model: 'Tab 7 Essential'
8414
+ device: 'tablet'
8415
+ - regex: 'TB-7504X(?:[);/ ]|$)'
8416
+ model: 'Tab 7'
8417
+ device: 'tablet'
8418
+ - regex: 'TB-X606[FX](?:[);/ ]|$)'
8419
+ model: 'Tab M10 FHD Plus'
8420
+ device: 'tablet'
8421
  - regex: 'Lenovo ?B8000(-[FH])?'
8422
  model: 'Yoga Tablet 10'
8423
  device: 'tablet'
8442
  - regex: 'YT3-850M'
8443
  model: 'Yoga Tab 3 10'
8444
  device: 'tablet'
8445
+ - regex: 'YT-X703L'
8446
+ model: 'Yoga Tab 3 Plus'
8447
+ device: 'tablet'
8448
 
8449
  - regex: 'S6000(?:[);/ ]|$)'
8450
  model: 'IdeaTab S6000'
8458
  - regex: 'ThinkPad ?Tablet([^;/]*) Build'
8459
  model: 'ThinkPad Tablet$1'
8460
  device: 'tablet'
 
 
 
 
 
 
8461
  - regex: 'Lenovo ?A3300-(?:GV|H)'
8462
  model: 'TAB 2 A7-30'
8463
  device: 'tablet'
8464
+ - regex: 'TAB 2 A7-30[HGD]C'
8465
+ model: 'TAB 2 A7'
8466
+ device: 'tablet'
8467
  - regex: 'TB-8504F'
8468
  model: 'TAB 4 8'
8469
  device: 'tablet'
8470
  - regex: 'TB-X304F'
8471
+ model: 'TAB4 10'
8472
  device: 'tablet'
8473
+ - regex: 'TB-X505[FX]'
8474
  model: 'M10'
8475
  device: 'tablet'
8476
+ - regex: 'TB-X104[FXL]'
8477
  model: 'E10'
8478
  device: 'tablet'
8479
  - regex: 'Tab2A([0-9]-[0-9]{2}[a-z]?)'
8485
  - regex: 'Yoga Tablet([^;/]+) Build'
8486
  model: 'Yoga Tablet$1'
8487
  device: 'tablet'
8488
+ - regex: 'TB-8505F'
8489
+ model: 'Tab M8'
8490
  device: 'tablet'
8491
  - regex: 'Lenovo (TB[0-9]?\-[a-z0-9\-]+) Build'
8492
  model: '$1'
8511
  model: 'K4 Note'
8512
  - regex: 'K350t(?:[);/ ]|$)'
8513
  model: 'K5'
8514
+ - regex: 'L38011(?:[);/ ]|$)'
8515
+ model: 'K5 Play'
8516
  - regex: 'A7020a4[08](?:[);/ ]|$)'
8517
  model: 'K5 Note'
8518
  - regex: 'K31-t3(?:[);/ ]|$)'
8555
  model: 'A3'
8556
  - regex: 'PB2-670M(?:[);/ ]|$)'
8557
  model: 'Phab 2'
8558
+ - regex: '(S90-A|P70-A)(?:[);/ ]|$)'
8559
+ model: '$1'
8560
+ - regex: 'IdeaPad ?([^;/]*) Build'
8561
+ model: 'IdeaPad $1'
8562
+ device: 'tablet'
8563
+
8564
+ - regex: 'VR-1541F' # VR headset
8565
+ device: 'wearable'
8566
+ model: 'Mirage Solo'
8567
+
8568
+ - regex: 'Lenovo TAB ?([^/;]*) Build'
8569
+ model: 'TAB $1'
8570
+ device: 'tablet'
8571
  - regex: 'Lenovo ([^/;]*) Build'
8572
  model: '$1'
8573
  - regex: '(?:LNV-|Lenovo-)?Lenovo[ \-_]?([a-z0-9_+\-]+)'
8574
  model: '$1'
8575
 
8576
+
8577
  # Lexand
8578
  Lexand:
8579
  regex: '(?:SC7 PRO HD|S5A[1-4]|S4A[1-5]|S6A1|A811|A802)(?:[);/ ]|$)|Lexand ([^;/]+) Build'
8665
 
8666
  # LG
8667
  LG:
8668
+ regex: 'LG|portalmmm/2\.0 (?:KE|KG|KP|L3)|(?:VX[0-9]+|L-0[12]D|L-07C|P713|(LM-[A-Z][0-9]{3}[A-Z]{0,3}(?:\(FGN?\)|\(G\)|\.FN|\.F(?:GN?)?)?)|LM-(X625N1|G820QM[0127]))(?:[);/ ]|$)|NetCast|RS98[78]|RS500|VS(?:50[01]|835|876|880|98[0578]|99[056]|(410|415|425|500|880)PP)|VS820|VS870 4G|Nexsus 5|LML(41[34]D|211B|713D|212V)L|VK810 4G|VK815|X5-LG|L-05D|L-03K|L-01[LJK]|L-[45]1A|901LG|A001LG|80[12]LG|402LG|LGT32|L-02K|L-01F|LM-V40'
8669
  device: 'smartphone'
8670
  models:
8671
  - regex: 'LG-D325'
8684
  model: 'G2'
8685
  - regex: 'LG-D6(?:18|20)'
8686
  model: 'G2 Mini'
8687
+ - regex: 'LG-D85[01258]|VS985'
8688
  model: 'G3'
8689
  - regex: 'LG-D72[2458]'
8690
  model: 'G3 Beat'
8698
  model: 'G4s'
8699
  - regex: 'LG-H735'
8700
  model: 'G4 Beat'
8701
+ - regex: 'LG-H8(?:20|3[01]|5[08]|60)|VS987|RS988'
8702
  model: 'G5'
8703
  - regex: 'LG-H84[05]'
8704
  model: 'G5 SE'
8714
  model: 'G8S ThinQ'
8715
  - regex: '901LG(?:[);/ ]|$)'
8716
  model: 'G8X ThinQ'
8717
+ - regex: 'VS501|LM-X120'
8718
  model: 'K20'
8719
  - regex: '(?:LG-)?H502'
8720
  model: 'Magna'
8742
  model: 'V20'
8743
  - regex: 'LM-Q710(?:\(FGN\)|[\.]?FGN)'
8744
  model: 'Q Stylus Plus'
8745
+ - regex: '801LG'
8746
+ model: 'Q Stylus'
8747
  - regex: 'LM-Q[67]10\.FG(?:[);/ ]|$)'
8748
  model: 'Q7'
8749
  - regex: 'LM-(Q725[KL]|Q610.FGN)(?:[);/ ]|$)'
8786
  model: 'X4'
8787
  - regex: 'LM-X(415[LS]|410L)'
8788
  model: 'X4+'
8789
+ - regex: 'LM-X410(?:\.FN|\(FG\))'
8790
  model: 'K11'
8791
  - regex: 'LM-X(?:320|410[UP]M)'
8792
  model: 'K30'
8917
  - regex: 'VS870 4G'
8918
  model: 'Lucid 2'
8919
 
8920
+ - regex: 'LGUK410'
8921
+ model: 'G Pad 7.0" LTE'
8922
+ device: 'tablet'
8923
  - regex: 'LG-V490'
8924
  model: 'G Pad 8.0'
8925
  device: 'tablet'
8991
 
8992
  # Logicom
8993
  Logicom:
8994
+ regex: 'LOGICOM[_ ]|(TAB950|TAB1062|E731|E812|E912|E1031|POWER BOT|La[ _]Tab[ _](?:7[24]|10[57]|114)|(?:B|C|M|ID|VR)[ _]?BOT[ _]?(?:TAB[ _])?([0-9]+\+?)(?:PLUS)?|KT712A_4\.4|L-?IXIR[0-9]*|L-ITE|L-EGANTONE-R|L-?EMENT|L-EMENT551|Le[ _]?(?:Hop|Lift|Hola|Moov[2]?|Must 2|Fit FR|Spark|Prime|Smooth(?: FR)?))[_);/ ]'
8995
  device: 'tablet'
8996
  models:
8997
+ - regex: 'La[ _]Tab[ _](7[24]|10[57]|114)(?:[);/ ]|$)'
8998
+ model: 'La Tab $1'
8999
  - regex: 'LOGICOM_LA_TAB_LINK_71'
9000
  model: 'La Tab Link 71'
9001
  - regex: 'KT712A_4.4'
9006
  model: 'L-ixir Tab $1'
9007
  - regex: 'L-ITE[ _]([^;/]+) Build'
9008
  model: 'L-ite Tab $1'
9009
+ - regex: 'L-EMENT[ _]?(40[03]|55[13]|505)(?:[);/ ]|$)'
9010
  model: 'L-ement $1'
9011
  device: 'smartphone'
9012
  - regex: 'L-?EMENT[ _](?:TAB)?([^;/]+) Build'
9076
  device: 'feature phone'
9077
  model: '$1'
9078
 
9079
+ # Konrow (konrow.com)
9080
  Konrow:
9081
+ regex: '(?:BIGCOOL|COOLFIVE|COOL-K|Just5|Link5|EASY5|CITY55)(?:[);/ ]|$)'
9082
  device: 'smartphone'
9083
  models:
9084
  - regex: 'BIGCOOL(?:[);/ ]|$)'
9091
  model: 'Just 5'
9092
  - regex: 'Link5(?:[);/ ]|$)'
9093
  model: 'Link 5'
9094
+ - regex: 'EASY5(?:[);/ ]|$)'
9095
+ model: 'Easy 5'
9096
+ - regex: 'CITY55(?:[);/ ]|$)'
9097
+ model: 'City 55'
9098
 
9099
  # Karbonn (karbonnmobiles.com)
9100
  Karbonn:
9101
+ regex: '(?:Browser-)?Karbonn|K9 Kavach 4G|K9[_ ]Viraat[_ ]Plus|K9 Music 4G|K9 Smart|K9 VIRAAT 4G|Aura Sleek Plus|Aura Note Play|Titanium[ _](?:3D-Plex|Octane Plus|Vista 4G|Jumbo|S360|S1[059]|S35|S20[13]|S22|S1|S200 HD|Frames S7)|K-lite F3'
9102
  device: 'smartphone'
9103
  models:
9104
  - regex: 'K9 Kavach 4G'
9115
  model: 'K9 Smart Yuva'
9116
  - regex: 'K9 Smart'
9117
  model: 'K9 Smart'
9118
+ - regex: 'K9[_ ]Viraat[_ ]Plus'
9119
+ model: 'K9 Viraat Plus'
9120
  - regex: 'Aura Sleek Plus'
9121
  model: 'Aura Sleek Plus'
9122
  - regex: 'Aura Note Play'
9133
  model: 'Titanium Jumbo 2'
9134
  - regex: 'Titanium Jumbo'
9135
  model: 'Titanium Jumbo'
9136
+ - regex: 'Titanium Frames S7'
9137
+ model: 'Titanium Frames S7'
9138
  - regex: 'Titanium Octane Plus'
9139
  model: 'Titanium Octane Plus'
9140
  - regex: 'Titanium[ _]3D-Plex'
9254
 
9255
  # Maxwest
9256
  Maxwest:
9257
+ regex: '(?:Astro_5N_LTE|Virtue Z5|Astro X55s|Astro_5_GO_LTE|Nitro_4|Gravity_55?_GO)(?:[);/ ]|$)'
9258
  device: 'smartphone'
9259
  models:
9260
  - regex: 'Astro_5N_LTE'
9261
  model: 'Astro 5N LTE'
9262
+ - regex: 'Astro_5_GO_LTE'
9263
+ model: 'Astro 5 Go LTE'
9264
  - regex: 'Virtue Z5'
9265
  model: 'Virtue Z5'
9266
  - regex: 'Astro X55s'
9267
  model: 'Astro X55s'
9268
  - regex: 'Nitro_4'
9269
  model: 'Nitro 4'
9270
+ - regex: 'Gravity_(55?)_GO'
9271
+ model: 'Gravity $1 GO'
9272
 
9273
  # Maze
9274
  Maze:
9275
+ regex: '(?:SSB-(?:500|508E)|Alpha[_ ]X|Maze Alpha|SSB504R)(?:[);/ ]|$)'
9276
  device: 'smartphone'
9277
  models:
9278
+ - regex: 'SSB-(500|508E)(?:[);/ ]|$)'
9279
+ model: 'SSB-$1'
9280
  - regex: 'SSB504R(?:[);/ ]|$)'
9281
  model: 'Speed'
9282
  - regex: 'Alpha[_ ]X(?:[);/ ]|$)'
9286
 
9287
  # Mediacom
9288
  Mediacom:
9289
+ regex: '(?:SmartPad7503G|M-SP10MXA|M-PPAB500|SmartPad970s2(?:3G)?|M[_-][MPS]P[0-9a-z]+|M-IPRO[0-9a-z]+|1AEC)(?:[);/ ]|$)'
9290
  device: 'tablet'
9291
  models:
9292
  - regex: 'SmartPad7503G(?:[);/ ]|$)'
9301
  model: 'SmartPad 9.7 Mobile'
9302
  - regex: 'M-SP10MXA(?:[);/ ]|$)'
9303
  model: 'SmartPad MX 10'
9304
+ - regex: 'M-SP8MXA(?:[);/ ]|$)'
9305
+ model: 'SmartPad MX 8'
9306
+ - regex: 'M-SP8HXAH(?:[);/ ]|$)'
9307
+ model: 'SmartPad HX 8 HD'
9308
  - regex: 'M-MP(?:710|720|725|726|740)GOx?(?:[);/ ]|$)'
9309
  model: 'SmartPad 7.0 Go'
9310
  - regex: 'M-MP876S2(?:[);/ ]|$)'
9317
  model: 'SmartPad 875 S2 3G'
9318
  - regex: 'M-SP1AGO3G'
9319
  model: 'SmartPad 10 Go 3G'
9320
+ - regex: '1AEC'
9321
+ model: 'SmartPad 10 Eclipse'
9322
  - regex: 'M-MP10[45][01]S2(?:[);/ ]|$)'
9323
  model: 'SmartPad 10.1 S2'
9324
  - regex: 'M-MP1S2[AB]3G(?:[);/ ]|$)'
9359
  - regex: 'M-PPAG550(?:[);/ ]|$)'
9360
  model: 'PhonePad Duo G550'
9361
  device: 'phablet'
9362
+ - regex: 'M-PPAB500(?:[);/ ]|$)'
9363
+ model: 'PhonePad Duo B500'
9364
+ device: 'phablet'
9365
  - regex: 'M-PP2G530(?:[);/ ]|$)'
9366
  model: 'PhonePad Duo G530'
9367
  device: 'phablet'
9393
  - regex: 'M-PPxG(400|501|[457][PM]?)(?:[);/ ]|$)'
9394
  model: 'PhonePad Duo G$1'
9395
  device: 'smartphone'
9396
+ - regex: 'M-PPxS(532[LU]|470|501|5P?)(?:[);/ ]|$)'
9397
  model: 'PhonePad Duo S$1'
9398
  device: 'smartphone'
9399
+ - regex: 'M-PPxG(450)(?:[);/ ]|$)'
9400
+ model: 'PhonePad Duo G$1'
9401
+ device: 'smartphone'
9402
 
9403
  - regex: 'M-MP([0-9a-z]+)'
9404
  model: 'SmartPad $1'
9436
 
9437
  # Meizu
9438
  Meizu:
9439
+ regex: 'Meizu|MZ-[a-z]|(M04[05]|MZ-16th(?: Plus)?|MZ-16[st]|M7[12]1C|M35[1356]|M612C|M578CA|M181[36]|M1822|M681C|M6T|MX[ -]?[2345](?: Pro)?|(?:MZ-)?m[1-6] note|M621C|M1852|M57[18]C|M3[ESX]|M031|m1 metal|M1 E|M2|M2 E|M5s Build|PRO 6|PRO 7-H| 15 Lite| 16th|MZ-15 (?:Lite|Plus)|MZ-16 X)(?:[);/ ]|$)'
9440
  device: 'smartphone'
9441
  models:
9442
  - regex: '(?:MZ-)?M571C'
9500
  model: 'Note 8'
9501
  - regex: 'MZ-16T(?:[);/ ]|$)'
9502
  model: '16T'
9503
+ - regex: '(?:MZ-)?16th Plus(?:[);/ ]|$)'
9504
  model: '16th Plus'
9505
  - regex: 'MZ-15 Plus(?:[);/ ]|$)'
9506
  model: '15 Plus'
9507
+ - regex: '(?:MZ-15 Lite| 15 Lite)(?:[);/ ]|$)'
9508
  model: '15 Lite'
9509
+ - regex: 'MZ-16th| 16th(?:[);/ ]|$)'
9510
  model: '16th'
9511
  - regex: 'MZ-16 X(?:[);/ ]|$)'
9512
  model: '16X'
9661
 
9662
  # Mobicel
9663
  Mobicel:
9664
+ regex: 'Mobicel_(R1)|(?:HYPE|DANDY|(?<!SMADL )Matrix|TRENDY PLUS|BLINK|BERRY[_ ]?(?:[12]|PLUS))(?:[);/ ]|$)'
9665
  device: 'smartphone'
9666
  models:
9667
  - regex: 'Matrix'
9668
  model: 'Matrix'
9669
+ - regex: 'BLINK'
9670
+ model: 'Blink'
9671
+ - regex: 'BERRY1'
9672
+ model: 'Berry 1'
9673
+ - regex: 'BERRY 2'
9674
+ model: 'Berry 2'
9675
+ - regex: 'BERRY[_ ]PLUS'
9676
+ model: 'Berry Plus'
9677
  - regex: 'TRENDY PLUS'
9678
  model: 'Trendy Plus'
9679
+ - regex: 'HYPE'
9680
+ model: 'Hype'
9681
+ - regex: 'DANDY'
9682
+ model: 'Dandy'
9683
  - regex: 'Mobicel_(R1)'
9684
  model: '$1'
9685
 
9774
 
9775
  # Mecool
9776
  Mecool:
9777
+ regex: '(?:KM9PRO|BB2 PRO|K[I]{1,3} PRO|KI PLUS|KM9_TV_BOX|M8SPROW|M8S (?:PLUS|PRO) (?:DVB|[LW]|PLUS)|M8S (?:MAX|PRO))(?:[);/ ]|$)'
9778
  device: 'tv'
9779
  models:
9780
  - regex: 'KM9PRO(?:[);/ ]|$)'
9783
  model: 'KM9 TV Box'
9784
  - regex: 'BB2 PRO(?:[);/ ]|$)'
9785
  model: 'BB2 Pro'
9786
+ - regex: '(K[I]{1,3}) PRO(?:[);/ ]|$)'
9787
+ model: '$1 Pro'
9788
+ - regex: 'KI PLUS(?:[);/ ]|$)'
9789
+ model: 'KI Plus'
9790
  - regex: 'M8SPROW(?:[);/ ]|$)'
9791
  model: 'M8S Pro W'
9792
  - regex: 'M8S PLUS DVB(?:[);/ ]|$)'
9909
  model: 'Moto E'
9910
  - regex: '(?:MOT-|Motorola-)?XT1706'
9911
  model: 'Moto E3 Power'
9912
+ - regex: '(?:MOT-|Motorola-)?XT1924-9|moto e5 plus'
9913
  model: 'Moto E5 Plus'
9914
+ - regex: 'Moto E5 Play'
9915
+ model: 'Moto E5 Play'
9916
  - regex: '(?:MOT-|Motorola-)?XT1030'
9917
  model: 'Droid Mini'
9918
  - regex: '(?:MOT-|Motorola-)?XT1096'
9985
  model: 'Moto $1$2$3'
9986
  - regex: 'Moto ?([CGEXZ])( Plus| Play)?'
9987
  model: 'Moto $1$2'
9988
+ - regex: 'MotoroiX'
9989
+ model: 'MotoroiX'
9990
 
9991
+ - regex: 'Motorola[ _\-]([^/;]+)(?: Build|[);])'
9992
  model: '$1'
9993
  - regex: 'MOTORAZR[ _\-]([a-z0-9]+)'
9994
  model: 'RAZR $1'
10044
 
10045
  # myphone (myphone.com.ph)
10046
  MyPhone:
10047
+ regex: '(?:MyPhone|MyPad|MyTab)[ _][^;/)]+( Build|\))|Cube_LTE|myTab10II|HAMMER[ _](Blade2_PRO|IRON_3|Explorer|ENERGY|Titan 2|AXE[_ ](?:M[_ ]LTE|Pro)|Iron 2|Active[2]?(_LTE)?)|C-Smart_pix|myPhone_Fun_8|Prime_4_Lite|myA17|myX12|Pocket_2|myT6 DTV|myXI1 (?:Plus|Pro)|myXI3'
10048
  device: 'smartphone'
10049
  models:
10050
  # explicit table models
10067
  # explicit smartphones models
10068
  - regex: 'Cube_LTE'
10069
  model: 'Cube LTE'
10070
+ - regex: 'Prime_4_Lite'
10071
+ model: 'Prime 4 Lite'
10072
  - regex: 'HAMMER[ _]ENERGY'
10073
  model: 'Hammer Energy'
10074
  - regex: 'HAMMER_AXE[_ ]M[_ ]LTE'
10152
 
10153
  # Navon
10154
  Navon:
10155
+ regex: 'Navon[_ ]|(?:Vision_Tab_(?:7|10)|Superme_Max|Supreme[_ ](?:Fine|Chief|Pure|Pro)(?:[_ ](?:Mini|Plus))?)(?:[);/ ]|$)'
10156
  device: 'smartphone'
10157
  models:
10158
  - regex: 'Superme_Max(?:[);/ ]|$)'
10176
  - regex: 'Navon[_ ]Platinum 10 3G(?:[);/ ]|$)'
10177
  model: 'Platinum 10.1" 3G'
10178
 
10179
+ - regex: 'Vision_Tab_(7|10)(?:[);/ ]|$)'
10180
+ device: 'tablet'
10181
+ model: 'Vision Tab $1'
10182
+
10183
  # NOA
10184
  NOA:
10185
  regex: 'NOA[ _]|Hummer(?:_2019_R|LE)|NextSE'
10223
 
10224
  # nec
10225
  NEC:
10226
+ regex: 'NEC[ _\-]|KGT/2\.0|PC-TE508(?:S1|[BH]AW)|PC-TE510(?:HAW|BAL)|PC-TS708T1W|PC-TS507N1S|PC-TE507JAW|portalmmm/1\.0 (?:DB|N)|(?:portalmmm|o2imode)/2.0[ ,]N|(?:N-06C|N-02E|LAVIE Tab E (?:10|8)FHD1)(?:[);/ ]|$)'
10227
  device: 'smartphone'
10228
  models:
10229
  - regex: 'N-06C(?:[);/ ]|$)'
10236
  model: '$1'
10237
  - regex: '(?:portalmmm|o2imode)/2\.0[ ,](N[a-z0-9]+)'
10238
  model: '$1'
10239
+ - regex: 'PC-TE508[BH]AW(?:[);/ ]|$)'
10240
+ device: 'tablet'
10241
+ model: 'LAVIE Tab E TE508'
10242
+ - regex: 'PC-TE510(?:BAL|HAW)(?:[);/ ]|$)'
10243
+ device: 'tablet'
10244
+ model: 'LAVIE Tab E TE510'
10245
+ - regex: 'PC-TS507N1S(?:[);/ ]|$)'
10246
+ device: 'tablet'
10247
+ model: 'LAVIE Tab S TS507'
10248
+ - regex: 'PC-TS708T1W(?:[);/ ]|$)'
10249
+ device: 'tablet'
10250
+ model: 'LAVIE Tab S TS708'
10251
+ - regex: 'PC-TE507JAW(?:[);/ ]|$)'
10252
+ device: 'tablet'
10253
+ model: 'LAVIE Tab E TS507'
10254
+ - regex: 'PC-TE508S1(?:[);/ ]|$)'
10255
  device: 'tablet'
10256
  model: 'LAVIE Tab E TE508'
10257
+ - regex: '(LAVIE Tab E (?:10|8)FHD1)(?:[);/ ]|$)'
10258
+ device: 'tablet'
10259
+ model: '$1'
10260
 
10261
  # Neffos (TP-Link)
10262
  Neffos:
10495
 
10496
  # Nvidia
10497
  Nvidia:
10498
+ regex: 'SHIELD Tablet K1|SHIELD Android TV|Tegra(Note-P1640| Note 7)'
10499
  device: 'tablet'
10500
  models:
10501
  - regex: 'TegraNote-P1640'
10502
  model: 'Tegra Note P1640'
10503
+ - regex: '(SHIELD Tablet K1|Tegra Note 7)(?: Build|[;)])'
10504
  model: '$1'
10505
  - regex: 'SHIELD Android TV'
10506
  model: 'SHIELD Android TV'
10734
 
10735
  # OnePlus
10736
  OnePlus:
10737
+ regex: '(?:du_)?ONEPLUS|(?:A0001|A200[135]|AC200[13]|A300[03]|A3010|A5000|A600[03]|A601[03]|E100[135]|GM191[03517]|GM190[0135]|GM1920|HD191[013]|HD190[01357]|HD1925|IN201[01357]|IN202[0135]|KB2000)(?: Build|\))'
10738
  device: 'smartphone'
10739
  models:
10740
  - regex: 'AC200[13](?:[);/ ]|$)'
10741
  model: 'Nord 5G'
10742
  - regex: 'IN202[0135](?:[);/ ]|$)'
10743
  model: '8 Pro'
10744
+ - regex: 'KB2000(?:[);/ ]|$)'
10745
+ model: '8T'
10746
  - regex: 'IN201[01357](?:[);/ ]|$)'
10747
  model: '8'
10748
  - regex: '(?:GM191[03517]|OnePlus 7 Pro)(?:[);/ ]|$)'
11132
 
11133
  # orange
11134
  Orange:
11135
+ regex: 'SPV[ \-]?([a-z0-9]+)|(?<!FBCR/)Orange[ _-](?!Tahiti-LS\))([^/;]+)( Build|\))(?<!Tahiti-LS\))|SC/IHD92|Nura 2|FunTab ([^/;]+) Build|Orange Mahpee'
11136
  device: 'smartphone'
11137
  models:
11138
  - regex: 'SC/IHD92'
11150
  model: '$1 $2'
11151
  - regex: 'Orange[ _-](Dive)72(?:[);/ ]|$)'
11152
  model: '$1 72'
11153
+ - regex: 'Orange[ _-](Daytona|Dive (30|7[13])|Dublin|Fova|Gova|Hi 4G|Hiro|Kivo|Monte Carlo|Neva 80|Neva play|Nura|Reyo|Rise[_ ](3[034]|40|5[345])|Rono|Roya|San Francisco|Tactile internet 2|Tado|Yomi|Yumo|Zali|Mahpee)(?:[);/ ]|$)'
11154
  model: '$1'
11155
  - regex: 'SPV[ \-]?([a-z0-9]+)'
11156
  model: 'SPV $1'
11157
 
11158
  # Oukitel
11159
  Oukitel:
11160
+ regex: 'OUKITEL|(?:(?:C15|C16|K10000|K[46]000)(?:[ _]Pro)|K4000Pro|U16 Max|U7 Max|U7 Plus|U11[_ ]Plus|U20_Plus|WP5000|WP[58] Pro|K[46]000[ _](?:Plus|Lite)|Y4800|K10000|K[4567]000| WP[5-7])(?:[);/ ]|$)'
11161
  device: 'smartphone'
11162
  models:
11163
  - regex: '(C15|C16|K10000|K[46]000|WP[258]|U15)[ _]?Pro(?:[);/ ]|$)'
11164
  model: '$1 Pro'
11165
  - regex: 'OUKITEL K([37])(?:[);/ ]|$)'
11166
  model: 'K$1'
11167
+ - regex: '(K10000|U16|U7)[ _]Max(?:[);/ ]|$)'
11168
  model: '$1 Max'
11169
+ - regex: '(U20|K[46]000|U7|U11)[_ ]?Plus(?:[);/ ]|$)'
11170
  model: '$1 Plus'
11171
  - regex: '(K4000)[_ ]Lite(?:[);/ ]|$)'
11172
  model: '$1 Lite'
11242
  model: 'T74MAi 3G'
11243
  - regex: 'Oysters ([^/;]+)( Build|\))'
11244
  model: '$1'
11245
+
11246
+ # öwn (own mobile)
11247
  öwn:
11248
+ regex: 'OWN[ _]|(?:S4035[ _][34]G|Smart8)(?:[);/ ]|$)'
11249
  device: 'smartphone'
11250
  models:
11251
  - regex: 'FUN ([67])'
11260
  model: 'One'
11261
  - regex: 'SMART 9'
11262
  model: 'Smart 9'
11263
+ - regex: 'Smart8(?:[);/ ]|$)'
11264
+ model: 'Smart 8'
11265
 
11266
  # Panacom
11267
  Panacom:
11274
 
11275
  # panasonic
11276
  Panasonic:
11277
+ regex: 'Panasonic|PANATV[0-9]+|Viera/|(?:P902i|P-0[28]D|FZ-B2D|FZ-[NX]1|DMC-CM1|P-01J|P-03E)(?:[);/ ]|$)|Eluga[ _]|P55 Novo 4G'
11278
  device: 'smartphone'
11279
  models:
11280
  - regex: 'P-01J(?:[);/ ]|$)'
11281
  model: 'P-smart Keitai'
11282
+ - regex: 'P-03E(?:[);/ ]|$)'
11283
+ model: 'Eluga P'
11284
  - regex: 'Eluga[ _-]([^;/]+) Build'
11285
  model: 'Eluga $1'
11286
  - regex: 'Eluga[ _-]([^;/]+)(?:[;/)]|$)'
11288
  - regex: '(DMC-CM1)'
11289
  model: 'Lumix $1'
11290
  device: 'camera'
11291
+ - regex: 'P-02D(?:[);/ ]|$)'
11292
+ model: 'Lumix Phone P-02D'
11293
  - regex: '(FZ-[XN]1)(?:[);/ ]|$)'
11294
  model: 'Toughpad $1'
11295
  - regex: 'FZ-B2D(?:[);/ ]|$)'
11375
  model: '$1'
11376
  device: 'smartphone'
11377
 
11378
+ # Tcl
11379
+ TCL:
11380
+ regex: 'TCL,|TCL[_ -][a-z0-9]+|(?:TCL[_ -][^;/]+ Build)|(?:TCLGalaG60(?:\(9108A\))?|A502DL|T780H|5199I|7040N|5133A|5159[AJ]|5152D|T770H|T799B|Percee TV)(?:[);/ ]|$)'
11381
+ device: 'smartphone'
11382
+ models:
11383
+ - regex: 'TCLGalaG60(?:\(9108A\))?(?:[);/ ]|$)'
11384
+ model: 'Gala G60'
11385
+ - regex: '5199I(?:[);/ ]|$)'
11386
+ model: 'C9'
11387
+ - regex: '5152D(?:[);/ ]|$)'
11388
+ model: 'C5'
11389
+ - regex: '5133A(?:[);/ ]|$)'
11390
+ model: 'L5'
11391
+ - regex: 'T780H(?:[);/ ]|$)'
11392
+ model: 'Plex'
11393
+ - regex: 'TCL[_ -]([^;/]+) Build'
11394
+ model: '$1'
11395
+ - regex: 'TCL[_ -]([a-z0-9]+)'
11396
+ model: '$1'
11397
+ - regex: '(7040N)(?:[);/ ]|$)'
11398
+ model: '$1'
11399
+ - regex: 'A502DL(?:[);/ ]|$)'
11400
+ model: 'LX'
11401
+ - regex: '5159[AJ](?:[);/ ]|$)'
11402
+ model: 'L9'
11403
+ - regex: 'T770H(?:[);/ ]|$)'
11404
+ model: '10L'
11405
+ - regex: 'T799B(?:[);/ ]|$)'
11406
+ model: '10 Pro'
11407
+
11408
+ - regex: '(Percee TV)(?:[);/ ]|$)'
11409
+ device: 'tv'
11410
+ model: '$1'
11411
+ - regex: 'TCL,(43S62FS)'
11412
+ device: 'tv'
11413
+ model: '$1'
11414
+
11415
+ # JVC
11416
+ JVC:
11417
+ regex: 'JVC[;,]'
11418
+ device: 'tv'
11419
+ models:
11420
+ - regex: 'JVC[;,](32D1290)'
11421
+ model: '$1'
11422
+
11423
  # philips
11424
  Philips:
11425
  regex: 'Philips|AND1E(?:[);/ ]|$)|NETTV/|PI3210G|TLE(821L|722G)|TPM1[79]1E|70PUH6774_96|QM16[134]E|Xenium S[25]66|S397|W5510'
11453
  - regex: 'Philips, BDP([0-9]{4})'
11454
  model: 'Blu-ray Player (BDP$1)'
11455
  device: 'tv'
11456
+ - regex: 'Philips, ([a-z0-9-]+)'
11457
+ model: '$1'
11458
+ device: 'tv'
11459
  - regex: '(NETTV/[0-9\.]{5})'
11460
  model: 'NetTV Series'
11461
  device: 'tv'
11498
 
11499
  # Pixus
11500
  Pixus:
11501
+ regex: 'Pixus|(hiPower|Ride[_ ][34]G|Play[ _]Three[ _]v(?:[24].0|3.1))(?:[);/ ]|$)'
11502
  device: 'tablet'
11503
  models:
11504
  - regex: 'Ride[_ ]([34])G'
11509
  model: 'Play Two'
11510
  - regex: 'Play Five'
11511
  model: 'Play Five'
11512
+ - regex: 'hiPower'
11513
+ model: 'hiPower'
11514
  - regex: 'Pixus[ _]Sprint'
11515
  model: 'Sprint'
11516
  - regex: 'Touch 7 3G'
11604
 
11605
  # RCA Tablets (RCA)
11606
  'RCA Tablets':
11607
+ regex: 'RCT([^;/]+) Build|RCA RLTP4028|RCT6513W87|RCT6973W43(?:MD)?|RCT6703W12|RCT6A06P22|RCT6303W87(?:DK|M)|RCT6773W22B|RCT6203W46L|RCT6873W42M|RCT6K03W13'
11608
  device: 'smartphone'
11609
  models:
11610
  - regex: 'RCA RLTP4028'
11612
  - regex: 'RCT6513W87'
11613
  device: 'tablet'
11614
  model: 'Galileo Pro 11.5"'
11615
+ - regex: 'RCT6873W42M'
11616
+ device: 'tablet'
11617
+ model: 'Voyager 7.0"'
11618
+ - regex: 'RCT6973W43(?:MD)?'
11619
  device: 'tablet'
11620
  model: 'Voyager III 7.0"'
11621
+ - regex: 'RCT6773W22B'
11622
+ device: 'tablet'
11623
+ model: 'Voyager II 7.0"'
11624
+ - regex: 'RCT6703W12'
11625
+ device: 'tablet'
11626
+ model: 'Atlas 10.0"'
11627
+ - regex: 'RCT6203W46L'
11628
+ device: 'tablet'
11629
+ model: 'Pro 10 Edition II'
11630
+ - regex: 'RCT6A06P22'
11631
+ device: 'tablet'
11632
+ model: 'Endeavor 10.0" HD'
11633
+ - regex: 'RCT6303W87(?:DK|M)|RCT6K03W13'
11634
+ device: 'tablet'
11635
+ model: 'Viking Pro 10.0"'
11636
  - regex: 'RCT([^;/]+) Build'
11637
  device: 'tablet'
11638
  model: 'RCT$1'
11663
 
11664
  # Rombica
11665
  Rombica:
11666
+ regex: '(Rombica|SSQ-A0500|Smart Box v[0-9]+)(?:[);/ ]|$)'
11667
  device: 'tv'
11668
  models:
11669
  - regex: 'SSQ-A0500(?:[);/ ]|$)'
11670
  model: 'Smart Stick 4K'
11671
+ - regex: '(Infinity K8|Smart Box (?:v00[345789]|Quad|Ultra HD v002|4K V001))(?:[);/ ]|$)'
11672
  model: '$1'
11673
 
11674
  # Rover
11739
  model: 'Galaz'
11740
  - regex: 'NEWDUN(?:[);/ ]|$)'
11741
  model: 'Newdun'
11742
+ - regex: 'SANTIN[ _][#]?(Dante|Candy U7|Armor|YSL-Y7|ANT.W|N[13]|JS|S6|V9|Life Shine)(?:[);/ ]|$)'
11743
  model: '$1'
11744
 
11745
  # Siemens
11764
 
11765
  # Samsung
11766
  Samsung:
11767
+ regex: 'SAMSUNG(?! ?Browser)|Maple |SC-(?:02[CHMKJG]|03[JLK]|04[ELJ]|05G|52A|01[HFGLKM])|N[57]100|N5110|N9100|S(?:CH|GH|PH|EC|AM|HV|HW|M)-|SMART-TV|GT-|(?<!GOG|GOG )Galaxy|(?:portalmmm|o2imode)/2\.0 [SZ]|sam[rua]|vollo Vi86(?:[);/ ]|$)|(?:OTV-)?SMT-E5015|ISW11SC|SCV4[0-8]|SCV3[1-9]|40[34]SC|SCL2[234]|SCG0[123567]|SCT21'
11768
  device: 'smartphone'
11769
  models:
11770
  # explicit tv models
12291
  model: 'Galaxy S6 Edge'
12292
  - regex: '(?:SAMSUNG-)?SM-G928(?:7C|R4|W8|[07ACFGIKLPSTVX])'
12293
  model: 'Galaxy S6 Edge+'
12294
+ - regex: '(?:SAMSUNG-)?SM-G930(?:FD|W8|[0AFKLPRSTUVX8]|T1|AZ)?(?:[);/ ]|$)'
12295
  model: 'Galaxy S7'
12296
  - regex: '(?:SAMSUNG-)?SM-G935(?:R4|W8|[0AFKLPSTUVX])|SC-02H|SCV33'
12297
  model: 'Galaxy S7 Edge'
12315
  model: 'Galaxy S10 Lite'
12316
  - regex: '(?:SAMSUNG-)?(?:SM-G975[0FUWNX]|SCV42|SC-04L)'
12317
  model: 'Galaxy S10+'
12318
+ - regex: '(?:SAMSUNG-)?SM-G970(?:[08FUNWX]|U1)(?:[);/ ]|$)'
12319
  model: 'Galaxy S10e'
12320
  - regex: '(?:SAMSUNG-)?SM-G980F'
12321
  model: 'Galaxy S20'
12322
  - regex: '(?:SAMSUNG-)?SM-G981(?:[0BNUW]|U1)|SCG01'
12323
  model: 'Galaxy S20 5G'
12324
+ - regex: '(?:SAMSUNG-)?SM-G780F'
12325
+ model: 'Galaxy S20 FE'
12326
+ - regex: '(?:SAMSUNG-)?SM-G988(?:[0BNUW]|U1)|SCG03'
12327
  model: 'Galaxy S20 Ultra 5G'
12328
  - regex: '(?:SAMSUNG-)?SM-G985F|SCG02'
12329
  model: 'Galaxy S20+'
12345
  model: 'Galaxy Avant'
12346
  - regex: '(?:SAMSUNG-)?SM-A015[AFGM]'
12347
  model: 'Galaxy A01'
12348
+ - regex: '(?:SAMSUNG-)?SM-A013M'
12349
+ model: 'Galaxy A01 Core'
12350
  - regex: '(?:SAMSUNG-)?SM-A260[FG]'
12351
  model: 'Galaxy A2 Core'
12352
  - regex: '(?:SAMSUNG-)?SM-A300(?:FU|YZ|XU|[09FGHMY])'
12413
  model: 'Galaxy A10s'
12414
  - regex: '(?:SAMSUNG-)?SM-(?:S102DL|A102[NWU])'
12415
  model: 'Galaxy A10e'
12416
+ - regex: '(?:SAMSUNG-)?SM-A115[FM]'
12417
  model: 'Galaxy A11'
12418
  - regex: '(?:SAMSUNG-)?SM-(?:A205(?:[FGSWU]|YN|U1)|S205DL)|SC-02M|SCV46'
12419
  model: 'Galaxy A20'
12420
  - regex: '(?:SAMSUNG-)?SM-A215U(?:[);/ ]|$)'
12421
  model: 'Galaxy A21'
12422
+ - regex: '(?:SAMSUNG-)?SM-A217[FM](?:[);/ ]|$)'
12423
  model: 'Galaxy A21s'
12424
  - regex: '(?:SAMSUNG-)?SM-A202[FG]'
12425
  model: 'Galaxy A20e'
12443
  model: 'Galaxy A50s'
12444
  - regex: '(?:SAMSUNG-)?SM-A507FN'
12445
  model: 'Galaxy A50s'
12446
+ - regex: '(?:SAMSUNG-)?SM-A515[FU]'
12447
  model: 'Galaxy A51'
12448
+ - regex: '(?:SAMSUNG-)?SCG07'
12449
+ model: 'Galaxy A51 5G'
12450
  - regex: '(?:SAMSUNG-)?SM-A705(?:GM|[MYF]N|F|[W0X])'
12451
  model: 'Galaxy A70'
12452
  - regex: '(?:SAMSUNG-)?SM-A707[0F]'
12645
  - regex: '(?:SAMSUNG-)?SM-(?:F900[0FU]|F907[BN])|SCV44'
12646
  model: 'Galaxy Fold'
12647
  device: 'phablet'
12648
+ - regex: '(?:SAMSUNG-)?SCG05'
12649
+ model: 'Galaxy Z Fold 2'
12650
+ device: 'phablet'
12651
  - regex: '(?:SAMSUNG-)?GT-I9060(?:[);/ ]|$)'
12652
  model: 'Galaxy Grand Neo'
12653
  device: 'phablet'
12865
  model: 'Element 9.7'
12866
  - regex: '(?:SENCOR[ _])?ELEMENT10[ _]1'
12867
  model: 'Element 10.1'
12868
+ - regex: '(?:SENCOR[ _])?(7Q105)(?:[);/ ]|$)'
12869
+ model: '$1'
12870
 
12871
  - regex: '(?:SENCOR[ _])?ELEMENT[ _]?P([0-9]+)'
12872
  model: 'Element P$1'
12899
  - regex: 'Senwa[ _-]*([^ ;/)]+)(?:[);/ ]|$)'
12900
  model: '$1'
12901
 
12902
+ # Sky or Sky Devices (skydevices.com)
12903
  Sky:
12904
+ regex: '(?:SKY|Elite|Fuego)[_ ][3-7]\.[05](?:[A-Z]{1,2})?|Elite_5_5_Octa|Elite (?:M45|GO|M5Plus|T4)|Platinum[_ ](?:5.0M|M5|[ABC]4|[CG]55|[BDEFG]5|P9|X|UNO|VIEW2)'
12905
  device: 'smartphone'
12906
  models:
12907
+ - regex: 'Platinum_(?:5.0M|M5)'
12908
  model: 'Platinum 5.0M'
12909
+ - regex: 'Platinum[_ ](P9) Pro(?:[);/ ]|$)'
12910
+ model: 'Platinum $1 Pro'
12911
+ - regex: 'Platinum[_ ]([ABC]4|[CG]55|[BDEFG]5|P9|X|UNO)(?:[);/ ]|$)'
12912
+ model: 'Platinum $1'
12913
+ - regex: 'Platinum[_ ]VIEW2(?:[);/ ]|$)'
12914
+ device: 'tablet'
12915
+ model: 'Platinum View2'
12916
  - regex: 'Elite_5_5_Octa'
12917
  model: 'Elite 5.5 Octa'
12918
+ - regex: 'Elite M5Plus'
12919
+ model: 'Elite M5 Plus'
12920
+ - regex: 'Elite (M45|Go|T4)'
12921
+ model: 'Elite $1'
12922
  - regex: 'Elite[_ ]([3-7]\.[05](?:[A-Z]{1,2})?\+?)'
12923
  model: 'Elite $1'
12924
  - regex: 'Fuego[_ ]([3-7]\.[05](?:[A-Z]{1,2})?\+?)'
13006
 
13007
  # STF Mobile
13008
  STF Mobile:
13009
+ regex: '(?:Fractal|AERIAL PLUS|Origins Pro|BLOCK GO|BLOCK 3)(?:[);/ ]|$)'
13010
  device: 'smartphone'
13011
  models:
13012
  - regex: 'Fractal'
13015
  model: 'Origins Pro'
13016
  - regex: 'AERIAL PLUS'
13017
  model: 'Aerial Plus'
13018
+ - regex: 'BLOCK 3'
13019
+ model: 'Block 3'
13020
+ - regex: 'BLOCK GO'
13021
+ model: 'Block Go'
13022
 
13023
  # STK
13024
  STK:
13091
 
13092
  # Thomson
13093
  Thomson:
13094
+ regex: '(?:Primo(7|8)|QM73[45]-8G|QM734-2|QM736-8G\(HD\)|(?<!\.)8950|MID1002|5014G|TEO7RK|Delight TH201)(?:[);/ ]|$)|(?:Tlink|Every)[0-9]+'
13095
  device: 'tablet'
13096
  models:
13097
  # already detected as manta device
13107
  model: 'QM735-8G'
13108
  - regex: 'QM736-8G\(HD\)'
13109
  model: 'QM736-8G (HD)'
13110
+ - regex: '(?<!\.)8950(?:[);/ ]|$)'
13111
  model: '3G 8950'
13112
+ - regex: 'TEO7RK(?:[);/ ]|$)'
13113
+ model: 'TEO7RK'
13114
 
13115
  - regex: '5014G(?:[);/ ]|$)'
13116
  device: 'smartphone'
13121
  - regex: 'Every([0-9]+)'
13122
  device: 'smartphone'
13123
  model: 'Every$1'
13124
+ - regex: 'Delight TH201'
13125
+ device: 'smartphone'
13126
+ model: 'Delight TH201'
13127
+
13128
+ # Tanix
13129
+ Tanix:
13130
+ regex: 'TX5 MAX(?:[);/ ]|$)'
13131
+ device: 'tv'
13132
+ model: 'TX5 Max'
13133
 
13134
  # pantech
13135
  Pantech:
13136
+ regex: 'Pantech|P[GN]-|PT-[a-z0-9]{3,}|(?<!Winmax )TX[T]?[0-9]+|IM-[a-z0-9]+(?:[);/ ]|$)|ADR910L'
13137
  device: 'smartphone'
13138
  models:
13139
  # explicit smartphone models
13167
  - regex: 'MOMO([0-9][^);/]*)(?:[);/]|$)'
13168
  model: 'MOMO $1'
13169
 
13170
+ # Plum (plum-mobile.com)
13171
  Plum:
13172
+ regex: 'PLUM[ _]'
13173
  device: 'smartphone'
13174
  models:
13175
  - regex: 'Z405'
13176
  model: 'Gator 3'
13177
+ - regex: 'Z407'
13178
+ model: 'Axe 4'
13179
+ - regex: 'Z516'
13180
+ model: 'Compass'
13181
+ - regex: 'Z811'
13182
+ device: 'tablet'
13183
+ model: 'Optimax 11'
13184
+ - regex: 'Z709'
13185
+ device: 'tablet'
13186
+ model: 'Optimax 7'
13187
+ - regex: 'Z712'
13188
+ device: 'tablet'
13189
+ model: 'Optimax 12'
13190
 
13191
  # Polaroid
13192
  Polaroid:
13193
+ regex: 'Polaroid|(?:PMID|MIDC)[0-9a-z]+(?:[);/ ]|$)|MID(?:1014|0714)|PRO[VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z])|(?:P(?:400[56]|4526|500[56]|502[56]|504[67]|552[56])A|P902/A900|PSPC(?:505|550|[MZL]20A0|K21NA)|SIGMA 5|MIDS145PXE|MIDS747PX|MID4004JBL|MIDS185PR)(?:[);/ ]|$)'
13194
  device: 'smartphone'
13195
  models:
13196
  # explicit smartphone models
13237
  - regex: 'PRO([VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z]))'
13238
  model: 'Pro$1'
13239
 
13240
+ - regex: 'MIDS185PR'
13241
+ model: 'Pure 10.1"'
13242
+ - regex: '(MID(?:1014|0714|S145PXE|S747PX|4004JBL))'
13243
  model: '$1'
13244
  device: 'tablet'
13245
+
13246
  - regex: '((?:PMID|MIDC)[0-9a-z]+)(?:[);/ ]|$)'
13247
  model: '$1'
13248
  device: 'tablet'
13401
  - regex: 'MobilePhone ([a-z0-9\-]+)'
13402
  model: '$1'
13403
 
13404
+ # Qilive
13405
  Qilive:
13406
  regex: 'Qilive [0-9][^;/]*|Q(7S5[5]?IN4G|7T10INP|8T10IN|8S55IN4G2|8S[56]IN4G|10S5[37]IN4G|10S[56]IN4G|10S[56]IN4GR|9S5IN4G|6T7IN)'
13407
  device: 'smartphone'
13448
 
13449
  # QMobile
13450
  QMobile:
13451
+ regex: 'QMobile|QTab|Q-Smart|Noir X1S|LUNA PRO|NICE S|JazzX JS(?:[27]|10)(?: PRO)?'
13452
  device: 'smartphone'
13453
  models:
13454
+ - regex: 'JazzX JS7 PRO'
13455
+ model: 'Jazz X JS7 Pro'
13456
+ - regex: 'JazzX JS(2|10)'
13457
+ model: 'Jazz X JS$1'
13458
  - regex: 'QTab[ _-]([^;/]+) Build'
13459
  model: '$1 Tab'
13460
  device: 'tablet'
13587
 
13588
  # Sharp (jp.sharp)
13589
  Sharp:
13590
+ regex: 'SHARP|SBM|SH-?[0-9]+[a-z]?(?:[);/ ]|$)|AQUOS|(?:SH-M0[1456789]|SH-M1[12346](?:-y)?|S[357]-SH|SH-[MZ](10|01)|SH-[CL]02|SH-RM(?:1[125]|02)|[34]04SH|401SH|[45]02SH|306SH|[36]05SH|70[1246]SH|80[138]SH|90[1678]SH|50[3679]SH|SHL2[25]|SHV4[0-8]|SHV3[1-9](?:[-_]u)?|FS80(?:1[08]|32|28|0[29])|TG-L900S|NP601SH|403SH|603SH|SHF3[34]|SHV4[035][-_]u|SW001SH|SHG0[12]|X4-SH|A002SH|SH-A01|DM-01J|SH-D01|A001SH|606SH|FS801[56]|d-41A)(?:[);/ ]|$)'
13591
  device: 'smartphone'
13592
  models:
13593
  # explicit smartphone models
13599
  model: 'Aquos Xx2'
13600
  - regex: '[34]04SH(?:[);/ ]|$)'
13601
  model: 'Aquos Xx'
13602
+ - regex: '606SH(?:[);/ ]|$)'
13603
+ model: 'Aquos ea'
13604
  - regex: '507SH(?:[);/ ]|$)'
13605
  model: 'Android One'
13606
  - regex: 'S3-SH(?:[);/ ]|$)'
13617
  model: 'Aquos Sense Lite'
13618
  - regex: 'SH-M07(?:[);/ ]|$)'
13619
  model: 'Aquos Sense Plus'
13620
+ - regex: 'SH-D01(?:[);/ ]|$)'
13621
+ model: 'Aquos D10'
13622
+ - regex: 'SH-M12(?:-y)?(?:[);/ ]|$)'
13623
  model: 'Aquos S3 Dual SIM'
13624
  - regex: '(?:SH-[MZ]10|801SH)(?:[);/ ]|$)'
13625
  model: 'Aquos Zero'
13633
  model: 'Aquos Phone Zeta'
13634
  - regex: 'SH06D(?:[);/ ]|$)'
13635
  model: 'Aquos Phone SH-06D'
13636
+ - regex: '(SHL2[25]|SH-M01)(?:[);/ ]|$)'
13637
+ model: 'Aquos Phone $1'
13638
  - regex: 'SH-L02(?:[);/ ]|$)'
13639
  model: 'Aquos L2'
13640
  - regex: '(?:605SH|SH-03J|SHV39)(?:[);/ ]|$)'
13641
  model: 'Aquos R'
13642
  - regex: '(?:605SH|SH-03J|SHV39)(?:[);/ ]|$)'
13643
  model: 'Aquos R'
13644
+ - regex: '(?:701SH|SHV41|SH-M06)(?:[);/ ]|$)'
13645
  model: 'Aquos R Compact'
13646
  - regex: '(?:SH-M09|SHV42|706SH|SH-03K)(?:[);/ ]|$)'
13647
  model: 'Aquos R2'
13648
  - regex: '803SH(?:[);/ ]|$)'
13649
  model: 'Aquos R2 Compact'
13650
+ - regex: '(?:908SH|SHG01|SH-M14)(?:[);/ ]|$)'
13651
  model: 'Aquos R5G'
13652
+ - regex: 'SH-M16(?:[);/ ]|$)'
13653
+ model: 'Aquos S4 Plus'
13654
  - regex: 'SH-C02(?:[);/ ]|$)'
13655
  model: 'Aquos V'
13656
+ - regex: '(SHF3[34])(?:[);/ ]|$)'
13657
+ model: 'Aquos K $1'
13658
  - regex: '704SH(?:[);/ ]|$)'
13659
  model: 'Simple Smartphone 4'
13660
  - regex: '(?:SH-02J|SH-04G)(?:[);/ ]|$)'
13665
  model: 'Aquos Crystal'
13666
  - regex: '402SH(?:[);/ ]|$)'
13667
  model: 'Aquos Crystal X'
13668
+ - regex: '403SH(?:[);/ ]|$)'
13669
+ model: 'Aquos Crystal 2'
13670
  - regex: '509SH(?:[);/ ]|$)'
13671
  model: 'Aquos 3'
13672
  - regex: 'NP601SH(?:[);/ ]|$)'
13679
  model: 'Aquos S Mini'
13680
  - regex: '(?:FS8010|SH-M08|SHV43(?:-u)?|SH-01[KL])(?:[);/ ]|$)'
13681
  model: 'Aquos S2'
13682
+ - regex: 'FS8016(?:[);/ ]|$)'
13683
+ model: 'Aquos S2 Plus'
13684
  - regex: '(?:SHV46|SH-R?M11|901SH)(?:[);/ ]|$)'
13685
  model: 'Aquos S3 Plus'
13686
  - regex: '(?:SHV44|808SH|SH-04L|SH-03G)(?:[);/ ]|$)'
13687
  model: 'Aquos R3'
13688
+ - regex: '(?:FS8032|FS8015|SH-02M|SHV45(?:-U)?)(?:[);/ ]|$)'
13689
  model: 'Aquos S3'
13690
  - regex: 'FS8018(?:[);/ ]|$)'
13691
  model: 'Aquos S3 Mini'
13693
  model: 'Aquos S3 Basic'
13694
  - regex: 'SH-RM12(?:[);/ ]|$)'
13695
  model: 'Aquos S3 Lite'
13696
+ - regex: 'SH-RM15(?:[);/ ]|$)'
13697
+ model: 'Aquos S4 Lite'
13698
  - regex: 'SH-51A(?:[);/ ]|$)'
13699
  model: 'Aquos R5G'
13700
  - regex: 'SHV3[57](?:_u)?(?:[);/ ]|$)'
13719
  model: 'Aquos 401SH'
13720
  - regex: 'DM-01J'
13721
  model: 'Disney Mobile'
13722
+ - regex: 'A001SH'
13723
+ model: 'Simple Sumaho 5' # (Simple Smartphone 5)
13724
 
13725
  # explicit tablet models
13726
  - regex: 'SH-08E(?:[);/ ]|$)'
13727
  device: 'tablet'
13728
  model: 'Sharp Aquos Pad'
13729
+ - regex: 'd-41A(?:[);/ ]|$)'
13730
+ device: 'tablet'
13731
+ model: 'dtab d-41A'
13732
 
13733
  - regex: '(LC-(?:[0-9]{2})[a-z0-9]+)(?:[);/ ]|$)'
13734
  device: 'tv'
13779
  - regex: 'N(9[5678]00|8800|9977)(?:[);/ ]|$)'
13780
  model: 'N$1'
13781
 
13782
+ # Starmobile (starmobile.ph)
13783
+ Starmobile:
13784
+ regex: '(?:Starmobile (?:Play (?:Neo|Spark|GO))|UP[_ ](?:Groove|Prime|Selfie|Xtreme|XL))(?:[);/ ]|$)'
13785
+ device: 'smartphone'
13786
+ models:
13787
+ - regex: 'Starmobile PLAY GO(?:[);/ ]|$)'
13788
+ model: 'Play Go'
13789
+ - regex: 'Starmobile (Play (?:Neo|Spark))(?:[);/ ]|$)'
13790
+ model: '$1'
13791
+ - regex: 'UP[_ ](Groove|Prime|Selfie|Xtreme|XL)(?:[);/ ]|$)'
13792
+ model: 'UP $1'
13793
+
13794
  # Kindle
13795
  Amazon:
13796
  regex: 'KF(?:OT|ONWI|TT|JWI|JWA|[DFS]OWI|A[PRSU]WI|T[BH]WI|SAW[IA]|GIWI|KAWI|MAWI|MEWI|MUWI|SUWI)(?:[);/ ]|$)|Kindle|Silk/\d+\.\d+|Amazon (?:Tate|Jem)|AFT[ABMNRST]|SD4930UR|AEO(BC|KN)(?:[);/ ]|$)'
13885
  - regex: 'SYMPHONY[ \_]([a-z0-9]+)'
13886
  model: '$1'
13887
 
13888
+ # Helio
13889
+ Helio:
13890
+ regex: 'Helio (S60|S5)(?:[);/ ]|$)'
13891
+ device: 'smartphone'
13892
+ model: '$1'
13893
+
13894
  # Syrox
13895
  Syrox:
13896
  regex: '(SYX-(?:T70[04]|T10[12]))(?:[);/ ]|$)'
13933
  - regex: 'Ignis ([89])'
13934
  model: 'Ignis $1'
13935
 
13936
+ # Teclast (teclast.com)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13937
  Teclast:
13938
+ regex: 'Teclast|TLA002|TLA016|X98 Air III|M20_4G|X98 Air II\(HG5N\)|Tbook|X80 Power\(B2N4\)|(?:T30|P80X|P20HD)_(?:ROW|EEA)|T10\(E3C6\)|P10S\(N4H5\)|98\(M1E[45789]\)|98\(M3E3\)'
13939
  device: 'tablet'
13940
  models:
13941
  - regex: 'Tbook[_ -]([^;/]+) Build'
13950
  model: 'P10S'
13951
  - regex: 'P20HD_(?:ROW|EEA)'
13952
  model: 'P20HD'
13953
+ - regex: 'M20_4G'
13954
+ model: 'M20 4G'
13955
+ - regex: 'TLA002'
13956
+ model: 'M30 4G'
13957
+ - regex: 'TLA016'
13958
+ model: 'M16'
13959
  - regex: '98\(M1E[45789]\)|98\(M3E3\)'
13960
  model: 'TPad 98 10.1" 4G'
13961
  - regex: 'X80 Power\(B2N4\)(?:[);/ ]|$)'
14013
  models:
14014
  - regex: 'S813G'
14015
  model: 'S813G'
14016
+ - regex: 'TechPad10QC'
14017
+ model: '10QC'
14018
+ - regex: 'TechPad_10xx'
14019
+ model: '10XX'
14020
+ - regex: 'TechPad703'
14021
+ model: '703'
14022
+ - regex: 'TechPad[_ ](10Y|9x|i700)'
14023
+ model: '$1'
14024
+ - regex: 'TechPad[_ ]3Gx'
14025
+ model: '3Gx'
14026
  - regex: 'Dual C1081HD'
14027
  model: 'XTAB C1081HD'
14028
  - regex: 'XTAB[ _-]([^/;]+) Build'
14029
  model: 'XTAB $1'
14030
+ - regex: 'Tech ?pad[ _-]([^/;)]+)(?: Build|[;)])'
14031
  model: '$1'
14032
  device: 'smartphone'
14033
 
14034
  # Tesco
14035
  Tesco:
14036
+ regex: 'Hudl (?:[^/;]+)(?: Build|[;)])|W032i-C3(?:[);/ ]|$)'
14037
  device: 'tablet'
14038
  models:
14039
+ - regex: 'Hudl ([^/;]+)(?: Build|[;)])'
14040
  model: 'Hudl $1'
14041
  - regex: 'W032i-C3(?:[);/ ]|$)'
14042
  model: 'Op3n Dott'
14202
 
14203
  # Telenor
14204
  Telenor:
14205
+ regex: '(?<!FBCR/)Telenor|Infinity E5'
14206
  device: 'smartphone'
14207
  models:
14208
+ - regex: 'Telenor[ _]([^;/]+)(?: Build|[;)])'
 
 
14209
  model: '$1'
14210
+ - regex: 'Infinity E5'
14211
+ model: 'Infinity E5'
14212
 
14213
  # Telit
14214
  Telit:
14422
 
14423
  # Ulefone
14424
  Ulefone:
14425
+ regex: 'Ulefone|Gemini Pro|Power_[356]|S10_Pro|(?:Armor(?:(?:[ _])(?:[2367]|2S|X[236]|6[SE]|3WT|3W|X))?|U00[78][ _]Pro|Be[ _]X|Be[ _]Touch(?:[ _][23])?|Be[ _](?:One|Pure)(?:[ _]Lite)?)(?:[);/ ]|$)'
14426
  device: 'smartphone'
14427
  models:
14428
  - regex: 'S10_Pro'
14447
  model: 'Armor X$1'
14448
  - regex: 'Armor[ _]6S(?:[);/ ]|$)'
14449
  model: 'Armor 6S'
14450
+ - regex: 'Armor[ _]([679])E(?:[);/ ]|$)'
14451
+ model: 'Armor $1E'
14452
+ - regex: 'Armor[ _]X([57]) Pro(?:[);/ ]|$)'
14453
+ model: 'Armor X$1 Pro'
14454
+ - regex: 'Armor[ _]X([578])(?:[);/ ]|$)'
14455
+ model: 'Armor X$1'
14456
+ - regex: 'Armor[ _]([25])S(?:[);/ ]|$)'
14457
+ model: 'Armor $1S'
14458
  - regex: 'Armor[ _]X(?:[);/ ]|$)'
14459
  model: 'Armor X'
14460
  - regex: 'Armor[ _]3W(?:[);/ ]|$)'
14461
  model: 'Armor 3W'
14462
  - regex: 'Armor[ _]3WT(?:[);/ ]|$)'
14463
  model: 'Armor 3WT'
14464
+ - regex: 'Armor[ _]([236789])(?:[);/ ]|$)'
14465
  model: 'Armor $1'
14466
  - regex: 'Armor(?:[);/ ]|$)'
14467
  model: 'Armor'
14476
  - regex: 'Ulefone[ _-]?([^;/)]+)(?:[;/)]|$)'
14477
  model: '$1'
14478
 
14479
+ # UMIDIGI or UMI
14480
  UMIDIGI:
14481
+ regex: 'UMI(?:DIGI)?[ _]|(?:A5_Pro|ROME[_ ]X|BISON|hammer_S)(?:[;/) ]|$)'
14482
  device: 'smartphone'
14483
  models:
14484
  - regex: 'A5_Pro'
14489
  model: 'Touch'
14490
  - regex: 'ROME[_ ]X'
14491
  model: 'Rome X'
14492
+ - regex: 'BISON'
14493
+ model: 'Bison'
14494
+ - regex: 'hammer_S'
14495
+ model: 'Hammer S'
14496
  - regex: 'UMI_(London|Diamond(?:_X)?)'
14497
  model: '$1'
14498
+ - regex: 'UMI(?:DIGI)?[ _]([^/;)]+)(?: Build|[;)])'
14499
  model: '$1'
14500
 
14501
  # Uniscope
14598
 
14599
  # VK Mobile
14600
  VK Mobile:
14601
+ regex: 'VK-VK([79]00)(?:[);/ ]|$)'
14602
  device: 'feature phone'
14603
+ model: 'VK$1'
14604
 
14605
  # Vernee
14606
  Vernee:
14678
 
14679
  # Vestel (vestel.com)
14680
  Vestel:
14681
+ regex: 'Vestel[ _]|Venus[ _](GO|E[2-5]|V[1-9]|Z[1-9]0)|V_?TAB|VP74|VT97PRO|VSP145M|VSP250[GS]|VSP355[GS]|V3_5580_Dual'
14682
  device: 'smartphone'
14683
  models:
14684
  - regex: 'VT97PRO'
14714
  model: 'Venus Z$1'
14715
  - regex: 'Venus[ _]GO'
14716
  model: 'Venus Go'
14717
+ - regex: 'Venus E2 Plus Dual'
14718
+ model: 'Venus E2 Plus Dual'
14719
+ - regex: 'Venus[ _]E2 Plus'
14720
+ model: 'Venus E2 Plus'
14721
+ - regex: 'Venus[ _]E([345])'
14722
  model: 'Venus E$1'
14723
  - regex: 'Vestel_5000_Dual'
14724
  model: '5000 Dual'
14850
 
14851
  # Vonino
14852
  Vonino:
14853
+ regex: 'Vonino|Epic (?:E8|P7)|Gyga[ _](?:X|S|QS|XS)|Jax[ _](?:QS|[SXQN]|Mini)|Magnet[ _]M[19]|Navo_QS|Onyx_(QS|Z)|Orin_QS|Pluri[ _](?:[BCMQ]7|[CQM]8)|Sirius_QS|Volt[ _][XS]|Xavy_(T7|L8)|Xylo[ _][XSPQ]|Zun[ _]X[OS]?|JAX_N'
14854
  device: 'smartphone'
14855
  models:
14856
  - regex: 'Zun[ _]XO'
14887
  - regex: 'Pluri[ _](B|C|M|Q)7'
14888
  model: 'Pluri $17'
14889
  device: 'tablet'
14890
+ - regex: 'Pluri[ _]([CQM])8'
14891
  model: 'Pluri $18'
14892
  device: 'tablet'
14893
  - regex: 'Magnet[ _]M([19])'
14940
 
14941
  # Vulcan
14942
  Vulcan:
14943
+ regex: '(?:VP5004A|HT0704W08|VS5513|VS4011|VR6031)(?:[);/ ]|$)'
14944
  device: 'smartphone'
14945
  models:
14946
+ - regex: '(VP5004A|VR6031)(?:[);/ ]|$)'
14947
+ model: '$1'
14948
+ - regex: 'VS5513(?:[);/ ]|$)'
14949
+ model: 'Tempo S13'
14950
+ - regex: 'VS4011(?:[);/ ]|$)'
14951
+ model: 'Tempo S11'
14952
+ - regex: 'HT0704W08' # Hyundai
14953
+ model: 'Koral 7W4'
14954
+ device: 'tablet'
14955
 
14956
  # Walton
14957
  Walton:
15005
 
15006
  # Wiko (wikomobile.com)
15007
  Wiko:
15008
+ regex: '(?:WIKO[_ -])|(?:WIKO-)?CINK_[a-z0-9_]+|(?:WIKO-)?HIGHWAY_[a-z0-9_]+|(?:WIKO-)?(?:Cink([^/;]*)|Highway([^/;]*)|Iggy|Stairway|Rainbow ?(Jam|Lite|Up)?|Darkside|Darkmoon|Darkfull|Darknight|Freddy|FEVER|Jerry[2]?|Sublim|Ozzy|JIMMY|Barry|Birdy|Bloom|Getaway|Goa(?!nna)|Kite|Robby|Lenny[2-9]?|Slide|Sunset[2-9]?|Sunny[2-9]?|Tommy[2-9]?|PULP(?: Fab)?|Wax|HARRY|Ridge(?: Fab)?|U FEEL(?: Prime| Lite)?|U PULSE(?: LITE)?|View2 Go|View XL|View Prime)(?: Plus)?(?: 4G)?(?: Build|$)?|W_(?:C8[06]0|K[346]00|P130|P200|C200SN)|WC300|W-(?:V7[23]0|V8[30]0|P[36]11|K420|K510S?|K130)-(?:TMV|TIM|TVM|EEA|SUN|SWI|OPE|BYT|DU|TH)|WIM Lite|W-K360-TV|W-V600|W-K200|W-U300|U307AS|CINK PEAX 2|HIGHWAY PURE|C210AE'
15009
  device: 'smartphone'
15010
  models:
15011
  - regex: '(?:WIKO-)?Cink Peax 2'
15078
  model: 'Kite'
15079
  - regex: 'W_K400'
15080
  model: 'Lenny 5'
15081
+ - regex: 'C210AE(?:[);/ ]|$)'
15082
+ model: 'Life'
15083
  - regex: 'U307AS(?:[);/ ]|$)'
15084
  model: 'Life 2'
15085
  - regex: '(?:WIKO-)?Lenny[ -_]?3 Max'
15274
 
15275
  # X-View
15276
  X-View:
15277
+ regex: 'ZEN_U5\+|AMBER_KIDS|Proton_Amber_HD|PROTON_JADE_2_PRO'
15278
  device: 'smartphone'
15279
  models:
15280
+ - regex: 'ZEN_U5\+'
15281
  model: 'ZEN U5+'
15282
+ - regex: 'AMBER_KIDS'
15283
+ device: 'tablet'
15284
+ model: 'Amber Kids'
15285
+ - regex: 'Proton_Amber_HD'
15286
+ device: 'tablet'
15287
+ model: 'Proton Amber HD'
15288
+ - regex: 'PROTON_JADE_2_PRO'
15289
+ device: 'tablet'
15290
+ model: 'Proton Jade 2 Pro'
15291
 
15292
  # POCO (sub brand Xiaomi)
15293
  POCO:
15303
 
15304
  # Xiaomi
15305
  Xiaomi:
15306
+ regex: 'Xiaomi(?!/(?:Miui|Mint[ ])Browser)|Mi9 Pro 5G|(?:MI [a-z0-9]+|Mi-4c|MI-One[ _]?[a-z0-9]+|MIX(?: 2S?)?)(?:[);/ ]|$)|HM (?:[^/;]+) (?:Build|MIUI)|(?:2014501|2014011|201481[12378]|201302[23]|2013061) Build|Redmi|MI_NOTE_Pro|POCOPHONE|(?:SHARK )?(KLE|MBU)-[AH]0|SKR-[AH]0|SKW-[AH]0|POCO F1|DLT-[AH]0|MIBOX[234]([_ ]PRO)?|MiTV4[CSX]?|MiTV-(MSSP[01]|AXSO0)|AWM-A0|MI CC 9 Meitu Edition|MiBOX1S|MiTV4A|M2006J10C|M2006C3(?:L[IGC]|LVG|MN?G)|M2007J1SC|M2002J9[EG]|HM2014819|WT88047|M2004J(?:7[AB]|19)C|M2006C3MII|M2003J15SC|M2007J3S[CYG]|HM NOTE 1(?:LTE|W)|MI[_ ]PLAY|XIG01'
15307
  device: 'smartphone'
15308
  models:
15309
  # specific smartphone models
15409
  model: 'Redmi K20 Pro'
15410
  - regex: 'Redmi K30 5G(?:[);/ ]|$)'
15411
  model: 'Redmi K30 5G'
15412
+ - regex: 'M2006J10C(?:[);/ ]|$)'
15413
+ model: 'Redmi K30 Ultra'
15414
 
15415
  - regex: 'MI PAD 4 PLUS(?:[);/ ]|$)'
15416
  model: 'Mi Pad 4 Plus'
15773
 
15774
  # Vivax (www.vivax.com)
15775
  Vivax:
15776
+ regex: 'VIVAX|(?:Fly5[_ ]Lite|Fun[_ ]S500|Point_(?:X2|X501)|PRO3|32LE77SM|40LE77SM)(?:[);/ ]|$)'
15777
  device: 'smartphone'
15778
  models:
15779
  - regex: 'Fly5[_ ]Lite(?:[);/ ]|$)'
15784
  model: 'Fun S500'
15785
  - regex: 'VIVAX[ _]Fly3(?:[);/ ]|$)'
15786
  model: 'Fly 3'
15787
+ - regex: 'VIVAX[ _]Fly[ _]V1(?:[);/ ]|$)'
15788
+ model: 'Fly V1'
15789
+ - regex: '(?:VIVAX )?(Point[ _](?:X551|X501))(?:[);/ ]|$)'
15790
  model: '$1'
15791
  - regex: 'SMART Point X5010(?:[);/ ]|$)'
15792
  model: 'Smart Point X5010'
15795
  - regex: 'VIVAX TABLET TPC 802 3G(?:[);/ ]|$)'
15796
  model: 'TPC-802 3G'
15797
 
15798
+ - regex: '(32LE77SM|40LE77SM)'
15799
+ device: 'tv'
15800
+ model: '$1'
15801
+
15802
  # MLS
15803
  MLS:
15804
  regex: 'IQ(?:0705|L550|1010w?|1012N?|1019N|1025|1380|1401|1436|1452a|1453|1470|1502a|1511|1552|1553|1568|1570|1805N|1806|1808|1810B_M|1832|1850|1890|5017|9610|181011N|E[12]00|EL41|G550|GW516|L30|L5[01]|M801|M1001|N700|P50|R300|S300|S1001|W503|W511T|W553N?|W60[38]|W626|M960|D700|9013_4N)(?:[);/ ]|$)'
16263
 
16264
  # ZTE
16265
  ZTE:
16266
+ regex: 'ZTE|AxonPhone|([a-z0-9]+)_USA_Cricket|(?:Blade (?:V0820|L110|L[2357]|L7A|S6|V[6789]|V8Q|V8 SE|V9 VITA|X7|A(310|460|465|475|520|530|602)|V580|V Ultra|Q Lux)|N9[15]8St|NX(?:403A|404H|406E|40[X2]|507J|503A|505J|506J|508J|510J|512J|511J|513J|521J|523J_V1|529J|531J|541J|5[48]9J|551J|563J|569[HJ]|573J|575J|59[157]J|60[1689]J|61[12679]J|62[79]J|65[19]J|907J)|N818S|N951[0579]|N91[38]0|N9101|N913[267]|N952[01]|N9560|N9810|N799D|[UV]9180|[UV]9815|Z(?:233V|331|5031O|559DL|6621O|667T|768G|792|81[25]|818L|82[08]|83[12359]|85[125]|851M|(557|71[67]|798|836|861|916)BL|986DL|(232|718|828)TL|(?:233|353|558|717|799|837|862|899|917|963)VL|955A|95[678]|965|97[018]|98[1237]|986U|999|936L)|Apex2|G (LTE|Lux)|Vec|Z959|V865M|Z3001S|902ZT|KIS II Max|Kis 3|K3DX-V5G|Z930L|Optus X|Blade[ _](A510|A[357] 2019-T|A6 MAX|A0622|X9)|Z3153V|Nubia Z(?:9|11)|Ctyon-A9|602ZT|MO-01[JK]|Z963U|402ZT|P545|P609|dandelion|901ZT|A001ZT|Z-01K|UZTE V808|ZR01|ZTG01|K83CA)(?:[);/ ]|$)'
16267
  device: 'smartphone'
16268
  models:
16269
  # explicit smartphone models
16273
  model: 'Libero 3'
16274
  - regex: '901ZT(?:[);/ ]|$)'
16275
  model: 'Libero S10'
16276
+ - regex: 'ZR01(?:[);/ ]|$)'
16277
+ model: 'Rakuten Big'
16278
+ - regex: 'ZTG01(?:[);/ ]|$)'
16279
+ model: 'A1'
16280
  - regex: 'A7020(?:[);/ ]|$)'
16281
  model: 'Blade A7s (2020)'
16282
  - regex: 'ZTE 2050(?:[);/ ]|$)'
16336
  - regex: 'N9810(?:[);/ ]|$)'
16337
  model: 'Vital'
16338
  - regex: 'NX40[X2](?:[);/ ]|$)'
16339
+ model: 'Nubia Z5 Mini'
16340
  - regex: 'NX(403[AE]|406E|404H)(?:[);/ ]|$)'
16341
  model: 'Nubia Z5S Mini'
16342
  - regex: 'NX503A(?:[);/ ]|$)'
16344
  - regex: 'NX506J(?:[);/ ]|$)'
16345
  model: 'Nubia Z7'
16346
  - regex: 'NX507J(?:[);/ ]|$)'
16347
+ model: 'Nubia Z7 Mini'
16348
  - regex: 'NX505J(?:[);/ ]|$)'
16349
+ model: 'Nubia Z7 Max'
16350
  - regex: 'NX508J(?:[);/ ]|$)'
16351
  model: 'Nubia Z9'
16352
  - regex: '(NX5[12]1J|Nubia Z9 mini)(?:[);/ ]|$)'
16353
+ model: 'Nubia Z9 Mini'
16354
  - regex: '(NX510J|Nubia Z9 Max)(?:[);/ ]|$)'
16355
+ model: 'Nubia Z9 Max'
16356
  - regex: 'NX512J(?:[);/ ]|$)'
16357
+ model: 'Nubia Z9 Max Dual'
16358
  - regex: 'NX531J(?:[);/ ]|$)'
16359
  model: 'Nubia Z11'
16360
  - regex: 'NX523J_V1'
16361
  model: 'Nubia Z11 Max'
 
 
16362
  - regex: '(?:NX549J|Nubia Z11 mini S)(?:[);/ ]|$)'
16363
+ model: 'Nubia Z11 Mini S'
16364
+ - regex: '(?:NX529J|Nubia Z11 mini)(?:[);/ ]|$)'
16365
+ model: 'Nubia Z11 Mini'
16366
  - regex: 'NX606J(?:[);/ ]|$)'
16367
  model: 'Nubia Z18'
16368
  - regex: 'NX616J(?:[);/ ]|$)'
16369
  model: 'Nubia Z18S'
16370
  - regex: 'NX611J(?:[);/ ]|$)'
16371
+ model: 'Nubia Z18 Mini'
16372
  - regex: 'NX551J(?:[);/ ]|$)'
16373
  model: 'Nubia M2'
16374
  - regex: 'NX563J(?:[);/ ]|$)'
16479
  model: 'Blade L8'
16480
  - regex: 'Blade A3 2019-T(?:[);/ ]|$)'
16481
  model: 'Blade A3 (2019)'
16482
+ - regex: 'Blade A7 2019-T(?:[);/ ]|$)'
16483
+ model: 'Blade A7 (2019)'
16484
+ - regex: 'Blade A7 2020(?:[);/ ]|$)'
16485
+ model: 'Blade A7 (2020)'
16486
  - regex: 'Blade A5 2019-T(?:[);/ ]|$)'
16487
  model: 'Blade A5 (2019)'
16488
  - regex: 'BLADE A0622(?:[);/ ]|$)'
16517
  model: 'Blade V8 SE'
16518
  - regex: 'Blade V9 Vita(?:[);/ ]|$)'
16519
  model: 'Blade V9 Vita'
16520
+ - regex: 'Blade V([89])(?:[);/ ]|$)'
16521
+ model: 'Blade V$1'
16522
  - regex: 'Blade V10 Vita(?:[);/ ]|$)'
16523
  model: 'Blade V10 Vita'
16524
  - regex: 'BLADE V0820(?:[);/ ]|$)'
16660
  - regex: 'Z6621O(?:[);/ ]|$)'
16661
  model: 'Optus X Vista'
16662
 
16663
+ # explicit tablet models
16664
+ - regex: 'K83CA(?:[);/ ]|$)'
16665
+ device: 'tablet'
16666
+ model: 'Grand X View 3'
16667
+
16668
  - regex: 'AxonPhone ([^;/]+) Build'
16669
  model: 'AxonPhone $1'
16670
  - regex: '([a-z0-9]+)_USA_Cricket'
16680
  model: '$1'
16681
 
16682
  Zuum:
16683
+ regex: 'Zuum[ _-]|(?:COVET|MAGNO|ONIX S|STEDI|STELLAR Z|GRAVITY Z|AURA X)(?:[);/ ]|$)'
16684
  device: 'smartphone'
16685
  models:
16686
  - regex: 'COVET'
16693
  model: 'Stedi'
16694
  - regex: 'STELLAR Z'
16695
  model: 'Stellar Z'
16696
+ - regex: 'GRAVITY Z'
16697
+ model: 'Gravity Z'
16698
+ - regex: 'AURA X'
16699
+ model: 'Aura X'
16700
  - regex: 'Zuum[ _-]([^;/]+) Build'
16701
  model: '$1'
16702
  - regex: 'Zuum[ _-]?([^;/)]+)(?:[);/ ]|$)'
16796
  model: '2 Lite (2019)'
16797
  - regex: 'INOI 2 2019'
16798
  model: '2 (2019)'
16799
+ - regex: 'INOI 7 2020'
16800
+ model: '7 (2020)'
16801
  - regex: 'INOI[_ ]([^;/]+)(?: Build|[;)])'
16802
  model: '$1'
16803
 
16835
 
16836
  # Savio
16837
  Savio:
16838
+ regex: ' (TB-PO1|TB-B01)(?:[);/ ]|$)'
16839
  device: 'tv'
16840
+ model: '$1'
 
 
16841
 
16842
  # Simbans
16843
  Simbans:
16865
 
16866
  # X-TIGI
16867
  X-TIGI:
16868
+ regex: 'X[-_]TIGI|Hope7[_ ]Mate|Photo_P15_Lite'
16869
  device: 'smartphone'
16870
  models:
16871
  - regex: 'X-TIGI_JOY10_PRO'
16883
  model: 'V19'
16884
  - regex: 'X-TIGI[_ ]Photo[_ ]P11'
16885
  model: 'Photo P11'
16886
+ - regex: 'Photo_P15_Lite'
16887
+ model: 'Photo P15 Lite'
16888
  - regex: 'X[-_]TIGI[ _-]([^/;)]+) Build'
16889
  model: '$1'
16890
 
16941
 
16942
  # True
16943
  'True':
16944
+ regex: 'SMART[ _](MAX 4.0 PLUS|4G[ _](?:GEN C [45].[05]|Champion|Speedy 5.0 Plus|Speedy[_ ]5inch|P1))'
16945
  device: 'smartphone'
16946
  models:
16947
  - regex: 'SMART MAX 4.0 PLUS'
16952
  model: 'Smart 4G Speedy 5.0 Plus'
16953
  - regex: 'SMART[ _]4G[_ ]Speedy[_ ]5inch'
16954
  model: 'Smart 4G Speedy 5'
16955
+ - regex: 'SMART[ _]4G[_ ]Champion'
16956
+ model: 'Smart 4G Champion'
16957
+ - regex: 'SMART[ _]4G[_ ]P1 Prime'
16958
+ model: 'Smart 4G P1 Prime'
16959
+ - regex: 'SMART[ _]4G[_ ]P1'
16960
+ model: 'Smart 4G P1'
16961
 
16962
  Yandex:
16963
  regex: '(YNDX-?000SB)(?:[);/ ]|$)'
16992
 
16993
  # Highscreen
16994
  Highscreen:
16995
+ regex: 'HIGHSCREEN|(Easy[- ]Power(?:[- ]Pro)?|Pure[_ ](?:Power|F)|Power Ice(?: Max)?|Easy[_ ]([SFL]|XL)(?:_Pro)?|Razar_Pro|Power Rage(?: Evo)?|Zera-S-Power|Zera[ _][UFS]|Power[ _]?Five[ matrixstyle _]?(?:Pro|Evo|Max|Max(?:Lite|2))|PowerFour|BOOST II(?:se)?|FestXL|Fest-Pro|Tasty|Boost3|Boost 3(?: Pro)? SE|Expanse|Hercules)(?:[);/ ]|$)'
16996
  device: 'smartphone'
16997
  models:
16998
  - regex: '(Power Ice(?:[ ](?:Max|Evo))?|Power Rage(?: Evo)?|Zera[ _][UFS])(?:[);/ ]|$)'
17015
  model: 'Power Four'
17016
  - regex: 'Pure[_ ]Power(?:[);/ ]|$)'
17017
  model: 'Pure Power'
17018
+ - regex: 'Pure[ _]F(?:[);/ ]|$)'
17019
+ model: 'Pure F'
17020
  - regex: 'Razar_Pro(?:[);/ ]|$)'
17021
  model: 'Razar Pro'
17022
  - regex: 'Easy[_ ]([SLF]|XL)[_ ]Pro(?:[);/ ]|$)'
17045
  model: 'WinWin'
17046
  - regex: 'Expanse(?:[);/ ]|$)'
17047
  model: 'Expanse'
17048
+ - regex: 'Hercules(?:[);/ ]|$)'
17049
+ model: 'Hercules'
17050
 
17051
  # CVTE
17052
  CVTE:
17123
 
17124
  # Chuwi
17125
  Chuwi:
17126
+ regex: '(?:CW-(Hi8-super|Hi12|V99|V17HD3G|VX8-3G|V88-QUAD|V9-DUAL|V88S|Vi[78]|[HV]i10 (?:pro|plus))|Hi10 (?:Pro|plus)|HiPad X|HiBox-hero|HiBook(?: pro)?|Hi[89] ?(?:Air|Pro))(?:[);/ ]|$)'
17127
  device: 'tablet'
17128
  models:
17129
  - regex: '(CW-Hi8-super)(?:[);/ ]|$)'
17140
  model: '$1 Pro'
17141
  - regex: 'HiBook pro(?:[);/ ]|$)'
17142
  model: 'HiBook Pro'
17143
+ - regex: 'HiBook(?:[);/ ]|$)'
17144
+ model: 'HiBook'
17145
+ - regex: 'HiPad X(?:[);/ ]|$)'
17146
+ model: 'HiPad X'
17147
+ - regex: 'Hi([89]) ?Air(?:[);/ ]|$)'
17148
+ model: 'Hi$1 Air'
17149
  - regex: 'Hi8 pro(?:[);/ ]|$)'
17150
  model: 'Hi8 Pro'
17151
 
17220
  - regex: 'VMP-011-81'
17221
  model: '011'
17222
 
17223
+ # Viumee (viumee.com)
17224
+ Viumee:
17225
+ regex: 'SMART[_ ](EV[56])(?:[);/ ]|$)'
17226
+ device: 'smartphone'
17227
+ model: 'Smart $1'
17228
+
17229
  # Nuvo
17230
  Nuvo:
17231
  regex: 'Nuvo[_ ](NS35|Blue ND40|Green[_ ]ND[_ ]45)(?:[);/ ]|$)'
17346
 
17347
  # Kivi
17348
  Kivi:
17349
+ regex: '(?:24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55U600G[RU]|65UP50GU|55U[PC]50G[RU]|50U600G[RU]|50UX10S|55UR50G[RU]|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|55UC30G|32HK30G|40FK30G|32HR50GU|43UK30G|32FR50(?:WR|BU)|32FK3[02]G)(?:_-Ver0[0-9])?(?:[);/ ]|$)'
17350
  device: 'tv'
17351
  models:
17352
+ - regex: '(24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55U600G[RU]|65UP50GU|55U[PC]50G[RU]|50UX10S|50U600G[RU]|55UR50G[RU]|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|32FR50(?:WR|BU)|32FK3[02]G)(?:[);/ ]|$)'
17353
  model: '$1'
17354
  - regex: '(55UC30G|40FK30G|43UK30G|32HR50G[RU]|32HK30G|32FK32G)_-Ver0([0-9])(?:[);/ ]|$)'
17355
  model: '$1 v$2'
17372
  - regex: 'KJ-YUBI(?:[);/ ]|$)'
17373
  model: 'Yubi 3G'
17374
 
17375
+ # Kaiomy
17376
  Kaiomy:
17377
  regex: 'KaiCloud[ ]?(7[48]4|942)(?:[);/ ]|$)'
17378
  device: 'tablet'
17386
 
17387
  # Vsun
17388
  Vsun:
17389
+ regex: '(?:VSUN (?:ILLUSION|RACE|V9)|MARS TOUCH|SATURN SELFIE)(?:[);/ ]|$)'
17390
  device: 'smartphone'
17391
  models:
17392
  - regex: 'ILLUSION(?:[);/ ]|$)'
17393
  model: 'Illusion'
17394
  - regex: 'MARS TOUCH(?:[);/ ]|$)'
17395
  model: 'Mars Touch'
17396
+ - regex: 'SATURN SELFIE(?:[);/ ]|$)'
17397
+ model: 'Saturn Selfie'
17398
  - regex: 'RACE(?:[);/ ]|$)'
17399
  model: 'Race'
17400
  - regex: '(V9)(?:[);/ ]|$)'
17486
 
17487
  # iVA
17488
  iVA:
17489
+ regex: '(LAMCY (?:L3[05]0|C100|L400)|IVA S6)(?:[);/ ]|$)'
17490
  device: 'smartphone'
17491
  models:
17492
+ - regex: 'LAMCY (L3[05]0|C100|L400)(?:[);/ ]|$)'
17493
+ model: 'Lamcy $1'
17494
  - regex: 'IVA S6(?:[);/ ]|$)'
17495
  model: 'S6'
17496
 
17534
 
17535
  # Voyo
17536
  Voyo:
17537
+ regex: '(?:VOYO[_ ](A15)|i8-Max)(?:[);/ ]|$)'
17538
  device: 'tablet'
17539
+ models:
17540
+ - regex: 'i8-Max(?:[);/ ]|$)'
17541
+ model: 'i8 Max'
17542
+ - regex: 'VOYO[_ ](A15)(?:[);/ ]|$)'
17543
+ model: '$1'
17544
 
17545
  # Ryte (Ryte Mobile)
17546
  Ryte:
17566
 
17567
  # Vorke
17568
  Vorke:
17569
+ regex: 'VORKE (Z[157]|Z6(?: Plus)?)(?:[);/ ]|$)'
17570
  device: 'tv'
17571
  model: '$1'
17572
 
17584
 
17585
  # ONN
17586
  ONN:
17587
+ regex: '(ONA19TB00[327]|10000520[6-9])(?:[);/ ]|$)'
17588
  device: 'tablet'
17589
  model: '$1'
17590
 
17632
 
17633
  # PocketBook
17634
  PocketBook:
17635
+ regex: 'PocketBook[ _/]'
17636
  device: 'tablet'
17637
+ models:
17638
+ - regex: 'PocketBook SURFpad 3 \(([\d]+).([\d]+)["]?\)(?:[);/ ]|$)'
17639
+ model: 'Surfpad 3 $1.$2"'
17640
+ - regex: 'PocketBook/(62[67]|63[12]|740|840)(?:[);/ ]|$)'
17641
+ model: '$1'
17642
 
17643
  # Bitmore
17644
  Bitmore:
17658
 
17659
  # Sugar
17660
  Sugar:
17661
+ regex: 'SUGAR (?:C[12]1|C1[23]|S11|C11s|[YF]11|[SF]20|S20s|Y12s|[YFS]9|C6|[FY]7|Y8|Y1[256]|P1)(?:[);/ ]|$)'
17662
  device: 'smartphone'
17663
  models:
17664
  - regex: 'SUGAR Y([78]) MAX(?:[);/ ]|$)'
17665
  model: 'Y$1 Max'
17666
  - regex: 'SUGAR F7 Mini(?:[);/ ]|$)'
17667
  model: 'F7 Mini'
17668
+ - regex: 'SUGAR (C[12]1|C1[23]|S11|C11s|[SF]20s?|[YF]11|[YFS]9|C6|Y7|Y12s|Y1[256]|P1)(?:[);/ ]|$)'
17669
  model: '$1'
17670
 
 
17671
  # Xshitou
17672
  Xshitou:
17673
  regex: 'Xshitou[_ ](P7)(?:[);/ ]|$)'
17694
 
17695
  # VKworld
17696
  VKworld:
17697
+ regex: '(?:(?:VK700)-MAX|VK700 Pro|T5SE|VK700X|vk6050|vk6735|vk700)(?:[);/ ]|$)'
17698
  device: 'smartphone'
17699
  models:
17700
  - regex: '(VK700)-MAX(?:[);/ ]|$)'
17701
  model: '$1 Max'
17702
+ - regex: '(VK700) Pro(?:[);/ ]|$)'
17703
+ model: '$1 Pro'
17704
  - regex: 'T5SE(?:[);/ ]|$)'
17705
  model: 'T5 SE'
17706
+ - regex: 'VK(700X|6050|6735|700)(?:[);/ ]|$)'
17707
+ model: 'VK$1'
17708
 
17709
  # Mito
17710
  Mito:
17719
  device: 'tablet'
17720
  model: '$1'
17721
 
17722
+ # TWM or TaiwanMobile
17723
  TWM:
17724
+ regex: 'Amazing[ _](X[35]s|X[123567]|A5S|A3[025]|A[468]|A4S|A5[057]|P6)(?:[);/ ]|$)'
17725
  device: 'smartphone'
17726
  models:
17727
  - regex: 'Amazing[ _](X[35])s(?:[);/ ]|$)'
17728
  model: 'Amazing $1S'
17729
+ - regex: 'Amazing[ _](A5S|X[123567]|A[468]|A4S|A5[057]|A3[025])(?:[);/ ]|$)'
17730
+ model: 'Amazing $1'
17731
+ - regex: 'Amazing[ _](P6)(?:[);/ ]|$)'
17732
+ device: 'tablet'
17733
  model: 'Amazing $1'
17734
 
17735
  # Onix
17738
  device: 'tablet'
17739
  model: '$1'
17740
 
17741
+ # Oale
17742
+ Oale:
17743
+ regex: 'Apex([13])(?:[);/ ]|$)'
17744
+ device: 'smartphone'
17745
+ model: 'Apex $1'
17746
+
17747
  # Mobo
17748
  Mobo:
17749
+ regex: '(?:(?:MOBO[_ ]MB7005|MT7-421HD)|(?:MT7-442D|MT7-411D))(?:[);/ ]|$)'
17750
  device: 'tablet'
17751
+ models:
17752
+ - regex: '(?:MOBO[_ ])?(MB7005|MT7-421HD|MT7-442D|MT7-411D)(?:[);/ ]|$)'
17753
+ model: '$1'
17754
 
17755
  # Macoox
17756
  Macoox:
17788
 
17789
  # Contixo
17790
  Contixo:
17791
+ regex: 'Contixo|(?:CX-1045 3G|KT995 3G)(?:[);/ ]|$)'
17792
  device: 'tablet'
17793
  models:
17794
  - regex: 'CX-1045 3G(?:[);/ ]|$)'
17795
  model: 'CX-1045 3G'
17796
  - regex: 'CONTIXO GX 1035(?:[);/ ]|$)'
17797
  model: 'GX-1035 4G 10.1"'
17798
+ - regex: 'Contixo GT1160 4G(?:[);/ ]|$)'
17799
+ model: 'GT1160 4G 10.1"'
17800
  - regex: 'B105(?:[);/ ]|$)'
17801
  model: 'B105 3G 10.1"'
17802
  - regex: 'B108(?:[);/ ]|$)'
17803
  model: 'B108 4G 10.1"'
17804
  - regex: 'KT107(?: 3G)?(?:[);/ ]|$)'
17805
  model: 'KT107 3G 10.1"'
17806
+ - regex: 'K109(?:[);/ ]|$)'
17807
+ model: 'KT109 4G 10.1"'
17808
  - regex: 'KT715 3G(?:[);/ ]|$)'
17809
  model: 'KT715 3G 7.0"'
17810
  - regex: 'KT995(?:[);/ ]|$)'
17811
  model: 'KT995 3G 10.1"'
17812
+ - regex: 'KT1100GT(?:[);/ ]|$)'
17813
+ model: 'KT1100GT'
17814
 
17815
  # E-Ceros
17816
  'E-Ceros':
18061
 
18062
  # Phonemax
18063
  Phonemax:
18064
+ regex: 'PHONEMAX[_ ](Saturn(?:[_ ]X)?|Mars|Venus X)(?:[);/ ]|$)'
18065
  device: 'smartphone'
18066
  models:
18067
  - regex: 'PHONEMAX[_ ]Saturn[_ ]X(?:[);/ ]|$)'
18070
  model: 'Saturn'
18071
  - regex: 'PHONEMAX[_ ]Mars(?:[);/ ]|$)'
18072
  model: 'Mars'
18073
+ - regex: 'PHONEMAX[_ ]Venus X(?:[);/ ]|$)'
18074
+ model: 'Venus X'
18075
 
18076
  # Vipro (Vipro Mobile)
18077
  Vipro:
18143
 
18144
  # Eltex (eltex-co.ru)
18145
  Eltex:
18146
+ regex: '(?:NV5(?:01|10)WAC|NV501|NV510WB)(?:[);/ ]|$)'
18147
  device: 'tv'
18148
  models:
18149
+ - regex: 'NV5(01|10)WAC(?:[);/ ]|$)'
18150
+ model: 'NV-5$1-Wac'
18151
  - regex: 'NV501(?:[);/ ]|$)'
18152
  model: 'NV-501'
18153
+ - regex: 'NV510WB(?:[);/ ]|$)'
18154
+ model: 'NV-510-WB'
18155
 
18156
  # Senkatel
18157
  Senkatel:
18165
  device: 'tablet'
18166
  model: 'K10 SE'
18167
 
18168
+ # Wortmann (wortmann.de)
18169
  Wortmann:
18170
+ regex: 'TERRA[ _]PAD[ _](100[45])(?:[);/ ]|$)'
18171
  device: 'tablet'
18172
+ model: 'Terra Pad $1'
18173
 
18174
  # BB Mobile
18175
  BB Mobile:
18214
  device: 'smartphone'
18215
  model: 'Capture Plus'
18216
 
18217
+ # Tele2 (www.tele2.com) mobile operator
18218
  Tele2:
18219
+ regex: 'Tele2[ _]'
18220
  device: 'smartphone'
18221
  models:
18222
+ - regex: 'Tele2[ _](Mi[dn]i)[ _]1.1(?:[);/ ]|$)'
18223
+ model: '$1 1.1'
18224
+ - regex: 'Tele2[ _]Midi[ _]2.0(?:[);/ ]|$)'
18225
  model: 'Midi 2.0'
18226
+ - regex: 'Tele2[ _]((?:Maxi|Midi)(?:[_ ](?:Plus|LTE))?)(?:[);/ ]|$)'
18227
  model: '$1'
18228
+ - regex: 'Tele2[ _](Mi[dn]i)(?:[);/ ]|$)'
18229
  model: '$1'
18230
 
18231
  # Alfawise
18232
  Alfawise:
18233
+ regex: '(?:Alfawise (?:A9)|(?:A95X_R1))(?:[);/ ]|$)'
18234
  device: 'tv'
18235
+ models:
18236
+ - regex: '(A95X_R1)(?:[);/ ]|$)'
18237
+ model: '$1'
18238
+ - regex: 'Alfawise (A9)'
18239
+ model: '$1'
18240
 
18241
  # Klipad
18242
  Klipad:
18243
+ regex: 'KLIPAD_|(?:KL-V905|KL4889|7589AN)(?:[);/ ]|$)'
18244
  device: 'smartphone'
18245
  models:
18246
  - regex: '(?:KLIPAD_)?(V355B?|KL600|KL-V905)(?:[);/ ]|$)'
18247
  model: '$1'
18248
+ - regex: '(KL4889|7589AN)(?:[);/ ]|$)'
18249
  device: 'tablet'
18250
  model: '$1'
18251
 
18263
 
18264
  # Jinga
18265
  Jinga:
18266
+ regex: 'Jinga[-_ ]|(?:(?:Fresh|Optim)4G|Pass(?:Plus|3G)|PicassoNote|Hotz[_ ]M1|WinPRO|Touch4G|Start3G|IGO[ _]L[41]|Basco (?:L3|L[45]00|XS1|S2))(?:[);/ ]|$)'
18267
  device: 'smartphone'
18268
  models:
18269
  - regex: 'Optim4G(?:[);/ ]|$)'
18270
  model: 'Optim 4G'
18271
+ - regex: 'Fresh4G(?:[);/ ]|$)'
18272
+ model: 'Fresh 4G'
18273
  - regex: 'Hotz[_ ]M1(?:[);/ ]|$)'
18274
  model: 'Hotz M1'
18275
  - regex: 'PassPlus(?:[);/ ]|$)'
18276
  model: 'Pass Plus'
18277
+ - regex: 'Pass3G(?:[);/ ]|$)'
18278
+ model: 'Pass 3G'
18279
  - regex: 'WinPRO(?:[);/ ]|$)'
18280
  model: 'Win Pro'
18281
  - regex: 'Touch4G(?:[);/ ]|$)'
18288
  model: 'Iron'
18289
  - regex: 'Jinga Basco neo(?:[);/ ]|$)'
18290
  model: 'Basco Neo'
18291
+ - regex: '(?:Jinga )?Basco (L3|L[45]00|XS1|S2)(?:[);/ ]|$)'
18292
+ model: 'Basco $1'
18293
  - regex: 'Jinga Trezor S1 Plus(?:[);/ ]|$)'
18294
  model: 'Trezor S1 Plus'
18295
  - regex: 'JINGA_IGO_L2(?:[);/ ]|$)'
18301
 
18302
  # Twoe
18303
  Twoe:
18304
+ regex: '(?:TWOE[-_ ]E450R|F534L|F572L)(?:[);/ ]|$)'
18305
  device: 'smartphone'
18306
+ models:
18307
+ - regex: 'TWOE[-_ ](E450R)(?:[);/ ]|$)'
18308
+ model: '$1'
18309
+ - regex: '(F534L|F572L)(?:[);/ ]|$)'
18310
+ model: '$1'
18311
 
18312
  # iTruck
18313
  iTruck:
18343
 
18344
  # iMars
18345
  iMars:
18346
+ regex: '(?:IMARS VEGA X7|VIVI_8)(?:[);/ ]|$)'
18347
  device: 'smartphone'
18348
+ models:
18349
+ - regex: 'IMARS VEGA X7'
18350
+ model: 'Vega X7'
18351
+ - regex: 'VIVI_8'
18352
+ model: 'VIVI 8'
18353
 
18354
  # Logic
18355
  Logic:
18389
 
18390
  # Vsmart
18391
  Vsmart:
18392
+ regex: '(?:Joy 1\+|Active 1\+|Bee 3|Active 3)(?:[);/ ]|$)'
18393
  device: 'smartphone'
18394
  models:
18395
  - regex: 'Joy 1\+(?:[);/ ]|$)'
18398
  model: 'Active 1 Plus'
18399
  - regex: 'Bee 3(?:[);/ ]|$)'
18400
  model: 'Bee 3'
18401
+ - regex: 'Active 3(?:[);/ ]|$)'
18402
+ model: 'Active 3'
18403
 
18404
  # MiXzo
18405
  MiXzo:
18406
+ regex: '(?:MiXzo[ _])?(?:ME1023|ME1030|MX1037|MX1024|MX10[24]1|MX1397)([ _][34]G)?(?:[);/ ]|$)'
18407
  device: 'tablet'
18408
  models:
18409
  - regex: 'MiXzo[_ ]ME(1023|1030)(?:[_ ]3G)(?:[);/ ]|$)'
18410
  model: 'ME$1 3G'
18411
  - regex: 'MiXzo[_ ]MX1021(?:[_ ]3G)?(?:[);/ ]|$)'
18412
  model: 'MX1021 3G'
18413
+ - regex: '(?:MiXzo[ _])?MX(1037|1041|1024|1397)[ _]4G(?:[);/ ]|$)'
 
18414
  model: 'MX$1 4G'
18415
 
18416
  # Openbox
18455
 
18456
  # FireFly Mobile
18457
  FireFly Mobile:
18458
+ regex: '(?:AURII[ _](?:Passion|Virtuoso|ULTRA|Secret Lite|AMUSE[_ ]3G|FORCE|FUSION|F8[_ ]Premium|XCITE)|INTENSE[ _](?:POWER|METAL_2|XT))(?:[);/ ]|$)'
18459
  device: 'smartphone'
18460
  models:
18461
  - regex: 'AURII[ _]FORCE(?:[);/ ]|$)'
18462
+ model: 'Aurii Force'
18463
+ - regex: 'AURII[ _]ULTRA(?:[);/ ]|$)'
18464
+ model: 'Aurii Ultra'
18465
+ - regex: 'AURII[ _]AMUSE[_ ]3G(?:[);/ ]|$)'
18466
+ model: 'Aurii Amuse 3G'
18467
  - regex: 'AURII[ _]FUSION(?:[);/ ]|$)'
18468
+ model: 'Aurii Fusion'
18469
  - regex: 'AURII[ _]XCITE(?:[);/ ]|$)'
18470
+ model: 'Aurii xCite'
18471
+ - regex: 'AURII[ _]((?:Passion|Virtuoso|Secret Lite|F8[_ ]Premium))(?:[);/ ]|$)'
18472
+ model: 'Aurii $1'
18473
  - regex: 'INTENSE POWER(?:[);/ ]|$)'
18474
  model: 'Intense Power'
18475
  - regex: 'INTENSE_XT(?:[);/ ]|$)'
18523
 
18524
  # INVIN
18525
  Invin:
18526
+ regex: 'INVIN[ _-]|KM5PRO(?:[);/ ]|$)'
18527
  device: 'tv'
18528
+ models:
18529
+ - regex: 'INVIN[ _-](X[24]|KM[678])'
18530
+ model: '$1'
18531
+ - regex: 'KM5PRO'
18532
+ model: 'KM5 Pro'
18533
 
18534
  # Doopro
18535
  Doopro:
18567
  - regex: 'NOS Roya(?:[);/ ]|$)'
18568
  model: 'Roya'
18569
 
18570
+ # Accent (DBM Maroc) (accent.ma)
18571
  Accent:
18572
+ regex: '(?:ACCENT[_ ]NEON|PEARL[_ ]A[24567]|CAMELEON[_ ]C[56](?:[_ ]PLUS)?)(?:[);/ ]|$)'
18573
  device: 'smartphone'
18574
+ models:
18575
+ - regex: 'ACCENT[_ ]NEON(?:[);/ ]|$)'
18576
+ model: 'Neon'
18577
+ - regex: 'CAMELEON[_ ]C6[_ ]PLUS(?:[);/ ]|$)'
18578
+ model: 'Cameleon C6 Plus'
18579
+ - regex: 'CAMELEON[_ ]C([56])(?:[);/ ]|$)'
18580
+ model: 'Cameleon C$1'
18581
+ - regex: 'PEARL A4 Lite(?:[);/ ]|$)'
18582
+ model: 'Pearl A4 Lite'
18583
+ - regex: 'PEARL[_ ]A([2567])(?:[);/ ]|$)'
18584
+ model: 'Pearl A$1'
18585
 
18586
  # Avenzo (www.avenzo.es)
18587
  Avenzo:
18595
 
18596
  # Beelink
18597
  Beelink:
18598
+ regex: '(?:Beelink (?:GT1|LAKE I|SEA I|A1)|GT1mini-2|GT1-mini(?:-AT)?)(?:[);/ ]|$)'
18599
  device: 'tv'
18600
+ models:
18601
+ - regex: 'Beelink (GT1|LAKE I|SEA I|A1)(?:[);/ ]|$)'
18602
+ model: '$1'
18603
+ - regex: 'GT1-mini(?:-AT)?(?:[);/ ]|$)'
18604
+ model: 'GT1 Mini'
18605
+ - regex: 'GT1mini-2(?:[);/ ]|$)'
18606
+ model: 'GT1 Mini 2'
18607
 
18608
  # MAXVI
18609
  MAXVI:
18753
 
18754
  # Iris
18755
  Iris:
18756
+ regex: '(?:Vox[_ ](?:[45]S|Alpha|POP|STEEL Plus|Energy))(?:[);/ ]|$)'
18757
  device: 'smartphone'
18758
  models:
18759
+ - regex: 'Vox[_ ]([45])S'
18760
+ model: 'Vox $1S'
18761
  - regex: 'VOX Alpha Plus'
18762
  model: 'Vox Alpha Plus'
18763
+ - regex: 'VOX STEEL Plus'
18764
+ model: 'Vox Steel Plus'
18765
  - regex: 'VOX Alpha'
18766
  model: 'Vox Alpha'
18767
+ - regex: 'VOX Energy'
18768
+ model: 'Vox Energy'
18769
  - regex: 'VOX POP plus'
18770
  model: 'Vox Pop Plus'
18771
  - regex: 'VOX POP Pro'
18875
 
18876
  # Hometech
18877
  Hometech:
18878
+ regex: '(?:Ideal (?:10S|Tab [79])|ALFA[_ ](?:10RC|7RS|[78]RC|7M)|HT[ _](?:7RT|8MZ))(?:[);/ ]|$)'
18879
  device: 'tablet'
18880
  models:
18881
+ - regex: '(Ideal (?:10S|Tab 9)|ALFA[_ ](?:10RC|7RS|[78]RC|7M))'
18882
  model: '$1'
18883
  - regex: 'Ideal Tab 7 Ips( 3G)?'
18884
  model: 'Ideal Tab 7 IPS$1'
18885
+ - regex: 'HT[ _](7RT|8MZ)(?:[);/ ]|$)'
18886
+ model: 'HT $1'
18887
 
18888
  # ExMobile
18889
  ExMobile:
18921
  device: 'tv'
18922
  model: '$1'
18923
 
18924
+ # Silelis (silelis.com)
18925
+ Silelis:
18926
+ regex: 'Silelis[ _](T-1)(?:[);/ ]|$)'
18927
+ device: 'tv'
18928
+ model: '$1'
18929
+
18930
+ # Bluedot (bluedot.co.jp)
18931
+ Bluedot:
18932
+ regex: 'BLUEDOT[_ ]|(?:BNT-71)(?:[);/ ]|$)'
18933
+ device: 'tablet'
18934
+ models:
18935
+ - regex: '(?:BLUEDOT[_ ])?(BNP-500)(?:[);/ ]|$)'
18936
+ device: 'smartphone'
18937
+ model: '$1'
18938
+ - regex: '(BNT-71)(?:[);/ ]|$)'
18939
+ model: '$1'
18940
+
18941
+ # Planet Computers
18942
+ Planet Computers:
18943
+ regex: '(Cosmo_Communicator)(?:[);/ ]|$)'
18944
+ device: 'tablet'
18945
+ model: '$1'
18946
+
18947
+ # Reach
18948
+ Reach:
18949
+ regex: '(Allure[_ ](?:Ultra(?:[_]Curve)?|Secure|Admire|Rise))(?:[);/ ]|$)'
18950
+ device: 'smartphone'
18951
+ model: '$1'
18952
+
18953
+ # Inco (incomobile.com)
18954
+ Inco:
18955
+ regex: '(?:Inco[ _](Aurora II|Sphere|Plain[_ ]2)|(Horizon_S|Horizon \+))(?:[);/ ]|$)'
18956
+ device: 'smartphone'
18957
+ models:
18958
+ - regex: '(?:Inco[ _])?(Plain[_ ]2|Horizon_S|Horizon \+|Aurora II)(?:[);/ ]|$)'
18959
+ model: '$1'
18960
+ - regex: 'Inco Sphere(?:[);/ ]|$)'
18961
+ device: 'tablet'
18962
+ model: 'Sphere'
18963
+
18964
+ # MobiWire
18965
+ MobiWire:
18966
+ regex: '(?:Kiona|KANUNA|Halona|Kicka[_ ][45][ _]Plus|Kohana|Kosumi|KWANITA|Lonan|Hotah|Kicka 5|Kiona)(?:[);/ ]|$)'
18967
+ device: 'smartphone'
18968
+ models:
18969
+ - regex: 'KANUNA'
18970
+ model: 'Kanuna'
18971
+ - regex: 'KWANITA'
18972
+ model: 'Kwanita'
18973
+ - regex: '(Kiona|Kicka[_ ][45][ _]Plus|Kohana|Kosumi|Lonan|Halona|Hotah|Kicka 5|Kiona)(?:[);/ ]|$)'
18974
+ model: '$1'
18975
+
18976
+ # Hezire
18977
+ Hezire:
18978
+ regex: '(HTB801)(?:[);/ ]|$)'
18979
+ device: 'tablet'
18980
+ model: '$1'
18981
+
18982
+ # Hurricane (hurricanemobile.com)
18983
+ Hurricane:
18984
+ regex: 'Hurricane[ _]'
18985
+ device: 'smartphone'
18986
+ models:
18987
+ - regex: 'Hurricane[ _]IGNITE'
18988
+ model: 'Ignite'
18989
+ - regex: 'Hurricane[ _]Bolt'
18990
+ model: 'Bolt'
18991
+ - regex: 'Hurricane[ _]VORTEX'
18992
+ model: 'Vortex'
18993
+ - regex: 'Hurricane[ _]GIGA'
18994
+ model: 'Giga'
18995
+
18996
+ # iSwag (iswagmobile.com)
18997
+ iSWAG:
18998
+ regex: 'ISWAG[ _]'
18999
+ device: 'smartphone'
19000
+ models:
19001
+ - regex: 'ISWAG[_ ]VIPER'
19002
+ model: 'Viper'
19003
+ - regex: 'iSWAG[_ ]Lynx'
19004
+ model: 'Lynx'
19005
+ - regex: 'iSWAG[_ ]MANTRA'
19006
+ model: 'Mantra'
19007
+ - regex: 'iSWAG[_ ]MEGA'
19008
+ model: 'Mega'
19009
+ - regex: 'iSWAG[_ ]NEMESIS'
19010
+ model: 'Nemesis'
19011
+
19012
+ # Reeder (reeder.com.tr)
19013
+ Reeder:
19014
+ regex: 'reeder[_ ](3G_Tablet|A7iC|A[78]i[_ ]Quad|A8i Q2|M8 Plus|[TM]8|M10 Plus|P11SE)(?:[);/ ]|$)'
19015
+ device: 'tablet'
19016
+ model: '$1'
19017
+
19018
+ # ELARI (elari.net)
19019
+ ELARI:
19020
+ regex: 'KidPhone4G(?:[);/ ]|$)'
19021
+ device: 'wearable'
19022
+ model: 'KidPhone 4G'
19023
+
19024
+ # Epik One or EPIKONE (epikmobile.com)
19025
+ 'Epik One':
19026
+ regex: '(K501 Plus|[ ]K5(?:0[0-4]|1[01]|03T|3[456]|4[05]|73)|[ ]K60[01]|[ ]X507T|[ ]K40[56]|[ ]T700)(?:[);/ ]|$)'
19027
+ device: 'smartphone'
19028
+ models:
19029
+ - regex: 'K501 Plus'
19030
+ model: 'Leo Plus'
19031
+ - regex: 'K501'
19032
+ model: 'Leo'
19033
+ - regex: 'K500'
19034
+ model: 'Omega Lite'
19035
+ - regex: 'K502'
19036
+ model: 'Omega'
19037
+ - regex: 'K503T'
19038
+ model: 'Leo Turbo'
19039
+ - regex: 'K503'
19040
+ model: 'Leo Max'
19041
+ - regex: 'K504'
19042
+ model: 'Titan 3G'
19043
+ - regex: 'X507T'
19044
+ model: 'Titan II'
19045
+ - regex: 'K510'
19046
+ model: 'Bolt'
19047
+ - regex: 'K511'
19048
+ model: 'Bolt Pro'
19049
+ - regex: 'K534'
19050
+ model: 'Hada'
19051
+ - regex: 'K535'
19052
+ model: 'Hada Turbo'
19053
+ - regex: 'K545'
19054
+ model: 'Rocket'
19055
+ - regex: 'K536'
19056
+ model: 'Royal'
19057
+ - regex: 'K540'
19058
+ model: 'Excalibur'
19059
+ - regex: 'K573'
19060
+ model: 'Panther'
19061
+ - regex: 'K600'
19062
+ model: 'Jupiter'
19063
+ - regex: 'K601'
19064
+ model: 'Jupiter One'
19065
+ - regex: 'K406'
19066
+ model: 'Pebble Plus'
19067
+ - regex: 'K405'
19068
+ model: 'Pebble II'
19069
+ - regex: 'T700'
19070
+ model: 'Palette'
19071
+ device: 'tablet'
19072
+
19073
+ # Altice
19074
+ Altice:
19075
+ regex: 'Altice[ _](S62|S31|S43)(?:[);/ ]|$)'
19076
+ device: 'smartphone'
19077
+ model: '$1'
19078
+
19079
+ # Kult
19080
+ Kult:
19081
+ regex: '(Ambition|Beyond)(?:[);/ ]|$)'
19082
+ device: 'smartphone'
19083
+ model: '$1'
19084
+
19085
+ # BioRugged (biorugged.com)
19086
+ BioRugged:
19087
+ regex: '(?:BioWolf 8-F30|BIOWOLF8F30|Ruggbo 20 Lite)(?:[);/ ]|$)'
19088
+ device: 'tablet'
19089
+ models:
19090
+ - regex: 'BioWolf 8-F30|BIOWOLF8F30'
19091
+ model: 'BioWolf 8-F30'
19092
+ - regex: 'Ruggbo 20 Lite'
19093
+ model: 'Ruggbo 20 Lite'
19094
+
19095
+ # VAIO (vaio.com)
19096
+ VAIO:
19097
+ regex: 'VPA051(?:[);/ ]|$)'
19098
+ device: 'smartphone'
19099
+ model: 'Phone A'
19100
+
19101
+
19102
+ # SPC or SPC Universe or SPC Mobile (spc.es)
19103
+ SPC:
19104
+ regex: '(?:Gravity Max|GRAVITY_OCTACORE|SPC SMART LITE)(?:[);/ ]|$)'
19105
+ device: 'tablet'
19106
+ models:
19107
+ - regex: 'GRAVITY_OCTACORE'
19108
+ model: 'Gravity OctaCore'
19109
+ - regex: 'Gravity Max'
19110
+ model: 'Gravity Max'
19111
+ - regex: 'SPC SMART LITE'
19112
+ device: 'smartphone'
19113
+ model: 'Smart Lite'
19114
+
19115
+ # Winmax (winmaxmobile.com)
19116
+ Winmax:
19117
+ regex: 'Winmax[ _](?:XC14|XC[46]|TX30)(?:[);/ ]|$)|MAUI.+Winmax_BD45'
19118
+ device: 'smartphone'
19119
+ models:
19120
+ - regex: 'Winmax[ _](XC14|XC[46])(?:[);/ ]|$)'
19121
+ model: '$1'
19122
+ - regex: 'Winmax[ _](TX30)(?:[);/ ]|$)'
19123
+ device: 'tablet'
19124
+ model: '$1'
19125
+ - regex: 'MAUI.+Winmax_(BD45)'
19126
+ device: 'feature phone'
19127
+ model: '$1'
19128
+
19129
+ # Zebra (zebra.com)
19130
+ Zebra:
19131
+ regex: ' (TC5[16]|TC2[05]|TC75|TC7[05]x|TC700H)(?:[);/ ]|$)'
19132
+ device: 'smartphone'
19133
+ model: '$1'
19134
+
19135
+ # Thuraya (thuraya.com)
19136
+ Thuraya:
19137
+ regex: 'Thuraya[ _](X5-Touch)(?:[);/ ]|$)'
19138
+ device: 'smartphone'
19139
+ model: '$1'
19140
+
19141
+ # Bkav (bkav.com)
19142
+ Bkav:
19143
+ regex: 'Bphone[ _](B111[45]|B2017)(?:[);/ ]|$)'
19144
+ device: 'smartphone'
19145
+ model: 'Bphone $1'
19146
+
19147
+ # Brandt
19148
+ Brandt:
19149
+ regex: '(BPRIME|BSTAR\+?|BPRIMES|B-ONE)(?:[);/ ]|$)'
19150
+ device: 'smartphone'
19151
+ model: '$1'
19152
+
19153
+ # Bigben
19154
+ Bigben:
19155
+ regex: 'GAMETAB-ONE(?:[);/ ]|$)'
19156
+ device: 'tablet'
19157
+ model: 'GameTab-One'
19158
+
19159
+ # smartec (smartec.tn)
19160
+ SMARTEC:
19161
+ regex: '(Atractivo)(?:[);/ ]|$)'
19162
+ device: 'smartphone'
19163
+ model: '$1'
19164
+
19165
+ # Asanzo (asanzo.vn)
19166
+ Asanzo:
19167
+ regex: 'ASANZO[ _](?:A2|S[23]|[SZ]5|S3_PLUS)(?:[);/ ]|$)'
19168
+ device: 'smartphone'
19169
+ models:
19170
+ - regex: 'ASANZO[ _]S3[ _]PLUS'
19171
+ model: 'S3 Plus'
19172
+ - regex: 'ASANZO[ _](A2|S[23]|[SZ]5)(?:[);/ ]|$)'
19173
+ model: '$1'
19174
+
19175
+ # Artizlee
19176
+ Artizlee:
19177
+ regex: 'Artizlee[ _]S9|ATL-(?:16|21(?:PLUS|[XT])?|31|26)(?:[);/ ]|$)'
19178
+ device: 'tablet'
19179
+ models:
19180
+ - regex: 'ATL-21PLUS(?:[);/ ]|$)'
19181
+ model: 'ATL-21 Plus'
19182
+ - regex: '(ATL-(?:16|21[XT]?|31|26))(?:[);/ ]|$)'
19183
+ model: '$1'
19184
+ - regex: 'Artizlee[ _]S9'
19185
+ device: 'smartphone'
19186
+ model: 'S9'
19187
+
19188
+ # Mintt
19189
+ Mintt:
19190
+ regex: '(?:Coolmintt(?:A3|M2)?|Ultramintt(?:S2)?|FRESHMINTT(?:A7|A10)?)(?:[);/ ]|$)'
19191
+ device: 'smartphone'
19192
+ models:
19193
+ - regex: 'Coolmintt ?([PM]1|P3|A3|M2)(?:[);/ ]|$)'
19194
+ model: 'CoolMintt $1'
19195
+ - regex: 'Ultramintt ?([SR]1|S2)(?:[);/ ]|$)'
19196
+ model: 'UltraMintt $1'
19197
+ - regex: 'FRESHMINTT ?(A7|A10)(?:[);/ ]|$)'
19198
+ device: 'tablet'
19199
+ model: 'FreshMintt $1'
19200
+
19201
+ # Premio
19202
+ Premio:
19203
+ regex: '(?:186HS2080531|186HS1050531|186HS1050232|186FT1080231|185FT5050231)(?:[);/ ]|$)'
19204
+ device: 'smartphone'
19205
+ models:
19206
+ - regex: '186HS2080531'
19207
+ model: 'X1'
19208
+ - regex: '186HS1050531'
19209
+ model: 'P541'
19210
+ - regex: '185FT5050231'
19211
+ model: 'P511'
19212
+ - regex: '186FT1080231'
19213
+ model: 'P571'
19214
+ - regex: '186HS1050232'
19215
+ model: 'P630'
19216
+
19217
+ # Trifone
19218
+ Trifone:
19219
+ regex: 'Passion[-_](?:1S|PRO|PLUS)(?:[);/ ]|$)'
19220
+ device: 'smartphone'
19221
+ models:
19222
+ - regex: 'Passion-1S'
19223
+ model: 'Passion 1S'
19224
+ - regex: 'Passion-Plus'
19225
+ model: 'Passion Plus'
19226
+ - regex: 'Passion_Pro'
19227
+ model: 'Passion Pro'
19228
+
19229
+ # Bluewave
19230
+ Bluewave:
19231
+ regex: '(?:33GT HD|WV8R-M|WV8R[_-]N)(?:[);/ ]|$)'
19232
+ device: 'tablet'
19233
+ models:
19234
+ - regex: '33GT HD'
19235
+ model: 'Wave 8 HD+'
19236
+ - regex: 'WV8R-M'
19237
+ model: 'Wave 8 Red Marshmallow'
19238
+ - regex: 'WV8R[_-]N'
19239
+ model: 'Wave 8 Red Nougat'
19240
+
19241
+ # Siragon (siragon.com)
19242
+ Siragon:
19243
+ regex: '(SP-5250)(?:[);/ ]|$)'
19244
+ device: 'smartphone'
19245
+ model: '$1'
19246
+
19247
+ # Poppox
19248
+ Poppox:
19249
+ regex: 'Poppox P3'
19250
+ device: 'smartphone'
19251
+ model: 'P3'
19252
+
19253
+ # Zentality (zentalityinfo.com)
19254
+ Zentality:
19255
+ regex: 'C-723ULTRA(?:[);/ ]|$)'
19256
+ device: 'tablet'
19257
+ model: 'C-723 Ultra'
19258
+
19259
+ # Black Bear
19260
+ 'Black Bear':
19261
+ regex: '(B6 Master|B6 Note X)(?:[);/ ]|$)'
19262
+ device: 'smartphone'
19263
+ model: '$1'
19264
+
19265
+ # Fortis
19266
+ Fortis:
19267
+ regex: '(Apollo 5 Neo)(?:[);/ ]|$)'
19268
+ device: 'smartphone'
19269
+ model: '$1'
19270
+
19271
+ # OpelMobile (opelmobile.com.au)
19272
+ OpelMobile:
19273
+ regex: ' OpelMobile_(SmartJX)(?:[);/ ]|$)'
19274
+ device: 'smartphone'
19275
+ model: '$1'
19276
+
19277
+ # NuAns
19278
+ NuAns:
19279
+ regex: 'NEO \[Reloaded\](?:[);/ ]|$)'
19280
+ device: 'smartphone'
19281
+ model: 'NEO Reloaded'
19282
+
19283
+ # Koolnee (sub brand from Koobee)
19284
+ Koolnee:
19285
+ regex: '(K1 Trio)(?:[);/ ]|$)'
19286
+ device: 'smartphone'
19287
+ model: '$1'
19288
+
19289
+ # Sansui (sansui-global.com)
19290
+ Sansui:
19291
+ regex: 'Sansui[_ ]'
19292
+ device: 'smartphone'
19293
+ models:
19294
+ - regex: 'Sansui[_ ](Switch|Play|Fun|SA4[01]|U4[56]|U3[02]|Nova)(?:[);/ ]|$)'
19295
+ model: '$1'
19296
+
19297
+ # Sico (sico.com.eg)
19298
+ Sico:
19299
+ regex: 'SICO[_ ](?:PLUS|e1002)'
19300
+ device: 'smartphone'
19301
+ models:
19302
+ - regex: 'SICO[_ ]PLUS'
19303
+ model: 'Plus'
19304
+ - regex: 'SICO[_ ]e1002'
19305
+ device: 'tablet'
19306
+ model: 'E1002'
19307
+
19308
+ # Smadl (smadlethiopia.com)
19309
+ Smadl:
19310
+ regex: 'Android.+(?:Safari)(?!/[\d.]+)(?: Build|\) AppleWebKit)|SMADL[ _]'
19311
+ device: 'smartphone'
19312
+ models:
19313
+ - regex: 'Android.+(?:Safari)(?!/[\d.]+)(?: Build|\) AppleWebKit)'
19314
+ model: 'Safari'
19315
+ - regex: 'SMADL[ _]Matri([2X])'
19316
+ model: 'Matri $1'
19317
+
19318
+ # Tymes
19319
+ Tymes:
19320
+ regex: 'Tymes[ _](V5)(?:[);/ ]|$)'
19321
+ device: 'smartphone'
19322
+ model: '$1'
19323
+
19324
+ # Solone
19325
+ Solone:
19326
+ regex: '(?:E1457|W145[02])(?:[);/ ]|$)'
19327
+ device: 'smartphone'
19328
+ models:
19329
+ - regex: 'E1457'
19330
+ model: 'Earth Iron E1457'
19331
+ - regex: 'W1450'
19332
+ model: 'Wind Breeze W1450'
19333
+ - regex: 'W1452'
19334
+ model: 'Wind Air W1452'
19335
+
19336
+ # Far Eas Tone (Fareastone)
19337
+ FarEasTone:
19338
+ regex: 'Smart ?(601|550|50[59])(?:[);/ ]|$)'
19339
+ device: 'smartphone'
19340
+ model: 'Smart $1'
19341
+
19342
+ # Smailo
19343
+ Smailo:
19344
+ regex: 'Smailo_(2GO)(?:[);/ ]|$)'
19345
+ device: 'tablet'
19346
+ model: '$1'
19347
+
19348
+ # Leff
19349
+ Leff:
19350
+ regex: 'Leff Shell (?:HV320WHB-N55|LC390TA2A)(?:[);/ ]|$)'
19351
+ device: 'tv'
19352
+ model: ''
19353
+
19354
  # Hardkernel (www.hardkernel.com)
19355
  Hardkernel:
19356
  regex: 'ODROID[-]?(C2|U2|XU[34])(?:[);/ ]|$)'
19368
  regex: 'SHTRIH-SMARTPOS-F2(?:[);/ ]|$)'
19369
  device: 'peripheral'
19370
  model: 'Smartpos F2'
19371
+
19372
+ # BBK (bbk.ru)
19373
+ BBK:
19374
+ regex: '([65]5|4[03]|3[29]|28)LEX[-_](81(?:27|39|45|58|61)|71(?:[23]7|4[345]|5[45]|6[368]|[57]8))[_/]([FU]?TS2C)(?:[);/ ]|$)'
19375
+ device: 'tv'
19376
+ model: '$1LEX-$2/$3'
19377
+
19378
+ # 4ife
19379
+ 4ife:
19380
+ regex: '4ife (4K Smart TV Box)(?:[);/ ]|$)'
19381
+ device: 'tv'
19382
+ model: '$1'
19383
+
19384
+ # Westpoint
19385
+ Westpoint:
19386
+ regex: 'WESTPOINT[;,]'
19387
+ device: 'tv'
19388
+ models:
19389
+ - regex: '(TETS-4919SM)'
19390
+ model: '$1'
19391
+
19392
+ # Yoka TV
19393
+ 'Yoka TV':
19394
+ regex: 'KB2 PRO(?:[);/ ]|$)'
19395
+ device: 'tv'
19396
+ model: 'KB2 Pro'
app/vendor/matomo/device-detector/regexes/device/portable_media_player.yml CHANGED
@@ -35,8 +35,8 @@ Microsoft:
35
  model: 'Zune HD'
36
 
37
  Panasonic:
38
- device: 'portable media player'
39
  regex: '(SV-MV100)'
 
40
  model: '$1'
41
 
42
  Samsung:
@@ -57,3 +57,8 @@ Samsung:
57
  model: 'Galaxy Player 50'
58
  - regex: 'YP-GB70D'
59
  model: 'Galaxy Player 70 Plus'
 
 
 
 
 
35
  model: 'Zune HD'
36
 
37
  Panasonic:
 
38
  regex: '(SV-MV100)'
39
+ device: 'portable media player'
40
  model: '$1'
41
 
42
  Samsung:
57
  model: 'Galaxy Player 50'
58
  - regex: 'YP-GB70D'
59
  model: 'Galaxy Player 70 Plus'
60
+
61
+ Wizz:
62
+ regex: '(DV-PTB1080)(?:[);/ ]|$)'
63
+ device: 'portable media player'
64
+ model: '$1'
app/vendor/matomo/device-detector/regexes/device/televisions.yml CHANGED
@@ -16,6 +16,12 @@ Airties:
16
  - regex: 'Airties; ?([^);/]+)'
17
  model: '$1'
18
 
 
 
 
 
 
 
19
  # Altech UEC
20
  'Altech UEC':
21
  regex: 'Altech UEC'
@@ -30,6 +36,18 @@ BangOlufsen:
30
  device: 'tv'
31
  model: 'BeoVision'
32
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  # Changhong
34
  Changhong:
35
  regex: 'Changhong'
@@ -44,12 +62,24 @@ CreNova:
44
  device: 'tv'
45
  model: 'CNV001'
46
 
 
 
 
 
 
 
47
  # DMM
48
  DMM:
49
  regex: 'DMM'
50
  device: 'tv'
51
  model: 'Dreambox'
52
 
 
 
 
 
 
 
53
  # Grundig
54
  Grundig:
55
  regex: '(OWB|Grundig|Arcelik)'
@@ -66,6 +96,18 @@ Hisense:
66
  - regex: '(H[A-Z]?[0-9]{2}[A-Z][0-9]{3,4}[A-Z]{0,4})'
67
  model: '$1'
68
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  # Humax
70
  Humax:
71
  regex: 'Humax'
@@ -104,6 +146,12 @@ Inverto:
104
  - regex: '(Volksbox Web Edition|Volksbox Essential|Volksbox II|Volksbox)'
105
  model: '$1'
106
 
 
 
 
 
 
 
107
  # LG
108
  LG:
109
  regex: 'LGE'
@@ -116,6 +164,12 @@ LG:
116
  - regex: 'LGE;? ?([0-9]{2}[A-Z]{2}[0-9]{2,4}[A-Z]?)'
117
  model: '$1'
118
 
 
 
 
 
 
 
119
  # Loewe
120
  Loewe:
121
  regex: 'Loewe'
@@ -124,6 +178,12 @@ Loewe:
124
  - regex: '([A-Z]{2}[0-9]{3})'
125
  model: '$1'
126
 
 
 
 
 
 
 
127
  # MediaTek
128
  MediaTek:
129
  regex: 'MTK'
@@ -140,6 +200,12 @@ Medion:
140
  - regex: '(MB[0-9]{2})'
141
  model: '$1'
142
 
 
 
 
 
 
 
143
  # Metz
144
  Metz:
145
  regex: 'Metz'
@@ -155,6 +221,8 @@ Panasonic:
155
  model: '$1'
156
  - regex: 'DIGA Webkit ([A-Z]{1}[0-9]{4})'
157
  model: 'DIGA $1'
 
 
158
 
159
  # PEAQ
160
  PEAQ:
@@ -174,12 +242,26 @@ Philips:
174
  - regex: 'NETTV/[0-9\.]{5}'
175
  model: 'NetTV Series'
176
 
 
 
 
 
 
 
 
 
 
 
 
 
177
  # Samsung
178
  Samsung:
179
  regex: 'Samsung|Maple_2011'
180
  device: 'tv'
181
  models:
182
- - regex: 'SmartTV(201[2-9])'
 
 
183
  model: 'Smart TV $1'
184
  - regex: 'Maple_2011'
185
  model: 'Smart TV 2011'
@@ -196,13 +278,15 @@ Selevision:
196
 
197
  # Sharp
198
  Sharp:
199
- regex: 'Sharp'
200
  device: 'tv'
201
  models:
202
  - regex: 'Sharp[,;] ?((?! |HbbTV)[^),;/]+)'
203
  model: '$1'
204
  - regex: '(LE[0-9]{3}[A-Z]{0,3})'
205
  model: '$1'
 
 
206
 
207
  # Skyworth
208
  Skyworth:
@@ -246,6 +330,12 @@ TechnoTrend:
246
  - regex: '([A-Z]{1}-[0-9]{3})'
247
  model: '$1'
248
 
 
 
 
 
 
 
249
  # Telefunken
250
  Telefunken:
251
  regex: 'Telefunken'
@@ -308,3 +398,9 @@ Videoweb:
308
  model: '$1'
309
  - regex: '(videowebtv)'
310
  model: 'VideoWeb TV'
 
 
 
 
 
 
16
  - regex: 'Airties; ?([^);/]+)'
17
  model: '$1'
18
 
19
+ # ALDI SÜD
20
+ 'ALDI SÜD':
21
+ regex: 'ALDISUED[;,]'
22
+ device: 'tv'
23
+ model: ''
24
+
25
  # Altech UEC
26
  'Altech UEC':
27
  regex: 'Altech UEC'
36
  device: 'tv'
37
  model: 'BeoVision'
38
 
39
+ # Bush
40
+ Bush:
41
+ regex: 'BUSH[;,]'
42
+ device: 'tv'
43
+ model: ''
44
+
45
+ # Celcus
46
+ Celcus:
47
+ regex: 'CELCUS[;,]'
48
+ device: 'tv'
49
+ model: ''
50
+
51
  # Changhong
52
  Changhong:
53
  regex: 'Changhong'
62
  device: 'tv'
63
  model: 'CNV001'
64
 
65
+ # Digihome
66
+ Digihome:
67
+ regex: 'DIGIHOME[;,]'
68
+ device: 'tv'
69
+ model: ''
70
+
71
  # DMM
72
  DMM:
73
  regex: 'DMM'
74
  device: 'tv'
75
  model: 'Dreambox'
76
 
77
+ # Finlux
78
+ Finlux:
79
+ regex: 'FINLUX[;,]'
80
+ device: 'tv'
81
+ model: ''
82
+
83
  # Grundig
84
  Grundig:
85
  regex: '(OWB|Grundig|Arcelik)'
96
  - regex: '(H[A-Z]?[0-9]{2}[A-Z][0-9]{3,4}[A-Z]{0,4})'
97
  model: '$1'
98
 
99
+ # Hitachi
100
+ Hitachi:
101
+ regex: 'Hitachi[;,]'
102
+ device: 'tv'
103
+ model: ''
104
+
105
+ # Hotel
106
+ Hotel:
107
+ regex: 'HOTEL[;,]'
108
+ device: 'tv'
109
+ model: ''
110
+
111
  # Humax
112
  Humax:
113
  regex: 'Humax'
146
  - regex: '(Volksbox Web Edition|Volksbox Essential|Volksbox II|Volksbox)'
147
  model: '$1'
148
 
149
+ # JVC
150
+ JVC:
151
+ regex: 'JVC[;,]'
152
+ device: 'tv'
153
+ model: ''
154
+
155
  # LG
156
  LG:
157
  regex: 'LGE'
164
  - regex: 'LGE;? ?([0-9]{2}[A-Z]{2}[0-9]{2,4}[A-Z]?)'
165
  model: '$1'
166
 
167
+ # Linsar
168
+ Linsar:
169
+ regex: 'LINSAR[;,]'
170
+ device: 'tv'
171
+ model: ''
172
+
173
  # Loewe
174
  Loewe:
175
  regex: 'Loewe'
178
  - regex: '([A-Z]{2}[0-9]{3})'
179
  model: '$1'
180
 
181
+ # Luxor
182
+ Luxor:
183
+ regex: 'LUXOR[;,]'
184
+ device: 'tv'
185
+ model: ''
186
+
187
  # MediaTek
188
  MediaTek:
189
  regex: 'MTK'
200
  - regex: '(MB[0-9]{2})'
201
  model: '$1'
202
 
203
+ # Nordmende
204
+ Nordmende:
205
+ regex: 'NORDMENDE[;,]'
206
+ device: 'tv'
207
+ model: ''
208
+
209
  # Metz
210
  Metz:
211
  regex: 'Metz'
221
  model: '$1'
222
  - regex: 'DIGA Webkit ([A-Z]{1}[0-9]{4})'
223
  model: 'DIGA $1'
224
+ - regex: 'SmartTV(201[89]|202[0-1])'
225
+ model: 'Smart TV ($1)'
226
 
227
  # PEAQ
228
  PEAQ:
242
  - regex: 'NETTV/[0-9\.]{5}'
243
  model: 'NetTV Series'
244
 
245
+ # Polaroid
246
+ Polaroid:
247
+ regex: 'POLAROID[;,]'
248
+ device: 'tv'
249
+ model: ''
250
+
251
+ # Salora
252
+ Salora:
253
+ regex: 'Salora[;,]'
254
+ device: 'tv'
255
+ model: ''
256
+
257
  # Samsung
258
  Samsung:
259
  regex: 'Samsung|Maple_2011'
260
  device: 'tv'
261
  models:
262
+ - regex: 'SmartTV(201[2-9]|202[0-1]):([^);/]+)'
263
+ model: '$2'
264
+ - regex: 'SmartTV(201[2-9]|202[0-1])'
265
  model: 'Smart TV $1'
266
  - regex: 'Maple_2011'
267
  model: 'Smart TV 2011'
278
 
279
  # Sharp
280
  Sharp:
281
+ regex: '(?:UMC-)?Sharp'
282
  device: 'tv'
283
  models:
284
  - regex: 'Sharp[,;] ?((?! |HbbTV)[^),;/]+)'
285
  model: '$1'
286
  - regex: '(LE[0-9]{3}[A-Z]{0,3})'
287
  model: '$1'
288
+ - regex: 'LC-([^);/]+)'
289
+ model: 'LC-$1'
290
 
291
  # Skyworth
292
  Skyworth:
330
  - regex: '([A-Z]{1}-[0-9]{3})'
331
  model: '$1'
332
 
333
+ # Techwood
334
+ Techwood:
335
+ regex: 'Techwood[;,]'
336
+ device: 'tv'
337
+ model: ''
338
+
339
  # Telefunken
340
  Telefunken:
341
  regex: 'Telefunken'
398
  model: '$1'
399
  - regex: '(videowebtv)'
400
  model: 'VideoWeb TV'
401
+
402
+ # X.Vision
403
+ X.Vision:
404
+ regex: 'X-VISION[;,]'
405
+ device: 'tv'
406
+ model: ''
app/vendor/matomo/device-detector/regexes/oss.yml CHANGED
@@ -5,6 +5,13 @@
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
  ###############
7
 
 
 
 
 
 
 
 
8
  ##########
9
  # Tizen
10
  ##########
@@ -94,6 +101,10 @@
94
  name: 'Fire OS'
95
  version: '$1'
96
 
 
 
 
 
97
  ##########
98
  # Android
99
  ##########
@@ -193,7 +204,7 @@
193
  name: '$1'
194
  version: '$2'
195
 
196
- - regex: '(Debian|Knoppix|Mint(?! Browser)|Ubuntu|Kubuntu|Xubuntu|Lubuntu|Fedora|Red Hat|Mandriva|Gentoo|Sabayon|Slackware|SUSE|CentOS|BackTrack)(?:(?: Enterprise)? Linux)?(?:[ /\-](\d+[\.\d]+))?'
197
  name: '$1'
198
  version: '$2'
199
 
@@ -206,7 +217,7 @@
206
  ##########
207
  # webOS
208
  ##########
209
- - regex: '(?:webOS|web0S|Palm webOS)(?:/(\d+[\.\d]+))?'
210
  name: 'webOS'
211
  version: '$1'
212
 
@@ -300,26 +311,89 @@
300
  version: ''
301
 
302
 
 
 
 
 
 
 
 
303
  ##########
304
  # iOS
305
  ##########
306
- - regex: 'CFNetwork/889'
307
  name: 'iOS'
308
- version: '11.1'
309
 
310
- - regex: 'CFNetwork/887.*(x86_64)'
311
- name: 'Mac'
312
- version: '10.13'
313
 
314
- - regex: 'CFNetwork/887'
315
  name: 'iOS'
316
- version: '11.0'
317
 
318
- - regex: 'CFNetwork/811.*(x86_64)'
319
- name: 'Mac'
320
- version: '10.12'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
321
 
322
- - regex: 'CFNetwork/811'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
323
  name: 'iOS'
324
  version: '10.3'
325
 
@@ -447,7 +521,7 @@
447
  name: 'iOS'
448
  version: '$1'
449
 
450
- - regex: 'Podcasts/(?:[\d\.]+)|Instacast(?:HD)?/(?:\d\.[\d\.abc]+)|Pocket Casts, iOS|Overcast|Castro|Podcat|i[cC]atcher|RSSRadio/'
451
  name: 'iOS'
452
  version: ''
453
 
@@ -459,27 +533,214 @@
459
  ##########
460
  # Mac
461
  ##########
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
462
 
463
  - regex: 'CFNetwork/807'
464
  name: 'Mac'
465
  version: '10.12'
466
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
467
  - regex: 'CFNetwork/760'
468
  name: 'Mac'
469
  version: '10.11'
470
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
471
  - regex: 'CFNetwork/720'
472
  name: 'Mac'
473
  version: '10.10'
474
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
475
  - regex: 'CFNetwork/673'
476
  name: 'Mac'
477
  version: '10.9'
478
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
479
  - regex: 'CFNetwork/596'
480
  name: 'Mac'
481
  version: '10.8'
482
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
483
  - regex: 'CFNetwork/520'
484
  name: 'Mac'
485
  version: '10.7'
@@ -517,6 +778,14 @@
517
  version: ''
518
 
519
 
 
 
 
 
 
 
 
 
520
  ##########
521
  # ChromeOS
522
  ##########
@@ -524,7 +793,6 @@
524
  name: 'Chrome OS'
525
  version: '$1'
526
 
527
-
528
  ##########
529
  # BlackBerry
530
  ##########
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
  ###############
7
 
8
+ ##########
9
+ # Whale OS (https://www.zeasn.com/)
10
+ ##########
11
+ - regex: '(?:WH|WhaleTV/)(\d+[\.\d]+)'
12
+ name: 'Whale OS'
13
+ version: '$1'
14
+
15
  ##########
16
  # Tizen
17
  ##########
101
  name: 'Fire OS'
102
  version: '$1'
103
 
104
+ - regex: 'FydeOS'
105
+ name: 'FydeOS'
106
+ version: ''
107
+
108
  ##########
109
  # Android
110
  ##########
204
  name: '$1'
205
  version: '$2'
206
 
207
+ - regex: '(Debian|Knoppix|Mint(?! Browser)|Ubuntu|Kubuntu|Xubuntu|Lubuntu|Fedora|Red Hat|Mandriva|Gentoo|Sabayon|Slackware|SUSE|CentOS|BackTrack|Deepin|Freebox)(?:(?: Enterprise)? Linux)?(?:[ /\-](\d+[\.\d]+))?'
208
  name: '$1'
209
  version: '$2'
210
 
217
  ##########
218
  # webOS
219
  ##########
220
+ - regex: '(?:Web0S; .*WEBOS|webOS|web0S|Palm webOS)(?:[/]?(\d+[\.\d]+))?'
221
  name: 'webOS'
222
  version: '$1'
223
 
311
  version: ''
312
 
313
 
314
+ ##########
315
+ # watchOS (https://developer.apple.com/watchos/)
316
+ ##########
317
+ - regex: '(?:Watch1,[12]/|Watch OS,|watchOS[ /])(\d+[\.\d]*)'
318
+ name: 'watchOS'
319
+ version: '$1'
320
+
321
  ##########
322
  # iOS
323
  ##########
324
+ - regex: 'CFNetwork/.+ Darwin/20.2.0(?!.*x86_64)'
325
  name: 'iOS'
326
+ version: '14.3'
327
 
328
+ - regex: 'CFNetwork/.+ Darwin/20.1.0(?!.*x86_64)'
329
+ name: 'iOS'
330
+ version: '14.2'
331
 
332
+ - regex: 'CFNetwork/.+ Darwin/20.0.0(?!.*x86_64)'
333
  name: 'iOS'
334
+ version: '14.0'
335
 
336
+ - regex: 'CFNetwork/.+ Darwin/19.6.0(?!.*x86_64)'
337
+ name: 'iOS'
338
+ version: '13.6'
339
+
340
+ - regex: 'CFNetwork/.+ Darwin/19.5.0(?!.*x86_64)'
341
+ name: 'iOS'
342
+ version: '13.5'
343
+
344
+ - regex: 'CFNetwork/.+ Darwin/19.4.0(?!.*x86_64)'
345
+ name: 'iOS'
346
+ version: '13.4'
347
+
348
+ - regex: 'CFNetwork/.+ Darwin/19.3.0(?!.*x86_64)'
349
+ name: 'iOS'
350
+ version: '13.3.1'
351
+
352
+ - regex: 'CFNetwork/.+ Darwin/19.2.0(?!.*x86_64)'
353
+ name: 'iOS'
354
+ version: '13.3'
355
+
356
+ - regex: 'CFNetwork/.+ Darwin/19.0.0(?!.*x86_64)'
357
+ name: 'iOS'
358
+ version: '13.0'
359
+
360
+ - regex: 'CFNetwork/.+ Darwin/18.7.0(?!.*x86_64)'
361
+ name: 'iOS'
362
+ version: '12.4'
363
+
364
+ - regex: 'CFNetwork/.+ Darwin/18.6.0(?!.*x86_64)'
365
+ name: 'iOS'
366
+ version: '12.3'
367
+
368
+ - regex: 'CFNetwork/.+ Darwin/18.5.0(?!.*x86_64)'
369
+ name: 'iOS'
370
+ version: '12.2'
371
+
372
+ - regex: 'CFNetwork/.+ Darwin/18.2.0(?!.*x86_64)'
373
+ name: 'iOS'
374
+ version: '12.1'
375
+
376
+ - regex: 'CFNetwork/.+ Darwin/18.0.0(?!.*x86_64)'
377
+ name: 'iOS'
378
+ version: '12.0'
379
 
380
+ - regex: 'CFNetwork/.+ Darwin/17.7.0(?!.*x86_64)'
381
+ name: 'iOS'
382
+ version: '11.4.1'
383
+
384
+ - regex: 'CFNetwork/.+ Darwin/17.6.0(?!.*x86_64)'
385
+ name: 'iOS'
386
+ version: '11.4'
387
+
388
+ - regex: 'CFNetwork/889(?!.*x86_64)'
389
+ name: 'iOS'
390
+ version: '11.1'
391
+
392
+ - regex: 'CFNetwork/887(?!.*x86_64)'
393
+ name: 'iOS'
394
+ version: '11.0'
395
+
396
+ - regex: 'CFNetwork/811(?!.*x86_64)'
397
  name: 'iOS'
398
  version: '10.3'
399
 
521
  name: 'iOS'
522
  version: '$1'
523
 
524
+ - regex: '(?:Podcasts/(?:[\d\.]+)|Instacast(?:HD)?/(?:\d\.[\d\.abc]+)|Pocket Casts, iOS|Overcast|Castro|Podcat|i[cC]atcher|RSSRadio/|MobileSafari/)(?!.*x86_64)'
525
  name: 'iOS'
526
  version: ''
527
 
533
  ##########
534
  # Mac
535
  ##########
536
+ - regex: 'CFNetwork/.+ Darwin/20.2.0.*(x86_64)'
537
+ name: 'Mac'
538
+ version: '11.1'
539
+
540
+ - regex: 'CFNetwork/.+ Darwin/20.[01].0.*(x86_64)'
541
+ name: 'Mac'
542
+ version: '11.0'
543
+
544
+ - regex: 'CFNetwork/.+ Darwin/19.6.0.*(x86_64)'
545
+ name: 'Mac'
546
+ version: '10.15.6'
547
+
548
+ - regex: 'CFNetwork/.+ Darwin/19.5.0.*(x86_64)'
549
+ name: 'Mac'
550
+ version: '10.15.5'
551
+
552
+ - regex: 'CFNetwork/.+ Darwin/19.4.0.*(x86_64)'
553
+ name: 'Mac'
554
+ version: '10.15.4'
555
+
556
+ - regex: 'CFNetwork/.+ Darwin/19.3.0.*(x86_64)'
557
+ name: 'Mac'
558
+ version: '10.15.3'
559
+
560
+ - regex: 'CFNetwork/.+ Darwin/19.2.0.*(x86_64)'
561
+ name: 'Mac'
562
+ version: '10.15.2'
563
+
564
+ - regex: 'CFNetwork/(?:108[258]|109[18]|1103).*(x86_64)'
565
+ name: 'Mac'
566
+ version: '10.15'
567
+
568
+ - regex: 'CFNetwork/.+ Darwin/18.2.0.*(x86_64)'
569
+ name: 'Mac'
570
+ version: '10.14.1'
571
+
572
+ - regex: 'CFNetwork/(?:96[29]|97[14568]).*(x86_64)'
573
+ name: 'Mac'
574
+ version: '10.14'
575
+
576
+ - regex: 'CFNetwork/.+ Darwin/17.7.0.*(x86_64)'
577
+ name: 'Mac'
578
+ version: '10.13.6'
579
+
580
+ - regex: 'CFNetwork/.+ Darwin/17.6.0.*(x86_64)'
581
+ name: 'Mac'
582
+ version: '10.13.5'
583
+
584
+ - regex: 'CFNetwork/.+ Darwin/17.5.0.*(x86_64)'
585
+ name: 'Mac'
586
+ version: '10.13.4'
587
+
588
+ - regex: 'CFNetwork/.+ Darwin/17.4.0.*(x86_64)'
589
+ name: 'Mac'
590
+ version: '10.13.3'
591
+
592
+ - regex: 'CFNetwork/.+ Darwin/17.3.0.*(x86_64)'
593
+ name: 'Mac'
594
+ version: '10.13.2'
595
+
596
+ - regex: 'CFNetwork/.+ Darwin/17.2.0.*(x86_64)'
597
+ name: 'Mac'
598
+ version: '10.13.1'
599
+
600
+ - regex: 'CFNetwork/(?:887|889|893|897|901|902).*(x86_64)'
601
+ name: 'Mac'
602
+ version: '10.13'
603
+
604
+ - regex: 'CFNetwork/.+ Darwin/16.7.0.*(x86_64)'
605
+ name: 'Mac'
606
+ version: '10.12.6'
607
+
608
+ - regex: 'CFNetwork/.+ Darwin/16.6.0.*(x86_64)'
609
+ name: 'Mac'
610
+ version: '10.12.5'
611
+
612
+ - regex: 'CFNetwork/.+ Darwin/16.5.0.*(x86_64)'
613
+ name: 'Mac'
614
+ version: '10.12.4'
615
+
616
+ - regex: 'CFNetwork/.+ Darwin/16.3.0.*(x86_64)'
617
+ name: 'Mac'
618
+ version: '10.12.3'
619
+
620
+ - regex: 'CFNetwork/.+ Darwin/16.2.0.*(x86_64)'
621
+ name: 'Mac'
622
+ version: '10.12.2'
623
+
624
+ - regex: 'CFNetwork/.+ Darwin/16.1.0.*(x86_64)'
625
+ name: 'Mac'
626
+ version: '10.12.1'
627
+
628
+ - regex: 'CFNetwork/811.*(x86_64)'
629
+ name: 'Mac'
630
+ version: '10.12'
631
 
632
  - regex: 'CFNetwork/807'
633
  name: 'Mac'
634
  version: '10.12'
635
 
636
+ - regex: 'CFNetwork/.+ Darwin/15.6.0.*(x86_64)'
637
+ name: 'Mac'
638
+ version: '10.11.6'
639
+
640
+ - regex: 'CFNetwork/.+ Darwin/15.5.0.*(x86_64)'
641
+ name: 'Mac'
642
+ version: '10.11.5'
643
+
644
+ - regex: 'CFNetwork/.+ Darwin/15.4.0.*(x86_64)'
645
+ name: 'Mac'
646
+ version: '10.11.4'
647
+
648
+ - regex: 'CFNetwork/.+ Darwin/15.3.0.*(x86_64)'
649
+ name: 'Mac'
650
+ version: '10.11.3'
651
+
652
+ - regex: 'CFNetwork/.+ Darwin/15.2.0.*(x86_64)'
653
+ name: 'Mac'
654
+ version: '10.11.2'
655
+
656
  - regex: 'CFNetwork/760'
657
  name: 'Mac'
658
  version: '10.11'
659
 
660
+ - regex: 'CFNetwork/.+ Darwin/14.5.0.*(x86_64)'
661
+ name: 'Mac'
662
+ version: '10.10.5'
663
+
664
+ - regex: 'CFNetwork/.+ Darwin/14.4.0.*(x86_64)'
665
+ name: 'Mac'
666
+ version: '10.10.4'
667
+
668
+ - regex: 'CFNetwork/.+ Darwin/14.3.0.*(x86_64)'
669
+ name: 'Mac'
670
+ version: '10.10.3'
671
+
672
+ - regex: 'CFNetwork/.+ Darwin/14.1.0.*(x86_64)'
673
+ name: 'Mac'
674
+ version: '10.10.2'
675
+
676
  - regex: 'CFNetwork/720'
677
  name: 'Mac'
678
  version: '10.10'
679
 
680
+ - regex: 'CFNetwork/.+ Darwin/13.4.0.*(x86_64)'
681
+ name: 'Mac'
682
+ version: '10.9.5'
683
+
684
+ - regex: 'CFNetwork/.+ Darwin/13.3.0.*(x86_64)'
685
+ name: 'Mac'
686
+ version: '10.9.4'
687
+
688
+ - regex: 'CFNetwork/.+ Darwin/13.2.0.*(x86_64)'
689
+ name: 'Mac'
690
+ version: '10.9.3'
691
+
692
+ - regex: 'CFNetwork/.+ Darwin/13.1.0.*(x86_64)'
693
+ name: 'Mac'
694
+ version: '10.9.2'
695
+
696
  - regex: 'CFNetwork/673'
697
  name: 'Mac'
698
  version: '10.9'
699
 
700
+ - regex: 'CFNetwork/.+ Darwin/12.5.0.*(x86_64)'
701
+ name: 'Mac'
702
+ version: '10.8.5'
703
+
704
+ - regex: 'CFNetwork/.+ Darwin/12.4.0.*(x86_64)'
705
+ name: 'Mac'
706
+ version: '10.8.4'
707
+
708
+ - regex: 'CFNetwork/.+ Darwin/12.3.0.*(x86_64)'
709
+ name: 'Mac'
710
+ version: '10.8.3'
711
+
712
+ - regex: 'CFNetwork/.+ Darwin/12.2.0.*(x86_64)'
713
+ name: 'Mac'
714
+ version: '10.8.2'
715
+
716
+ - regex: 'CFNetwork/.+ Darwin/12.1.0.*(x86_64)'
717
+ name: 'Mac'
718
+ version: '10.8.1'
719
+
720
  - regex: 'CFNetwork/596'
721
  name: 'Mac'
722
  version: '10.8'
723
 
724
+ - regex: 'CFNetwork/.+ Darwin/11.5.0.*(x86_64)'
725
+ name: 'Mac'
726
+ version: '10.7.5'
727
+
728
+ - regex: 'CFNetwork/.+ Darwin/11.4.0.*(x86_64)'
729
+ name: 'Mac'
730
+ version: '10.7.4'
731
+
732
+ - regex: 'CFNetwork/.+ Darwin/11.3.0.*(x86_64)'
733
+ name: 'Mac'
734
+ version: '10.7.3'
735
+
736
+ - regex: 'CFNetwork/.+ Darwin/11.2.0.*(x86_64)'
737
+ name: 'Mac'
738
+ version: '10.7.2'
739
+
740
+ - regex: 'CFNetwork/.+ Darwin/11.1.0.*(x86_64)'
741
+ name: 'Mac'
742
+ version: '10.7.1'
743
+
744
  - regex: 'CFNetwork/520'
745
  name: 'Mac'
746
  version: '10.7'
778
  version: ''
779
 
780
 
781
+ ##########
782
+ # SeewoOS
783
+ ##########
784
+ - regex: 'SeewoOS x86_64 (\d+[\.\d]+)'
785
+ name: 'SeewoOS'
786
+ version: '$1'
787
+
788
+
789
  ##########
790
  # ChromeOS
791
  ##########
793
  name: 'Chrome OS'
794
  version: '$1'
795
 
 
796
  ##########
797
  # BlackBerry
798
  ##########
assets/js/asset_manager_core_js.js CHANGED
@@ -1,4 +1,4 @@
1
- /* Matomo Javascript - cb=8ae71823b222eac8bb1f2bf2b5706cc1*/
2
 
3
  /*!
4
  * Matomo - free/libre analytics platform
@@ -969,7 +969,7 @@ selectionMarkup+='</select></div>';$('.limitSelection',domElem).append(selection
969
  else{$limitSelect.toggleClass('disabled');}
970
  $limitSelect.material_select();$('.limitSelection input',domElem).attr('title',_pk_translate('General_RowsToDisplay'));}
971
  else{$('.limitSelection',domElem).hide();}},handlePeriod:function(domElem){var $periodSelect=$('.dataTablePeriods .tableIcon',domElem);var self=this;$periodSelect.click(function(){var period=$(this).attr('data-period');if(!period||period==self.param['period']){return;}
972
- self.param['period']=period;self.reloadAjaxDataTable();});},handleSort:function(domElem){var self=this;if(self.props.enable_sort){$('.sortable',domElem).off('click.dataTableSort').on('click.dataTableSort',function(){$(this).off('click.dataTableSort');self.onClickSort(this);});}
973
  if(self.param.filter_sort_column){var currentIsSubDataTable=$(domElem).parent().hasClass('cellSubDataTable');var imageSortClassType=currentIsSubDataTable?'sortSubtable':''
974
  var imageSortWidth=16;var imageSortHeight=16;var sortOrder=self.param.filter_sort_order||'desc';var head=$('th',domElem).filter(function(){return $(this).attr('id')==self.param.filter_sort_column;}).addClass('columnSorted');var sortIconHtml='<span class="sortIcon '+sortOrder+' '+imageSortClassType+'" width="'+imageSortWidth+'" height="'+imageSortHeight+'" />';var div=head.find('.thDIV');if(head.hasClass('first')||head.attr('id')=='label'){div.append(sortIconHtml);}else{div.prepend(sortIconHtml);}}},handleSearchBox:function(domElem,callbackSuccess){var self=this;var currentPattern=self.param.filter_pattern;if(typeof self.param.filter_pattern!="undefined"&&self.param.filter_pattern.length>0){currentPattern=self.param.filter_pattern;}
975
  else if(typeof self.param.filter_pattern_recursive!="undefined"&&self.param.filter_pattern_recursive.length>0){currentPattern=self.param.filter_pattern_recursive;}
@@ -1031,7 +1031,8 @@ tooltip.css({marginLeft:left,marginTop:top,top:0});tooltip.stop(true,true).fadeI
1031
  $(this).hide();else
1032
  $(this).show();});},thisReport=$('.datatableRelatedReports span:hidden',domElem)[0];function replaceReportTitleAndHelp(domElem,relatedReportName){if(!domElem||!domElem.length){return;}
1033
  var $title='';var $headline=domElem.prev('h2');if($headline.length){$title=$headline.find('.title:not(.ng-hide)');}else{var $widget=domElem.parents('.widget');if($widget.length){$title=$widget.find('.widgetName > span');}}
1034
- if($title.length){$title.text(relatedReportName);var scope=$title.scope();if(scope){var $doc=domElem.find('.reportDocumentation');if($doc.length){scope.inlineHelp=$.trim($doc.html());}
 
1035
  scope.featureName=$.trim(relatedReportName);setTimeout(function(){scope.$apply();},1);}}}
1036
  hideShowRelatedReports(thisReport);var relatedReports=$('.datatableRelatedReports span',domElem);if(!relatedReports.length){$('.datatableRelatedReports',domElem).hide();}
1037
  relatedReports.each(function(){var clicked=this;$(this).unbind('click').click(function(e){var $this=$(this);var url=$this.attr('href');self.resetAllFilters();var newParams=broadcast.getValuesFromUrl(url);for(var key in newParams){self.param[key]=decodeURIComponent(newParams[key]);}
@@ -1121,7 +1122,7 @@ dataTable.trigger('reload',params);});}});});};}(jQuery));
1121
  */
1122
  (function($){$(function(){var headerMessageParent=$('#header_message').parent();initTopControls();headerMessageParent.on('click','#updateCheckLinkContainer',function(e){var headerMessage=$(this).closest('#header_message');var $titleElement=headerMessage.find('.title');if($titleElement.attr('target')){return;}
1123
  e.preventDefault();var ajaxRequest=new ajaxHelper();ajaxRequest.setLoadingElement('#header_message .loadingPiwik');ajaxRequest.addParams({module:'CoreHome',action:'checkForUpdates'},'get');ajaxRequest.withTokenInUrl();$titleElement.addClass('activityIndicator');ajaxRequest.setCallback(function(response){headerMessage.fadeOut('slow',function(){response=$('#header_message',$('<div>'+response+'</div>'));$titleElement.removeClass('activityIndicator');var newVersionAvailable=response.hasClass('update_available');if(newVersionAvailable){headerMessage.replaceWith(response);headerMessage.show();}
1124
- else{headerMessage.find('.title').html(_pk_translate('CoreHome_YouAreUsingTheLatestVersion'));headerMessage.show();setTimeout(function(){headerMessage.fadeOut('slow',function(){headerMessage.replaceWith(response);});},4000);}});});ajaxRequest.setFormat('html');ajaxRequest.send();return false;});headerMessageParent.on('click','#header_message',function(e){if(e.target.tagName.toLowerCase()!='a'){$(this).toggleClass('expanded');}});});}(jQuery));$(document).ready(function(){$('.accessibility-skip-to-content').click(function(e){$('a[name="main"]').attr('tabindex',-1).focus();$(window).scrollTo($('a[name="main"]'));});$("#mobile-top-menu").sideNav({closeOnClick:true,edge:'right'});$('select').material_select();piwikHelper.registerShortcut('?',_pk_translate('CoreHome_ShortcutHelp'),function(event){if(event.altKey||$('.modal.open').length){return;}
1125
  if(event.preventDefault){event.preventDefault();}else{event.returnValue=false;}
1126
  var list=$('#shortcuthelp dl');list.empty();var keys=Object.keys(piwikHelper.shortcuts).sort();jQuery.each(keys,function(i,key){if(piwikHelper.shortcuts.hasOwnProperty(key)){list.append($('<dt />').append($('<kbd />').text(key)));list.append($('<dd />').text(piwikHelper.shortcuts[key]));}});var isMac=navigator.userAgent.indexOf('Mac OS X')!=-1;list.append($('<dt />').append($('<kbd />').text(_pk_translate(isMac?"CoreHome_MacPageUp":"CoreHome_HomeShortcut"))));list.append($('<dd />').text(_pk_translate('CoreHome_PageUpShortcutDescription')));list.append($('<dt />').append($('<kbd />').text(_pk_translate(isMac?"CoreHome_MacPageDown":"CoreHome_EndShortcut"))));list.append($('<dd />').text(_pk_translate('CoreHome_PageDownShortcutDescription')));piwikHelper.modalConfirm('#shortcuthelp');});});
1127
  /*!
@@ -1925,7 +1926,7 @@ function fetchPage(category,subcategory){resetPage();var pagesPromise=reportingP
1925
  (function(){angular.module('piwikApp').controller('ReportingMenuController',ReportingMenuController);ReportingMenuController.$inject=['$scope','piwik','$location','$timeout','reportingMenuModel','$rootScope','piwikUrl'];function ReportingMenuController($scope,piwik,$location,$timeout,menuModel,$rootScope,piwikUrl){var idSite=piwikUrl.getSearchParam('idSite');var period=piwikUrl.getSearchParam('period');var date=piwikUrl.getSearchParam('date');var segment=piwikUrl.getSearchParam('segment');var comparePeriods=piwikUrl.getSearchParam('comparePeriods');var compareDates=piwikUrl.getSearchParam('compareDates');var compareSegments=piwikUrl.getSearchParam('compareSegments');function markAllCategoriesAsInactive(){angular.forEach(menuModel.menu,function(cat){cat.active=false;});}
1926
  function markAllCategoriesAndChildrenInactive(){angular.forEach(menuModel.menu,function(cat){cat.active=false;angular.forEach(cat.subcategories,function(subcat){subcat.active=false;if(subcat.isGroup&&subcat.subcategories){angular.forEach(subcat.subcategories,function(sub){sub.active=false;});}});});}
1927
  $scope.menuModel=menuModel;function enterSubcategory(category,subcategory,subsubcategory){if(!category||!subcategory){return;}
1928
- markAllCategoriesAndChildrenInactive();category.active=true;subcategory.active=true;if(subsubcategory){subcategory.name=subsubcategory.name;subsubcategory.active=true;}};$scope.makeUrl=function(category,subcategory){var params={idSite:idSite,period:period,date:date,segment:decodeURIComponent(segment),category:category.id,subcategory:subcategory.id,};if(compareDates){params.compareDates=compareDates;}
1929
  if(comparePeriods){params.comparePeriods=comparePeriods;}
1930
  if(compareSegments){params.compareSegments=compareSegments;}
1931
  return $.param(params);};$scope.loadCategory=function(category){if(category.active){category.active=false;}else{markAllCategoriesAsInactive();category.active=true;}
@@ -2457,7 +2458,7 @@ var messageToDisplay=uninstallConfirmMessage.replace('%s',pluginName);$('#uninst
2457
  * @link https://matomo.org
2458
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
2459
  */
2460
- (function(){angular.module('piwikApp').directive('piwikPluginUpload',piwikPluginUpload);piwikPluginUpload.$inject=['piwik'];function piwikPluginUpload(piwik){return{restrict:'A',compile:function(element,attrs){return function(scope,element,attrs){$('.uploadPlugin').click(function(event){event.preventDefault();piwikHelper.modalConfirm('#installPluginByUpload',{});});$('#uploadPluginForm').submit(function(event){var $zipFile=$('[name=pluginZip]');var fileName=$zipFile.val();if(!fileName||'.zip'!=fileName.slice(-4)){event.preventDefault();alert(_pk_translate('CorePluginsAdmin_NoZipFileSelected'));}});};}};}})();
2461
  /*!
2462
  * Matomo - free/libre analytics platform
2463
  *
1
+ /* Matomo Javascript - cb=41ec3fea579c0e22efc9eb9a42e483eb*/
2
 
3
  /*!
4
  * Matomo - free/libre analytics platform
969
  else{$limitSelect.toggleClass('disabled');}
970
  $limitSelect.material_select();$('.limitSelection input',domElem).attr('title',_pk_translate('General_RowsToDisplay'));}
971
  else{$('.limitSelection',domElem).hide();}},handlePeriod:function(domElem){var $periodSelect=$('.dataTablePeriods .tableIcon',domElem);var self=this;$periodSelect.click(function(){var period=$(this).attr('data-period');if(!period||period==self.param['period']){return;}
972
+ var piwikPeriods=piwikHelper.getAngularDependency('piwikPeriods');var currentPeriod=piwikPeriods.parse(self.param['period'],self.param['date']);var endDateOfPeriod=currentPeriod.getDateRange()[1];endDateOfPeriod=piwikPeriods.format(endDateOfPeriod);self.param['period']=period;self.param['date']=endDateOfPeriod;self.reloadAjaxDataTable();});},handleSort:function(domElem){var self=this;if(self.props.enable_sort){$('.sortable',domElem).off('click.dataTableSort').on('click.dataTableSort',function(){$(this).off('click.dataTableSort');self.onClickSort(this);});}
973
  if(self.param.filter_sort_column){var currentIsSubDataTable=$(domElem).parent().hasClass('cellSubDataTable');var imageSortClassType=currentIsSubDataTable?'sortSubtable':''
974
  var imageSortWidth=16;var imageSortHeight=16;var sortOrder=self.param.filter_sort_order||'desc';var head=$('th',domElem).filter(function(){return $(this).attr('id')==self.param.filter_sort_column;}).addClass('columnSorted');var sortIconHtml='<span class="sortIcon '+sortOrder+' '+imageSortClassType+'" width="'+imageSortWidth+'" height="'+imageSortHeight+'" />';var div=head.find('.thDIV');if(head.hasClass('first')||head.attr('id')=='label'){div.append(sortIconHtml);}else{div.prepend(sortIconHtml);}}},handleSearchBox:function(domElem,callbackSuccess){var self=this;var currentPattern=self.param.filter_pattern;if(typeof self.param.filter_pattern!="undefined"&&self.param.filter_pattern.length>0){currentPattern=self.param.filter_pattern;}
975
  else if(typeof self.param.filter_pattern_recursive!="undefined"&&self.param.filter_pattern_recursive.length>0){currentPattern=self.param.filter_pattern_recursive;}
1031
  $(this).hide();else
1032
  $(this).show();});},thisReport=$('.datatableRelatedReports span:hidden',domElem)[0];function replaceReportTitleAndHelp(domElem,relatedReportName){if(!domElem||!domElem.length){return;}
1033
  var $title='';var $headline=domElem.prev('h2');if($headline.length){$title=$headline.find('.title:not(.ng-hide)');}else{var $widget=domElem.parents('.widget');if($widget.length){$title=$widget.find('.widgetName > span');}}
1034
+ if($title.length){$title.text(relatedReportName);var scope=$title.scope();if(scope){var $doc=domElem.find('.reportDocumentation');if($doc.length){var helpParagraph=$('p[ng-bind-html]',$doc);if(helpParagraph.length){var $parse=angular.element(document).injector().get('$parse');helpParagraph.html($parse(helpParagraph.attr('ng-bind-html')));}
1035
+ scope.inlineHelp=$.trim($doc.html());}
1036
  scope.featureName=$.trim(relatedReportName);setTimeout(function(){scope.$apply();},1);}}}
1037
  hideShowRelatedReports(thisReport);var relatedReports=$('.datatableRelatedReports span',domElem);if(!relatedReports.length){$('.datatableRelatedReports',domElem).hide();}
1038
  relatedReports.each(function(){var clicked=this;$(this).unbind('click').click(function(e){var $this=$(this);var url=$this.attr('href');self.resetAllFilters();var newParams=broadcast.getValuesFromUrl(url);for(var key in newParams){self.param[key]=decodeURIComponent(newParams[key]);}
1122
  */
1123
  (function($){$(function(){var headerMessageParent=$('#header_message').parent();initTopControls();headerMessageParent.on('click','#updateCheckLinkContainer',function(e){var headerMessage=$(this).closest('#header_message');var $titleElement=headerMessage.find('.title');if($titleElement.attr('target')){return;}
1124
  e.preventDefault();var ajaxRequest=new ajaxHelper();ajaxRequest.setLoadingElement('#header_message .loadingPiwik');ajaxRequest.addParams({module:'CoreHome',action:'checkForUpdates'},'get');ajaxRequest.withTokenInUrl();$titleElement.addClass('activityIndicator');ajaxRequest.setCallback(function(response){headerMessage.fadeOut('slow',function(){response=$('#header_message',$('<div>'+response+'</div>'));$titleElement.removeClass('activityIndicator');var newVersionAvailable=response.hasClass('update_available');if(newVersionAvailable){headerMessage.replaceWith(response);headerMessage.show();}
1125
+ else{headerMessage.find('.title').html(_pk_translate('CoreHome_YouAreUsingTheLatestVersion'));headerMessage.show();setTimeout(function(){headerMessage.fadeOut('slow',function(){headerMessage.replaceWith(response);});},4000);}});});ajaxRequest.setFormat('html');ajaxRequest.send();return false;});headerMessageParent.on('click','#header_message',function(e){if(e.target.tagName.toLowerCase()!='a'){$(this).toggleClass('expanded');}});});}(jQuery));$(document).ready(function(){$('.accessibility-skip-to-content').click(function(e){$('a[name="main"]').attr('tabindex',-1).focus();$(window).scrollTo($('a[name="main"]'));});$("#mobile-top-menu").sideNav({closeOnClick:true,edge:'right'});$('.navbar.collapsible').collapsible();$('select').material_select();piwikHelper.registerShortcut('?',_pk_translate('CoreHome_ShortcutHelp'),function(event){if(event.altKey||$('.modal.open').length){return;}
1126
  if(event.preventDefault){event.preventDefault();}else{event.returnValue=false;}
1127
  var list=$('#shortcuthelp dl');list.empty();var keys=Object.keys(piwikHelper.shortcuts).sort();jQuery.each(keys,function(i,key){if(piwikHelper.shortcuts.hasOwnProperty(key)){list.append($('<dt />').append($('<kbd />').text(key)));list.append($('<dd />').text(piwikHelper.shortcuts[key]));}});var isMac=navigator.userAgent.indexOf('Mac OS X')!=-1;list.append($('<dt />').append($('<kbd />').text(_pk_translate(isMac?"CoreHome_MacPageUp":"CoreHome_HomeShortcut"))));list.append($('<dd />').text(_pk_translate('CoreHome_PageUpShortcutDescription')));list.append($('<dt />').append($('<kbd />').text(_pk_translate(isMac?"CoreHome_MacPageDown":"CoreHome_EndShortcut"))));list.append($('<dd />').text(_pk_translate('CoreHome_PageDownShortcutDescription')));piwikHelper.modalConfirm('#shortcuthelp');});});
1128
  /*!
1926
  (function(){angular.module('piwikApp').controller('ReportingMenuController',ReportingMenuController);ReportingMenuController.$inject=['$scope','piwik','$location','$timeout','reportingMenuModel','$rootScope','piwikUrl'];function ReportingMenuController($scope,piwik,$location,$timeout,menuModel,$rootScope,piwikUrl){var idSite=piwikUrl.getSearchParam('idSite');var period=piwikUrl.getSearchParam('period');var date=piwikUrl.getSearchParam('date');var segment=piwikUrl.getSearchParam('segment');var comparePeriods=piwikUrl.getSearchParam('comparePeriods');var compareDates=piwikUrl.getSearchParam('compareDates');var compareSegments=piwikUrl.getSearchParam('compareSegments');function markAllCategoriesAsInactive(){angular.forEach(menuModel.menu,function(cat){cat.active=false;});}
1927
  function markAllCategoriesAndChildrenInactive(){angular.forEach(menuModel.menu,function(cat){cat.active=false;angular.forEach(cat.subcategories,function(subcat){subcat.active=false;if(subcat.isGroup&&subcat.subcategories){angular.forEach(subcat.subcategories,function(sub){sub.active=false;});}});});}
1928
  $scope.menuModel=menuModel;function enterSubcategory(category,subcategory,subsubcategory){if(!category||!subcategory){return;}
1929
+ markAllCategoriesAndChildrenInactive();category.active=true;subcategory.active=true;if(subsubcategory){subcategory.name=subsubcategory.name;subsubcategory.active=true;}};$scope.makeUrl=function(category,subcategory){var params={idSite:idSite,period:period,date:decodeURIComponent(date),segment:decodeURIComponent(segment),category:category.id,subcategory:subcategory.id,};if(compareDates){params.compareDates=compareDates;}
1930
  if(comparePeriods){params.comparePeriods=comparePeriods;}
1931
  if(compareSegments){params.compareSegments=compareSegments;}
1932
  return $.param(params);};$scope.loadCategory=function(category){if(category.active){category.active=false;}else{markAllCategoriesAsInactive();category.active=true;}
2458
  * @link https://matomo.org
2459
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
2460
  */
2461
+ (function(){angular.module('piwikApp').directive('piwikPluginUpload',piwikPluginUpload);piwikPluginUpload.$inject=['piwik'];function piwikPluginUpload(piwik){return{restrict:'A',compile:function(element,attrs){return function(scope,element,attrs){$('.uploadPlugin').click(function(event){event.preventDefault();piwikHelper.modalConfirm('#installPluginByUpload',{});});$('#uploadPluginForm').submit(function(event){var $zipFile=$('[name=pluginZip]');var fileName=$zipFile.val();if(!fileName||'.zip'!=fileName.slice(-4)){event.preventDefault();alert(_pk_translate('CorePluginsAdmin_NoZipFileSelected'));}else if($zipFile.data('maxSize')>0&&$zipFile[0].files[0].size>$zipFile.data('maxSize')*1048576){event.preventDefault();alert(_pk_translate('CorePluginsAdmin_FileExceedsUploadLimit'));}});};}};}})();
2462
  /*!
2463
  * Matomo - free/libre analytics platform
2464
  *
classes/WpMatomo/Admin/SystemReport.php CHANGED
@@ -52,6 +52,7 @@ class SystemReport {
52
 
53
  private $not_compatible_plugins = array(
54
  'background-manager', // Uses an old version of Twig and plugin is no longer maintained.
 
55
  'data-tables-generator-by-supsystic', // uses an old version of twig causing some styles to go funny in the reporting and admin
56
  'tweet-old-post-pro', // uses a newer version of monolog
57
  'secupress', // see #369 depending on setting might have issues
@@ -1384,6 +1385,19 @@ class SystemReport {
1384
  'comment' => get_option('stylesheet')
1385
  );
1386
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1387
  return $rows;
1388
  }
1389
 
52
 
53
  private $not_compatible_plugins = array(
54
  'background-manager', // Uses an old version of Twig and plugin is no longer maintained.
55
+ 'all-in-one-event-calendar', // Uses an old version of Twig
56
  'data-tables-generator-by-supsystic', // uses an old version of twig causing some styles to go funny in the reporting and admin
57
  'tweet-old-post-pro', // uses a newer version of monolog
58
  'secupress', // see #369 depending on setting might have issues
1385
  'comment' => get_option('stylesheet')
1386
  );
1387
 
1388
+
1389
+ if ( is_plugin_active('better-wp-security/better-wp-security.php')) {
1390
+ if (method_exists('\ITSEC_Modules', 'get_setting')
1391
+ && \ITSEC_Modules::get_setting( 'system-tweaks', 'long_url_strings' ) ) {
1392
+ $rows[] = array(
1393
+ 'name' => 'iThemes Security Long URLs Enabled',
1394
+ 'value' => true,
1395
+ 'comment' => 'Tracking might not work because it looks like you have Long URLs disabled in iThemes Security. To fix this please go to "Security -> Settings -> System Tweaks" and disable the setting "Long URL Strings".',
1396
+ 'is_error' => true,
1397
+ );
1398
+ }
1399
+ }
1400
+
1401
  return $rows;
1402
  }
1403
 
classes/WpMatomo/Admin/TrackingSettings.php CHANGED
@@ -12,6 +12,7 @@ namespace WpMatomo\Admin;
12
  use WpMatomo\Capabilities;
13
  use WpMatomo\Settings;
14
  use WpMatomo\Site;
 
15
  use WpMatomo\TrackingCode\TrackingCodeGenerator;
16
 
17
  if ( ! defined( 'ABSPATH' ) ) {
@@ -112,6 +113,23 @@ class TrackingSettings implements AdminSettingsInterface {
112
 
113
  $valid_currencies = $this->get_supported_currencies();
114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  if ( empty( $_POST[ self::FORM_NAME ][Settings::SITE_CURRENCY] )
116
  || !array_key_exists( $_POST[ self::FORM_NAME ][Settings::SITE_CURRENCY], $valid_currencies ) ) {
117
  $_POST[ self::FORM_NAME ][Settings::SITE_CURRENCY] = 'USD';
12
  use WpMatomo\Capabilities;
13
  use WpMatomo\Settings;
14
  use WpMatomo\Site;
15
+ use WpMatomo\Site\Sync\SyncConfig as SiteConfigSync;
16
  use WpMatomo\TrackingCode\TrackingCodeGenerator;
17
 
18
  if ( ! defined( 'ABSPATH' ) ) {
113
 
114
  $valid_currencies = $this->get_supported_currencies();
115
 
116
+ if ( !empty( $_POST[ self::FORM_NAME ]['tracker_debug'] ) ) {
117
+ $site_config_sync = new SiteConfigSync( $this->settings );
118
+ switch ($_POST[ self::FORM_NAME ]['tracker_debug']) {
119
+ case 'always':
120
+ $site_config_sync->set_config_value('Tracker', 'debug', 1);
121
+ $site_config_sync->set_config_value('Tracker', 'debug_on_demand', 0);
122
+ break;
123
+ case 'on_demand':
124
+ $site_config_sync->set_config_value('Tracker', 'debug', 0);
125
+ $site_config_sync->set_config_value('Tracker', 'debug_on_demand', 1);
126
+ break;
127
+ default:
128
+ $site_config_sync->set_config_value('Tracker', 'debug', 0);
129
+ $site_config_sync->set_config_value('Tracker', 'debug_on_demand', 0);
130
+ }
131
+ }
132
+
133
  if ( empty( $_POST[ self::FORM_NAME ][Settings::SITE_CURRENCY] )
134
  || !array_key_exists( $_POST[ self::FORM_NAME ][Settings::SITE_CURRENCY], $valid_currencies ) ) {
135
  $_POST[ self::FORM_NAME ][Settings::SITE_CURRENCY] = 'USD';
classes/WpMatomo/Admin/TrackingSettings/Forms.php CHANGED
@@ -13,7 +13,9 @@
13
 
14
  namespace WpMatomo\Admin\TrackingSettings;
15
 
 
16
  use WpMatomo\Admin\TrackingSettings;
 
17
  use WpMatomo\Settings;
18
 
19
  if ( ! defined( 'ABSPATH' ) ) {
@@ -134,7 +136,19 @@ class Forms {
134
  */
135
  public function show_select( $id, $name, $options = array(), $description = '', $on_change = '', $is_hidden = false, $group_name = '', $hide_description = true, $global = true ) {
136
  $options_list = '';
137
- $default = $global ? $this->settings->get_global_option( $id ) : $this->settings->get_option( $id );
 
 
 
 
 
 
 
 
 
 
 
 
138
  if ( is_array( $options ) ) {
139
  foreach ( $options as $key => $value ) {
140
  $options_list .= sprintf( '<option value="%s"' . ( $key == $default ? ' selected="selected"' : '' ) . '>%s</option>', esc_attr( $key ), esc_html( $value ) );
13
 
14
  namespace WpMatomo\Admin\TrackingSettings;
15
 
16
+ use Piwik\Config;
17
  use WpMatomo\Admin\TrackingSettings;
18
+ use WpMatomo\Bootstrap;
19
  use WpMatomo\Settings;
20
 
21
  if ( ! defined( 'ABSPATH' ) ) {
136
  */
137
  public function show_select( $id, $name, $options = array(), $description = '', $on_change = '', $is_hidden = false, $group_name = '', $hide_description = true, $global = true ) {
138
  $options_list = '';
139
+
140
+ if ($id === 'tracker_debug' && !\WpMatomo::is_safe_mode() && !$this->settings->is_network_enabled()) {
141
+ Bootstrap::do_bootstrap();
142
+ if (Config::getInstance()->Tracker['debug']) {
143
+ $default = 'always';
144
+ } elseif (Config::getInstance()->Tracker['debug_on_demand']) {
145
+ $default = 'on_demand';
146
+ } else {
147
+ $default = 'disabled';
148
+ }
149
+ } else {
150
+ $default = $global ? $this->settings->get_global_option( $id ) : $this->settings->get_option( $id );
151
+ }
152
  if ( is_array( $options ) ) {
153
  foreach ( $options as $key => $value ) {
154
  $options_list .= sprintf( '<option value="%s"' . ( $key == $default ? ' selected="selected"' : '' ) . '>%s</option>', esc_attr( $key ), esc_html( $value ) );
classes/WpMatomo/Admin/views/summary.php CHANGED
@@ -37,7 +37,7 @@ $matomo_dashboard_nonce = wp_create_nonce(\WpMatomo\Admin\Summary::NONCE_DASHBOA
37
  }
38
  ?>
39
  <?php if ( ! $is_tracking ) { ?>
40
- <div class="notice notice-warning"><p><?php esc_html_e( 'Matomo Tracking is not enabled.', 'matomo' ); ?></p></div>
41
  <?php } ?>
42
  <div class="wrap">
43
  <div id="icon-plugins" class="icon32"></div>
37
  }
38
  ?>
39
  <?php if ( ! $is_tracking ) { ?>
40
+ <div class="notice notice-warning"><p><?php esc_html_e( 'Matomo Tracking is not enabled. If you have added the Matomo tracking code in a different way, for example using a consent plugin, then you can ignore this message.', 'matomo' ); ?></p></div>
41
  <?php } ?>
42
  <div class="wrap">
43
  <div id="icon-plugins" class="icon32"></div>
classes/WpMatomo/Admin/views/tracking.php CHANGED
@@ -215,6 +215,22 @@ if ( $was_updated ) {
215
  $matomo_full_generated_tracking_group
216
  );
217
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
218
  echo $matomo_submit_button;
219
  ?>
220
 
215
  $matomo_full_generated_tracking_group
216
  );
217
 
218
+ $matomo_form->show_headline(esc_html__('For Developers', 'matomo'), 'matomo-track-option matomo-track-option-default matomo-track-option-disabled matomo-track-option-manually matomo-track-option-tagmanager');
219
+
220
+ $matomo_form->show_select(
221
+ 'tracker_debug',
222
+ __( 'Tracker Debug Mode', 'matomo' ),
223
+ array(
224
+ 'disabled' => esc_html__( 'Disabled (recommended)', 'matomo' ),
225
+ 'always' => esc_html__( 'Always enabled', 'matomo' ),
226
+ 'on_demand' => esc_html__( 'Enabled on demand', 'matomo' ),
227
+ ),
228
+ __( 'For security and privacy reasons you should only enable this setting for as short time of a time as possible.', 'matomo' ),
229
+ '',
230
+ $matomo_is_not_tracking,
231
+ $matomo_full_generated_tracking_group . ' matomo-track-option-disabled matomo-track-option-manually matomo-track-option-tagmanager'
232
+ );
233
+
234
  echo $matomo_submit_button;
235
  ?>
236
 
classes/WpMatomo/Site/Sync/SyncConfig.php CHANGED
@@ -114,7 +114,7 @@ class SyncConfig
114
  // need to update all config files
115
  wp_schedule_single_event( time() + 5, ScheduledTasks::EVENT_SYNC );
116
 
117
- } else {
118
  Bootstrap::do_bootstrap();
119
  $config = PiwikConfig::getInstance();
120
  $the_group = $config->{$group};
114
  // need to update all config files
115
  wp_schedule_single_event( time() + 5, ScheduledTasks::EVENT_SYNC );
116
 
117
+ } elseif (!\WpMatomo::is_safe_mode()) {
118
  Bootstrap::do_bootstrap();
119
  $config = PiwikConfig::getInstance();
120
  $the_group = $config->{$group};
matomo.php CHANGED
@@ -4,7 +4,7 @@
4
  * Description: The #1 Google Analytics alternative that gives you full control over your data and protects the privacy for your users. Free, secure and open.
5
  * Author: Matomo
6
  * Author URI: https://matomo.org
7
- * Version: 4.1.1
8
  * Domain Path: /languages
9
  * WC requires at least: 2.4.0
10
  * WC tested up to: 4.8.0
4
  * Description: The #1 Google Analytics alternative that gives you full control over your data and protects the privacy for your users. Free, secure and open.
5
  * Author: Matomo
6
  * Author URI: https://matomo.org
7
+ * Version: 4.1.2
8
  * Domain Path: /languages
9
  * WC requires at least: 2.4.0
10
  * WC tested up to: 4.8.0
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_i
4
  Tags: matomo,piwik,analytics,statistics,stats,tracking,ecommerce
5
  Requires at least: 4.8
6
  Tested up to: 5.6
7
- Stable tag: 4.1.1
8
  Requires PHP: 7.2.5
9
  License: GPLv3 or later
10
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
4
  Tags: matomo,piwik,analytics,statistics,stats,tracking,ecommerce
5
  Requires at least: 4.8
6
  Tested up to: 5.6
7
+ Stable tag: 4.1.2
8
  Requires PHP: 7.2.5
9
  License: GPLv3 or later
10
  License URI: https://www.gnu.org/licenses/gpl-3.0.html