user_agent_parser 2.7.0 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/vendor/uap-core/regexes.yaml +787 -637
  3. metadata +7 -7
@@ -41,7 +41,7 @@ user_agent_parsers:
41
41
 
42
42
  - regex: 'ArcGIS\.?(iOS|Android|NET|Qt)(?:-|\.)(\d+)\.(\d+)(?:\.(\d+)|)'
43
43
  family_replacement: 'ArcGIS Runtime SDK for $1'
44
-
44
+
45
45
  - regex: 'ArcGIS\.Runtime\.(Qt)\.(\d+)\.(\d+)(?:\.(\d+)|)'
46
46
  family_replacement: 'ArcGIS Runtime SDK for $1'
47
47
 
@@ -52,9 +52,9 @@ user_agent_parsers:
52
52
  family_replacement: 'AntennaPod'
53
53
  - regex: '(TopPodcasts)Pro/(\d+) CFNetwork'
54
54
  - regex: '(MusicDownloader)Lite/(\d+)\.(\d+)\.(\d+) CFNetwork'
55
- - regex: '^(.*)-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
56
- - regex: '^(.*)-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
57
- - regex: '^(.*)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
55
+ - regex: '^(.{0,200})-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
56
+ - regex: '^(.{0,200})-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
57
+ - regex: '^(.{0,200})/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
58
58
 
59
59
  # Podcast catchers
60
60
  - regex: '^(Luminary)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
@@ -95,7 +95,7 @@ user_agent_parsers:
95
95
  family_replacement: 'Tableau'
96
96
 
97
97
  # Adobe CreativeCloud
98
- - regex: 'AppleWebKit/\d+\.\d+.* Safari.* (CreativeCloud)/(\d+)\.(\d+).(\d+)'
98
+ - regex: 'AppleWebKit/\d{1,10}\.\d{1,10}.{0,200} Safari.{0,200} (CreativeCloud)/(\d+)\.(\d+).(\d+)'
99
99
  family_replacement: 'Adobe CreativeCloud'
100
100
 
101
101
  # Salesforce
@@ -110,7 +110,7 @@ user_agent_parsers:
110
110
  family_replacement: 'FacebookBot'
111
111
 
112
112
  # Google Plus
113
- - regex: 'Google.*/\+/web/snippet'
113
+ - regex: 'Google.{0,50}/\+/web/snippet'
114
114
  family_replacement: 'GooglePlusBot'
115
115
 
116
116
  # Gmail
@@ -128,24 +128,24 @@ user_agent_parsers:
128
128
  # Bots Pattern 'name/0.0.0'
129
129
  - regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
130
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+)|)'
131
+ - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|Pandora|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
132
132
 
133
133
  # MSIECrawler
134
- - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
134
+ - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.{0,200} MSIECrawler'
135
135
  family_replacement: 'MSIECrawler'
136
136
 
137
137
  # DAVdroid
138
138
  - regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)'
139
139
 
140
140
  # Downloader ...
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+)|)|)'
141
+ - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|PostmanRuntime|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+)|)|)'
142
142
 
143
143
  # Pinterestbot
144
144
  - regex: '(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html'
145
145
  family_replacement: 'Pinterestbot'
146
146
 
147
147
  # Bots
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+)|)|)|)'
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|PHPCrawl|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+)|)|)|)'
149
149
 
150
150
  # AWS S3 Clients
151
151
  # must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
@@ -166,21 +166,22 @@ user_agent_parsers:
166
166
  # Facebook
167
167
  # Must come before "Bots General matcher" to catch OrangeBotswana
168
168
  # Facebook Messenger must go before Facebook
169
- - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
169
+ - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
170
+
170
171
  family_replacement: 'Facebook Messenger'
171
172
  # Facebook
172
- - regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
173
+ - regex: '\[FB.{0,300};(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
173
174
  family_replacement: 'Facebook'
174
175
  # Sometimes Facebook does not specify a version (FBAV)
175
- - regex: '\[FB.*;'
176
+ - regex: '\[FB.{0,300};'
176
177
  family_replacement: 'Facebook'
177
178
 
178
179
  # Bots General matcher 'name/0.0'
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
+ - regex: '^.{0,200}?(?:\/[A-Za-z0-9\.]{0,50}|) {0,2}([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
181
  # 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
+ - regex: '^.{0,200}?((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
182
183
  # 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+)|)|)'
184
+ - regex: '^.{0,200}?((?:[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+)|)|)'
184
185
 
185
186
  # HbbTV standard defines what features the browser should understand.
186
187
  # but it's like targeting "HTML5 browsers", effective browser support depends on the model
@@ -196,16 +197,16 @@ user_agent_parsers:
196
197
 
197
198
  # Social Networks (non-Facebook)
198
199
  # Pinterest
199
- - regex: '\[(Pinterest)/[^\]]+\]'
200
+ - regex: '\[(Pinterest)/[^\]]{1,50}\]'
200
201
  - regex: '(Pinterest)(?: for Android(?: Tablet|)|)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
201
202
  # Instagram app
202
- - regex: 'Mozilla.*Mobile.*(Instagram).(\d+)\.(\d+)\.(\d+)'
203
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Instagram).(\d+)\.(\d+)\.(\d+)'
203
204
  # Flipboard app
204
- - regex: 'Mozilla.*Mobile.*(Flipboard).(\d+)\.(\d+)\.(\d+)'
205
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard).(\d+)\.(\d+)\.(\d+)'
205
206
  # Flipboard-briefing app
206
- - regex: 'Mozilla.*Mobile.*(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
207
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
207
208
  # Onefootball app
208
- - regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
209
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
209
210
  # Snapchat
210
211
  - regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+)\.(\d+)'
211
212
  # Twitter
@@ -213,15 +214,11 @@ user_agent_parsers:
213
214
  family_replacement: 'Twitter'
214
215
 
215
216
  # aspiegel.com spider (owned by Huawei)
216
- - regex: 'Mozilla.*Mobile.*AspiegelBot'
217
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
217
218
  family_replacement: 'Spider'
218
- brand_replacement: 'Spider'
219
- model_replacement: 'Smartphone'
220
219
 
221
220
  - regex: 'AspiegelBot'
222
221
  family_replacement: 'Spider'
223
- brand_replacement: 'Spider'
224
- model_replacement: 'Desktop'
225
222
 
226
223
  # Basilisk
227
224
  - regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)'
@@ -238,7 +235,7 @@ user_agent_parsers:
238
235
  family_replacement: 'Firefox Mobile'
239
236
  - regex: '(Fennec)/(\d+)\.(\d+)'
240
237
  family_replacement: 'Firefox Mobile'
241
- - regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)'
238
+ - regex: '(?:Mobile|Tablet);.{0,200}(Firefox)/(\d+)\.(\d+)'
242
239
  family_replacement: 'Firefox Mobile'
243
240
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
244
241
  family_replacement: 'Firefox ($1)'
@@ -252,7 +249,7 @@ user_agent_parsers:
252
249
  family_replacement: 'Firefox Beta'
253
250
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
254
251
  family_replacement: 'Firefox ($1)'
255
- - regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
252
+ - regex: '(Firefox).{0,200}Tablet browser (\d+)\.(\d+)\.(\d+)'
256
253
  family_replacement: 'MicroB'
257
254
  - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
258
255
  - regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)'
@@ -284,24 +281,24 @@ user_agent_parsers:
284
281
 
285
282
  # Opera will stop at 9.80 and hide the real version in the Version string.
286
283
  # see: http://dev.opera.com/articles/view/opera-ua-string-changes/
287
- - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
284
+ - regex: '(Opera Tablet).{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
288
285
  - regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)'
289
- - regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
286
+ - regex: '(Opera)/.{1,100}Opera Mobi.{1,100}Version/(\d+)\.(\d+)'
290
287
  family_replacement: 'Opera Mobile'
291
- - regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
288
+ - regex: '(Opera)/(\d+)\.(\d+).{1,100}Opera Mobi'
292
289
  family_replacement: 'Opera Mobile'
293
- - regex: 'Opera Mobi.+(Opera)(?:/|\s+)(\d+)\.(\d+)'
290
+ - regex: 'Opera Mobi.{1,100}(Opera)(?:/|\s+)(\d+)\.(\d+)'
294
291
  family_replacement: 'Opera Mobile'
295
292
  - regex: 'Opera Mobi'
296
293
  family_replacement: 'Opera Mobile'
297
- - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
294
+ - regex: '(Opera)/9.80.{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
298
295
 
299
296
  # Opera 14 for Android uses a WebKit render engine.
300
- - regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
297
+ - regex: '(?:Mobile Safari).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
301
298
  family_replacement: 'Opera Mobile'
302
299
 
303
300
  # Opera >=15 for Desktop is similar to Chrome but includes an "OPR" Version string.
304
- - regex: '(?:Chrome).*(OPR)/(\d+)\.(\d+)\.(\d+)'
301
+ - regex: '(?:Chrome).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
305
302
  family_replacement: 'Opera'
306
303
 
307
304
  # Opera Coast
@@ -313,7 +310,7 @@ user_agent_parsers:
313
310
  family_replacement: 'Opera Mini'
314
311
 
315
312
  # Opera Neon
316
- - regex: 'Chrome/.+( MMS)/(\d+).(\d+).(\d+)'
313
+ - regex: 'Chrome/.{1,200}( MMS)/(\d+).(\d+).(\d+)'
317
314
  family_replacement: 'Opera Neon'
318
315
 
319
316
  # Palm WebOS looks a lot like Safari.
@@ -360,7 +357,7 @@ user_agent_parsers:
360
357
 
361
358
  - regex: '(Symphony) (\d+).(\d+)'
362
359
 
363
- - regex: 'PLAYSTATION 3.+WebKit'
360
+ - regex: 'PLAYSTATION 3.{1,200}WebKit'
364
361
  family_replacement: 'NetFront NX'
365
362
  - regex: 'PLAYSTATION 3'
366
363
  family_replacement: 'NetFront'
@@ -369,7 +366,7 @@ user_agent_parsers:
369
366
  - regex: '(PlayStation Vita)'
370
367
  family_replacement: 'NetFront NX'
371
368
 
372
- - regex: 'AppleWebKit.+ (NX)/(\d+)\.(\d+)\.(\d+)'
369
+ - regex: 'AppleWebKit.{1,200} (NX)/(\d+)\.(\d+)\.(\d+)'
373
370
  family_replacement: 'NetFront NX'
374
371
  - regex: '(Nintendo 3DS)'
375
372
  family_replacement: 'NetFront NX'
@@ -382,7 +379,7 @@ user_agent_parsers:
382
379
  - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+)|)'
383
380
 
384
381
  # Edge Mobile
385
- - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
382
+ - regex: 'Windows Phone .{0,200}(Edge)/(\d+)\.(\d+)'
386
383
  family_replacement: 'Edge Mobile'
387
384
  - regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
388
385
  family_replacement: 'Edge Mobile'
@@ -430,7 +427,7 @@ user_agent_parsers:
430
427
  family_replacement: 'TopBuzz'
431
428
 
432
429
  # Google Search App on Android, eg:
433
- - regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
430
+ - regex: 'Mozilla.{1,200}Android.{1,200}(GSA)/(\d+)\.(\d+)\.(\d+)'
434
431
  family_replacement: 'Google'
435
432
 
436
433
  # QQ Browsers
@@ -441,10 +438,18 @@ user_agent_parsers:
441
438
  - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
442
439
  family_replacement: 'QQ Browser'
443
440
 
441
+ # DuckDuckGo
442
+ - regex: 'Mobile.{0,200}(DuckDuckGo)/(\d+)'
443
+ family_replacement: 'DuckDuckGo Mobile'
444
+
445
+ # Tenta Browser
446
+ - regex: '(Tenta/)(\d+)\.(\d+)\.(\d+)'
447
+ family_replacement: 'Tenta Browser'
448
+
444
449
  # Chrome Mobile
445
- - regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
450
+ - regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
446
451
  family_replacement: 'Chrome Mobile WebView'
447
- - regex: '; wv\).+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
452
+ - regex: '; wv\).{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
448
453
  family_replacement: 'Chrome Mobile WebView'
449
454
  - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
450
455
  family_replacement: 'Chrome Mobile'
@@ -452,7 +457,7 @@ user_agent_parsers:
452
457
  family_replacement: 'Chrome Mobile iOS'
453
458
  - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
454
459
  family_replacement: 'Chrome Mobile'
455
- - regex: ' Mobile .*(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
460
+ - regex: ' Mobile .{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
456
461
  family_replacement: 'Chrome Mobile'
457
462
 
458
463
  # Chrome Frame must come before MSIE.
@@ -482,7 +487,7 @@ user_agent_parsers:
482
487
  family_replacement: 'Yandex Browser'
483
488
 
484
489
  # Mail.ru Amigo/Internet Browser (Chromium-based)
485
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).* MRCHROME'
490
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).{0,100} MRCHROME'
486
491
  family_replacement: 'Mail.ru Chromium Browser'
487
492
 
488
493
  # AOL Browser (IE-based)
@@ -509,6 +514,9 @@ user_agent_parsers:
509
514
  # @ref: http://www.ghost.org
510
515
  - regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)'
511
516
 
517
+ # Palo Alto GlobalProtect Linux
518
+ - regex: 'PAN (GlobalProtect)/(\d+)\.(\d+)\.(\d+) .{1,100} \(X11; Linux x86_64\)'
519
+
512
520
  #### END SPECIAL CASES TOP ####
513
521
 
514
522
  #### MAIN CASES - this catches > 50% of all browsers ####
@@ -550,7 +558,7 @@ user_agent_parsers:
550
558
  - regex: 'Microsoft Office (Word) 2014'
551
559
 
552
560
  # Windows Live Mail
553
- - regex: 'Outlook-Express\/7\.0.*'
561
+ - regex: 'Outlook-Express\/7\.0'
554
562
  family_replacement: 'Windows Live Mail'
555
563
 
556
564
  # Apple Air Mail
@@ -590,7 +598,7 @@ user_agent_parsers:
590
598
  family_replacement: 'Brave'
591
599
 
592
600
  # Iron Browser ~since version 50
593
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]* Iron[^/]'
601
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]{0,100} Iron[^/]'
594
602
  family_replacement: 'Iron'
595
603
 
596
604
  # Dolphin Browser
@@ -666,13 +674,13 @@ user_agent_parsers:
666
674
  - regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)(?:\.(\d+)|)'
667
675
  - regex: '^(Stitcher)/iOS'
668
676
  - regex: '^(Stitcher)/Android'
669
- - regex: '^(VLC) .*version (\d+)\.(\d+)\.(\d+)'
677
+ - regex: '^(VLC) .{0,200}version (\d+)\.(\d+)\.(\d+)'
670
678
  - regex: ' (VLC) for'
671
679
  - regex: '(vlc)/(\d+)\.(\d+)\.(\d+)'
672
680
  family_replacement: 'VLC'
673
- - regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
674
- - regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
675
- - regex: '(amarok)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
681
+ - regex: '^(foobar)\S{1,10}/(\d+)\.(\d+|)\.?([\da-z]+|)'
682
+ - regex: '^(Clementine)\S{1,10} (\d+)\.(\d+|)\.?(\d+|)'
683
+ - regex: '(amarok)/(\d+)\.(\d+|)\.?(\d+|)'
676
684
  family_replacement: 'Amarok'
677
685
  - regex: '(Custom)-Feed Reader'
678
686
 
@@ -706,7 +714,7 @@ user_agent_parsers:
706
714
 
707
715
  # desktop mode
708
716
  # http://www.anandtech.com/show/3982/windows-phone-7-review
709
- - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
717
+ - regex: '(MSIE) (\d+)\.(\d+).{0,100}XBLWP7'
710
718
  family_replacement: 'IE Large Screen'
711
719
 
712
720
  # Nextcloud desktop sync client
@@ -723,6 +731,17 @@ user_agent_parsers:
723
731
  - regex: '(OC)/(\d+)\.(\d+)\.(\d+)\.(\d+) \(Skype for Business\)'
724
732
  family_replacement: 'Skype'
725
733
 
734
+ # OpenVAS Scanner
735
+ - regex: '(OpenVAS)(?:-VT)?(?:[ \/](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
736
+ family_replacement: 'OpenVAS Scanner'
737
+
738
+ # AnyConnect
739
+ - regex: '(AnyConnect)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
740
+
741
+ # Monitis
742
+ - regex: 'compatible; monitis'
743
+ family_replacement: 'Monitis'
744
+
726
745
  #### END MAIN CASES ####
727
746
 
728
747
  #### SPECIAL CASES ####
@@ -759,15 +778,15 @@ user_agent_parsers:
759
778
  family_replacement: 'TopBuzz'
760
779
 
761
780
  # @note: iOS / OSX Applications
762
- - regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
781
+ - regex: '(iPod|iPhone|iPad).{1,200}GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
763
782
  family_replacement: 'Google'
764
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|).*[ +]Safari'
783
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|).{1,200}[ +]Safari'
765
784
  family_replacement: 'Mobile Safari'
766
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).* AppleNews\/\d+\.\d+\.\d+?'
785
+ - regex: '(iPod|iPod touch|iPhone|iPad);.{0,30}CPU.{0,30}OS[ +](\d+)_(\d+)(?:_(\d+)|).{0,30} AppleNews\/\d+\.\d+(?:\.\d+|)'
767
786
  family_replacement: 'Mobile Safari UI/WKWebView'
768
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|)'
787
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
769
788
  family_replacement: 'Mobile Safari UI/WKWebView'
770
- - regex: '(iPod|iPod touch|iPhone|iPad).* Safari'
789
+ - regex: '(iPod|iPod touch|iPhone|iPad).{0,200} Safari'
771
790
  family_replacement: 'Mobile Safari'
772
791
  - regex: '(iPod|iPod touch|iPhone|iPad)'
773
792
  family_replacement: 'Mobile Safari UI/WKWebView'
@@ -818,9 +837,9 @@ user_agent_parsers:
818
837
  - regex: '(Nokia)[EN]?(\d+)'
819
838
 
820
839
  # BlackBerry devices
821
- - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
840
+ - regex: '(PlayBook).{1,200}RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
822
841
  family_replacement: 'BlackBerry WebKit'
823
- - regex: '(Black[bB]erry|BB10).+Version/(\d+)\.(\d+)\.(\d+)'
842
+ - regex: '(Black[bB]erry|BB10).{1,200}Version/(\d+)\.(\d+)\.(\d+)'
824
843
  family_replacement: 'BlackBerry WebKit'
825
844
  - regex: '(Black[bB]erry)\s?(\d+)'
826
845
  family_replacement: 'BlackBerry'
@@ -840,18 +859,15 @@ user_agent_parsers:
840
859
 
841
860
  - regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
842
861
 
843
- #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
844
- # family_replacement: 'iPad'
845
-
846
862
  # Phantomjs, should go before Safari
847
863
  - regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
848
864
 
849
865
  # WebKit Nightly
850
- - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .* Safari'
866
+ - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .{0,200} Safari'
851
867
  family_replacement: 'WebKit Nightly'
852
868
 
853
869
  # Safari
854
- - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
870
+ - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).{0,100}Safari/'
855
871
  family_replacement: 'Safari'
856
872
  # Safari didn't provide "Version/d.d.d" prior to 3.0
857
873
  - regex: '(Safari)/\d+'
@@ -900,6 +916,7 @@ user_agent_parsers:
900
916
  - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
901
917
  - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)'
902
918
 
919
+
903
920
  - regex: '([MS]?IE) (\d+)\.(\d+)'
904
921
  family_replacement: 'IE'
905
922
 
@@ -907,7 +924,30 @@ user_agent_parsers:
907
924
  family_replacement: 'Python Requests'
908
925
 
909
926
  # headless user-agents
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+)|)|)'
927
+ - 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|CloudCockpitBackend|ReactorNetty|axios|Jersey|Vert.x-WebClient|Apache-CXF|Go-CF-client|go-resty|AHC)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
928
+
929
+ # CloudFoundry
930
+ - regex: '^(cf)\/(\d+)\.(\d+)\.(\S+)'
931
+ family_replacement: 'CloudFoundry'
932
+
933
+ # SAP Leonardo
934
+ - regex: '^(sap-leonardo-iot-sdk-nodejs) \/ (\d+)\.(\d+)\.(\d+)'
935
+
936
+ # SAP Netweaver Application Server
937
+ - regex: '^(SAP NetWeaver Application Server) \(1.0;(\d{1})(\d{2})\)'
938
+
939
+ # HttpClient
940
+ - regex: '^(\w+-HTTPClient)\/(\d+)\.(\d+)-(\S+)'
941
+ family_replacement: 'HTTPClient'
942
+
943
+ # go-cli
944
+ - regex: '^(go-cli)\s(\d+)\.(\d+).(\S+)'
945
+
946
+ # Other Clients with the pattern <Name>/[v]<Major>.<Minor>[.<Patch>]
947
+ - regex: '^(Java-EurekaClient|Java-EurekaClient-Replication|HTTPClient|lua-resty-http)\/v?(\d+)\.(\d+)\.?(\d*)'
948
+
949
+ ## Clints with the pattern <Name>
950
+ - regex: '^(ping-service|sap xsuaa|Node-oauth|Site24x7|SAP CPI|JAEGER_SECURITY)'
911
951
 
912
952
  # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
913
953
  - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
@@ -915,9 +955,25 @@ user_agent_parsers:
915
955
 
916
956
  - regex: '(Java)[/ ]?\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
917
957
 
958
+ # minio-go (https://github.com/minio/minio-go)
959
+ - regex: '(minio-go)/v(\d+)\.(\d+)\.(\d+)'
960
+
961
+ # ureq - minimal request library in rust (https://github.com/algesten/ureq)
962
+ - regex: '^(ureq)[/ ](\d+)\.(\d+).(\d+)'
963
+
964
+ # http.rb - HTTP (The Gem! a.k.a. http.rb) - a fast Ruby HTTP client
965
+ # (https://github.com/httprb/http/blob/3aa7470288deb81f7d7b982c1e2381871049dcbb/lib/http/request.rb#L27)
966
+ - regex: '^(http\.rb)/(\d+)\.(\d+).(\d+)'
967
+
968
+ # Guzzle, PHP HTTP client (https://docs.guzzlephp.org/)
969
+ - regex: '^(GuzzleHttp)/(\d+)\.(\d+).(\d+)'
970
+
971
+ # lorien/grab - Web Scraping Framework (https://github.com/lorien/grab)
972
+ - regex: '^(grab)\b'
973
+
918
974
  # Cloud Storage Clients
919
975
  - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
920
- - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
976
+ - regex: '^(S3 Browser) (\d+)[.-](\d+)[.-](\d+)(?:\s*https?://s3browser\.com|)'
921
977
  - regex: '(S3Gof3r)'
922
978
  # IBM COS (Cloud Object Storage) API
923
979
  - regex: '\b(ibm-cos-sdk-(?:core|java|js|python))/(\d+)\.(\d+)(?:\.(\d+)|)'
@@ -940,6 +996,20 @@ user_agent_parsers:
940
996
  - regex: '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\d+)\.(\d+)\.(\d+)'
941
997
  family_replacement: 'ViaFree'
942
998
 
999
+ # Transmit (https://library.panic.com/transmit/)
1000
+ - regex: '(Transmit)/(\d+)\.(\d+)\.(\d+)'
1001
+
1002
+ # Download Master (https://downloadmaster.ru/)
1003
+ - regex: '(Download Master)'
1004
+
1005
+ # HTTrack crawler
1006
+ - regex: '\b(HTTrack) (\d+)\.(\d+)(?:[\.\-](\d+)|)'
1007
+
1008
+ # SerenityOS (https://serenityos.org)
1009
+ # https://github.com/SerenityOS/serenity/blob/2e1bbcb0faeae92d7595b8e0b022a8cdcecca07e/Userland/Libraries/LibWeb/Loader/ResourceLoader.h#L27
1010
+ - regex: 'SerenityOS'
1011
+ family_replacement: 'SerenityOS Browser'
1012
+
943
1013
  os_parsers:
944
1014
  ##########
945
1015
  # HbbTV vendors
@@ -955,7 +1025,7 @@ os_parsers:
955
1025
  # Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11
956
1026
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL40HX751; PKG1.902EUA; 2012;);; en) Presto/2.10.250 Version/11.60
957
1027
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL22EX320; PKG4.017EUA; 2011;);; en) Presto/2.7.61 Version/11.00
958
- #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.*;.*; ([0-9]{4});\)'
1028
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.{0,200};.{0,200}; ([0-9]{4});\)'
959
1029
 
960
1030
 
961
1031
  # LG is consistent too, but we need to add manually the year model
@@ -975,9 +1045,9 @@ os_parsers:
975
1045
  os_replacement: 'Samsung'
976
1046
  os_v1_replacement: '2011'
977
1047
  # manage the two models of 2013
978
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC'
1048
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}FXPDEUC'
979
1049
  os_v2_replacement: 'UE40F7000'
980
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC'
1050
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}MST12DEUC'
981
1051
  os_v2_replacement: 'UE32F4500'
982
1052
  # generic Samsung (works starting in 2012)
983
1053
  #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});'
@@ -985,26 +1055,26 @@ os_parsers:
985
1055
  # Philips : not found any other way than a manual mapping
986
1056
  # 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
987
1057
  # 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
988
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/4'
1058
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/4'
989
1059
  os_v1_replacement: '2013'
990
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3'
1060
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/3'
991
1061
  os_v1_replacement: '2012'
992
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/2'
1062
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/2'
993
1063
  os_v1_replacement: '2011'
994
1064
 
995
1065
  # the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
996
- - regex: 'HbbTV/\d+\.\d+\.\d+.*(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
1066
+ - regex: 'HbbTV/\d+\.\d+\.\d+.{0,100}(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
997
1067
  os_replacement: 'FireHbbTV'
998
1068
 
999
1069
  # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
1000
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\)'
1070
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(.{0,30}; ?([a-zA-Z]+) ?;.{0,30}(201[1-9]).{0,30}\)'
1001
1071
 
1002
1072
  # aspiegel.com spider (owned by Huawei)
1003
1073
  - regex: 'AspiegelBot'
1004
1074
  os_replacement: 'Other'
1005
1075
 
1006
1076
  ##########
1007
- # @note: Windows Phone needs to come before Windows NT 6.1 *and* before Android to catch cases such as:
1077
+ # @note: Windows Phone needs to come before Windows NT 6.1 {0,2}and* before Android to catch cases such as:
1008
1078
  # 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)...
1009
1079
  # 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; ANZ821)...
1010
1080
  # 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; Orange)...
@@ -1013,12 +1083,12 @@ os_parsers:
1013
1083
 
1014
1084
  - regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
1015
1085
 
1016
- # Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android
1017
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).*Outlook-iOS-Android'
1086
+ # Again a MS-special one: iPhone.{0,200}Outlook-iOS-Android/x.x is erroneously detected as Android
1087
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).{0,100}Outlook-iOS-Android'
1018
1088
  os_replacement: 'iOS'
1019
1089
 
1020
1090
  # Special case for old ArcGIS Mobile products
1021
- - regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]+|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1091
+ - regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]{1,50}|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1022
1092
 
1023
1093
  # Special case for new ArcGIS Mobile products
1024
1094
  - regex: 'ArcGISRuntime-(?:Android|iOS)\/\d+\.\d+(?:\.\d+|) \((Android|iOS) (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
@@ -1052,14 +1122,14 @@ os_parsers:
1052
1122
  - regex: '(Android) (\d+);'
1053
1123
 
1054
1124
  # UCWEB
1055
- - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
1125
+ - regex: '^UCWEB.{0,200}; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]{1,100})|);'
1056
1126
  os_replacement: 'Android'
1057
- - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
1127
+ - regex: '^UCWEB.{0,200}; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
1058
1128
  os_replacement: 'iOS'
1059
- - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
1129
+ - regex: '^UCWEB.{0,200}; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
1060
1130
  os_replacement: 'Windows Phone'
1061
1131
  # JUC
1062
- - regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)'
1132
+ - regex: '^(JUC).{0,200}; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]{1,100})|)'
1063
1133
  os_replacement: 'Android'
1064
1134
 
1065
1135
  # Salesforce
@@ -1077,7 +1147,7 @@ os_parsers:
1077
1147
  # properly identify as Chrome OS
1078
1148
  #
1079
1149
  # 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)$'
1150
+ - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).{0,100}Chrome.{0,100}(?:CitrixChromeApp)$'
1081
1151
  os_replacement: 'Chrome OS'
1082
1152
 
1083
1153
  ##########
@@ -1169,7 +1239,7 @@ os_parsers:
1169
1239
  os_v1_replacement: '95'
1170
1240
 
1171
1241
  # Box apps (Drive, Sync, Notes) on Windows https://www.box.com/resources/downloads
1172
- - regex: '^Box.*Windows/([\d.]+);'
1242
+ - regex: '^Box.{0,200}Windows/([\d.]+);'
1173
1243
  os_replacement: 'Windows'
1174
1244
  os_v1_replacement: '$1'
1175
1245
 
@@ -1186,33 +1256,33 @@ os_parsers:
1186
1256
  ##########
1187
1257
  - regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)'
1188
1258
  os_replacement: 'Mac OS X'
1189
- - regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*'
1259
+ - regex: 'Mac OS X\s.{1,50}\s(\d+).(\d+).(\d+)'
1190
1260
  os_replacement: 'Mac OS X'
1191
1261
  os_v1_replacement: '$1'
1192
1262
  os_v2_replacement: '$2'
1193
1263
  os_v3_replacement: '$3'
1194
1264
  # Leopard
1195
- - regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
1265
+ - regex: ' (Dar)(win)/(9).(\d+).{0,100}\((?:i386|x86_64|Power Macintosh)\)'
1196
1266
  os_replacement: 'Mac OS X'
1197
1267
  os_v1_replacement: '10'
1198
1268
  os_v2_replacement: '5'
1199
1269
  # Snow Leopard
1200
- - regex: ' (Dar)(win)/(10).(\d+).*\((?:i386|x86_64)\)'
1270
+ - regex: ' (Dar)(win)/(10).(\d+).{0,100}\((?:i386|x86_64)\)'
1201
1271
  os_replacement: 'Mac OS X'
1202
1272
  os_v1_replacement: '10'
1203
1273
  os_v2_replacement: '6'
1204
1274
  # Lion
1205
- - regex: ' (Dar)(win)/(11).(\d+).*\((?:i386|x86_64)\)'
1275
+ - regex: ' (Dar)(win)/(11).(\d+).{0,100}\((?:i386|x86_64)\)'
1206
1276
  os_replacement: 'Mac OS X'
1207
1277
  os_v1_replacement: '10'
1208
1278
  os_v2_replacement: '7'
1209
1279
  # Mountain Lion
1210
- - regex: ' (Dar)(win)/(12).(\d+).*\((?:i386|x86_64)\)'
1280
+ - regex: ' (Dar)(win)/(12).(\d+).{0,100}\((?:i386|x86_64)\)'
1211
1281
  os_replacement: 'Mac OS X'
1212
1282
  os_v1_replacement: '10'
1213
1283
  os_v2_replacement: '8'
