user_agent_parser 2.5.0 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/lib/user_agent_parser/device.rb +3 -1
- data/lib/user_agent_parser/operating_system.rb +3 -1
- data/lib/user_agent_parser/user_agent.rb +3 -1
- data/vendor/uap-core/regexes.yaml +856 -536
- metadata +4 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f36ea17c827ff0d9a4a57841e491bafed8ae2c3a5caea5af858d6cdbb580d897
|
4
|
+
data.tar.gz: 48cce3afc9daaf42f180ce5564c9fc37c5fb288c115e93bb20b6291d43ae452f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c695d6238bb7542309a94daaea5149109aca5c0f4a1205d7a078f5182eb2d02ea768bf0884803d59a0d2f4f4f57a5ddbb8750d523469f028fcdc0b88f3f56c4
|
7
|
+
data.tar.gz: 39fa0993955155d19eabb8f31356173bfda97b2e430ce469d895713421c793ad047d327a50f1165e64861064ded84ae977a782fdbef078b6229f1c347b8f2113
|
data/MIT-LICENSE
CHANGED
@@ -17,4 +17,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
17
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
18
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
19
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -2,12 +2,14 @@
|
|
2
2
|
|
3
3
|
module UserAgentParser
|
4
4
|
class Device
|
5
|
+
DEFAULT_FAMILY = 'Other'
|
6
|
+
|
5
7
|
attr_reader :family, :model, :brand
|
6
8
|
|
7
9
|
alias name family
|
8
10
|
|
9
11
|
def initialize(family = nil, model = nil, brand = nil)
|
10
|
-
@family = family ||
|
12
|
+
@family = family || DEFAULT_FAMILY
|
11
13
|
@model = model || @family
|
12
14
|
@brand = brand
|
13
15
|
end
|
@@ -2,11 +2,13 @@
|
|
2
2
|
|
3
3
|
module UserAgentParser
|
4
4
|
class OperatingSystem
|
5
|
+
DEFAULT_FAMILY = 'Other'
|
6
|
+
|
5
7
|
attr_reader :family, :version
|
6
8
|
|
7
9
|
alias name family
|
8
10
|
|
9
|
-
def initialize(family =
|
11
|
+
def initialize(family = DEFAULT_FAMILY, version = nil)
|
10
12
|
@family = family
|
11
13
|
@version = version
|
12
14
|
end
|
@@ -2,12 +2,14 @@
|
|
2
2
|
|
3
3
|
module UserAgentParser
|
4
4
|
class UserAgent
|
5
|
+
DEFAULT_FAMILY = 'Other'
|
6
|
+
|
5
7
|
attr_reader :family, :version, :os, :device
|
6
8
|
|
7
9
|
alias name family
|
8
10
|
|
9
11
|
def initialize(family = nil, version = nil, os = nil, device = nil)
|
10
|
-
@family = family ||
|
12
|
+
@family = family || DEFAULT_FAMILY
|
11
13
|
@version = version
|
12
14
|
@os = os
|
13
15
|
@device = device
|
@@ -1,17 +1,63 @@
|
|
1
1
|
user_agent_parsers:
|
2
2
|
#### SPECIAL CASES TOP ####
|
3
3
|
|
4
|
+
# ESRI Server products
|
5
|
+
- regex: '(GeoEvent Server) (\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
|
6
|
+
|
7
|
+
# ESRI ArcGIS Desktop Products
|
8
|
+
- regex: '(ArcGIS Pro)(?: (\d+)\.(\d+)\.([^ ]+)|)'
|
9
|
+
|
10
|
+
- regex: 'ArcGIS Client Using WinInet'
|
11
|
+
family_replacement: 'ArcMap'
|
12
|
+
|
13
|
+
- regex: '(OperationsDashboard)-(?:Windows)-(\d+)\.(\d+)\.(\d+)'
|
14
|
+
family_replacement: 'Operations Dashboard for ArcGIS'
|
15
|
+
|
16
|
+
- regex: '(arcgisearth)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
17
|
+
family_replacement: 'ArcGIS Earth'
|
18
|
+
|
19
|
+
- regex: 'com.esri.(earth).phone/(\d+)\.(\d+)(?:\.(\d+)|)'
|
20
|
+
family_replacement: 'ArcGIS Earth'
|
21
|
+
|
22
|
+
# ESRI ArcGIS Mobile Products
|
23
|
+
- regex: '(arcgis-explorer)/(\d+)\.(\d+)\.(\d+)'
|
24
|
+
family_replacement: 'Explorer for ArcGIS'
|
25
|
+
|
26
|
+
- regex: 'arcgis-(collector|aurora)/(\d+)\.(\d+)\.(\d+)'
|
27
|
+
family_replacement: 'Collector for ArcGIS'
|
28
|
+
|
29
|
+
- regex: '(arcgis-workforce)/(\d+)\.(\d+)\.(\d+)'
|
30
|
+
family_replacement: 'Workforce for ArcGIS'
|
31
|
+
|
32
|
+
- regex: '(Collector|Explorer|Workforce)-(?:Android|iOS)-(\d+)\.(\d+)(?:\.(\d+)|)'
|
33
|
+
family_replacement: '$1 for ArcGIS'
|
34
|
+
|
35
|
+
- regex: '(Explorer|Collector)/(\d+) CFNetwork'
|
36
|
+
family_replacement: '$1 for ArcGIS'
|
37
|
+
|
38
|
+
# ESRI ArcGIS Runtimes
|
39
|
+
- regex: 'ArcGISRuntime-(Android|iOS|NET|Qt)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
40
|
+
family_replacement: 'ArcGIS Runtime SDK for $1'
|
41
|
+
|
42
|
+
- regex: 'ArcGIS\.?(iOS|Android|NET|Qt)(?:-|\.)(\d+)\.(\d+)(?:\.(\d+)|)'
|
43
|
+
family_replacement: 'ArcGIS Runtime SDK for $1'
|
44
|
+
|
45
|
+
- regex: 'ArcGIS\.Runtime\.(Qt)\.(\d+)\.(\d+)(?:\.(\d+)|)'
|
46
|
+
family_replacement: 'ArcGIS Runtime SDK for $1'
|
47
|
+
|
4
48
|
# CFNetwork Podcast catcher Applications
|
49
|
+
- regex: '^(Luminary)[Stage]+/(\d+) CFNetwork'
|
5
50
|
- regex: '(ESPN)[%20| ]+Radio/(\d+)\.(\d+)\.(\d+) CFNetwork'
|
6
51
|
- regex: '(Antenna)/(\d+) CFNetwork'
|
7
52
|
family_replacement: 'AntennaPod'
|
8
53
|
- regex: '(TopPodcasts)Pro/(\d+) CFNetwork'
|
9
54
|
- regex: '(MusicDownloader)Lite/(\d+)\.(\d+)\.(\d+) CFNetwork'
|
10
|
-
- regex: '^(.*)-iPad
|
11
|
-
- regex: '^(.*)-iPhone/(\d+)
|
12
|
-
- regex: '^(.*)/(\d+)
|
55
|
+
- regex: '^(.*)-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
|
56
|
+
- regex: '^(.*)-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
|
57
|
+
- regex: '^(.*)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
|
13
58
|
|
14
59
|
# Podcast catchers
|
60
|
+
- regex: '^(Luminary)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
15
61
|
- regex: '(espn\.go)'
|
16
62
|
family_replacement: 'ESPN'
|
17
63
|
- regex: '(espnradio\.com)'
|
@@ -23,16 +69,23 @@ user_agent_parsers:
|
|
23
69
|
- regex: ' (Rivo) RHYTHM'
|
24
70
|
|
25
71
|
# @note: iOS / OSX Applications
|
26
|
-
- regex: '(CFNetwork)(?:/(\d+)\.(\d+)
|
72
|
+
- regex: '(CFNetwork)(?:/(\d+)\.(\d+)(?:\.(\d+)|)|)'
|
27
73
|
family_replacement: 'CFNetwork'
|
28
74
|
|
29
75
|
# Pingdom
|
30
|
-
- regex: '(Pingdom
|
76
|
+
- regex: '(Pingdom\.com_bot_version_)(\d+)\.(\d+)'
|
31
77
|
family_replacement: 'PingdomBot'
|
32
78
|
# 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34'
|
33
79
|
- regex: '(PingdomTMS)/(\d+)\.(\d+)\.(\d+)'
|
34
80
|
family_replacement: 'PingdomBot'
|
35
81
|
|
82
|
+
# PTST / WebPageTest.org crawlers
|
83
|
+
- regex: ' (PTST)/(\d+)(?:\.(\d+)|)$'
|
84
|
+
family_replacement: 'WebPageTest.org bot'
|
85
|
+
|
86
|
+
# Datanyze.com spider
|
87
|
+
- regex: 'X11; (Datanyze); Linux'
|
88
|
+
|
36
89
|
# New Relic Pinger
|
37
90
|
- regex: '(NewRelicPinger)/(\d+)\.(\d+)'
|
38
91
|
family_replacement: 'NewRelicPingerBot'
|
@@ -41,6 +94,10 @@ user_agent_parsers:
|
|
41
94
|
- regex: '(Tableau)/(\d+)\.(\d+)'
|
42
95
|
family_replacement: 'Tableau'
|
43
96
|
|
97
|
+
# Adobe CreativeCloud
|
98
|
+
- regex: 'AppleWebKit/\d+\.\d+.* Safari.* (CreativeCloud)/(\d+)\.(\d+).(\d+)'
|
99
|
+
family_replacement: 'Adobe CreativeCloud'
|
100
|
+
|
44
101
|
# Salesforce
|
45
102
|
- regex: '(Salesforce)(?:.)\/(\d+)\.(\d?)'
|
46
103
|
|
@@ -57,49 +114,73 @@ user_agent_parsers:
|
|
57
114
|
family_replacement: 'GooglePlusBot'
|
58
115
|
|
59
116
|
# Gmail
|
60
|
-
- regex: 'via ggpht
|
117
|
+
- regex: 'via ggpht\.com GoogleImageProxy'
|
61
118
|
family_replacement: 'GmailImageProxy'
|
62
119
|
|
63
120
|
# Yahoo
|
64
|
-
- regex: 'YahooMailProxy; https://help
|
121
|
+
- regex: 'YahooMailProxy; https://help\.yahoo\.com/kb/yahoo-mail-proxy-SLN28749\.html'
|
65
122
|
family_replacement: 'YahooMailProxy'
|
66
123
|
|
67
124
|
# Twitter
|
68
125
|
- regex: '(Twitterbot)/(\d+)\.(\d+)'
|
69
|
-
family_replacement: '
|
126
|
+
family_replacement: 'Twitterbot'
|
70
127
|
|
71
|
-
# Bots Pattern '/
|
72
|
-
- regex: '/((?:Ant
|
73
|
-
# Bots Pattern 'name/0.0'
|
74
|
-
- regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)(?:\.(\d+))
|
128
|
+
# Bots Pattern 'name/0.0.0'
|
129
|
+
- regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
130
|
+
# Bots Pattern 'name/0.0.0'
|
131
|
+
- regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
75
132
|
|
76
133
|
# MSIECrawler
|
77
|
-
- regex: '(MSIE) (\d+)\.(\d+)([a-z]\d
|
134
|
+
- regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
|
78
135
|
family_replacement: 'MSIECrawler'
|
79
136
|
|
80
137
|
# DAVdroid
|
81
|
-
- regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+))
|
138
|
+
- regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
82
139
|
|
83
140
|
# Downloader ...
|
84
|
-
- regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest)(?:[ /](\d+)(?:\.(\d+)(?:\.(\d+))
|
141
|
+
- regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest|axios|unirest-(?:java|python|ruby|nodejs|php|net))(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
|
85
142
|
|
86
143
|
# Pinterestbot
|
87
|
-
- regex: '(Pinterest(?:bot)
|
144
|
+
- regex: '(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html'
|
88
145
|
family_replacement: 'Pinterestbot'
|
89
146
|
|
90
147
|
# Bots
|
91
|
-
- regex: '(1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]
|
148
|
+
- regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg|ArcGIS Hub Indexer)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
|
92
149
|
|
93
150
|
# AWS S3 Clients
|
94
151
|
# must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
|
95
|
-
- regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2
|
152
|
+
- regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?|dotnet-(?:\d{1,2}|core)))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
153
|
+
|
154
|
+
# SAFE FME
|
155
|
+
- regex: '(FME)\/(\d+\.\d+)\.(\d+)\.(\d+)'
|
156
|
+
|
157
|
+
# QGIS
|
158
|
+
- regex: '(QGIS)\/(\d)\.?0?(\d{1,2})\.?0?(\d{1,2})'
|
159
|
+
|
160
|
+
# JOSM
|
161
|
+
- regex: '(JOSM)/(\d+)\.(\d+)'
|
162
|
+
|
163
|
+
# Tygron Platform
|
164
|
+
- regex: '(Tygron Platform) \((\d+)\.(\d+)\.(\d+(?:\.\d+| RC \d+\.\d+))'
|
165
|
+
|
166
|
+
# Facebook
|
167
|
+
# Must come before "Bots General matcher" to catch OrangeBotswana
|
168
|
+
# Facebook Messenger must go before Facebook
|
169
|
+
- regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
|
170
|
+
family_replacement: 'Facebook Messenger'
|
171
|
+
# Facebook
|
172
|
+
- regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
173
|
+
family_replacement: 'Facebook'
|
174
|
+
# Sometimes Facebook does not specify a version (FBAV)
|
175
|
+
- regex: '\[FB.*;'
|
176
|
+
family_replacement: 'Facebook'
|
96
177
|
|
97
178
|
# Bots General matcher 'name/0.0'
|
98
|
-
- regex: '(?:\/[A-Za-z0-9\.]
|
99
|
-
# Bots
|
100
|
-
- regex: '(
|
101
|
-
# Bots containing spider|scrape|
|
102
|
-
- regex: '((?:[A-z0-9]
|
179
|
+
- regex: '(?:\/[A-Za-z0-9\.]+|) {0,5}([A-Za-z0-9 \-_\!\[\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
|
180
|
+
# Bots containing bot(but not CUBOT)
|
181
|
+
- regex: '((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
|
182
|
+
# Bots containing spider|scrape|Crawl
|
183
|
+
- regex: '((?:[A-z0-9]{1,50}|[A-z\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
|
103
184
|
|
104
185
|
# HbbTV standard defines what features the browser should understand.
|
105
186
|
# but it's like targeting "HTML5 browsers", effective browser support depends on the model
|
@@ -107,30 +188,47 @@ user_agent_parsers:
|
|
107
188
|
- regex: '(HbbTV)/(\d+)\.(\d+)\.(\d+) \('
|
108
189
|
|
109
190
|
# must go before Firefox to catch Chimera/SeaMonkey/Camino/Waterfox
|
110
|
-
- regex: '(Chimera|SeaMonkey|Camino|Waterfox)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]
|
191
|
+
- regex: '(Chimera|SeaMonkey|Camino|Waterfox)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*|)'
|
111
192
|
|
112
|
-
#
|
113
|
-
|
114
|
-
|
115
|
-
|
193
|
+
# must be before Firefox / Gecko to catch SailfishBrowser properly
|
194
|
+
- regex: '(SailfishBrowser)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
195
|
+
family_replacement: 'Sailfish Browser'
|
196
|
+
|
197
|
+
# Social Networks (non-Facebook)
|
116
198
|
# Pinterest
|
117
199
|
- regex: '\[(Pinterest)/[^\]]+\]'
|
118
|
-
- regex: '(Pinterest)(?: for Android(?: Tablet)
|
200
|
+
- regex: '(Pinterest)(?: for Android(?: Tablet|)|)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
119
201
|
# Instagram app
|
120
202
|
- regex: 'Mozilla.*Mobile.*(Instagram).(\d+)\.(\d+)\.(\d+)'
|
121
|
-
#
|
203
|
+
# Flipboard app
|
122
204
|
- regex: 'Mozilla.*Mobile.*(Flipboard).(\d+)\.(\d+)\.(\d+)'
|
123
|
-
#
|
205
|
+
# Flipboard-briefing app
|
124
206
|
- regex: 'Mozilla.*Mobile.*(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
|
125
207
|
# Onefootball app
|
126
208
|
- regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
|
209
|
+
# Snapchat
|
210
|
+
- regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+)\.(\d+)'
|
211
|
+
# Twitter
|
212
|
+
- regex: '(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\/(\d+)\.(\d+)|)'
|
213
|
+
family_replacement: 'Twitter'
|
214
|
+
|
215
|
+
# aspiegel.com spider (owned by Huawei)
|
216
|
+
- regex: 'Mozilla.*Mobile.*AspiegelBot'
|
217
|
+
family_replacement: 'Spider'
|
218
|
+
brand_replacement: 'Spider'
|
219
|
+
model_replacement: 'Smartphone'
|
220
|
+
|
221
|
+
- regex: 'AspiegelBot'
|
222
|
+
family_replacement: 'Spider'
|
223
|
+
brand_replacement: 'Spider'
|
224
|
+
model_replacement: 'Desktop'
|
127
225
|
|
128
226
|
# Basilisk
|
129
227
|
- regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)'
|
130
228
|
family_replacement: 'Basilisk'
|
131
229
|
|
132
230
|
# Pale Moon
|
133
|
-
- regex: '(PaleMoon)/(\d+)\.(\d+)
|
231
|
+
- regex: '(PaleMoon)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
134
232
|
family_replacement: 'Pale Moon'
|
135
233
|
|
136
234
|
# Firefox
|
@@ -142,22 +240,22 @@ user_agent_parsers:
|
|
142
240
|
family_replacement: 'Firefox Mobile'
|
143
241
|
- regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)'
|
144
242
|
family_replacement: 'Firefox Mobile'
|
145
|
-
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre)
|
243
|
+
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
|
146
244
|
family_replacement: 'Firefox ($1)'
|
147
245
|
- regex: '(Firefox)/(\d+)\.(\d+)(a\d+[a-z]*)'
|
148
246
|
family_replacement: 'Firefox Alpha'
|
149
247
|
- regex: '(Firefox)/(\d+)\.(\d+)(b\d+[a-z]*)'
|
150
248
|
family_replacement: 'Firefox Beta'
|
151
|
-
- regex: '(Firefox)-(?:\d+\.\d
|
249
|
+
- regex: '(Firefox)-(?:\d+\.\d+|)/(\d+)\.(\d+)(a\d+[a-z]*)'
|
152
250
|
family_replacement: 'Firefox Alpha'
|
153
|
-
- regex: '(Firefox)-(?:\d+\.\d
|
251
|
+
- regex: '(Firefox)-(?:\d+\.\d+|)/(\d+)\.(\d+)(b\d+[a-z]*)'
|
154
252
|
family_replacement: 'Firefox Beta'
|
155
|
-
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]
|
253
|
+
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
|
156
254
|
family_replacement: 'Firefox ($1)'
|
157
255
|
- regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
|
158
256
|
family_replacement: 'MicroB'
|
159
|
-
- regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]
|
160
|
-
- regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+))
|
257
|
+
- regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
|
258
|
+
- regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)'
|
161
259
|
family_replacement: 'Firefox iOS'
|
162
260
|
|
163
261
|
# e.g.: Flock/2.0b2
|
@@ -173,7 +271,7 @@ user_agent_parsers:
|
|
173
271
|
- regex: '(Navigator)/(\d+)\.(\d+)([ab]\d+)'
|
174
272
|
family_replacement: 'Netscape'
|
175
273
|
|
176
|
-
- regex: '(Netscape6)/(\d+)\.(\d+)\.?([ab]?\d
|
274
|
+
- regex: '(Netscape6)/(\d+)\.(\d+)\.?([ab]?\d+|)'
|
177
275
|
family_replacement: 'Netscape'
|
178
276
|
|
179
277
|
- regex: '(MyIBrow)/(\d+)\.(\d+)'
|
@@ -186,8 +284,8 @@ user_agent_parsers:
|
|
186
284
|
|
187
285
|
# Opera will stop at 9.80 and hide the real version in the Version string.
|
188
286
|
# see: http://dev.opera.com/articles/view/opera-ua-string-changes/
|
189
|
-
- regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+))
|
190
|
-
- regex: '(Opera Mini)(?:/att)
|
287
|
+
- regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
|
288
|
+
- regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)'
|
191
289
|
- regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
|
192
290
|
family_replacement: 'Opera Mobile'
|
193
291
|
- regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
|
@@ -196,7 +294,7 @@ user_agent_parsers:
|
|
196
294
|
family_replacement: 'Opera Mobile'
|
197
295
|
- regex: 'Opera Mobi'
|
198
296
|
family_replacement: 'Opera Mobile'
|
199
|
-
- regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+))
|
297
|
+
- regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
|
200
298
|
|
201
299
|
# Opera 14 for Android uses a WebKit render engine.
|
202
300
|
- regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
|
@@ -219,7 +317,7 @@ user_agent_parsers:
|
|
219
317
|
family_replacement: 'Opera Neon'
|
220
318
|
|
221
319
|
# Palm WebOS looks a lot like Safari.
|
222
|
-
- regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))
|
320
|
+
- regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+)|)'
|
223
321
|
family_replacement: 'webOS Browser'
|
224
322
|
|
225
323
|
# LuaKit has no version info.
|
@@ -235,20 +333,20 @@ user_agent_parsers:
|
|
235
333
|
- regex: 'Gecko/\d+ (Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))'
|
236
334
|
|
237
335
|
# Swiftfox
|
238
|
-
- regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)
|
336
|
+
- regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre|)) \(Swiftfox\)'
|
239
337
|
family_replacement: 'Swiftfox'
|
240
|
-
- regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]
|
338
|
+
- regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*|) \(Swiftfox\)'
|
241
339
|
family_replacement: 'Swiftfox'
|
242
340
|
|
243
341
|
# Rekonq
|
244
|
-
- regex: '(rekonq)/(\d+)\.(\d+)
|
342
|
+
- regex: '(rekonq)/(\d+)\.(\d+)(?:\.(\d+)|) Safari'
|
245
343
|
family_replacement: 'Rekonq'
|
246
344
|
- regex: 'rekonq'
|
247
345
|
family_replacement: 'Rekonq'
|
248
346
|
|
249
347
|
# Conkeror lowercase/uppercase
|
250
348
|
# http://conkeror.org/
|
251
|
-
- regex: '(conkeror|Conkeror)/(\d+)\.(\d+)
|
349
|
+
- regex: '(conkeror|Conkeror)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
252
350
|
family_replacement: 'Conkeror'
|
253
351
|
|
254
352
|
# catches lower case konqueror
|
@@ -277,41 +375,72 @@ user_agent_parsers:
|
|
277
375
|
family_replacement: 'NetFront NX'
|
278
376
|
|
279
377
|
# Amazon Silk, should go before Safari and Chrome Mobile
|
280
|
-
- regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))
|
378
|
+
- regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|)'
|
281
379
|
family_replacement: 'Amazon Silk'
|
282
380
|
|
283
381
|
# @ref: http://www.puffinbrowser.com
|
284
|
-
- regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+))
|
382
|
+
- regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
285
383
|
|
286
384
|
# Edge Mobile
|
287
385
|
- regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
|
288
386
|
family_replacement: 'Edge Mobile'
|
387
|
+
- regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
|
388
|
+
family_replacement: 'Edge Mobile'
|
289
389
|
|
290
390
|
# Samsung Internet (based on Chrome, but lacking some features)
|
291
391
|
- regex: '(SamsungBrowser)/(\d+)\.(\d+)'
|
292
392
|
family_replacement: 'Samsung Internet'
|
293
393
|
|
294
394
|
# Seznam.cz browser (based on WebKit)
|
295
|
-
- regex: '(SznProhlizec)/(\d+)\.(\d+)(?:\.(\d+))
|
395
|
+
- regex: '(SznProhlizec)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
296
396
|
family_replacement: 'Seznam prohlížeč'
|
297
397
|
|
298
398
|
# Coc Coc browser, based on Chrome (used in Vietnam)
|
299
|
-
- regex: '(coc_coc_browser)/(\d+)\.(\d+)(?:\.(\d+))
|
399
|
+
- regex: '(coc_coc_browser)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
300
400
|
family_replacement: 'Coc Coc'
|
301
401
|
|
302
402
|
# Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
|
303
|
-
- regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)(?:\.(\d+))
|
403
|
+
- regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
304
404
|
family_replacement: 'Baidu Browser'
|
305
405
|
- regex: '(FlyFlow)/(\d+)\.(\d+)'
|
306
406
|
family_replacement: 'Baidu Explorer'
|
307
407
|
|
308
408
|
# MxBrowser is Maxthon. Must go before Mobile Chrome for Android
|
309
|
-
- regex: '(MxBrowser)/(\d+)\.(\d+)(?:\.(\d+))
|
409
|
+
- regex: '(MxBrowser)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
310
410
|
family_replacement: 'Maxthon'
|
311
411
|
|
312
412
|
# Crosswalk must go before Mobile Chrome for Android
|
313
413
|
- regex: '(Crosswalk)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
|
314
414
|
|
415
|
+
# LINE https://line.me/en/
|
416
|
+
# Must go before Mobile Chrome for Android
|
417
|
+
- regex: '(Line)/(\d+)\.(\d+)\.(\d+)'
|
418
|
+
family_replacement: 'LINE'
|
419
|
+
|
420
|
+
# MiuiBrowser should got before Mobile Chrome for Android
|
421
|
+
- regex: '(MiuiBrowser)/(\d+)\.(\d+)\.(\d+)'
|
422
|
+
family_replacement: 'MiuiBrowser'
|
423
|
+
|
424
|
+
# Mint Browser should got before Mobile Chrome for Android
|
425
|
+
- regex: '(Mint Browser)/(\d+)\.(\d+)\.(\d+)'
|
426
|
+
family_replacement: 'Mint Browser'
|
427
|
+
|
428
|
+
# TopBuzz Android must go before Chrome Mobile WebView
|
429
|
+
- regex: '(TopBuzz)/(\d+).(\d+).(\d+)'
|
430
|
+
family_replacement: 'TopBuzz'
|
431
|
+
|
432
|
+
# Google Search App on Android, eg:
|
433
|
+
- regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
|
434
|
+
family_replacement: 'Google'
|
435
|
+
|
436
|
+
# QQ Browsers
|
437
|
+
- regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
|
438
|
+
family_replacement: 'QQ Browser Mini'
|
439
|
+
- regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
|
440
|
+
family_replacement: 'QQ Browser Mobile'
|
441
|
+
- regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
|
442
|
+
family_replacement: 'QQ Browser'
|
443
|
+
|
315
444
|
# Chrome Mobile
|
316
445
|
- regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
|
317
446
|
family_replacement: 'Chrome Mobile WebView'
|
@@ -338,18 +467,13 @@ user_agent_parsers:
|
|
338
467
|
- regex: '(SE 2\.X) MetaSr (\d+)\.(\d+)'
|
339
468
|
family_replacement: 'Sogou Explorer'
|
340
469
|
|
341
|
-
# QQ Browsers
|
342
|
-
- regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
|
343
|
-
family_replacement: 'QQ Browser Mini'
|
344
|
-
- regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
|
345
|
-
family_replacement: 'QQ Browser Mobile'
|
346
|
-
- regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+))?)?)?'
|
347
|
-
family_replacement: 'QQ Browser'
|
348
|
-
|
349
470
|
# Rackspace Monitoring
|
350
471
|
- regex: '(Rackspace Monitoring)/(\d+)\.(\d+)'
|
351
472
|
family_replacement: 'RackspaceBot'
|
352
473
|
|
474
|
+
# PRTG Network Monitoring
|
475
|
+
- regex: '(PRTG Network Monitor)'
|
476
|
+
|
353
477
|
# PyAMF
|
354
478
|
- regex: '(PyAMF)/(\d+)\.(\d+)\.(\d+)'
|
355
479
|
|
@@ -365,7 +489,7 @@ user_agent_parsers:
|
|
365
489
|
- regex: '(AOL) (\d+)\.(\d+); AOLBuild (\d+)'
|
366
490
|
|
367
491
|
# Podcast catcher Applications using iTunes
|
368
|
-
- regex: '(PodCruncher|Downcast)[ /]?(\d+)
|
492
|
+
- regex: '(PodCruncher|Downcast)[ /]?(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
|
369
493
|
|
370
494
|
# Box Notes https://www.box.com/resources/downloads
|
371
495
|
# Must be before Electron
|
@@ -378,6 +502,13 @@ user_agent_parsers:
|
|
378
502
|
- regex: '(Whale)/(\d+)\.(\d+)\.(\d+)'
|
379
503
|
family_replacement: 'Whale'
|
380
504
|
|
505
|
+
# 1Password
|
506
|
+
- regex: '(1Password)/(\d+)\.(\d+)\.(\d+)'
|
507
|
+
|
508
|
+
# Ghost
|
509
|
+
# @ref: http://www.ghost.org
|
510
|
+
- regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)'
|
511
|
+
|
381
512
|
#### END SPECIAL CASES TOP ####
|
382
513
|
|
383
514
|
#### MAIN CASES - this catches > 50% of all browsers ####
|
@@ -389,7 +520,7 @@ user_agent_parsers:
|
|
389
520
|
|
390
521
|
# HipChat provides a version on Mac, but not on Windows.
|
391
522
|
# Needs to be before Chrome on Windows, and AppleMail on Mac.
|
392
|
-
- regex: '(HipChat)/?(\d
|
523
|
+
- regex: '(HipChat)/?(\d+|)'
|
393
524
|
family_replacement: 'HipChat Desktop Client'
|
394
525
|
|
395
526
|
# Browser/major_version.minor_version.beta_version
|
@@ -411,19 +542,22 @@ user_agent_parsers:
|
|
411
542
|
v1_replacement: '2013'
|
412
543
|
|
413
544
|
# Outlook 2016
|
414
|
-
- regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d
|
545
|
+
- regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d+|MSOffice 16'
|
415
546
|
family_replacement: 'Outlook'
|
416
547
|
v1_replacement: '2016'
|
417
548
|
|
549
|
+
# Word 2014
|
550
|
+
- regex: 'Microsoft Office (Word) 2014'
|
551
|
+
|
418
552
|
# Windows Live Mail
|
419
553
|
- regex: 'Outlook-Express\/7\.0.*'
|
420
554
|
family_replacement: 'Windows Live Mail'
|
421
555
|
|
422
556
|
# Apple Air Mail
|
423
|
-
- regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+))
|
557
|
+
- regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+)|)'
|
424
558
|
|
425
559
|
# Thunderbird
|
426
|
-
- regex: '(Thunderbird)/(\d+)\.(\d+)(?:\.(\d+(?:pre)
|
560
|
+
- regex: '(Thunderbird)/(\d+)\.(\d+)(?:\.(\d+(?:pre|))|)'
|
427
561
|
family_replacement: 'Thunderbird'
|
428
562
|
|
429
563
|
# Postbox
|
@@ -431,18 +565,25 @@ user_agent_parsers:
|
|
431
565
|
family_replacement: 'Postbox'
|
432
566
|
|
433
567
|
# Barca
|
434
|
-
- regex: '(Barca(?:Pro)?)/(\d+)\.(\d+)(?:\.(\d+))
|
568
|
+
- regex: '(Barca(?:Pro)?)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
435
569
|
family_replacement: 'Barca'
|
436
570
|
|
437
571
|
# Lotus Notes
|
438
|
-
- regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+))
|
572
|
+
- regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
439
573
|
family_replacement: 'Lotus Notes'
|
440
574
|
|
575
|
+
# Superhuman Mail Client
|
576
|
+
# @ref: https://www.superhuman.com
|
577
|
+
- regex: 'Superhuman'
|
578
|
+
family_replacement: 'Superhuman'
|
579
|
+
|
441
580
|
# Vivaldi uses "Vivaldi"
|
442
581
|
- regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)'
|
443
582
|
|
444
583
|
# Edge/major_version.minor_version
|
445
|
-
|
584
|
+
# Edge with chromium Edg/major_version.minor_version.patch.minor_patch
|
585
|
+
- regex: '(Edge?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
|
586
|
+
family_replacement: 'Edge'
|
446
587
|
|
447
588
|
# Brave Browser https://brave.com/
|
448
589
|
- regex: '(brave)/(\d+)\.(\d+)\.(\d+) Chrome'
|
@@ -454,23 +595,23 @@ user_agent_parsers:
|
|
454
595
|
|
455
596
|
# Dolphin Browser
|
456
597
|
# @ref: http://www.dolphin.com
|
457
|
-
- regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)
|
598
|
+
- regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)(?:\.(\d+)|)'
|
458
599
|
|
459
600
|
# Headless Chrome
|
460
601
|
# https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md
|
461
|
-
- regex: '(HeadlessChrome)(?:/(\d+)\.(\d+)\.(\d+))
|
602
|
+
- regex: '(HeadlessChrome)(?:/(\d+)\.(\d+)\.(\d+)|)'
|
462
603
|
|
463
604
|
# Evolution Mail CardDav/CalDav integration
|
464
605
|
- regex: '(Evolution)/(\d+)\.(\d+)\.(\d+\.\d+)'
|
465
606
|
|
466
607
|
# Roundcube Mail CardDav plugin
|
467
|
-
- regex: '(RCM CardDAV plugin)/(\d+)\.(\d+)\.(\d+(?:-dev)
|
608
|
+
- regex: '(RCM CardDAV plugin)/(\d+)\.(\d+)\.(\d+(?:-dev|))'
|
468
609
|
|
469
610
|
# Browser/major_version.minor_version
|
470
|
-
- regex: '(bingbot|Bolt|AdobeAIR|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin|qutebrowser|Otter|QupZilla|MailBar|kmail2|YahooMobileMail|ExchangeWebServices|ExchangeServicesClient|Dragon|Outlook-iOS-Android)/(\d+)\.(\d+)(?:\.(\d+))
|
611
|
+
- regex: '(bingbot|Bolt|AdobeAIR|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin|qutebrowser|Otter|QupZilla|MailBar|kmail2|YahooMobileMail|ExchangeWebServices|ExchangeServicesClient|Dragon|Outlook-iOS-Android)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
471
612
|
|
472
613
|
# Chrome/Chromium/major_version.minor_version
|
473
|
-
- regex: '(Chromium|Chrome)/(\d+)\.(\d+)(?:\.(\d+))
|
614
|
+
- regex: '(Chromium|Chrome)/(\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
474
615
|
|
475
616
|
##########
|
476
617
|
# IE Mobile needs to happen before Android to catch cases such as:
|
@@ -490,8 +631,8 @@ user_agent_parsers:
|
|
490
631
|
# Podcast catchers
|
491
632
|
- regex: '^(bPod|Pocket Casts|Player FM)$'
|
492
633
|
- regex: '^(AlexaMediaPlayer|VLC)/(\d+)\.(\d+)\.([^.\s]+)'
|
493
|
-
- regex: '^(AntennaPod|WMPlayer|Zune|Podkicker|Radio|ExoPlayerDemo|Overcast|PocketTunes|NSPlayer|okhttp|DoggCatcher|QuickNews|QuickTime|Peapod|Podcasts|GoldenPod|VLC|Spotify|Miro|MediaGo|Juice|iPodder|gPodder|Banshee)/(\d+)\.(\d+)
|
494
|
-
- regex: '^(Peapod|Liferea)/([^.\s]+)\.([^.\s]
|
634
|
+
- regex: '^(AntennaPod|WMPlayer|Zune|Podkicker|Radio|ExoPlayerDemo|Overcast|PocketTunes|NSPlayer|okhttp|DoggCatcher|QuickNews|QuickTime|Peapod|Podcasts|GoldenPod|VLC|Spotify|Miro|MediaGo|Juice|iPodder|gPodder|Banshee)/(\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
635
|
+
- regex: '^(Peapod|Liferea)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
|
495
636
|
- regex: '^(bPod|Player FM) BMID/(\S+)'
|
496
637
|
- regex: '^(Podcast ?Addict)/v(\d+) '
|
497
638
|
- regex: '^(Podcast ?Addict) '
|
@@ -501,8 +642,8 @@ user_agent_parsers:
|
|
501
642
|
- regex: '(CITA) RSS Aggregator/(\d+)\.(\d+)'
|
502
643
|
- regex: '(Pocket Casts)$'
|
503
644
|
- regex: '(Player FM)$'
|
504
|
-
- regex: '(LG Player|Doppler|FancyMusic|MediaMonkey|Clementine) (\d+)\.(\d+)\.?([^.\s]
|
505
|
-
- regex: '(philpodder)/(\d+)\.(\d+)\.?([^.\s]
|
645
|
+
- regex: '(LG Player|Doppler|FancyMusic|MediaMonkey|Clementine) (\d+)\.(\d+)\.?([^.\s]+|)\.?([^.\s]+|)'
|
646
|
+
- regex: '(philpodder)/(\d+)\.(\d+)\.?([^.\s]+|)\.?([^.\s]+|)'
|
506
647
|
- regex: '(Player FM|Pocket Casts|DoggCatcher|Spotify|MediaMonkey|MediaGo|BashPodder)'
|
507
648
|
- regex: '(QuickTime)\.(\d+)\.(\d+)\.(\d+)'
|
508
649
|
- regex: '(Kinoma)(\d+)'
|
@@ -510,35 +651,35 @@ user_agent_parsers:
|
|
510
651
|
family_replacement: 'FancyMusic'
|
511
652
|
- regex: 'EspnDownloadManager'
|
512
653
|
family_replacement: 'ESPN'
|
513
|
-
- regex: '(ESPN) Radio (\d+)\.(\d+)
|
514
|
-
- regex: '(podracer|jPodder) v ?(\d+)\.(\d+)
|
654
|
+
- regex: '(ESPN) Radio (\d+)\.(\d+)(?:\.(\d+)|) ?(?:rv:(\d+)|) '
|
655
|
+
- regex: '(podracer|jPodder) v ?(\d+)\.(\d+)(?:\.(\d+)|)'
|
515
656
|
- regex: '(ZDM)/(\d+)\.(\d+)[; ]?'
|
516
|
-
- regex: '(Zune|BeyondPod) (\d+)
|
657
|
+
- regex: '(Zune|BeyondPod) (\d+)(?:\.(\d+)|)[\);]'
|
517
658
|
- regex: '(WMPlayer)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
|
518
659
|
- regex: '^(Lavf)'
|
519
660
|
family_replacement: 'WMPlayer'
|
520
|
-
- regex: '^(RSSRadio)[ /]?(\d
|
661
|
+
- regex: '^(RSSRadio)[ /]?(\d+|)'
|
521
662
|
- regex: '(RSS_Radio) (\d+)\.(\d+)'
|
522
663
|
family_replacement: 'RSSRadio'
|
523
664
|
- regex: '(Podkicker) \S+/(\d+)\.(\d+)\.(\d+)'
|
524
665
|
family_replacement: 'Podkicker'
|
525
|
-
- regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)
|
666
|
+
- regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)(?:\.(\d+)|)'
|
526
667
|
- regex: '^(Stitcher)/iOS'
|
527
668
|
- regex: '^(Stitcher)/Android'
|
528
669
|
- regex: '^(VLC) .*version (\d+)\.(\d+)\.(\d+)'
|
529
670
|
- regex: ' (VLC) for'
|
530
671
|
- regex: '(vlc)/(\d+)\.(\d+)\.(\d+)'
|
531
672
|
family_replacement: 'VLC'
|
532
|
-
- regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]
|
533
|
-
- regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]
|
534
|
-
- regex: '(amarok)/([^.\s]+)\.([^.\s]
|
673
|
+
- regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
|
674
|
+
- regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
|
675
|
+
- regex: '(amarok)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
|
535
676
|
family_replacement: 'Amarok'
|
536
677
|
- regex: '(Custom)-Feed Reader'
|
537
678
|
|
538
679
|
# Browser major_version.minor_version.beta_version (space instead of slash)
|
539
680
|
- regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
|
540
681
|
# Browser major_version.minor_version (space instead of slash)
|
541
|
-
- regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)
|
682
|
+
- regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
542
683
|
|
543
684
|
# Kindle WebKit
|
544
685
|
- regex: '(Kindle)/(\d+)\.(\d+)'
|
@@ -578,12 +719,16 @@ user_agent_parsers:
|
|
578
719
|
- regex: '(ownCloud-android)/(\d+)\.(\d+)\.(\d+)'
|
579
720
|
family_replacement: 'Owncloud'
|
580
721
|
|
722
|
+
# Skype for Business
|
723
|
+
- regex: '(OC)/(\d+)\.(\d+)\.(\d+)\.(\d+) \(Skype for Business\)'
|
724
|
+
family_replacement: 'Skype'
|
725
|
+
|
581
726
|
#### END MAIN CASES ####
|
582
727
|
|
583
728
|
#### SPECIAL CASES ####
|
584
729
|
- regex: '(Obigo)InternetBrowser'
|
585
730
|
- regex: '(Obigo)\-Browser'
|
586
|
-
- regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+))
|
731
|
+
- regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+)|)'
|
587
732
|
family_replacement: 'Obigo'
|
588
733
|
|
589
734
|
- regex: '(MAXTHON|Maxthon) (\d+)\.(\d+)'
|
@@ -602,24 +747,32 @@ user_agent_parsers:
|
|
602
747
|
- regex: '(Embider)/(\d+)\.(\d+)'
|
603
748
|
family_replacement: 'Polaris'
|
604
749
|
|
605
|
-
- regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d
|
750
|
+
- regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+|)'
|
606
751
|
family_replacement: 'Bon Echo'
|
607
752
|
|
753
|
+
# topbuzz on IOS
|
754
|
+
- regex: '(TopBuzz) com.alex.NewsMaster/(\d+).(\d+).(\d+)'
|
755
|
+
family_replacement: 'TopBuzz'
|
756
|
+
- regex: '(TopBuzz) com.mobilesrepublic.newsrepublic/(\d+).(\d+).(\d+)'
|
757
|
+
family_replacement: 'TopBuzz'
|
758
|
+
- regex: '(TopBuzz) com.topbuzz.videoen/(\d+).(\d+).(\d+)'
|
759
|
+
family_replacement: 'TopBuzz'
|
760
|
+
|
608
761
|
# @note: iOS / OSX Applications
|
609
|
-
- regex: '(iPod|iPhone|iPad).+
|
762
|
+
- regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
|
763
|
+
family_replacement: 'Google'
|
764
|
+
- regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|).*[ +]Safari'
|
610
765
|
family_replacement: 'Mobile Safari'
|
611
|
-
- regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+))
|
766
|
+
- regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).* AppleNews\/\d+\.\d+\.\d+?'
|
612
767
|
family_replacement: 'Mobile Safari UI/WKWebView'
|
613
|
-
- regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+))
|
614
|
-
family_replacement: 'Mobile Safari UI/WKWebView'
|
615
|
-
- regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+))?.*Mobile.*[ +]Safari'
|
616
|
-
family_replacement: 'Mobile Safari'
|
617
|
-
- regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+))?.*Mobile'
|
768
|
+
- regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|)'
|
618
769
|
family_replacement: 'Mobile Safari UI/WKWebView'
|
619
|
-
- regex: '(iPod|iPhone|iPad).* Safari'
|
770
|
+
- regex: '(iPod|iPod touch|iPhone|iPad).* Safari'
|
620
771
|
family_replacement: 'Mobile Safari'
|
621
|
-
- regex: '(iPod|iPhone|iPad)'
|
772
|
+
- regex: '(iPod|iPod touch|iPhone|iPad)'
|
622
773
|
family_replacement: 'Mobile Safari UI/WKWebView'
|
774
|
+
- regex: '(Watch)(\d+),(\d+)'
|
775
|
+
family_replacement: 'Apple $1 App'
|
623
776
|
|
624
777
|
##########################
|
625
778
|
# Outlook on iOS >= 2.62.0
|
@@ -687,18 +840,18 @@ user_agent_parsers:
|
|
687
840
|
|
688
841
|
- regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
|
689
842
|
|
690
|
-
#- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+))
|
843
|
+
#- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
|
691
844
|
# family_replacement: 'iPad'
|
692
845
|
|
693
846
|
# Phantomjs, should go before Safari
|
694
847
|
- regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
|
695
848
|
|
696
849
|
# WebKit Nightly
|
697
|
-
- regex: '(AppleWebKit)/(\d+)
|
850
|
+
- regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .* Safari'
|
698
851
|
family_replacement: 'WebKit Nightly'
|
699
852
|
|
700
853
|
# Safari
|
701
|
-
- regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+))
|
854
|
+
- regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
|
702
855
|
family_replacement: 'Safari'
|
703
856
|
# Safari didn't provide "Version/d.d.d" prior to 3.0
|
704
857
|
- regex: '(Safari)/\d+'
|
@@ -733,9 +886,9 @@ user_agent_parsers:
|
|
733
886
|
v1_replacement: '8'
|
734
887
|
|
735
888
|
# Espial
|
736
|
-
- regex: '(Espial)/(\d+)(?:\.(\d+))
|
889
|
+
- regex: '(Espial)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
737
890
|
|
738
|
-
|
891
|
+
# Apple Mail
|
739
892
|
|
740
893
|
# apple mail - not directly detectable, have it after Safari stuff
|
741
894
|
- regex: '(AppleWebKit)/(\d+)\.(\d+)\.(\d+)'
|
@@ -745,7 +898,7 @@ user_agent_parsers:
|
|
745
898
|
# AFTER IE11
|
746
899
|
# BEFORE all other IE
|
747
900
|
- regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
|
748
|
-
- regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]
|
901
|
+
- regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)'
|
749
902
|
|
750
903
|
- regex: '([MS]?IE) (\d+)\.(\d+)'
|
751
904
|
family_replacement: 'IE'
|
@@ -754,13 +907,22 @@ user_agent_parsers:
|
|
754
907
|
family_replacement: 'Python Requests'
|
755
908
|
|
756
909
|
# headless user-agents
|
757
|
-
- regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia)(?:[ /](\d+)(?:\.(\d+)(?:\.(\d+))
|
910
|
+
- regex: '\b(Windows-Update-Agent|WindowsPowerShell|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|wget2|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
|
911
|
+
|
912
|
+
# Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
|
913
|
+
- regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
|
914
|
+
family_replacement: 'Python aiohttp'
|
758
915
|
|
759
|
-
- regex: '(Java)[/ ]
|
916
|
+
- regex: '(Java)[/ ]?\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
|
760
917
|
|
761
918
|
# Cloud Storage Clients
|
762
|
-
- regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d
|
763
|
-
- regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com)
|
919
|
+
- regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
|
920
|
+
- regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
|
921
|
+
- regex: '(S3Gof3r)'
|
922
|
+
# IBM COS (Cloud Object Storage) API
|
923
|
+
- regex: '\b(ibm-cos-sdk-(?:core|java|js|python))/(\d+)\.(\d+)(?:\.(\d+)|)'
|
924
|
+
# rusoto - Rusoto - AWS SDK for Rust - https://github.com/rusoto/rusoto
|
925
|
+
- regex: '^(rusoto)/(\d+)\.(\d+)\.(\d+)'
|
764
926
|
# rclone - rsync for cloud storage - https://rclone.org/
|
765
927
|
- regex: '^(rclone)/v(\d+)\.(\d+)'
|
766
928
|
|
@@ -774,6 +936,10 @@ user_agent_parsers:
|
|
774
936
|
# Box Drive and Box Sync https://www.box.com/resources/downloads
|
775
937
|
- regex: '^(Box(?: Sync)?)/(\d+)\.(\d+)\.(\d+)'
|
776
938
|
|
939
|
+
# ViaFree streaming app https://www.viafree.{dk|se|no}
|
940
|
+
- regex: '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\d+)\.(\d+)\.(\d+)'
|
941
|
+
family_replacement: 'ViaFree'
|
942
|
+
|
777
943
|
os_parsers:
|
778
944
|
##########
|
779
945
|
# HbbTV vendors
|
@@ -819,11 +985,11 @@ os_parsers:
|
|
819
985
|
# Philips : not found any other way than a manual mapping
|
820
986
|
# Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/4.1.3 PHILIPSTV/1.1.1; en) Presto/2.10.250 Version/11.60
|
821
987
|
# Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.2.1; en) Presto/2.6.33 Version/10.70
|
822
|
-
- regex: 'HbbTV/1
|
988
|
+
- regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/4'
|
823
989
|
os_v1_replacement: '2013'
|
824
|
-
- regex: 'HbbTV/1
|
990
|
+
- regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3'
|
825
991
|
os_v1_replacement: '2012'
|
826
|
-
- regex: 'HbbTV/1
|
992
|
+
- regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/2'
|
827
993
|
os_v1_replacement: '2011'
|
828
994
|
|
829
995
|
# the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
|
@@ -833,6 +999,10 @@ os_parsers:
|
|
833
999
|
# generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
|
834
1000
|
- regex: 'HbbTV/\d+\.\d+\.\d+ \(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\)'
|
835
1001
|
|
1002
|
+
# aspiegel.com spider (owned by Huawei)
|
1003
|
+
- regex: 'AspiegelBot'
|
1004
|
+
os_replacement: 'Other'
|
1005
|
+
|
836
1006
|
##########
|
837
1007
|
# @note: Windows Phone needs to come before Windows NT 6.1 *and* before Android to catch cases such as:
|
838
1008
|
# Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920)...
|
@@ -844,14 +1014,20 @@ os_parsers:
|
|
844
1014
|
- regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
|
845
1015
|
|
846
1016
|
# Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android
|
847
|
-
- regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+))
|
1017
|
+
- regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).*Outlook-iOS-Android'
|
848
1018
|
os_replacement: 'iOS'
|
849
1019
|
|
1020
|
+
# Special case for old ArcGIS Mobile products
|
1021
|
+
- regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]+|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
|
1022
|
+
|
1023
|
+
# Special case for new ArcGIS Mobile products
|
1024
|
+
- regex: 'ArcGISRuntime-(?:Android|iOS)\/\d+\.\d+(?:\.\d+|) \((Android|iOS) (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
|
1025
|
+
|
850
1026
|
##########
|
851
1027
|
# Android
|
852
1028
|
# can actually detect rooted android os. do we care?
|
853
1029
|
##########
|
854
|
-
- regex: '(Android)[ \-/](\d+)
|
1030
|
+
- regex: '(Android)[ \-/](\d+)(?:\.(\d+)|)(?:[.\-]([a-z0-9]+)|)'
|
855
1031
|
|
856
1032
|
- regex: '(Android) Donut'
|
857
1033
|
os_v1_replacement: '1'
|
@@ -872,19 +1048,22 @@ os_parsers:
|
|
872
1048
|
- regex: '(Android) Honeycomb'
|
873
1049
|
os_v1_replacement: '3'
|
874
1050
|
|
1051
|
+
# Android 9; Android 10;
|
1052
|
+
- regex: '(Android) (\d+);'
|
1053
|
+
|
875
1054
|
# UCWEB
|
876
|
-
- regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+))
|
1055
|
+
- regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
|
877
1056
|
os_replacement: 'Android'
|
878
|
-
- regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+))
|
1057
|
+
- regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
|
879
1058
|
os_replacement: 'iOS'
|
880
|
-
- regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+))
|
1059
|
+
- regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
|
881
1060
|
os_replacement: 'Windows Phone'
|
882
1061
|
# JUC
|
883
|
-
- regex: '^(JUC).*; ?U; ?(?:Android)
|
1062
|
+
- regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)'
|
884
1063
|
os_replacement: 'Android'
|
885
1064
|
|
886
1065
|
# Salesforce
|
887
|
-
- regex: '(android)\s(?:mobile\/)(\d+)
|
1066
|
+
- regex: '(android)\s(?:mobile\/)(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
|
888
1067
|
os_replacement: 'Android'
|
889
1068
|
|
890
1069
|
##########
|
@@ -893,6 +1072,14 @@ os_parsers:
|
|
893
1072
|
- regex: '(Silk-Accelerated=[a-z]{4,5})'
|
894
1073
|
os_replacement: 'Android'
|
895
1074
|
|
1075
|
+
# Citrix Chrome App on Chrome OS
|
1076
|
+
# Note, this needs to come before the windows parsers as the app doesn't
|
1077
|
+
# properly identify as Chrome OS
|
1078
|
+
#
|
1079
|
+
# ex: Mozilla/5.0 (X11; Windows aarch64 10718.88.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36 CitrixChromeApp
|
1080
|
+
- regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).*Chrome.*(?:CitrixChromeApp)$'
|
1081
|
+
os_replacement: 'Chrome OS'
|
1082
|
+
|
896
1083
|
##########
|
897
1084
|
# Windows
|
898
1085
|
# http://en.wikipedia.org/wiki/Windows_NT#Releases
|
@@ -911,15 +1098,19 @@ os_parsers:
|
|
911
1098
|
- regex: '(Windows ?Mobile)'
|
912
1099
|
os_replacement: 'Windows Mobile'
|
913
1100
|
|
1101
|
+
- regex: '(Windows 10)'
|
1102
|
+
os_replacement: 'Windows'
|
1103
|
+
os_v1_replacement: '10'
|
1104
|
+
|
914
1105
|
- regex: '(Windows (?:NT 5\.2|NT 5\.1))'
|
915
1106
|
os_replacement: 'Windows'
|
916
1107
|
os_v1_replacement: 'XP'
|
917
1108
|
|
918
|
-
- regex: '(
|
1109
|
+
- regex: '(Win(?:dows NT |32NT\/)6\.1)'
|
919
1110
|
os_replacement: 'Windows'
|
920
1111
|
os_v1_replacement: '7'
|
921
1112
|
|
922
|
-
- regex: '(
|
1113
|
+
- regex: '(Win(?:dows NT |32NT\/)6\.0)'
|
923
1114
|
os_replacement: 'Windows'
|
924
1115
|
os_v1_replacement: 'Vista'
|
925
1116
|
|
@@ -927,25 +1118,25 @@ os_parsers:
|
|
927
1118
|
os_replacement: 'Windows'
|
928
1119
|
os_v1_replacement: 'ME'
|
929
1120
|
|
930
|
-
- regex: '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\.0|Windows Vista|Windows 2000|Windows 3.1)'
|
931
|
-
|
932
1121
|
- regex: '(Windows NT 6\.2; ARM;)'
|
933
1122
|
os_replacement: 'Windows'
|
934
1123
|
os_v1_replacement: 'RT'
|
935
1124
|
|
936
|
-
- regex: '(
|
1125
|
+
- regex: '(Win(?:dows NT |32NT\/)6\.2)'
|
937
1126
|
os_replacement: 'Windows'
|
938
1127
|
os_v1_replacement: '8'
|
939
1128
|
|
940
1129
|
- regex: '(Windows NT 6\.3; ARM;)'
|
941
1130
|
os_replacement: 'Windows'
|
942
|
-
os_v1_replacement: 'RT 8
|
1131
|
+
os_v1_replacement: 'RT 8'
|
1132
|
+
os_v2_replacement: '1'
|
943
1133
|
|
944
|
-
- regex: '(
|
1134
|
+
- regex: '(Win(?:dows NT |32NT\/)6\.3)'
|
945
1135
|
os_replacement: 'Windows'
|
946
|
-
os_v1_replacement: '8
|
1136
|
+
os_v1_replacement: '8'
|
1137
|
+
os_v2_replacement: '1'
|
947
1138
|
|
948
|
-
- regex: '(
|
1139
|
+
- regex: '(Win(?:dows NT |32NT\/)6\.4)'
|
949
1140
|
os_replacement: 'Windows'
|
950
1141
|
os_v1_replacement: '10'
|
951
1142
|
|
@@ -965,7 +1156,7 @@ os_parsers:
|
|
965
1156
|
os_replacement: 'Windows'
|
966
1157
|
os_v1_replacement: 'CE'
|
967
1158
|
|
968
|
-
- regex: 'Win ?(95|98|3.1|NT|ME|2000)'
|
1159
|
+
- regex: 'Win(?:dows)? ?(95|98|3.1|NT|ME|2000|XP|Vista|7|CE)'
|
969
1160
|
os_replacement: 'Windows'
|
970
1161
|
os_v1_replacement: '$1'
|
971
1162
|
|
@@ -993,13 +1184,13 @@ os_parsers:
|
|
993
1184
|
# @ref: http://en.wikipedia.org/wiki/Mac_OS_X#Versions
|
994
1185
|
# @ref: http://www.puredarwin.org/curious/versions
|
995
1186
|
##########
|
996
|
-
- regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+))
|
1187
|
+
- regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)'
|
997
1188
|
os_replacement: 'Mac OS X'
|
998
|
-
- regex: '
|
1189
|
+
- regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*'
|
999
1190
|
os_replacement: 'Mac OS X'
|
1000
|
-
os_v1_replacement: '$
|
1001
|
-
os_v2_replacement: '$
|
1002
|
-
os_v3_replacement: '$
|
1191
|
+
os_v1_replacement: '$1'
|
1192
|
+
os_v2_replacement: '$2'
|
1193
|
+
os_v3_replacement: '$3'
|
1003
1194
|
# Leopard
|
1004
1195
|
- regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
|
1005
1196
|
os_replacement: 'Mac OS X'
|
@@ -1038,7 +1229,7 @@ os_parsers:
|
|
1038
1229
|
- regex: '(?:PPC|Intel) (Mac OS X)'
|
1039
1230
|
|
1040
1231
|
# Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin
|
1041
|
-
- regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+))
|
1232
|
+
- regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
|
1042
1233
|
os_replacement: 'Mac OS X'
|
1043
1234
|
|
1044
1235
|
##########
|
@@ -1046,10 +1237,10 @@ os_parsers:
|
|
1046
1237
|
# http://en.wikipedia.org/wiki/IOS_version_history
|
1047
1238
|
##########
|
1048
1239
|
# keep this above generic iOS, since AppleTV UAs contain 'CPU OS'
|
1049
|
-
- regex: '(Apple\s?TV)(?:/(\d+)\.(\d+))
|
1240
|
+
- regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)'
|
1050
1241
|
os_replacement: 'ATV OS X'
|
1051
1242
|
|
1052
|
-
- regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+))
|
1243
|
+
- regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
|
1053
1244
|
os_replacement: 'iOS'
|
1054
1245
|
|
1055
1246
|
# remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
|
@@ -1231,19 +1422,31 @@ os_parsers:
|
|
1231
1422
|
os_replacement: 'iOS'
|
1232
1423
|
|
1233
1424
|
# iOS Apps
|
1234
|
-
- regex: '\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+))
|
1425
|
+
- regex: '\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+)|)'
|
1235
1426
|
os_replacement: 'iOS'
|
1236
1427
|
- regex: '\((iOS);'
|
1237
1428
|
|
1429
|
+
##########
|
1430
|
+
# Apple Watch
|
1431
|
+
##########
|
1432
|
+
- regex: '(watchOS)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
1433
|
+
os_replacement: 'WatchOS'
|
1434
|
+
|
1238
1435
|
##########################
|
1239
1436
|
# Outlook on iOS >= 2.62.0
|
1240
1437
|
##########################
|
1241
1438
|
- regex: 'Outlook-(iOS)/\d+\.\d+\.prod\.iphone'
|
1242
1439
|
|
1440
|
+
##########################
|
1441
|
+
# iOS devices, the same regex matches mobile safari webviews
|
1442
|
+
##########################
|
1443
|
+
- regex: '(iPod|iPhone|iPad)'
|
1444
|
+
os_replacement: 'iOS'
|
1445
|
+
|
1243
1446
|
##########
|
1244
1447
|
# Apple TV
|
1245
1448
|
##########
|
1246
|
-
- regex: '(tvOS)/(\d+)
|
1449
|
+
- regex: '(tvOS)[/ ](\d+)\.(\d+)(?:\.(\d+)|)'
|
1247
1450
|
os_replacement: 'tvOS'
|
1248
1451
|
|
1249
1452
|
##########
|
@@ -1252,7 +1455,7 @@ os_parsers:
|
|
1252
1455
|
# http://code.google.com/p/chromium-os/issues/detail?id=11573
|
1253
1456
|
# http://code.google.com/p/chromium-os/issues/detail?id=13790
|
1254
1457
|
##########
|
1255
|
-
- regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+))
|
1458
|
+
- regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+)|)'
|
1256
1459
|
os_replacement: 'Chrome OS'
|
1257
1460
|
|
1258
1461
|
##########
|
@@ -1260,8 +1463,8 @@ os_parsers:
|
|
1260
1463
|
##########
|
1261
1464
|
- regex: '([Dd]ebian)'
|
1262
1465
|
os_replacement: 'Debian'
|
1263
|
-
- regex: '(Linux Mint)(?:/(\d+))
|
1264
|
-
- regex: '(Mandriva)(?: Linux)
|
1466
|
+
- regex: '(Linux Mint)(?:/(\d+)|)'
|
1467
|
+
- regex: '(Mandriva)(?: Linux|)/(?:[\d.-]+m[a-z]{2}(\d+).(\d)|)'
|
1265
1468
|
|
1266
1469
|
##########
|
1267
1470
|
# Symbian + Symbian OS
|
@@ -1290,9 +1493,9 @@ os_parsers:
|
|
1290
1493
|
##########
|
1291
1494
|
- regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
|
1292
1495
|
os_replacement: 'BlackBerry OS'
|
1293
|
-
- regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))
|
1496
|
+
- regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
|
1294
1497
|
os_replacement: 'BlackBerry OS'
|
1295
|
-
- regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))
|
1498
|
+
- regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
|
1296
1499
|
os_replacement: 'BlackBerry OS'
|
1297
1500
|
- regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
|
1298
1501
|
os_replacement: 'BlackBerry Tablet OS'
|
@@ -1301,6 +1504,12 @@ os_parsers:
|
|
1301
1504
|
- regex: '(Black[Bb]erry)'
|
1302
1505
|
os_replacement: 'BlackBerry OS'
|
1303
1506
|
|
1507
|
+
##########
|
1508
|
+
# KaiOS
|
1509
|
+
##########
|
1510
|
+
- regex: '(K[Aa][Ii]OS)\/(\d+)\.(\d+)(?:\.(\d+)|)'
|
1511
|
+
os_replacement: 'KaiOS'
|
1512
|
+
|
1304
1513
|
##########
|
1305
1514
|
# Firefox OS
|
1306
1515
|
##########
|
@@ -1359,20 +1568,20 @@ os_parsers:
|
|
1359
1568
|
##########
|
1360
1569
|
# Google TV
|
1361
1570
|
##########
|
1362
|
-
- regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+))
|
1571
|
+
- regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+)|)|/[\da-z]+)'
|
1363
1572
|
|
1364
1573
|
- regex: '(WebTV)/(\d+).(\d+)'
|
1365
1574
|
|
1366
1575
|
##########
|
1367
1576
|
# Chromecast
|
1368
1577
|
##########
|
1369
|
-
- regex: '(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+))
|
1578
|
+
- regex: '(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|)'
|
1370
1579
|
os_replacement: 'Chromecast'
|
1371
1580
|
|
1372
1581
|
##########
|
1373
1582
|
# Misc mobile
|
1374
1583
|
##########
|
1375
|
-
- regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))
|
1584
|
+
- regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+)|)'
|
1376
1585
|
os_replacement: 'webOS'
|
1377
1586
|
- regex: '(VRE);'
|
1378
1587
|
|
@@ -1380,10 +1589,10 @@ os_parsers:
|
|
1380
1589
|
# Generic patterns
|
1381
1590
|
# since the majority of os cases are very specific, these go last
|
1382
1591
|
##########
|
1383
|
-
- regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)(?:\.(\d+))
|
1592
|
+
- regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
1384
1593
|
|
1385
1594
|
# Gentoo Linux + Kernel Version
|
1386
|
-
- regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+))
|
1595
|
+
- regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo'
|
1387
1596
|
os_replacement: 'Gentoo'
|
1388
1597
|
|
1389
1598
|
# Opera Mini Bada
|
@@ -1393,7 +1602,7 @@ os_parsers:
|
|
1393
1602
|
- regex: '(Windows|Android|WeTab|Maemo|Web0S)'
|
1394
1603
|
- regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\b)BSD)'
|
1395
1604
|
# Linux + Kernel Version
|
1396
|
-
- regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+))
|
1605
|
+
- regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+)|)|)'
|
1397
1606
|
- regex: 'SunOS'
|
1398
1607
|
os_replacement: 'Solaris'
|
1399
1608
|
# Wget/x.x.x (linux-gnu)
|
@@ -1403,6 +1612,8 @@ os_parsers:
|
|
1403
1612
|
os_replacement: 'Red Hat'
|
1404
1613
|
- regex: '\((freebsd)(\d+)\.(\d+)\)'
|
1405
1614
|
os_replacement: 'FreeBSD'
|
1615
|
+
- regex: 'linux'
|
1616
|
+
os_replacement: 'Linux'
|
1406
1617
|
|
1407
1618
|
# Roku Digital-Video-Players https://www.roku.com/
|
1408
1619
|
- regex: '^(Roku)/DVP-(\d+)\.(\d+)'
|
@@ -1424,11 +1635,31 @@ device_parsers:
|
|
1424
1635
|
brand_replacement: 'Spider'
|
1425
1636
|
model_replacement: 'Feature Phone'
|
1426
1637
|
|
1638
|
+
# PTST / WebPageTest.org crawlers
|
1639
|
+
- regex: ' PTST/\d+(?:\.)?\d+$'
|
1640
|
+
device_replacement: 'Spider'
|
1641
|
+
brand_replacement: 'Spider'
|
1642
|
+
|
1643
|
+
# Datanyze.com spider
|
1644
|
+
- regex: 'X11; Datanyze; Linux'
|
1645
|
+
device_replacement: 'Spider'
|
1646
|
+
brand_replacement: 'Spider'
|
1647
|
+
|
1648
|
+
# aspiegel.com spider (owned by Huawei)
|
1649
|
+
- regex: 'Mozilla.*Mobile.*AspiegelBot'
|
1650
|
+
device_replacement: 'Spider'
|
1651
|
+
brand_replacement: 'Spider'
|
1652
|
+
model_replacement: 'Smartphone'
|
1653
|
+
- regex: 'Mozilla.*AspiegelBot'
|
1654
|
+
device_replacement: 'Spider'
|
1655
|
+
brand_replacement: 'Spider'
|
1656
|
+
model_replacement: 'Desktop'
|
1657
|
+
|
1427
1658
|
#########
|
1428
1659
|
# WebBrowser for SmartWatch
|
1429
1660
|
# @ref: https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en
|
1430
1661
|
#########
|
1431
|
-
- regex: '\bSmartWatch
|
1662
|
+
- regex: '\bSmartWatch {0,2}\( {0,2}([^;]+) {0,2}; {0,2}([^;]+) {0,2};'
|
1432
1663
|
device_replacement: '$1 $2'
|
1433
1664
|
brand_replacement: '$1'
|
1434
1665
|
model_replacement: '$2'
|
@@ -1440,7 +1671,7 @@ device_parsers:
|
|
1440
1671
|
######################################################################
|
1441
1672
|
|
1442
1673
|
# Android Application
|
1443
|
-
- regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson)
|
1674
|
+
- regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson|) (.+) \w+ - '
|
1444
1675
|
device_replacement: '$1 $2'
|
1445
1676
|
brand_replacement: '$1$2'
|
1446
1677
|
model_replacement: '$3'
|
@@ -1458,11 +1689,11 @@ device_parsers:
|
|
1458
1689
|
# 3Q
|
1459
1690
|
# @ref: http://www.3q-int.com/
|
1460
1691
|
#########
|
1461
|
-
- regex: '; *([BLRQ]C\d{4}[A-Z]
|
1692
|
+
- regex: '; *([BLRQ]C\d{4}[A-Z]+?)(?: Build|\) AppleWebKit)'
|
1462
1693
|
device_replacement: '3Q $1'
|
1463
1694
|
brand_replacement: '3Q'
|
1464
1695
|
model_replacement: '$1'
|
1465
|
-
- regex: '; *(?:3Q_)([^;/]
|
1696
|
+
- regex: '; *(?:3Q_)([^;/]+?)(?: Build|\) AppleWebKit)'
|
1466
1697
|
device_replacement: '3Q $1'
|
1467
1698
|
brand_replacement: '3Q'
|
1468
1699
|
model_replacement: '$1'
|
@@ -1471,19 +1702,19 @@ device_parsers:
|
|
1471
1702
|
# Acer
|
1472
1703
|
# @ref: http://us.acer.com/ac/en/US/content/group/tablets
|
1473
1704
|
#########
|
1474
|
-
- regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G)
|
1705
|
+
- regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+?)(?: Build|\) AppleWebKit)'
|
1475
1706
|
device_replacement: '$1'
|
1476
1707
|
brand_replacement: 'Acer'
|
1477
1708
|
model_replacement: '$1'
|
1478
|
-
- regex: '; *Acer Iconia Tab ([^;/]
|
1709
|
+
- regex: '; *Acer Iconia Tab ([^;/]+?)(?: Build|\) AppleWebKit)'
|
1479
1710
|
device_replacement: '$1'
|
1480
1711
|
brand_replacement: 'Acer'
|
1481
1712
|
model_replacement: '$1'
|
1482
|
-
- regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+) Build'
|
1713
|
+
- regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+)(?: Build|\) AppleWebKit)'
|
1483
1714
|
device_replacement: '$1'
|
1484
1715
|
brand_replacement: 'Acer'
|
1485
1716
|
model_replacement: '$1'
|
1486
|
-
- regex: '; *(Acer |ACER )([^;/]
|
1717
|
+
- regex: '; *(Acer |ACER )([^;/]+?)(?: Build|\) AppleWebKit)'
|
1487
1718
|
device_replacement: '$1$2'
|
1488
1719
|
brand_replacement: 'Acer'
|
1489
1720
|
model_replacement: '$2'
|
@@ -1494,7 +1725,7 @@ device_parsers:
|
|
1494
1725
|
# @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
|
1495
1726
|
# custom ROM builds for Vega
|
1496
1727
|
#########
|
1497
|
-
- regex: '; *(Advent )
|
1728
|
+
- regex: '; *(Advent |)(Vega(?:Bean|Comb|)).*?(?: Build|\) AppleWebKit)'
|
1498
1729
|
device_replacement: '$1$2'
|
1499
1730
|
brand_replacement: 'Advent'
|
1500
1731
|
model_replacement: '$2'
|
@@ -1503,7 +1734,7 @@ device_parsers:
|
|
1503
1734
|
# Ainol
|
1504
1735
|
# @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
|
1505
1736
|
#########
|
1506
|
-
- regex: '; *(Ainol )
|
1737
|
+
- regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+?)(?: Build|\) AppleWebKit)'
|
1507
1738
|
device_replacement: '$1$2'
|
1508
1739
|
brand_replacement: 'Ainol'
|
1509
1740
|
model_replacement: '$2'
|
@@ -1517,7 +1748,7 @@ device_parsers:
|
|
1517
1748
|
device_replacement: '$1'
|
1518
1749
|
brand_replacement: 'Airis'
|
1519
1750
|
model_replacement: '$1'
|
1520
|
-
- regex: '; *(OnePAD[^;/]
|
1751
|
+
- regex: '; *(OnePAD[^;/]+?)(?: Build|\) AppleWebKit)'
|
1521
1752
|
regex_flag: 'i'
|
1522
1753
|
device_replacement: '$1'
|
1523
1754
|
brand_replacement: 'Airis'
|
@@ -1527,7 +1758,7 @@ device_parsers:
|
|
1527
1758
|
# Airpad
|
1528
1759
|
# @ref: ??
|
1529
1760
|
#########
|
1530
|
-
- regex: '; *Airpad[ \-]([^;/]
|
1761
|
+
- regex: '; *Airpad[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
|
1531
1762
|
device_replacement: 'Airpad $1'
|
1532
1763
|
brand_replacement: 'Airpad'
|
1533
1764
|
model_replacement: '$1'
|
@@ -1536,29 +1767,29 @@ device_parsers:
|
|
1536
1767
|
# Alcatel - TCT
|
1537
1768
|
# @ref: http://www.alcatelonetouch.com/global-en/products/smartphones.html
|
1538
1769
|
#########
|
1539
|
-
- regex: '; *(one ?touch) (EVO7|T10|T20) Build'
|
1770
|
+
- regex: '; *(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
|
1540
1771
|
device_replacement: 'Alcatel One Touch $2'
|
1541
1772
|
brand_replacement: 'Alcatel'
|
1542
1773
|
model_replacement: 'One Touch $2'
|
1543
|
-
- regex: '; *(?:alcatel[ _])
|
1774
|
+
- regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+?)(?: Build|\) AppleWebKit)'
|
1544
1775
|
regex_flag: 'i'
|
1545
1776
|
device_replacement: 'Alcatel One Touch $1'
|
1546
1777
|
brand_replacement: 'Alcatel'
|
1547
1778
|
model_replacement: 'One Touch $1'
|
1548
|
-
- regex: '; *(TCL)[ _]([^;/]
|
1779
|
+
- regex: '; *(TCL)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
1549
1780
|
device_replacement: '$1 $2'
|
1550
1781
|
brand_replacement: '$1'
|
1551
1782
|
model_replacement: '$2'
|
1552
1783
|
# operator specific models
|
1553
|
-
- regex: '; *(Vodafone Smart II|Optimus_Madrid) Build'
|
1784
|
+
- regex: '; *(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
|
1554
1785
|
device_replacement: 'Alcatel $1'
|
1555
1786
|
brand_replacement: 'Alcatel'
|
1556
1787
|
model_replacement: '$1'
|
1557
|
-
- regex: '; *BASE_Lutea_3 Build'
|
1788
|
+
- regex: '; *BASE_Lutea_3(?: Build|\) AppleWebKit)'
|
1558
1789
|
device_replacement: 'Alcatel One Touch 998'
|
1559
1790
|
brand_replacement: 'Alcatel'
|
1560
1791
|
model_replacement: 'One Touch 998'
|
1561
|
-
- regex: '; *BASE_Varia Build'
|
1792
|
+
- regex: '; *BASE_Varia(?: Build|\) AppleWebKit)'
|
1562
1793
|
device_replacement: 'Alcatel One Touch 918D'
|
1563
1794
|
brand_replacement: 'Alcatel'
|
1564
1795
|
model_replacement: 'One Touch 918D'
|
@@ -1567,7 +1798,7 @@ device_parsers:
|
|
1567
1798
|
# Allfine
|
1568
1799
|
# @ref: http://www.myallfine.com/Products.asp
|
1569
1800
|
#########
|
1570
|
-
- regex: '; *((?:FINE|Fine)\d[^;/]
|
1801
|
+
- regex: '; *((?:FINE|Fine)\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
1571
1802
|
device_replacement: '$1'
|
1572
1803
|
brand_replacement: 'Allfine'
|
1573
1804
|
model_replacement: '$1'
|
@@ -1576,15 +1807,15 @@ device_parsers:
|
|
1576
1807
|
# Allview
|
1577
1808
|
# @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
|
1578
1809
|
#########
|
1579
|
-
- regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED)
|
1810
|
+
- regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*?)(?: Build|\) AppleWebKit)'
|
1580
1811
|
device_replacement: '$1$2'
|
1581
1812
|
brand_replacement: 'Allview'
|
1582
1813
|
model_replacement: '$2'
|
1583
|
-
- regex: '; *(ALLVIEW[ _]?|Allview[ _]
|
1814
|
+
- regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
|
1584
1815
|
device_replacement: '$1$2'
|
1585
1816
|
brand_replacement: 'Allview'
|
1586
1817
|
model_replacement: '$2'
|
1587
|
-
- regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]
|
1818
|
+
- regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
|
1588
1819
|
device_replacement: '$1$2'
|
1589
1820
|
brand_replacement: 'Allview'
|
1590
1821
|
model_replacement: '$2'
|
@@ -1594,11 +1825,11 @@ device_parsers:
|
|
1594
1825
|
# @ref: http://www.allwinner.com/
|
1595
1826
|
# @models: A31 (13.3"),A20,A10,
|
1596
1827
|
#########
|
1597
|
-
- regex: '; *(A13-MID) Build'
|
1828
|
+
- regex: '; *(A13-MID)(?: Build|\) AppleWebKit)'
|
1598
1829
|
device_replacement: '$1'
|
1599
1830
|
brand_replacement: 'Allwinner'
|
1600
1831
|
model_replacement: '$1'
|
1601
|
-
- regex: '; *(Allwinner)[ _\-]?([^;/]
|
1832
|
+
- regex: '; *(Allwinner)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
|
1602
1833
|
device_replacement: '$1 $2'
|
1603
1834
|
brand_replacement: 'Allwinner'
|
1604
1835
|
model_replacement: '$1'
|
@@ -1607,7 +1838,7 @@ device_parsers:
|
|
1607
1838
|
# Amaway
|
1608
1839
|
# @ref: http://www.amaway.cn/
|
1609
1840
|
#########
|
1610
|
-
- regex: '; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80) Build'
|
1841
|
+
- regex: '; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\) AppleWebKit)'
|
1611
1842
|
device_replacement: '$1'
|
1612
1843
|
brand_replacement: 'Amaway'
|
1613
1844
|
model_replacement: '$1'
|
@@ -1616,11 +1847,11 @@ device_parsers:
|
|
1616
1847
|
# Amoi
|
1617
1848
|
# @ref: http://www.amoi.com/en/prd/prd_index.jspx
|
1618
1849
|
#########
|
1619
|
-
- regex: '; *(?:AMOI|Amoi)[ _]([^;/]
|
1850
|
+
- regex: '; *(?:AMOI|Amoi)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
1620
1851
|
device_replacement: 'Amoi $1'
|
1621
1852
|
brand_replacement: 'Amoi'
|
1622
1853
|
model_replacement: '$1'
|
1623
|
-
- regex: '^(?:AMOI|Amoi)[ _]([^;/]
|
1854
|
+
- regex: '^(?:AMOI|Amoi)[ _]([^;/]+?) Linux'
|
1624
1855
|
device_replacement: 'Amoi $1'
|
1625
1856
|
brand_replacement: 'Amoi'
|
1626
1857
|
model_replacement: '$1'
|
@@ -1629,7 +1860,7 @@ device_parsers:
|
|
1629
1860
|
# Aoc
|
1630
1861
|
# @ref: http://latin.aoc.com/media_tablet
|
1631
1862
|
#########
|
1632
|
-
- regex: '; *(MW(?:0[789]|10)[^;/]
|
1863
|
+
- regex: '; *(MW(?:0[789]|10)[^;/]+?)(?: Build|\) AppleWebKit)'
|
1633
1864
|
device_replacement: '$1'
|
1634
1865
|
brand_replacement: 'Aoc'
|
1635
1866
|
model_replacement: '$1'
|
@@ -1640,11 +1871,11 @@ device_parsers:
|
|
1640
1871
|
# @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
|
1641
1872
|
# @note: brand owned by luckystar
|
1642
1873
|
#########
|
1643
|
-
- regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T)
|
1874
|
+
- regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\) AppleWebKit)'
|
1644
1875
|
device_replacement: 'Aoson $1'
|
1645
1876
|
brand_replacement: 'Aoson'
|
1646
1877
|
model_replacement: '$1'
|
1647
|
-
- regex: '; *Aoson ([^;/]
|
1878
|
+
- regex: '; *Aoson ([^;/]+?)(?: Build|\) AppleWebKit)'
|
1648
1879
|
regex_flag: 'i'
|
1649
1880
|
device_replacement: 'Aoson $1'
|
1650
1881
|
brand_replacement: 'Aoson'
|
@@ -1654,7 +1885,7 @@ device_parsers:
|
|
1654
1885
|
# Apanda
|
1655
1886
|
# @ref: http://www.apanda.com.cn/
|
1656
1887
|
#########
|
1657
|
-
- regex: '; *[Aa]panda[ _\-]([^;/]
|
1888
|
+
- regex: '; *[Aa]panda[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
|
1658
1889
|
device_replacement: 'Apanda $1'
|
1659
1890
|
brand_replacement: 'Apanda'
|
1660
1891
|
model_replacement: '$1'
|
@@ -1664,7 +1895,7 @@ device_parsers:
|
|
1664
1895
|
# @ref: http://www.archos.com/de/products/tablets.html
|
1665
1896
|
# @ref: http://www.archos.com/de/products/smartphones/index.html
|
1666
1897
|
#########
|
1667
|
-
- regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build
|
1898
|
+
- regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|\) AppleWebKit)'
|
1668
1899
|
device_replacement: 'Archos $1'
|
1669
1900
|
brand_replacement: 'Archos'
|
1670
1901
|
model_replacement: '$1'
|
@@ -1676,11 +1907,11 @@ device_parsers:
|
|
1676
1907
|
device_replacement: 'Archos $1'
|
1677
1908
|
brand_replacement: 'Archos'
|
1678
1909
|
model_replacement: '$1'
|
1679
|
-
- regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4}) Build'
|
1910
|
+
- regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
|
1680
1911
|
device_replacement: 'Archos $1'
|
1681
1912
|
brand_replacement: 'Archos'
|
1682
1913
|
model_replacement: '$1'
|
1683
|
-
- regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9) Build'
|
1914
|
+
- regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
|
1684
1915
|
device_replacement: 'Archos $1'
|
1685
1916
|
brand_replacement: 'Archos'
|
1686
1917
|
model_replacement: '$1'
|
@@ -1689,11 +1920,11 @@ device_parsers:
|
|
1689
1920
|
# A-rival
|
1690
1921
|
# @ref: http://www.a-rival.de/de/
|
1691
1922
|
#########
|
1692
|
-
- regex: '; *(PAD-FMD[^;/]
|
1923
|
+
- regex: '; *(PAD-FMD[^;/]+?)(?: Build|\) AppleWebKit)'
|
1693
1924
|
device_replacement: '$1'
|
1694
1925
|
brand_replacement: 'Arival'
|
1695
1926
|
model_replacement: '$1'
|
1696
|
-
- regex: '; *(BioniQ) ?([^;/]
|
1927
|
+
- regex: '; *(BioniQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
|
1697
1928
|
device_replacement: '$1 $2'
|
1698
1929
|
brand_replacement: 'Arival'
|
1699
1930
|
model_replacement: '$1 $2'
|
@@ -1702,11 +1933,11 @@ device_parsers:
|
|
1702
1933
|
# Arnova
|
1703
1934
|
# @ref: http://arnovatech.com/
|
1704
1935
|
#########
|
1705
|
-
- regex: '; *(AN\d[^;/]+|ARCHM\d+) Build'
|
1936
|
+
- regex: '; *(AN\d[^;/]+|ARCHM\d+)(?: Build|\) AppleWebKit)'
|
1706
1937
|
device_replacement: 'Arnova $1'
|
1707
1938
|
brand_replacement: 'Arnova'
|
1708
1939
|
model_replacement: '$1'
|
1709
|
-
- regex: '; *(?:ARNOVA|Arnova) ?([^;/]
|
1940
|
+
- regex: '; *(?:ARNOVA|Arnova) ?([^;/]+?)(?: Build|\) AppleWebKit)'
|
1710
1941
|
device_replacement: 'Arnova $1'
|
1711
1942
|
brand_replacement: 'Arnova'
|
1712
1943
|
model_replacement: '$1'
|
@@ -1715,7 +1946,7 @@ device_parsers:
|
|
1715
1946
|
# Assistant
|
1716
1947
|
# @ref: http://www.assistant.ua
|
1717
1948
|
#########
|
1718
|
-
- regex: '; *(?:ASSISTANT )
|
1949
|
+
- regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
|
1719
1950
|
device_replacement: 'Assistant $1-$2'
|
1720
1951
|
brand_replacement: 'Assistant'
|
1721
1952
|
model_replacement: '$1-$2'
|
@@ -1724,11 +1955,11 @@ device_parsers:
|
|
1724
1955
|
# Asus
|
1725
1956
|
# @ref: http://www.asus.com/uk/Tablets_Mobile/
|
1726
1957
|
#########
|
1727
|
-
- regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013)
|
1958
|
+
- regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
|
1728
1959
|
device_replacement: 'Asus $1'
|
1729
1960
|
brand_replacement: 'Asus'
|
1730
1961
|
model_replacement: '$1'
|
1731
|
-
- regex: '; *ASUS[ _]*([^;/]
|
1962
|
+
- regex: '; *ASUS[ _]*([^;/]+?)(?: Build|\) AppleWebKit)'
|
1732
1963
|
device_replacement: 'Asus $1'
|
1733
1964
|
brand_replacement: 'Asus'
|
1734
1965
|
model_replacement: '$1'
|
@@ -1736,11 +1967,11 @@ device_parsers:
|
|
1736
1967
|
#########
|
1737
1968
|
# Garmin-Asus
|
1738
1969
|
#########
|
1739
|
-
- regex: '; *Garmin-Asus ([^;/]
|
1970
|
+
- regex: '; *Garmin-Asus ([^;/]+?)(?: Build|\) AppleWebKit)'
|
1740
1971
|
device_replacement: 'Garmin-Asus $1'
|
1741
1972
|
brand_replacement: 'Garmin-Asus'
|
1742
1973
|
model_replacement: '$1'
|
1743
|
-
- regex: '; *(Garminfone) Build'
|
1974
|
+
- regex: '; *(Garminfone)(?: Build|\) AppleWebKit)'
|
1744
1975
|
device_replacement: 'Garmin $1'
|
1745
1976
|
brand_replacement: 'Garmin-Asus'
|
1746
1977
|
model_replacement: '$1'
|
@@ -1749,7 +1980,7 @@ device_parsers:
|
|
1749
1980
|
# Attab
|
1750
1981
|
# @ref: http://www.theattab.com/
|
1751
1982
|
#########
|
1752
|
-
- regex: '; (@TAB-[^;/]
|
1983
|
+
- regex: '; (@TAB-[^;/]+?)(?: Build|\) AppleWebKit)'
|
1753
1984
|
device_replacement: '$1'
|
1754
1985
|
brand_replacement: 'Attab'
|
1755
1986
|
model_replacement: '$1'
|
@@ -1759,7 +1990,7 @@ device_parsers:
|
|
1759
1990
|
# @ref: ??
|
1760
1991
|
# @note: Take care with Docomo T-01 Toshiba
|
1761
1992
|
#########
|
1762
|
-
- regex: '; *(T-(?:07|[^0]\d)[^;/]
|
1993
|
+
- regex: '; *(T-(?:07|[^0]\d)[^;/]+?)(?: Build|\) AppleWebKit)'
|
1763
1994
|
device_replacement: '$1'
|
1764
1995
|
brand_replacement: 'Audiosonic'
|
1765
1996
|
model_replacement: '$1'
|
@@ -1768,7 +1999,7 @@ device_parsers:
|
|
1768
1999
|
# Axioo
|
1769
2000
|
# @ref: http://www.axiooworld.com/ww/index.php
|
1770
2001
|
#########
|
1771
|
-
- regex: '; *(?:Axioo[ _\-]([^;/]
|
2002
|
+
- regex: '; *(?:Axioo[ _\-]([^;/]+?)|(picopad)[ _\-]([^;/]+?))(?: Build|\) AppleWebKit)'
|
1772
2003
|
regex_flag: 'i'
|
1773
2004
|
device_replacement: 'Axioo $1$2 $3'
|
1774
2005
|
brand_replacement: 'Axioo'
|
@@ -1778,7 +2009,7 @@ device_parsers:
|
|
1778
2009
|
# Azend
|
1779
2010
|
# @ref: http://azendcorp.com/index.php/products/portable-electronics
|
1780
2011
|
#########
|
1781
|
-
- regex: '; *(V(?:100|700|800)[^;/]*) Build'
|
2012
|
+
- regex: '; *(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
|
1782
2013
|
device_replacement: '$1'
|
1783
2014
|
brand_replacement: 'Azend'
|
1784
2015
|
model_replacement: '$1'
|
@@ -1787,7 +2018,7 @@ device_parsers:
|
|
1787
2018
|
# Bak
|
1788
2019
|
# @ref: http://www.bakinternational.com/produtos.php?cat=80
|
1789
2020
|
#########
|
1790
|
-
- regex: '; *(IBAK\-[^;/]*) Build'
|
2021
|
+
- regex: '; *(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
|
1791
2022
|
regex_flag: 'i'
|
1792
2023
|
device_replacement: '$1'
|
1793
2024
|
brand_replacement: 'Bak'
|
@@ -1798,7 +2029,7 @@ device_parsers:
|
|
1798
2029
|
# @ref: http://www.bedove.com/product.html
|
1799
2030
|
# @models: HY6501|HY5001|X12|X21|I5
|
1800
2031
|
#########
|
1801
|
-
- regex: '; *(HY5001|HY6501|X12|X21|I5) Build'
|
2032
|
+
- regex: '; *(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
|
1802
2033
|
device_replacement: 'Bedove $1'
|
1803
2034
|
brand_replacement: 'Bedove'
|
1804
2035
|
model_replacement: '$1'
|
@@ -1807,7 +2038,7 @@ device_parsers:
|
|
1807
2038
|
# Benss
|
1808
2039
|
# @ref: http://www.benss.net/
|
1809
2040
|
#########
|
1810
|
-
- regex: '; *(JC-[^;/]*) Build'
|
2041
|
+
- regex: '; *(JC-[^;/]*)(?: Build|\) AppleWebKit)'
|
1811
2042
|
device_replacement: 'Benss $1'
|
1812
2043
|
brand_replacement: 'Benss'
|
1813
2044
|
model_replacement: '$1'
|
@@ -1817,7 +2048,7 @@ device_parsers:
|
|
1817
2048
|
# @ref: http://uk.blackberry.com/
|
1818
2049
|
# @note: Android Apps seams to be used here
|
1819
2050
|
#########
|
1820
|
-
- regex: '; *(BB) ([^;/]
|
2051
|
+
- regex: '; *(BB) ([^;/]+?)(?: Build|\) AppleWebKit)'
|
1821
2052
|
device_replacement: '$1 $2'
|
1822
2053
|
brand_replacement: 'Blackberry'
|
1823
2054
|
model_replacement: '$2'
|
@@ -1826,11 +2057,11 @@ device_parsers:
|
|
1826
2057
|
# Blackbird
|
1827
2058
|
# @ref: http://iblackbird.co.kr
|
1828
2059
|
#########
|
1829
|
-
- regex: '; *(BlackBird)[ _](I8
|
2060
|
+
- regex: '; *(BlackBird)[ _](I8.*?)(?: Build|\) AppleWebKit)'
|
1830
2061
|
device_replacement: '$1 $2'
|
1831
2062
|
brand_replacement: '$1'
|
1832
2063
|
model_replacement: '$2'
|
1833
|
-
- regex: '; *(BlackBird)[ _](
|
2064
|
+
- regex: '; *(BlackBird)[ _](.*?)(?: Build|\) AppleWebKit)'
|
1834
2065
|
device_replacement: '$1 $2'
|
1835
2066
|
brand_replacement: '$1'
|
1836
2067
|
model_replacement: '$2'
|
@@ -1840,7 +2071,7 @@ device_parsers:
|
|
1840
2071
|
# @ref: http://www.blaupunkt.com
|
1841
2072
|
#########
|
1842
2073
|
# Endeavour
|
1843
|
-
- regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]
|
2074
|
+
- regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+?)(?: Build|\) AppleWebKit)'
|
1844
2075
|
device_replacement: 'Blaupunkt $1'
|
1845
2076
|
brand_replacement: 'Blaupunkt'
|
1846
2077
|
model_replacement: '$1'
|
@@ -1849,12 +2080,12 @@ device_parsers:
|
|
1849
2080
|
# Blu
|
1850
2081
|
# @ref: http://bluproducts.com
|
1851
2082
|
#########
|
1852
|
-
- regex: '; *((?:BLU|Blu)[ _\-])([^;/]
|
2083
|
+
- regex: '; *((?:BLU|Blu)[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
|
1853
2084
|
device_replacement: '$1$2'
|
1854
2085
|
brand_replacement: 'Blu'
|
1855
2086
|
model_replacement: '$2'
|
1856
2087
|
# BMOBILE = operator branded device
|
1857
|
-
- regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5) Build'
|
2088
|
+
- regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
|
1858
2089
|
device_replacement: '$1'
|
1859
2090
|
brand_replacement: 'Blu'
|
1860
2091
|
model_replacement: '$1'
|
@@ -1864,7 +2095,7 @@ device_parsers:
|
|
1864
2095
|
# @ref: http://www.blusens.com/es/?sg=1&sv=al&roc=1
|
1865
2096
|
#########
|
1866
2097
|
# tablet
|
1867
|
-
- regex: '; *(TOUCH\d[^;/]
|
2098
|
+
- regex: '; *(TOUCH\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
1868
2099
|
device_replacement: '$1'
|
1869
2100
|
brand_replacement: 'Blusens'
|
1870
2101
|
model_replacement: '$1'
|
@@ -1875,7 +2106,7 @@ device_parsers:
|
|
1875
2106
|
# @note: Might collide with Maxx as AX is used also there.
|
1876
2107
|
#########
|
1877
2108
|
# smartphone
|
1878
|
-
- regex: '; *(AX5\d+) Build'
|
2109
|
+
- regex: '; *(AX5\d+)(?: Build|\) AppleWebKit)'
|
1879
2110
|
device_replacement: '$1'
|
1880
2111
|
brand_replacement: 'Bmobile'
|
1881
2112
|
model_replacement: '$1'
|
@@ -1884,11 +2115,11 @@ device_parsers:
|
|
1884
2115
|
# bq
|
1885
2116
|
# @ref: http://bqreaders.com
|
1886
2117
|
#########
|
1887
|
-
- regex: '; *([Bb]q) ([^;/]
|
2118
|
+
- regex: '; *([Bb]q) ([^;/]+?);?(?: Build|\) AppleWebKit)'
|
1888
2119
|
device_replacement: '$1 $2'
|
1889
2120
|
brand_replacement: 'bq'
|
1890
2121
|
model_replacement: '$2'
|
1891
|
-
- regex: '; *(Maxwell [^;/]
|
2122
|
+
- regex: '; *(Maxwell [^;/]+?)(?: Build|\) AppleWebKit)'
|
1892
2123
|
device_replacement: '$1'
|
1893
2124
|
brand_replacement: 'bq'
|
1894
2125
|
model_replacement: '$1'
|
@@ -1897,7 +2128,7 @@ device_parsers:
|
|
1897
2128
|
# Braun Phototechnik
|
1898
2129
|
# @ref: http://www.braun-phototechnik.de/en/products/list/~pcat.250/Tablet-PC.html
|
1899
2130
|
#########
|
1900
|
-
- regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]
|
2131
|
+
- regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
1901
2132
|
device_replacement: '$1'
|
1902
2133
|
brand_replacement: 'Braun'
|
1903
2134
|
model_replacement: '$1'
|
@@ -1906,7 +2137,7 @@ device_parsers:
|
|
1906
2137
|
# Broncho
|
1907
2138
|
# @ref: http://www.broncho.cn/
|
1908
2139
|
#########
|
1909
|
-
- regex: '; *(Broncho) ([^;/]
|
2140
|
+
- regex: '; *(Broncho) ([^;/]+?)(?: Build|\) AppleWebKit)'
|
1910
2141
|
device_replacement: '$1 $2'
|
1911
2142
|
brand_replacement: '$1'
|
1912
2143
|
model_replacement: '$2'
|
@@ -1915,7 +2146,7 @@ device_parsers:
|
|
1915
2146
|
# Captiva
|
1916
2147
|
# @ref: http://www.captiva-power.de
|
1917
2148
|
#########
|
1918
|
-
- regex: '; *CAPTIVA ([^;/]
|
2149
|
+
- regex: '; *CAPTIVA ([^;/]+?)(?: Build|\) AppleWebKit)'
|
1919
2150
|
device_replacement: 'Captiva $1'
|
1920
2151
|
brand_replacement: 'Captiva'
|
1921
2152
|
model_replacement: '$1'
|
@@ -1924,7 +2155,7 @@ device_parsers:
|
|
1924
2155
|
# Casio
|
1925
2156
|
# @ref: http://www.casiogzone.com/
|
1926
2157
|
#########
|
1927
|
-
- regex: '; *(C771|CAL21|IS11CA) Build'
|
2158
|
+
- regex: '; *(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
|
1928
2159
|
device_replacement: '$1'
|
1929
2160
|
brand_replacement: 'Casio'
|
1930
2161
|
model_replacement: '$1'
|
@@ -1933,15 +2164,15 @@ device_parsers:
|
|
1933
2164
|
# Cat
|
1934
2165
|
# @ref: http://www.cat-sound.com
|
1935
2166
|
#########
|
1936
|
-
- regex: '; *(?:Cat|CAT) ([^;/]
|
2167
|
+
- regex: '; *(?:Cat|CAT) ([^;/]+?)(?: Build|\) AppleWebKit)'
|
1937
2168
|
device_replacement: 'Cat $1'
|
1938
2169
|
brand_replacement: 'Cat'
|
1939
2170
|
model_replacement: '$1'
|
1940
|
-
- regex: '; *(?:Cat)(Nova
|
2171
|
+
- regex: '; *(?:Cat)(Nova.*?)(?: Build|\) AppleWebKit)'
|
1941
2172
|
device_replacement: 'Cat $1'
|
1942
2173
|
brand_replacement: 'Cat'
|
1943
2174
|
model_replacement: '$1'
|
1944
|
-
- regex: '; *(INM8002KP|ADM8000KP_[AB]) Build'
|
2175
|
+
- regex: '; *(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
|
1945
2176
|
device_replacement: '$1'
|
1946
2177
|
brand_replacement: 'Cat'
|
1947
2178
|
model_replacement: 'Tablet PHOENIX 8.1J0'
|
@@ -1959,7 +2190,7 @@ device_parsers:
|
|
1959
2190
|
device_replacement: '$1'
|
1960
2191
|
brand_replacement: 'Celkon'
|
1961
2192
|
model_replacement: '$1'
|
1962
|
-
- regex: '; *(CT)-?(\d+) Build'
|
2193
|
+
- regex: '; *(CT)-?(\d+)(?: Build|\) AppleWebKit)'
|
1963
2194
|
device_replacement: '$1$2'
|
1964
2195
|
brand_replacement: 'Celkon'
|
1965
2196
|
model_replacement: '$1$2'
|
@@ -1975,7 +2206,7 @@ device_parsers:
|
|
1975
2206
|
# @brief: China manufacturer makes tablets for different small brands
|
1976
2207
|
# (eg. http://www.zeepad.net/index.html)
|
1977
2208
|
#########
|
1978
|
-
- regex: '; *(TPC[0-9]{4,5}) Build'
|
2209
|
+
- regex: '; *(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
|
1979
2210
|
device_replacement: '$1'
|
1980
2211
|
brand_replacement: 'ChangJia'
|
1981
2212
|
model_replacement: '$1'
|
@@ -1984,15 +2215,15 @@ device_parsers:
|
|
1984
2215
|
# Cloudfone
|
1985
2216
|
# @ref: http://www.cloudfonemobile.com/
|
1986
2217
|
#########
|
1987
|
-
- regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]
|
2218
|
+
- regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+?)(?: Build|\) AppleWebKit)'
|
1988
2219
|
device_replacement: '$1 $2 $3'
|
1989
2220
|
brand_replacement: 'Cloudfone'
|
1990
2221
|
model_replacement: '$1 $2 $3'
|
1991
|
-
- regex: '; *(Excite|ICE)[ _](\d+[^;/]
|
2222
|
+
- regex: '; *(Excite|ICE)[ _](\d+[^;/]+?)(?: Build|\) AppleWebKit)'
|
1992
2223
|
device_replacement: 'Cloudfone $1 $2'
|
1993
2224
|
brand_replacement: 'Cloudfone'
|
1994
2225
|
model_replacement: 'Cloudfone $1 $2'
|
1995
|
-
- regex: '; *(Cloudfone|CloudPad)[ _]([^;/]
|
2226
|
+
- regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
1996
2227
|
device_replacement: '$1 $2'
|
1997
2228
|
brand_replacement: 'Cloudfone'
|
1998
2229
|
model_replacement: '$1 $2'
|
@@ -2001,7 +2232,7 @@ device_parsers:
|
|
2001
2232
|
# Cmx
|
2002
2233
|
# @ref: http://cmx.at/de/
|
2003
2234
|
#########
|
2004
|
-
- regex: '; *((?:Aquila|Clanga|Rapax)[^;/]
|
2235
|
+
- regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+?)(?: Build|\) AppleWebKit)'
|
2005
2236
|
regex_flag: 'i'
|
2006
2237
|
device_replacement: '$1'
|
2007
2238
|
brand_replacement: 'Cmx'
|
@@ -2021,7 +2252,7 @@ device_parsers:
|
|
2021
2252
|
# Coolpad
|
2022
2253
|
# @ref: ??
|
2023
2254
|
#########
|
2024
|
-
- regex: '; *([^;/]*)Coolpad[ _]([^;/]
|
2255
|
+
- regex: '; *([^;/]*)Coolpad[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
2025
2256
|
device_replacement: '$1$2'
|
2026
2257
|
brand_replacement: 'Coolpad'
|
2027
2258
|
model_replacement: '$1$2'
|
@@ -2030,7 +2261,7 @@ device_parsers:
|
|
2030
2261
|
# Cube
|
2031
2262
|
# @ref: http://www.cube-tablet.com/buy-products.html
|
2032
2263
|
#########
|
2033
|
-
- regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT
|
2264
|
+
- regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*?|A5300)(?: Build|\) AppleWebKit)'
|
2034
2265
|
regex_flag: 'i'
|
2035
2266
|
device_replacement: '$1$2'
|
2036
2267
|
brand_replacement: 'Cube'
|
@@ -2040,12 +2271,12 @@ device_parsers:
|
|
2040
2271
|
# Cubot
|
2041
2272
|
# @ref: http://www.cubotmall.com/
|
2042
2273
|
#########
|
2043
|
-
- regex: '; *CUBOT ([^;/]
|
2274
|
+
- regex: '; *CUBOT ([^;/]+?)(?: Build|\) AppleWebKit)'
|
2044
2275
|
regex_flag: 'i'
|
2045
2276
|
device_replacement: '$1'
|
2046
2277
|
brand_replacement: 'Cubot'
|
2047
2278
|
model_replacement: '$1'
|
2048
|
-
- regex: '; *(BOBBY) Build'
|
2279
|
+
- regex: '; *(BOBBY)(?: Build|\) AppleWebKit)'
|
2049
2280
|
regex_flag: 'i'
|
2050
2281
|
device_replacement: '$1'
|
2051
2282
|
brand_replacement: 'Cubot'
|
@@ -2055,7 +2286,7 @@ device_parsers:
|
|
2055
2286
|
# Danew
|
2056
2287
|
# @ref: http://www.danew.com/produits-tablette.php
|
2057
2288
|
#########
|
2058
|
-
- regex: '; *(Dslide [^;/]
|
2289
|
+
- regex: '; *(Dslide [^;/]+?)(?: Build|\) AppleWebKit)'
|
2059
2290
|
device_replacement: '$1'
|
2060
2291
|
brand_replacement: 'Danew'
|
2061
2292
|
model_replacement: '$1'
|
@@ -2069,39 +2300,39 @@ device_parsers:
|
|
2069
2300
|
# @ref: http://www.dell.com/in/p/mobile-xcd28/pd
|
2070
2301
|
# @ref: http://www.dell.com/in/p/mobile-xcd35/pd
|
2071
2302
|
#########
|
2072
|
-
- regex: '; *(XCD)[ _]?(28|35) Build'
|
2303
|
+
- regex: '; *(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
|
2073
2304
|
device_replacement: 'Dell $1$2'
|
2074
2305
|
brand_replacement: 'Dell'
|
2075
2306
|
model_replacement: '$1$2'
|
2076
|
-
- regex: '; *(001DL) Build'
|
2307
|
+
- regex: '; *(001DL)(?: Build|\) AppleWebKit)'
|
2077
2308
|
device_replacement: 'Dell $1'
|
2078
2309
|
brand_replacement: 'Dell'
|
2079
2310
|
model_replacement: 'Streak'
|
2080
|
-
- regex: '; *(?:Dell|DELL) (Streak) Build'
|
2311
|
+
- regex: '; *(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
|
2081
2312
|
device_replacement: 'Dell $1'
|
2082
2313
|
brand_replacement: 'Dell'
|
2083
2314
|
model_replacement: 'Streak'
|
2084
|
-
- regex: '; *(101DL|GS01|Streak Pro[^;/]*) Build'
|
2315
|
+
- regex: '; *(101DL|GS01|Streak Pro[^;/]*)(?: Build|\) AppleWebKit)'
|
2085
2316
|
device_replacement: 'Dell $1'
|
2086
2317
|
brand_replacement: 'Dell'
|
2087
2318
|
model_replacement: 'Streak Pro'
|
2088
|
-
- regex: '; *([Ss]treak ?7) Build'
|
2319
|
+
- regex: '; *([Ss]treak ?7)(?: Build|\) AppleWebKit)'
|
2089
2320
|
device_replacement: 'Dell $1'
|
2090
2321
|
brand_replacement: 'Dell'
|
2091
2322
|
model_replacement: 'Streak 7'
|
2092
|
-
- regex: '; *(Mini-3iX) Build'
|
2323
|
+
- regex: '; *(Mini-3iX)(?: Build|\) AppleWebKit)'
|
2093
2324
|
device_replacement: 'Dell $1'
|
2094
2325
|
brand_replacement: 'Dell'
|
2095
2326
|
model_replacement: '$1'
|
2096
|
-
- regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini
|
2327
|
+
- regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
|
2097
2328
|
device_replacement: 'Dell $1'
|
2098
2329
|
brand_replacement: 'Dell'
|
2099
2330
|
model_replacement: '$1'
|
2100
|
-
- regex: '; *Dell[ _]([^;/]
|
2331
|
+
- regex: '; *Dell[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
2101
2332
|
device_replacement: 'Dell $1'
|
2102
2333
|
brand_replacement: 'Dell'
|
2103
2334
|
model_replacement: '$1'
|
2104
|
-
- regex: '; *Dell ([^;/]
|
2335
|
+
- regex: '; *Dell ([^;/]+?)(?: Build|\) AppleWebKit)'
|
2105
2336
|
device_replacement: 'Dell $1'
|
2106
2337
|
brand_replacement: 'Dell'
|
2107
2338
|
model_replacement: '$1'
|
@@ -2110,7 +2341,7 @@ device_parsers:
|
|
2110
2341
|
# Denver
|
2111
2342
|
# @ref: http://www.denver-electronics.com/tablets1/
|
2112
2343
|
#########
|
2113
|
-
- regex: '; *(TA[CD]-\d+[^;/]*) Build'
|
2344
|
+
- regex: '; *(TA[CD]-\d+[^;/]*)(?: Build|\) AppleWebKit)'
|
2114
2345
|
device_replacement: '$1'
|
2115
2346
|
brand_replacement: 'Denver'
|
2116
2347
|
model_replacement: '$1'
|
@@ -2119,7 +2350,7 @@ device_parsers:
|
|
2119
2350
|
# Dex
|
2120
2351
|
# @ref: http://dex.ua/
|
2121
2352
|
#########
|
2122
|
-
- regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?) Build'
|
2353
|
+
- regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
|
2123
2354
|
device_replacement: '$1'
|
2124
2355
|
brand_replacement: 'Dex'
|
2125
2356
|
model_replacement: '$1'
|
@@ -2128,7 +2359,7 @@ device_parsers:
|
|
2128
2359
|
# DNS AirTab
|
2129
2360
|
# @ref: http://www.dns-shop.ru/
|
2130
2361
|
#########
|
2131
|
-
- regex: '; *(AirTab)[ _\-]([^;/]
|
2362
|
+
- regex: '; *(AirTab)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
|
2132
2363
|
device_replacement: '$1 $2'
|
2133
2364
|
brand_replacement: 'DNS'
|
2134
2365
|
model_replacement: '$1 $2'
|
@@ -2137,43 +2368,43 @@ device_parsers:
|
|
2137
2368
|
# Docomo (Operator Branded Device)
|
2138
2369
|
# @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
|
2139
2370
|
#########
|
2140
|
-
- regex: '; *(F\-\d[^;/]
|
2371
|
+
- regex: '; *(F\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
2141
2372
|
device_replacement: '$1'
|
2142
2373
|
brand_replacement: 'Fujitsu'
|
2143
2374
|
model_replacement: '$1'
|
2144
|
-
- regex: '; *(HT-03A) Build'
|
2375
|
+
- regex: '; *(HT-03A)(?: Build|\) AppleWebKit)'
|
2145
2376
|
device_replacement: '$1'
|
2146
2377
|
brand_replacement: 'HTC'
|
2147
2378
|
model_replacement: 'Magic'
|
2148
|
-
- regex: '; *(HT\-\d[^;/]
|
2379
|
+
- regex: '; *(HT\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
2149
2380
|
device_replacement: '$1'
|
2150
2381
|
brand_replacement: 'HTC'
|
2151
2382
|
model_replacement: '$1'
|
2152
|
-
- regex: '; *(L\-\d[^;/]
|
2383
|
+
- regex: '; *(L\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
2153
2384
|
device_replacement: '$1'
|
2154
2385
|
brand_replacement: 'LG'
|
2155
2386
|
model_replacement: '$1'
|
2156
|
-
- regex: '; *(N\-\d[^;/]
|
2387
|
+
- regex: '; *(N\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
2157
2388
|
device_replacement: '$1'
|
2158
2389
|
brand_replacement: 'Nec'
|
2159
2390
|
model_replacement: '$1'
|
2160
|
-
- regex: '; *(P\-\d[^;/]
|
2391
|
+
- regex: '; *(P\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
2161
2392
|
device_replacement: '$1'
|
2162
2393
|
brand_replacement: 'Panasonic'
|
2163
2394
|
model_replacement: '$1'
|
2164
|
-
- regex: '; *(SC\-\d[^;/]
|
2395
|
+
- regex: '; *(SC\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
2165
2396
|
device_replacement: '$1'
|
2166
2397
|
brand_replacement: 'Samsung'
|
2167
2398
|
model_replacement: '$1'
|
2168
|
-
- regex: '; *(SH\-\d[^;/]
|
2399
|
+
- regex: '; *(SH\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
2169
2400
|
device_replacement: '$1'
|
2170
2401
|
brand_replacement: 'Sharp'
|
2171
2402
|
model_replacement: '$1'
|
2172
|
-
- regex: '; *(SO\-\d[^;/]
|
2403
|
+
- regex: '; *(SO\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
2173
2404
|
device_replacement: '$1'
|
2174
2405
|
brand_replacement: 'SonyEricsson'
|
2175
2406
|
model_replacement: '$1'
|
2176
|
-
- regex: '; *(T\-0[12][^;/]
|
2407
|
+
- regex: '; *(T\-0[12][^;/]+?)(?: Build|\) AppleWebKit)'
|
2177
2408
|
device_replacement: '$1'
|
2178
2409
|
brand_replacement: 'Toshiba'
|
2179
2410
|
model_replacement: '$1'
|
@@ -2182,7 +2413,7 @@ device_parsers:
|
|
2182
2413
|
# DOOV
|
2183
2414
|
# @ref: http://www.doov.com.cn/
|
2184
2415
|
#########
|
2185
|
-
- regex: '; *(DOOV)[ _]([^;/]
|
2416
|
+
- regex: '; *(DOOV)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
2186
2417
|
device_replacement: '$1 $2'
|
2187
2418
|
brand_replacement: 'DOOV'
|
2188
2419
|
model_replacement: '$2'
|
@@ -2191,7 +2422,7 @@ device_parsers:
|
|
2191
2422
|
# Enot
|
2192
2423
|
# @ref: http://www.enot.ua/
|
2193
2424
|
#########
|
2194
|
-
- regex: '; *(Enot|ENOT)[ -]?([^;/]
|
2425
|
+
- regex: '; *(Enot|ENOT)[ -]?([^;/]+?)(?: Build|\) AppleWebKit)'
|
2195
2426
|
device_replacement: '$1 $2'
|
2196
2427
|
brand_replacement: 'Enot'
|
2197
2428
|
model_replacement: '$2'
|
@@ -2204,7 +2435,7 @@ device_parsers:
|
|
2204
2435
|
device_replacement: 'CROSS $1'
|
2205
2436
|
brand_replacement: 'Evercoss'
|
2206
2437
|
model_replacement: 'Cross $1'
|
2207
|
-
- regex: '; *(CROSS|Cross)[ _\-]([^;/]
|
2438
|
+
- regex: '; *(CROSS|Cross)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
|
2208
2439
|
device_replacement: '$1 $2'
|
2209
2440
|
brand_replacement: 'Evercoss'
|
2210
2441
|
model_replacement: 'Cross $2'
|
@@ -2222,11 +2453,11 @@ device_parsers:
|
|
2222
2453
|
# Fly
|
2223
2454
|
# @ref: http://www.fly-phone.com/
|
2224
2455
|
#########
|
2225
|
-
- regex: '; *(IQ
|
2456
|
+
- regex: '; *(IQ.*?)(?: Build|\) AppleWebKit)'
|
2226
2457
|
device_replacement: '$1'
|
2227
2458
|
brand_replacement: 'Fly'
|
2228
2459
|
model_replacement: '$1'
|
2229
|
-
- regex: '; *(Fly|FLY)[ _](IQ[^;]
|
2460
|
+
- regex: '; *(Fly|FLY)[ _](IQ[^;]+?|F[34]\d+[^;]*?);?(?: Build|\) AppleWebKit)'
|
2230
2461
|
device_replacement: '$1 $2'
|
2231
2462
|
brand_replacement: 'Fly'
|
2232
2463
|
model_replacement: '$2'
|
@@ -2235,7 +2466,7 @@ device_parsers:
|
|
2235
2466
|
# Fujitsu
|
2236
2467
|
# @ref: http://www.fujitsu.com/global/
|
2237
2468
|
#########
|
2238
|
-
- regex: '; *(M532|Q572|FJL21) Build
|
2469
|
+
- regex: '; *(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
|
2239
2470
|
device_replacement: '$1'
|
2240
2471
|
brand_replacement: 'Fujitsu'
|
2241
2472
|
model_replacement: '$1'
|
@@ -2244,7 +2475,7 @@ device_parsers:
|
|
2244
2475
|
# Galapad
|
2245
2476
|
# @ref: http://www.galapad.net/product.html
|
2246
2477
|
#########
|
2247
|
-
- regex: '; *(G1) Build'
|
2478
|
+
- regex: '; *(G1)(?: Build|\) AppleWebKit)'
|
2248
2479
|
device_replacement: '$1'
|
2249
2480
|
brand_replacement: 'Galapad'
|
2250
2481
|
model_replacement: '$1'
|
@@ -2253,7 +2484,7 @@ device_parsers:
|
|
2253
2484
|
# Geeksphone
|
2254
2485
|
# @ref: http://www.geeksphone.com/
|
2255
2486
|
#########
|
2256
|
-
- regex: '; *(Geeksphone) ([^;/]
|
2487
|
+
- regex: '; *(Geeksphone) ([^;/]+?)(?: Build|\) AppleWebKit)'
|
2257
2488
|
device_replacement: '$1 $2'
|
2258
2489
|
brand_replacement: '$1'
|
2259
2490
|
model_replacement: '$2'
|
@@ -2263,7 +2494,7 @@ device_parsers:
|
|
2263
2494
|
# @ref: http://www.gfivemobile.com/en
|
2264
2495
|
#########
|
2265
2496
|
#- regex: '; *(G\'?FIVE) ([^;/]+) Build' # there is a problem with python yaml parser here
|
2266
|
-
- regex: '; *(G[^F]?FIVE) ([^;/]
|
2497
|
+
- regex: '; *(G[^F]?FIVE) ([^;/]+?)(?: Build|\) AppleWebKit)'
|
2267
2498
|
device_replacement: '$1 $2'
|
2268
2499
|
brand_replacement: 'Gfive'
|
2269
2500
|
model_replacement: '$2'
|
@@ -2272,12 +2503,12 @@ device_parsers:
|
|
2272
2503
|
# Gionee
|
2273
2504
|
# @ref: http://www.gionee.com/
|
2274
2505
|
#########
|
2275
|
-
- regex: '; *(Gionee)[ _\-]([^;/]
|
2506
|
+
- regex: '; *(Gionee)[ _\-]([^;/]+?)(?:/[^;/]+|)(?: Build|\) AppleWebKit)'
|
2276
2507
|
regex_flag: 'i'
|
2277
2508
|
device_replacement: '$1 $2'
|
2278
2509
|
brand_replacement: 'Gionee'
|
2279
2510
|
model_replacement: '$2'
|
2280
|
-
- regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1) Build'
|
2511
|
+
- regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
|
2281
2512
|
device_replacement: 'Gionee $1'
|
2282
2513
|
brand_replacement: 'Gionee'
|
2283
2514
|
model_replacement: '$1'
|
@@ -2295,11 +2526,11 @@ device_parsers:
|
|
2295
2526
|
# GoClever
|
2296
2527
|
# @ref: http://www.goclever.com
|
2297
2528
|
#########
|
2298
|
-
- regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB) Build'
|
2529
|
+
- regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB)(?: Build|\) AppleWebKit)'
|
2299
2530
|
device_replacement: 'GoClever $1'
|
2300
2531
|
brand_replacement: 'GoClever'
|
2301
2532
|
model_replacement: '$1'
|
2302
|
-
- regex: '; *GOCLEVER ([^;/]
|
2533
|
+
- regex: '; *GOCLEVER ([^;/]+?)(?: Build|\) AppleWebKit)'
|
2303
2534
|
device_replacement: 'GoClever $1'
|
2304
2535
|
brand_replacement: 'GoClever'
|
2305
2536
|
model_replacement: '$1'
|
@@ -2308,11 +2539,11 @@ device_parsers:
|
|
2308
2539
|
# Google
|
2309
2540
|
# @ref: http://www.google.de/glass/start/
|
2310
2541
|
#########
|
2311
|
-
- regex: '; *(Glass \d+) Build'
|
2542
|
+
- regex: '; *(Glass \d+)(?: Build|\) AppleWebKit)'
|
2312
2543
|
device_replacement: '$1'
|
2313
2544
|
brand_replacement: 'Google'
|
2314
2545
|
model_replacement: '$1'
|
2315
|
-
- regex: '; *(Pixel
|
2546
|
+
- regex: '; *(Pixel.*?)(?: Build|\) AppleWebKit)'
|
2316
2547
|
device_replacement: '$1'
|
2317
2548
|
brand_replacement: 'Google'
|
2318
2549
|
model_replacement: '$1'
|
@@ -2321,7 +2552,7 @@ device_parsers:
|
|
2321
2552
|
# Gigabyte
|
2322
2553
|
# @ref: http://gsmart.gigabytecm.com/en/
|
2323
2554
|
#########
|
2324
|
-
- regex: '; *(GSmart)[ -]([^/]+) Build'
|
2555
|
+
- regex: '; *(GSmart)[ -]([^/]+)(?: Build|\) AppleWebKit)'
|
2325
2556
|
device_replacement: '$1 $2'
|
2326
2557
|
brand_replacement: 'Gigabyte'
|
2327
2558
|
model_replacement: '$1 $2'
|
@@ -2330,7 +2561,7 @@ device_parsers:
|
|
2330
2561
|
# Freescale development boards
|
2331
2562
|
# @ref: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX53QSB
|
2332
2563
|
#########
|
2333
|
-
- regex: '; *(imx5[13]_[^/]+) Build'
|
2564
|
+
- regex: '; *(imx5[13]_[^/]+)(?: Build|\) AppleWebKit)'
|
2334
2565
|
device_replacement: 'Freescale $1'
|
2335
2566
|
brand_replacement: 'Freescale'
|
2336
2567
|
model_replacement: '$1'
|
@@ -2340,11 +2571,11 @@ device_parsers:
|
|
2340
2571
|
# @ref: http://www.haier.com/
|
2341
2572
|
# @ref: http://www.haier.com/de/produkte/tablet/
|
2342
2573
|
#########
|
2343
|
-
- regex: '; *Haier[ _\-]([^/]+) Build'
|
2574
|
+
- regex: '; *Haier[ _\-]([^/]+)(?: Build|\) AppleWebKit)'
|
2344
2575
|
device_replacement: 'Haier $1'
|
2345
2576
|
brand_replacement: 'Haier'
|
2346
2577
|
model_replacement: '$1'
|
2347
|
-
- regex: '; *(PAD1016) Build'
|
2578
|
+
- regex: '; *(PAD1016)(?: Build|\) AppleWebKit)'
|
2348
2579
|
device_replacement: 'Haipad $1'
|
2349
2580
|
brand_replacement: 'Haipad'
|
2350
2581
|
model_replacement: '$1'
|
@@ -2354,7 +2585,7 @@ device_parsers:
|
|
2354
2585
|
# @ref: http://www.haipad.net/
|
2355
2586
|
# @models: V7P|M7SM7S|M9XM9X|M7XM7X|M9|M8|M7-M|M1002|M7|M701
|
2356
2587
|
#########
|
2357
|
-
- regex: '; *(M701|M7|M8|M9) Build'
|
2588
|
+
- regex: '; *(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
|
2358
2589
|
device_replacement: 'Haipad $1'
|
2359
2590
|
brand_replacement: 'Haipad'
|
2360
2591
|
model_replacement: '$1'
|
@@ -2386,7 +2617,7 @@ device_parsers:
|
|
2386
2617
|
# Hena
|
2387
2618
|
# @ref: http://www.henadigital.com/en/product/index.asp?id=6
|
2388
2619
|
#########
|
2389
|
-
- regex: '; *(MID-?\d{4}C[EM]) Build'
|
2620
|
+
- regex: '; *(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
|
2390
2621
|
device_replacement: 'Hena $1'
|
2391
2622
|
brand_replacement: 'Hena'
|
2392
2623
|
model_replacement: '$1'
|
@@ -2395,11 +2626,11 @@ device_parsers:
|
|
2395
2626
|
# Hisense
|
2396
2627
|
# @ref: http://www.hisense.com/
|
2397
2628
|
#########
|
2398
|
-
- regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]
|
2629
|
+
- regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+?)(?: Build|\) AppleWebKit)'
|
2399
2630
|
device_replacement: 'Hisense $1'
|
2400
2631
|
brand_replacement: 'Hisense'
|
2401
2632
|
model_replacement: '$1'
|
2402
|
-
- regex: '; *(andromax[^;/]
|
2633
|
+
- regex: '; *(andromax[^;/]+?)(?: Build|\) AppleWebKit)'
|
2403
2634
|
regex_flag: 'i'
|
2404
2635
|
device_replacement: 'Hisense $1'
|
2405
2636
|
brand_replacement: 'Hisense'
|
@@ -2409,7 +2640,7 @@ device_parsers:
|
|
2409
2640
|
# hitech
|
2410
2641
|
# @ref: http://www.hitech-mobiles.com/
|
2411
2642
|
#########
|
2412
|
-
- regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE) Build'
|
2643
|
+
- regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
|
2413
2644
|
device_replacement: 'AMAZE $1$2'
|
2414
2645
|
brand_replacement: 'hitech'
|
2415
2646
|
model_replacement: 'AMAZE $1$2'
|
@@ -2418,15 +2649,15 @@ device_parsers:
|
|
2418
2649
|
# HP
|
2419
2650
|
# @ref: http://www.hp.com/
|
2420
2651
|
#########
|
2421
|
-
- regex: '; *(PlayBook) Build'
|
2652
|
+
- regex: '; *(PlayBook)(?: Build|\) AppleWebKit)'
|
2422
2653
|
device_replacement: 'HP $1'
|
2423
2654
|
brand_replacement: 'HP'
|
2424
2655
|
model_replacement: '$1'
|
2425
|
-
- regex: '; *HP ([^/]+) Build'
|
2656
|
+
- regex: '; *HP ([^/]+)(?: Build|\) AppleWebKit)'
|
2426
2657
|
device_replacement: 'HP $1'
|
2427
2658
|
brand_replacement: 'HP'
|
2428
2659
|
model_replacement: '$1'
|
2429
|
-
- regex: '; *([^/]+_tenderloin) Build'
|
2660
|
+
- regex: '; *([^/]+_tenderloin)(?: Build|\) AppleWebKit)'
|
2430
2661
|
device_replacement: 'HP TouchPad'
|
2431
2662
|
brand_replacement: 'HP'
|
2432
2663
|
model_replacement: 'TouchPad'
|
@@ -2436,11 +2667,11 @@ device_parsers:
|
|
2436
2667
|
# @ref: http://www.huaweidevice.com
|
2437
2668
|
# @note: Needs to be before HTC due to Desire HD Build on U8815
|
2438
2669
|
#########
|
2439
|
-
- regex: '; *(HUAWEI |Huawei
|
2670
|
+
- regex: '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
|
2440
2671
|
device_replacement: '$1$2'
|
2441
2672
|
brand_replacement: 'Huawei'
|
2442
2673
|
model_replacement: '$2'
|
2443
|
-
- regex: '; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)
|
2674
|
+
- regex: '; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)\)'
|
2444
2675
|
device_replacement: '$1'
|
2445
2676
|
brand_replacement: 'Huawei'
|
2446
2677
|
model_replacement: '$2'
|
@@ -2452,7 +2683,7 @@ device_parsers:
|
|
2452
2683
|
device_replacement: '$1$2'
|
2453
2684
|
brand_replacement: 'Huawei'
|
2454
2685
|
model_replacement: '$2'
|
2455
|
-
- regex: '; *((?:HUAWEI[ _]?|Huawei[ _])
|
2686
|
+
- regex: '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build'
|
2456
2687
|
device_replacement: '$1$2'
|
2457
2688
|
brand_replacement: 'Huawei'
|
2458
2689
|
model_replacement: '$2'
|
@@ -2488,6 +2719,10 @@ device_parsers:
|
|
2488
2719
|
device_replacement: 'Huawei $1'
|
2489
2720
|
brand_replacement: 'Huawei'
|
2490
2721
|
model_replacement: '$1'
|
2722
|
+
- regex: '; *((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
|
2723
|
+
device_replacement: 'Huawei $1'
|
2724
|
+
brand_replacement: 'Huawei'
|
2725
|
+
model_replacement: '$1'
|
2491
2726
|
|
2492
2727
|
#########
|
2493
2728
|
# HTC
|
@@ -2507,33 +2742,33 @@ device_parsers:
|
|
2507
2742
|
device_replacement: 'HTC $1'
|
2508
2743
|
brand_replacement: 'HTC'
|
2509
2744
|
model_replacement: '$1'
|
2510
|
-
- regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+))
|
2745
|
+
- regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
|
2511
2746
|
device_replacement: 'HTC $1 $2'
|
2512
2747
|
brand_replacement: 'HTC'
|
2513
2748
|
model_replacement: '$1 $2'
|
2514
|
-
- regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+))
|
2749
|
+
- regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
|
2515
2750
|
device_replacement: 'HTC $1 $2 $3'
|
2516
2751
|
brand_replacement: 'HTC'
|
2517
2752
|
model_replacement: '$1 $2 $3'
|
2518
|
-
- regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+))
|
2753
|
+
- regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
|
2519
2754
|
device_replacement: 'HTC $1 $2 $3 $4'
|
2520
2755
|
brand_replacement: 'HTC'
|
2521
2756
|
model_replacement: '$1 $2 $3 $4'
|
2522
2757
|
|
2523
2758
|
# Android HTC without Version Number matcher
|
2524
|
-
- regex: '; *(?:(?:HTC|htc)(?:_blocked)
|
2759
|
+
- regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )'
|
2525
2760
|
device_replacement: 'HTC $1'
|
2526
2761
|
brand_replacement: 'HTC'
|
2527
2762
|
model_replacement: '$1'
|
2528
|
-
- regex: '; *(?:(?:HTC|htc)(?:_blocked)
|
2763
|
+
- regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: *Build|[;\)]| - )'
|
2529
2764
|
device_replacement: 'HTC $1 $2'
|
2530
2765
|
brand_replacement: 'HTC'
|
2531
2766
|
model_replacement: '$1 $2'
|
2532
|
-
- regex: '; *(?:(?:HTC|htc)(?:_blocked)
|
2767
|
+
- regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: *Build|[;\)]| - )'
|
2533
2768
|
device_replacement: 'HTC $1 $2 $3'
|
2534
2769
|
brand_replacement: 'HTC'
|
2535
2770
|
model_replacement: '$1 $2 $3'
|
2536
|
-
- regex: '; *(?:(?:HTC|htc)(?:_blocked)
|
2771
|
+
- regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\)]| - )'
|
2537
2772
|
device_replacement: 'HTC $1 $2 $3 $4'
|
2538
2773
|
brand_replacement: 'HTC'
|
2539
2774
|
model_replacement: '$1 $2 $3 $4'
|
@@ -2544,7 +2779,7 @@ device_parsers:
|
|
2544
2779
|
brand_replacement: 'HTC'
|
2545
2780
|
model_replacement: '$1'
|
2546
2781
|
# general matcher for anything else
|
2547
|
-
- regex: '(?:[;,] *|^)(?:htccn_chs
|
2782
|
+
- regex: '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
|
2548
2783
|
regex_flag: 'i'
|
2549
2784
|
device_replacement: 'HTC $1'
|
2550
2785
|
brand_replacement: 'HTC'
|
@@ -2565,16 +2800,16 @@ device_parsers:
|
|
2565
2800
|
# Hyundai
|
2566
2801
|
# @ref: http://www.hyundaitechnologies.com
|
2567
2802
|
#########
|
2568
|
-
- regex: '; *HYUNDAI (T\d[^/]*) Build'
|
2803
|
+
- regex: '; *HYUNDAI (T\d[^/]*)(?: Build|\) AppleWebKit)'
|
2569
2804
|
device_replacement: 'Hyundai $1'
|
2570
2805
|
brand_replacement: 'Hyundai'
|
2571
2806
|
model_replacement: '$1'
|
2572
|
-
- regex: '; *HYUNDAI ([^;/]
|
2807
|
+
- regex: '; *HYUNDAI ([^;/]+?)(?: Build|\) AppleWebKit)'
|
2573
2808
|
device_replacement: 'Hyundai $1'
|
2574
2809
|
brand_replacement: 'Hyundai'
|
2575
2810
|
model_replacement: '$1'
|
2576
2811
|
# X900? http://www.amazon.com/Hyundai-X900-Retina-Android-Bluetooth/dp/B00AO07H3O
|
2577
|
-
- regex: '; *(X700|Hold X|MB-6900) Build'
|
2812
|
+
- regex: '; *(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
|
2578
2813
|
device_replacement: 'Hyundai $1'
|
2579
2814
|
brand_replacement: 'Hyundai'
|
2580
2815
|
model_replacement: '$1'
|
@@ -2583,12 +2818,12 @@ device_parsers:
|
|
2583
2818
|
# iBall
|
2584
2819
|
# @ref: http://www.iball.co.in/Category/Mobiles/22
|
2585
2820
|
#########
|
2586
|
-
- regex: '; *(?:iBall[ _\-])
|
2821
|
+
- regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
|
2587
2822
|
regex_flag: 'i'
|
2588
2823
|
device_replacement: '$1 $2'
|
2589
2824
|
brand_replacement: 'iBall'
|
2590
2825
|
model_replacement: '$1 $2'
|
2591
|
-
- regex: '; *(IBall)(?:[ _]([^;/]
|
2826
|
+
- regex: '; *(IBall)(?:[ _]([^;/]+?)|)(?: Build|\) AppleWebKit)'
|
2592
2827
|
regex_flag: 'i'
|
2593
2828
|
device_replacement: '$1 $2'
|
2594
2829
|
brand_replacement: 'iBall'
|
@@ -2598,7 +2833,7 @@ device_parsers:
|
|
2598
2833
|
# IconBIT
|
2599
2834
|
# @ref: http://www.iconbit.com/catalog/tablets/
|
2600
2835
|
#########
|
2601
|
-
- regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]
|
2836
|
+
- regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|)(?: Build|\) AppleWebKit)'
|
2602
2837
|
device_replacement: '$1'
|
2603
2838
|
brand_replacement: 'IconBIT'
|
2604
2839
|
model_replacement: '$1'
|
@@ -2607,7 +2842,7 @@ device_parsers:
|
|
2607
2842
|
# IMO
|
2608
2843
|
# @ref: http://www.ponselimo.com/
|
2609
2844
|
#########
|
2610
|
-
- regex: '; *(IMO)[ _]([^;/]
|
2845
|
+
- regex: '; *(IMO)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
2611
2846
|
regex_flag: 'i'
|
2612
2847
|
device_replacement: '$1 $2'
|
2613
2848
|
brand_replacement: 'IMO'
|
@@ -2617,12 +2852,12 @@ device_parsers:
|
|
2617
2852
|
# i-mobile
|
2618
2853
|
# @ref: http://www.i-mobilephone.com/
|
2619
2854
|
#########
|
2620
|
-
- regex: '; *i-?mobile[ _]([^/]+) Build
|
2855
|
+
- regex: '; *i-?mobile[ _]([^/]+)(?: Build|\) AppleWebKit)'
|
2621
2856
|
regex_flag: 'i'
|
2622
2857
|
device_replacement: 'i-mobile $1'
|
2623
2858
|
brand_replacement: 'imobile'
|
2624
2859
|
model_replacement: '$1'
|
2625
|
-
- regex: '; *(i-(?:style|note)[^/]*) Build
|
2860
|
+
- regex: '; *(i-(?:style|note)[^/]*)(?: Build|\) AppleWebKit)'
|
2626
2861
|
regex_flag: 'i'
|
2627
2862
|
device_replacement: 'i-mobile $1'
|
2628
2863
|
brand_replacement: 'imobile'
|
@@ -2632,7 +2867,7 @@ device_parsers:
|
|
2632
2867
|
# Impression
|
2633
2868
|
# @ref: http://impression.ua/planshetnye-kompyutery
|
2634
2869
|
#########
|
2635
|
-
- regex: '; *(ImPAD) ?(\d+(?:.)
|
2870
|
+
- regex: '; *(ImPAD) ?(\d+(?:.)*?)(?: Build|\) AppleWebKit)'
|
2636
2871
|
device_replacement: '$1 $2'
|
2637
2872
|
brand_replacement: 'Impression'
|
2638
2873
|
model_replacement: '$1 $2'
|
@@ -2641,7 +2876,7 @@ device_parsers:
|
|
2641
2876
|
# Infinix
|
2642
2877
|
# @ref: http://www.infinixmobility.com/index.html
|
2643
2878
|
#########
|
2644
|
-
- regex: '; *(Infinix)[ _]([^;/]
|
2879
|
+
- regex: '; *(Infinix)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
2645
2880
|
device_replacement: '$1 $2'
|
2646
2881
|
brand_replacement: 'Infinix'
|
2647
2882
|
model_replacement: '$2'
|
@@ -2650,7 +2885,7 @@ device_parsers:
|
|
2650
2885
|
# Informer
|
2651
2886
|
# @ref: ??
|
2652
2887
|
#########
|
2653
|
-
- regex: '; *(Informer)[ \-]([^;/]
|
2888
|
+
- regex: '; *(Informer)[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
|
2654
2889
|
device_replacement: '$1 $2'
|
2655
2890
|
brand_replacement: 'Informer'
|
2656
2891
|
model_replacement: '$2'
|
@@ -2660,7 +2895,7 @@ device_parsers:
|
|
2660
2895
|
# @ref: http://www.intenso.de
|
2661
2896
|
# @models: 7":TAB 714,TAB 724;8":TAB 814,TAB 824;10":TAB 1004
|
2662
2897
|
#########
|
2663
|
-
- regex: '; *(TAB) ?([78][12]4) Build'
|
2898
|
+
- regex: '; *(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
|
2664
2899
|
device_replacement: 'Intenso $1'
|
2665
2900
|
brand_replacement: 'Intenso'
|
2666
2901
|
model_replacement: '$1 $2'
|
@@ -2671,21 +2906,21 @@ device_parsers:
|
|
2671
2906
|
# @note: Zync also offers a "Cloud Z5" device
|
2672
2907
|
#########
|
2673
2908
|
# smartphones
|
2674
|
-
- regex: '; *(?:Intex[ _])
|
2909
|
+
- regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+?) *(?:Build|;)'
|
2675
2910
|
device_replacement: '$1$2$3'
|
2676
2911
|
brand_replacement: 'Intex'
|
2677
2912
|
model_replacement: '$1 $3'
|
2678
2913
|
# matches "INTEX CLOUD X1"
|
2679
|
-
- regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+))
|
2914
|
+
- regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) *(?:Build|;)'
|
2680
2915
|
device_replacement: '$1 $2'
|
2681
2916
|
brand_replacement: 'Intex'
|
2682
2917
|
model_replacement: '$1 $2'
|
2683
2918
|
# tablets
|
2684
|
-
- regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| )
|
2919
|
+
- regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]*) *(?:Build|;)'
|
2685
2920
|
device_replacement: '$1 $2 $3'
|
2686
2921
|
brand_replacement: 'Intex'
|
2687
2922
|
model_replacement: 'iBuddy $2 $3'
|
2688
|
-
- regex: '; *(I-Buddy)[ _]([^;/]
|
2923
|
+
- regex: '; *(I-Buddy)[ _]([^;/]+?) *(?:Build|;)'
|
2689
2924
|
device_replacement: '$1 $2'
|
2690
2925
|
brand_replacement: 'Intex'
|
2691
2926
|
model_replacement: 'iBuddy $2'
|
@@ -2694,7 +2929,7 @@ device_parsers:
|
|
2694
2929
|
# iOCEAN
|
2695
2930
|
# @ref: http://www.iocean.cc/
|
2696
2931
|
#########
|
2697
|
-
- regex: '; *(iOCEAN) ([^/]+) Build'
|
2932
|
+
- regex: '; *(iOCEAN) ([^/]+)(?: Build|\) AppleWebKit)'
|
2698
2933
|
regex_flag: 'i'
|
2699
2934
|
device_replacement: '$1 $2'
|
2700
2935
|
brand_replacement: 'iOCEAN'
|
@@ -2704,7 +2939,7 @@ device_parsers:
|
|
2704
2939
|
# i.onik
|
2705
2940
|
# @ref: http://www.i-onik.de/
|
2706
2941
|
#########
|
2707
|
-
- regex: '; *(TP\d+(?:\.\d
|
2942
|
+
- regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
2708
2943
|
device_replacement: 'ionik $1'
|
2709
2944
|
brand_replacement: 'ionik'
|
2710
2945
|
model_replacement: '$1'
|
@@ -2713,21 +2948,30 @@ device_parsers:
|
|
2713
2948
|
# IRU.ru
|
2714
2949
|
# @ref: http://www.iru.ru/catalog/soho/planetable/
|
2715
2950
|
#########
|
2716
|
-
- regex: '; *(M702pro) Build'
|
2951
|
+
- regex: '; *(M702pro)(?: Build|\) AppleWebKit)'
|
2717
2952
|
device_replacement: '$1'
|
2718
2953
|
brand_replacement: 'Iru'
|
2719
2954
|
model_replacement: '$1'
|
2720
2955
|
|
2956
|
+
#########
|
2957
|
+
# Itel Mobile
|
2958
|
+
# @ref: https://www.itel-mobile.com/global/products/
|
2959
|
+
#########
|
2960
|
+
- regex: '; *itel ([^;/]*)(?: Build|\) AppleWebKit)'
|
2961
|
+
device_replacement: 'Itel $1'
|
2962
|
+
brand_replacement: 'Itel'
|
2963
|
+
model_replacement: '$1'
|
2964
|
+
|
2721
2965
|
#########
|
2722
2966
|
# Ivio
|
2723
2967
|
# @ref: http://www.ivio.com/mobile.php
|
2724
2968
|
# @models: DG80,DG20,DE38,DE88,MD70
|
2725
2969
|
#########
|
2726
|
-
- regex: '; *(DE88Plus|MD70) Build'
|
2970
|
+
- regex: '; *(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
|
2727
2971
|
device_replacement: '$1'
|
2728
2972
|
brand_replacement: 'Ivio'
|
2729
2973
|
model_replacement: '$1'
|
2730
|
-
- regex: '; *IVIO[_\-]([^;/]
|
2974
|
+
- regex: '; *IVIO[_\-]([^;/]+?)(?: Build|\) AppleWebKit)'
|
2731
2975
|
device_replacement: '$1'
|
2732
2976
|
brand_replacement: 'Ivio'
|
2733
2977
|
model_replacement: '$1'
|
@@ -2736,7 +2980,7 @@ device_parsers:
|
|
2736
2980
|
# Jaytech
|
2737
2981
|
# @ref: http://www.jay-tech.de/jaytech/servlet/frontend/
|
2738
2982
|
#########
|
2739
|
-
- regex: '; *(TPC-\d+|JAY-TECH) Build'
|
2983
|
+
- regex: '; *(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
|
2740
2984
|
device_replacement: '$1'
|
2741
2985
|
brand_replacement: 'Jaytech'
|
2742
2986
|
model_replacement: '$1'
|
@@ -2745,7 +2989,7 @@ device_parsers:
|
|
2745
2989
|
# Jiayu
|
2746
2990
|
# @ref: http://www.ejiayu.com/en/Product.html
|
2747
2991
|
#########
|
2748
|
-
- regex: '; *(JY-[^;/]+|G[234]S?) Build'
|
2992
|
+
- regex: '; *(JY-[^;/]+|G[234]S?)(?: Build|\) AppleWebKit)'
|
2749
2993
|
device_replacement: '$1'
|
2750
2994
|
brand_replacement: 'Jiayu'
|
2751
2995
|
model_replacement: '$1'
|
@@ -2754,7 +2998,7 @@ device_parsers:
|
|
2754
2998
|
# JXD
|
2755
2999
|
# @ref: http://www.jxd.hk/
|
2756
3000
|
#########
|
2757
|
-
- regex: '; *(JXD)[ _\-]([^;/]
|
3001
|
+
- regex: '; *(JXD)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
|
2758
3002
|
device_replacement: '$1 $2'
|
2759
3003
|
brand_replacement: 'JXD'
|
2760
3004
|
model_replacement: '$2'
|
@@ -2781,84 +3025,84 @@ device_parsers:
|
|
2781
3025
|
# KDDI (Operator Branded Device)
|
2782
3026
|
# @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
|
2783
3027
|
#########
|
2784
|
-
- regex: '; *(IS01|IS03|IS05|IS\d{2}SH) Build'
|
3028
|
+
- regex: '; *(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
|
2785
3029
|
device_replacement: '$1'
|
2786
3030
|
brand_replacement: 'Sharp'
|
2787
3031
|
model_replacement: '$1'
|
2788
|
-
- regex: '; *(IS04) Build'
|
3032
|
+
- regex: '; *(IS04)(?: Build|\) AppleWebKit)'
|
2789
3033
|
device_replacement: '$1'
|
2790
3034
|
brand_replacement: 'Regza'
|
2791
3035
|
model_replacement: '$1'
|
2792
|
-
- regex: '; *(IS06|IS\d{2}PT) Build'
|
3036
|
+
- regex: '; *(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
|
2793
3037
|
device_replacement: '$1'
|
2794
3038
|
brand_replacement: 'Pantech'
|
2795
3039
|
model_replacement: '$1'
|
2796
|
-
- regex: '; *(IS11S) Build'
|
3040
|
+
- regex: '; *(IS11S)(?: Build|\) AppleWebKit)'
|
2797
3041
|
device_replacement: '$1'
|
2798
3042
|
brand_replacement: 'SonyEricsson'
|
2799
3043
|
model_replacement: 'Xperia Acro'
|
2800
|
-
- regex: '; *(IS11CA) Build'
|
3044
|
+
- regex: '; *(IS11CA)(?: Build|\) AppleWebKit)'
|
2801
3045
|
device_replacement: '$1'
|
2802
3046
|
brand_replacement: 'Casio'
|
2803
3047
|
model_replacement: 'GzOne $1'
|
2804
|
-
- regex: '; *(IS11LG) Build'
|
3048
|
+
- regex: '; *(IS11LG)(?: Build|\) AppleWebKit)'
|
2805
3049
|
device_replacement: '$1'
|
2806
3050
|
brand_replacement: 'LG'
|
2807
3051
|
model_replacement: 'Optimus X'
|
2808
|
-
- regex: '; *(IS11N) Build'
|
3052
|
+
- regex: '; *(IS11N)(?: Build|\) AppleWebKit)'
|
2809
3053
|
device_replacement: '$1'
|
2810
3054
|
brand_replacement: 'Medias'
|
2811
3055
|
model_replacement: '$1'
|
2812
|
-
- regex: '; *(IS11PT) Build'
|
3056
|
+
- regex: '; *(IS11PT)(?: Build|\) AppleWebKit)'
|
2813
3057
|
device_replacement: '$1'
|
2814
3058
|
brand_replacement: 'Pantech'
|
2815
3059
|
model_replacement: 'MIRACH'
|
2816
|
-
- regex: '; *(IS12F) Build'
|
3060
|
+
- regex: '; *(IS12F)(?: Build|\) AppleWebKit)'
|
2817
3061
|
device_replacement: '$1'
|
2818
3062
|
brand_replacement: 'Fujitsu'
|
2819
3063
|
model_replacement: 'Arrows ES'
|
2820
3064
|
# @ref: https://ja.wikipedia.org/wiki/IS12M
|
2821
|
-
- regex: '; *(IS12M) Build'
|
3065
|
+
- regex: '; *(IS12M)(?: Build|\) AppleWebKit)'
|
2822
3066
|
device_replacement: '$1'
|
2823
3067
|
brand_replacement: 'Motorola'
|
2824
3068
|
model_replacement: 'XT909'
|
2825
|
-
- regex: '; *(IS12S) Build'
|
3069
|
+
- regex: '; *(IS12S)(?: Build|\) AppleWebKit)'
|
2826
3070
|
device_replacement: '$1'
|
2827
3071
|
brand_replacement: 'SonyEricsson'
|
2828
3072
|
model_replacement: 'Xperia Acro HD'
|
2829
|
-
- regex: '; *(ISW11F) Build'
|
3073
|
+
- regex: '; *(ISW11F)(?: Build|\) AppleWebKit)'
|
2830
3074
|
device_replacement: '$1'
|
2831
3075
|
brand_replacement: 'Fujitsu'
|
2832
3076
|
model_replacement: 'Arrowz Z'
|
2833
|
-
- regex: '; *(ISW11HT) Build'
|
3077
|
+
- regex: '; *(ISW11HT)(?: Build|\) AppleWebKit)'
|
2834
3078
|
device_replacement: '$1'
|
2835
3079
|
brand_replacement: 'HTC'
|
2836
3080
|
model_replacement: 'EVO'
|
2837
|
-
- regex: '; *(ISW11K) Build'
|
3081
|
+
- regex: '; *(ISW11K)(?: Build|\) AppleWebKit)'
|
2838
3082
|
device_replacement: '$1'
|
2839
3083
|
brand_replacement: 'Kyocera'
|
2840
3084
|
model_replacement: 'DIGNO'
|
2841
|
-
- regex: '; *(ISW11M) Build'
|
3085
|
+
- regex: '; *(ISW11M)(?: Build|\) AppleWebKit)'
|
2842
3086
|
device_replacement: '$1'
|
2843
3087
|
brand_replacement: 'Motorola'
|
2844
3088
|
model_replacement: 'Photon'
|
2845
|
-
- regex: '; *(ISW11SC) Build'
|
3089
|
+
- regex: '; *(ISW11SC)(?: Build|\) AppleWebKit)'
|
2846
3090
|
device_replacement: '$1'
|
2847
3091
|
brand_replacement: 'Samsung'
|
2848
3092
|
model_replacement: 'GALAXY S II WiMAX'
|
2849
|
-
- regex: '; *(ISW12HT) Build'
|
3093
|
+
- regex: '; *(ISW12HT)(?: Build|\) AppleWebKit)'
|
2850
3094
|
device_replacement: '$1'
|
2851
3095
|
brand_replacement: 'HTC'
|
2852
3096
|
model_replacement: 'EVO 3D'
|
2853
|
-
- regex: '; *(ISW13HT) Build'
|
3097
|
+
- regex: '; *(ISW13HT)(?: Build|\) AppleWebKit)'
|
2854
3098
|
device_replacement: '$1'
|
2855
3099
|
brand_replacement: 'HTC'
|
2856
3100
|
model_replacement: 'J'
|
2857
|
-
- regex: '; *(ISW?[0-9]{2}[A-Z]{0,2}) Build'
|
3101
|
+
- regex: '; *(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
|
2858
3102
|
device_replacement: '$1'
|
2859
3103
|
brand_replacement: 'KDDI'
|
2860
3104
|
model_replacement: '$1'
|
2861
|
-
- regex: '; *(INFOBAR [^;/]
|
3105
|
+
- regex: '; *(INFOBAR [^;/]+?)(?: Build|\) AppleWebKit)'
|
2862
3106
|
device_replacement: '$1'
|
2863
3107
|
brand_replacement: 'KDDI'
|
2864
3108
|
model_replacement: '$1'
|
@@ -2867,7 +3111,7 @@ device_parsers:
|
|
2867
3111
|
# Kingcom
|
2868
3112
|
# @ref: http://www.e-kingcom.com
|
2869
3113
|
#########
|
2870
|
-
- regex: '; *(JOYPAD|Joypad)[ _]([^;/]
|
3114
|
+
- regex: '; *(JOYPAD|Joypad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
2871
3115
|
device_replacement: '$1 $2'
|
2872
3116
|
brand_replacement: 'Kingcom'
|
2873
3117
|
model_replacement: '$1 $2'
|
@@ -2877,7 +3121,7 @@ device_parsers:
|
|
2877
3121
|
# @ref: https://en.wikipedia.org/wiki/Kobo_Inc.
|
2878
3122
|
# @ref: http://www.kobo.com/devices#tablets
|
2879
3123
|
#########
|
2880
|
-
- regex: '; *(Vox|VOX|Arc|K080) Build
|
3124
|
+
- regex: '; *(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
|
2881
3125
|
regex_flag: 'i'
|
2882
3126
|
device_replacement: '$1'
|
2883
3127
|
brand_replacement: 'Kobo'
|
@@ -2891,7 +3135,7 @@ device_parsers:
|
|
2891
3135
|
# K-Touch
|
2892
3136
|
# @ref: ??
|
2893
3137
|
#########
|
2894
|
-
- regex: '; *(K-Touch)[ _]([^;/]
|
3138
|
+
- regex: '; *(K-Touch)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
2895
3139
|
regex_flag: 'i'
|
2896
3140
|
device_replacement: '$1 $2'
|
2897
3141
|
brand_replacement: 'Ktouch'
|
@@ -2901,7 +3145,7 @@ device_parsers:
|
|
2901
3145
|
# KT Tech
|
2902
3146
|
# @ref: http://www.kttech.co.kr
|
2903
3147
|
#########
|
2904
|
-
- regex: '; *((?:EV|KM)-S\d+[A-Z]?) Build'
|
3148
|
+
- regex: '; *((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
|
2905
3149
|
regex_flag: 'i'
|
2906
3150
|
device_replacement: '$1'
|
2907
3151
|
brand_replacement: 'KTtech'
|
@@ -2911,7 +3155,7 @@ device_parsers:
|
|
2911
3155
|
# Kyocera
|
2912
3156
|
# @ref: http://www.android.com/devices/?country=all&m=kyocera
|
2913
3157
|
#########
|
2914
|
-
- regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2}) Build
|
3158
|
+
- regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
|
2915
3159
|
device_replacement: '$1'
|
2916
3160
|
brand_replacement: 'Kyocera'
|
2917
3161
|
model_replacement: '$1'
|
@@ -2920,7 +3164,7 @@ device_parsers:
|
|
2920
3164
|
# Lava
|
2921
3165
|
# @ref: http://www.lavamobiles.com/
|
2922
3166
|
#########
|
2923
|
-
- regex: '; *(?:LAVA[ _])
|
3167
|
+
- regex: '; *(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
|
2924
3168
|
regex_flag: 'i'
|
2925
3169
|
device_replacement: 'Iris $1'
|
2926
3170
|
brand_replacement: 'Lava'
|
@@ -2934,7 +3178,7 @@ device_parsers:
|
|
2934
3178
|
# Lemon
|
2935
3179
|
# @ref: http://www.lemonmobiles.com/products.php?type=1
|
2936
3180
|
#########
|
2937
|
-
- regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_? Build'
|
3181
|
+
- regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_?(?: Build|\) AppleWebKit)'
|
2938
3182
|
device_replacement: 'Lemon $1$2'
|
2939
3183
|
brand_replacement: 'Lemon'
|
2940
3184
|
model_replacement: '$1$2'
|
@@ -2943,11 +3187,11 @@ device_parsers:
|
|
2943
3187
|
# Lenco
|
2944
3188
|
# @ref: http://www.lenco.com/c/tablets/
|
2945
3189
|
#########
|
2946
|
-
- regex: '; *(TAB-1012) Build
|
3190
|
+
- regex: '; *(TAB-1012)(?: Build|\) AppleWebKit)'
|
2947
3191
|
device_replacement: 'Lenco $1'
|
2948
3192
|
brand_replacement: 'Lenco'
|
2949
3193
|
model_replacement: '$1'
|
2950
|
-
- regex: '; Lenco ([^;/]
|
3194
|
+
- regex: '; Lenco ([^;/]+?)(?: Build|\) AppleWebKit)'
|
2951
3195
|
device_replacement: 'Lenco $1'
|
2952
3196
|
brand_replacement: 'Lenco'
|
2953
3197
|
model_replacement: '$1'
|
@@ -2972,15 +3216,15 @@ device_parsers:
|
|
2972
3216
|
device_replacement: 'Lenovo $1 $2'
|
2973
3217
|
brand_replacement: 'Lenovo'
|
2974
3218
|
model_replacement: '$1 $2'
|
2975
|
-
- regex: '; *(?:LNV
|
3219
|
+
- regex: '; *(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.+?)(?:Build|[;/\)])'
|
2976
3220
|
device_replacement: 'Lenovo $1'
|
2977
3221
|
brand_replacement: 'Lenovo'
|
2978
3222
|
model_replacement: '$1'
|
2979
|
-
- regex: '[;,] (?:Vodafone )
|
3223
|
+
- regex: '[;,] (?:Vodafone |)(SmartTab) ?(II) ?(\d+) Build/'
|
2980
3224
|
device_replacement: 'Lenovo $1 $2 $3'
|
2981
3225
|
brand_replacement: 'Lenovo'
|
2982
3226
|
model_replacement: '$1 $2 $3'
|
2983
|
-
- regex: '; *(?:Ideapad )
|
3227
|
+
- regex: '; *(?:Ideapad |)K1 Build/'
|
2984
3228
|
device_replacement: 'Lenovo Ideapad K1'
|
2985
3229
|
brand_replacement: 'Lenovo'
|
2986
3230
|
model_replacement: 'Ideapad K1'
|
@@ -2997,7 +3241,7 @@ device_parsers:
|
|
2997
3241
|
# Lexibook
|
2998
3242
|
# @ref: http://www.lexibook.com/fr
|
2999
3243
|
#########
|
3000
|
-
- regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),? Build'
|
3244
|
+
- regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
|
3001
3245
|
device_replacement: '$1$2'
|
3002
3246
|
brand_replacement: 'Lexibook'
|
3003
3247
|
model_replacement: '$1$2'
|
@@ -3010,7 +3254,7 @@ device_parsers:
|
|
3010
3254
|
device_replacement: '$1'
|
3011
3255
|
brand_replacement: 'LG'
|
3012
3256
|
model_replacement: '$1'
|
3013
|
-
- regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d
|
3257
|
+
- regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) *(?:Build|[;\)])'
|
3014
3258
|
device_replacement: '$1'
|
3015
3259
|
brand_replacement: 'LG'
|
3016
3260
|
model_replacement: '$1'
|
@@ -3035,11 +3279,11 @@ device_parsers:
|
|
3035
3279
|
# Malata
|
3036
3280
|
# @ref: http://www.malata.com/en/products.aspx?classid=680
|
3037
3281
|
#########
|
3038
|
-
- regex: '; *((?:SMB|smb)[^;/]
|
3282
|
+
- regex: '; *((?:SMB|smb)[^;/]+?)(?: Build|\) AppleWebKit)'
|
3039
3283
|
device_replacement: '$1'
|
3040
3284
|
brand_replacement: 'Malata'
|
3041
3285
|
model_replacement: '$1'
|
3042
|
-
- regex: '; *(?:Malata|MALATA) ([^;/]
|
3286
|
+
- regex: '; *(?:Malata|MALATA) ([^;/]+?)(?: Build|\) AppleWebKit)'
|
3043
3287
|
device_replacement: '$1'
|
3044
3288
|
brand_replacement: 'Malata'
|
3045
3289
|
model_replacement: '$1'
|
@@ -3048,7 +3292,7 @@ device_parsers:
|
|
3048
3292
|
# Manta
|
3049
3293
|
# @ref: http://www.manta.com.pl/en
|
3050
3294
|
#########
|
3051
|
-
- regex: '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9]) Build
|
3295
|
+
- regex: '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\) AppleWebKit)'
|
3052
3296
|
device_replacement: '$1'
|
3053
3297
|
brand_replacement: 'Manta'
|
3054
3298
|
model_replacement: '$1'
|
@@ -3057,7 +3301,7 @@ device_parsers:
|
|
3057
3301
|
# Match
|
3058
3302
|
# @ref: http://www.match.net.cn/products.asp
|
3059
3303
|
#########
|
3060
|
-
- regex: '; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980) Build
|
3304
|
+
- regex: '; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\) AppleWebKit)'
|
3061
3305
|
device_replacement: '$1'
|
3062
3306
|
brand_replacement: 'Match'
|
3063
3307
|
model_replacement: '$1'
|
@@ -3071,7 +3315,7 @@ device_parsers:
|
|
3071
3315
|
# Maxx MT150, Maxx MQ601, Maxx M2020, Maxx Sleek MX463neo, Maxx MX525, Maxx MX192-Tune, Maxx Genx Droid 7 AX353,
|
3072
3316
|
# @note: Need more User-Agents!!!
|
3073
3317
|
#########
|
3074
|
-
- regex: '; *(GenxDroid7|MSD7
|
3318
|
+
- regex: '; *(GenxDroid7|MSD7.*?|AX\d.*?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
|
3075
3319
|
device_replacement: 'Maxx $1'
|
3076
3320
|
brand_replacement: 'Maxx'
|
3077
3321
|
model_replacement: '$1'
|
@@ -3080,11 +3324,11 @@ device_parsers:
|
|
3080
3324
|
# Mediacom
|
3081
3325
|
# @ref: http://www.mediacomeurope.it/
|
3082
3326
|
#########
|
3083
|
-
- regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]
|
3327
|
+
- regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
|
3084
3328
|
device_replacement: 'Mediacom $1'
|
3085
3329
|
brand_replacement: 'Mediacom'
|
3086
3330
|
model_replacement: '$1'
|
3087
|
-
- regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]
|
3331
|
+
- regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
|
3088
3332
|
device_replacement: 'Mediacom $1'
|
3089
3333
|
brand_replacement: 'Mediacom'
|
3090
3334
|
model_replacement: '$1'
|
@@ -3093,12 +3337,12 @@ device_parsers:
|
|
3093
3337
|
# Medion
|
3094
3338
|
# @ref: http://www.medion.com/en/
|
3095
3339
|
#########
|
3096
|
-
- regex: '; *(?:MD_)
|
3340
|
+
- regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
3097
3341
|
regex_flag: 'i'
|
3098
3342
|
device_replacement: 'Medion Lifetab $1'
|
3099
3343
|
brand_replacement: 'Medion'
|
3100
3344
|
model_replacement: 'Lifetab $1'
|
3101
|
-
- regex: '; *MEDION ([^;/]
|
3345
|
+
- regex: '; *MEDION ([^;/]+?)(?: Build|\) AppleWebKit)'
|
3102
3346
|
device_replacement: 'Medion $1'
|
3103
3347
|
brand_replacement: 'Medion'
|
3104
3348
|
model_replacement: '$1'
|
@@ -3107,7 +3351,7 @@ device_parsers:
|
|
3107
3351
|
# Meizu
|
3108
3352
|
# @ref: http://www.meizu.com
|
3109
3353
|
#########
|
3110
|
-
- regex: '; *(M030|M031|M035|M040|M065|m9) Build'
|
3354
|
+
- regex: '; *(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
|
3111
3355
|
device_replacement: 'Meizu $1'
|
3112
3356
|
brand_replacement: 'Meizu'
|
3113
3357
|
model_replacement: '$1'
|
@@ -3151,7 +3395,7 @@ device_parsers:
|
|
3151
3395
|
# Mito
|
3152
3396
|
# @ref: http://new.mitomobile.com/
|
3153
3397
|
#########
|
3154
|
-
- regex: '; *(MITO)[ _\-]?([^;/]
|
3398
|
+
- regex: '; *(MITO)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
|
3155
3399
|
regex_flag: 'i'
|
3156
3400
|
device_replacement: '$1 $2'
|
3157
3401
|
brand_replacement: 'Mito'
|
@@ -3171,12 +3415,12 @@ device_parsers:
|
|
3171
3415
|
# Modecom
|
3172
3416
|
# @ref: http://www.modecom.eu/tablets/portal/
|
3173
3417
|
#########
|
3174
|
-
- regex: '; *(MODECOM )
|
3418
|
+
- regex: '; *(MODECOM |)(FreeTab) ?([^;/]+?)(?: Build|\) AppleWebKit)'
|
3175
3419
|
regex_flag: 'i'
|
3176
3420
|
device_replacement: '$1$2 $3'
|
3177
3421
|
brand_replacement: 'Modecom'
|
3178
3422
|
model_replacement: '$2 $3'
|
3179
|
-
- regex: '; *(MODECOM )([^;/]
|
3423
|
+
- regex: '; *(MODECOM )([^;/]+?)(?: Build|\) AppleWebKit)'
|
3180
3424
|
regex_flag: 'i'
|
3181
3425
|
device_replacement: '$1 $2'
|
3182
3426
|
brand_replacement: 'Modecom'
|
@@ -3220,7 +3464,7 @@ device_parsers:
|
|
3220
3464
|
# MpMan
|
3221
3465
|
# @ref: http://www.mpmaneurope.com
|
3222
3466
|
#########
|
3223
|
-
- regex: '; *((?:MP[DQ]C|MPG\d{1,4}|MP\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*) Build'
|
3467
|
+
- regex: '; *((?:MP[DQ]C|MPG\d{1,4}|MP\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\) AppleWebKit)'
|
3224
3468
|
device_replacement: '$1'
|
3225
3469
|
brand_replacement: 'Mpman'
|
3226
3470
|
model_replacement: '$1'
|
@@ -3229,7 +3473,7 @@ device_parsers:
|
|
3229
3473
|
# MSI
|
3230
3474
|
# @ref: http://www.msi.com/product/windpad/
|
3231
3475
|
#########
|
3232
|
-
- regex: '; *(?:MSI[ _])
|
3476
|
+
- regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
|
3233
3477
|
regex_flag: 'i'
|
3234
3478
|
device_replacement: '$1'
|
3235
3479
|
brand_replacement: 'Msi'
|
@@ -3239,7 +3483,7 @@ device_parsers:
|
|
3239
3483
|
# Multilaser
|
3240
3484
|
# http://www.multilaser.com.br/listagem_produtos.php?cat=5
|
3241
3485
|
#########
|
3242
|
-
- regex: '; *Multilaser[ _]([^;/]
|
3486
|
+
- regex: '; *Multilaser[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
3243
3487
|
device_replacement: '$1'
|
3244
3488
|
brand_replacement: 'Multilaser'
|
3245
3489
|
model_replacement: '$1'
|
@@ -3248,15 +3492,15 @@ device_parsers:
|
|
3248
3492
|
# MyPhone
|
3249
3493
|
# @ref: http://myphone.com.ph/
|
3250
3494
|
#########
|
3251
|
-
- regex: '; *(My)[_]?(Pad)[ _]([^;/]
|
3495
|
+
- regex: '; *(My)[_]?(Pad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
3252
3496
|
device_replacement: '$1$2 $3'
|
3253
3497
|
brand_replacement: 'MyPhone'
|
3254
3498
|
model_replacement: '$1$2 $3'
|
3255
|
-
- regex: '; *(My)\|?(Phone)[ _]([^;/]
|
3499
|
+
- regex: '; *(My)\|?(Phone)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
3256
3500
|
device_replacement: '$1$2 $3'
|
3257
3501
|
brand_replacement: 'MyPhone'
|
3258
3502
|
model_replacement: '$3'
|
3259
|
-
- regex: '; *(A\d+)[ _](Duo)
|
3503
|
+
- regex: '; *(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
|
3260
3504
|
regex_flag: 'i'
|
3261
3505
|
device_replacement: '$1 $2'
|
3262
3506
|
brand_replacement: 'MyPhone'
|
@@ -3266,7 +3510,7 @@ device_parsers:
|
|
3266
3510
|
# Mytab
|
3267
3511
|
# @ref: http://www.mytab.eu/en/category/mytab-products/
|
3268
3512
|
#########
|
3269
|
-
- regex: '; *(myTab[^;/]*) Build'
|
3513
|
+
- regex: '; *(myTab[^;/]*)(?: Build|\) AppleWebKit)'
|
3270
3514
|
device_replacement: '$1'
|
3271
3515
|
brand_replacement: 'Mytab'
|
3272
3516
|
model_replacement: '$1'
|
@@ -3275,7 +3519,7 @@ device_parsers:
|
|
3275
3519
|
# Nabi
|
3276
3520
|
# @ref: https://www.nabitablet.com
|
3277
3521
|
#########
|
3278
|
-
- regex: '; *(NABI2?-)([^;/]
|
3522
|
+
- regex: '; *(NABI2?-)([^;/]+?)(?: Build|\) AppleWebKit)'
|
3279
3523
|
device_replacement: '$1$2'
|
3280
3524
|
brand_replacement: 'Nabi'
|
3281
3525
|
model_replacement: '$2'
|
@@ -3284,15 +3528,15 @@ device_parsers:
|
|
3284
3528
|
# Nec Medias
|
3285
3529
|
# @ref: http://www.n-keitai.com/
|
3286
3530
|
#########
|
3287
|
-
- regex: '; *(N-\d+[CDE]) Build
|
3531
|
+
- regex: '; *(N-\d+[CDE])(?: Build|\) AppleWebKit)'
|
3288
3532
|
device_replacement: '$1'
|
3289
3533
|
brand_replacement: 'Nec'
|
3290
3534
|
model_replacement: '$1'
|
3291
|
-
- regex: '; ?(NEC-)(
|
3535
|
+
- regex: '; ?(NEC-)(.*?)(?: Build|\) AppleWebKit)'
|
3292
3536
|
device_replacement: '$1$2'
|
3293
3537
|
brand_replacement: 'Nec'
|
3294
3538
|
model_replacement: '$2'
|
3295
|
-
- regex: '; *(LT-NA7) Build
|
3539
|
+
- regex: '; *(LT-NA7)(?: Build|\) AppleWebKit)'
|
3296
3540
|
device_replacement: '$1'
|
3297
3541
|
brand_replacement: 'Nec'
|
3298
3542
|
model_replacement: 'Lifetouch Note'
|
@@ -3301,7 +3545,7 @@ device_parsers:
|
|
3301
3545
|
# Nextbook
|
3302
3546
|
# @ref: http://nextbookusa.com
|
3303
3547
|
#########
|
3304
|
-
- regex: '; *(NXM\d+[A-z0-9_]*|Next\d[A-z0-9_ \-]*|NEXT\d[A-z0-9_ \-]*|Nextbook [A-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\);])'
|
3548
|
+
- regex: '; *(NXM\d+[A-Za-z0-9_]*|Next\d[A-Za-z0-9_ \-]*|NEXT\d[A-Za-z0-9_ \-]*|Nextbook [A-Za-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\);])'
|
3305
3549
|
device_replacement: '$1'
|
3306
3550
|
brand_replacement: 'Nextbook'
|
3307
3551
|
model_replacement: '$1'
|
@@ -3315,17 +3559,21 @@ device_parsers:
|
|
3315
3559
|
device_replacement: '$1$2$3'
|
3316
3560
|
brand_replacement: 'Nokia'
|
3317
3561
|
model_replacement: '$3'
|
3562
|
+
- regex: '; *(TA\-\d{4})(?: Build|\) AppleWebKit)'
|
3563
|
+
device_replacement: 'Nokia $1'
|
3564
|
+
brand_replacement: 'Nokia'
|
3565
|
+
model_replacement: '$1'
|
3318
3566
|
|
3319
3567
|
#########
|
3320
3568
|
# Nook
|
3321
3569
|
# @ref:
|
3322
3570
|
# TODO nook browser/1.0
|
3323
3571
|
#########
|
3324
|
-
- regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]
|
3572
|
+
- regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+?)(?: Build|\) AppleWebKit)'
|
3325
3573
|
device_replacement: '$1$2'
|
3326
3574
|
brand_replacement: 'Nook'
|
3327
3575
|
model_replacement: '$2'
|
3328
|
-
- regex: '; *(NOOK )
|
3576
|
+
- regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
|
3329
3577
|
device_replacement: '$1$2'
|
3330
3578
|
brand_replacement: 'Nook'
|
3331
3579
|
model_replacement: '$2'
|
@@ -3338,7 +3586,7 @@ device_parsers:
|
|
3338
3586
|
# Olivetti
|
3339
3587
|
# @ref: http://www.olivetti.de/EN/Page/t02/view_html?idp=348
|
3340
3588
|
#########
|
3341
|
-
- regex: '; *(OP110|OliPad[^;/]
|
3589
|
+
- regex: '; *(OP110|OliPad[^;/]+?)(?: Build|\) AppleWebKit)'
|
3342
3590
|
device_replacement: 'Olivetti $1'
|
3343
3591
|
brand_replacement: 'Olivetti'
|
3344
3592
|
model_replacement: '$1'
|
@@ -3349,7 +3597,7 @@ device_parsers:
|
|
3349
3597
|
# @note: MID tablets might get matched by CobyKyros first
|
3350
3598
|
# @models: (T107|MID(?:700[2-5]|7031|7108|7132|750[02]|8001|8500|9001|971[12])
|
3351
3599
|
#########
|
3352
|
-
- regex: '; *OMEGA[ _\-](MID[^;/]
|
3600
|
+
- regex: '; *OMEGA[ _\-](MID[^;/]+?)(?: Build|\) AppleWebKit)'
|
3353
3601
|
device_replacement: 'Omega $1'
|
3354
3602
|
brand_replacement: 'Omega'
|
3355
3603
|
model_replacement: '$1'
|
@@ -3362,7 +3610,7 @@ device_parsers:
|
|
3362
3610
|
# OpenPeak
|
3363
3611
|
# @ref: https://support.google.com/googleplay/answer/1727131?hl=en
|
3364
3612
|
#########
|
3365
|
-
- regex: '; *((?:CIUS|cius)[^;/]*) Build'
|
3613
|
+
- regex: '; *((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
|
3366
3614
|
device_replacement: 'Openpeak $1'
|
3367
3615
|
brand_replacement: 'Openpeak'
|
3368
3616
|
model_replacement: '$1'
|
@@ -3371,33 +3619,40 @@ device_parsers:
|
|
3371
3619
|
# Oppo
|
3372
3620
|
# @ref: http://en.oppo.com/products/
|
3373
3621
|
#########
|
3374
|
-
- regex: '; *(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d
|
3622
|
+
- regex: '; *(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d?|U70\d{1,2}T?|X90\d{1,2}|[AFR]\d{1,2}[a-z]{1,2})(?: Build|\) AppleWebKit)'
|
3623
|
+
device_replacement: 'Oppo $1'
|
3624
|
+
brand_replacement: 'Oppo'
|
3625
|
+
model_replacement: '$1'
|
3626
|
+
- regex: '; *OPPO ?([^;/]+?)(?: Build|\) AppleWebKit)'
|
3375
3627
|
device_replacement: 'Oppo $1'
|
3376
3628
|
brand_replacement: 'Oppo'
|
3377
3629
|
model_replacement: '$1'
|
3378
|
-
- regex: '; *
|
3630
|
+
- regex: '; *(CPH\d{1,4}|RMX\d{1,4}|P[A-Z]{3}\d{2})(?: Build|\) AppleWebKit)'
|
3379
3631
|
device_replacement: 'Oppo $1'
|
3380
3632
|
brand_replacement: 'Oppo'
|
3633
|
+
- regex: '; *(A1601)(?: Build|\) AppleWebKit)'
|
3634
|
+
device_replacement: 'Oppo F1s'
|
3635
|
+
brand_replacement: 'Oppo'
|
3381
3636
|
model_replacement: '$1'
|
3382
3637
|
|
3383
3638
|
#########
|
3384
3639
|
# Odys
|
3385
3640
|
# @ref: http://odys.de
|
3386
3641
|
#########
|
3387
|
-
- regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]
|
3642
|
+
- regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+?)(?: Build|\) AppleWebKit)'
|
3388
3643
|
device_replacement: 'Odys $1'
|
3389
3644
|
brand_replacement: 'Odys'
|
3390
3645
|
model_replacement: '$1'
|
3391
|
-
- regex: '; *(SELECT) ?(7) Build'
|
3646
|
+
- regex: '; *(SELECT) ?(7)(?: Build|\) AppleWebKit)'
|
3392
3647
|
device_replacement: 'Odys $1 $2'
|
3393
3648
|
brand_replacement: 'Odys'
|
3394
3649
|
model_replacement: '$1 $2'
|
3395
|
-
- regex: '; *(PEDI)_(PLUS)_(W) Build'
|
3650
|
+
- regex: '; *(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
|
3396
3651
|
device_replacement: 'Odys $1 $2 $3'
|
3397
3652
|
brand_replacement: 'Odys'
|
3398
3653
|
model_replacement: '$1 $2 $3'
|
3399
3654
|
# Weltbild - Tablet PC 4 = Cat Phoenix = Odys Tablet PC 4?
|
3400
|
-
- regex: '; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\d+ ?[Pp]ro|XENO10|XPRESS PRO) Build'
|
3655
|
+
- regex: '; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\) AppleWebKit)'
|
3401
3656
|
device_replacement: 'Odys $1'
|
3402
3657
|
brand_replacement: 'Odys'
|
3403
3658
|
model_replacement: '$1'
|
@@ -3406,11 +3661,11 @@ device_parsers:
|
|
3406
3661
|
# OnePlus
|
3407
3662
|
# @ref https://oneplus.net/
|
3408
3663
|
#########
|
3409
|
-
- regex: '; (ONE [a-zA-Z]\d+) Build
|
3664
|
+
- regex: '; (ONE [a-zA-Z]\d+)(?: Build|\) AppleWebKit)'
|
3410
3665
|
device_replacement: 'OnePlus $1'
|
3411
3666
|
brand_replacement: 'OnePlus'
|
3412
3667
|
model_replacement: '$1'
|
3413
|
-
- regex: '; (ONEPLUS [a-zA-Z]\d+) Build
|
3668
|
+
- regex: '; (ONEPLUS [a-zA-Z]\d+)(?: Build|\) AppleWebKit)'
|
3414
3669
|
device_replacement: 'OnePlus $1'
|
3415
3670
|
brand_replacement: 'OnePlus'
|
3416
3671
|
model_replacement: '$1'
|
@@ -3419,7 +3674,7 @@ device_parsers:
|
|
3419
3674
|
# Orion
|
3420
3675
|
# @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
|
3421
3676
|
#########
|
3422
|
-
- regex: '; *(TP-\d+) Build
|
3677
|
+
- regex: '; *(TP-\d+)(?: Build|\) AppleWebKit)'
|
3423
3678
|
device_replacement: 'Orion $1'
|
3424
3679
|
brand_replacement: 'Orion'
|
3425
3680
|
model_replacement: '$1'
|
@@ -3428,7 +3683,7 @@ device_parsers:
|
|
3428
3683
|
# PackardBell
|
3429
3684
|
# @ref: http://www.packardbell.com/pb/en/AE/content/productgroup/tablets
|
3430
3685
|
#########
|
3431
|
-
- regex: '; *(G100W?) Build
|
3686
|
+
- regex: '; *(G100W?)(?: Build|\) AppleWebKit)'
|
3432
3687
|
device_replacement: 'PackardBell $1'
|
3433
3688
|
brand_replacement: 'PackardBell'
|
3434
3689
|
model_replacement: '$1'
|
@@ -3439,17 +3694,17 @@ device_parsers:
|
|
3439
3694
|
# @models: T11, T21, T31, P11, P51, Eluga Power, Eluga DL1
|
3440
3695
|
# @models: (tab) Toughpad FZ-A1, Toughpad JT-B1
|
3441
3696
|
#########
|
3442
|
-
- regex: '; *(Panasonic)[_ ]([^;/]
|
3697
|
+
- regex: '; *(Panasonic)[_ ]([^;/]+?)(?: Build|\) AppleWebKit)'
|
3443
3698
|
device_replacement: '$1 $2'
|
3444
3699
|
brand_replacement: '$1'
|
3445
3700
|
model_replacement: '$2'
|
3446
3701
|
# Toughpad
|
3447
|
-
- regex: '; *(FZ-A1B|JT-B1) Build'
|
3702
|
+
- regex: '; *(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
|
3448
3703
|
device_replacement: 'Panasonic $1'
|
3449
3704
|
brand_replacement: 'Panasonic'
|
3450
3705
|
model_replacement: '$1'
|
3451
3706
|
# Eluga Power
|
3452
|
-
- regex: '; *(dL1|DL1) Build'
|
3707
|
+
- regex: '; *(dL1|DL1)(?: Build|\) AppleWebKit)'
|
3453
3708
|
device_replacement: 'Panasonic $1'
|
3454
3709
|
brand_replacement: 'Panasonic'
|
3455
3710
|
model_replacement: '$1'
|
@@ -3460,11 +3715,11 @@ device_parsers:
|
|
3460
3715
|
# @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA
|
3461
3716
|
# @models: ADR8995, ADR910L, ADR930VW, C790, CDM8992, CDM8999, IS06, IS11PT, P2000, P2020, P2030, P4100, P5000, P6010, P6020, P6030, P7000, P7040, P8000, P8010, P9020, P9050, P9060, P9070, P9090, PT001, PT002, PT003, TXT8040, TXT8045, VEGA PTL21
|
3462
3717
|
#########
|
3463
|
-
- regex: '; *(SKY[ _])
|
3718
|
+
- regex: '; *(SKY[ _]|)(IM\-[AT]\d{3}[^;/]+).* Build/'
|
3464
3719
|
device_replacement: 'Pantech $1$2'
|
3465
3720
|
brand_replacement: 'Pantech'
|
3466
3721
|
model_replacement: '$1$2'
|
3467
|
-
- regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G)
|
3722
|
+
- regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
|
3468
3723
|
device_replacement: '$1'
|
3469
3724
|
brand_replacement: 'Pantech'
|
3470
3725
|
model_replacement: '$1'
|
@@ -3477,7 +3732,7 @@ device_parsers:
|
|
3477
3732
|
# Papayre
|
3478
3733
|
# @ref: http://grammata.es/
|
3479
3734
|
#########
|
3480
|
-
- regex: '; *(papyre)[ _\-]([^;/]
|
3735
|
+
- regex: '; *(papyre)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
|
3481
3736
|
regex_flag: 'i'
|
3482
3737
|
device_replacement: '$1 $2'
|
3483
3738
|
brand_replacement: 'Papyre'
|
@@ -3487,7 +3742,7 @@ device_parsers:
|
|
3487
3742
|
# Pearl
|
3488
3743
|
# @ref: http://www.pearl.de/c-1540.shtml
|
3489
3744
|
#########
|
3490
|
-
- regex: '; *(?:Touchlet )?(X10\.[^;/]
|
3745
|
+
- regex: '; *(?:Touchlet )?(X10\.[^;/]+?)(?: Build|\) AppleWebKit)'
|
3491
3746
|
device_replacement: 'Pearl $1'
|
3492
3747
|
brand_replacement: 'Pearl'
|
3493
3748
|
model_replacement: '$1'
|
@@ -3496,15 +3751,15 @@ device_parsers:
|
|
3496
3751
|
# Phicomm
|
3497
3752
|
# @ref: http://www.phicomm.com.cn/
|
3498
3753
|
#########
|
3499
|
-
- regex: '; PHICOMM (i800) Build
|
3754
|
+
- regex: '; PHICOMM (i800)(?: Build|\) AppleWebKit)'
|
3500
3755
|
device_replacement: 'Phicomm $1'
|
3501
3756
|
brand_replacement: 'Phicomm'
|
3502
3757
|
model_replacement: '$1'
|
3503
|
-
- regex: '; PHICOMM ([^;/]
|
3758
|
+
- regex: '; PHICOMM ([^;/]+?)(?: Build|\) AppleWebKit)'
|
3504
3759
|
device_replacement: 'Phicomm $1'
|
3505
3760
|
brand_replacement: 'Phicomm'
|
3506
3761
|
model_replacement: '$1'
|
3507
|
-
- regex: '; *(FWS\d{3}[^;/]
|
3762
|
+
- regex: '; *(FWS\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
|
3508
3763
|
device_replacement: 'Phicomm $1'
|
3509
3764
|
brand_replacement: 'Phicomm'
|
3510
3765
|
model_replacement: '$1'
|
@@ -3516,11 +3771,11 @@ device_parsers:
|
|
3516
3771
|
# @ref: http://www.support.philips.com/support/catalog/products.jsp?_dyncharset=UTF-8&country=&categoryid=ENTERTAINMENT_TABLETS_SU_CN_CARE&userLanguage=en&navCount=0&groupId=&catalogType=&navAction=push&userCountry=cn&title=Entertainment+Tablets&cateId=TABLETS_CA_CN_CARE
|
3517
3772
|
#########
|
3518
3773
|
# @note: this a best guess according to available philips models. Need more User-Agents
|
3519
|
-
- regex: '; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930) Build'
|
3774
|
+
- regex: '; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\) AppleWebKit)'
|
3520
3775
|
device_replacement: '$1'
|
3521
3776
|
brand_replacement: 'Philips'
|
3522
3777
|
model_replacement: '$1'
|
3523
|
-
- regex: '; *(?:Philips|PHILIPS)[ _]([^;/]
|
3778
|
+
- regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
3524
3779
|
device_replacement: 'Philips $1'
|
3525
3780
|
brand_replacement: 'Philips'
|
3526
3781
|
model_replacement: '$1'
|
@@ -3529,7 +3784,7 @@ device_parsers:
|
|
3529
3784
|
# Pipo
|
3530
3785
|
# @ref: http://www.pipo.cn/En/
|
3531
3786
|
#########
|
3532
|
-
- regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)? Build'
|
3787
|
+
- regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
|
3533
3788
|
device_replacement: 'Pipo $1$2'
|
3534
3789
|
brand_replacement: 'Pipo'
|
3535
3790
|
model_replacement: '$1$2'
|
@@ -3538,7 +3793,7 @@ device_parsers:
|
|
3538
3793
|
# Ployer
|
3539
3794
|
# @ref: http://en.ployer.cn/
|
3540
3795
|
#########
|
3541
|
-
- regex: '; *(MOMO[^;/]
|
3796
|
+
- regex: '; *(MOMO[^;/]+?)(?: Build|\) AppleWebKit)'
|
3542
3797
|
device_replacement: '$1'
|
3543
3798
|
brand_replacement: 'Ployer'
|
3544
3799
|
model_replacement: '$1'
|
@@ -3547,11 +3802,11 @@ device_parsers:
|
|
3547
3802
|
# Polaroid/ Acho
|
3548
3803
|
# @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
|
3549
3804
|
#########
|
3550
|
-
- regex: '; *(?:Polaroid[ _])
|
3805
|
+
- regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*?)(\/[^;/]*|)(?: Build|\) AppleWebKit)'
|
3551
3806
|
device_replacement: '$1'
|
3552
3807
|
brand_replacement: 'Polaroid'
|
3553
3808
|
model_replacement: '$1'
|
3554
|
-
- regex: '; *(?:Polaroid )(Tablet) Build
|
3809
|
+
- regex: '; *(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
|
3555
3810
|
device_replacement: '$1'
|
3556
3811
|
brand_replacement: 'Polaroid'
|
3557
3812
|
model_replacement: '$1'
|
@@ -3570,11 +3825,11 @@ device_parsers:
|
|
3570
3825
|
# Positivo
|
3571
3826
|
# @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
|
3572
3827
|
#########
|
3573
|
-
- regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA) Build
|
3828
|
+
- regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
|
3574
3829
|
device_replacement: '$1'
|
3575
3830
|
brand_replacement: 'Positivo'
|
3576
3831
|
model_replacement: '$1'
|
3577
|
-
- regex: '; *(?:Positivo )
|
3832
|
+
- regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+?)(?: Build|\) AppleWebKit)'
|
3578
3833
|
device_replacement: '$1'
|
3579
3834
|
brand_replacement: 'Positivo'
|
3580
3835
|
model_replacement: '$1'
|
@@ -3584,15 +3839,15 @@ device_parsers:
|
|
3584
3839
|
# @ref: http://www.pointofview-online.com/default2.php
|
3585
3840
|
# @TODO: Smartphone Models MOB-3515, MOB-5045-B missing
|
3586
3841
|
#########
|
3587
|
-
- regex: '; *(MOB-[^;/]
|
3842
|
+
- regex: '; *(MOB-[^;/]+?)(?: Build|\) AppleWebKit)'
|
3588
3843
|
device_replacement: '$1'
|
3589
3844
|
brand_replacement: 'POV'
|
3590
3845
|
model_replacement: '$1'
|
3591
|
-
- regex: '; *POV[ _\-]([^;/]
|
3846
|
+
- regex: '; *POV[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
|
3592
3847
|
device_replacement: 'POV $1'
|
3593
3848
|
brand_replacement: 'POV'
|
3594
3849
|
model_replacement: '$1'
|
3595
|
-
- regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*) Build
|
3850
|
+
- regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
|
3596
3851
|
device_replacement: 'POV $1'
|
3597
3852
|
brand_replacement: 'POV'
|
3598
3853
|
model_replacement: '$1'
|
@@ -3602,7 +3857,7 @@ device_parsers:
|
|
3602
3857
|
# @ref: http://www.prestigio.com/catalogue/MultiPhones
|
3603
3858
|
# @ref: http://www.prestigio.com/catalogue/MultiPads
|
3604
3859
|
#########
|
3605
|
-
- regex: '; *(?:Prestigio )
|
3860
|
+
- regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
3606
3861
|
device_replacement: 'Prestigio $1'
|
3607
3862
|
brand_replacement: 'Prestigio'
|
3608
3863
|
model_replacement: '$1'
|
@@ -3611,7 +3866,7 @@ device_parsers:
|
|
3611
3866
|
# Proscan
|
3612
3867
|
# @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
|
3613
3868
|
#########
|
3614
|
-
- regex: '; *(PLT[0-9]{4}
|
3869
|
+
- regex: '; *(PLT[0-9]{4}.*?)(?: Build|\) AppleWebKit)'
|
3615
3870
|
device_replacement: '$1'
|
3616
3871
|
brand_replacement: 'Proscan'
|
3617
3872
|
model_replacement: '$1'
|
@@ -3620,15 +3875,15 @@ device_parsers:
|
|
3620
3875
|
# QMobile
|
3621
3876
|
# @ref: http://www.qmobile.com.pk/
|
3622
3877
|
#########
|
3623
|
-
- regex: '; *(A2|A5|A8|A900)_?(Classic)
|
3878
|
+
- regex: '; *(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
|
3624
3879
|
device_replacement: '$1 $2'
|
3625
3880
|
brand_replacement: 'Qmobile'
|
3626
3881
|
model_replacement: '$1 $2'
|
3627
|
-
- regex: '; *(Q[Mm]obile)_([^_]+)_([^_]
|
3882
|
+
- regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
|
3628
3883
|
device_replacement: 'Qmobile $2 $3'
|
3629
3884
|
brand_replacement: 'Qmobile'
|
3630
3885
|
model_replacement: '$2 $3'
|
3631
|
-
- regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]
|
3886
|
+
- regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+?)(?: Build|\) AppleWebKit)'
|
3632
3887
|
device_replacement: 'Qmobile $2'
|
3633
3888
|
brand_replacement: 'Qmobile'
|
3634
3889
|
model_replacement: '$2'
|
@@ -3637,11 +3892,11 @@ device_parsers:
|
|
3637
3892
|
# Qmobilevn
|
3638
3893
|
# @ref: http://qmobile.vn/san-pham.html
|
3639
3894
|
#########
|
3640
|
-
- regex: '; *(Q\-Smart)[ _]([^;/]
|
3895
|
+
- regex: '; *(Q\-Smart)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
3641
3896
|
device_replacement: '$1 $2'
|
3642
3897
|
brand_replacement: 'Qmobilevn'
|
3643
3898
|
model_replacement: '$2'
|
3644
|
-
- regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]
|
3899
|
+
- regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+?)(?: Build|\) AppleWebKit)'
|
3645
3900
|
device_replacement: '$1 $2'
|
3646
3901
|
brand_replacement: 'Qmobilevn'
|
3647
3902
|
model_replacement: '$2'
|
@@ -3650,7 +3905,7 @@ device_parsers:
|
|
3650
3905
|
# Quanta
|
3651
3906
|
# @ref: ?
|
3652
3907
|
#########
|
3653
|
-
- regex: '; *(TA1013) Build'
|
3908
|
+
- regex: '; *(TA1013)(?: Build|\) AppleWebKit)'
|
3654
3909
|
device_replacement: '$1'
|
3655
3910
|
brand_replacement: 'Quanta'
|
3656
3911
|
model_replacement: '$1'
|
@@ -3659,11 +3914,11 @@ device_parsers:
|
|
3659
3914
|
# RCA
|
3660
3915
|
# @ref: http://rcamobilephone.com/
|
3661
3916
|
#########
|
3662
|
-
- regex: '; (RCT\w+) Build
|
3917
|
+
- regex: '; (RCT\w+)(?: Build|\) AppleWebKit)'
|
3663
3918
|
device_replacement: '$1'
|
3664
3919
|
brand_replacement: 'RCA'
|
3665
3920
|
model_replacement: '$1'
|
3666
|
-
- regex: '; RCA (\w+) Build
|
3921
|
+
- regex: '; RCA (\w+)(?: Build|\) AppleWebKit)'
|
3667
3922
|
device_replacement: 'RCA $1'
|
3668
3923
|
brand_replacement: 'RCA'
|
3669
3924
|
model_replacement: '$1'
|
@@ -3673,7 +3928,7 @@ device_parsers:
|
|
3673
3928
|
# @ref: http://www.rock-chips.com/a/cn/product/index.html
|
3674
3929
|
# @note: manufacturer sells chipsets - I assume that these UAs are dev-boards
|
3675
3930
|
#########
|
3676
|
-
- regex: '; *(RK\d+),? Build
|
3931
|
+
- regex: '; *(RK\d+),?(?: Build|\) AppleWebKit)'
|
3677
3932
|
device_replacement: '$1'
|
3678
3933
|
brand_replacement: 'Rockchip'
|
3679
3934
|
model_replacement: '$1'
|
@@ -3686,11 +3941,11 @@ device_parsers:
|
|
3686
3941
|
# Samsung Android Devices
|
3687
3942
|
# @ref: http://www.samsung.com/us/mobile/cell-phones/all-products
|
3688
3943
|
#########
|
3689
|
-
- regex: '; *(SAMSUNG |Samsung )
|
3944
|
+
- regex: '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
|
3690
3945
|
device_replacement: 'Samsung $1$2'
|
3691
3946
|
brand_replacement: 'Samsung'
|
3692
3947
|
model_replacement: '$2'
|
3693
|
-
- regex: '; *(Google )
|
3948
|
+
- regex: '; *(Google |)(Nexus [Ss](?: 4G|)) Build/'
|
3694
3949
|
device_replacement: 'Samsung $1$2'
|
3695
3950
|
brand_replacement: 'Samsung'
|
3696
3951
|
model_replacement: '$2'
|
@@ -3698,15 +3953,15 @@ device_parsers:
|
|
3698
3953
|
device_replacement: 'Samsung $2'
|
3699
3954
|
brand_replacement: 'Samsung'
|
3700
3955
|
model_replacement: '$2'
|
3701
|
-
- regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G)
|
3956
|
+
- regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
|
3702
3957
|
device_replacement: 'Samsung $1'
|
3703
3958
|
brand_replacement: 'Samsung'
|
3704
3959
|
model_replacement: '$1'
|
3705
|
-
- regex: '; *(SAMSUNG[ _\-]
|
3960
|
+
- regex: '; *(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]+) Build'
|
3706
3961
|
device_replacement: 'Samsung $2'
|
3707
3962
|
brand_replacement: 'Samsung'
|
3708
3963
|
model_replacement: '$2'
|
3709
|
-
- regex: '; *(SAMSUNG
|
3964
|
+
- regex: '; *(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
|
3710
3965
|
device_replacement: 'Samsung $1$2$3'
|
3711
3966
|
brand_replacement: 'Samsung'
|
3712
3967
|
model_replacement: '$2'
|
@@ -3718,11 +3973,15 @@ device_parsers:
|
|
3718
3973
|
device_replacement: 'Samsung $1$2'
|
3719
3974
|
brand_replacement: 'Samsung'
|
3720
3975
|
model_replacement: '$2'
|
3721
|
-
- regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]
|
3976
|
+
- regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
|
3977
|
+
device_replacement: 'Samsung $1'
|
3978
|
+
brand_replacement: 'Samsung'
|
3979
|
+
model_replacement: '$1'
|
3980
|
+
- regex: '; *((?:SC)\-[A-Za-z0-9 ]+)(/?[^ ]*|)\)'
|
3722
3981
|
device_replacement: 'Samsung $1'
|
3723
3982
|
brand_replacement: 'Samsung'
|
3724
3983
|
model_replacement: '$1'
|
3725
|
-
- regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]
|
3984
|
+
- regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
|
3726
3985
|
device_replacement: 'Samsung $1'
|
3727
3986
|
brand_replacement: 'Samsung'
|
3728
3987
|
model_replacement: '$1'
|
@@ -3730,17 +3989,21 @@ device_parsers:
|
|
3730
3989
|
device_replacement: 'Samsung $1'
|
3731
3990
|
brand_replacement: 'Samsung'
|
3732
3991
|
model_replacement: '$1'
|
3992
|
+
- regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
|
3993
|
+
device_replacement: 'Samsung $1'
|
3994
|
+
brand_replacement: 'Samsung'
|
3995
|
+
model_replacement: '$1'
|
3733
3996
|
|
3734
3997
|
#########
|
3735
3998
|
# Sharp
|
3736
3999
|
# @ref: http://www.sharp-phone.com/en/index.html
|
3737
4000
|
# @ref: http://www.android.com/devices/?country=all&m=sharp
|
3738
4001
|
#########
|
3739
|
-
- regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]
|
4002
|
+
- regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+?)(?: Build|\) AppleWebKit)'
|
3740
4003
|
device_replacement: '$1'
|
3741
4004
|
brand_replacement: 'Sharp'
|
3742
4005
|
model_replacement: '$1'
|
3743
|
-
- regex: '; *(SHARP[ -])([^;/]
|
4006
|
+
- regex: '; *(SHARP[ -])([^;/]+?)(?: Build|\) AppleWebKit)'
|
3744
4007
|
device_replacement: '$1$2'
|
3745
4008
|
brand_replacement: 'Sharp'
|
3746
4009
|
model_replacement: '$2'
|
@@ -3749,15 +4012,15 @@ device_parsers:
|
|
3749
4012
|
# Simvalley
|
3750
4013
|
# @ref: http://www.simvalley-mobile.de/
|
3751
4014
|
#########
|
3752
|
-
- regex: '; *(SPX[_\-]\d[^;/]*) Build
|
4015
|
+
- regex: '; *(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
|
3753
4016
|
device_replacement: '$1'
|
3754
4017
|
brand_replacement: 'Simvalley'
|
3755
4018
|
model_replacement: '$1'
|
3756
|
-
- regex: '; *(SX7\-PEARL\.GmbH) Build
|
4019
|
+
- regex: '; *(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
|
3757
4020
|
device_replacement: '$1'
|
3758
4021
|
brand_replacement: 'Simvalley'
|
3759
4022
|
model_replacement: '$1'
|
3760
|
-
- regex: '; *(SP[T]?\-\d{2}[^;/]*) Build
|
4023
|
+
- regex: '; *(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
|
3761
4024
|
device_replacement: '$1'
|
3762
4025
|
brand_replacement: 'Simvalley'
|
3763
4026
|
model_replacement: '$1'
|
@@ -3767,7 +4030,7 @@ device_parsers:
|
|
3767
4030
|
# @ref: http://www.sk-w.com/phone/phone_list.jsp
|
3768
4031
|
# @ref: http://www.android.com/devices/?country=all&m=sk-telesys
|
3769
4032
|
#########
|
3770
|
-
- regex: '; *(SK
|
4033
|
+
- regex: '; *(SK\-.*?)(?: Build|\) AppleWebKit)'
|
3771
4034
|
device_replacement: '$1'
|
3772
4035
|
brand_replacement: 'SKtelesys'
|
3773
4036
|
model_replacement: '$1'
|
@@ -3776,11 +4039,11 @@ device_parsers:
|
|
3776
4039
|
# Skytex
|
3777
4040
|
# @ref: http://skytex.com/android
|
3778
4041
|
#########
|
3779
|
-
- regex: '; *(?:SKYTEX|SX)-([^;/]
|
4042
|
+
- regex: '; *(?:SKYTEX|SX)-([^;/]+?)(?: Build|\) AppleWebKit)'
|
3780
4043
|
device_replacement: '$1'
|
3781
4044
|
brand_replacement: 'Skytex'
|
3782
4045
|
model_replacement: '$1'
|
3783
|
-
- regex: '; *(IMAGINE [^;/]
|
4046
|
+
- regex: '; *(IMAGINE [^;/]+?)(?: Build|\) AppleWebKit)'
|
3784
4047
|
device_replacement: '$1'
|
3785
4048
|
brand_replacement: 'Skytex'
|
3786
4049
|
model_replacement: '$1'
|
@@ -3790,7 +4053,7 @@ device_parsers:
|
|
3790
4053
|
# @ref: http://en.smartdevices.com.cn/Products/
|
3791
4054
|
# @models: Z8, X7, U7H, U7, T30, T20, Ten3, V5-II, T7-3G, SmartQ5, K7, S7, Q8, T19, Ten2, Ten, R10, T7, R7, V5, V7, SmartQ7
|
3792
4055
|
#########
|
3793
|
-
- regex: '; *(SmartQ) ?([^;/]
|
4056
|
+
- regex: '; *(SmartQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
|
3794
4057
|
device_replacement: '$1 $2'
|
3795
4058
|
brand_replacement: '$1'
|
3796
4059
|
model_replacement: '$2'
|
@@ -3800,7 +4063,7 @@ device_parsers:
|
|
3800
4063
|
# @ref: http://www.smartbitt.com/
|
3801
4064
|
# @missing: SBT Useragents
|
3802
4065
|
#########
|
3803
|
-
- regex: '; *(WF7C|WF10C|SBT[^;/]
|
4066
|
+
- regex: '; *(WF7C|WF10C|SBT[^;/]+?)(?: Build|\) AppleWebKit)'
|
3804
4067
|
device_replacement: '$1'
|
3805
4068
|
brand_replacement: 'Smartbitt'
|
3806
4069
|
model_replacement: '$1'
|
@@ -3843,7 +4106,7 @@ device_parsers:
|
|
3843
4106
|
device_replacement: 'Trekstor $1'
|
3844
4107
|
brand_replacement: 'Trekstor'
|
3845
4108
|
model_replacement: '$1'
|
3846
|
-
- regex: '; *(ST\d{4}
|
4109
|
+
- regex: '; *(ST\d{4}.*?)(?: Build|\) AppleWebKit)'
|
3847
4110
|
device_replacement: 'Trekstor $1'
|
3848
4111
|
brand_replacement: 'Trekstor'
|
3849
4112
|
model_replacement: '$1'
|
@@ -3859,7 +4122,7 @@ device_parsers:
|
|
3859
4122
|
device_replacement: '$1$2'
|
3860
4123
|
brand_replacement: 'SonyEricsson'
|
3861
4124
|
model_replacement: '$2'
|
3862
|
-
- regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o)
|
4125
|
+
- regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
|
3863
4126
|
device_replacement: '$1'
|
3864
4127
|
brand_replacement: 'SonyEricsson'
|
3865
4128
|
model_replacement: '$1'
|
@@ -3876,31 +4139,31 @@ device_parsers:
|
|
3876
4139
|
# @ref: http://www.sonymobile.com/global-en/products/phones/
|
3877
4140
|
# @ref: http://www.sony.jp/tablet/
|
3878
4141
|
#########
|
3879
|
-
- regex: '; Sony (Tablet[^;/]
|
4142
|
+
- regex: '; Sony (Tablet[^;/]+?)(?: Build|\) AppleWebKit)'
|
3880
4143
|
device_replacement: 'Sony $1'
|
3881
4144
|
brand_replacement: 'Sony'
|
3882
4145
|
model_replacement: '$1'
|
3883
|
-
- regex: '; Sony ([^;/]
|
4146
|
+
- regex: '; Sony ([^;/]+?)(?: Build|\) AppleWebKit)'
|
3884
4147
|
device_replacement: 'Sony $1'
|
3885
4148
|
brand_replacement: 'Sony'
|
3886
4149
|
model_replacement: '$1'
|
3887
|
-
- regex: '; *(Sony)([A-Za-z0-9\-]+) Build'
|
4150
|
+
- regex: '; *(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
|
3888
4151
|
device_replacement: '$1 $2'
|
3889
4152
|
brand_replacement: '$1'
|
3890
4153
|
model_replacement: '$2'
|
3891
|
-
- regex: '; *(Xperia [^;/]
|
4154
|
+
- regex: '; *(Xperia [^;/]+?)(?: Build|\) AppleWebKit)'
|
3892
4155
|
device_replacement: '$1'
|
3893
4156
|
brand_replacement: 'Sony'
|
3894
4157
|
model_replacement: '$1'
|
3895
|
-
- regex: '; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\d{3}|D6[56]\d{2}) Build'
|
4158
|
+
- regex: '; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\d{3}|D6[56]\d{2})(?: Build|\) AppleWebKit)'
|
3896
4159
|
device_replacement: '$1'
|
3897
4160
|
brand_replacement: 'Sony'
|
3898
4161
|
model_replacement: '$1'
|
3899
|
-
- regex: '; *(SGP\d{3}|SGPT\d{2}) Build'
|
4162
|
+
- regex: '; *(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
|
3900
4163
|
device_replacement: '$1'
|
3901
4164
|
brand_replacement: 'Sony'
|
3902
4165
|
model_replacement: '$1'
|
3903
|
-
- regex: '; *(NW-Z1000Series) Build'
|
4166
|
+
- regex: '; *(NW-Z1000Series)(?: Build|\) AppleWebKit)'
|
3904
4167
|
device_replacement: '$1'
|
3905
4168
|
brand_replacement: 'Sony'
|
3906
4169
|
model_replacement: '$1'
|
@@ -3923,7 +4186,7 @@ device_parsers:
|
|
3923
4186
|
# Spice
|
3924
4187
|
# @ref: http://www.spicemobilephones.co.in/
|
3925
4188
|
#########
|
3926
|
-
- regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]
|
4189
|
+
- regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
|
3927
4190
|
device_replacement: '$1$2$3$4'
|
3928
4191
|
brand_replacement: 'Spice'
|
3929
4192
|
model_replacement: 'Mi$4'
|
@@ -3945,7 +4208,7 @@ device_parsers:
|
|
3945
4208
|
# Tagi
|
3946
4209
|
# @ref: ??
|
3947
4210
|
#########
|
3948
|
-
- regex: '; *(TAGI[ ]?)(MID) ?([^;/]
|
4211
|
+
- regex: '; *(TAGI[ ]?)(MID) ?([^;/]+?)(?: Build|\) AppleWebKit)'
|
3949
4212
|
device_replacement: '$1$2$3'
|
3950
4213
|
brand_replacement: 'Tagi'
|
3951
4214
|
model_replacement: '$2$3'
|
@@ -3954,7 +4217,7 @@ device_parsers:
|
|
3954
4217
|
# Tecmobile
|
3955
4218
|
# @ref: http://www.tecmobile.com/
|
3956
4219
|
#########
|
3957
|
-
- regex: '; *(Oyster500|Opal 800) Build'
|
4220
|
+
- regex: '; *(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
|
3958
4221
|
device_replacement: 'Tecmobile $1'
|
3959
4222
|
brand_replacement: 'Tecmobile'
|
3960
4223
|
model_replacement: '$1'
|
@@ -3963,7 +4226,7 @@ device_parsers:
|
|
3963
4226
|
# Tecno
|
3964
4227
|
# @ref: www.tecno-mobile.com/
|
3965
4228
|
#########
|
3966
|
-
- regex: '; *(TECNO[ _])([^;/]
|
4229
|
+
- regex: '; *(TECNO[ _])([^;/]+?)(?: Build|\) AppleWebKit)'
|
3967
4230
|
device_replacement: '$1$2'
|
3968
4231
|
brand_replacement: 'Tecno'
|
3969
4232
|
model_replacement: '$2'
|
@@ -3983,7 +4246,7 @@ device_parsers:
|
|
3983
4246
|
# @ref: http://www.telstra.com.au/home-phone/thub-2/
|
3984
4247
|
# @ref: https://support.google.com/googleplay/answer/1727131?hl=en
|
3985
4248
|
#########
|
3986
|
-
- regex: '; *(T-Hub2) Build
|
4249
|
+
- regex: '; *(T-Hub2)(?: Build|\) AppleWebKit)'
|
3987
4250
|
device_replacement: '$1'
|
3988
4251
|
brand_replacement: 'Telstra'
|
3989
4252
|
model_replacement: '$1'
|
@@ -3992,7 +4255,7 @@ device_parsers:
|
|
3992
4255
|
# Terra
|
3993
4256
|
# @ref: http://www.wortmann.de/
|
3994
4257
|
#########
|
3995
|
-
- regex: '; *(PAD) ?(100[12]) Build
|
4258
|
+
- regex: '; *(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
|
3996
4259
|
device_replacement: 'Terra $1$2'
|
3997
4260
|
brand_replacement: 'Terra'
|
3998
4261
|
model_replacement: '$1$2'
|
@@ -4001,7 +4264,7 @@ device_parsers:
|
|
4001
4264
|
# Texet
|
4002
4265
|
# @ref: http://www.texet.ru/tablet/
|
4003
4266
|
#########
|
4004
|
-
- regex: '; *(T[BM]-\d{3}[^;/]
|
4267
|
+
- regex: '; *(T[BM]-\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
|
4005
4268
|
device_replacement: '$1'
|
4006
4269
|
brand_replacement: 'Texet'
|
4007
4270
|
model_replacement: '$1'
|
@@ -4010,7 +4273,7 @@ device_parsers:
|
|
4010
4273
|
# Thalia
|
4011
4274
|
# @ref: http://www.thalia.de/shop/tolino-shine-ereader/show/
|
4012
4275
|
#########
|
4013
|
-
- regex: '; *(tolino [^;/]
|
4276
|
+
- regex: '; *(tolino [^;/]+?)(?: Build|\) AppleWebKit)'
|
4014
4277
|
device_replacement: '$1'
|
4015
4278
|
brand_replacement: 'Thalia'
|
4016
4279
|
model_replacement: '$1'
|
@@ -4024,11 +4287,11 @@ device_parsers:
|
|
4024
4287
|
# @ref: http://en.thl.com.cn/Mobile
|
4025
4288
|
# @ref: http://thlmobilestore.com
|
4026
4289
|
#########
|
4027
|
-
- regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]
|
4290
|
+
- regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+?)(?: Build|\) AppleWebKit)'
|
4028
4291
|
device_replacement: '$1 $2'
|
4029
4292
|
brand_replacement: 'Thl'
|
4030
4293
|
model_replacement: '$2'
|
4031
|
-
- regex: '; *(T100|T200|T5|W100|W200|W8s) Build
|
4294
|
+
- regex: '; *(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
|
4032
4295
|
device_replacement: '$1'
|
4033
4296
|
brand_replacement: 'Thl'
|
4034
4297
|
model_replacement: '$1'
|
@@ -4062,7 +4325,7 @@ device_parsers:
|
|
4062
4325
|
device_replacement: '$1'
|
4063
4326
|
brand_replacement: 'HTC'
|
4064
4327
|
model_replacement: 'Dream'
|
4065
|
-
- regex: '\b(T-Mobile
|
4328
|
+
- regex: '\b(T-Mobile ?|)(myTouch)[ _]?([34]G)[ _]?([^\/]*) (?:Mozilla|Build)'
|
4066
4329
|
device_replacement: '$1$2 $3 $4'
|
4067
4330
|
brand_replacement: 'HTC'
|
4068
4331
|
model_replacement: '$2 $3 $4'
|
@@ -4079,7 +4342,7 @@ device_parsers:
|
|
4079
4342
|
# Tomtec
|
4080
4343
|
# @ref: http://www.tom-tec.eu/pages/tablets.php
|
4081
4344
|
#########
|
4082
|
-
- regex: ' (ATP[0-9]{4}) Build'
|
4345
|
+
- regex: ' (ATP[0-9]{4})(?: Build|\) AppleWebKit)'
|
4083
4346
|
device_replacement: '$1'
|
4084
4347
|
brand_replacement: 'Tomtec'
|
4085
4348
|
model_replacement: '$1'
|
@@ -4088,7 +4351,7 @@ device_parsers:
|
|
4088
4351
|
# Tooky
|
4089
4352
|
# @ref: http://www.tookymobile.com/
|
4090
4353
|
#########
|
4091
|
-
- regex: ' *(TOOKY)[ _\-]([^;/]
|
4354
|
+
- regex: ' *(TOOKY)[ _\-]([^;/]+?) ?(?:Build|;)'
|
4092
4355
|
regex_flag: 'i'
|
4093
4356
|
device_replacement: '$1 $2'
|
4094
4357
|
brand_replacement: 'Tooky'
|
@@ -4103,11 +4366,11 @@ device_parsers:
|
|
4103
4366
|
device_replacement: '$1'
|
4104
4367
|
brand_replacement: 'Toshiba'
|
4105
4368
|
model_replacement: 'Folio 100'
|
4106
|
-
- regex: '; *([Ff]olio ?100) Build
|
4369
|
+
- regex: '; *([Ff]olio ?100)(?: Build|\) AppleWebKit)'
|
4107
4370
|
device_replacement: '$1'
|
4108
4371
|
brand_replacement: 'Toshiba'
|
4109
4372
|
model_replacement: 'Folio 100'
|
4110
|
-
- regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a)
|
4373
|
+
- regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
|
4111
4374
|
device_replacement: 'Toshiba $1'
|
4112
4375
|
brand_replacement: 'Toshiba'
|
4113
4376
|
model_replacement: '$1'
|
@@ -4116,12 +4379,12 @@ device_parsers:
|
|
4116
4379
|
# Touchmate
|
4117
4380
|
# @ref: http://touchmatepc.com/new/
|
4118
4381
|
#########
|
4119
|
-
- regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750) Build'
|
4382
|
+
- regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
|
4120
4383
|
device_replacement: '$1'
|
4121
4384
|
brand_replacement: 'Touchmate'
|
4122
4385
|
model_replacement: '$1'
|
4123
4386
|
# @todo: needs verification user-agents missing
|
4124
|
-
- regex: '; *(TM-SM\d+[^;/]
|
4387
|
+
- regex: '; *(TM-SM\d+[^;/]+?)(?: Build|\) AppleWebKit)'
|
4125
4388
|
device_replacement: '$1'
|
4126
4389
|
brand_replacement: 'Touchmate'
|
4127
4390
|
model_replacement: '$1'
|
@@ -4130,11 +4393,11 @@ device_parsers:
|
|
4130
4393
|
# Treq
|
4131
4394
|
# @ref: http://www.treq.co.id/product
|
4132
4395
|
#########
|
4133
|
-
- regex: '; *(A10 [Bb]asic2?) Build
|
4396
|
+
- regex: '; *(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
|
4134
4397
|
device_replacement: '$1'
|
4135
4398
|
brand_replacement: 'Treq'
|
4136
4399
|
model_replacement: '$1'
|
4137
|
-
- regex: '; *(TREQ[ _\-])([^;/]
|
4400
|
+
- regex: '; *(TREQ[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
|
4138
4401
|
regex_flag: 'i'
|
4139
4402
|
device_replacement: '$1$2'
|
4140
4403
|
brand_replacement: 'Treq'
|
@@ -4146,12 +4409,12 @@ device_parsers:
|
|
4146
4409
|
# @models: A936|A603|X-5|X-3
|
4147
4410
|
#########
|
4148
4411
|
# @todo: guessed markers
|
4149
|
-
- regex: '; *(X-?5|X-?3) Build
|
4412
|
+
- regex: '; *(X-?5|X-?3)(?: Build|\) AppleWebKit)'
|
4150
4413
|
device_replacement: '$1'
|
4151
4414
|
brand_replacement: 'Umeox'
|
4152
4415
|
model_replacement: '$1'
|
4153
4416
|
# @todo: guessed markers
|
4154
|
-
- regex: '; *(A502\+?|A936|A603|X1|X2) Build
|
4417
|
+
- regex: '; *(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
|
4155
4418
|
device_replacement: '$1'
|
4156
4419
|
brand_replacement: 'Umeox'
|
4157
4420
|
model_replacement: '$1'
|
@@ -4160,7 +4423,7 @@ device_parsers:
|
|
4160
4423
|
# Versus
|
4161
4424
|
# @ref: http://versusuk.com/support.html
|
4162
4425
|
#########
|
4163
|
-
- regex: '(TOUCH(?:TAB|PAD).+?) Build
|
4426
|
+
- regex: '(TOUCH(?:TAB|PAD).+?)(?: Build|\) AppleWebKit)'
|
4164
4427
|
regex_flag: 'i'
|
4165
4428
|
device_replacement: 'Versus $1'
|
4166
4429
|
brand_replacement: 'Versus'
|
@@ -4170,7 +4433,7 @@ device_parsers:
|
|
4170
4433
|
# Vertu
|
4171
4434
|
# @ref: http://www.vertu.com/
|
4172
4435
|
#########
|
4173
|
-
- regex: '(VERTU) ([^;/]
|
4436
|
+
- regex: '(VERTU) ([^;/]+?)(?: Build|\) AppleWebKit)'
|
4174
4437
|
device_replacement: '$1 $2'
|
4175
4438
|
brand_replacement: 'Vertu'
|
4176
4439
|
model_replacement: '$2'
|
@@ -4179,11 +4442,11 @@ device_parsers:
|
|
4179
4442
|
# Videocon
|
4180
4443
|
# @ref: http://www.videoconmobiles.com
|
4181
4444
|
#########
|
4182
|
-
- regex: '; *(Videocon)[ _\-]([^;/]
|
4445
|
+
- regex: '; *(Videocon)[ _\-]([^;/]+?) *(?:Build|;)'
|
4183
4446
|
device_replacement: '$1 $2'
|
4184
4447
|
brand_replacement: 'Videocon'
|
4185
4448
|
model_replacement: '$2'
|
4186
|
-
- regex: ' (VT\d{2}[A-Za-z]*) Build'
|
4449
|
+
- regex: ' (VT\d{2}[A-Za-z]*)(?: Build|\) AppleWebKit)'
|
4187
4450
|
device_replacement: '$1'
|
4188
4451
|
brand_replacement: 'Videocon'
|
4189
4452
|
model_replacement: '$1'
|
@@ -4192,15 +4455,15 @@ device_parsers:
|
|
4192
4455
|
# Viewsonic
|
4193
4456
|
# @ref: http://viewsonic.com
|
4194
4457
|
#########
|
4195
|
-
- regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]
|
4458
|
+
- regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+?)(?: Build|\) AppleWebKit)'
|
4196
4459
|
device_replacement: '$1'
|
4197
4460
|
brand_replacement: 'Viewsonic'
|
4198
4461
|
model_replacement: '$1'
|
4199
|
-
- regex: '; *(ViewSonic-)([^;/]
|
4462
|
+
- regex: '; *(ViewSonic-)([^;/]+?)(?: Build|\) AppleWebKit)'
|
4200
4463
|
device_replacement: '$1$2'
|
4201
4464
|
brand_replacement: 'Viewsonic'
|
4202
4465
|
model_replacement: '$2'
|
4203
|
-
- regex: '; *(GTablet
|
4466
|
+
- regex: '; *(GTablet.*?)(?: Build|\) AppleWebKit)'
|
4204
4467
|
device_replacement: '$1'
|
4205
4468
|
brand_replacement: 'Viewsonic'
|
4206
4469
|
model_replacement: '$1'
|
@@ -4209,7 +4472,7 @@ device_parsers:
|
|
4209
4472
|
# vivo
|
4210
4473
|
# @ref: http://vivo.cn/
|
4211
4474
|
#########
|
4212
|
-
- regex: '; *([Vv]ivo)[ _]([^;/]
|
4475
|
+
- regex: '; *([Vv]ivo)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
4213
4476
|
device_replacement: '$1 $2'
|
4214
4477
|
brand_replacement: 'vivo'
|
4215
4478
|
model_replacement: '$2'
|
@@ -4218,7 +4481,7 @@ device_parsers:
|
|
4218
4481
|
# Vodafone (Operator Branded Devices)
|
4219
4482
|
# @ref: ??
|
4220
4483
|
#########
|
4221
|
-
- regex: '(Vodafone) (
|
4484
|
+
- regex: '(Vodafone) (.*?)(?: Build|\) AppleWebKit)'
|
4222
4485
|
device_replacement: '$1 $2'
|
4223
4486
|
brand_replacement: '$1'
|
4224
4487
|
model_replacement: '$2'
|
@@ -4227,7 +4490,7 @@ device_parsers:
|
|
4227
4490
|
# Walton
|
4228
4491
|
# @ref: http://www.waltonbd.com/
|
4229
4492
|
#########
|
4230
|
-
- regex: '; *(?:Walton[ _\-])
|
4493
|
+
- regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
|
4231
4494
|
regex_flag: 'i'
|
4232
4495
|
device_replacement: 'Walton $1'
|
4233
4496
|
brand_replacement: 'Walton'
|
@@ -4237,7 +4500,7 @@ device_parsers:
|
|
4237
4500
|
# Wiko
|
4238
4501
|
# @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
|
4239
4502
|
#########
|
4240
|
-
- regex: '; *(?:WIKO[ \-])
|
4503
|
+
- regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+?)(?: Build|\) AppleWebKit)'
|
4241
4504
|
regex_flag: 'i'
|
4242
4505
|
device_replacement: 'Wiko $1'
|
4243
4506
|
brand_replacement: 'Wiko'
|
@@ -4247,7 +4510,7 @@ device_parsers:
|
|
4247
4510
|
# WellcoM
|
4248
4511
|
# @ref: ??
|
4249
4512
|
#########
|
4250
|
-
- regex: '; *WellcoM-([^;/]
|
4513
|
+
- regex: '; *WellcoM-([^;/]+?)(?: Build|\) AppleWebKit)'
|
4251
4514
|
device_replacement: 'Wellcom $1'
|
4252
4515
|
brand_replacement: 'Wellcom'
|
4253
4516
|
model_replacement: '$1'
|
@@ -4265,7 +4528,7 @@ device_parsers:
|
|
4265
4528
|
# Wolfgang
|
4266
4529
|
# @ref: http://wolfgangmobile.com/
|
4267
4530
|
#########
|
4268
|
-
- regex: '; *(AT-AS[^;/]
|
4531
|
+
- regex: '; *(AT-AS[^;/]+?)(?: Build|\) AppleWebKit)'
|
4269
4532
|
device_replacement: 'Wolfgang $1'
|
4270
4533
|
brand_replacement: 'Wolfgang'
|
4271
4534
|
model_replacement: '$1'
|
@@ -4274,7 +4537,7 @@ device_parsers:
|
|
4274
4537
|
# Woxter
|
4275
4538
|
# @ref: http://www.woxter.es/es-es/categories/index
|
4276
4539
|
#########
|
4277
|
-
- regex: '; *(?:Woxter|Wxt) ([^;/]
|
4540
|
+
- regex: '; *(?:Woxter|Wxt) ([^;/]+?)(?: Build|\) AppleWebKit)'
|
4278
4541
|
device_replacement: 'Woxter $1'
|
4279
4542
|
brand_replacement: 'Woxter'
|
4280
4543
|
model_replacement: '$1'
|
@@ -4283,7 +4546,7 @@ device_parsers:
|
|
4283
4546
|
# Yarvik Zania
|
4284
4547
|
# @ref: http://yarvik.com
|
4285
4548
|
#########
|
4286
|
-
- regex: '; *(?:Xenta |Luna )
|
4549
|
+
- regex: '; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3})(?: Build|\) AppleWebKit)'
|
4287
4550
|
device_replacement: 'Yarvik $1'
|
4288
4551
|
brand_replacement: 'Yarvik'
|
4289
4552
|
model_replacement: '$1'
|
@@ -4306,7 +4569,19 @@ device_parsers:
|
|
4306
4569
|
# XiaoMi
|
4307
4570
|
# @ref: http://www.xiaomi.com/event/buyphone
|
4308
4571
|
#########
|
4309
|
-
- regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note )
|
4572
|
+
- regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
|
4573
|
+
device_replacement: 'XiaoMi $1'
|
4574
|
+
brand_replacement: 'XiaoMi'
|
4575
|
+
model_replacement: '$1'
|
4576
|
+
- regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
|
4577
|
+
device_replacement: 'XiaoMi $1'
|
4578
|
+
brand_replacement: 'XiaoMi'
|
4579
|
+
model_replacement: '$1'
|
4580
|
+
- regex: '; *(MIX) (Build|MIUI)/'
|
4581
|
+
device_replacement: 'XiaoMi $1'
|
4582
|
+
brand_replacement: 'XiaoMi'
|
4583
|
+
model_replacement: '$1'
|
4584
|
+
- regex: '; *((MIX) ([^;/]*)) (Build|MIUI)/'
|
4310
4585
|
device_replacement: 'XiaoMi $1'
|
4311
4586
|
brand_replacement: 'XiaoMi'
|
4312
4587
|
model_replacement: '$1'
|
@@ -4315,17 +4590,17 @@ device_parsers:
|
|
4315
4590
|
# Xolo
|
4316
4591
|
# @ref: http://www.xolo.in/
|
4317
4592
|
#########
|
4318
|
-
- regex: '; *XOLO[ _]([^;/]*tab.*) Build'
|
4593
|
+
- regex: '; *XOLO[ _]([^;/]*tab.*)(?: Build|\) AppleWebKit)'
|
4319
4594
|
regex_flag: 'i'
|
4320
4595
|
device_replacement: 'Xolo $1'
|
4321
4596
|
brand_replacement: 'Xolo'
|
4322
4597
|
model_replacement: '$1'
|
4323
|
-
- regex: '; *XOLO[ _]([^;/]
|
4598
|
+
- regex: '; *XOLO[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
|
4324
4599
|
regex_flag: 'i'
|
4325
4600
|
device_replacement: 'Xolo $1'
|
4326
4601
|
brand_replacement: 'Xolo'
|
4327
4602
|
model_replacement: '$1'
|
4328
|
-
- regex: '; *(q\d0{2,3}[a-z]?) Build'
|
4603
|
+
- regex: '; *(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
|
4329
4604
|
regex_flag: 'i'
|
4330
4605
|
device_replacement: 'Xolo $1'
|
4331
4606
|
brand_replacement: 'Xolo'
|
@@ -4335,7 +4610,7 @@ device_parsers:
|
|
4335
4610
|
# Xoro
|
4336
4611
|
# @ref: http://www.xoro.de/produkte/
|
4337
4612
|
#########
|
4338
|
-
- regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/]) Build'
|
4613
|
+
- regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
|
4339
4614
|
device_replacement: 'Xoro $1'
|
4340
4615
|
brand_replacement: 'Xoro'
|
4341
4616
|
model_replacement: '$1'
|
@@ -4344,7 +4619,7 @@ device_parsers:
|
|
4344
4619
|
# Zopo
|
4345
4620
|
# @ref: http://www.zopomobiles.com/products.html
|
4346
4621
|
#########
|
4347
|
-
- regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]
|
4622
|
+
- regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+?)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
|
4348
4623
|
device_replacement: '$1$2$3'
|
4349
4624
|
brand_replacement: 'Zopo'
|
4350
4625
|
model_replacement: '$1$2$3'
|
@@ -4353,11 +4628,11 @@ device_parsers:
|
|
4353
4628
|
# ZiiLabs
|
4354
4629
|
# @ref: http://www.ziilabs.com/products/platforms/androidreferencetablets.php
|
4355
4630
|
#########
|
4356
|
-
- regex: '; *(ZiiLABS) (Zii[^;/]*) Build'
|
4631
|
+
- regex: '; *(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
|
4357
4632
|
device_replacement: '$1 $2'
|
4358
4633
|
brand_replacement: 'ZiiLabs'
|
4359
4634
|
model_replacement: '$2'
|
4360
|
-
- regex: '; *(Zii)_([^;/]*) Build'
|
4635
|
+
- regex: '; *(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
|
4361
4636
|
device_replacement: '$1 $2'
|
4362
4637
|
brand_replacement: 'ZiiLabs'
|
4363
4638
|
model_replacement: '$2'
|
@@ -4366,40 +4641,40 @@ device_parsers:
|
|
4366
4641
|
# ZTE
|
4367
4642
|
# @ref: http://www.ztedevices.com/
|
4368
4643
|
#########
|
4369
|
-
- regex: '; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]
|
4644
|
+
- regex: '; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]*?|Era|Memo[^;]*?)|JOE|(?:Kis|KIS)\b[^;]*?|Libra|Light [^;]*?|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]*?|RacerII|RACERII|San Francisco[^;]*?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\) AppleWebKit)'
|
4370
4645
|
device_replacement: '$1'
|
4371
4646
|
brand_replacement: 'ZTE'
|
4372
4647
|
model_replacement: '$1'
|
4373
|
-
- regex: '; *([A-Z]\d+)_USA_[^;]* Build'
|
4648
|
+
- regex: '; *([A-Z]\d+)_USA_[^;]*(?: Build|\) AppleWebKit)'
|
4374
4649
|
device_replacement: '$1'
|
4375
4650
|
brand_replacement: 'ZTE'
|
4376
4651
|
model_replacement: '$1'
|
4377
|
-
- regex: '; *(SmartTab\d+)[^;]* Build'
|
4652
|
+
- regex: '; *(SmartTab\d+)[^;]*(?: Build|\) AppleWebKit)'
|
4378
4653
|
device_replacement: '$1'
|
4379
4654
|
brand_replacement: 'ZTE'
|
4380
4655
|
model_replacement: '$1'
|
4381
|
-
- regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*) Build'
|
4656
|
+
- regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
|
4382
4657
|
device_replacement: 'ZTE Blade$1'
|
4383
4658
|
brand_replacement: 'ZTE'
|
4384
4659
|
model_replacement: 'Blade$1'
|
4385
|
-
- regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*) Build'
|
4660
|
+
- regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
|
4386
4661
|
device_replacement: 'ZTE Skate$1'
|
4387
4662
|
brand_replacement: 'ZTE'
|
4388
4663
|
model_replacement: 'Skate$1'
|
4389
|
-
- regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco) Build'
|
4664
|
+
- regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
|
4390
4665
|
device_replacement: '$1$2'
|
4391
4666
|
brand_replacement: 'ZTE'
|
4392
4667
|
model_replacement: '$1$2'
|
4393
|
-
- regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]
|
4668
|
+
- regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+?)(?: Build|\) AppleWebKit)'
|
4394
4669
|
device_replacement: 'ZTE $1'
|
4395
4670
|
brand_replacement: 'ZTE'
|
4396
4671
|
model_replacement: '$1'
|
4397
4672
|
# operator specific
|
4398
|
-
- regex: '; (BASE) (lutea|Lutea 2|Tab[^;]
|
4673
|
+
- regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*?)(?: Build|\) AppleWebKit)'
|
4399
4674
|
device_replacement: '$1 $2'
|
4400
4675
|
brand_replacement: 'ZTE'
|
4401
4676
|
model_replacement: '$1 $2'
|
4402
|
-
- regex: '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link) Build'
|
4677
|
+
- regex: '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link)(?: Build|\) AppleWebKit)'
|
4403
4678
|
regex_flag: 'i'
|
4404
4679
|
device_replacement: '$1'
|
4405
4680
|
brand_replacement: 'ZTE'
|
@@ -4413,7 +4688,7 @@ device_parsers:
|
|
4413
4688
|
# Zync
|
4414
4689
|
# @ref: http://www.zync.in/index.php/our-products/tablet-phablets
|
4415
4690
|
##########
|
4416
|
-
- regex: '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900) Build
|
4691
|
+
- regex: '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900)(?: Build|\) AppleWebKit)'
|
4417
4692
|
device_replacement: '$1'
|
4418
4693
|
brand_replacement: 'Zync'
|
4419
4694
|
model_replacement: '$1'
|
@@ -4472,7 +4747,7 @@ device_parsers:
|
|
4472
4747
|
device_replacement: 'Kindle'
|
4473
4748
|
brand_replacement: 'Amazon'
|
4474
4749
|
model_replacement: 'Kindle'
|
4475
|
-
- regex: '; ?(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))
|
4750
|
+
- regex: '; ?(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|) Build\b'
|
4476
4751
|
device_replacement: 'Kindle Fire'
|
4477
4752
|
brand_replacement: 'Amazon'
|
4478
4753
|
model_replacement: 'Kindle Fire$2'
|
@@ -4524,7 +4799,7 @@ device_parsers:
|
|
4524
4799
|
#########
|
4525
4800
|
# Alcatel Windows Phones
|
4526
4801
|
#########
|
4527
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4802
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\)]+)'
|
4528
4803
|
device_replacement: 'Alcatel $1'
|
4529
4804
|
brand_replacement: 'Alcatel'
|
4530
4805
|
model_replacement: '$1'
|
@@ -4532,8 +4807,8 @@ device_parsers:
|
|
4532
4807
|
#########
|
4533
4808
|
# Asus Windows Phones
|
4534
4809
|
#########
|
4535
|
-
#~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest;
|
4536
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest;
|
4810
|
+
#~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
|
4811
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
|
4537
4812
|
device_replacement: 'Asus $1'
|
4538
4813
|
brand_replacement: 'Asus'
|
4539
4814
|
model_replacement: '$1'
|
@@ -4541,7 +4816,7 @@ device_parsers:
|
|
4541
4816
|
#########
|
4542
4817
|
# Dell Windows Phones
|
4543
4818
|
#########
|
4544
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4819
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\)]+)'
|
4545
4820
|
device_replacement: 'Dell $1'
|
4546
4821
|
brand_replacement: 'Dell'
|
4547
4822
|
model_replacement: '$1'
|
@@ -4549,7 +4824,7 @@ device_parsers:
|
|
4549
4824
|
#########
|
4550
4825
|
# HTC Windows Phones
|
4551
4826
|
#########
|
4552
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest;
|
4827
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\)]+)'
|
4553
4828
|
device_replacement: 'HTC $1'
|
4554
4829
|
brand_replacement: 'HTC'
|
4555
4830
|
model_replacement: '$1'
|
@@ -4557,7 +4832,7 @@ device_parsers:
|
|
4557
4832
|
#########
|
4558
4833
|
# Huawei Windows Phones
|
4559
4834
|
#########
|
4560
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4835
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\)]+)'
|
4561
4836
|
device_replacement: 'Huawei $1'
|
4562
4837
|
brand_replacement: 'Huawei'
|
4563
4838
|
model_replacement: '$1'
|
@@ -4565,7 +4840,7 @@ device_parsers:
|
|
4565
4840
|
#########
|
4566
4841
|
# LG Windows Phones
|
4567
4842
|
#########
|
4568
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4843
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \-]|)([^;,\)]+)'
|
4569
4844
|
device_replacement: 'LG $1'
|
4570
4845
|
brand_replacement: 'LG'
|
4571
4846
|
model_replacement: '$1'
|
@@ -4573,15 +4848,15 @@ device_parsers:
|
|
4573
4848
|
#########
|
4574
4849
|
# Noka Windows Phones
|
4575
4850
|
#########
|
4576
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4851
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
|
4577
4852
|
device_replacement: 'Lumia $1'
|
4578
4853
|
brand_replacement: 'Nokia'
|
4579
4854
|
model_replacement: 'Lumia $1'
|
4580
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4855
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
|
4581
4856
|
device_replacement: 'Nokia $1'
|
4582
4857
|
brand_replacement: 'Nokia'
|
4583
4858
|
model_replacement: '$1'
|
4584
|
-
- regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch;
|
4859
|
+
- regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
|
4585
4860
|
device_replacement: 'Nokia $1'
|
4586
4861
|
brand_replacement: 'Nokia'
|
4587
4862
|
model_replacement: '$1'
|
@@ -4589,7 +4864,7 @@ device_parsers:
|
|
4589
4864
|
#########
|
4590
4865
|
# Microsoft Windows Phones
|
4591
4866
|
#########
|
4592
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4867
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\)]+)'
|
4593
4868
|
device_replacement: 'Microsoft $1'
|
4594
4869
|
brand_replacement: 'Microsoft'
|
4595
4870
|
model_replacement: '$1'
|
@@ -4597,7 +4872,7 @@ device_parsers:
|
|
4597
4872
|
#########
|
4598
4873
|
# Samsung Windows Phones
|
4599
4874
|
#########
|
4600
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest;
|
4875
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\.\)]+)'
|
4601
4876
|
device_replacement: 'Samsung $1'
|
4602
4877
|
brand_replacement: 'Samsung'
|
4603
4878
|
model_replacement: '$1'
|
@@ -4605,7 +4880,7 @@ device_parsers:
|
|
4605
4880
|
#########
|
4606
4881
|
# Toshiba Windows Phones
|
4607
4882
|
#########
|
4608
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest;
|
4883
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)'
|
4609
4884
|
device_replacement: 'Toshiba $1'
|
4610
4885
|
brand_replacement: 'Toshiba'
|
4611
4886
|
model_replacement: '$1'
|
@@ -4613,7 +4888,7 @@ device_parsers:
|
|
4613
4888
|
#########
|
4614
4889
|
# Generic Windows Phones
|
4615
4890
|
#########
|
4616
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest;
|
4891
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\)]+)'
|
4617
4892
|
device_replacement: '$1 $2'
|
4618
4893
|
brand_replacement: '$1'
|
4619
4894
|
model_replacement: '$2'
|
@@ -4633,7 +4908,7 @@ device_parsers:
|
|
4633
4908
|
#########
|
4634
4909
|
# Firefox OS
|
4635
4910
|
#########
|
4636
|
-
- regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]
|
4911
|
+
- regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+?)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
|
4637
4912
|
device_replacement: 'Alcatel $1 $2 $3'
|
4638
4913
|
brand_replacement: 'Alcatel'
|
4639
4914
|
model_replacement: 'One Touch $3'
|
@@ -4642,11 +4917,27 @@ device_parsers:
|
|
4642
4917
|
brand_replacement: 'ZTE'
|
4643
4918
|
model_replacement: '$1$2'
|
4644
4919
|
|
4920
|
+
#########
|
4921
|
+
# KaiOS
|
4922
|
+
#########
|
4923
|
+
- regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KaiOS/'
|
4924
|
+
device_replacement: 'Alcatel $1'
|
4925
|
+
brand_replacement: 'Alcatel'
|
4926
|
+
model_replacement: '$1'
|
4927
|
+
- regex: '\(Mobile; LYF\/([A-Za-z0-9\-]+)\/.+;.+rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
|
4928
|
+
device_replacement: 'LYF $1'
|
4929
|
+
brand_replacement: 'LYF'
|
4930
|
+
model_replacement: '$1'
|
4931
|
+
- regex: '\(Mobile; Nokia_([A-Za-z0-9\-]+)_.+; rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
|
4932
|
+
device_replacement: 'Nokia $1'
|
4933
|
+
brand_replacement: 'Nokia'
|
4934
|
+
model_replacement: '$1'
|
4935
|
+
|
4645
4936
|
##########
|
4646
4937
|
# NOKIA
|
4647
4938
|
# @note: NokiaN8-00 comes before iphone. Sometimes spoofs iphone
|
4648
4939
|
##########
|
4649
|
-
- regex: 'Nokia(N[0-9]+)([A-z_\-][A-z0-9_\-]*)'
|
4940
|
+
- regex: 'Nokia(N[0-9]+)([A-Za-z_\-][A-Za-z0-9_\-]*)'
|
4650
4941
|
device_replacement: 'Nokia $1'
|
4651
4942
|
brand_replacement: 'Nokia'
|
4652
4943
|
model_replacement: '$1$2'
|
@@ -4659,12 +4950,12 @@ device_parsers:
|
|
4659
4950
|
brand_replacement: 'Nokia'
|
4660
4951
|
model_replacement: 'Lumia $1'
|
4661
4952
|
# UCWEB Browser on Symbian
|
4662
|
-
- regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]
|
4953
|
+
- regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+?)\)'
|
4663
4954
|
device_replacement: '$1 $2'
|
4664
4955
|
brand_replacement: '$1'
|
4665
4956
|
model_replacement: '$2'
|
4666
4957
|
# Nokia Symbian
|
4667
|
-
- regex: '\(Symbian(?:/3)
|
4958
|
+
- regex: '\(Symbian(?:/3|); U; ([^;]+);'
|
4668
4959
|
device_replacement: 'Nokia $1'
|
4669
4960
|
brand_replacement: 'Nokia'
|
4670
4961
|
model_replacement: '$1'
|
@@ -4709,7 +5000,7 @@ device_parsers:
|
|
4709
5000
|
device_replacement: 'Palm Treo $1'
|
4710
5001
|
brand_replacement: 'Palm'
|
4711
5002
|
model_replacement: 'Treo $1'
|
4712
|
-
- regex: 'webOS.*(P160U(?:NA)
|
5003
|
+
- regex: 'webOS.*(P160U(?:NA|))/(\d+).(\d+)'
|
4713
5004
|
device_replacement: 'HP Veer'
|
4714
5005
|
brand_replacement: 'HP'
|
4715
5006
|
model_replacement: 'Veer'
|
@@ -4768,6 +5059,10 @@ device_parsers:
|
|
4768
5059
|
device_replacement: '$1'
|
4769
5060
|
brand_replacement: 'Apple'
|
4770
5061
|
model_replacement: '$1'
|
5062
|
+
- regex: '(Watch)(\d+,\d+)'
|
5063
|
+
device_replacement: 'Apple $1'
|
5064
|
+
brand_replacement: 'Apple'
|
5065
|
+
model_replacement: '$1$2'
|
4771
5066
|
- regex: '(Apple Watch)(?:;| Simulator;)'
|
4772
5067
|
device_replacement: '$1'
|
4773
5068
|
brand_replacement: 'Apple'
|
@@ -4836,7 +5131,11 @@ device_parsers:
|
|
4836
5131
|
device_replacement: 'Asus $1'
|
4837
5132
|
brand_replacement: 'Asus'
|
4838
5133
|
model_replacement: '$1'
|
4839
|
-
- regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _])
|
5134
|
+
- regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
|
5135
|
+
device_replacement: 'Asus $1'
|
5136
|
+
brand_replacement: 'Asus'
|
5137
|
+
model_replacement: '$1'
|
5138
|
+
- regex: '(?:ASUS)_([A-Za-z0-9\-]+)'
|
4840
5139
|
device_replacement: 'Asus $1'
|
4841
5140
|
brand_replacement: 'Asus'
|
4842
5141
|
model_replacement: '$1'
|
@@ -4877,7 +5176,7 @@ device_parsers:
|
|
4877
5176
|
##########
|
4878
5177
|
# htc
|
4879
5178
|
##########
|
4880
|
-
- regex: '\b(?:HTC/|HTC/[a-z0-9]
|
5179
|
+
- regex: '\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
|
4881
5180
|
device_replacement: 'HTC $1'
|
4882
5181
|
brand_replacement: 'HTC'
|
4883
5182
|
model_replacement: '$1'
|
@@ -4893,6 +5192,10 @@ device_parsers:
|
|
4893
5192
|
device_replacement: 'Huawei $1'
|
4894
5193
|
brand_replacement: 'Huawei'
|
4895
5194
|
model_replacement: '$1'
|
5195
|
+
- regex: 'HUAWEI ([A-Za-z0-9\-]+)'
|
5196
|
+
device_replacement: 'Huawei $1'
|
5197
|
+
brand_replacement: 'Huawei'
|
5198
|
+
model_replacement: '$1'
|
4896
5199
|
- regex: 'vodafone([A-Za-z0-9]+)'
|
4897
5200
|
device_replacement: 'Huawei Vodafone $1'
|
4898
5201
|
brand_replacement: 'Huawei'
|
@@ -4930,22 +5233,22 @@ device_parsers:
|
|
4930
5233
|
# HbbTV (European and Australian standard)
|
4931
5234
|
# written before the LG regexes, as LG is making HbbTV too
|
4932
5235
|
##########
|
4933
|
-
- regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \(
|
5236
|
+
- regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \( ?;(LG)E ?;([^;]{0,30})'
|
4934
5237
|
device_replacement: '$1'
|
4935
5238
|
brand_replacement: '$2'
|
4936
5239
|
model_replacement: '$3'
|
4937
|
-
- regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor
|
5240
|
+
- regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/|)(THOM[^;]*?)[;\s].{0,30}(LF[^;]+);?'
|
4938
5241
|
device_replacement: '$1'
|
4939
5242
|
brand_replacement: 'Thomson'
|
4940
5243
|
model_replacement: '$4'
|
4941
|
-
- regex: '(HbbTV)(?:/1\.1\.1)?(?:
|
5244
|
+
- regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); *CE-HTML(?:/1\.\d|); *([^ ]+) ([^;]+);'
|
4942
5245
|
device_replacement: '$1'
|
4943
5246
|
brand_replacement: '$2'
|
4944
5247
|
model_replacement: '$3'
|
4945
5248
|
- regex: '(HbbTV)/1\.1\.1 \(;;;;;\) Maple_2011'
|
4946
5249
|
device_replacement: '$1'
|
4947
5250
|
brand_replacement: 'Samsung'
|
4948
|
-
- regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]
|
5251
|
+
- regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]{0,30}; ?(?:CUS:([^;]*)|([^;]+)) ?; ?([^;]{0,30})'
|
4949
5252
|
device_replacement: '$1'
|
4950
5253
|
brand_replacement: '$2$3'
|
4951
5254
|
model_replacement: '$4'
|
@@ -4955,7 +5258,7 @@ device_parsers:
|
|
4955
5258
|
##########
|
4956
5259
|
# LGE NetCast TV
|
4957
5260
|
##########
|
4958
|
-
- regex: 'LGE; (?:Media
|
5261
|
+
- regex: 'LGE; (?:Media\/|)([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+'
|
4959
5262
|
device_replacement: 'NetCast$2'
|
4960
5263
|
brand_replacement: 'LG'
|
4961
5264
|
model_replacement: '$1'
|
@@ -4984,7 +5287,7 @@ device_parsers:
|
|
4984
5287
|
brand_replacement: '$1'
|
4985
5288
|
model_replacement: '$2'
|
4986
5289
|
# other LG phones
|
4987
|
-
- regex: '\b(?:LGE[ \-]LG\-(?:AX)
|
5290
|
+
- regex: '\b(?:LGE[ \-]LG\-(?:AX|)|LGE |LGE?-LG|LGE?[ \-]|LG[ /\-]|lg[\-])([A-Za-z0-9]+)\b'
|
4988
5291
|
device_replacement: 'LG $1'
|
4989
5292
|
brand_replacement: 'LG'
|
4990
5293
|
model_replacement: '$1'
|
@@ -5129,7 +5432,7 @@ device_parsers:
|
|
5129
5432
|
device_replacement: '$2 $1'
|
5130
5433
|
brand_replacement: '$2'
|
5131
5434
|
model_replacement: '$1'
|
5132
|
-
- regex: '(Sony)(?:BDP
|
5435
|
+
- regex: '(Sony)(?:BDP\/|\/|)([^ /;\)]+)[ /;\)]'
|
5133
5436
|
device_replacement: '$1 $2'
|
5134
5437
|
brand_replacement: '$1'
|
5135
5438
|
model_replacement: '$2'
|
@@ -5159,27 +5462,33 @@ device_parsers:
|
|
5159
5462
|
#########
|
5160
5463
|
# Android General Device Matching (far from perfect)
|
5161
5464
|
#########
|
5162
|
-
- regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+) Build[/ ]'
|
5465
|
+
- regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\))'
|
5163
5466
|
brand_replacement: 'Generic_Android'
|
5164
5467
|
model_replacement: '$1'
|
5165
|
-
- regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?) Build[/ ]'
|
5468
|
+
- regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\))'
|
5166
5469
|
brand_replacement: 'Generic_Android'
|
5167
5470
|
model_replacement: '$1'
|
5168
|
-
- regex: 'Android[\- ][\d]+(?:\.[\d]+)
|
5471
|
+
- regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?)( Build[/ ]|\))'
|
5169
5472
|
brand_replacement: 'Generic_Android'
|
5170
5473
|
model_replacement: '$1'
|
5171
|
-
- regex: 'Android[\- ][\d]+(?:\.[\d]+)
|
5474
|
+
- regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{0,2}\- *; *(.+?)( Build[/ ]|\))'
|
5172
5475
|
brand_replacement: 'Generic_Android'
|
5173
5476
|
model_replacement: '$1'
|
5174
5477
|
# No build info at all - "Build" follows locale immediately
|
5175
|
-
- regex: 'Android[\- ][\d]+(?:\.[\d]+)
|
5478
|
+
- regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
|
5176
5479
|
device_replacement: 'Generic Smartphone'
|
5177
5480
|
brand_replacement: 'Generic'
|
5178
5481
|
model_replacement: 'Smartphone'
|
5179
|
-
- regex: 'Android[\- ][\d]+(?:\.[\d]+)
|
5482
|
+
- regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\))'
|
5180
5483
|
brand_replacement: 'Generic_Android'
|
5181
5484
|
model_replacement: '$1'
|
5182
|
-
- regex: 'Android
|
5485
|
+
- regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Mobile Safari'
|
5486
|
+
brand_replacement: 'Generic_Android'
|
5487
|
+
model_replacement: '$1'
|
5488
|
+
- regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Safari'
|
5489
|
+
brand_replacement: 'Generic_Android_Tablet'
|
5490
|
+
model_replacement: '$1'
|
5491
|
+
- regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\))'
|
5183
5492
|
brand_replacement: 'Generic_Android'
|
5184
5493
|
model_replacement: '$1'
|
5185
5494
|
|
@@ -5224,9 +5533,9 @@ device_parsers:
|
|
5224
5533
|
model_replacement: 'Smartphone'
|
5225
5534
|
|
5226
5535
|
##########
|
5227
|
-
# Spiders (this is hack...)
|
5536
|
+
# Spiders (this is a hack...)
|
5228
5537
|
##########
|
5229
|
-
- regex: '(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti)'
|
5538
|
+
- regex: '(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper)'
|
5230
5539
|
regex_flag: 'i'
|
5231
5540
|
device_replacement: 'Spider'
|
5232
5541
|
brand_replacement: 'Spider'
|
@@ -5265,3 +5574,14 @@ device_parsers:
|
|
5265
5574
|
device_replacement: 'Generic Feature Phone'
|
5266
5575
|
brand_replacement: 'Generic'
|
5267
5576
|
model_replacement: 'Feature Phone'
|
5577
|
+
|
5578
|
+
#########
|
5579
|
+
# Apple
|
5580
|
+
# @ref: https://www.apple.com/mac/
|
5581
|
+
# @note: lookup Mac OS, but exclude iPad, Apple TV, a HTC phone, Kindle, LG
|
5582
|
+
# @note: put this at the end, since it is hard to implement contains foo, but not contain bar1, bar 2, bar 3 in go's re2
|
5583
|
+
#########
|
5584
|
+
- regex: 'Mac OS'
|
5585
|
+
device_replacement: 'Mac'
|
5586
|
+
brand_replacement: 'Apple'
|
5587
|
+
model_replacement: 'Mac'
|