1214
1284
  # Mavericks
1215
- - regex: ' (Dar)(win)/(13).(\d+).*\((?:i386|x86_64)\)'
1285
+ - regex: ' (Dar)(win)/(13).(\d+).{0,100}\((?:i386|x86_64)\)'
1216
1286
  os_replacement: 'Mac OS X'
1217
1287
  os_v1_replacement: '10'
1218
1288
  os_v2_replacement: '9'
@@ -1229,7 +1299,7 @@ os_parsers:
1229
1299
  - regex: '(?:PPC|Intel) (Mac OS X)'
1230
1300
 
1231
1301
  # Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin
1232
- - regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1302
+ - regex: '^Box.{0,200};(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1233
1303
  os_replacement: 'Mac OS X'
1234
1304
 
1235
1305
  ##########
@@ -1240,7 +1310,7 @@ os_parsers:
1240
1310
  - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)'
1241
1311
  os_replacement: 'ATV OS X'
1242
1312
 
1243
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1313
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1244
1314
  os_replacement: 'iOS'
1245
1315
 
1246
1316
  # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
@@ -1248,15 +1318,15 @@ os_parsers:
1248
1318
  os_replacement: 'iOS'
1249
1319
 
1250
1320
  # few more stragglers
1251
- - regex: '(iPhone|iPad|iPod).*Mac OS X.*Version/(\d+)\.(\d+)'
1321
+ - regex: '(iPhone|iPad|iPod).{0,100}Mac OS X.{0,100}Version/(\d+)\.(\d+)'
1252
1322
  os_replacement: 'iOS'
1253
1323
 
1254
1324
  # CFNetwork/Darwin - The specific CFNetwork or Darwin version determines
1255
1325
  # whether the os maps to Mac OS, or iOS, or just Darwin.
1256
1326
  # See: http://user-agents.me/cfnetwork-version-list
1257
- - regex: '(CFNetwork)/(5)48\.0\.3.* Darwin/11\.0\.0'
1327
+ - regex: '(CFNetwork)/(5)48\.0\.3.{0,100} Darwin/11\.0\.0'
1258
1328
  os_replacement: 'iOS'
1259
- - regex: '(CFNetwork)/(5)48\.(0)\.4.* Darwin/(1)1\.0\.0'
1329
+ - regex: '(CFNetwork)/(5)48\.(0)\.4.{0,100} Darwin/(1)1\.0\.0'
1260
1330
  os_replacement: 'iOS'
1261
1331
  - regex: '(CFNetwork)/(5)48\.(1)\.4'
1262
1332
  os_replacement: 'iOS'
@@ -1291,17 +1361,17 @@ os_parsers:
1291
1361
  os_replacement: 'Mac OS X'
1292
1362
  os_v1_replacement: '10'
1293
1363
  os_v2_replacement: '11'
1294
- - regex: 'CFNetwork/7.* Darwin/15\.4\.\d+'
1364
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.4\.\d+'
1295
1365
  os_replacement: 'iOS'
1296
1366
  os_v1_replacement: '9'
1297
1367
  os_v2_replacement: '3'
1298
1368
  os_v3_replacement: '1'
1299
- - regex: 'CFNetwork/7.* Darwin/15\.5\.\d+'
1369
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.5\.\d+'
1300
1370
  os_replacement: 'iOS'
1301
1371
  os_v1_replacement: '9'
1302
1372
  os_v2_replacement: '3'
1303
1373
  os_v3_replacement: '2'
1304
- - regex: 'CFNetwork/7.* Darwin/15\.6\.\d+'
1374
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.6\.\d+'
1305
1375
  os_replacement: 'iOS'
1306
1376
  os_v1_replacement: '9'
1307
1377
  os_v2_replacement: '3'
@@ -1322,15 +1392,15 @@ os_parsers:
1322
1392
  # CFNetwork macOS Apps (must be before CFNetwork iOS Apps
1323
1393
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1324
1394
  ##########
1325
- - regex: 'CFNetwork/.* Darwin/17\.\d+.*\(x86_64\)'
1395
+ - regex: 'CFNetwork/.{0,100} Darwin/17\.\d+.{0,100}\(x86_64\)'
1326
1396
  os_replacement: 'Mac OS X'
1327
1397
  os_v1_replacement: '10'
1328
1398
  os_v2_replacement: '13'
1329
- - regex: 'CFNetwork/.* Darwin/16\.\d+.*\(x86_64\)'
1399
+ - regex: 'CFNetwork/.{0,100} Darwin/16\.\d+.{0,100}\(x86_64\)'
1330
1400
  os_replacement: 'Mac OS X'
1331
1401
  os_v1_replacement: '10'
1332
1402
  os_v2_replacement: '12'
1333
- - regex: 'CFNetwork/8.* Darwin/15\.\d+.*\(x86_64\)'
1403
+ - regex: 'CFNetwork/8.{0,100} Darwin/15\.\d+.{0,100}\(x86_64\)'
1334
1404
  os_replacement: 'Mac OS X'
1335
1405
  os_v1_replacement: '10'
1336
1406
  os_v2_replacement: '11'
@@ -1338,87 +1408,146 @@ os_parsers:
1338
1408
  # CFNetwork iOS Apps
1339
1409
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1340
1410
  ##########
1341
- - regex: 'CFNetwork/.* Darwin/(9)\.\d+'
1411
+ - regex: 'CFNetwork/.{0,100} Darwin/(9)\.\d+'
1342
1412
  os_replacement: 'iOS'
1343
1413
  os_v1_replacement: '1'
1344
- - regex: 'CFNetwork/.* Darwin/(10)\.\d+'
1414
+ - regex: 'CFNetwork/.{0,100} Darwin/(10)\.\d+'
1345
1415
  os_replacement: 'iOS'
1346
1416
  os_v1_replacement: '4'
1347
- - regex: 'CFNetwork/.* Darwin/(11)\.\d+'
1417
+ - regex: 'CFNetwork/.{0,100} Darwin/(11)\.\d+'
1348
1418
  os_replacement: 'iOS'
1349
1419
  os_v1_replacement: '5'
1350
- - regex: 'CFNetwork/.* Darwin/(13)\.\d+'
1420
+ - regex: 'CFNetwork/.{0,100} Darwin/(13)\.\d+'
1351
1421
  os_replacement: 'iOS'
1352
1422
  os_v1_replacement: '6'
1353
- - regex: 'CFNetwork/6.* Darwin/(14)\.\d+'
1423
+ - regex: 'CFNetwork/6.{0,100} Darwin/(14)\.\d+'
1354
1424
  os_replacement: 'iOS'
1355
1425
  os_v1_replacement: '7'
1356
- - regex: 'CFNetwork/7.* Darwin/(14)\.\d+'
1426
+ - regex: 'CFNetwork/7.{0,100} Darwin/(14)\.\d+'
1357
1427
  os_replacement: 'iOS'
1358
1428
  os_v1_replacement: '8'
1359
1429
  os_v2_replacement: '0'
1360
- - regex: 'CFNetwork/7.* Darwin/(15)\.\d+'
1430
+ - regex: 'CFNetwork/7.{0,100} Darwin/(15)\.\d+'
1361
1431
  os_replacement: 'iOS'
1362
1432
  os_v1_replacement: '9'
1363
1433
  os_v2_replacement: '0'
1364
- - regex: 'CFNetwork/8.* Darwin/16\.5\.\d+'
1434
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.5\.\d+'
1365
1435
  os_replacement: 'iOS'
1366
1436
  os_v1_replacement: '10'
1367
1437
  os_v2_replacement: '3'
1368
- - regex: 'CFNetwork/8.* Darwin/16\.6\.\d+'
1438
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.6\.\d+'
1369
1439
  os_replacement: 'iOS'
1370
1440
  os_v1_replacement: '10'
1371
1441
  os_v2_replacement: '3'
1372
1442
  os_v3_replacement: '2'
1373
- - regex: 'CFNetwork/8.* Darwin/16\.7\.\d+'
1443
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.7\.\d+'
1374
1444
  os_replacement: 'iOS'
1375
1445
  os_v1_replacement: '10'
1376
1446
  os_v2_replacement: '3'
1377
1447
  os_v3_replacement: '3'
1378
- - regex: 'CFNetwork/8.* Darwin/(16)\.\d+'
1448
+ - regex: 'CFNetwork/8.{0,100} Darwin/(16)\.\d+'
1379
1449
  os_replacement: 'iOS'
1380
1450
  os_v1_replacement: '10'
1381
- - regex: 'CFNetwork/8.* Darwin/17\.0\.\d+'
1451
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.0\.\d+'
1382
1452
  os_replacement: 'iOS'
1383
1453
  os_v1_replacement: '11'
1384
1454
  os_v2_replacement: '0'
1385
- - regex: 'CFNetwork/8.* Darwin/17\.2\.\d+'
1455
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.2\.\d+'
1386
1456
  os_replacement: 'iOS'
1387
1457
  os_v1_replacement: '11'
1388
1458
  os_v2_replacement: '1'
1389
- - regex: 'CFNetwork/8.* Darwin/17\.3\.\d+'
1459
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.3\.\d+'
1390
1460
  os_replacement: 'iOS'
1391
1461
  os_v1_replacement: '11'
1392
1462
  os_v2_replacement: '2'
1393
- - regex: 'CFNetwork/8.* Darwin/17\.4\.\d+'
1463
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.4\.\d+'
1394
1464
  os_replacement: 'iOS'
1395
1465
  os_v1_replacement: '11'
1396
1466
  os_v2_replacement: '2'
1397
1467
  os_v3_replacement: '6'
1398
- - regex: 'CFNetwork/8.* Darwin/17\.5\.\d+'
1468
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.5\.\d+'
1399
1469
  os_replacement: 'iOS'
1400
1470
  os_v1_replacement: '11'
1401
1471
  os_v2_replacement: '3'
1402
- - regex: 'CFNetwork/9.* Darwin/17\.6\.\d+'
1472
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.6\.\d+'
1403
1473
  os_replacement: 'iOS'
1404
1474
  os_v1_replacement: '11'
1405
1475
  os_v2_replacement: '4'
1406
- - regex: 'CFNetwork/9.* Darwin/17\.7\.\d+'
1476
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.7\.\d+'
1407
1477
  os_replacement: 'iOS'
1408
1478
  os_v1_replacement: '11'
1409
1479
  os_v2_replacement: '4'
1410
1480
  os_v3_replacement: '1'
1411
- - regex: 'CFNetwork/8.* Darwin/(17)\.\d+'
1481
+ - regex: 'CFNetwork/8.{0,100} Darwin/(17)\.\d+'
1412
1482
  os_replacement: 'iOS'
1413
1483
  os_v1_replacement: '11'
1414
- - regex: 'CFNetwork/9.* Darwin/18\.0\.\d+'
1484
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.0\.\d+'
1415
1485
  os_replacement: 'iOS'
1416
1486
  os_v1_replacement: '12'
1417
1487
  os_v2_replacement: '0'
1418
- - regex: 'CFNetwork/9.* Darwin/(18)\.\d+'
1488
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.2\.\d+'
1419
1489
  os_replacement: 'iOS'
1420
1490
  os_v1_replacement: '12'
1421
- - regex: 'CFNetwork/.* Darwin/'
1491
+ os_v2_replacement: '1'
1492
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.5\.\d+'
1493
+ os_replacement: 'iOS'
1494
+ os_v1_replacement: '12'
1495
+ os_v2_replacement: '2'
1496
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.6\.\d+'
1497
+ os_replacement: 'iOS'
1498
+ os_v1_replacement: '12'
1499
+ os_v2_replacement: '3'
1500
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.7\.\d+'
1501
+ os_replacement: 'iOS'
1502
+ os_v1_replacement: '12'
1503
+ os_v2_replacement: '4'
1504
+ - regex: 'CFNetwork/9.{0,100} Darwin/(18)\.\d+'
1505
+ os_replacement: 'iOS'
1506
+ os_v1_replacement: '12'
1507
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.2\.\d+'
1508
+ os_replacement: 'iOS'
1509
+ os_v1_replacement: '13'
1510
+ os_v2_replacement: '3'
1511
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.3\.\d+'
1512
+ os_replacement: 'iOS'
1513
+ os_v1_replacement: '13'
1514
+ os_v2_replacement: '3'
1515
+ os_v3_replacement: '1'
1516
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.4\.\d+'
1517
+ os_replacement: 'iOS'
1518
+ os_v1_replacement: '13'
1519
+ os_v2_replacement: '4'
1520
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.5\.\d+'
1521
+ os_replacement: 'iOS'
1522
+ os_v1_replacement: '13'
1523
+ os_v2_replacement: '5'
1524
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.6\.\d+'
1525
+ os_replacement: 'iOS'
1526
+ os_v1_replacement: '13'
1527
+ os_v2_replacement: '6'
1528
+ - regex: 'CFNetwork/1[01].{0,100} Darwin/19\.\d+'
1529
+ os_replacement: 'iOS'
1530
+ os_v1_replacement: '13'
1531
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.1\.\d+'
1532
+ os_replacement: 'iOS'
1533
+ os_v1_replacement: '14'
1534
+ os_v2_replacement: '2'
1535
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.2\.\d+'
1536
+ os_replacement: 'iOS'
1537
+ os_v1_replacement: '14'
1538
+ os_v2_replacement: '3'
1539
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.3\.\d+'
1540
+ os_replacement: 'iOS'
1541
+ os_v1_replacement: '14'
1542
+ os_v2_replacement: '4'
1543
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.4\.\d+'
1544
+ os_replacement: 'iOS'
1545
+ os_v1_replacement: '14'
1546
+ os_v2_replacement: '5'
1547
+ - regex: 'CFNetwork/.{0,100} Darwin/(20)\.\d+'
1548
+ os_replacement: 'iOS'
1549
+ os_v1_replacement: '14'
1550
+ - regex: 'CFNetwork/.{0,100} Darwin/'
1422
1551
  os_replacement: 'iOS'
1423
1552
 
1424
1553
  # iOS Apps
@@ -1429,7 +1558,7 @@ os_parsers:
1429
1558
  ##########
1430
1559
  # Apple Watch
1431
1560
  ##########
1432
- - regex: '(watchOS)/(\d+)\.(\d+)(?:\.(\d+)|)'
1561
+ - regex: '(watchOS)[/ ](\d+)\.(\d+)(?:\.(\d+)|)'
1433
1562
  os_replacement: 'WatchOS'
1434
1563
 
1435
1564
  ##########################
@@ -1472,9 +1601,9 @@ os_parsers:
1472
1601
  ##########
1473
1602
  - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)'
1474
1603
  os_replacement: 'Symbian OS'
1475
- - regex: '(Symbian/3).+NokiaBrowser/7\.3'
1604
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.3'
1476
1605
  os_replacement: 'Symbian^3 Anna'
1477
- - regex: '(Symbian/3).+NokiaBrowser/7\.4'
1606
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.4'
1478
1607
  os_replacement: 'Symbian^3 Belle'
1479
1608
  - regex: '(Symbian/3)'
1480
1609
  os_replacement: 'Symbian^3'
@@ -1491,11 +1620,11 @@ os_parsers:
1491
1620
  ##########
1492
1621
  # BlackBerry devices
1493
1622
  ##########
1494
- - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
1623
+ - regex: '(BB10);.{1,200}Version/(\d+)\.(\d+)\.(\d+)'
1495
1624
  os_replacement: 'BlackBerry OS'
1496
1625
  - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1497
1626
  os_replacement: 'BlackBerry OS'
1498
- - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1627
+ - regex: '(Black[Bb]erry).{1,200}Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1499
1628
  os_replacement: 'BlackBerry OS'
1500
1629
  - regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
1501
1630
  os_replacement: 'BlackBerry Tablet OS'
@@ -1513,44 +1642,44 @@ os_parsers:
1513
1642
  ##########
1514
1643
  # Firefox OS
1515
1644
  ##########
1516
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\d+\.\d+'
1645
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.0 Firefox/\d+\.\d+'
1517
1646
  os_replacement: 'Firefox OS'
1518
1647
  os_v1_replacement: '1'
1519
1648
  os_v2_replacement: '0'
1520
1649
  os_v3_replacement: '1'
1521
1650
 
1522
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\d+\.\d+'
1651
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.1 Firefox/\d+\.\d+'
1523
1652
  os_replacement: 'Firefox OS'
1524
1653
  os_v1_replacement: '1'
1525
1654
  os_v2_replacement: '1'
1526
1655
 
1527
- - regex: '\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\d+\.\d+'
1656
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/26.0 Firefox/\d+\.\d+'
1528
1657
  os_replacement: 'Firefox OS'
1529
1658
  os_v1_replacement: '1'
1530
1659
  os_v2_replacement: '2'
1531
1660
 
1532
- - regex: '\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\d+\.\d+'
1661
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/28.0 Firefox/\d+\.\d+'
1533
1662
  os_replacement: 'Firefox OS'
1534
1663
  os_v1_replacement: '1'
1535
1664
  os_v2_replacement: '3'
1536
1665
 
1537
- - regex: '\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\d+\.\d+'
1666
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/30.0 Firefox/\d+\.\d+'
1538
1667
  os_replacement: 'Firefox OS'
1539
1668
  os_v1_replacement: '1'
1540
1669
  os_v2_replacement: '4'
1541
1670
 
1542
- - regex: '\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\d+\.\d+'
1671
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/32.0 Firefox/\d+\.\d+'
1543
1672
  os_replacement: 'Firefox OS'
1544
1673
  os_v1_replacement: '2'
1545
1674
  os_v2_replacement: '0'
1546
1675
 
1547
- - regex: '\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\d+\.\d+'
1676
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/34.0 Firefox/\d+\.\d+'
1548
1677
  os_replacement: 'Firefox OS'
1549
1678
  os_v1_replacement: '2'
1550
1679
  os_v2_replacement: '1'
1551
1680
 
1552
1681
  # Firefox OS Generic
1553
- - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'
1682
+ - regex: '\((?:Mobile|Tablet);.{1,200}Firefox/\d+\.\d+'
1554
1683
  os_replacement: 'Firefox OS'
1555
1684
 
1556
1685
 
@@ -1592,7 +1721,7 @@ os_parsers:
1592
1721
  - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
1593
1722
 
1594
1723
  # Gentoo Linux + Kernel Version
1595
- - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo'
1724
+ - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).{0,100}gentoo'
1596
1725
  os_replacement: 'Gentoo'
1597
1726
 
1598
1727
  # Opera Mini Bada
@@ -1600,7 +1729,7 @@ os_parsers:
1600
1729
 
1601
1730
  # just os
1602
1731
  - regex: '(Windows|Android|WeTab|Maemo|Web0S)'
1603
- - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\b)BSD)'
1732
+ - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|SerenityOS|(?:Free|Open|Net|\b)BSD)'
1604
1733
  # Linux + Kernel Version
1605
1734
  - regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+)|)|)'
1606
1735
  - regex: 'SunOS'
@@ -1624,19 +1753,19 @@ device_parsers:
1624
1753
  # Mobile Spiders
1625
1754
  # Catch the mobile crawler before checking for iPhones / Androids.
1626
1755
  #########
1627
- - regex: '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)'
1756
+ - regex: '^.{0,100}?(?:(?:iPhone|Windows CE|Windows Phone|Android).{0,300}(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.{0,200}iPhone)'
1628
1757
  regex_flag: 'i'
1629
1758
  device_replacement: 'Spider'
1630
1759
  brand_replacement: 'Spider'
1631
1760
  model_replacement: 'Smartphone'
1632
- - regex: '(?:DoCoMo|\bMOT\b|\bLG\b|Nokia|Samsung|SonyEricsson).*(?:(?:Bot|Yeti)-Mobile|bots?/\d|(?:bot|crawler)\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)'
1761
+ - regex: '^.{0,100}?(?:DoCoMo|\bMOT\b|\bLG\b|Nokia|Samsung|SonyEricsson).{0,200}(?:(?:Bot|Yeti)-Mobile|bots?/\d|(?:bot|crawler)\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)'
1633
1762
  regex_flag: 'i'
1634
1763
  device_replacement: 'Spider'
1635
1764
  brand_replacement: 'Spider'
1636
1765
  model_replacement: 'Feature Phone'
1637
1766
 
1638
1767
  # PTST / WebPageTest.org crawlers
1639
- - regex: ' PTST/\d+(?:\.)?\d+$'
1768
+ - regex: ' PTST/\d+(?:\.\d+|)$'
1640
1769
  device_replacement: 'Spider'
1641
1770
  brand_replacement: 'Spider'
1642
1771
 
@@ -1646,11 +1775,11 @@ device_parsers:
1646
1775
  brand_replacement: 'Spider'
1647
1776
 
1648
1777
  # aspiegel.com spider (owned by Huawei)
1649
- - regex: 'Mozilla.*Mobile.*AspiegelBot'
1778
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
1650
1779
  device_replacement: 'Spider'
1651
1780
  brand_replacement: 'Spider'
1652
1781
  model_replacement: 'Smartphone'
1653
- - regex: 'Mozilla.*AspiegelBot'
1782
+ - regex: 'Mozilla.{0,200}AspiegelBot'
1654
1783
  device_replacement: 'Spider'
1655
1784
  brand_replacement: 'Spider'
1656
1785
  model_replacement: 'Desktop'
@@ -1659,7 +1788,7 @@ device_parsers:
1659
1788
  # WebBrowser for SmartWatch
1660
1789
  # @ref: https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en
1661
1790
  #########
1662
- - regex: '\bSmartWatch {0,2}\( {0,2}([^;]+) {0,2}; {0,2}([^;]+) {0,2};'
1791
+ - regex: '\bSmartWatch {0,2}\( {0,2}([^;]{1,200}) {0,2}; {0,2}([^;]{1,200}) {0,2};'
1663
1792
  device_replacement: '$1 $2'
1664
1793
  brand_replacement: '$1'
1665
1794
  model_replacement: '$2'
@@ -1671,16 +1800,16 @@ device_parsers:
1671
1800
  ######################################################################
1672
1801
 
1673
1802
  # Android Application
1674
- - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson|) (.+) \w+ - '
1803
+ - regex: 'Android Application[^\-]{1,300} - (Sony) ?(Ericsson|) (.{1,200}) \w{1,20} - '
1675
1804
  device_replacement: '$1 $2'
1676
1805
  brand_replacement: '$1$2'
1677
1806
  model_replacement: '$3'
1678
- - regex: 'Android Application[^\-]+ - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.+) \w+ - '
1807
+ - regex: 'Android Application[^\-]{1,300} - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.{1,200}) \w{1,20} - '
1679
1808
  regex_flag: 'i'
1680
1809
  device_replacement: '$1 $2'
1681
1810
  brand_replacement: '$1'
1682
1811
  model_replacement: '$2'
1683
- - regex: 'Android Application[^\-]+ - ([^ ]+) (.+) \w+ - '
1812
+ - regex: 'Android Application[^\-]{1,300} - ([^ ]+) (.{1,200}) \w{1,20} - '
1684
1813
  device_replacement: '$1 $2'
1685
1814
  brand_replacement: '$1'
1686
1815
  model_replacement: '$2'
@@ -1689,11 +1818,11 @@ device_parsers:
1689
1818
  # 3Q
1690
1819
  # @ref: http://www.3q-int.com/
1691
1820
  #########
1692
- - regex: '; *([BLRQ]C\d{4}[A-Z]+?)(?: Build|\) AppleWebKit)'
1821
+ - regex: '; {0,2}([BLRQ]C\d{4}[A-Z]{1,100}?)(?: Build|\) AppleWebKit)'
1693
1822
  device_replacement: '3Q $1'
1694
1823
  brand_replacement: '3Q'
1695
1824
  model_replacement: '$1'
1696
- - regex: '; *(?:3Q_)([^;/]+?)(?: Build|\) AppleWebKit)'
1825
+ - regex: '; {0,2}(?:3Q_)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1697
1826
  device_replacement: '3Q $1'
1698
1827
  brand_replacement: '3Q'
1699
1828
  model_replacement: '$1'
@@ -1702,19 +1831,19 @@ device_parsers:
1702
1831
  # Acer
1703
1832
  # @ref: http://us.acer.com/ac/en/US/content/group/tablets
1704
1833
  #########
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)'
1834
+ - regex: 'Android [34].{0,200}; {0,2}(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[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1706
1835
  device_replacement: '$1'
1707
1836
  brand_replacement: 'Acer'
1708
1837
  model_replacement: '$1'
1709
- - regex: '; *Acer Iconia Tab ([^;/]+?)(?: Build|\) AppleWebKit)'
1838
+ - regex: '; {0,2}Acer Iconia Tab ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1710
1839
  device_replacement: '$1'
1711
1840
  brand_replacement: 'Acer'
1712
1841
  model_replacement: '$1'
1713
- - regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+)(?: Build|\) AppleWebKit)'
1842
+ - regex: '; {0,2}(Z1[1235]0|E320[^/]{0,10}|S500|S510|Liquid[^;/]{0,30}|Iconia A\d+)(?: Build|\) AppleWebKit)'
1714
1843
  device_replacement: '$1'
1715
1844
  brand_replacement: 'Acer'
1716
1845
  model_replacement: '$1'
1717
- - regex: '; *(Acer |ACER )([^;/]+?)(?: Build|\) AppleWebKit)'
1846
+ - regex: '; {0,2}(Acer |ACER )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1718
1847
  device_replacement: '$1$2'
1719
1848
  brand_replacement: 'Acer'
1720
1849
  model_replacement: '$2'
@@ -1725,7 +1854,7 @@ device_parsers:
1725
1854
  # @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
1726
1855
  # custom ROM builds for Vega
1727
1856
  #########
1728
- - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).*?(?: Build|\) AppleWebKit)'
1857
+ - regex: '; {0,2}(Advent |)(Vega(?:Bean|Comb|)).{0,200}?(?: Build|\) AppleWebKit)'
1729
1858
  device_replacement: '$1$2'
1730
1859
  brand_replacement: 'Advent'
1731
1860
  model_replacement: '$2'
@@ -1734,7 +1863,7 @@ device_parsers:
1734
1863
  # Ainol
1735
1864
  # @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
1736
1865
  #########
1737
- - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+?)(?: Build|\) AppleWebKit)'
1866
+ - regex: '; {0,2}(Ainol |)((?:NOVO|[Nn]ovo)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1738
1867
  device_replacement: '$1$2'
1739
1868
  brand_replacement: 'Ainol'
1740
1869
  model_replacement: '$2'
@@ -1743,12 +1872,12 @@ device_parsers:
1743
1872
  # Airis
1744
1873
  # @ref: http://airis.es/Tienda/Default.aspx?idG=001
1745
1874
  #########
1746
- - regex: '; *AIRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
1875
+ - regex: '; {0,2}AIRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
1747
1876
  regex_flag: 'i'
1748
1877
  device_replacement: '$1'
1749
1878
  brand_replacement: 'Airis'
1750
1879
  model_replacement: '$1'
1751
- - regex: '; *(OnePAD[^;/]+?)(?: Build|\) AppleWebKit)'
1880
+ - regex: '; {0,2}(OnePAD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1752
1881
  regex_flag: 'i'
1753
1882
  device_replacement: '$1'
1754
1883
  brand_replacement: 'Airis'
@@ -1758,7 +1887,7 @@ device_parsers:
1758
1887
  # Airpad
1759
1888
  # @ref: ??
1760
1889
  #########
1761
- - regex: '; *Airpad[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
1890
+ - regex: '; {0,2}Airpad[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1762
1891
  device_replacement: 'Airpad $1'
1763
1892
  brand_replacement: 'Airpad'
1764
1893
  model_replacement: '$1'
@@ -1767,29 +1896,29 @@ device_parsers:
1767
1896
  # Alcatel - TCT
1768
1897
  # @ref: http://www.alcatelonetouch.com/global-en/products/smartphones.html
1769
1898
  #########
1770
- - regex: '; *(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1899
+ - regex: '; {0,2}(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1771
1900
  device_replacement: 'Alcatel One Touch $2'
1772
1901
  brand_replacement: 'Alcatel'
1773
1902
  model_replacement: 'One Touch $2'
1774
- - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+?)(?: Build|\) AppleWebKit)'
1903
+ - regex: '; {0,2}(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1775
1904
  regex_flag: 'i'
1776
1905
  device_replacement: 'Alcatel One Touch $1'
1777
1906
  brand_replacement: 'Alcatel'
1778
1907
  model_replacement: 'One Touch $1'
1779
- - regex: '; *(TCL)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
1908
+ - regex: '; {0,2}(TCL)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1780
1909
  device_replacement: '$1 $2'
1781
1910
  brand_replacement: '$1'
1782
1911
  model_replacement: '$2'
1783
1912
  # operator specific models
1784
- - regex: '; *(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1913
+ - regex: '; {0,2}(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1785
1914
  device_replacement: 'Alcatel $1'
1786
1915
  brand_replacement: 'Alcatel'
1787
1916
  model_replacement: '$1'
1788
- - regex: '; *BASE_Lutea_3(?: Build|\) AppleWebKit)'
1917
+ - regex: '; {0,2}BASE_Lutea_3(?: Build|\) AppleWebKit)'
1789
1918
  device_replacement: 'Alcatel One Touch 998'
1790
1919
  brand_replacement: 'Alcatel'
1791
1920
  model_replacement: 'One Touch 998'
1792
- - regex: '; *BASE_Varia(?: Build|\) AppleWebKit)'
1921
+ - regex: '; {0,2}BASE_Varia(?: Build|\) AppleWebKit)'
1793
1922
  device_replacement: 'Alcatel One Touch 918D'
1794
1923
  brand_replacement: 'Alcatel'
1795
1924
  model_replacement: 'One Touch 918D'
@@ -1798,7 +1927,7 @@ device_parsers:
1798
1927
  # Allfine
1799
1928
  # @ref: http://www.myallfine.com/Products.asp
1800
1929
  #########
1801
- - regex: '; *((?:FINE|Fine)\d[^;/]+?)(?: Build|\) AppleWebKit)'
1930
+ - regex: '; {0,2}((?:FINE|Fine)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1802
1931
  device_replacement: '$1'
1803
1932
  brand_replacement: 'Allfine'
1804
1933
  model_replacement: '$1'
@@ -1807,15 +1936,15 @@ device_parsers:
1807
1936
  # Allview
1808
1937
  # @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
1809
1938
  #########
1810
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*?)(?: Build|\) AppleWebKit)'
1939
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).{0,200}?)(?: Build|\) AppleWebKit)'
1811
1940
  device_replacement: '$1$2'
1812
1941
  brand_replacement: 'Allview'
1813
1942
  model_replacement: '$2'
1814
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1943
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1815
1944
  device_replacement: '$1$2'
1816
1945
  brand_replacement: 'Allview'
1817
1946
  model_replacement: '$2'
1818
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1947
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1819
1948
  device_replacement: '$1$2'
1820
1949
  brand_replacement: 'Allview'
1821
1950
  model_replacement: '$2'
@@ -1825,11 +1954,11 @@ device_parsers:
1825
1954
  # @ref: http://www.allwinner.com/
1826
1955
  # @models: A31 (13.3"),A20,A10,
1827
1956
  #########
1828
- - regex: '; *(A13-MID)(?: Build|\) AppleWebKit)'
1957
+ - regex: '; {0,2}(A13-MID)(?: Build|\) AppleWebKit)'
1829
1958
  device_replacement: '$1'
1830
1959
  brand_replacement: 'Allwinner'
1831
1960
  model_replacement: '$1'
1832
- - regex: '; *(Allwinner)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
1961
+ - regex: '; {0,2}(Allwinner)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1833
1962
  device_replacement: '$1 $2'
1834
1963
  brand_replacement: 'Allwinner'
1835
1964
  model_replacement: '$1'
@@ -1838,7 +1967,7 @@ device_parsers:
1838
1967
  # Amaway
1839
1968
  # @ref: http://www.amaway.cn/
1840
1969
  #########
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)'
1970
+ - regex: '; {0,2}(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)'
1842
1971
  device_replacement: '$1'
1843
1972
  brand_replacement: 'Amaway'
1844
1973
  model_replacement: '$1'
@@ -1847,11 +1976,11 @@ device_parsers:
1847
1976
  # Amoi
1848
1977
  # @ref: http://www.amoi.com/en/prd/prd_index.jspx
1849
1978
  #########
1850
- - regex: '; *(?:AMOI|Amoi)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
1979
+ - regex: '; {0,2}(?:AMOI|Amoi)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1851
1980
  device_replacement: 'Amoi $1'
1852
1981
  brand_replacement: 'Amoi'
1853
1982
  model_replacement: '$1'
1854
- - regex: '^(?:AMOI|Amoi)[ _]([^;/]+?) Linux'
1983
+ - regex: '^(?:AMOI|Amoi)[ _]([^;/]{1,100}?) Linux'
1855
1984
  device_replacement: 'Amoi $1'
1856
1985
  brand_replacement: 'Amoi'
1857
1986
  model_replacement: '$1'
@@ -1860,7 +1989,7 @@ device_parsers:
1860
1989
  # Aoc
1861
1990
  # @ref: http://latin.aoc.com/media_tablet
1862
1991
  #########
1863
- - regex: '; *(MW(?:0[789]|10)[^;/]+?)(?: Build|\) AppleWebKit)'
1992
+ - regex: '; {0,2}(MW(?:0[789]|10)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1864
1993
  device_replacement: '$1'
1865
1994
  brand_replacement: 'Aoc'
1866
1995
  model_replacement: '$1'
@@ -1871,11 +2000,11 @@ device_parsers:
1871
2000
  # @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
1872
2001
  # @note: brand owned by luckystar
1873
2002
  #########
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)'
2003
+ - regex: '; {0,2}(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)'
1875
2004
  device_replacement: 'Aoson $1'
1876
2005
  brand_replacement: 'Aoson'
1877
2006
  model_replacement: '$1'
1878
- - regex: '; *Aoson ([^;/]+?)(?: Build|\) AppleWebKit)'
2007
+ - regex: '; {0,2}Aoson ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1879
2008
  regex_flag: 'i'
1880
2009
  device_replacement: 'Aoson $1'
1881
2010
  brand_replacement: 'Aoson'
@@ -1885,7 +2014,7 @@ device_parsers:
1885
2014
  # Apanda
1886
2015
  # @ref: http://www.apanda.com.cn/
1887
2016
  #########
1888
- - regex: '; *[Aa]panda[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2017
+ - regex: '; {0,2}[Aa]panda[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1889
2018
  device_replacement: 'Apanda $1'
1890
2019
  brand_replacement: 'Apanda'
1891
2020
  model_replacement: '$1'
@@ -1895,23 +2024,23 @@ device_parsers:
1895
2024
  # @ref: http://www.archos.com/de/products/tablets.html
1896
2025
  # @ref: http://www.archos.com/de/products/smartphones/index.html
1897
2026
  #########
1898
- - regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|\) AppleWebKit)'
2027
+ - regex: '; {0,2}(?:ARCHOS|Archos) ?(GAMEPAD.{0,200}?)(?: Build|\) AppleWebKit)'
1899
2028
  device_replacement: 'Archos $1'
1900
2029
  brand_replacement: 'Archos'
1901
2030
  model_replacement: '$1'
1902
- - regex: 'ARCHOS; GOGI; ([^;]+);'
2031
+ - regex: 'ARCHOS; GOGI; ([^;]{1,200});'
1903
2032
  device_replacement: 'Archos $1'
1904
2033
  brand_replacement: 'Archos'
1905
2034
  model_replacement: '$1'
1906
- - regex: '(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\(\)\-]|$)'
2035
+ - regex: '(?:ARCHOS|Archos)[ _]?(.{0,200}?)(?: Build|[;/\(\)\-]|$)'
1907
2036
  device_replacement: 'Archos $1'
1908
2037
  brand_replacement: 'Archos'
1909
2038
  model_replacement: '$1'
1910
- - regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
2039
+ - regex: '; {0,2}(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
1911
2040
  device_replacement: 'Archos $1'
1912
2041
  brand_replacement: 'Archos'
1913
2042
  model_replacement: '$1'
1914
- - regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
2043
+ - regex: '; {0,2}(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
1915
2044
  device_replacement: 'Archos $1'
1916
2045
  brand_replacement: 'Archos'
1917
2046
  model_replacement: '$1'
@@ -1920,11 +2049,11 @@ device_parsers:
1920
2049
  # A-rival
1921
2050
  # @ref: http://www.a-rival.de/de/
1922
2051
  #########
1923
- - regex: '; *(PAD-FMD[^;/]+?)(?: Build|\) AppleWebKit)'
2052
+ - regex: '; {0,2}(PAD-FMD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1924
2053
  device_replacement: '$1'
1925
2054
  brand_replacement: 'Arival'
1926
2055
  model_replacement: '$1'
1927
- - regex: '; *(BioniQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
2056
+ - regex: '; {0,2}(BioniQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1928
2057
  device_replacement: '$1 $2'
1929
2058
  brand_replacement: 'Arival'
1930
2059
  model_replacement: '$1 $2'
@@ -1933,11 +2062,11 @@ device_parsers:
1933
2062
  # Arnova
1934
2063
  # @ref: http://arnovatech.com/
1935
2064
  #########
1936
- - regex: '; *(AN\d[^;/]+|ARCHM\d+)(?: Build|\) AppleWebKit)'
2065
+ - regex: '; {0,2}(AN\d[^;/]{1,100}|ARCHM\d+)(?: Build|\) AppleWebKit)'
1937
2066
  device_replacement: 'Arnova $1'
1938
2067
  brand_replacement: 'Arnova'
1939
2068
  model_replacement: '$1'
1940
- - regex: '; *(?:ARNOVA|Arnova) ?([^;/]+?)(?: Build|\) AppleWebKit)'
2069
+ - regex: '; {0,2}(?:ARNOVA|Arnova) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1941
2070
  device_replacement: 'Arnova $1'
1942
2071
  brand_replacement: 'Arnova'
1943
2072
  model_replacement: '$1'
@@ -1946,7 +2075,7 @@ device_parsers:
1946
2075
  # Assistant
1947
2076
  # @ref: http://www.assistant.ua
1948
2077
  #########
1949
- - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
2078
+ - regex: '; {0,2}(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
1950
2079
  device_replacement: 'Assistant $1-$2'
1951
2080
  brand_replacement: 'Assistant'
1952
2081
  model_replacement: '$1-$2'
@@ -1955,11 +2084,11 @@ device_parsers:
1955
2084
  # Asus
1956
2085
  # @ref: http://www.asus.com/uk/Tablets_Mobile/
1957
2086
  #########
1958
- - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
2087
+ - regex: '; {0,2}(ME17\d[^;/]*|ME3\d{2}[^;/]{1,100}|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
1959
2088
  device_replacement: 'Asus $1'
1960
2089
  brand_replacement: 'Asus'
1961
2090
  model_replacement: '$1'
1962
- - regex: '; *ASUS[ _]*([^;/]+?)(?: Build|\) AppleWebKit)'
2091
+ - regex: '; {0,2}ASUS[ _]{0,10}([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1963
2092
  device_replacement: 'Asus $1'
1964
2093
  brand_replacement: 'Asus'
1965
2094
  model_replacement: '$1'
@@ -1967,11 +2096,11 @@ device_parsers:
1967
2096
  #########
1968
2097
  # Garmin-Asus
1969
2098
  #########
1970
- - regex: '; *Garmin-Asus ([^;/]+?)(?: Build|\) AppleWebKit)'
2099
+ - regex: '; {0,2}Garmin-Asus ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1971
2100
  device_replacement: 'Garmin-Asus $1'
1972
2101
  brand_replacement: 'Garmin-Asus'
1973
2102
  model_replacement: '$1'
1974
- - regex: '; *(Garminfone)(?: Build|\) AppleWebKit)'
2103
+ - regex: '; {0,2}(Garminfone)(?: Build|\) AppleWebKit)'
1975
2104
  device_replacement: 'Garmin $1'
1976
2105
  brand_replacement: 'Garmin-Asus'
1977
2106
  model_replacement: '$1'
@@ -1980,7 +2109,7 @@ device_parsers:
1980
2109
  # Attab
1981
2110
  # @ref: http://www.theattab.com/
1982
2111
  #########
1983
- - regex: '; (@TAB-[^;/]+?)(?: Build|\) AppleWebKit)'
2112
+ - regex: '; (@TAB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1984
2113
  device_replacement: '$1'
1985
2114
  brand_replacement: 'Attab'
1986
2115
  model_replacement: '$1'
@@ -1990,7 +2119,7 @@ device_parsers:
1990
2119
  # @ref: ??
1991
2120
  # @note: Take care with Docomo T-01 Toshiba
1992
2121
  #########
1993
- - regex: '; *(T-(?:07|[^0]\d)[^;/]+?)(?: Build|\) AppleWebKit)'
2122
+ - regex: '; {0,2}(T-(?:07|[^0]\d)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1994
2123
  device_replacement: '$1'
1995
2124
  brand_replacement: 'Audiosonic'
1996
2125
  model_replacement: '$1'
@@ -1999,7 +2128,7 @@ device_parsers:
1999
2128
  # Axioo
2000
2129
  # @ref: http://www.axiooworld.com/ww/index.php
2001
2130
  #########
2002
- - regex: '; *(?:Axioo[ _\-]([^;/]+?)|(picopad)[ _\-]([^;/]+?))(?: Build|\) AppleWebKit)'
2131
+ - regex: '; {0,2}(?:Axioo[ _\-]([^;/]{1,100}?)|(picopad)[ _\-]([^;/]{1,100}?))(?: Build|\) AppleWebKit)'
2003
2132
  regex_flag: 'i'
2004
2133
  device_replacement: 'Axioo $1$2 $3'
2005
2134
  brand_replacement: 'Axioo'
@@ -2009,7 +2138,7 @@ device_parsers:
2009
2138
  # Azend
2010
2139
  # @ref: http://azendcorp.com/index.php/products/portable-electronics
2011
2140
  #########
2012
- - regex: '; *(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
2141
+ - regex: '; {0,2}(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
2013
2142
  device_replacement: '$1'
2014
2143
  brand_replacement: 'Azend'
2015
2144
  model_replacement: '$1'
@@ -2018,7 +2147,7 @@ device_parsers:
2018
2147
  # Bak
2019
2148
  # @ref: http://www.bakinternational.com/produtos.php?cat=80
2020
2149
  #########
2021
- - regex: '; *(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
2150
+ - regex: '; {0,2}(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
2022
2151
  regex_flag: 'i'
2023
2152
  device_replacement: '$1'
2024
2153
  brand_replacement: 'Bak'
@@ -2029,7 +2158,7 @@ device_parsers:
2029
2158
  # @ref: http://www.bedove.com/product.html
2030
2159
  # @models: HY6501|HY5001|X12|X21|I5
2031
2160
  #########
2032
- - regex: '; *(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
2161
+ - regex: '; {0,2}(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
2033
2162
  device_replacement: 'Bedove $1'
2034
2163
  brand_replacement: 'Bedove'
2035
2164
  model_replacement: '$1'
@@ -2038,7 +2167,7 @@ device_parsers:
2038
2167
  # Benss
2039
2168
  # @ref: http://www.benss.net/
2040
2169
  #########
2041
- - regex: '; *(JC-[^;/]*)(?: Build|\) AppleWebKit)'
2170
+ - regex: '; {0,2}(JC-[^;/]*)(?: Build|\) AppleWebKit)'
2042
2171
  device_replacement: 'Benss $1'
2043
2172
  brand_replacement: 'Benss'
2044
2173
  model_replacement: '$1'
@@ -2048,7 +2177,7 @@ device_parsers:
2048
2177
  # @ref: http://uk.blackberry.com/
2049
2178
  # @note: Android Apps seams to be used here
2050
2179
  #########
2051
- - regex: '; *(BB) ([^;/]+?)(?: Build|\) AppleWebKit)'
2180
+ - regex: '; {0,2}(BB) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2052
2181
  device_replacement: '$1 $2'
2053
2182
  brand_replacement: 'Blackberry'
2054
2183
  model_replacement: '$2'
@@ -2057,11 +2186,11 @@ device_parsers:
2057
2186
  # Blackbird
2058
2187
  # @ref: http://iblackbird.co.kr
2059
2188
  #########
2060
- - regex: '; *(BlackBird)[ _](I8.*?)(?: Build|\) AppleWebKit)'
2189
+ - regex: '; {0,2}(BlackBird)[ _](I8.{0,200}?)(?: Build|\) AppleWebKit)'
2061
2190
  device_replacement: '$1 $2'
2062
2191
  brand_replacement: '$1'
2063
2192
  model_replacement: '$2'
2064
- - regex: '; *(BlackBird)[ _](.*?)(?: Build|\) AppleWebKit)'
2193
+ - regex: '; {0,2}(BlackBird)[ _](.{0,200}?)(?: Build|\) AppleWebKit)'
2065
2194
  device_replacement: '$1 $2'
2066
2195
  brand_replacement: '$1'
2067
2196
  model_replacement: '$2'
@@ -2071,7 +2200,7 @@ device_parsers:
2071
2200
  # @ref: http://www.blaupunkt.com
2072
2201
  #########
2073
2202
  # Endeavour
2074
- - regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+?)(?: Build|\) AppleWebKit)'
2203
+ - regex: '; {0,2}([0-9]+BP[EM][^;/]*|Endeavour[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2075
2204
  device_replacement: 'Blaupunkt $1'
2076
2205
  brand_replacement: 'Blaupunkt'
2077
2206
  model_replacement: '$1'
@@ -2080,12 +2209,12 @@ device_parsers:
2080
2209
  # Blu
2081
2210
  # @ref: http://bluproducts.com
2082
2211
  #########
2083
- - regex: '; *((?:BLU|Blu)[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
2212
+ - regex: '; {0,2}((?:BLU|Blu)[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2084
2213
  device_replacement: '$1$2'
2085
2214
  brand_replacement: 'Blu'
2086
2215
  model_replacement: '$2'
2087
2216
  # BMOBILE = operator branded device
2088
- - regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
2217
+ - regex: '; {0,2}(?:BMOBILE )?(Blu|BLU|DASH [^;/]{1,100}|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
2089
2218
  device_replacement: '$1'
2090
2219
  brand_replacement: 'Blu'
2091
2220
  model_replacement: '$1'
@@ -2095,7 +2224,7 @@ device_parsers:
2095
2224
  # @ref: http://www.blusens.com/es/?sg=1&sv=al&roc=1
2096
2225
  #########
2097
2226
  # tablet
2098
- - regex: '; *(TOUCH\d[^;/]+?)(?: Build|\) AppleWebKit)'
2227
+ - regex: '; {0,2}(TOUCH\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2099
2228
  device_replacement: '$1'
2100
2229
  brand_replacement: 'Blusens'
2101
2230
  model_replacement: '$1'
@@ -2106,7 +2235,7 @@ device_parsers:
2106
2235
  # @note: Might collide with Maxx as AX is used also there.
2107
2236
  #########
2108
2237
  # smartphone
2109
- - regex: '; *(AX5\d+)(?: Build|\) AppleWebKit)'
2238
+ - regex: '; {0,2}(AX5\d+)(?: Build|\) AppleWebKit)'
2110
2239
  device_replacement: '$1'
2111
2240
  brand_replacement: 'Bmobile'
2112
2241
  model_replacement: '$1'
@@ -2115,11 +2244,11 @@ device_parsers:
2115
2244
  # bq
2116
2245
  # @ref: http://bqreaders.com
2117
2246
  #########
2118
- - regex: '; *([Bb]q) ([^;/]+?);?(?: Build|\) AppleWebKit)'
2247
+ - regex: '; {0,2}([Bb]q) ([^;/]{1,100}?);?(?: Build|\) AppleWebKit)'
2119
2248
  device_replacement: '$1 $2'
2120
2249
  brand_replacement: 'bq'
2121
2250
  model_replacement: '$2'
2122
- - regex: '; *(Maxwell [^;/]+?)(?: Build|\) AppleWebKit)'
2251
+ - regex: '; {0,2}(Maxwell [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2123
2252
  device_replacement: '$1'
2124
2253
  brand_replacement: 'bq'
2125
2254
  model_replacement: '$1'
@@ -2128,7 +2257,7 @@ device_parsers:
2128
2257
  # Braun Phototechnik
2129
2258
  # @ref: http://www.braun-phototechnik.de/en/products/list/~pcat.250/Tablet-PC.html
2130
2259
  #########
2131
- - regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+?)(?: Build|\) AppleWebKit)'
2260
+ - regex: '; {0,2}((?:B-Tab|B-TAB) ?\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2132
2261
  device_replacement: '$1'
2133
2262
  brand_replacement: 'Braun'
2134
2263
  model_replacement: '$1'
@@ -2137,7 +2266,7 @@ device_parsers:
2137
2266
  # Broncho
2138
2267
  # @ref: http://www.broncho.cn/
2139
2268
  #########
2140
- - regex: '; *(Broncho) ([^;/]+?)(?: Build|\) AppleWebKit)'
2269
+ - regex: '; {0,2}(Broncho) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2141
2270
  device_replacement: '$1 $2'
2142
2271
  brand_replacement: '$1'
2143
2272
  model_replacement: '$2'
@@ -2146,7 +2275,7 @@ device_parsers:
2146
2275
  # Captiva
2147
2276
  # @ref: http://www.captiva-power.de
2148
2277
  #########
2149
- - regex: '; *CAPTIVA ([^;/]+?)(?: Build|\) AppleWebKit)'
2278
+ - regex: '; {0,2}CAPTIVA ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2150
2279
  device_replacement: 'Captiva $1'
2151
2280
  brand_replacement: 'Captiva'
2152
2281
  model_replacement: '$1'
@@ -2155,7 +2284,7 @@ device_parsers:
2155
2284
  # Casio
2156
2285
  # @ref: http://www.casiogzone.com/
2157
2286
  #########
2158
- - regex: '; *(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2287
+ - regex: '; {0,2}(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2159
2288
  device_replacement: '$1'
2160
2289
  brand_replacement: 'Casio'
2161
2290
  model_replacement: '$1'
@@ -2164,15 +2293,15 @@ device_parsers:
2164
2293
  # Cat
2165
2294
  # @ref: http://www.cat-sound.com
2166
2295
  #########
2167
- - regex: '; *(?:Cat|CAT) ([^;/]+?)(?: Build|\) AppleWebKit)'
2296
+ - regex: '; {0,2}(?:Cat|CAT) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2168
2297
  device_replacement: 'Cat $1'
2169
2298
  brand_replacement: 'Cat'
2170
2299
  model_replacement: '$1'
2171
- - regex: '; *(?:Cat)(Nova.*?)(?: Build|\) AppleWebKit)'
2300
+ - regex: '; {0,2}(?:Cat)(Nova.{0,200}?)(?: Build|\) AppleWebKit)'
2172
2301
  device_replacement: 'Cat $1'
2173
2302
  brand_replacement: 'Cat'
2174
2303
  model_replacement: '$1'
2175
- - regex: '; *(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2304
+ - regex: '; {0,2}(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2176
2305
  device_replacement: '$1'
2177
2306
  brand_replacement: 'Cat'
2178
2307
  model_replacement: 'Tablet PHOENIX 8.1J0'
@@ -2182,7 +2311,7 @@ device_parsers:
2182
2311
  # @ref: http://www.celkonmobiles.com/?_a=products
2183
2312
  # @models: A10, A19Q, A101, A105, A107, A107\+, A112, A118, A119, A119Q, A15, A19, A20, A200, A220, A225, A22 Race, A27, A58, A59, A60, A62, A63, A64, A66, A67, A69, A75, A77, A79, A8\+, A83, A85, A86, A87, A89 Ultima, A9\+, A90, A900, A95, A97i, A98, AR 40, AR 45, AR 50, ML5
2184
2313
  #########
2185
- - regex: '; *(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2314
+ - regex: '; {0,2}(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2186
2315
  device_replacement: '$1'
2187
2316
  brand_replacement: 'Celkon'
2188
2317
  model_replacement: '$1'
@@ -2190,12 +2319,12 @@ device_parsers:
2190
2319
  device_replacement: '$1'
2191
2320
  brand_replacement: 'Celkon'
2192
2321
  model_replacement: '$1'
2193
- - regex: '; *(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2322
+ - regex: '; {0,2}(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2194
2323
  device_replacement: '$1$2'
2195
2324
  brand_replacement: 'Celkon'
2196
2325
  model_replacement: '$1$2'
2197
2326
  # smartphones
2198
- - regex: '; *(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2327
+ - regex: '; {0,2}(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2199
2328
  device_replacement: '$1'
2200
2329
  brand_replacement: 'Celkon'
2201
2330
  model_replacement: '$1'
@@ -2206,7 +2335,7 @@ device_parsers:
2206
2335
  # @brief: China manufacturer makes tablets for different small brands
2207
2336
  # (eg. http://www.zeepad.net/index.html)
2208
2337
  #########
2209
- - regex: '; *(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2338
+ - regex: '; {0,2}(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2210
2339
  device_replacement: '$1'
2211
2340
  brand_replacement: 'ChangJia'
2212
2341
  model_replacement: '$1'
@@ -2215,15 +2344,15 @@ device_parsers:
2215
2344
  # Cloudfone
2216
2345
  # @ref: http://www.cloudfonemobile.com/
2217
2346
  #########
2218
- - regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+?)(?: Build|\) AppleWebKit)'
2347
+ - regex: '; {0,2}(Cloudfone)[ _](Excite)([^ ][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2219
2348
  device_replacement: '$1 $2 $3'
2220
2349
  brand_replacement: 'Cloudfone'
2221
2350
  model_replacement: '$1 $2 $3'
2222
- - regex: '; *(Excite|ICE)[ _](\d+[^;/]+?)(?: Build|\) AppleWebKit)'
2351
+ - regex: '; {0,2}(Excite|ICE)[ _](\d+[^;/]{0,100}?)(?: Build|\) AppleWebKit)'
2223
2352
  device_replacement: 'Cloudfone $1 $2'
2224
2353
  brand_replacement: 'Cloudfone'
2225
2354
  model_replacement: 'Cloudfone $1 $2'
2226
- - regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2355
+ - regex: '; {0,2}(Cloudfone|CloudPad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2227
2356
  device_replacement: '$1 $2'
2228
2357
  brand_replacement: 'Cloudfone'
2229
2358
  model_replacement: '$1 $2'
@@ -2232,7 +2361,7 @@ device_parsers:
2232
2361
  # Cmx
2233
2362
  # @ref: http://cmx.at/de/
2234
2363
  #########
2235
- - regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+?)(?: Build|\) AppleWebKit)'
2364
+ - regex: '; {0,2}((?:Aquila|Clanga|Rapax)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2236
2365
  regex_flag: 'i'
2237
2366
  device_replacement: '$1'
2238
2367
  brand_replacement: 'Cmx'
@@ -2243,7 +2372,7 @@ device_parsers:
2243
2372
  # @ref: http://cobykyros.com
2244
2373
  # @note: Be careful with MID\d{3} from MpMan or Manta
2245
2374
  #########
2246
- - regex: '; *(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? *(?:Build|[;\)])'
2375
+ - regex: '; {0,2}(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? {0,2}(?:Build|[;\)])'
2247
2376
  device_replacement: 'CobyKyros $1$2'
2248
2377
  brand_replacement: 'CobyKyros'
2249
2378
  model_replacement: '$1$2'
@@ -2252,7 +2381,7 @@ device_parsers:
2252
2381
  # Coolpad
2253
2382
  # @ref: ??
2254
2383
  #########
2255
- - regex: '; *([^;/]*)Coolpad[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2384
+ - regex: '; {0,2}([^;/]{0,50})Coolpad[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2256
2385
  device_replacement: '$1$2'
2257
2386
  brand_replacement: 'Coolpad'
2258
2387
  model_replacement: '$1$2'
@@ -2261,7 +2390,7 @@ device_parsers:
2261
2390
  # Cube
2262
2391
  # @ref: http://www.cube-tablet.com/buy-products.html
2263
2392
  #########
2264
- - regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*?|A5300)(?: Build|\) AppleWebKit)'
2393
+ - regex: '; {0,2}(CUBE[ _])?([KU][0-9]+ ?GT.{0,200}?|A5300)(?: Build|\) AppleWebKit)'
2265
2394
  regex_flag: 'i'
2266
2395
  device_replacement: '$1$2'
2267
2396
  brand_replacement: 'Cube'
@@ -2271,12 +2400,12 @@ device_parsers:
2271
2400
  # Cubot
2272
2401
  # @ref: http://www.cubotmall.com/
2273
2402
  #########
2274
- - regex: '; *CUBOT ([^;/]+?)(?: Build|\) AppleWebKit)'
2403
+ - regex: '; {0,2}CUBOT ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2275
2404
  regex_flag: 'i'
2276
2405
  device_replacement: '$1'
2277
2406
  brand_replacement: 'Cubot'
2278
2407
  model_replacement: '$1'
2279
- - regex: '; *(BOBBY)(?: Build|\) AppleWebKit)'
2408
+ - regex: '; {0,2}(BOBBY)(?: Build|\) AppleWebKit)'
2280
2409
  regex_flag: 'i'
2281
2410
  device_replacement: '$1'
2282
2411
  brand_replacement: 'Cubot'
@@ -2286,7 +2415,7 @@ device_parsers:
2286
2415
  # Danew
2287
2416
  # @ref: http://www.danew.com/produits-tablette.php
2288
2417
  #########
2289
- - regex: '; *(Dslide [^;/]+?)(?: Build|\) AppleWebKit)'
2418
+ - regex: '; {0,2}(Dslide [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2290
2419
  device_replacement: '$1'
2291
2420
  brand_replacement: 'Danew'
2292
2421
  model_replacement: '$1'
@@ -2300,39 +2429,39 @@ device_parsers:
2300
2429
  # @ref: http://www.dell.com/in/p/mobile-xcd28/pd
2301
2430
  # @ref: http://www.dell.com/in/p/mobile-xcd35/pd
2302
2431
  #########
2303
- - regex: '; *(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2432
+ - regex: '; {0,2}(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2304
2433
  device_replacement: 'Dell $1$2'
2305
2434
  brand_replacement: 'Dell'
2306
2435
  model_replacement: '$1$2'
2307
- - regex: '; *(001DL)(?: Build|\) AppleWebKit)'
2436
+ - regex: '; {0,2}(001DL)(?: Build|\) AppleWebKit)'
2308
2437
  device_replacement: 'Dell $1'
2309
2438
  brand_replacement: 'Dell'
2310
2439
  model_replacement: 'Streak'
2311
- - regex: '; *(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2440
+ - regex: '; {0,2}(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2312
2441
  device_replacement: 'Dell $1'
2313
2442
  brand_replacement: 'Dell'
2314
2443
  model_replacement: 'Streak'
2315
- - regex: '; *(101DL|GS01|Streak Pro[^;/]*)(?: Build|\) AppleWebKit)'
2444
+ - regex: '; {0,2}(101DL|GS01|Streak Pro[^;/]{0,100})(?: Build|\) AppleWebKit)'
2316
2445
  device_replacement: 'Dell $1'
2317
2446
  brand_replacement: 'Dell'
2318
2447
  model_replacement: 'Streak Pro'
2319
- - regex: '; *([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2448
+ - regex: '; {0,2}([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2320
2449
  device_replacement: 'Dell $1'
2321
2450
  brand_replacement: 'Dell'
2322
2451
  model_replacement: 'Streak 7'
2323
- - regex: '; *(Mini-3iX)(?: Build|\) AppleWebKit)'
2452
+ - regex: '; {0,2}(Mini-3iX)(?: Build|\) AppleWebKit)'
2324
2453
  device_replacement: 'Dell $1'
2325
2454
  brand_replacement: 'Dell'
2326
2455
  model_replacement: '$1'
2327
- - regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2456
+ - regex: '; {0,2}(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.{0,200}?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2328
2457
  device_replacement: 'Dell $1'
2329
2458
  brand_replacement: 'Dell'
2330
2459
  model_replacement: '$1'
2331
- - regex: '; *Dell[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2460
+ - regex: '; {0,2}Dell[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2332
2461
  device_replacement: 'Dell $1'
2333
2462
  brand_replacement: 'Dell'
2334
2463
  model_replacement: '$1'
2335
- - regex: '; *Dell ([^;/]+?)(?: Build|\) AppleWebKit)'
2464
+ - regex: '; {0,2}Dell ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2336
2465
  device_replacement: 'Dell $1'
2337
2466
  brand_replacement: 'Dell'
2338
2467
  model_replacement: '$1'
@@ -2341,7 +2470,7 @@ device_parsers:
2341
2470
  # Denver
2342
2471
  # @ref: http://www.denver-electronics.com/tablets1/
2343
2472
  #########
2344
- - regex: '; *(TA[CD]-\d+[^;/]*)(?: Build|\) AppleWebKit)'
2473
+ - regex: '; {0,2}(TA[CD]-\d+[^;/]{0,100})(?: Build|\) AppleWebKit)'
2345
2474
  device_replacement: '$1'
2346
2475
  brand_replacement: 'Denver'
2347
2476
  model_replacement: '$1'
@@ -2350,7 +2479,7 @@ device_parsers:
2350
2479
  # Dex
2351
2480
  # @ref: http://dex.ua/
2352
2481
  #########
2353
- - regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2482
+ - regex: '; {0,2}(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2354
2483
  device_replacement: '$1'
2355
2484
  brand_replacement: 'Dex'
2356
2485
  model_replacement: '$1'
@@ -2359,7 +2488,7 @@ device_parsers:
2359
2488
  # DNS AirTab
2360
2489
  # @ref: http://www.dns-shop.ru/
2361
2490
  #########
2362
- - regex: '; *(AirTab)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2491
+ - regex: '; {0,2}(AirTab)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2363
2492
  device_replacement: '$1 $2'
2364
2493
  brand_replacement: 'DNS'
2365
2494
  model_replacement: '$1 $2'
@@ -2368,43 +2497,43 @@ device_parsers:
2368
2497
  # Docomo (Operator Branded Device)
2369
2498
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2370
2499
  #########
2371
- - regex: '; *(F\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2500
+ - regex: '; {0,2}(F\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2372
2501
  device_replacement: '$1'
2373
2502
  brand_replacement: 'Fujitsu'
2374
2503
  model_replacement: '$1'
2375
- - regex: '; *(HT-03A)(?: Build|\) AppleWebKit)'
2504
+ - regex: '; {0,2}(HT-03A)(?: Build|\) AppleWebKit)'
2376
2505
  device_replacement: '$1'
2377
2506
  brand_replacement: 'HTC'
2378
2507
  model_replacement: 'Magic'
2379
- - regex: '; *(HT\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2508
+ - regex: '; {0,2}(HT\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2380
2509
  device_replacement: '$1'
2381
2510
  brand_replacement: 'HTC'
2382
2511
  model_replacement: '$1'
2383
- - regex: '; *(L\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2512
+ - regex: '; {0,2}(L\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2384
2513
  device_replacement: '$1'
2385
2514
  brand_replacement: 'LG'
2386
2515
  model_replacement: '$1'
2387
- - regex: '; *(N\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2516
+ - regex: '; {0,2}(N\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2388
2517
  device_replacement: '$1'
2389
2518
  brand_replacement: 'Nec'
2390
2519
  model_replacement: '$1'
2391
- - regex: '; *(P\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2520
+ - regex: '; {0,2}(P\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2392
2521
  device_replacement: '$1'
2393
2522
  brand_replacement: 'Panasonic'
2394
2523
  model_replacement: '$1'
2395
- - regex: '; *(SC\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2524
+ - regex: '; {0,2}(SC\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2396
2525
  device_replacement: '$1'
2397
2526
  brand_replacement: 'Samsung'
2398
2527
  model_replacement: '$1'
2399
- - regex: '; *(SH\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2528
+ - regex: '; {0,2}(SH\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2400
2529
  device_replacement: '$1'
2401
2530
  brand_replacement: 'Sharp'
2402
2531
  model_replacement: '$1'
2403
- - regex: '; *(SO\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2532
+ - regex: '; {0,2}(SO\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2404
2533
  device_replacement: '$1'
2405
2534
  brand_replacement: 'SonyEricsson'
2406
2535
  model_replacement: '$1'
2407
- - regex: '; *(T\-0[12][^;/]+?)(?: Build|\) AppleWebKit)'
2536
+ - regex: '; {0,2}(T\-0[12][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2408
2537
  device_replacement: '$1'
2409
2538
  brand_replacement: 'Toshiba'
2410
2539
  model_replacement: '$1'
@@ -2413,7 +2542,7 @@ device_parsers:
2413
2542
  # DOOV
2414
2543
  # @ref: http://www.doov.com.cn/
2415
2544
  #########
2416
- - regex: '; *(DOOV)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2545
+ - regex: '; {0,2}(DOOV)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2417
2546
  device_replacement: '$1 $2'
2418
2547
  brand_replacement: 'DOOV'
2419
2548
  model_replacement: '$2'
@@ -2422,7 +2551,7 @@ device_parsers:
2422
2551
  # Enot
2423
2552
  # @ref: http://www.enot.ua/
2424
2553
  #########
2425
- - regex: '; *(Enot|ENOT)[ -]?([^;/]+?)(?: Build|\) AppleWebKit)'
2554
+ - regex: '; {0,2}(Enot|ENOT)[ -]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2426
2555
  device_replacement: '$1 $2'
2427
2556
  brand_replacement: 'Enot'
2428
2557
  model_replacement: '$2'
@@ -2431,11 +2560,11 @@ device_parsers:
2431
2560
  # Evercoss
2432
2561
  # @ref: http://evercoss.com/android/
2433
2562
  #########
2434
- - regex: '; *[^;/]+ Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2563
+ - regex: '; {0,2}[^;/]{1,100} Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2435
2564
  device_replacement: 'CROSS $1'
2436
2565
  brand_replacement: 'Evercoss'
2437
2566
  model_replacement: 'Cross $1'
2438
- - regex: '; *(CROSS|Cross)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2567
+ - regex: '; {0,2}(CROSS|Cross)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2439
2568
  device_replacement: '$1 $2'
2440
2569
  brand_replacement: 'Evercoss'
2441
2570
  model_replacement: 'Cross $2'
@@ -2444,7 +2573,7 @@ device_parsers:
2444
2573
  # Explay
2445
2574
  # @ref: http://explay.ru/
2446
2575
  #########
2447
- - regex: '; *Explay[_ ](.+?)(?:[\)]| Build)'
2576
+ - regex: '; {0,2}Explay[_ ](.{1,200}?)(?:[\)]| Build)'
2448
2577
  device_replacement: '$1'
2449
2578
  brand_replacement: 'Explay'
2450
2579
  model_replacement: '$1'
@@ -2453,11 +2582,11 @@ device_parsers:
2453
2582
  # Fly
2454
2583
  # @ref: http://www.fly-phone.com/
2455
2584
  #########
2456
- - regex: '; *(IQ.*?)(?: Build|\) AppleWebKit)'
2585
+ - regex: '; {0,2}(IQ.{0,200}?)(?: Build|\) AppleWebKit)'
2457
2586
  device_replacement: '$1'
2458
2587
  brand_replacement: 'Fly'
2459
2588
  model_replacement: '$1'
2460
- - regex: '; *(Fly|FLY)[ _](IQ[^;]+?|F[34]\d+[^;]*?);?(?: Build|\) AppleWebKit)'
2589
+ - regex: '; {0,2}(Fly|FLY)[ _](IQ[^;]{1,100}?|F[34]\d+[^;]{0,100}?);?(?: Build|\) AppleWebKit)'
2461
2590
  device_replacement: '$1 $2'
2462
2591
  brand_replacement: 'Fly'
2463
2592
  model_replacement: '$2'
@@ -2466,7 +2595,7 @@ device_parsers:
2466
2595
  # Fujitsu
2467
2596
  # @ref: http://www.fujitsu.com/global/
2468
2597
  #########
2469
- - regex: '; *(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2598
+ - regex: '; {0,2}(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2470
2599
  device_replacement: '$1'
2471
2600
  brand_replacement: 'Fujitsu'
2472
2601
  model_replacement: '$1'
@@ -2475,7 +2604,7 @@ device_parsers:
2475
2604
  # Galapad
2476
2605
  # @ref: http://www.galapad.net/product.html
2477
2606
  #########
2478
- - regex: '; *(G1)(?: Build|\) AppleWebKit)'
2607
+ - regex: '; {0,2}(G1)(?: Build|\) AppleWebKit)'
2479
2608
  device_replacement: '$1'
2480
2609
  brand_replacement: 'Galapad'
2481
2610
  model_replacement: '$1'
@@ -2484,7 +2613,7 @@ device_parsers:
2484
2613
  # Geeksphone
2485
2614
  # @ref: http://www.geeksphone.com/
2486
2615
  #########
2487
- - regex: '; *(Geeksphone) ([^;/]+?)(?: Build|\) AppleWebKit)'
2616
+ - regex: '; {0,2}(Geeksphone) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2488
2617
  device_replacement: '$1 $2'
2489
2618
  brand_replacement: '$1'
2490
2619
  model_replacement: '$2'
@@ -2493,8 +2622,7 @@ device_parsers:
2493
2622
  # Gfive
2494
2623
  # @ref: http://www.gfivemobile.com/en
2495
2624
  #########
2496
- #- regex: '; *(G\'?FIVE) ([^;/]+) Build' # there is a problem with python yaml parser here
2497
- - regex: '; *(G[^F]?FIVE) ([^;/]+?)(?: Build|\) AppleWebKit)'
2625
+ - regex: '; {0,2}(G[^F]?FIVE) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2498
2626
  device_replacement: '$1 $2'
2499
2627
  brand_replacement: 'Gfive'
2500
2628
  model_replacement: '$2'
@@ -2503,16 +2631,16 @@ device_parsers:
2503
2631
  # Gionee
2504
2632
  # @ref: http://www.gionee.com/
2505
2633
  #########
2506
- - regex: '; *(Gionee)[ _\-]([^;/]+?)(?:/[^;/]+|)(?: Build|\) AppleWebKit)'
2634
+ - regex: '; {0,2}(Gionee)[ _\-]([^;/]{1,100}?)(?:/[^;/]{1,100}|)(?: Build|\) AppleWebKit)'
2507
2635
  regex_flag: 'i'
2508
2636
  device_replacement: '$1 $2'
2509
2637
  brand_replacement: 'Gionee'
2510
2638
  model_replacement: '$2'
2511
- - regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2639
+ - regex: '; {0,2}(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2512
2640
  device_replacement: 'Gionee $1'
2513
2641
  brand_replacement: 'Gionee'
2514
2642
  model_replacement: '$1'
2515
- - regex: '; *(E3) Build/JOP40D'
2643
+ - regex: '; {0,2}(E3) Build/JOP40D'
2516
2644
  device_replacement: 'Gionee $1'
2517
2645
  brand_replacement: 'Gionee'
2518
2646
  model_replacement: '$1'
@@ -2526,11 +2654,11 @@ device_parsers:
2526
2654
  # GoClever
2527
2655
  # @ref: http://www.goclever.com
2528
2656
  #########
2529
- - regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB)(?: Build|\) AppleWebKit)'
2657
+ - regex: '; {0,2}((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]{0,100}|PLAYTAB)(?: Build|\) AppleWebKit)'
2530
2658
  device_replacement: 'GoClever $1'
2531
2659
  brand_replacement: 'GoClever'
2532
2660
  model_replacement: '$1'
2533
- - regex: '; *GOCLEVER ([^;/]+?)(?: Build|\) AppleWebKit)'
2661
+ - regex: '; {0,2}GOCLEVER ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2534
2662
  device_replacement: 'GoClever $1'
2535
2663
  brand_replacement: 'GoClever'
2536
2664
  model_replacement: '$1'
@@ -2539,11 +2667,11 @@ device_parsers:
2539
2667
  # Google
2540
2668
  # @ref: http://www.google.de/glass/start/
2541
2669
  #########
2542
- - regex: '; *(Glass \d+)(?: Build|\) AppleWebKit)'
2670
+ - regex: '; {0,2}(Glass \d+)(?: Build|\) AppleWebKit)'
2543
2671
  device_replacement: '$1'
2544
2672
  brand_replacement: 'Google'
2545
2673
  model_replacement: '$1'
2546
- - regex: '; *(Pixel.*?)(?: Build|\) AppleWebKit)'
2674
+ - regex: '; {0,2}(Pixel.{0,200}?)(?: Build|\) AppleWebKit)'
2547
2675
  device_replacement: '$1'
2548
2676
  brand_replacement: 'Google'
2549
2677
  model_replacement: '$1'
@@ -2552,7 +2680,7 @@ device_parsers:
2552
2680
  # Gigabyte
2553
2681
  # @ref: http://gsmart.gigabytecm.com/en/
2554
2682
  #########
2555
- - regex: '; *(GSmart)[ -]([^/]+)(?: Build|\) AppleWebKit)'
2683
+ - regex: '; {0,2}(GSmart)[ -]([^/]{1,50})(?: Build|\) AppleWebKit)'
2556
2684
  device_replacement: '$1 $2'
2557
2685
  brand_replacement: 'Gigabyte'
2558
2686
  model_replacement: '$1 $2'
@@ -2561,7 +2689,7 @@ device_parsers:
2561
2689
  # Freescale development boards
2562
2690
  # @ref: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX53QSB
2563
2691
  #########
2564
- - regex: '; *(imx5[13]_[^/]+)(?: Build|\) AppleWebKit)'
2692
+ - regex: '; {0,2}(imx5[13]_[^/]{1,50})(?: Build|\) AppleWebKit)'
2565
2693
  device_replacement: 'Freescale $1'
2566
2694
  brand_replacement: 'Freescale'
2567
2695
  model_replacement: '$1'
@@ -2571,11 +2699,11 @@ device_parsers:
2571
2699
  # @ref: http://www.haier.com/
2572
2700
  # @ref: http://www.haier.com/de/produkte/tablet/
2573
2701
  #########
2574
- - regex: '; *Haier[ _\-]([^/]+)(?: Build|\) AppleWebKit)'
2702
+ - regex: '; {0,2}Haier[ _\-]([^/]{1,50})(?: Build|\) AppleWebKit)'
2575
2703
  device_replacement: 'Haier $1'
2576
2704
  brand_replacement: 'Haier'
2577
2705
  model_replacement: '$1'
2578
- - regex: '; *(PAD1016)(?: Build|\) AppleWebKit)'
2706
+ - regex: '; {0,2}(PAD1016)(?: Build|\) AppleWebKit)'
2579
2707
  device_replacement: 'Haipad $1'
2580
2708
  brand_replacement: 'Haipad'
2581
2709
  model_replacement: '$1'
@@ -2585,7 +2713,7 @@ device_parsers:
2585
2713
  # @ref: http://www.haipad.net/
2586
2714
  # @models: V7P|M7SM7S|M9XM9X|M7XM7X|M9|M8|M7-M|M1002|M7|M701
2587
2715
  #########
2588
- - regex: '; *(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2716
+ - regex: '; {0,2}(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2589
2717
  device_replacement: 'Haipad $1'
2590
2718
  brand_replacement: 'Haipad'
2591
2719
  model_replacement: '$1'
@@ -2595,7 +2723,7 @@ device_parsers:
2595
2723
  # @ref: http://www.hannspree.eu/
2596
2724
  # @models: SN10T1|SN10T2|SN70T31B|SN70T32W
2597
2725
  #########
2598
- - regex: '; *(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2726
+ - regex: '; {0,2}(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2599
2727
  device_replacement: 'Hannspree $1'
2600
2728
  brand_replacement: 'Hannspree'
2601
2729
  model_replacement: '$1'
@@ -2604,11 +2732,11 @@ device_parsers:
2604
2732
  # HCLme
2605
2733
  # @ref: http://www.hclmetablet.com/india/
2606
2734
  #########
2607
- - regex: 'Build/HCL ME Tablet ([^;\)]+)[\);]'
2735
+ - regex: 'Build/HCL ME Tablet ([^;\)]{1,3})[\);]'
2608
2736
  device_replacement: 'HCLme $1'
2609
2737
  brand_replacement: 'HCLme'
2610
2738
  model_replacement: '$1'
2611
- - regex: '; *([^;\/]+) Build/HCL'
2739
+ - regex: '; {0,2}([^;\/]+) Build/HCL'
2612
2740
  device_replacement: 'HCLme $1'
2613
2741
  brand_replacement: 'HCLme'
2614
2742
  model_replacement: '$1'
@@ -2617,7 +2745,7 @@ device_parsers:
2617
2745
  # Hena
2618
2746
  # @ref: http://www.henadigital.com/en/product/index.asp?id=6
2619
2747
  #########
2620
- - regex: '; *(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2748
+ - regex: '; {0,2}(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2621
2749
  device_replacement: 'Hena $1'
2622
2750
  brand_replacement: 'Hena'
2623
2751
  model_replacement: '$1'
@@ -2626,11 +2754,11 @@ device_parsers:
2626
2754
  # Hisense
2627
2755
  # @ref: http://www.hisense.com/
2628
2756
  #########
2629
- - regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+?)(?: Build|\) AppleWebKit)'
2757
+ - regex: '; {0,2}(EG\d{2,}|HS-[^;/]{1,100}|MIRA[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2630
2758
  device_replacement: 'Hisense $1'
2631
2759
  brand_replacement: 'Hisense'
2632
2760
  model_replacement: '$1'
2633
- - regex: '; *(andromax[^;/]+?)(?: Build|\) AppleWebKit)'
2761
+ - regex: '; {0,2}(andromax[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2634
2762
  regex_flag: 'i'
2635
2763
  device_replacement: 'Hisense $1'
2636
2764
  brand_replacement: 'Hisense'
@@ -2640,7 +2768,7 @@ device_parsers:
2640
2768
  # hitech
2641
2769
  # @ref: http://www.hitech-mobiles.com/
2642
2770
  #########
2643
- - regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2771
+ - regex: '; {0,2}(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2644
2772
  device_replacement: 'AMAZE $1$2'
2645
2773
  brand_replacement: 'hitech'
2646
2774
  model_replacement: 'AMAZE $1$2'
@@ -2649,15 +2777,15 @@ device_parsers:
2649
2777
  # HP
2650
2778
  # @ref: http://www.hp.com/
2651
2779
  #########
2652
- - regex: '; *(PlayBook)(?: Build|\) AppleWebKit)'
2780
+ - regex: '; {0,2}(PlayBook)(?: Build|\) AppleWebKit)'
2653
2781
  device_replacement: 'HP $1'
2654
2782
  brand_replacement: 'HP'
2655
2783
  model_replacement: '$1'
2656
- - regex: '; *HP ([^/]+)(?: Build|\) AppleWebKit)'
2784
+ - regex: '; {0,2}HP ([^/]{1,50})(?: Build|\) AppleWebKit)'
2657
2785
  device_replacement: 'HP $1'
2658
2786
  brand_replacement: 'HP'
2659
2787
  model_replacement: '$1'
2660
- - regex: '; *([^/]+_tenderloin)(?: Build|\) AppleWebKit)'
2788
+ - regex: '; {0,2}([^/]{1,30}_tenderloin)(?: Build|\) AppleWebKit)'
2661
2789
  device_replacement: 'HP TouchPad'
2662
2790
  brand_replacement: 'HP'
2663
2791
  model_replacement: 'TouchPad'
@@ -2667,62 +2795,66 @@ device_parsers:
2667
2795
  # @ref: http://www.huaweidevice.com
2668
2796
  # @note: Needs to be before HTC due to Desire HD Build on U8815
2669
2797
  #########
2670
- - regex: '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2798
+ - regex: '; {0,2}(HUAWEI |Huawei-|)([UY][^;/]{1,100}) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2671
2799
  device_replacement: '$1$2'
2672
2800
  brand_replacement: 'Huawei'
2673
2801
  model_replacement: '$2'
2674
- - regex: '; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)\)'
2802
+ - regex: '; {0,2}([^;/]{1,100}) Build[/ ]Huawei(MT1-U06|[A-Z]{1,50}\d+[^\);]{1,50})\)'
2675
2803
  device_replacement: '$1'
2676
2804
  brand_replacement: 'Huawei'
2677
2805
  model_replacement: '$2'
2678
- - regex: '; *(S7|M860) Build'
2806
+ - regex: '; {0,2}(S7|M860) Build'
2679
2807
  device_replacement: '$1'
2680
2808
  brand_replacement: 'Huawei'
2681
2809
  model_replacement: '$1'
2682
- - regex: '; *((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2810
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2683
2811
  device_replacement: '$1$2'
2684
2812
  brand_replacement: 'Huawei'
2685
2813
  model_replacement: '$2'
2686
- - regex: '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build'
2814
+ - regex: '; {0,2}((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]{1,100}) Build'
2687
2815
  device_replacement: '$1$2'
2688
2816
  brand_replacement: 'Huawei'
2689
2817
  model_replacement: '$2'
2690
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]+) Build'
2818
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]{1,100}) Build'
2691
2819
  device_replacement: '$1$2'
2692
2820
  brand_replacement: 'Huawei'
2693
2821
  model_replacement: '$2'
2694
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)([^;/]+) Build'
2822
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)([^;/]{1,100}) Build'
2695
2823
  device_replacement: '$1$2'
2696
2824
  brand_replacement: 'Huawei'
2697
2825
  model_replacement: '$2'
2698
- - regex: '; *(MediaPad[^;]+|SpringBoard) Build/Huawei'
2826
+ - regex: '; {0,2}(MediaPad[^;]{1,200}|SpringBoard) Build/Huawei'
2699
2827
  device_replacement: '$1'
2700
2828
  brand_replacement: 'Huawei'
2701
2829
  model_replacement: '$1'
2702
- - regex: '; *([^;]+) Build/(?:Huawei|HUAWEI)'
2830
+ - regex: '; {0,2}([^;]{1,200}) Build/(?:Huawei|HUAWEI)'
2703
2831
  device_replacement: '$1'
2704
2832
  brand_replacement: 'Huawei'
2705
2833
  model_replacement: '$1'
2706
- - regex: '; *([Uu])([89]\d{3}) Build'
2834
+ - regex: '; {0,2}([Uu])([89]\d{3}) Build'
2707
2835
  device_replacement: '$1$2'
2708
2836
  brand_replacement: 'Huawei'
2709
2837
  model_replacement: 'U$2'
2710
- - regex: '; *(?:Ideos |IDEOS )(S7) Build'
2838
+ - regex: '; {0,2}(?:Ideos |IDEOS )(S7) Build'
2711
2839
  device_replacement: 'Huawei Ideos$1'
2712
2840
  brand_replacement: 'Huawei'
2713
2841
  model_replacement: 'Ideos$1'
2714
- - regex: '; *(?:Ideos |IDEOS )([^;/]+\s*|\s*)Build'
2842
+ - regex: '; {0,2}(?:Ideos |IDEOS )([^;/]{1,50}\s{0,5}|\s{0,5})Build'
2715
2843
  device_replacement: 'Huawei Ideos$1'
2716
2844
  brand_replacement: 'Huawei'
2717
2845
  model_replacement: 'Ideos$1'
2718
- - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]'
2846
+ - regex: '; {0,2}(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.{1,200}?) Build[/ ]'
2719
2847
  device_replacement: 'Huawei $1'
2720
2848
  brand_replacement: 'Huawei'
2721
2849
  model_replacement: '$1'
2722
- - regex: '; *((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2850
+ - regex: '; {0,2}((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2723
2851
  device_replacement: 'Huawei $1'
2724
2852
  brand_replacement: 'Huawei'
2725
2853
  model_replacement: '$1'
2854
+ - regex: '; {0,2}([^;]{1,200}) Build/(HONOR|Honor)'
2855
+ device_replacement: 'Huawei Honor $1'
2856
+ brand_replacement: 'Huawei'
2857
+ model_replacement: 'Honor $1'
2726
2858
 
2727
2859
  #########
2728
2860
  # HTC
@@ -2730,7 +2862,7 @@ device_parsers:
2730
2862
  # @ref: http://en.wikipedia.org/wiki/List_of_HTC_phones
2731
2863
  #########
2732
2864
 
2733
- - regex: '; *HTC[ _]([^;]+); Windows Phone'
2865
+ - regex: '; {0,2}HTC[ _]([^;]{1,200}); Windows Phone'
2734
2866
  device_replacement: 'HTC $1'
2735
2867
  brand_replacement: 'HTC'
2736
2868
  model_replacement: '$1'
@@ -2738,59 +2870,59 @@ device_parsers:
2738
2870
  # Android HTC with Version Number matcher
2739
2871
  # ; HTC_0P3Z11/1.12.161.3 Build
2740
2872
  # ;HTC_A3335 V2.38.841.1 Build
2741
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2873
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2742
2874
  device_replacement: 'HTC $1'
2743
2875
  brand_replacement: 'HTC'
2744
2876
  model_replacement: '$1'
2745
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2877
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2746
2878
  device_replacement: 'HTC $1 $2'
2747
2879
  brand_replacement: 'HTC'
2748
2880
  model_replacement: '$1 $2'
2749
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2881
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2750
2882
  device_replacement: 'HTC $1 $2 $3'
2751
2883
  brand_replacement: 'HTC'
2752
2884
  model_replacement: '$1 $2 $3'
2753
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2885
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2754
2886
  device_replacement: 'HTC $1 $2 $3 $4'
2755
2887
  brand_replacement: 'HTC'
2756
2888
  model_replacement: '$1 $2 $3 $4'
2757
2889
 
2758
2890
  # Android HTC without Version Number matcher
2759
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )'
2891
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: {0,2}Build|[;\)]| - )'
2760
2892
  device_replacement: 'HTC $1'
2761
2893
  brand_replacement: 'HTC'
2762
2894
  model_replacement: '$1'
2763
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: *Build|[;\)]| - )'
2895
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: {0,2}Build|[;\)]| - )'
2764
2896
  device_replacement: 'HTC $1 $2'
2765
2897
  brand_replacement: 'HTC'
2766
2898
  model_replacement: '$1 $2'
2767
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: *Build|[;\)]| - )'
2899
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: {0,2}Build|[;\)]| - )'
2768
2900
  device_replacement: 'HTC $1 $2 $3'
2769
2901
  brand_replacement: 'HTC'
2770
2902
  model_replacement: '$1 $2 $3'
2771
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\)]| - )'
2903
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: {0,2}Build|[;\)]| - )'
2772
2904
  device_replacement: 'HTC $1 $2 $3 $4'
2773
2905
  brand_replacement: 'HTC'
2774
2906
  model_replacement: '$1 $2 $3 $4'
2775
2907
 
2776
2908
  # HTC Streaming Player
2777
- - regex: 'HTC Streaming Player [^\/]*/[^\/]*/ htc_([^/]+) /'
2909
+ - regex: 'HTC Streaming Player [^\/]{0,30}/[^\/]{0,10}/ htc_([^/]{1,10}) /'
2778
2910
  device_replacement: 'HTC $1'
2779
2911
  brand_replacement: 'HTC'
2780
2912
  model_replacement: '$1'
2781
2913
  # general matcher for anything else
2782
- - regex: '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
2914
+ - regex: '(?:[;,] {0,2}|^)(?:htccn_chs-|)HTC[ _-]?([^;]{1,200}?)(?: {0,2}Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
2783
2915
  regex_flag: 'i'
2784
2916
  device_replacement: 'HTC $1'
2785
2917
  brand_replacement: 'HTC'
2786
2918
  model_replacement: '$1'
2787
2919
  # Android matchers without HTC
2788
- - regex: '; *(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\+?)\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\(\)])'
2920
+ - regex: '; {0,2}(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\+?)\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\(\)])'
2789
2921
  regex_flag: 'i'
2790
2922
  device_replacement: 'HTC $1'
2791
2923
  brand_replacement: 'HTC'
2792
2924
  model_replacement: '$1'
2793
- - regex: '; *(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.+?)(?:[/;\)]|Build|MIUI|1\.0)'
2925
+ - regex: '; {0,2}(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.{1,200}?)(?:[/;\)]|Build|MIUI|1\.0)'
2794
2926
  regex_flag: 'i'
2795
2927
  device_replacement: 'HTC $1 $2'
2796
2928
  brand_replacement: 'HTC'
@@ -2800,16 +2932,16 @@ device_parsers:
2800
2932
  # Hyundai
2801
2933
  # @ref: http://www.hyundaitechnologies.com
2802
2934
  #########
2803
- - regex: '; *HYUNDAI (T\d[^/]*)(?: Build|\) AppleWebKit)'
2935
+ - regex: '; {0,2}HYUNDAI (T\d[^/]{0,10})(?: Build|\) AppleWebKit)'
2804
2936
  device_replacement: 'Hyundai $1'
2805
2937
  brand_replacement: 'Hyundai'
2806
2938
  model_replacement: '$1'
2807
- - regex: '; *HYUNDAI ([^;/]+?)(?: Build|\) AppleWebKit)'
2939
+ - regex: '; {0,2}HYUNDAI ([^;/]{1,10}?)(?: Build|\) AppleWebKit)'
2808
2940
  device_replacement: 'Hyundai $1'
2809
2941
  brand_replacement: 'Hyundai'
2810
2942
  model_replacement: '$1'
2811
2943
  # X900? http://www.amazon.com/Hyundai-X900-Retina-Android-Bluetooth/dp/B00AO07H3O
2812
- - regex: '; *(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2944
+ - regex: '; {0,2}(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2813
2945
  device_replacement: 'Hyundai $1'
2814
2946
  brand_replacement: 'Hyundai'
2815
2947
  model_replacement: '$1'
@@ -2818,12 +2950,12 @@ device_parsers:
2818
2950
  # iBall
2819
2951
  # @ref: http://www.iball.co.in/Category/Mobiles/22
2820
2952
  #########
2821
- - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2953
+ - regex: '; {0,2}(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2822
2954
  regex_flag: 'i'
2823
2955
  device_replacement: '$1 $2'
2824
2956
  brand_replacement: 'iBall'
2825
2957
  model_replacement: '$1 $2'
2826
- - regex: '; *(IBall)(?:[ _]([^;/]+?)|)(?: Build|\) AppleWebKit)'
2958
+ - regex: '; {0,2}(IBall)(?:[ _]([^;/]{1,100}?)|)(?: Build|\) AppleWebKit)'
2827
2959
  regex_flag: 'i'
2828
2960
  device_replacement: '$1 $2'
2829
2961
  brand_replacement: 'iBall'
@@ -2833,7 +2965,7 @@ device_parsers:
2833
2965
  # IconBIT
2834
2966
  # @ref: http://www.iconbit.com/catalog/tablets/
2835
2967
  #########
2836
- - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|)(?: Build|\) AppleWebKit)'
2968
+ - regex: '; {0,2}(NT-\d+[^ ;/]{0,50}|Net[Tt]AB [^;/]{1,50}|Mercury [A-Z]{1,50}|iconBIT)(?: S/N:[^;/]{1,50}|)(?: Build|\) AppleWebKit)'
2837
2969
  device_replacement: '$1'
2838
2970
  brand_replacement: 'IconBIT'
2839
2971
  model_replacement: '$1'
@@ -2842,7 +2974,7 @@ device_parsers:
2842
2974
  # IMO
2843
2975
  # @ref: http://www.ponselimo.com/
2844
2976
  #########
2845
- - regex: '; *(IMO)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2977
+ - regex: '; {0,2}(IMO)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2846
2978
  regex_flag: 'i'
2847
2979
  device_replacement: '$1 $2'
2848
2980
  brand_replacement: 'IMO'
@@ -2852,12 +2984,12 @@ device_parsers:
2852
2984
  # i-mobile
2853
2985
  # @ref: http://www.i-mobilephone.com/
2854
2986
  #########
2855
- - regex: '; *i-?mobile[ _]([^/]+)(?: Build|\) AppleWebKit)'
2987
+ - regex: '; {0,2}i-?mobile[ _]([^/]{1,50})(?: Build|\) AppleWebKit)'
2856
2988
  regex_flag: 'i'
2857
2989
  device_replacement: 'i-mobile $1'
2858
2990
  brand_replacement: 'imobile'
2859
2991
  model_replacement: '$1'
2860
- - regex: '; *(i-(?:style|note)[^/]*)(?: Build|\) AppleWebKit)'
2992
+ - regex: '; {0,2}(i-(?:style|note)[^/]{0,10})(?: Build|\) AppleWebKit)'
2861
2993
  regex_flag: 'i'
2862
2994
  device_replacement: 'i-mobile $1'
2863
2995
  brand_replacement: 'imobile'
@@ -2867,7 +2999,7 @@ device_parsers:
2867
2999
  # Impression
2868
3000
  # @ref: http://impression.ua/planshetnye-kompyutery
2869
3001
  #########
2870
- - regex: '; *(ImPAD) ?(\d+(?:.)*?)(?: Build|\) AppleWebKit)'
3002
+ - regex: '; {0,2}(ImPAD) ?(\d+(?:.){0,100}?)(?: Build|\) AppleWebKit)'
2871
3003
  device_replacement: '$1 $2'
2872
3004
  brand_replacement: 'Impression'
2873
3005
  model_replacement: '$1 $2'
@@ -2876,7 +3008,7 @@ device_parsers:
2876
3008
  # Infinix
2877
3009
  # @ref: http://www.infinixmobility.com/index.html
2878
3010
  #########
2879
- - regex: '; *(Infinix)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3011
+ - regex: '; {0,2}(Infinix)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2880
3012
  device_replacement: '$1 $2'
2881
3013
  brand_replacement: 'Infinix'
2882
3014
  model_replacement: '$2'
@@ -2885,7 +3017,7 @@ device_parsers:
2885
3017
  # Informer
2886
3018
  # @ref: ??
2887
3019
  #########
2888
- - regex: '; *(Informer)[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
3020
+ - regex: '; {0,2}(Informer)[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2889
3021
  device_replacement: '$1 $2'
2890
3022
  brand_replacement: 'Informer'
2891
3023
  model_replacement: '$2'
@@ -2895,7 +3027,7 @@ device_parsers:
2895
3027
  # @ref: http://www.intenso.de
2896
3028
  # @models: 7":TAB 714,TAB 724;8":TAB 814,TAB 824;10":TAB 1004
2897
3029
  #########
2898
- - regex: '; *(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
3030
+ - regex: '; {0,2}(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
2899
3031
  device_replacement: 'Intenso $1'
2900
3032
  brand_replacement: 'Intenso'
2901
3033
  model_replacement: '$1 $2'
@@ -2906,21 +3038,21 @@ device_parsers:
2906
3038
  # @note: Zync also offers a "Cloud Z5" device
2907
3039
  #########
2908
3040
  # smartphones
2909
- - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+?) *(?:Build|;)'
3041
+ - regex: '; {0,2}(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]{1,100}?) {0,2}(?:Build|;)'
2910
3042
  device_replacement: '$1$2$3'
2911
3043
  brand_replacement: 'Intex'
2912
3044
  model_replacement: '$1 $3'
2913
3045
  # matches "INTEX CLOUD X1"
2914
- - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) *(?:Build|;)'
3046
+ - regex: '; {0,2}(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) {0,2}(?:Build|;)'
2915
3047
  device_replacement: '$1 $2'
2916
3048
  brand_replacement: 'Intex'
2917
3049
  model_replacement: '$1 $2'
2918
3050
  # tablets
2919
- - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]*) *(?:Build|;)'
3051
+ - regex: '; {0,2}([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]{0,50}) {0,2}(?:Build|;)'
2920
3052
  device_replacement: '$1 $2 $3'
2921
3053
  brand_replacement: 'Intex'
2922
3054
  model_replacement: 'iBuddy $2 $3'
2923
- - regex: '; *(I-Buddy)[ _]([^;/]+?) *(?:Build|;)'
3055
+ - regex: '; {0,2}(I-Buddy)[ _]([^;/]{1,100}?) {0,2}(?:Build|;)'
2924
3056
  device_replacement: '$1 $2'
2925
3057
  brand_replacement: 'Intex'
2926
3058
  model_replacement: 'iBuddy $2'
@@ -2929,7 +3061,7 @@ device_parsers:
2929
3061
  # iOCEAN
2930
3062
  # @ref: http://www.iocean.cc/
2931
3063
  #########
2932
- - regex: '; *(iOCEAN) ([^/]+)(?: Build|\) AppleWebKit)'
3064
+ - regex: '; {0,2}(iOCEAN) ([^/]{1,50})(?: Build|\) AppleWebKit)'
2933
3065
  regex_flag: 'i'
2934
3066
  device_replacement: '$1 $2'
2935
3067
  brand_replacement: 'iOCEAN'
@@ -2939,7 +3071,7 @@ device_parsers:
2939
3071
  # i.onik
2940
3072
  # @ref: http://www.i-onik.de/
2941
3073
  #########
2942
- - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
3074
+ - regex: '; {0,2}(TP\d+(?:\.\d+|)\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2943
3075
  device_replacement: 'ionik $1'
2944
3076
  brand_replacement: 'ionik'
2945
3077
  model_replacement: '$1'
@@ -2948,7 +3080,7 @@ device_parsers:
2948
3080
  # IRU.ru
2949
3081
  # @ref: http://www.iru.ru/catalog/soho/planetable/
2950
3082
  #########
2951
- - regex: '; *(M702pro)(?: Build|\) AppleWebKit)'
3083
+ - regex: '; {0,2}(M702pro)(?: Build|\) AppleWebKit)'
2952
3084
  device_replacement: '$1'
2953
3085
  brand_replacement: 'Iru'
2954
3086
  model_replacement: '$1'
@@ -2957,7 +3089,7 @@ device_parsers:
2957
3089
  # Itel Mobile
2958
3090
  # @ref: https://www.itel-mobile.com/global/products/
2959
3091
  #########
2960
- - regex: '; *itel ([^;/]*)(?: Build|\) AppleWebKit)'
3092
+ - regex: '; {0,2}itel ([^;/]*)(?: Build|\) AppleWebKit)'
2961
3093
  device_replacement: 'Itel $1'
2962
3094
  brand_replacement: 'Itel'
2963
3095
  model_replacement: '$1'
@@ -2967,11 +3099,11 @@ device_parsers:
2967
3099
  # @ref: http://www.ivio.com/mobile.php
2968
3100
  # @models: DG80,DG20,DE38,DE88,MD70
2969
3101
  #########
2970
- - regex: '; *(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
3102
+ - regex: '; {0,2}(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
2971
3103
  device_replacement: '$1'
2972
3104
  brand_replacement: 'Ivio'
2973
3105
  model_replacement: '$1'
2974
- - regex: '; *IVIO[_\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3106
+ - regex: '; {0,2}IVIO[_\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2975
3107
  device_replacement: '$1'
2976
3108
  brand_replacement: 'Ivio'
2977
3109
  model_replacement: '$1'
@@ -2980,7 +3112,7 @@ device_parsers:
2980
3112
  # Jaytech
2981
3113
  # @ref: http://www.jay-tech.de/jaytech/servlet/frontend/
2982
3114
  #########
2983
- - regex: '; *(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
3115
+ - regex: '; {0,2}(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
2984
3116
  device_replacement: '$1'
2985
3117
  brand_replacement: 'Jaytech'
2986
3118
  model_replacement: '$1'
@@ -2989,7 +3121,7 @@ device_parsers:
2989
3121
  # Jiayu
2990
3122
  # @ref: http://www.ejiayu.com/en/Product.html
2991
3123
  #########
2992
- - regex: '; *(JY-[^;/]+|G[234]S?)(?: Build|\) AppleWebKit)'
3124
+ - regex: '; {0,2}(JY-[^;/]{1,100}|G[234]S?)(?: Build|\) AppleWebKit)'
2993
3125
  device_replacement: '$1'
2994
3126
  brand_replacement: 'Jiayu'
2995
3127
  model_replacement: '$1'
@@ -2998,7 +3130,7 @@ device_parsers:
2998
3130
  # JXD
2999
3131
  # @ref: http://www.jxd.hk/
3000
3132
  #########
3001
- - regex: '; *(JXD)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3133
+ - regex: '; {0,2}(JXD)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3002
3134
  device_replacement: '$1 $2'
3003
3135
  brand_replacement: 'JXD'
3004
3136
  model_replacement: '$2'
@@ -3007,16 +3139,16 @@ device_parsers:
3007
3139
  # Karbonn
3008
3140
  # @ref: http://www.karbonnmobiles.com/products_tablet.php
3009
3141
  #########
3010
- - regex: '; *Karbonn[ _]?([^;/]+) *(?:Build|;)'
3142
+ - regex: '; {0,2}Karbonn[ _]?([^;/]{1,100}) {0,2}(?:Build|;)'
3011
3143
  regex_flag: 'i'
3012
3144
  device_replacement: '$1'
3013
3145
  brand_replacement: 'Karbonn'
3014
3146
  model_replacement: '$1'
3015
- - regex: '; *([^;]+) Build/Karbonn'
3147
+ - regex: '; {0,2}([^;]{1,200}) Build/Karbonn'
3016
3148
  device_replacement: '$1'
3017
3149
  brand_replacement: 'Karbonn'
3018
3150
  model_replacement: '$1'
3019
- - regex: '; *(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
3151
+ - regex: '; {0,2}(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
3020
3152
  device_replacement: '$1'
3021
3153
  brand_replacement: 'Karbonn'
3022
3154
  model_replacement: '$1'
@@ -3025,84 +3157,84 @@ device_parsers:
3025
3157
  # KDDI (Operator Branded Device)
3026
3158
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
3027
3159
  #########
3028
- - regex: '; *(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
3160
+ - regex: '; {0,2}(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
3029
3161
  device_replacement: '$1'
3030
3162
  brand_replacement: 'Sharp'
3031
3163
  model_replacement: '$1'
3032
- - regex: '; *(IS04)(?: Build|\) AppleWebKit)'
3164
+ - regex: '; {0,2}(IS04)(?: Build|\) AppleWebKit)'
3033
3165
  device_replacement: '$1'
3034
3166
  brand_replacement: 'Regza'
3035
3167
  model_replacement: '$1'
3036
- - regex: '; *(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
3168
+ - regex: '; {0,2}(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
3037
3169
  device_replacement: '$1'
3038
3170
  brand_replacement: 'Pantech'
3039
3171
  model_replacement: '$1'
3040
- - regex: '; *(IS11S)(?: Build|\) AppleWebKit)'
3172
+ - regex: '; {0,2}(IS11S)(?: Build|\) AppleWebKit)'
3041
3173
  device_replacement: '$1'
3042
3174
  brand_replacement: 'SonyEricsson'
3043
3175
  model_replacement: 'Xperia Acro'
3044
- - regex: '; *(IS11CA)(?: Build|\) AppleWebKit)'
3176
+ - regex: '; {0,2}(IS11CA)(?: Build|\) AppleWebKit)'
3045
3177
  device_replacement: '$1'
3046
3178
  brand_replacement: 'Casio'
3047
3179
  model_replacement: 'GzOne $1'
3048
- - regex: '; *(IS11LG)(?: Build|\) AppleWebKit)'
3180
+ - regex: '; {0,2}(IS11LG)(?: Build|\) AppleWebKit)'
3049
3181
  device_replacement: '$1'
3050
3182
  brand_replacement: 'LG'
3051
3183
  model_replacement: 'Optimus X'
3052
- - regex: '; *(IS11N)(?: Build|\) AppleWebKit)'
3184
+ - regex: '; {0,2}(IS11N)(?: Build|\) AppleWebKit)'
3053
3185
  device_replacement: '$1'
3054
3186
  brand_replacement: 'Medias'
3055
3187
  model_replacement: '$1'
3056
- - regex: '; *(IS11PT)(?: Build|\) AppleWebKit)'
3188
+ - regex: '; {0,2}(IS11PT)(?: Build|\) AppleWebKit)'
3057
3189
  device_replacement: '$1'
3058
3190
  brand_replacement: 'Pantech'
3059
3191
  model_replacement: 'MIRACH'
3060
- - regex: '; *(IS12F)(?: Build|\) AppleWebKit)'
3192
+ - regex: '; {0,2}(IS12F)(?: Build|\) AppleWebKit)'
3061
3193
  device_replacement: '$1'
3062
3194
  brand_replacement: 'Fujitsu'
3063
3195
  model_replacement: 'Arrows ES'
3064
3196
  # @ref: https://ja.wikipedia.org/wiki/IS12M
3065
- - regex: '; *(IS12M)(?: Build|\) AppleWebKit)'
3197
+ - regex: '; {0,2}(IS12M)(?: Build|\) AppleWebKit)'
3066
3198
  device_replacement: '$1'
3067
3199
  brand_replacement: 'Motorola'
3068
3200
  model_replacement: 'XT909'
3069
- - regex: '; *(IS12S)(?: Build|\) AppleWebKit)'
3201
+ - regex: '; {0,2}(IS12S)(?: Build|\) AppleWebKit)'
3070
3202
  device_replacement: '$1'
3071
3203
  brand_replacement: 'SonyEricsson'
3072
3204
  model_replacement: 'Xperia Acro HD'
3073
- - regex: '; *(ISW11F)(?: Build|\) AppleWebKit)'
3205
+ - regex: '; {0,2}(ISW11F)(?: Build|\) AppleWebKit)'
3074
3206
  device_replacement: '$1'
3075
3207
  brand_replacement: 'Fujitsu'
3076
3208
  model_replacement: 'Arrowz Z'
3077
- - regex: '; *(ISW11HT)(?: Build|\) AppleWebKit)'
3209
+ - regex: '; {0,2}(ISW11HT)(?: Build|\) AppleWebKit)'
3078
3210
  device_replacement: '$1'
3079
3211
  brand_replacement: 'HTC'
3080
3212
  model_replacement: 'EVO'
3081
- - regex: '; *(ISW11K)(?: Build|\) AppleWebKit)'
3213
+ - regex: '; {0,2}(ISW11K)(?: Build|\) AppleWebKit)'
3082
3214
  device_replacement: '$1'
3083
3215
  brand_replacement: 'Kyocera'
3084
3216
  model_replacement: 'DIGNO'
3085
- - regex: '; *(ISW11M)(?: Build|\) AppleWebKit)'
3217
+ - regex: '; {0,2}(ISW11M)(?: Build|\) AppleWebKit)'
3086
3218
  device_replacement: '$1'
3087
3219
  brand_replacement: 'Motorola'
3088
3220
  model_replacement: 'Photon'
3089
- - regex: '; *(ISW11SC)(?: Build|\) AppleWebKit)'
3221
+ - regex: '; {0,2}(ISW11SC)(?: Build|\) AppleWebKit)'
3090
3222
  device_replacement: '$1'
3091
3223
  brand_replacement: 'Samsung'
3092
3224
  model_replacement: 'GALAXY S II WiMAX'
3093
- - regex: '; *(ISW12HT)(?: Build|\) AppleWebKit)'
3225
+ - regex: '; {0,2}(ISW12HT)(?: Build|\) AppleWebKit)'
3094
3226
  device_replacement: '$1'
3095
3227
  brand_replacement: 'HTC'
3096
3228
  model_replacement: 'EVO 3D'
3097
- - regex: '; *(ISW13HT)(?: Build|\) AppleWebKit)'
3229
+ - regex: '; {0,2}(ISW13HT)(?: Build|\) AppleWebKit)'
3098
3230
  device_replacement: '$1'
3099
3231
  brand_replacement: 'HTC'
3100
3232
  model_replacement: 'J'
3101
- - regex: '; *(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
3233
+ - regex: '; {0,2}(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
3102
3234
  device_replacement: '$1'
3103
3235
  brand_replacement: 'KDDI'
3104
3236
  model_replacement: '$1'
3105
- - regex: '; *(INFOBAR [^;/]+?)(?: Build|\) AppleWebKit)'
3237
+ - regex: '; {0,2}(INFOBAR [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3106
3238
  device_replacement: '$1'
3107
3239
  brand_replacement: 'KDDI'
3108
3240
  model_replacement: '$1'
@@ -3111,7 +3243,7 @@ device_parsers:
3111
3243
  # Kingcom
3112
3244
  # @ref: http://www.e-kingcom.com
3113
3245
  #########
3114
- - regex: '; *(JOYPAD|Joypad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3246
+ - regex: '; {0,2}(JOYPAD|Joypad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3115
3247
  device_replacement: '$1 $2'
3116
3248
  brand_replacement: 'Kingcom'
3117
3249
  model_replacement: '$1 $2'
@@ -3121,7 +3253,7 @@ device_parsers:
3121
3253
  # @ref: https://en.wikipedia.org/wiki/Kobo_Inc.
3122
3254
  # @ref: http://www.kobo.com/devices#tablets
3123
3255
  #########
3124
- - regex: '; *(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
3256
+ - regex: '; {0,2}(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
3125
3257
  regex_flag: 'i'
3126
3258
  device_replacement: '$1'
3127
3259
  brand_replacement: 'Kobo'
@@ -3135,7 +3267,7 @@ device_parsers:
3135
3267
  # K-Touch
3136
3268
  # @ref: ??
3137
3269
  #########
3138
- - regex: '; *(K-Touch)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3270
+ - regex: '; {0,2}(K-Touch)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3139
3271
  regex_flag: 'i'
3140
3272
  device_replacement: '$1 $2'
3141
3273
  brand_replacement: 'Ktouch'
@@ -3145,7 +3277,7 @@ device_parsers:
3145
3277
  # KT Tech
3146
3278
  # @ref: http://www.kttech.co.kr
3147
3279
  #########
3148
- - regex: '; *((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3280
+ - regex: '; {0,2}((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3149
3281
  regex_flag: 'i'
3150
3282
  device_replacement: '$1'
3151
3283
  brand_replacement: 'KTtech'
@@ -3155,7 +3287,7 @@ device_parsers:
3155
3287
  # Kyocera
3156
3288
  # @ref: http://www.android.com/devices/?country=all&m=kyocera
3157
3289
  #########
3158
- - regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3290
+ - regex: '; {0,2}(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3159
3291
  device_replacement: '$1'
3160
3292
  brand_replacement: 'Kyocera'
3161
3293
  model_replacement: '$1'
@@ -3164,12 +3296,12 @@ device_parsers:
3164
3296
  # Lava
3165
3297
  # @ref: http://www.lavamobiles.com/
3166
3298
  #########
3167
- - regex: '; *(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
3299
+ - regex: '; {0,2}(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
3168
3300
  regex_flag: 'i'
3169
3301
  device_replacement: 'Iris $1'
3170
3302
  brand_replacement: 'Lava'
3171
3303
  model_replacement: 'Iris $1'
3172
- - regex: '; *LAVA[ _]([^;/]+) Build'
3304
+ - regex: '; {0,2}LAVA[ _]([^;/]{1,100}) Build'
3173
3305
  device_replacement: '$1'
3174
3306
  brand_replacement: 'Lava'
3175
3307
  model_replacement: '$1'
@@ -3178,7 +3310,7 @@ device_parsers:
3178
3310
  # Lemon
3179
3311
  # @ref: http://www.lemonmobiles.com/products.php?type=1
3180
3312
  #########
3181
- - regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_?(?: Build|\) AppleWebKit)'
3313
+ - regex: '; {0,2}(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]{1,100}))_?(?: Build|\) AppleWebKit)'
3182
3314
  device_replacement: 'Lemon $1$2'
3183
3315
  brand_replacement: 'Lemon'
3184
3316
  model_replacement: '$1$2'
@@ -3187,11 +3319,11 @@ device_parsers:
3187
3319
  # Lenco
3188
3320
  # @ref: http://www.lenco.com/c/tablets/
3189
3321
  #########
3190
- - regex: '; *(TAB-1012)(?: Build|\) AppleWebKit)'
3322
+ - regex: '; {0,2}(TAB-1012)(?: Build|\) AppleWebKit)'
3191
3323
  device_replacement: 'Lenco $1'
3192
3324
  brand_replacement: 'Lenco'
3193
3325
  model_replacement: '$1'
3194
- - regex: '; Lenco ([^;/]+?)(?: Build|\) AppleWebKit)'
3326
+ - regex: '; Lenco ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3195
3327
  device_replacement: 'Lenco $1'
3196
3328
  brand_replacement: 'Lenco'
3197
3329
  model_replacement: '$1'
@@ -3200,23 +3332,23 @@ device_parsers:
3200
3332
  # Lenovo
3201
3333
  # @ref: http://support.lenovo.com/en_GB/downloads/default.page?#
3202
3334
  #########
3203
- - regex: '; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3335
+ - regex: '; {0,2}(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3204
3336
  device_replacement: '$1'
3205
3337
  brand_replacement: 'Lenovo'
3206
3338
  model_replacement: '$1'
3207
- - regex: '; *(Idea[Tp]ab)[ _]([^;/]+);? Build'
3339
+ - regex: '; {0,2}(Idea[Tp]ab)[ _]([^;/]{1,100});? Build'
3208
3340
  device_replacement: 'Lenovo $1 $2'
3209
3341
  brand_replacement: 'Lenovo'
3210
3342
  model_replacement: '$1 $2'
3211
- - regex: '; *(Idea(?:Tab|pad)) ?([^;/]+) Build'
3343
+ - regex: '; {0,2}(Idea(?:Tab|pad)) ?([^;/]{1,100}) Build'
3212
3344
  device_replacement: 'Lenovo $1 $2'
3213
3345
  brand_replacement: 'Lenovo'
3214
3346
  model_replacement: '$1 $2'
3215
- - regex: '; *(ThinkPad) ?(Tablet) Build/'
3347
+ - regex: '; {0,2}(ThinkPad) ?(Tablet) Build/'
3216
3348
  device_replacement: 'Lenovo $1 $2'
3217
3349
  brand_replacement: 'Lenovo'
3218
3350
  model_replacement: '$1 $2'
3219
- - regex: '; *(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.+?)(?:Build|[;/\)])'
3351
+ - regex: '; {0,2}(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.{1,200}?)(?:Build|[;/\)])'
3220
3352
  device_replacement: 'Lenovo $1'
3221
3353
  brand_replacement: 'Lenovo'
3222
3354
  model_replacement: '$1'
@@ -3224,11 +3356,11 @@ device_parsers:
3224
3356
  device_replacement: 'Lenovo $1 $2 $3'
3225
3357
  brand_replacement: 'Lenovo'
3226
3358
  model_replacement: '$1 $2 $3'
3227
- - regex: '; *(?:Ideapad |)K1 Build/'
3359
+ - regex: '; {0,2}(?:Ideapad |)K1 Build/'
3228
3360
  device_replacement: 'Lenovo Ideapad K1'
3229
3361
  brand_replacement: 'Lenovo'
3230
3362
  model_replacement: 'Ideapad K1'
3231
- - regex: '; *(3GC101|3GW10[01]|A390) Build/'
3363
+ - regex: '; {0,2}(3GC101|3GW10[01]|A390) Build/'
3232
3364
  device_replacement: '$1'
3233
3365
  brand_replacement: 'Lenovo'
3234
3366
  model_replacement: '$1'
@@ -3241,7 +3373,7 @@ device_parsers:
3241
3373
  # Lexibook
3242
3374
  # @ref: http://www.lexibook.com/fr
3243
3375
  #########
3244
- - regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3376
+ - regex: '; {0,2}(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3245
3377
  device_replacement: '$1$2'
3246
3378
  brand_replacement: 'Lexibook'
3247
3379
  model_replacement: '$1$2'
@@ -3250,23 +3382,23 @@ device_parsers:
3250
3382
  # LG
3251
3383
  # @ref: http://www.lg.com/uk/mobile
3252
3384
  #########
3253
- - regex: '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)'
3385
+ - regex: '; {0,2}(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]{1,30}|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) {0,2}(?:Build|;)'
3254
3386
  device_replacement: '$1'
3255
3387
  brand_replacement: 'LG'
3256
3388
  model_replacement: '$1'
3257
- - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) *(?:Build|[;\)])'
3389
+ - regex: '[;:] {0,2}(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) {0,2}(?:Build|[;\)])'
3258
3390
  device_replacement: '$1'
3259
3391
  brand_replacement: 'LG'
3260
3392
  model_replacement: '$1'
3261
- - regex: '; *(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3393
+ - regex: '; {0,2}(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3262
3394
  device_replacement: '$1$2'
3263
3395
  brand_replacement: 'LG'
3264
3396
  model_replacement: '$2'
3265
- - regex: '; *(LG[ \-]|LG)([^;/]+)[;/]? Build'
3397
+ - regex: '; {0,2}(LG[ \-]|LG)([^;/]{1,100})[;/]? Build'
3266
3398
  device_replacement: '$1$2'
3267
3399
  brand_replacement: 'LG'
3268
3400
  model_replacement: '$2'
3269
- - regex: '^(LG)-([^;/]+)/ Mozilla/.*; Android'
3401
+ - regex: '^(LG)-([^;/]{1,100})/ Mozilla/.{0,200}; Android'
3270
3402
  device_replacement: '$1 $2'
3271
3403
  brand_replacement: 'LG'
3272
3404
  model_replacement: '$2'
@@ -3279,11 +3411,11 @@ device_parsers:
3279
3411
  # Malata
3280
3412
  # @ref: http://www.malata.com/en/products.aspx?classid=680
3281
3413
  #########
3282
- - regex: '; *((?:SMB|smb)[^;/]+?)(?: Build|\) AppleWebKit)'
3414
+ - regex: '; {0,2}((?:SMB|smb)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3283
3415
  device_replacement: '$1'
3284
3416
  brand_replacement: 'Malata'
3285
3417
  model_replacement: '$1'
3286
- - regex: '; *(?:Malata|MALATA) ([^;/]+?)(?: Build|\) AppleWebKit)'
3418
+ - regex: '; {0,2}(?:Malata|MALATA) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3287
3419
  device_replacement: '$1'
3288
3420
  brand_replacement: 'Malata'
3289
3421
  model_replacement: '$1'
@@ -3292,7 +3424,7 @@ device_parsers:
3292
3424
  # Manta
3293
3425
  # @ref: http://www.manta.com.pl/en
3294
3426
  #########
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)'
3427
+ - regex: '; {0,2}(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\) AppleWebKit)'
3296
3428
  device_replacement: '$1'
3297
3429
  brand_replacement: 'Manta'
3298
3430
  model_replacement: '$1'
@@ -3301,7 +3433,7 @@ device_parsers:
3301
3433
  # Match
3302
3434
  # @ref: http://www.match.net.cn/products.asp
3303
3435
  #########
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)'
3436
+ - regex: '; {0,2}(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)'
3305
3437
  device_replacement: '$1'
3306
3438
  brand_replacement: 'Match'
3307
3439
  model_replacement: '$1'
@@ -3315,7 +3447,7 @@ device_parsers:
3315
3447
  # Maxx MT150, Maxx MQ601, Maxx M2020, Maxx Sleek MX463neo, Maxx MX525, Maxx MX192-Tune, Maxx Genx Droid 7 AX353,
3316
3448
  # @note: Need more User-Agents!!!
3317
3449
  #########
3318
- - regex: '; *(GenxDroid7|MSD7.*?|AX\d.*?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3450
+ - regex: '; {0,2}(GenxDroid7|MSD7.{0,200}?|AX\d.{0,200}?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3319
3451
  device_replacement: 'Maxx $1'
3320
3452
  brand_replacement: 'Maxx'
3321
3453
  model_replacement: '$1'
@@ -3324,11 +3456,11 @@ device_parsers:
3324
3456
  # Mediacom
3325
3457
  # @ref: http://www.mediacomeurope.it/
3326
3458
  #########
3327
- - regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3459
+ - regex: '; {0,2}(M-PP[^;/]{1,30}|PhonePad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3328
3460
  device_replacement: 'Mediacom $1'
3329
3461
  brand_replacement: 'Mediacom'
3330
3462
  model_replacement: '$1'
3331
- - regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3463
+ - regex: '; {0,2}(M-MP[^;/]{1,30}|SmartPad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3332
3464
  device_replacement: 'Mediacom $1'
3333
3465
  brand_replacement: 'Mediacom'
3334
3466
  model_replacement: '$1'
@@ -3337,12 +3469,12 @@ device_parsers:
3337
3469
  # Medion
3338
3470
  # @ref: http://www.medion.com/en/
3339
3471
  #########
3340
- - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3472
+ - regex: '; {0,2}(?:MD_|)LIFETAB[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3341
3473
  regex_flag: 'i'
3342
3474
  device_replacement: 'Medion Lifetab $1'
3343
3475
  brand_replacement: 'Medion'
3344
3476
  model_replacement: 'Lifetab $1'
3345
- - regex: '; *MEDION ([^;/]+?)(?: Build|\) AppleWebKit)'
3477
+ - regex: '; {0,2}MEDION ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3346
3478
  device_replacement: 'Medion $1'
3347
3479
  brand_replacement: 'Medion'
3348
3480
  model_replacement: '$1'
@@ -3351,11 +3483,11 @@ device_parsers:
3351
3483
  # Meizu
3352
3484
  # @ref: http://www.meizu.com
3353
3485
  #########
3354
- - regex: '; *(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3486
+ - regex: '; {0,2}(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3355
3487
  device_replacement: 'Meizu $1'
3356
3488
  brand_replacement: 'Meizu'
3357
3489
  model_replacement: '$1'
3358
- - regex: '; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\)])'
3490
+ - regex: '; {0,2}(?:meizu_|MEIZU )(.{1,200}?) {0,2}(?:Build|[;\)])'
3359
3491
  device_replacement: 'Meizu $1'
3360
3492
  brand_replacement: 'Meizu'
3361
3493
  model_replacement: '$1'
@@ -3364,28 +3496,28 @@ device_parsers:
3364
3496
  # Micromax
3365
3497
  # @ref: http://www.micromaxinfo.com
3366
3498
  #########
3367
- - regex: '; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3499
+ - regex: '; {0,2}(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3368
3500
  regex_flag: 'i'
3369
3501
  device_replacement: 'Micromax $1$2'
3370
3502
  brand_replacement: 'Micromax'
3371
3503
  model_replacement: '$1$2'
3372
- - regex: '; *Micromax[ _](A\d{2,3}[^;/]*) Build'
3504
+ - regex: '; {0,2}Micromax[ _](A\d{2,3}[^;/]*) Build'
3373
3505
  regex_flag: 'i'
3374
3506
  device_replacement: 'Micromax $1'
3375
3507
  brand_replacement: 'Micromax'
3376
3508
  model_replacement: '$1'
3377
3509
  # be carefull here with Acer e.g. A500
3378
- - regex: '; *(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3510
+ - regex: '; {0,2}(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3379
3511
  regex_flag: 'i'
3380
3512
  device_replacement: 'Micromax $1'
3381
3513
  brand_replacement: 'Micromax'
3382
3514
  model_replacement: '$1'
3383
- - regex: '; *Micromax[ _](P\d{3}[^;/]*) Build'
3515
+ - regex: '; {0,2}Micromax[ _](P\d{3}[^;/]*) Build'
3384
3516
  regex_flag: 'i'
3385
3517
  device_replacement: 'Micromax $1'
3386
3518
  brand_replacement: 'Micromax'
3387
3519
  model_replacement: '$1'
3388
- - regex: '; *(P\d{3}|P\d{3}\(Funbook\)) Build'
3520
+ - regex: '; {0,2}(P\d{3}|P\d{3}\(Funbook\)) Build'
3389
3521
  regex_flag: 'i'
3390
3522
  device_replacement: 'Micromax $1'
3391
3523
  brand_replacement: 'Micromax'
@@ -3395,7 +3527,7 @@ device_parsers:
3395
3527
  # Mito
3396
3528
  # @ref: http://new.mitomobile.com/
3397
3529
  #########
3398
- - regex: '; *(MITO)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
3530
+ - regex: '; {0,2}(MITO)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3399
3531
  regex_flag: 'i'
3400
3532
  device_replacement: '$1 $2'
3401
3533
  brand_replacement: 'Mito'
@@ -3405,7 +3537,7 @@ device_parsers:
3405
3537
  # Mobistel
3406
3538
  # @ref: http://www.mobistel.com/
3407
3539
  #########
3408
- - regex: '; *(Cynus)[ _](F5|T\d|.+?) *(?:Build|[;/\)])'
3540
+ - regex: '; {0,2}(Cynus)[ _](F5|T\d|.{1,200}?) {0,2}(?:Build|[;/\)])'
3409
3541
  regex_flag: 'i'
3410
3542
  device_replacement: '$1 $2'
3411
3543
  brand_replacement: 'Mobistel'
@@ -3415,12 +3547,12 @@ device_parsers:
3415
3547
  # Modecom
3416
3548
  # @ref: http://www.modecom.eu/tablets/portal/
3417
3549
  #########
3418
- - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+?)(?: Build|\) AppleWebKit)'
3550
+ - regex: '; {0,2}(MODECOM |)(FreeTab) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3419
3551
  regex_flag: 'i'
3420
3552
  device_replacement: '$1$2 $3'
3421
3553
  brand_replacement: 'Modecom'
3422
3554
  model_replacement: '$2 $3'
3423
- - regex: '; *(MODECOM )([^;/]+?)(?: Build|\) AppleWebKit)'
3555
+ - regex: '; {0,2}(MODECOM )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3424
3556
  regex_flag: 'i'
3425
3557
  device_replacement: '$1 $2'
3426
3558
  brand_replacement: 'Modecom'
@@ -3430,32 +3562,32 @@ device_parsers:
3430
3562
  # Motorola
3431
3563
  # @ref: http://www.motorola.com/us/shop-all-mobile-phones/
3432
3564
  #########
3433
- - regex: '; *(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3565
+ - regex: '; {0,2}(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3434
3566
  device_replacement: 'Motorola $1'
3435
3567
  brand_replacement: 'Motorola'
3436
3568
  model_replacement: '$1'
3437
- - regex: '; *(Milestone )(XT[^;/]*) Build'
3569
+ - regex: '; {0,2}(Milestone )(XT[^;/]*) Build'
3438
3570
  device_replacement: 'Motorola $1$2'
3439
3571
  brand_replacement: 'Motorola'
3440
3572
  model_replacement: '$2'
3441
- - regex: '; *(Motoroi ?x|Droid X|DROIDX) Build'
3573
+ - regex: '; {0,2}(Motoroi ?x|Droid X|DROIDX) Build'
3442
3574
  regex_flag: 'i'
3443
3575
  device_replacement: 'Motorola $1'
3444
3576
  brand_replacement: 'Motorola'
3445
3577
  model_replacement: 'DROID X'
3446
- - regex: '; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3578
+ - regex: '; {0,2}(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3447
3579
  device_replacement: 'Motorola $1'
3448
3580
  brand_replacement: 'Motorola'
3449
3581
  model_replacement: '$1'
3450
- - regex: '; *(A555|A85[34][^;/]*|A95[356]|ME[58]\d{2}\+?|ME600|ME632|ME722|MB\d{3}\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\d{3,4}[A-Z\+]*|CL[iI]Q|CL[iI]Q XT) Build'
3582
+ - regex: '; {0,2}(A555|A85[34][^;/]*|A95[356]|ME[58]\d{2}\+?|ME600|ME632|ME722|MB\d{3}\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\d{3,4}[A-Z\+]*|CL[iI]Q|CL[iI]Q XT) Build'
3451
3583
  device_replacement: '$1'
3452
3584
  brand_replacement: 'Motorola'
3453
3585
  model_replacement: '$1'
3454
- - regex: '; *(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]+) Build'
3586
+ - regex: '; {0,2}(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]{1,100}) Build'
3455
3587
  device_replacement: '$1$2'
3456
3588
  brand_replacement: 'Motorola'
3457
3589
  model_replacement: '$2'
3458
- - regex: '; *(Moto[_ ]?|MOT\-)([^;/]+) Build'
3590
+ - regex: '; {0,2}(Moto[_ ]?|MOT\-)([^;/]{1,100}) Build'
3459
3591
  device_replacement: '$1$2'
3460
3592
  brand_replacement: 'Motorola'
3461
3593
  model_replacement: '$2'
@@ -3464,7 +3596,7 @@ device_parsers:
3464
3596
  # MpMan
3465
3597
  # @ref: http://www.mpmaneurope.com
3466
3598
  #########
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)'
3599
+ - regex: '; {0,2}((?: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)'
3468
3600
  device_replacement: '$1'
3469
3601
  brand_replacement: 'Mpman'
3470
3602
  model_replacement: '$1'
@@ -3473,7 +3605,7 @@ device_parsers:
3473
3605
  # MSI
3474
3606
  # @ref: http://www.msi.com/product/windpad/
3475
3607
  #########
3476
- - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
3608
+ - regex: '; {0,2}(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3477
3609
  regex_flag: 'i'
3478
3610
  device_replacement: '$1'
3479
3611
  brand_replacement: 'Msi'
@@ -3483,7 +3615,7 @@ device_parsers:
3483
3615
  # Multilaser
3484
3616
  # http://www.multilaser.com.br/listagem_produtos.php?cat=5
3485
3617
  #########
3486
- - regex: '; *Multilaser[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3618
+ - regex: '; {0,2}Multilaser[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3487
3619
  device_replacement: '$1'
3488
3620
  brand_replacement: 'Multilaser'
3489
3621
  model_replacement: '$1'
@@ -3492,15 +3624,15 @@ device_parsers:
3492
3624
  # MyPhone
3493
3625
  # @ref: http://myphone.com.ph/
3494
3626
  #########
3495
- - regex: '; *(My)[_]?(Pad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3627
+ - regex: '; {0,2}(My)[_]?(Pad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3496
3628
  device_replacement: '$1$2 $3'
3497
3629
  brand_replacement: 'MyPhone'
3498
3630
  model_replacement: '$1$2 $3'
3499
- - regex: '; *(My)\|?(Phone)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3631
+ - regex: '; {0,2}(My)\|?(Phone)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3500
3632
  device_replacement: '$1$2 $3'
3501
3633
  brand_replacement: 'MyPhone'
3502
3634
  model_replacement: '$3'
3503
- - regex: '; *(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3635
+ - regex: '; {0,2}(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3504
3636
  regex_flag: 'i'
3505
3637
  device_replacement: '$1 $2'
3506
3638
  brand_replacement: 'MyPhone'
@@ -3510,7 +3642,7 @@ device_parsers:
3510
3642
  # Mytab
3511
3643
  # @ref: http://www.mytab.eu/en/category/mytab-products/
3512
3644
  #########
3513
- - regex: '; *(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3645
+ - regex: '; {0,2}(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3514
3646
  device_replacement: '$1'
3515
3647
  brand_replacement: 'Mytab'
3516
3648
  model_replacement: '$1'
@@ -3519,7 +3651,7 @@ device_parsers:
3519
3651
  # Nabi
3520
3652
  # @ref: https://www.nabitablet.com
3521
3653
  #########
3522
- - regex: '; *(NABI2?-)([^;/]+?)(?: Build|\) AppleWebKit)'
3654
+ - regex: '; {0,2}(NABI2?-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3523
3655
  device_replacement: '$1$2'
3524
3656
  brand_replacement: 'Nabi'
3525
3657
  model_replacement: '$2'
@@ -3528,15 +3660,15 @@ device_parsers:
3528
3660
  # Nec Medias
3529
3661
  # @ref: http://www.n-keitai.com/
3530
3662
  #########
3531
- - regex: '; *(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3663
+ - regex: '; {0,2}(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3532
3664
  device_replacement: '$1'
3533
3665
  brand_replacement: 'Nec'
3534
3666
  model_replacement: '$1'
3535
- - regex: '; ?(NEC-)(.*?)(?: Build|\) AppleWebKit)'
3667
+ - regex: '; ?(NEC-)(.{0,200}?)(?: Build|\) AppleWebKit)'
3536
3668
  device_replacement: '$1$2'
3537
3669
  brand_replacement: 'Nec'
3538
3670
  model_replacement: '$2'
3539
- - regex: '; *(LT-NA7)(?: Build|\) AppleWebKit)'
3671
+ - regex: '; {0,2}(LT-NA7)(?: Build|\) AppleWebKit)'
3540
3672
  device_replacement: '$1'
3541
3673
  brand_replacement: 'Nec'
3542
3674
  model_replacement: 'Lifetouch Note'
@@ -3545,7 +3677,7 @@ device_parsers:
3545
3677
  # Nextbook
3546
3678
  # @ref: http://nextbookusa.com
3547
3679
  #########
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|[\);])'
3680
+ - regex: '; {0,2}(NXM\d+[A-Za-z0-9_]{0,50}|Next\d[A-Za-z0-9_ \-]{0,50}|NEXT\d[A-Za-z0-9_ \-]{0,50}|Nextbook [A-Za-z0-9_ ]{0,50}|DATAM803HC|M805)(?: Build|[\);])'
3549
3681
  device_replacement: '$1'
3550
3682
  brand_replacement: 'Nextbook'
3551
3683
  model_replacement: '$1'
@@ -3554,12 +3686,12 @@ device_parsers:
3554
3686
  # Nokia
3555
3687
  # @ref: http://www.nokia.com
3556
3688
  #########
3557
- - regex: '; *(Nokia)([ _\-]*)([^;/]*) Build'
3689
+ - regex: '; {0,2}(Nokia)([ _\-]{0,5})([^;/]{0,50}) Build'
3558
3690
  regex_flag: 'i'
3559
3691
  device_replacement: '$1$2$3'
3560
3692
  brand_replacement: 'Nokia'
3561
3693
  model_replacement: '$3'
3562
- - regex: '; *(TA\-\d{4})(?: Build|\) AppleWebKit)'
3694
+ - regex: '; {0,2}(TA\-\d{4})(?: Build|\) AppleWebKit)'
3563
3695
  device_replacement: 'Nokia $1'
3564
3696
  brand_replacement: 'Nokia'
3565
3697
  model_replacement: '$1'
@@ -3569,11 +3701,11 @@ device_parsers:
3569
3701
  # @ref:
3570
3702
  # TODO nook browser/1.0
3571
3703
  #########
3572
- - regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+?)(?: Build|\) AppleWebKit)'
3704
+ - regex: '; {0,2}(Nook ?|Barnes & Noble Nook |BN )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3573
3705
  device_replacement: '$1$2'
3574
3706
  brand_replacement: 'Nook'
3575
3707
  model_replacement: '$2'
3576
- - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3708
+ - regex: '; {0,2}(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3577
3709
  device_replacement: '$1$2'
3578
3710
  brand_replacement: 'Nook'
3579
3711
  model_replacement: '$2'
@@ -3586,7 +3718,7 @@ device_parsers:
3586
3718
  # Olivetti
3587
3719
  # @ref: http://www.olivetti.de/EN/Page/t02/view_html?idp=348
3588
3720
  #########
3589
- - regex: '; *(OP110|OliPad[^;/]+?)(?: Build|\) AppleWebKit)'
3721
+ - regex: '; {0,2}(OP110|OliPad[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3590
3722
  device_replacement: 'Olivetti $1'
3591
3723
  brand_replacement: 'Olivetti'
3592
3724
  model_replacement: '$1'
@@ -3597,7 +3729,7 @@ device_parsers:
3597
3729
  # @note: MID tablets might get matched by CobyKyros first
3598
3730
  # @models: (T107|MID(?:700[2-5]|7031|7108|7132|750[02]|8001|8500|9001|971[12])
3599
3731
  #########
3600
- - regex: '; *OMEGA[ _\-](MID[^;/]+?)(?: Build|\) AppleWebKit)'
3732
+ - regex: '; {0,2}OMEGA[ _\-](MID[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3601
3733
  device_replacement: 'Omega $1'
3602
3734
  brand_replacement: 'Omega'
3603
3735
  model_replacement: '$1'
@@ -3610,7 +3742,7 @@ device_parsers:
3610
3742
  # OpenPeak
3611
3743
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
3612
3744
  #########
3613
- - regex: '; *((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3745
+ - regex: '; {0,2}((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3614
3746
  device_replacement: 'Openpeak $1'
3615
3747
  brand_replacement: 'Openpeak'
3616
3748
  model_replacement: '$1'
@@ -3619,18 +3751,18 @@ device_parsers:
3619
3751
  # Oppo
3620
3752
  # @ref: http://en.oppo.com/products/
3621
3753
  #########
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)'
3754
+ - regex: '; {0,2}(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
3755
  device_replacement: 'Oppo $1'
3624
3756
  brand_replacement: 'Oppo'
3625
3757
  model_replacement: '$1'
3626
- - regex: '; *OPPO ?([^;/]+?)(?: Build|\) AppleWebKit)'
3758
+ - regex: '; {0,2}OPPO ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3627
3759
  device_replacement: 'Oppo $1'
3628
3760
  brand_replacement: 'Oppo'
3629
3761
  model_replacement: '$1'
3630
- - regex: '; *(CPH\d{1,4}|RMX\d{1,4}|P[A-Z]{3}\d{2})(?: Build|\) AppleWebKit)'
3762
+ - regex: '; {0,2}(CPH\d{1,4}|RMX\d{1,4}|P[A-Z]{3}\d{2})(?: Build|\) AppleWebKit)'
3631
3763
  device_replacement: 'Oppo $1'
3632
3764
  brand_replacement: 'Oppo'
3633
- - regex: '; *(A1601)(?: Build|\) AppleWebKit)'
3765
+ - regex: '; {0,2}(A1601)(?: Build|\) AppleWebKit)'
3634
3766
  device_replacement: 'Oppo F1s'
3635
3767
  brand_replacement: 'Oppo'
3636
3768
  model_replacement: '$1'
@@ -3639,20 +3771,20 @@ device_parsers:
3639
3771
  # Odys
3640
3772
  # @ref: http://odys.de
3641
3773
  #########
3642
- - regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+?)(?: Build|\) AppleWebKit)'
3774
+ - regex: '; {0,2}(?:Odys\-|ODYS\-|ODYS )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3643
3775
  device_replacement: 'Odys $1'
3644
3776
  brand_replacement: 'Odys'
3645
3777
  model_replacement: '$1'
3646
- - regex: '; *(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3778
+ - regex: '; {0,2}(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3647
3779
  device_replacement: 'Odys $1 $2'
3648
3780
  brand_replacement: 'Odys'
3649
3781
  model_replacement: '$1 $2'
3650
- - regex: '; *(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3782
+ - regex: '; {0,2}(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3651
3783
  device_replacement: 'Odys $1 $2 $3'
3652
3784
  brand_replacement: 'Odys'
3653
3785
  model_replacement: '$1 $2 $3'
3654
3786
  # Weltbild - Tablet PC 4 = Cat Phoenix = Odys Tablet PC 4?
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)'
3787
+ - regex: '; {0,2}(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)'
3656
3788
  device_replacement: 'Odys $1'
3657
3789
  brand_replacement: 'Odys'
3658
3790
  model_replacement: '$1'
@@ -3674,7 +3806,7 @@ device_parsers:
3674
3806
  # Orion
3675
3807
  # @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
3676
3808
  #########
3677
- - regex: '; *(TP-\d+)(?: Build|\) AppleWebKit)'
3809
+ - regex: '; {0,2}(TP-\d+)(?: Build|\) AppleWebKit)'
3678
3810
  device_replacement: 'Orion $1'
3679
3811
  brand_replacement: 'Orion'
3680
3812
  model_replacement: '$1'
@@ -3683,7 +3815,7 @@ device_parsers:
3683
3815
  # PackardBell
3684
3816
  # @ref: http://www.packardbell.com/pb/en/AE/content/productgroup/tablets
3685
3817
  #########
3686
- - regex: '; *(G100W?)(?: Build|\) AppleWebKit)'
3818
+ - regex: '; {0,2}(G100W?)(?: Build|\) AppleWebKit)'
3687
3819
  device_replacement: 'PackardBell $1'
3688
3820
  brand_replacement: 'PackardBell'
3689
3821
  model_replacement: '$1'
@@ -3694,17 +3826,17 @@ device_parsers:
3694
3826
  # @models: T11, T21, T31, P11, P51, Eluga Power, Eluga DL1
3695
3827
  # @models: (tab) Toughpad FZ-A1, Toughpad JT-B1
3696
3828
  #########
3697
- - regex: '; *(Panasonic)[_ ]([^;/]+?)(?: Build|\) AppleWebKit)'
3829
+ - regex: '; {0,2}(Panasonic)[_ ]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3698
3830
  device_replacement: '$1 $2'
3699
3831
  brand_replacement: '$1'
3700
3832
  model_replacement: '$2'
3701
3833
  # Toughpad
3702
- - regex: '; *(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3834
+ - regex: '; {0,2}(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3703
3835
  device_replacement: 'Panasonic $1'
3704
3836
  brand_replacement: 'Panasonic'
3705
3837
  model_replacement: '$1'
3706
3838
  # Eluga Power
3707
- - regex: '; *(dL1|DL1)(?: Build|\) AppleWebKit)'
3839
+ - regex: '; {0,2}(dL1|DL1)(?: Build|\) AppleWebKit)'
3708
3840
  device_replacement: 'Panasonic $1'
3709
3841
  brand_replacement: 'Panasonic'
3710
3842
  model_replacement: '$1'
@@ -3715,15 +3847,15 @@ device_parsers:
3715
3847
  # @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA
3716
3848
  # @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
3717
3849
  #########
3718
- - regex: '; *(SKY[ _]|)(IM\-[AT]\d{3}[^;/]+).* Build/'
3850
+ - regex: '; {0,2}(SKY[ _]|)(IM\-[AT]\d{3}[^;/]{1,100}).{0,30} Build/'
3719
3851
  device_replacement: 'Pantech $1$2'
3720
3852
  brand_replacement: 'Pantech'
3721
3853
  model_replacement: '$1$2'
3722
- - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3854
+ - regex: '; {0,2}((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3723
3855
  device_replacement: '$1'
3724
3856
  brand_replacement: 'Pantech'
3725
3857
  model_replacement: '$1'
3726
- - regex: '; *Pantech([^;/]+).* Build/'
3858
+ - regex: '; {0,2}Pantech([^;/]{1,30}).{0,200}? Build/'
3727
3859
  device_replacement: 'Pantech $1'
3728
3860
  brand_replacement: 'Pantech'
3729
3861
  model_replacement: '$1'
@@ -3732,7 +3864,7 @@ device_parsers:
3732
3864
  # Papayre
3733
3865
  # @ref: http://grammata.es/
3734
3866
  #########
3735
- - regex: '; *(papyre)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3867
+ - regex: '; {0,2}(papyre)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3736
3868
  regex_flag: 'i'
3737
3869
  device_replacement: '$1 $2'
3738
3870
  brand_replacement: 'Papyre'
@@ -3742,7 +3874,7 @@ device_parsers:
3742
3874
  # Pearl
3743
3875
  # @ref: http://www.pearl.de/c-1540.shtml
3744
3876
  #########
3745
- - regex: '; *(?:Touchlet )?(X10\.[^;/]+?)(?: Build|\) AppleWebKit)'
3877
+ - regex: '; {0,2}(?:Touchlet )?(X10\.[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3746
3878
  device_replacement: 'Pearl $1'
3747
3879
  brand_replacement: 'Pearl'
3748
3880
  model_replacement: '$1'
@@ -3755,11 +3887,11 @@ device_parsers:
3755
3887
  device_replacement: 'Phicomm $1'
3756
3888
  brand_replacement: 'Phicomm'
3757
3889
  model_replacement: '$1'
3758
- - regex: '; PHICOMM ([^;/]+?)(?: Build|\) AppleWebKit)'
3890
+ - regex: '; PHICOMM ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3759
3891
  device_replacement: 'Phicomm $1'
3760
3892
  brand_replacement: 'Phicomm'
3761
3893
  model_replacement: '$1'
3762
- - regex: '; *(FWS\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
3894
+ - regex: '; {0,2}(FWS\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3763
3895
  device_replacement: 'Phicomm $1'
3764
3896
  brand_replacement: 'Phicomm'
3765
3897
  model_replacement: '$1'
@@ -3771,11 +3903,11 @@ device_parsers:
3771
3903
  # @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
3772
3904
  #########
3773
3905
  # @note: this a best guess according to available philips models. Need more User-Agents
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)'
3906
+ - regex: '; {0,2}(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)'
3775
3907
  device_replacement: '$1'
3776
3908
  brand_replacement: 'Philips'
3777
3909
  model_replacement: '$1'
3778
- - regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3910
+ - regex: '; {0,2}(?:Philips|PHILIPS)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3779
3911
  device_replacement: 'Philips $1'
3780
3912
  brand_replacement: 'Philips'
3781
3913
  model_replacement: '$1'
@@ -3784,7 +3916,7 @@ device_parsers:
3784
3916
  # Pipo
3785
3917
  # @ref: http://www.pipo.cn/En/
3786
3918
  #########
3787
- - regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3919
+ - regex: 'Android 4\..{0,200}; {0,2}(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3788
3920
  device_replacement: 'Pipo $1$2'
3789
3921
  brand_replacement: 'Pipo'
3790
3922
  model_replacement: '$1$2'
@@ -3793,7 +3925,7 @@ device_parsers:
3793
3925
  # Ployer
3794
3926
  # @ref: http://en.ployer.cn/
3795
3927
  #########
3796
- - regex: '; *(MOMO[^;/]+?)(?: Build|\) AppleWebKit)'
3928
+ - regex: '; {0,2}(MOMO[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3797
3929
  device_replacement: '$1'
3798
3930
  brand_replacement: 'Ployer'
3799
3931
  model_replacement: '$1'
@@ -3802,11 +3934,11 @@ device_parsers:
3802
3934
  # Polaroid/ Acho
3803
3935
  # @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
3804
3936
  #########
3805
- - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*?)(\/[^;/]*|)(?: Build|\) AppleWebKit)'
3937
+ - regex: '; {0,2}(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]{0,30}?)(\/[^;/]{0,30}|)(?: Build|\) AppleWebKit)'
3806
3938
  device_replacement: '$1'
3807
3939
  brand_replacement: 'Polaroid'
3808
3940
  model_replacement: '$1'
3809
- - regex: '; *(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3941
+ - regex: '; {0,2}(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3810
3942
  device_replacement: '$1'
3811
3943
  brand_replacement: 'Polaroid'
3812
3944
  model_replacement: '$1'
@@ -3816,7 +3948,7 @@ device_parsers:
3816
3948
  # @ref: http://pompmobileshop.com/
3817
3949
  #########
3818
3950
  #~ TODO
3819
- - regex: '; *(POMP)[ _\-](.+?) *(?:Build|[;/\)])'
3951
+ - regex: '; {0,2}(POMP)[ _\-](.{1,200}?) {0,2}(?:Build|[;/\)])'
3820
3952
  device_replacement: '$1 $2'
3821
3953
  brand_replacement: 'Pomp'
3822
3954
  model_replacement: '$2'
@@ -3825,11 +3957,11 @@ device_parsers:
3825
3957
  # Positivo
3826
3958
  # @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
3827
3959
  #########
3828
- - regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3960
+ - regex: '; {0,2}(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3829
3961
  device_replacement: '$1'
3830
3962
  brand_replacement: 'Positivo'
3831
3963
  model_replacement: '$1'
3832
- - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+?)(?: Build|\) AppleWebKit)'
3964
+ - regex: '; {0,2}(?:Positivo |)((?:YPY|Ypy)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3833
3965
  device_replacement: '$1'
3834
3966
  brand_replacement: 'Positivo'
3835
3967
  model_replacement: '$1'
@@ -3839,15 +3971,15 @@ device_parsers:
3839
3971
  # @ref: http://www.pointofview-online.com/default2.php
3840
3972
  # @TODO: Smartphone Models MOB-3515, MOB-5045-B missing
3841
3973
  #########
3842
- - regex: '; *(MOB-[^;/]+?)(?: Build|\) AppleWebKit)'
3974
+ - regex: '; {0,2}(MOB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3843
3975
  device_replacement: '$1'
3844
3976
  brand_replacement: 'POV'
3845
3977
  model_replacement: '$1'
3846
- - regex: '; *POV[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3978
+ - regex: '; {0,2}POV[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3847
3979
  device_replacement: 'POV $1'
3848
3980
  brand_replacement: 'POV'
3849
3981
  model_replacement: '$1'
3850
- - regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3982
+ - regex: '; {0,2}((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3851
3983
  device_replacement: 'POV $1'
3852
3984
  brand_replacement: 'POV'
3853
3985
  model_replacement: '$1'
@@ -3857,7 +3989,7 @@ device_parsers:
3857
3989
  # @ref: http://www.prestigio.com/catalogue/MultiPhones
3858
3990
  # @ref: http://www.prestigio.com/catalogue/MultiPads
3859
3991
  #########
3860
- - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+?)(?: Build|\) AppleWebKit)'
3992
+ - regex: '; {0,2}(?:Prestigio |)((?:PAP|PMP)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3861
3993
  device_replacement: 'Prestigio $1'
3862
3994
  brand_replacement: 'Prestigio'
3863
3995
  model_replacement: '$1'
@@ -3866,7 +3998,7 @@ device_parsers:
3866
3998
  # Proscan
3867
3999
  # @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
3868
4000
  #########
3869
- - regex: '; *(PLT[0-9]{4}.*?)(?: Build|\) AppleWebKit)'
4001
+ - regex: '; {0,2}(PLT[0-9]{4}.{0,200}?)(?: Build|\) AppleWebKit)'
3870
4002
  device_replacement: '$1'
3871
4003
  brand_replacement: 'Proscan'
3872
4004
  model_replacement: '$1'
@@ -3875,15 +4007,15 @@ device_parsers:
3875
4007
  # QMobile
3876
4008
  # @ref: http://www.qmobile.com.pk/
3877
4009
  #########
3878
- - regex: '; *(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
4010
+ - regex: '; {0,2}(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
3879
4011
  device_replacement: '$1 $2'
3880
4012
  brand_replacement: 'Qmobile'
3881
4013
  model_replacement: '$1 $2'
3882
- - regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
4014
+ - regex: '; {0,2}(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
3883
4015
  device_replacement: 'Qmobile $2 $3'
3884
4016
  brand_replacement: 'Qmobile'
3885
4017
  model_replacement: '$2 $3'
3886
- - regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+?)(?: Build|\) AppleWebKit)'
4018
+ - regex: '; {0,2}(Q\-?[Mm]obile)[_ ](A[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3887
4019
  device_replacement: 'Qmobile $2'
3888
4020
  brand_replacement: 'Qmobile'
3889
4021
  model_replacement: '$2'
@@ -3892,11 +4024,11 @@ device_parsers:
3892
4024
  # Qmobilevn
3893
4025
  # @ref: http://qmobile.vn/san-pham.html
3894
4026
  #########
3895
- - regex: '; *(Q\-Smart)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4027
+ - regex: '; {0,2}(Q\-Smart)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3896
4028
  device_replacement: '$1 $2'
3897
4029
  brand_replacement: 'Qmobilevn'
3898
4030
  model_replacement: '$2'
3899
- - regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+?)(?: Build|\) AppleWebKit)'
4031
+ - regex: '; {0,2}(Q\-?[Mm]obile)[ _\-](S[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3900
4032
  device_replacement: '$1 $2'
3901
4033
  brand_replacement: 'Qmobilevn'
3902
4034
  model_replacement: '$2'
@@ -3905,7 +4037,7 @@ device_parsers:
3905
4037
  # Quanta
3906
4038
  # @ref: ?
3907
4039
  #########
3908
- - regex: '; *(TA1013)(?: Build|\) AppleWebKit)'
4040
+ - regex: '; {0,2}(TA1013)(?: Build|\) AppleWebKit)'
3909
4041
  device_replacement: '$1'
3910
4042
  brand_replacement: 'Quanta'
3911
4043
  model_replacement: '$1'
@@ -3928,7 +4060,7 @@ device_parsers:
3928
4060
  # @ref: http://www.rock-chips.com/a/cn/product/index.html
3929
4061
  # @note: manufacturer sells chipsets - I assume that these UAs are dev-boards
3930
4062
  #########
3931
- - regex: '; *(RK\d+),?(?: Build|\) AppleWebKit)'
4063
+ - regex: '; {0,2}(RK\d+),?(?: Build|\) AppleWebKit)'
3932
4064
  device_replacement: '$1'
3933
4065
  brand_replacement: 'Rockchip'
3934
4066
  model_replacement: '$1'
@@ -3941,55 +4073,55 @@ device_parsers:
3941
4073
  # Samsung Android Devices
3942
4074
  # @ref: http://www.samsung.com/us/mobile/cell-phones/all-products
3943
4075
  #########
3944
- - regex: '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
4076
+ - regex: '; {0,2}(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]{0,100})\/?[^;/]{0,50} Build/'
3945
4077
  device_replacement: 'Samsung $1$2'
3946
4078
  brand_replacement: 'Samsung'
3947
4079
  model_replacement: '$2'
3948
- - regex: '; *(Google |)(Nexus [Ss](?: 4G|)) Build/'
4080
+ - regex: '; {0,2}(Google |)(Nexus [Ss](?: 4G|)) Build/'
3949
4081
  device_replacement: 'Samsung $1$2'
3950
4082
  brand_replacement: 'Samsung'
3951
4083
  model_replacement: '$2'
3952
- - regex: '; *(SAMSUNG |Samsung )([^\/]*)\/[^ ]* Build/'
4084
+ - regex: '; {0,2}(SAMSUNG |Samsung )([^\/]{0,50})\/[^ ]{0,50} Build/'
3953
4085
  device_replacement: 'Samsung $2'
3954
4086
  brand_replacement: 'Samsung'
3955
4087
  model_replacement: '$2'
3956
- - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
4088
+ - regex: '; {0,2}(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
3957
4089
  device_replacement: 'Samsung $1'
3958
4090
  brand_replacement: 'Samsung'
3959
4091
  model_replacement: '$1'
3960
- - regex: '; *(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]+) Build'
4092
+ - regex: '; {0,2}(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]{1,100}) Build'
3961
4093
  device_replacement: 'Samsung $2'
3962
4094
  brand_replacement: 'Samsung'
3963
4095
  model_replacement: '$2'
3964
- - regex: '; *(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
4096
+ - regex: '; {0,2}(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]{0,50})(\/[^ ]{0,50}) Build'
3965
4097
  device_replacement: 'Samsung $1$2$3'
3966
4098
  brand_replacement: 'Samsung'
3967
4099
  model_replacement: '$2'
3968
- - regex: '(?:; *|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
4100
+ - regex: '(?:; {0,2}|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
3969
4101
  device_replacement: 'Samsung $1'
3970
4102
  brand_replacement: 'Samsung'
3971
4103
  model_replacement: '$1'
3972
- - regex: '; (SAMSUNG-)([A-Za-z0-9\-]+).* Build/'
4104
+ - regex: '; (SAMSUNG-)([A-Za-z0-9\-]{0,50}).{0,200} Build/'
3973
4105
  device_replacement: 'Samsung $1$2'
3974
4106
  brand_replacement: 'Samsung'
3975
4107
  model_replacement: '$2'
3976
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4108
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3977
4109
  device_replacement: 'Samsung $1'
3978
4110
  brand_replacement: 'Samsung'
3979
4111
  model_replacement: '$1'
3980
- - regex: '; *((?:SC)\-[A-Za-z0-9 ]+)(/?[^ ]*|)\)'
4112
+ - regex: '; {0,2}((?:SC)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|)\)'
3981
4113
  device_replacement: 'Samsung $1'
3982
4114
  brand_replacement: 'Samsung'
3983
4115
  model_replacement: '$1'
3984
- - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4116
+ - regex: ' ((?:SCH)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3985
4117
  device_replacement: 'Samsung $1'
3986
4118
  brand_replacement: 'Samsung'
3987
4119
  model_replacement: '$1'
3988
- - regex: '; *(Behold ?(?:2|II)|YP\-G[^;/]+|EK-GC100|SCL21|I9300) Build'
4120
+ - regex: '; {0,2}(Behold ?(?:2|II)|YP\-G[^;/]{1,100}|EK-GC100|SCL21|I9300) Build'
3989
4121
  device_replacement: 'Samsung $1'
3990
4122
  brand_replacement: 'Samsung'
3991
4123
  model_replacement: '$1'
3992
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
4124
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
3993
4125
  device_replacement: 'Samsung $1'
3994
4126
  brand_replacement: 'Samsung'
3995
4127
  model_replacement: '$1'
@@ -3999,11 +4131,11 @@ device_parsers:
3999
4131
  # @ref: http://www.sharp-phone.com/en/index.html
4000
4132
  # @ref: http://www.android.com/devices/?country=all&m=sharp
4001
4133
  #########
4002
- - regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+?)(?: Build|\) AppleWebKit)'
4134
+ - regex: '; {0,2}(SH\-?\d\d[^;/]{1,100}|SBM\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4003
4135
  device_replacement: '$1'
4004
4136
  brand_replacement: 'Sharp'
4005
4137
  model_replacement: '$1'
4006
- - regex: '; *(SHARP[ -])([^;/]+?)(?: Build|\) AppleWebKit)'
4138
+ - regex: '; {0,2}(SHARP[ -])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4007
4139
  device_replacement: '$1$2'
4008
4140
  brand_replacement: 'Sharp'
4009
4141
  model_replacement: '$2'
@@ -4012,15 +4144,15 @@ device_parsers:
4012
4144
  # Simvalley
4013
4145
  # @ref: http://www.simvalley-mobile.de/
4014
4146
  #########
4015
- - regex: '; *(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
4147
+ - regex: '; {0,2}(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
4016
4148
  device_replacement: '$1'
4017
4149
  brand_replacement: 'Simvalley'
4018
4150
  model_replacement: '$1'
4019
- - regex: '; *(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
4151
+ - regex: '; {0,2}(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
4020
4152
  device_replacement: '$1'
4021
4153
  brand_replacement: 'Simvalley'
4022
4154
  model_replacement: '$1'
4023
- - regex: '; *(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
4155
+ - regex: '; {0,2}(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
4024
4156
  device_replacement: '$1'
4025
4157
  brand_replacement: 'Simvalley'
4026
4158
  model_replacement: '$1'
@@ -4030,7 +4162,7 @@ device_parsers:
4030
4162
  # @ref: http://www.sk-w.com/phone/phone_list.jsp
4031
4163
  # @ref: http://www.android.com/devices/?country=all&m=sk-telesys
4032
4164
  #########
4033
- - regex: '; *(SK\-.*?)(?: Build|\) AppleWebKit)'
4165
+ - regex: '; {0,2}(SK\-.{0,200}?)(?: Build|\) AppleWebKit)'
4034
4166
  device_replacement: '$1'
4035
4167
  brand_replacement: 'SKtelesys'
4036
4168
  model_replacement: '$1'
@@ -4039,11 +4171,11 @@ device_parsers:
4039
4171
  # Skytex
4040
4172
  # @ref: http://skytex.com/android
4041
4173
  #########
4042
- - regex: '; *(?:SKYTEX|SX)-([^;/]+?)(?: Build|\) AppleWebKit)'
4174
+ - regex: '; {0,2}(?:SKYTEX|SX)-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4043
4175
  device_replacement: '$1'
4044
4176
  brand_replacement: 'Skytex'
4045
4177
  model_replacement: '$1'
4046
- - regex: '; *(IMAGINE [^;/]+?)(?: Build|\) AppleWebKit)'
4178
+ - regex: '; {0,2}(IMAGINE [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4047
4179
  device_replacement: '$1'
4048
4180
  brand_replacement: 'Skytex'
4049
4181
  model_replacement: '$1'
@@ -4053,7 +4185,7 @@ device_parsers:
4053
4185
  # @ref: http://en.smartdevices.com.cn/Products/
4054
4186
  # @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
4055
4187
  #########
4056
- - regex: '; *(SmartQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4188
+ - regex: '; {0,2}(SmartQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4057
4189
  device_replacement: '$1 $2'
4058
4190
  brand_replacement: '$1'
4059
4191
  model_replacement: '$2'
@@ -4063,7 +4195,7 @@ device_parsers:
4063
4195
  # @ref: http://www.smartbitt.com/
4064
4196
  # @missing: SBT Useragents
4065
4197
  #########
4066
- - regex: '; *(WF7C|WF10C|SBT[^;/]+?)(?: Build|\) AppleWebKit)'
4198
+ - regex: '; {0,2}(WF7C|WF10C|SBT[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4067
4199
  device_replacement: '$1'
4068
4200
  brand_replacement: 'Smartbitt'
4069
4201
  model_replacement: '$1'
@@ -4072,15 +4204,15 @@ device_parsers:
4072
4204
  # Softbank (Operator Branded Devices)
4073
4205
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
4074
4206
  #########
4075
- - regex: '; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
4207
+ - regex: '; {0,2}(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
4076
4208
  device_replacement: '$1'
4077
4209
  brand_replacement: 'Sharp'
4078
4210
  model_replacement: '$1'
4079
- - regex: '; *(003P|101P|101P11C|102P) Build'
4211
+ - regex: '; {0,2}(003P|101P|101P11C|102P) Build'
4080
4212
  device_replacement: '$1'
4081
4213
  brand_replacement: 'Panasonic'
4082
4214
  model_replacement: '$1'
4083
- - regex: '; *(00\dZ) Build/'
4215
+ - regex: '; {0,2}(00\dZ) Build/'
4084
4216
  device_replacement: '$1'
4085
4217
  brand_replacement: 'ZTE'
4086
4218
  model_replacement: '$1'
@@ -4088,11 +4220,11 @@ device_parsers:
4088
4220
  device_replacement: '$1'
4089
4221
  brand_replacement: 'HTC'
4090
4222
  model_replacement: '$1'
4091
- - regex: '; *(001HT|X06HT) Build'
4223
+ - regex: '; {0,2}(001HT|X06HT) Build'
4092
4224
  device_replacement: '$1'
4093
4225
  brand_replacement: 'HTC'
4094
4226
  model_replacement: '$1'
4095
- - regex: '; *(201M) Build'
4227
+ - regex: '; {0,2}(201M) Build'
4096
4228
  device_replacement: '$1'
4097
4229
  brand_replacement: 'Motorola'
4098
4230
  model_replacement: 'XT902'
@@ -4102,11 +4234,11 @@ device_parsers:
4102
4234
  # @ref: http://www.trekstor.co.uk/surftabs-en.html
4103
4235
  # @note: Must come before SonyEricsson
4104
4236
  #########
4105
- - regex: '; *(ST\d{4}.*)Build/ST'
4237
+ - regex: '; {0,2}(ST\d{4}.{0,200})Build/ST'
4106
4238
  device_replacement: 'Trekstor $1'
4107
4239
  brand_replacement: 'Trekstor'
4108
4240
  model_replacement: '$1'
4109
- - regex: '; *(ST\d{4}.*?)(?: Build|\) AppleWebKit)'
4241
+ - regex: '; {0,2}(ST\d{4}.{0,200}?)(?: Build|\) AppleWebKit)'
4110
4242
  device_replacement: 'Trekstor $1'
4111
4243
  brand_replacement: 'Trekstor'
4112
4244
  model_replacement: '$1'
@@ -4118,16 +4250,16 @@ device_parsers:
4118
4250
  # @TODO: type!
4119
4251
  #########
4120
4252
  # android matchers
4121
- - regex: '; *(Sony ?Ericsson ?)([^;/]+) Build'
4253
+ - regex: '; {0,2}(Sony ?Ericsson ?)([^;/]{1,100}) Build'
4122
4254
  device_replacement: '$1$2'
4123
4255
  brand_replacement: 'SonyEricsson'
4124
4256
  model_replacement: '$2'
4125
- - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
4257
+ - regex: '; {0,2}((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
4126
4258
  device_replacement: '$1'
4127
4259
  brand_replacement: 'SonyEricsson'
4128
4260
  model_replacement: '$1'
4129
4261
  # TODO X\d+ is wrong
4130
- - regex: '; *(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]*) Build'
4262
+ - regex: '; {0,2}(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]{0,50}) Build'
4131
4263
  regex_flag: 'i'
4132
4264
  device_replacement: '$1'
4133
4265
  brand_replacement: 'SonyEricsson'
@@ -4139,31 +4271,31 @@ device_parsers:
4139
4271
  # @ref: http://www.sonymobile.com/global-en/products/phones/
4140
4272
  # @ref: http://www.sony.jp/tablet/
4141
4273
  #########
4142
- - regex: '; Sony (Tablet[^;/]+?)(?: Build|\) AppleWebKit)'
4274
+ - regex: '; Sony (Tablet[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4143
4275
  device_replacement: 'Sony $1'
4144
4276
  brand_replacement: 'Sony'
4145
4277
  model_replacement: '$1'
4146
- - regex: '; Sony ([^;/]+?)(?: Build|\) AppleWebKit)'
4278
+ - regex: '; Sony ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4147
4279
  device_replacement: 'Sony $1'
4148
4280
  brand_replacement: 'Sony'
4149
4281
  model_replacement: '$1'
4150
- - regex: '; *(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
4282
+ - regex: '; {0,2}(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
4151
4283
  device_replacement: '$1 $2'
4152
4284
  brand_replacement: '$1'
4153
4285
  model_replacement: '$2'
4154
- - regex: '; *(Xperia [^;/]+?)(?: Build|\) AppleWebKit)'
4286
+ - regex: '; {0,2}(Xperia [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4155
4287
  device_replacement: '$1'
4156
4288
  brand_replacement: 'Sony'
4157
4289
  model_replacement: '$1'
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)'
4290
+ - regex: '; {0,2}(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)'
4159
4291
  device_replacement: '$1'
4160
4292
  brand_replacement: 'Sony'
4161
4293
  model_replacement: '$1'
4162
- - regex: '; *(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4294
+ - regex: '; {0,2}(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4163
4295
  device_replacement: '$1'
4164
4296
  brand_replacement: 'Sony'
4165
4297
  model_replacement: '$1'
4166
- - regex: '; *(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4298
+ - regex: '; {0,2}(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4167
4299
  device_replacement: '$1'
4168
4300
  brand_replacement: 'Sony'
4169
4301
  model_replacement: '$1'
@@ -4186,7 +4318,7 @@ device_parsers:
4186
4318
  # Spice
4187
4319
  # @ref: http://www.spicemobilephones.co.in/
4188
4320
  #########
4189
- - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4321
+ - regex: '; {0,2}((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4190
4322
  device_replacement: '$1$2$3$4'
4191
4323
  brand_replacement: 'Spice'
4192
4324
  model_replacement: 'Mi$4'
@@ -4195,7 +4327,7 @@ device_parsers:
4195
4327
  # Sprint (Operator Branded Devices)
4196
4328
  # @ref:
4197
4329
  #########
4198
- - regex: '; *(Sprint )(.+?) *(?:Build|[;/])'
4330
+ - regex: '; {0,2}(Sprint )(.{1,200}?) {0,2}(?:Build|[;/])'
4199
4331
  device_replacement: '$1$2'
4200
4332
  brand_replacement: 'Sprint'
4201
4333
  model_replacement: '$2'
@@ -4208,7 +4340,7 @@ device_parsers:
4208
4340
  # Tagi
4209
4341
  # @ref: ??
4210
4342
  #########
4211
- - regex: '; *(TAGI[ ]?)(MID) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4343
+ - regex: '; {0,2}(TAGI[ ]?)(MID) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4212
4344
  device_replacement: '$1$2$3'
4213
4345
  brand_replacement: 'Tagi'
4214
4346
  model_replacement: '$2$3'
@@ -4217,7 +4349,7 @@ device_parsers:
4217
4349
  # Tecmobile
4218
4350
  # @ref: http://www.tecmobile.com/
4219
4351
  #########
4220
- - regex: '; *(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4352
+ - regex: '; {0,2}(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4221
4353
  device_replacement: 'Tecmobile $1'
4222
4354
  brand_replacement: 'Tecmobile'
4223
4355
  model_replacement: '$1'
@@ -4226,7 +4358,7 @@ device_parsers:
4226
4358
  # Tecno
4227
4359
  # @ref: www.tecno-mobile.com/‎
4228
4360
  #########
4229
- - regex: '; *(TECNO[ _])([^;/]+?)(?: Build|\) AppleWebKit)'
4361
+ - regex: '; {0,2}(TECNO[ _])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4230
4362
  device_replacement: '$1$2'
4231
4363
  brand_replacement: 'Tecno'
4232
4364
  model_replacement: '$2'
@@ -4235,7 +4367,7 @@ device_parsers:
4235
4367
  # Telechips, Techvision evaluation boards
4236
4368
  # @ref:
4237
4369
  #########
4238
- - regex: '; *Android for (Telechips|Techvision) ([^ ]+) '
4370
+ - regex: '; {0,2}Android for (Telechips|Techvision) ([^ ]+) '
4239
4371
  regex_flag: 'i'
4240
4372
  device_replacement: '$1 $2'
4241
4373
  brand_replacement: '$1'
@@ -4246,7 +4378,7 @@ device_parsers:
4246
4378
  # @ref: http://www.telstra.com.au/home-phone/thub-2/
4247
4379
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
4248
4380
  #########
4249
- - regex: '; *(T-Hub2)(?: Build|\) AppleWebKit)'
4381
+ - regex: '; {0,2}(T-Hub2)(?: Build|\) AppleWebKit)'
4250
4382
  device_replacement: '$1'
4251
4383
  brand_replacement: 'Telstra'
4252
4384
  model_replacement: '$1'
@@ -4255,7 +4387,7 @@ device_parsers:
4255
4387
  # Terra
4256
4388
  # @ref: http://www.wortmann.de/
4257
4389
  #########
4258
- - regex: '; *(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4390
+ - regex: '; {0,2}(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4259
4391
  device_replacement: 'Terra $1$2'
4260
4392
  brand_replacement: 'Terra'
4261
4393
  model_replacement: '$1$2'
@@ -4264,7 +4396,7 @@ device_parsers:
4264
4396
  # Texet
4265
4397
  # @ref: http://www.texet.ru/tablet/
4266
4398
  #########
4267
- - regex: '; *(T[BM]-\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
4399
+ - regex: '; {0,2}(T[BM]-\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4268
4400
  device_replacement: '$1'
4269
4401
  brand_replacement: 'Texet'
4270
4402
  model_replacement: '$1'
@@ -4273,11 +4405,11 @@ device_parsers:
4273
4405
  # Thalia
4274
4406
  # @ref: http://www.thalia.de/shop/tolino-shine-ereader/show/
4275
4407
  #########
4276
- - regex: '; *(tolino [^;/]+?)(?: Build|\) AppleWebKit)'
4408
+ - regex: '; {0,2}(tolino [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4277
4409
  device_replacement: '$1'
4278
4410
  brand_replacement: 'Thalia'
4279
4411
  model_replacement: '$1'
4280
- - regex: '; *Build/.* (TOLINO_BROWSER)'
4412
+ - regex: '; {0,2}Build/.{0,200} (TOLINO_BROWSER)'
4281
4413
  device_replacement: '$1'
4282
4414
  brand_replacement: 'Thalia'
4283
4415
  model_replacement: 'Tolino Shine'
@@ -4287,11 +4419,11 @@ device_parsers:
4287
4419
  # @ref: http://en.thl.com.cn/Mobile
4288
4420
  # @ref: http://thlmobilestore.com
4289
4421
  #########
4290
- - regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+?)(?: Build|\) AppleWebKit)'
4422
+ - regex: '; {0,2}(?:CJ[ -])?(ThL|THL)[ -]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4291
4423
  device_replacement: '$1 $2'
4292
4424
  brand_replacement: 'Thl'
4293
4425
  model_replacement: '$2'
4294
- - regex: '; *(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4426
+ - regex: '; {0,2}(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4295
4427
  device_replacement: '$1'
4296
4428
  brand_replacement: 'Thl'
4297
4429
  model_replacement: '$1'
@@ -4300,28 +4432,28 @@ device_parsers:
4300
4432
  # T-Mobile (Operator Branded Devices)
4301
4433
  #########
4302
4434
  # @ref: https://en.wikipedia.org/wiki/HTC_Hero
4303
- - regex: '; *(T-Mobile[ _]G2[ _]Touch) Build'
4435
+ - regex: '; {0,2}(T-Mobile[ _]G2[ _]Touch) Build'
4304
4436
  device_replacement: '$1'
4305
4437
  brand_replacement: 'HTC'
4306
4438
  model_replacement: 'Hero'
4307
4439
  # @ref: https://en.wikipedia.org/wiki/HTC_Desire_Z
4308
- - regex: '; *(T-Mobile[ _]G2) Build'
4440
+ - regex: '; {0,2}(T-Mobile[ _]G2) Build'
4309
4441
  device_replacement: '$1'
4310
4442
  brand_replacement: 'HTC'
4311
4443
  model_replacement: 'Desire Z'
4312
- - regex: '; *(T-Mobile myTouch Q) Build'
4444
+ - regex: '; {0,2}(T-Mobile myTouch Q) Build'
4313
4445
  device_replacement: '$1'
4314
4446
  brand_replacement: 'Huawei'
4315
4447
  model_replacement: 'U8730'
4316
- - regex: '; *(T-Mobile myTouch) Build'
4448
+ - regex: '; {0,2}(T-Mobile myTouch) Build'
4317
4449
  device_replacement: '$1'
4318
4450
  brand_replacement: 'Huawei'
4319
4451
  model_replacement: 'U8680'
4320
- - regex: '; *(T-Mobile_Espresso) Build'
4452
+ - regex: '; {0,2}(T-Mobile_Espresso) Build'
4321
4453
  device_replacement: '$1'
4322
4454
  brand_replacement: 'HTC'
4323
4455
  model_replacement: 'Espresso'
4324
- - regex: '; *(T-Mobile G1) Build'
4456
+ - regex: '; {0,2}(T-Mobile G1) Build'
4325
4457
  device_replacement: '$1'
4326
4458
  brand_replacement: 'HTC'
4327
4459
  model_replacement: 'Dream'
@@ -4329,11 +4461,11 @@ device_parsers:
4329
4461
  device_replacement: '$1$2 $3 $4'
4330
4462
  brand_replacement: 'HTC'
4331
4463
  model_replacement: '$2 $3 $4'
4332
- - regex: '\b(T-Mobile)_([^_]+)_(.*) Build'
4464
+ - regex: '\b(T-Mobile)_([^_]+)_(.{0,200}) Build'
4333
4465
  device_replacement: '$1 $2 $3'
4334
4466
  brand_replacement: 'Tmobile'
4335
4467
  model_replacement: '$2 $3'
4336
- - regex: '\b(T-Mobile)[_ ]?(.*?)Build'
4468
+ - regex: '\b(T-Mobile)[_ ]?(.{0,200}?)Build'
4337
4469
  device_replacement: '$1 $2'
4338
4470
  brand_replacement: 'Tmobile'
4339
4471
  model_replacement: '$2'
@@ -4351,7 +4483,7 @@ device_parsers:
4351
4483
  # Tooky
4352
4484
  # @ref: http://www.tookymobile.com/
4353
4485
  #########
4354
- - regex: ' *(TOOKY)[ _\-]([^;/]+?) ?(?:Build|;)'
4486
+ - regex: ' ?(TOOKY)[ _\-]([^;/]{1,100}) ?(?:Build|;)'
4355
4487
  regex_flag: 'i'
4356
4488
  device_replacement: '$1 $2'
4357
4489
  brand_replacement: 'Tooky'
@@ -4366,11 +4498,11 @@ device_parsers:
4366
4498
  device_replacement: '$1'
4367
4499
  brand_replacement: 'Toshiba'
4368
4500
  model_replacement: 'Folio 100'
4369
- - regex: '; *([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4501
+ - regex: '; {0,2}([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4370
4502
  device_replacement: '$1'
4371
4503
  brand_replacement: 'Toshiba'
4372
4504
  model_replacement: 'Folio 100'
4373
- - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
4505
+ - regex: '; {0,2}(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]{1,100}|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
4374
4506
  device_replacement: 'Toshiba $1'
4375
4507
  brand_replacement: 'Toshiba'
4376
4508
  model_replacement: '$1'
@@ -4379,12 +4511,12 @@ device_parsers:
4379
4511
  # Touchmate
4380
4512
  # @ref: http://touchmatepc.com/new/
4381
4513
  #########
4382
- - regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4514
+ - regex: '; {0,2}(TM-MID\d+[^;/]{1,50}|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4383
4515
  device_replacement: '$1'
4384
4516
  brand_replacement: 'Touchmate'
4385
4517
  model_replacement: '$1'
4386
4518
  # @todo: needs verification user-agents missing
4387
- - regex: '; *(TM-SM\d+[^;/]+?)(?: Build|\) AppleWebKit)'
4519
+ - regex: '; {0,2}(TM-SM\d+[^;/]{1,50}?)(?: Build|\) AppleWebKit)'
4388
4520
  device_replacement: '$1'
4389
4521
  brand_replacement: 'Touchmate'
4390
4522
  model_replacement: '$1'
@@ -4393,11 +4525,11 @@ device_parsers:
4393
4525
  # Treq
4394
4526
  # @ref: http://www.treq.co.id/product
4395
4527
  #########
4396
- - regex: '; *(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4528
+ - regex: '; {0,2}(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4397
4529
  device_replacement: '$1'
4398
4530
  brand_replacement: 'Treq'
4399
4531
  model_replacement: '$1'
4400
- - regex: '; *(TREQ[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
4532
+ - regex: '; {0,2}(TREQ[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4401
4533
  regex_flag: 'i'
4402
4534
  device_replacement: '$1$2'
4403
4535
  brand_replacement: 'Treq'
@@ -4409,21 +4541,40 @@ device_parsers:
4409
4541
  # @models: A936|A603|X-5|X-3
4410
4542
  #########
4411
4543
  # @todo: guessed markers
4412
- - regex: '; *(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4544
+ - regex: '; {0,2}(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4413
4545
  device_replacement: '$1'
4414
4546
  brand_replacement: 'Umeox'
4415
4547
  model_replacement: '$1'
4416
4548
  # @todo: guessed markers
4417
- - regex: '; *(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4549
+ - regex: '; {0,2}(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4418
4550
  device_replacement: '$1'
4419
4551
  brand_replacement: 'Umeox'
4420
4552
  model_replacement: '$1'
4421
4553
 
4554
+ #########
4555
+ # Vernee
4556
+ # @ref: http://vernee.cc/
4557
+ # @models: Thor - Thor E
4558
+ #########
4559
+ - regex: '; thor Build/'
4560
+ device_replacement: 'Thor'
4561
+ brand_replacement: 'Vernee'
4562
+ model_replacement: 'Thor'
4563
+ # Regex to modidy for Thor Plus (don't find example UA)
4564
+ - regex: '; Thor (E)? Build/'
4565
+ device_replacement: 'Thor $1'
4566
+ brand_replacement: 'Vernee'
4567
+ model_replacement: 'Thor'
4568
+ - regex: '; Apollo Lite Build/'
4569
+ device_replacement: 'Apollo Lite'
4570
+ brand_replacement: 'Vernee'
4571
+ model_replacement: 'Apollo'
4572
+
4422
4573
  #########
4423
4574
  # Versus
4424
4575
  # @ref: http://versusuk.com/support.html
4425
4576
  #########
4426
- - regex: '(TOUCH(?:TAB|PAD).+?)(?: Build|\) AppleWebKit)'
4577
+ - regex: '(TOUCH(?:TAB|PAD).{1,200}?)(?: Build|\) AppleWebKit)'
4427
4578
  regex_flag: 'i'
4428
4579
  device_replacement: 'Versus $1'
4429
4580
  brand_replacement: 'Versus'
@@ -4433,7 +4584,7 @@ device_parsers:
4433
4584
  # Vertu
4434
4585
  # @ref: http://www.vertu.com/
4435
4586
  #########
4436
- - regex: '(VERTU) ([^;/]+?)(?: Build|\) AppleWebKit)'
4587
+ - regex: '(VERTU) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4437
4588
  device_replacement: '$1 $2'
4438
4589
  brand_replacement: 'Vertu'
4439
4590
  model_replacement: '$2'
@@ -4442,7 +4593,7 @@ device_parsers:
4442
4593
  # Videocon
4443
4594
  # @ref: http://www.videoconmobiles.com
4444
4595
  #########
4445
- - regex: '; *(Videocon)[ _\-]([^;/]+?) *(?:Build|;)'
4596
+ - regex: '; {0,2}(Videocon)[ _\-]([^;/]{1,100}?) {0,2}(?:Build|;)'
4446
4597
  device_replacement: '$1 $2'
4447
4598
  brand_replacement: 'Videocon'
4448
4599
  model_replacement: '$2'
@@ -4455,15 +4606,15 @@ device_parsers:
4455
4606
  # Viewsonic
4456
4607
  # @ref: http://viewsonic.com
4457
4608
  #########
4458
- - regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+?)(?: Build|\) AppleWebKit)'
4609
+ - regex: '; {0,2}((?:ViewPad|ViewPhone|VSD)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4459
4610
  device_replacement: '$1'
4460
4611
  brand_replacement: 'Viewsonic'
4461
4612
  model_replacement: '$1'
4462
- - regex: '; *(ViewSonic-)([^;/]+?)(?: Build|\) AppleWebKit)'
4613
+ - regex: '; {0,2}(ViewSonic-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4463
4614
  device_replacement: '$1$2'
4464
4615
  brand_replacement: 'Viewsonic'
4465
4616
  model_replacement: '$2'
4466
- - regex: '; *(GTablet.*?)(?: Build|\) AppleWebKit)'
4617
+ - regex: '; {0,2}(GTablet.{0,200}?)(?: Build|\) AppleWebKit)'
4467
4618
  device_replacement: '$1'
4468
4619
  brand_replacement: 'Viewsonic'
4469
4620
  model_replacement: '$1'
@@ -4472,7 +4623,7 @@ device_parsers:
4472
4623
  # vivo
4473
4624
  # @ref: http://vivo.cn/
4474
4625
  #########
4475
- - regex: '; *([Vv]ivo)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4626
+ - regex: '; {0,2}([Vv]ivo)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4476
4627
  device_replacement: '$1 $2'
4477
4628
  brand_replacement: 'vivo'
4478
4629
  model_replacement: '$2'
@@ -4481,7 +4632,7 @@ device_parsers:
4481
4632
  # Vodafone (Operator Branded Devices)
4482
4633
  # @ref: ??
4483
4634
  #########
4484
- - regex: '(Vodafone) (.*?)(?: Build|\) AppleWebKit)'
4635
+ - regex: '(Vodafone) (.{0,200}?)(?: Build|\) AppleWebKit)'
4485
4636
  device_replacement: '$1 $2'
4486
4637
  brand_replacement: '$1'
4487
4638
  model_replacement: '$2'
@@ -4490,7 +4641,7 @@ device_parsers:
4490
4641
  # Walton
4491
4642
  # @ref: http://www.waltonbd.com/
4492
4643
  #########
4493
- - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
4644
+ - regex: '; {0,2}(?:Walton[ _\-]|)(Primo[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4494
4645
  regex_flag: 'i'
4495
4646
  device_replacement: 'Walton $1'
4496
4647
  brand_replacement: 'Walton'
@@ -4500,7 +4651,7 @@ device_parsers:
4500
4651
  # Wiko
4501
4652
  # @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
4502
4653
  #########
4503
- - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+?)(?: Build|\) AppleWebKit)'
4654
+ - regex: '; {0,2}(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4504
4655
  regex_flag: 'i'
4505
4656
  device_replacement: 'Wiko $1'
4506
4657
  brand_replacement: 'Wiko'
@@ -4510,7 +4661,7 @@ device_parsers:
4510
4661
  # WellcoM
4511
4662
  # @ref: ??
4512
4663
  #########
4513
- - regex: '; *WellcoM-([^;/]+?)(?: Build|\) AppleWebKit)'
4664
+ - regex: '; {0,2}WellcoM-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4514
4665
  device_replacement: 'Wellcom $1'
4515
4666
  brand_replacement: 'Wellcom'
4516
4667
  model_replacement: '$1'
@@ -4528,7 +4679,7 @@ device_parsers:
4528
4679
  # Wolfgang
4529
4680
  # @ref: http://wolfgangmobile.com/
4530
4681
  #########
4531
- - regex: '; *(AT-AS[^;/]+?)(?: Build|\) AppleWebKit)'
4682
+ - regex: '; {0,2}(AT-AS[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4532
4683
  device_replacement: 'Wolfgang $1'
4533
4684
  brand_replacement: 'Wolfgang'
4534
4685
  model_replacement: '$1'
@@ -4537,7 +4688,7 @@ device_parsers:
4537
4688
  # Woxter
4538
4689
  # @ref: http://www.woxter.es/es-es/categories/index
4539
4690
  #########
4540
- - regex: '; *(?:Woxter|Wxt) ([^;/]+?)(?: Build|\) AppleWebKit)'
4691
+ - regex: '; {0,2}(?:Woxter|Wxt) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4541
4692
  device_replacement: 'Woxter $1'
4542
4693
  brand_replacement: 'Woxter'
4543
4694
  model_replacement: '$1'
@@ -4546,7 +4697,7 @@ device_parsers:
4546
4697
  # Yarvik Zania
4547
4698
  # @ref: http://yarvik.com
4548
4699
  #########
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)'
4700
+ - regex: '; {0,2}(?: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)'
4550
4701
  device_replacement: 'Yarvik $1'
4551
4702
  brand_replacement: 'Yarvik'
4552
4703
  model_replacement: '$1'
@@ -4560,7 +4711,7 @@ device_parsers:
4560
4711
  # M778, M7000, M7000AD, M7000NBD, M7001, M7002, M7002KBD, M777, M767,
4561
4712
  # M789, M799, M769, M757, M755, M753, M752, M739, M729, M723, M712, M727
4562
4713
  #########
4563
- - regex: '; *([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4714
+ - regex: '; {0,2}([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4564
4715
  device_replacement: 'Yifang $1$2$3'
4565
4716
  brand_replacement: 'Yifang'
4566
4717
  model_replacement: '$2'
@@ -4569,19 +4720,19 @@ device_parsers:
4569
4720
  # XiaoMi
4570
4721
  # @ref: http://www.xiaomi.com/event/buyphone
4571
4722
  #########
4572
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4723
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4573
4724
  device_replacement: 'XiaoMi $1'
4574
4725
  brand_replacement: 'XiaoMi'
4575
4726
  model_replacement: '$1'
4576
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4727
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4577
4728
  device_replacement: 'XiaoMi $1'
4578
4729
  brand_replacement: 'XiaoMi'
4579
4730
  model_replacement: '$1'
4580
- - regex: '; *(MIX) (Build|MIUI)/'
4731
+ - regex: '; {0,2}(MIX) (Build|MIUI)/'
4581
4732
  device_replacement: 'XiaoMi $1'
4582
4733
  brand_replacement: 'XiaoMi'
4583
4734
  model_replacement: '$1'
4584
- - regex: '; *((MIX) ([^;/]*)) (Build|MIUI)/'
4735
+ - regex: '; {0,2}((MIX) ([^;/]*)) (Build|MIUI)/'
4585
4736
  device_replacement: 'XiaoMi $1'
4586
4737
  brand_replacement: 'XiaoMi'
4587
4738
  model_replacement: '$1'
@@ -4590,17 +4741,17 @@ device_parsers:
4590
4741
  # Xolo
4591
4742
  # @ref: http://www.xolo.in/
4592
4743
  #########
4593
- - regex: '; *XOLO[ _]([^;/]*tab.*)(?: Build|\) AppleWebKit)'
4744
+ - regex: '; {0,2}XOLO[ _]([^;/]{0,30}tab.{0,30})(?: Build|\) AppleWebKit)'
4594
4745
  regex_flag: 'i'
4595
4746
  device_replacement: 'Xolo $1'
4596
4747
  brand_replacement: 'Xolo'
4597
4748
  model_replacement: '$1'
4598
- - regex: '; *XOLO[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4749
+ - regex: '; {0,2}XOLO[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4599
4750
  regex_flag: 'i'
4600
4751
  device_replacement: 'Xolo $1'
4601
4752
  brand_replacement: 'Xolo'
4602
4753
  model_replacement: '$1'
4603
- - regex: '; *(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4754
+ - regex: '; {0,2}(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4604
4755
  regex_flag: 'i'
4605
4756
  device_replacement: 'Xolo $1'
4606
4757
  brand_replacement: 'Xolo'
@@ -4610,7 +4761,7 @@ device_parsers:
4610
4761
  # Xoro
4611
4762
  # @ref: http://www.xoro.de/produkte/
4612
4763
  #########
4613
- - regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4764
+ - regex: '; {0,2}(PAD ?[79]\d+[^;/]{0,50}|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4614
4765
  device_replacement: 'Xoro $1'
4615
4766
  brand_replacement: 'Xoro'
4616
4767
  model_replacement: '$1'
@@ -4619,7 +4770,7 @@ device_parsers:
4619
4770
  # Zopo
4620
4771
  # @ref: http://www.zopomobiles.com/products.html
4621
4772
  #########
4622
- - regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+?)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4773
+ - regex: '; {0,2}(?:(?:ZOPO|Zopo)[ _]([^;/]{1,100}?)|(ZP ?(?:\d{2}[^;/]{1,100}|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4623
4774
  device_replacement: '$1$2$3'
4624
4775
  brand_replacement: 'Zopo'
4625
4776
  model_replacement: '$1$2$3'
@@ -4628,11 +4779,11 @@ device_parsers:
4628
4779
  # ZiiLabs
4629
4780
  # @ref: http://www.ziilabs.com/products/platforms/androidreferencetablets.php
4630
4781
  #########
4631
- - regex: '; *(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4782
+ - regex: '; {0,2}(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4632
4783
  device_replacement: '$1 $2'
4633
4784
  brand_replacement: 'ZiiLabs'
4634
4785
  model_replacement: '$2'
4635
- - regex: '; *(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4786
+ - regex: '; {0,2}(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4636
4787
  device_replacement: '$1 $2'
4637
4788
  brand_replacement: 'ZiiLabs'
4638
4789
  model_replacement: '$2'
@@ -4641,36 +4792,36 @@ device_parsers:
4641
4792
  # ZTE
4642
4793
  # @ref: http://www.ztedevices.com/
4643
4794
  #########
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)'
4795
+ - regex: '; {0,2}(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]{0,200}?|Era|Memo[^;]{0,200}?)|JOE|(?:Kis|KIS)\b[^;]{0,200}?|Libra|Light [^;]{0,200}?|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]{0,200}?|RacerII|RACERII|San Francisco[^;]{0,200}?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\) AppleWebKit)'
4645
4796
  device_replacement: '$1'
4646
4797
  brand_replacement: 'ZTE'
4647
4798
  model_replacement: '$1'
4648
- - regex: '; *([A-Z]\d+)_USA_[^;]*(?: Build|\) AppleWebKit)'
4799
+ - regex: '; {0,2}([A-Z]\d+)_USA_[^;]{0,200}(?: Build|\) AppleWebKit)'
4649
4800
  device_replacement: '$1'
4650
4801
  brand_replacement: 'ZTE'
4651
4802
  model_replacement: '$1'
4652
- - regex: '; *(SmartTab\d+)[^;]*(?: Build|\) AppleWebKit)'
4803
+ - regex: '; {0,2}(SmartTab\d+)[^;]{0,50}(?: Build|\) AppleWebKit)'
4653
4804
  device_replacement: '$1'
4654
4805
  brand_replacement: 'ZTE'
4655
4806
  model_replacement: '$1'
4656
- - regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4807
+ - regex: '; {0,2}(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4657
4808
  device_replacement: 'ZTE Blade$1'
4658
4809
  brand_replacement: 'ZTE'
4659
4810
  model_replacement: 'Blade$1'
4660
- - regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4811
+ - regex: '; {0,2}(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4661
4812
  device_replacement: 'ZTE Skate$1'
4662
4813
  brand_replacement: 'ZTE'
4663
4814
  model_replacement: 'Skate$1'
4664
- - regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4815
+ - regex: '; {0,2}(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4665
4816
  device_replacement: '$1$2'
4666
4817
  brand_replacement: 'ZTE'
4667
4818
  model_replacement: '$1$2'
4668
- - regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+?)(?: Build|\) AppleWebKit)'
4819
+ - regex: '; {0,2}(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4669
4820
  device_replacement: 'ZTE $1'
4670
4821
  brand_replacement: 'ZTE'
4671
4822
  model_replacement: '$1'
4672
4823
  # operator specific
4673
- - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*?)(?: Build|\) AppleWebKit)'
4824
+ - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]{0,200}?)(?: Build|\) AppleWebKit)'
4674
4825
  device_replacement: '$1 $2'
4675
4826
  brand_replacement: 'ZTE'
4676
4827
  model_replacement: '$1 $2'
@@ -4679,7 +4830,7 @@ device_parsers:
4679
4830
  device_replacement: '$1'
4680
4831
  brand_replacement: 'ZTE'
4681
4832
  model_replacement: '$1'
4682
- - regex: '; *(vp9plus)\)'
4833
+ - regex: '; {0,2}(vp9plus)\)'
4683
4834
  device_replacement: '$1'
4684
4835
  brand_replacement: 'ZTE'
4685
4836
  model_replacement: '$1'
@@ -4739,7 +4890,7 @@ device_parsers:
4739
4890
  device_replacement: 'Kindle Fire HDX 8.9" 4G'
4740
4891
  brand_replacement: 'Amazon'
4741
4892
  model_replacement: 'Kindle Fire HDX 8.9" 4G'
4742
- - regex: '; ?Amazon ([^;/]+) Build\b'
4893
+ - regex: '; ?Amazon ([^;/]{1,100}) Build\b'
4743
4894
  device_replacement: '$1'
4744
4895
  brand_replacement: 'Amazon'
4745
4896
  model_replacement: '$1'
@@ -4762,22 +4913,22 @@ device_parsers:
4762
4913
 
4763
4914
  #########
4764
4915
  # Devices from chinese manufacturer(s)
4765
- # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.*
4916
+ # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.{0,200}
4766
4917
  #########
4767
- - regex: '(sprd)\-([^/]+)/'
4918
+ - regex: '(sprd)\-([^/]{1,50})/'
4768
4919
  device_replacement: '$1 $2'
4769
4920
  brand_replacement: '$1'
4770
4921
  model_replacement: '$2'
4771
4922
  # @ref: http://eshinechina.en.alibaba.com/
4772
- - regex: '; *(H\d{2}00\+?) Build'
4923
+ - regex: '; {0,2}(H\d{2}00\+?) Build'
4773
4924
  device_replacement: '$1'
4774
4925
  brand_replacement: 'Hero'
4775
4926
  model_replacement: '$1'
4776
- - regex: '; *(iphone|iPhone5) Build/'
4927
+ - regex: '; {0,2}(iphone|iPhone5) Build/'
4777
4928
  device_replacement: 'Xianghe $1'
4778
4929
  brand_replacement: 'Xianghe'
4779
4930
  model_replacement: '$1'
4780
- - regex: '; *(e\d{4}[a-z]?_?v\d+|v89_[^;/]+)[^;/]+ Build/'
4931
+ - regex: '; {0,2}(e\d{4}[a-z]?_?v\d+|v89_[^;/]{1,100})[^;/]{1,30} Build/'
4781
4932
  device_replacement: 'Xianghe $1'
4782
4933
  brand_replacement: 'Xianghe'
4783
4934
  model_replacement: '$1'
@@ -4799,7 +4950,7 @@ device_parsers:
4799
4950
  #########
4800
4951
  # Alcatel Windows Phones
4801
4952
  #########
4802
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\)]+)'
4953
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]{0,200}; {0,2}([^;,\)]+)'
4803
4954
  device_replacement: 'Alcatel $1'
4804
4955
  brand_replacement: 'Alcatel'
4805
4956
  model_replacement: '$1'
@@ -4807,8 +4958,7 @@ device_parsers:
4807
4958
  #########
4808
4959
  # Asus Windows Phones
4809
4960
  #########
4810
- #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
4811
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
4961
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]{0,200}; {0,2}([^;,\)]+)'
4812
4962
  device_replacement: 'Asus $1'
4813
4963
  brand_replacement: 'Asus'
4814
4964
  model_replacement: '$1'
@@ -4816,7 +4966,7 @@ device_parsers:
4816
4966
  #########
4817
4967
  # Dell Windows Phones
4818
4968
  #########
4819
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\)]+)'
4969
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]{0,200}; {0,2}([^;,\)]+)'
4820
4970
  device_replacement: 'Dell $1'
4821
4971
  brand_replacement: 'Dell'
4822
4972
  model_replacement: '$1'
@@ -4824,7 +4974,7 @@ device_parsers:
4824
4974
  #########
4825
4975
  # HTC Windows Phones
4826
4976
  #########
4827
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\)]+)'
4977
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]{0,200})[^;]{0,200}; {0,2}(?:HTC|)([^;,\)]+)'
4828
4978
  device_replacement: 'HTC $1'
4829
4979
  brand_replacement: 'HTC'
4830
4980
  model_replacement: '$1'
@@ -4832,7 +4982,7 @@ device_parsers:
4832
4982
  #########
4833
4983
  # Huawei Windows Phones
4834
4984
  #########
4835
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\)]+)'
4985
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]{0,200}; {0,2}(?:HUAWEI |)([^;,\)]+)'
4836
4986
  device_replacement: 'Huawei $1'
4837
4987
  brand_replacement: 'Huawei'
4838
4988
  model_replacement: '$1'
@@ -4840,7 +4990,7 @@ device_parsers:
4840
4990
  #########
4841
4991
  # LG Windows Phones
4842
4992
  #########
4843
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \-]|)([^;,\)]+)'
4993
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]{0,200}; {0,2}(?:LG[ \-]|)([^;,\)]+)'
4844
4994
  device_replacement: 'LG $1'
4845
4995
  brand_replacement: 'LG'
4846
4996
  model_replacement: '$1'
@@ -4848,15 +4998,15 @@ device_parsers:
4848
4998
  #########
4849
4999
  # Noka Windows Phones
4850
5000
  #########
4851
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
5001
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
4852
5002
  device_replacement: 'Lumia $1'
4853
5003
  brand_replacement: 'Nokia'
4854
5004
  model_replacement: 'Lumia $1'
4855
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
5005
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(RM-\d{3,})'
4856
5006
  device_replacement: 'Nokia $1'
4857
5007
  brand_replacement: 'Nokia'
4858
5008
  model_replacement: '$1'
4859
- - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
5009
+ - regex: '(?:Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
4860
5010
  device_replacement: 'Nokia $1'
4861
5011
  brand_replacement: 'Nokia'
4862
5012
  model_replacement: '$1'
@@ -4864,7 +5014,7 @@ device_parsers:
4864
5014
  #########
4865
5015
  # Microsoft Windows Phones
4866
5016
  #########
4867
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\)]+)'
5017
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]{0,200}; {0,2}([^;,\)]+)'
4868
5018
  device_replacement: 'Microsoft $1'
4869
5019
  brand_replacement: 'Microsoft'
4870
5020
  model_replacement: '$1'
@@ -4872,7 +5022,7 @@ device_parsers:
4872
5022
  #########
4873
5023
  # Samsung Windows Phones
4874
5024
  #########
4875
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\.\)]+)'
5025
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]{0,200}; {0,2}(?:SAMSUNG |)([^;,\.\)]+)'
4876
5026
  device_replacement: 'Samsung $1'
4877
5027
  brand_replacement: 'Samsung'
4878
5028
  model_replacement: '$1'
@@ -4880,7 +5030,7 @@ device_parsers:
4880
5030
  #########
4881
5031
  # Toshiba Windows Phones
4882
5032
  #########
4883
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)'
5033
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]{0,200}; {0,2}([^;,\)]+)'
4884
5034
  device_replacement: 'Toshiba $1'
4885
5035
  brand_replacement: 'Toshiba'
4886
5036
  model_replacement: '$1'
@@ -4888,7 +5038,7 @@ device_parsers:
4888
5038
  #########
4889
5039
  # Generic Windows Phones
4890
5040
  #########
4891
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\)]+)'
5041
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]{1,200}); {0,2}([^;,\)]+)'
4892
5042
  device_replacement: '$1 $2'
4893
5043
  brand_replacement: '$1'
4894
5044
  model_replacement: '$2'
@@ -4900,7 +5050,7 @@ device_parsers:
4900
5050
  #########
4901
5051
  # Samsung Bada Phones
4902
5052
  #########
4903
- - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]+).* Bada/'
5053
+ - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]{1,50}).{0,200} Bada/'
4904
5054
  device_replacement: 'Samsung $1'
4905
5055
  brand_replacement: 'Samsung'
4906
5056
  model_replacement: '$1'
@@ -4908,11 +5058,11 @@ device_parsers:
4908
5058
  #########
4909
5059
  # Firefox OS
4910
5060
  #########
4911
- - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+?)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5061
+ - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]{1,100}?)(?:/[^;]{1,200}|); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4912
5062
  device_replacement: 'Alcatel $1 $2 $3'
4913
5063
  brand_replacement: 'Alcatel'
4914
5064
  model_replacement: 'One Touch $3'
4915
- - regex: '\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5065
+ - regex: '\(Mobile; (?:ZTE([^;]{1,200})|(OpenC)); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4916
5066
  device_replacement: 'ZTE $1$2'
4917
5067
  brand_replacement: 'ZTE'
4918
5068
  model_replacement: '$1$2'
@@ -4920,15 +5070,15 @@ device_parsers:
4920
5070
  #########
4921
5071
  # KaiOS
4922
5072
  #########
4923
- - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KaiOS/'
5073
+ - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/[^\/]{1,200} KaiOS/'
4924
5074
  device_replacement: 'Alcatel $1'
4925
5075
  brand_replacement: 'Alcatel'
4926
5076
  model_replacement: '$1'
4927
- - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]+)\/.+;.+rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
5077
+ - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]{1,100})\/.{0,100};.{0,100}rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
4928
5078
  device_replacement: 'LYF $1'
4929
5079
  brand_replacement: 'LYF'
4930
5080
  model_replacement: '$1'
4931
- - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]+)_.+; rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
5081
+ - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]{1,100})_.{1,100}; rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
4932
5082
  device_replacement: 'Nokia $1'
4933
5083
  brand_replacement: 'Nokia'
4934
5084
  model_replacement: '$1'
@@ -4941,7 +5091,7 @@ device_parsers:
4941
5091
  device_replacement: 'Nokia $1'
4942
5092
  brand_replacement: 'Nokia'
4943
5093
  model_replacement: '$1$2'
4944
- - regex: '(?:NOKIA|Nokia)(?:\-| *)(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
5094
+ - regex: '(?:NOKIA|Nokia)(?:\-| {0,2})(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
4945
5095
  device_replacement: 'Nokia $1$2$3'
4946
5096
  brand_replacement: 'Nokia'
4947
5097
  model_replacement: '$1$2$3'
@@ -4950,12 +5100,12 @@ device_parsers:
4950
5100
  brand_replacement: 'Nokia'
4951
5101
  model_replacement: 'Lumia $1'
4952
5102
  # UCWEB Browser on Symbian
4953
- - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+?)\)'
5103
+ - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]{1,100}?)\)'
4954
5104
  device_replacement: '$1 $2'
4955
5105
  brand_replacement: '$1'
4956
5106
  model_replacement: '$2'
4957
5107
  # Nokia Symbian
4958
- - regex: '\(Symbian(?:/3|); U; ([^;]+);'
5108
+ - regex: '\(Symbian(?:/3|); U; ([^;]{1,200});'
4959
5109
  device_replacement: 'Nokia $1'
4960
5110
  brand_replacement: 'Nokia'
4961
5111
  model_replacement: '$1'
@@ -4968,7 +5118,7 @@ device_parsers:
4968
5118
  device_replacement: 'BlackBerry $1'
4969
5119
  brand_replacement: 'BlackBerry'
4970
5120
  model_replacement: '$1'
4971
- - regex: 'Play[Bb]ook.+RIM Tablet OS'
5121
+ - regex: 'Play[Bb]ook.{1,200}RIM Tablet OS'
4972
5122
  device_replacement: 'BlackBerry Playbook'
4973
5123
  brand_replacement: 'BlackBerry'
4974
5124
  model_replacement: 'Playbook'
@@ -5000,7 +5150,7 @@ device_parsers:
5000
5150
  device_replacement: 'Palm Treo $1'
5001
5151
  brand_replacement: 'Palm'
5002
5152
  model_replacement: 'Treo $1'
5003
- - regex: 'webOS.*(P160U(?:NA|))/(\d+).(\d+)'
5153
+ - regex: 'webOS.{0,200}(P160U(?:NA|))/(\d+).(\d+)'
5004
5154
  device_replacement: 'HP Veer'
5005
5155
  brand_replacement: 'HP'
5006
5156
  model_replacement: 'Veer'
@@ -5008,7 +5158,7 @@ device_parsers:
5008
5158
  device_replacement: 'HP TouchPad'
5009
5159
  brand_replacement: 'HP'
5010
5160
  model_replacement: 'TouchPad'
5011
- - regex: 'HPiPAQ([A-Za-z0-9]+)/\d+.\d+'
5161
+ - regex: 'HPiPAQ([A-Za-z0-9]{1,20})/\d+\.\d+'
5012
5162
  device_replacement: 'HP iPAQ $1'
5013
5163
  brand_replacement: 'HP'
5014
5164
  model_replacement: 'iPAQ $1'
@@ -5076,18 +5226,18 @@ device_parsers:
5076
5226
  brand_replacement: 'Apple'
5077
5227
  model_replacement: 'iPhone'
5078
5228
  # @note: desktop applications show device info
5079
- - regex: 'CFNetwork/.* Darwin/\d.*\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
5229
+ - regex: 'CFNetwork/.{0,100} Darwin/\d.{0,100}\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
5080
5230
  device_replacement: '$1$2,$3'
5081
5231
  brand_replacement: 'Apple'
5082
5232
  model_replacement: '$1$2,$3'
5083
5233
  # @note: newer desktop applications don't show device info
5084
5234
  # This is here so as to not have them recorded as iOS-Device
5085
- - regex: 'CFNetwork/.* Darwin/\d+\.\d+\.\d+ \(x86_64\)'
5235
+ - regex: 'CFNetwork/.{0,100} Darwin/\d+\.\d+\.\d+ \(x86_64\)'
5086
5236
  device_replacement: 'Mac'
5087
5237
  brand_replacement: 'Apple'
5088
5238
  model_replacement: 'Mac'
5089
5239
  # @note: iOS applications do not show device info
5090
- - regex: 'CFNetwork/.* Darwin/\d'
5240
+ - regex: 'CFNetwork/.{0,100} Darwin/\d'
5091
5241
  device_replacement: 'iOS-Device'
5092
5242
  brand_replacement: 'Apple'
5093
5243
  model_replacement: 'iOS-Device'
@@ -5131,7 +5281,7 @@ device_parsers:
5131
5281
  device_replacement: 'Asus $1'
5132
5282
  brand_replacement: 'Asus'
5133
5283
  model_replacement: '$1'
5134
- - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
5284
+ - regex: '(?:asus.{0,200}?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
5135
5285
  device_replacement: 'Asus $1'
5136
5286
  brand_replacement: 'Asus'
5137
5287
  model_replacement: '$1'
@@ -5164,11 +5314,11 @@ device_parsers:
5164
5314
  device_replacement: 'DoCoMo $1'
5165
5315
  brand_replacement: 'DoCoMo'
5166
5316
  model_replacement: '$1'
5167
- - regex: '([A-Za-z0-9]+)_W;FOMA'
5317
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30})_W;FOMA'
5168
5318
  device_replacement: 'DoCoMo $1'
5169
5319
  brand_replacement: 'DoCoMo'
5170
5320
  model_replacement: '$1'
5171
- - regex: '([A-Za-z0-9]+);FOMA'
5321
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30});FOMA'
5172
5322
  device_replacement: 'DoCoMo $1'
5173
5323
  brand_replacement: 'DoCoMo'
5174
5324
  model_replacement: '$1'
@@ -5176,7 +5326,7 @@ device_parsers:
5176
5326
  ##########
5177
5327
  # htc
5178
5328
  ##########
5179
- - regex: '\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5329
+ - regex: '\b(?:HTC/|HTC/[a-z0-9]{1,20}/|)HTC[ _\-;]? {0,2}(.{0,200}?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5180
5330
  device_replacement: 'HTC $1'
5181
5331
  brand_replacement: 'HTC'
5182
5332
  model_replacement: '$1'
@@ -5237,18 +5387,18 @@ device_parsers:
5237
5387
  device_replacement: '$1'
5238
5388
  brand_replacement: '$2'
5239
5389
  model_replacement: '$3'
5240
- - regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/|)(THOM[^;]*?)[;\s].{0,30}(LF[^;]+);?'
5390
+ - regex: '(HbbTV)/1\.1\.1.{0,200}CE-HTML/1\.\d;(Vendor/|)(THOM[^;]{0,200}?)[;\s].{0,30}(LF[^;]{1,200});?'
5241
5391
  device_replacement: '$1'
5242
5392
  brand_replacement: 'Thomson'
5243
5393
  model_replacement: '$4'
5244
- - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); *CE-HTML(?:/1\.\d|); *([^ ]+) ([^;]+);'
5394
+ - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); {0,2}CE-HTML(?:/1\.\d|); {0,2}([^ ]{1,30}) ([^;]{1,200});'
5245
5395
  device_replacement: '$1'
5246
5396
  brand_replacement: '$2'
5247
5397
  model_replacement: '$3'
5248
5398
  - regex: '(HbbTV)/1\.1\.1 \(;;;;;\) Maple_2011'
5249
5399
  device_replacement: '$1'
5250
5400
  brand_replacement: 'Samsung'
5251
- - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]{0,30}; ?(?:CUS:([^;]*)|([^;]+)) ?; ?([^;]{0,30})'
5401
+ - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]{0,30}; ?(?:CUS:([^;]{0,200})|([^;]{1,200})) ?; ?([^;]{0,30})'
5252
5402
  device_replacement: '$1'
5253
5403
  brand_replacement: '$2$3'
5254
5404
  model_replacement: '$4'
@@ -5258,7 +5408,7 @@ device_parsers:
5258
5408
  ##########
5259
5409
  # LGE NetCast TV
5260
5410
  ##########
5261
- - regex: 'LGE; (?:Media\/|)([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5411
+ - regex: 'LGE; (?:Media\/|)([^;]{0,200});[^;]{0,200};[^;]{0,200};?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5262
5412
  device_replacement: 'NetCast$2'
5263
5413
  brand_replacement: 'LG'
5264
5414
  model_replacement: '$1'
@@ -5266,11 +5416,11 @@ device_parsers:
5266
5416
  ##########
5267
5417
  # InettvBrowser
5268
5418
  ##########
5269
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;(Sony)([^;]*);[^;]*;[^\)]*\)'
5419
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};(Sony)([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5270
5420
  device_replacement: 'Inettv'
5271
5421
  brand_replacement: '$1'
5272
5422
  model_replacement: '$2'
5273
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;([^;]*);[^;]*;[^\)]*\)'
5423
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5274
5424
  device_replacement: 'Inettv'
5275
5425
  brand_replacement: 'Generic_Inettv'
5276
5426
  model_replacement: '$1'
@@ -5307,7 +5457,7 @@ device_parsers:
5307
5457
  device_replacement: 'Microsoft $1'
5308
5458
  brand_replacement: 'Microsoft'
5309
5459
  model_replacement: '$1'
5310
- - regex: '(?:MSIE|XBMC).*\b(Xbox)\b'
5460
+ - regex: '(?:MSIE|XBMC).{0,200}\b(Xbox)\b'
5311
5461
  device_replacement: '$1'
5312
5462
  brand_replacement: 'Microsoft'
5313
5463
  model_replacement: '$1'
@@ -5368,12 +5518,12 @@ device_parsers:
5368
5518
  # Samsung
5369
5519
  ##########
5370
5520
  # Samsung Smart-TV
5371
- - regex: '(SMART-TV); .* Tizen '
5521
+ - regex: '(SMART-TV); .{0,200} Tizen '
5372
5522
  device_replacement: 'Samsung $1'
5373
5523
  brand_replacement: 'Samsung'
5374
5524
  model_replacement: '$1'
5375
5525
  # Samsung Symbian Devices
5376
- - regex: 'SymbianOS/9\.\d.* Samsung[/\-]([A-Za-z0-9 \-]+)'
5526
+ - regex: 'SymbianOS/9\.\d.{0,200} Samsung[/\-]([A-Za-z0-9 \-]+)'
5377
5527
  device_replacement: 'Samsung $1'
5378
5528
  brand_replacement: 'Samsung'
5379
5529
  model_replacement: '$1'
@@ -5381,7 +5531,7 @@ device_parsers:
5381
5531
  device_replacement: '$1 $2$3'
5382
5532
  brand_replacement: '$1'
5383
5533
  model_replacement: '$2-$3'
5384
- - regex: 'SAMSUNG-ANDROID-MMS/([^;/]+)'
5534
+ - regex: 'SAMSUNG-ANDROID-MMS/([^;/]{1,100})'
5385
5535
  device_replacement: '$1'
5386
5536
  brand_replacement: 'Samsung'
5387
5537
  model_replacement: '$1'
@@ -5428,7 +5578,7 @@ device_parsers:
5428
5578
  ##########
5429
5579
  # Sony
5430
5580
  ##########
5431
- - regex: 'Android [^;]+; ([^ ]+) (Sony)/'
5581
+ - regex: 'Android [^;]{1,200}; ([^ ]+) (Sony)/'
5432
5582
  device_replacement: '$2 $1'
5433
5583
  brand_replacement: '$2'
5434
5584
  model_replacement: '$1'
@@ -5462,33 +5612,33 @@ device_parsers:
5462
5612
  #########
5463
5613
  # Android General Device Matching (far from perfect)
5464
5614
  #########
5465
- - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\))'
5615
+ - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.{1,200})( Build[/ ]|\))'
5466
5616
  brand_replacement: 'Generic_Android'
5467
5617
  model_replacement: '$1'
5468
- - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\))'
5618
+ - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5469
5619
  brand_replacement: 'Generic_Android'
5470
5620
  model_replacement: '$1'
5471
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?)( Build[/ ]|\))'
5621
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5472
5622
  brand_replacement: 'Generic_Android'
5473
5623
  model_replacement: '$1'
5474
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{0,2}\- *; *(.+?)( Build[/ ]|\))'
5624
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{0,2}\- {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5475
5625
  brand_replacement: 'Generic_Android'
5476
5626
  model_replacement: '$1'
5477
5627
  # No build info at all - "Build" follows locale immediately
5478
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5628
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5479
5629
  device_replacement: 'Generic Smartphone'
5480
5630
  brand_replacement: 'Generic'
5481
5631
  model_replacement: 'Smartphone'
5482
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\))'
5632
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,3}\-?[A-Za-z]{2}; {0,2}(.{1,50}?)( Build[/ ]|\))'
5483
5633
  brand_replacement: 'Generic_Android'
5484
5634
  model_replacement: '$1'
5485
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Mobile Safari'
5635
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Mobile Safari'
5486
5636
  brand_replacement: 'Generic_Android'
5487
5637
  model_replacement: '$1'
5488
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Safari'
5638
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Safari'
5489
5639
  brand_replacement: 'Generic_Android_Tablet'
5490
5640
  model_replacement: '$1'
5491
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\))'
5641
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\))'
5492
5642
  brand_replacement: 'Generic_Android'
5493
5643
  model_replacement: '$1'
5494
5644
 
@@ -5513,7 +5663,7 @@ device_parsers:
5513
5663
  ##########
5514
5664
  # Generic Tablet
5515
5665
  ##########
5516
- - regex: '(Android 3\.\d|Opera Tablet|Tablet; .+Firefox/|Android.*(?:Tab|Pad))'
5666
+ - regex: '(Android 3\.\d|Opera Tablet|Tablet; .{1,100}Firefox/|Android.{0,100}(?:Tab|Pad))'
5517
5667
  regex_flag: 'i'
5518
5668
  device_replacement: 'Generic Tablet'
5519
5669
  brand_replacement: 'Generic'
@@ -5522,7 +5672,7 @@ device_parsers:
5522
5672
  ##########
5523
5673
  # Generic Smart Phone
5524
5674
  ##########
5525
- - regex: '(Symbian|\bS60(Version|V\d)|\bS60\b|\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .+Firefox/|iPhone OS|Android|MobileSafari|Windows *Phone|\(webOS/|PalmOS)'
5675
+ - regex: '(Symbian|\bS60(Version|V\d)|\bS60\b|\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .{1,200}Firefox/|iPhone OS|Android|MobileSafari|Windows {0,2}Phone|\(webOS/|PalmOS)'
5526
5676
  device_replacement: 'Generic Smartphone'
5527
5677
  brand_replacement: 'Generic'
5528
5678
  model_replacement: 'Smartphone'
@@ -5535,7 +5685,7 @@ device_parsers:
5535
5685
  ##########
5536
5686
  # Spiders (this is a hack...)
5537
5687
  ##########
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)'
5688
+ - regex: '^.{0,100}(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.{0,200}/\+/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)'
5539
5689
  regex_flag: 'i'
5540
5690
  device_replacement: 'Spider'
5541
5691
  brand_replacement: 'Spider'