device_detector 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 611332d50a55f1fae0ed0c5fe904f4270f97a0e2
4
- data.tar.gz: d93d89627f6273e2dc7a00a687c27ce99d4c7620
3
+ metadata.gz: f73cba454031ad8e9b62806a487cf3fe52bc50a2
4
+ data.tar.gz: 677525ac1133c59eb2a7900faf31077546787e45
5
5
  SHA512:
6
- metadata.gz: a9e5e7d8620e42d6ffb46b9f72ce7bff5d721982ea6cea5c93c04e8044241b7452a85c3bb8642f57783b0ade34732fd110197380abace240eacf9be48d9fe115
7
- data.tar.gz: 381bb1bbd102a11fb02245652a354e7d206e04459f78b2dca86e1312f722e39e315099a04f6505ee62e327cd3026c2003b517dd1f9eb25f11c493b49e24c9b2d
6
+ metadata.gz: a196b3ad6f3da4dcf8eb447fb721fc1671870fb1fcd3fc7cf2326917896079777f4188b19ae2fe84433a050567bab5ff8917418112329021822f6490482b0f0d
7
+ data.tar.gz: 4f823b5ab1ce904da8202d12225c09db755d82876c06baaffb2371d838e9779440bedb67e98e03bb76be9f544942490463c95adeb04eb0210003e755165bf652
data/README.md CHANGED
@@ -38,15 +38,24 @@ Or install it yourself as:
38
38
  user_agent = 'foo'
39
39
  client = DeviceDetector.new(user_agent)
40
40
 
41
- client.name # => Chrome
41
+ client.name # => 'Chrome'
42
42
  client.full_version # => '30.0.1599.69'
43
- client.known? # => true, will return false if user_agent is unknown
44
43
 
45
- client.os_name # => Mac
44
+ client.os_name # => 'Mac'
46
45
  client.os_full_version # => '10_8_5'
46
+
47
+ # For many devices, you can also query the device name (usually the model name)
48
+ # Look into regexes/devices/mobiles.yml to see what devices can be detected
49
+ client.device_name # => 'iPhone 5'
50
+ client.device_type # => 'smartphone'
47
51
  ```
48
52
 
49
53
  `DeviceDetector` will return `nil` on all attributes, if the `user_agent` is unknown.
54
+ You can make a check to ensure the client has been detected:
55
+
56
+ ```ruby
57
+ client.known? # => will return false if user_agent is unknown
58
+ ```
50
59
 
51
60
  ### Memory cache
52
61
 
@@ -54,17 +63,27 @@ client.os_full_version # => '10_8_5'
54
63
  You can tune the amount of keys that will get saved in the cache:
55
64
 
56
65
  ```ruby
57
-
58
66
  # You have to call this code **before** you initialize the Detector
59
67
  DeviceDetector.configure do |config|
60
68
  config.max_cache_keys = 20_000 # if you have enough RAM, proceed with care
61
69
  end
62
70
  ```
63
71
 
72
+ ## Maintainers
73
+
74
+ - Mati Sojka: https://github.com/yagooar
75
+ - Ben Zimmer: https://github.com/benzimmer
76
+
77
+ ## Contributors
78
+
79
+ Thanks a lot to the following contributors:
80
+
81
+ - Peter Gao: https://github.com/peteygao
82
+
64
83
  ## Contributing
65
84
 
66
- 1. Fork it ( https://github.com/[my-github-username]/device_detector/fork )
85
+ 1. Fork it ( https://github.com/podigee/device_detector/fork )
67
86
  2. Create your feature branch (`git checkout -b my-new-feature`)
68
87
  3. Commit your changes (`git commit -am 'Add some feature'`)
69
88
  4. Push to the branch (`git push origin my-new-feature`)
70
- 5. Create a new Pull Request
89
+ 5. Create a new Pull Request (compare with develop)
@@ -4,11 +4,14 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
4
  $LOAD_PATH.unshift(File.dirname(__FILE__))
5
5
 
6
6
  require 'device_detector/version'
7
+ require 'device_detector/metadata_extractor'
7
8
  require 'device_detector/version_extractor'
9
+ require 'device_detector/model_extractor'
8
10
  require 'device_detector/memory_cache'
9
11
  require 'device_detector/parser'
10
12
  require 'device_detector/bot'
11
13
  require 'device_detector/client'
14
+ require 'device_detector/device'
12
15
  require 'device_detector/os'
13
16
 
14
17
  class DeviceDetector
@@ -35,6 +38,14 @@ class DeviceDetector
35
38
  os.full_version
36
39
  end
37
40
 
41
+ def device_name
42
+ device.name
43
+ end
44
+
45
+ def device_type
46
+ device.type
47
+ end
48
+
38
49
  def known?
39
50
  client.known?
40
51
  end
@@ -84,6 +95,10 @@ class DeviceDetector
84
95
  @client ||= Client.new(user_agent)
85
96
  end
86
97
 
98
+ def device
99
+ @device ||= Device.new(user_agent)
100
+ end
101
+
87
102
  def os
88
103
  @os ||= OS.new(user_agent)
89
104
  end
@@ -0,0 +1,46 @@
1
+ class DeviceDetector
2
+ class Device < Parser
3
+
4
+ def known?
5
+ regex_meta.any?
6
+ end
7
+
8
+ def name
9
+ ModelExtractor.new(user_agent, regex_meta).call
10
+ end
11
+
12
+ def type
13
+ regex_meta['device']
14
+ end
15
+
16
+ private
17
+
18
+ def filenames
19
+ [
20
+ 'devices/mobiles.yml'
21
+ ]
22
+ end
23
+
24
+ def self.parse_regexes(regexes)
25
+ regexes.map { |base, nest|
26
+
27
+ if !nest.nil? && nest.key?('models')
28
+ parse_regexes nest['models']
29
+ else
30
+ case base
31
+ when Hash
32
+ base['regex'] = Regexp.new base['regex']
33
+ base
34
+ when String
35
+ nest['regex'] = Regexp.new nest['regex']
36
+ nest
37
+ else
38
+ fail "#{filenames.join(', ')} regexes are either malformed or format has changes."
39
+ end
40
+ end
41
+
42
+ }.flatten
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,38 @@
1
+ class DeviceDetector
2
+ class MetadataExtractor < Struct.new(:user_agent, :regex_meta)
3
+
4
+ def call
5
+ regex_meta.any? ? extract_metadata : nil
6
+ end
7
+
8
+ private
9
+
10
+ def metadata_string
11
+ message = "#{self.name} (a child of MetadataExtractor) must implement the '#{__method__}' method."
12
+ fail NotImplementedError, message
13
+ end
14
+
15
+ def extract_metadata
16
+ user_agent.match(regex) do |match_data|
17
+ replace_metadata_string_with(match_data)
18
+ end
19
+ end
20
+
21
+ def replace_metadata_string_with(match_data)
22
+ string = metadata_string
23
+
24
+ 1.upto(9) do |index|
25
+ matched_data = String(match_data[index])
26
+ string = string.gsub(/\$#{index}/, matched_data)
27
+ end
28
+
29
+ string.strip
30
+ end
31
+
32
+ def regex
33
+ Regexp.new(regex_meta['regex'])
34
+ end
35
+
36
+ end
37
+ end
38
+
@@ -0,0 +1,11 @@
1
+ class DeviceDetector
2
+ class ModelExtractor < MetadataExtractor
3
+
4
+ private
5
+
6
+ def metadata_string
7
+ String(regex_meta['model'])
8
+ end
9
+
10
+ end
11
+ end
@@ -1,7 +1,7 @@
1
1
  class DeviceDetector
2
2
  class Parser < Struct.new(:user_agent)
3
3
 
4
- ROOT = Pathname.new(File.expand_path('../../..', __FILE__))
4
+ ROOT = File.expand_path('../../..', __FILE__)
5
5
 
6
6
  def name
7
7
  regex_meta['name']
@@ -43,13 +43,18 @@ class DeviceDetector
43
43
  def self.regexes_for(filepaths)
44
44
  @regexes ||=
45
45
  begin
46
- regexes = YAML.load(filepaths.map { |filepath| File.read(filepath) }.join)
47
- regexes.map do |meta|
48
- meta['regex'] = Regexp.new(meta['regex'])
49
- meta
50
- end
46
+ raw_files = filepaths.map { |filepath| File.read(filepath) }.join
47
+ regexes = YAML.load(raw_files)
48
+ parse_regexes(regexes)
51
49
  end
52
50
  end
53
51
 
52
+ def self.parse_regexes(regexes)
53
+ regexes.map do |meta|
54
+ meta['regex'] = Regexp.new(meta['regex'])
55
+ meta
56
+ end
57
+ end
58
+
54
59
  end
55
60
  end
@@ -1,3 +1,3 @@
1
1
  class DeviceDetector
2
- VERSION = '0.3.1'
2
+ VERSION = '0.4.0'
3
3
  end
@@ -1,34 +1,10 @@
1
1
  class DeviceDetector
2
- class VersionExtractor < Struct.new(:user_agent, :regex_meta)
3
-
4
- def call
5
- regex_meta.any? ? extract_version : nil
6
- end
2
+ class VersionExtractor < MetadataExtractor
7
3
 
8
4
  private
9
5
 
10
- def version_string
11
- regex_meta['version']
12
- end
13
-
14
- def extract_version
15
- user_agent.match(regex) do |match_data|
16
- replace_version_string_with(match_data)
17
- end
18
- end
19
-
20
- def replace_version_string_with(match_data)
21
- string = version_string
22
-
23
- 1.upto(9) do |index|
24
- string = string.gsub(/\$#{index}/, match_data[index]) if match_data[index]
25
- end
26
-
27
- string
28
- end
29
-
30
- def regex
31
- Regexp.new(regex_meta['regex'])
6
+ def metadata_string
7
+ String(regex_meta['version'])
32
8
  end
33
9
 
34
10
  end
data/regexes/browsers.yml CHANGED
@@ -5,6 +5,14 @@
5
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
6
  ###############
7
7
 
8
+ #newer versions of IE
9
+ - regex: 'Edge[ /](\d+[\.\d]+)'
10
+ name: 'Internet Explorer'
11
+ version: '$1'
12
+ engine:
13
+ default: 'Edge'
14
+
15
+
8
16
  #SailfishBrowser
9
17
  - regex: 'SailfishBrowser(?:/(\d+[\.\d]+))?'
10
18
  name: 'Sailfish Browser'
@@ -627,6 +635,11 @@
627
635
  engine:
628
636
  default: 'Blink'
629
637
 
638
+ # MIUI Browser
639
+ - regex: 'MIUIBrowser(?:/(\d+[\.\d]+))?'
640
+ name: 'MIUI Browser'
641
+ version: '$1'
642
+
630
643
  #Nokia Browser
631
644
  - regex: '(?:NokiaBrowser|BrowserNG)(?:/(\d+[\.\d]+))?'
632
645
  name: 'Nokia Browser'
@@ -739,4 +752,3 @@
739
752
  version: '$1'
740
753
  engine:
741
754
  default: 'WebKit'
742
-
@@ -0,0 +1,2412 @@
1
+ ###############
2
+ # Device Detector - The Universal Device Detection library for parsing User Agents
3
+ #
4
+ # @link http://piwik.org
5
+ # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
+ ###############
7
+
8
+ 'Tunisie Telecom':
9
+ regex: 'StarTrail TT Build'
10
+ device: 'smartphone'
11
+ model: 'StarTrail'
12
+
13
+ # SFR
14
+ SFR:
15
+ regex: 'StarShine|StarTrail|STARADDICT|StarText|StarNaute|StarXtrem|StarTab'
16
+ device: 'smartphone'
17
+ models:
18
+ - regex: 'StarXtrem Build'
19
+ model: 'StarXtrem' # ZTE
20
+ - regex: 'StarTrail Build'
21
+ model: 'StarTrail' # ZTE
22
+ - regex: 'StarTrail II Build'
23
+ model: 'StarTrail 2' # Huawei Ascend Y200
24
+ - regex: 'StarTrail III Build'
25
+ model: 'StarTrail 3' # ZTE
26
+ - regex: 'StarTrail ?4 Build'
27
+ model: 'StarTrail 4' # ZTE Blade Q
28
+ - regex: 'StarShine Build'
29
+ model: 'StarShine' # Huawei U8180
30
+ - regex: 'StarShine II Build'
31
+ model: 'StarShine 2' # ZTE
32
+ - regex: 'STARADDICT Build'
33
+ model: 'Staraddict' # ZTE
34
+ - regex: 'STARADDICT II Build'
35
+ model: 'Staraddict 2' # Alcatel One Touch 995
36
+ - regex: 'STARADDICT II Plus Build'
37
+ model: 'Staraddict 2 Plus' # ZTE Grand X
38
+ - regex: 'STARADDICT III Build'
39
+ model: 'Staraddict 3' # Coolpad 8861U
40
+ - regex: 'StarText Build'
41
+ model: 'StarText' # ZTE
42
+ - regex: 'StarText II Build'
43
+ model: 'StarText 2' # ZTE
44
+ - regex: 'StarNaute Build'
45
+ model: 'StarNaute' # ZTE Amigo
46
+ - regex: 'StarNaute II Build'
47
+ model: 'StarNaute 2' # ZTE
48
+ - regex: 'StarTab'
49
+ model: 'StarTab'
50
+ device: 'tablet'
51
+
52
+ - regex: '((?:StarShine|StarTrail|STARADDICT|StarText|StarNaute|StarXtrem)[^;/]*) Build'
53
+ model: '$1'
54
+
55
+ # HTC
56
+ HTC:
57
+ regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G Build|(Desire|Sensation|Evo ?3D)[ _]?([^;/]+) Build|(Amaze[ _]4G|One ?[XELSV\+]+) Build|SPV E6[05]0'
58
+ device: 'smartphone'
59
+ models:
60
+ # explicit smartphone models
61
+ - regex: 'ADR6300'
62
+ model: 'Droid Incredible'
63
+ - regex: 'ADR6400L'
64
+ model: 'ThunderBolt'
65
+ - regex: 'ADR6410LRA'
66
+ model: 'Droid Incredible 3'
67
+ - regex: 'SPV E600'
68
+ model: 'Excalibur'
69
+ - regex: 'SPV E650'
70
+ model: 'Vox'
71
+
72
+ - regex: 'NexusHD2' # custom rom for hd2
73
+ model: 'HD2'
74
+ - regex: 'HTC[ _-]((?:Flyer|P715a).*) Build'
75
+ device: 'tablet'
76
+ model: '$1'
77
+ - regex: 'HTC[ _]([^/;]+) [0-9]+(?:\.[0-9]+)+ Build'
78
+ model: '$1'
79
+ - regex: 'HTC[ _]([^/;]+) Build'
80
+ model: '$1'
81
+ - regex: 'HTC[ _]([a-z0-9]+[ _-]?(?:[a-z0-9_+\-])*)'
82
+ model: '$1'
83
+ - regex: 'USCCHTC(\d+)'
84
+ model: '$1'
85
+ - regex: 'Sprint (ATP.*) Build'
86
+ device: 'tablet'
87
+ model: '$1 (Sprint)'
88
+ - regex: 'Sprint (APA.*) Build'
89
+ model: '$1 (Sprint)'
90
+ - regex: 'HTC(?:[\-/ ])?([a-z0-9\-_]+)'
91
+ model: '$1'
92
+ - regex: 'HTC;(?: )?([a-z0-9 ]+)'
93
+ model: '$1'
94
+ - regex: '(Desire|Sensation|Evo ?3D)[ _]?([^;/]+) Build'
95
+ model: '$1 $2'
96
+ - regex: '(Amaze[ _]4G|One ?[XELSV\+]*) Build'
97
+ model: '$1'
98
+ - regex: '(ADR.+) Build'
99
+ model: '$1'
100
+ - regex: '(ADR[a-z0-9]+)'
101
+ model: '$1'
102
+
103
+ # NOKIA
104
+ Nokia:
105
+ regex: 'Nokia|Lumia|Maemo RX|portalmmm/2\.0 N7|portalmmm/2\.0 NK|nok[0-9]+|Symbian.*\s([a-z0-9]+)$'
106
+ device: 'smartphone'
107
+ models:
108
+ - regex: 'Nokia(N[0-9]+)'
109
+ model: '$1'
110
+ - regex: 'Nokia-([a-z0-9]+)'
111
+ model: 'N$1'
112
+ - regex: 'NOKIA; ([a-z0-9\- ]+)'
113
+ model: '$1'
114
+ - regex: 'NOKIA[ _]?([a-z0-9\-]+)'
115
+ model: '$1'
116
+ - regex: 'NOKIA/([a-z0-9 ]+)'
117
+ model: '$1'
118
+ - regex: '(Lumia [a-z0-9\-]+)'
119
+ model: '$1'
120
+ - regex: 'Maemo RX-51 ([a-z0-9]+)'
121
+ model: '$1'
122
+ - regex: 'Maemo RX-34'
123
+ model: 'N800'
124
+ - regex: 'NokiaInternal|Nokia-WAP-Toolkit|Nokia-MIT-Browser|Nokia Mobile|Nokia Browser|Nokia/Series'
125
+ model: ''
126
+ - regex: 'portalmmm/2\.0 (N7[37]|NK[a-z0-9]+)'
127
+ model: '$1'
128
+ - regex: 'nok([0-9]+)'
129
+ model: '$1'
130
+ - regex: 'Symbian.*\s([a-z0-9]+)$'
131
+ device: 'feature phone'
132
+ model: '$1'
133
+
134
+ # CnM
135
+ CnM:
136
+ regex: 'CnM'
137
+ device: 'tablet'
138
+ models:
139
+ - regex: 'CnM[ \-](?:Touchpad|TP)[ \-]([0-9\.]+)'
140
+ model: 'Touchpad $1'
141
+
142
+ # RIM/BlackBerry
143
+ RIM:
144
+ regex: 'BB10;|BlackBerry|rim[0-9]+|PlayBook'
145
+ device: 'smartphone'
146
+ models:
147
+ - regex: 'BB10; ([a-z0-9\- ]+)\)'
148
+ model: 'BlackBerry $1'
149
+ - regex: 'PlayBook.+RIM Tablet OS'
150
+ model: 'BlackBerry Playbook'
151
+ device: 'tablet'
152
+ - regex: 'BlackBerry(?: )?([a-z0-9]+)'
153
+ model: 'BlackBerry $1'
154
+ - regex: 'rim([0-9]+)'
155
+ model: 'BlackBerry $1'
156
+ - regex: 'BlackBerry'
157
+ model: 'BlackBerry'
158
+
159
+ # PALM
160
+ Palm:
161
+ regex: '(?:Pre|Pixi)/(\d+)\.(\d+)|Palm|Treo|Xiino'
162
+ device: 'smartphone'
163
+ models:
164
+ - regex: '((?:Pre|Pixi))/(\d+\.\d+)'
165
+ model: '$1 $2'
166
+ - regex: 'Palm(?:[ -])?((?!OS|Source)[a-z0-9]+)'
167
+ model: '$1'
168
+ - regex: 'Treo([a-z0-9]+)'
169
+ model: 'Treo $1'
170
+ - regex: 'Tungsten'
171
+ model: 'Tungsten'
172
+ - regex: 'Xiino' # Browser for Palm OS only
173
+ model: ''
174
+
175
+ # HP
176
+ HP:
177
+ regex: 'TouchPad/\d+\.\d+|hp-tablet|HP ?iPAQ|webOS.*P160U|HP Slate|HP [78]'
178
+ device: 'smartphone'
179
+ models:
180
+ - regex: 'HP ([78][^/;]*) Build'
181
+ model: 'Slate $1'
182
+ device: 'tablet'
183
+ - regex: 'HP Slate ?(.+) Build'
184
+ model: 'Slate $1'
185
+ device: 'tablet'
186
+ - regex: 'HP Slate ?([0-9]+)'
187
+ model: 'Slate $1'
188
+ device: 'tablet'
189
+ - regex: 'TouchPad/(\d+\.\d+)|hp-tablet'
190
+ model: 'TouchPad'
191
+ device: 'tablet'
192
+ - regex: 'HP(?: )?iPAQ(?: )?([a-z0-9]+)'
193
+ model: 'iPAQ $1'
194
+ - regex: 'webOS.*(P160U)'
195
+ model: 'Veer'
196
+
197
+ # TiPhone
198
+ TiPhone:
199
+ regex: 'TiPhone ?([a-z0-9]+)'
200
+ device: 'smartphone'
201
+ model: '$1'
202
+
203
+ # Apple
204
+ Apple:
205
+ regex: 'AppleTV|(?:Apple-)?(?:iPad|iPhone)'
206
+ models:
207
+ # specific smartphone devices
208
+ - regex: '(?:Apple-)?iPhone1[C,]1'
209
+ model: 'iPhone'
210
+ device: 'smartphone'
211
+ - regex: '(?:Apple-)?iPhone1[C,]2'
212
+ model: 'iPhone 3G'
213
+ device: 'smartphone'
214
+ - regex: '(?:Apple-)?iPhone2[C,]1'
215
+ model: 'iPhone 3GS'
216
+ device: 'smartphone'
217
+ - regex: '(?:Apple-)?iPhone3[C,][123]'
218
+ model: 'iPhone 4'
219
+ device: 'smartphone'
220
+ - regex: '(?:Apple-)?iPhone4[C,]1'
221
+ model: 'iPhone 4S'
222
+ device: 'smartphone'
223
+ - regex: '(?:Apple-)?iPhone5[C,][12]'
224
+ model: 'iPhone 5'
225
+ device: 'smartphone'
226
+ - regex: '(?:Apple-)?iPhone5[C,][34]'
227
+ model: 'iPhone 5C'
228
+ device: 'smartphone'
229
+ - regex: '(?:Apple-)?iPhone6[C,][12]'
230
+ model: 'iPhone 5S'
231
+ device: 'smartphone'
232
+ - regex: '(?:Apple-)?iPhone7[C,]1'
233
+ model: 'iPhone 6 Plus'
234
+ device: 'smartphone'
235
+ - regex: '(?:Apple-)?iPhone7[C,]2'
236
+ model: 'iPhone 6'
237
+ device: 'smartphone'
238
+
239
+ # specific tablet devices
240
+ - regex: '(?:Apple-)?iPad1[C,]1'
241
+ model: 'iPad'
242
+ device: 'tablet'
243
+ - regex: '(?:Apple-)?iPad2[C,][1234]'
244
+ model: 'iPad 2'
245
+ device: 'tablet'
246
+ - regex: '(?:Apple-)?iPad2[C,][567]'
247
+ model: 'iPad Mini'
248
+ device: 'tablet'
249
+ - regex: '(?:Apple-)?iPad3[C,][123]'
250
+ model: 'iPad 3'
251
+ device: 'tablet'
252
+ - regex: '(?:Apple-)?iPad3[C,][456]'
253
+ model: 'iPad 4'
254
+ device: 'tablet'
255
+ - regex: '(?:Apple-)?iPad4[C,][123]'
256
+ model: 'iPad Air'
257
+ device: 'tablet'
258
+ - regex: '(?:Apple-)?iPad4[C,][456]'
259
+ model: 'iPad Mini 2'
260
+ device: 'tablet'
261
+ - regex: '(?:Apple-)?iPad4[C,][789]'
262
+ model: 'iPad Mini 3'
263
+ device: 'tablet'
264
+ - regex: '(?:Apple-)?iPad5[C,][34]'
265
+ model: 'iPad Air 2'
266
+
267
+
268
+ - regex: 'AppleTV'
269
+ model: 'Apple TV'
270
+ device: 'tv'
271
+ - regex: '(?:Apple-)?iPad'
272
+ model: 'iPad'
273
+ device: 'tablet'
274
+ - regex: '(?:Apple-)?iPhone ?(3GS?|4S?|5[CS]?|6(:? Plus)?)?'
275
+ model: 'iPhone $1'
276
+ device: 'smartphone'
277
+
278
+ # micromax
279
+ MicroMax:
280
+ regex: 'MicroMax[ \-\_]?[a-z0-9]+'
281
+ device: 'smartphone'
282
+ models:
283
+ - regex: 'MicroMax(?:[ \-\_])?(P[a-z0-9]+)'
284
+ model: '$1'
285
+ device: 'tablet'
286
+ - regex: 'MicroMax(?:[ \-\_])?([a-z0-9]+)'
287
+ model: '$1'
288
+
289
+ # 3Q
290
+ 3Q:
291
+ regex: '(AC0731B|AC1024C|AC7803C|BC9710AM|EL72B|LC0720C|LC0723B|LC0725B|LC0804B|LC0808B|LC0809B|LC0810C|LC0816C|LC0901D|LC1016C|MT0724B|MT0729B|MT0729D|MT0811B|OC1020A|RC0709B|RC0710B|RC0718C|RC0719H|RC0721B|RC0722C|RC0726B|RC0734H|RC0743H|RC0817C|RC1018C|RC1019G|RC1025F|RC1301C|RC7802F|RC9711B|RC9712C|RC9716B|RC9717B|RC9724C|RC9726C|RC9727F|RC9730C|RC9731C|TS0807B|TS1013B|VM0711A|VM1017A|RC0813C|QS9719D|QS9718C|QS9715F|QS1023H|QS0815C|QS0730C|QS0728C|QS0717D|QS0716D|QS0715C|MT7801C)'
292
+ device: 'tablet'
293
+ model: '$1'
294
+
295
+ # Acer
296
+ Acer:
297
+ regex: 'acer|a(?:101|110|200|210|211|500|501|510|511|700|701) Build|Android.*V360 Build|A1-830|A1-81[01]|A3-A1[01]|B1-7[12][01]|B1-A71|S5[12]0'
298
+ device: 'smartphone'
299
+ models:
300
+ # explicit tablet models
301
+ - regex: 'A1-81[01]'
302
+ model: 'Iconia A'
303
+ device: 'tablet'
304
+ - regex: 'A1-830'
305
+ model: 'Iconia A1'
306
+ device: 'tablet'
307
+ - regex: 'A3-A1[01]'
308
+ model: 'Iconia A3'
309
+ device: 'tablet'
310
+ - regex: 'B1-7[12][01]|B1-A71'
311
+ model: 'Iconia B1'
312
+ device: 'tablet'
313
+
314
+ # explicit smartphone models
315
+ - regex: 'Android.*V360 Build'
316
+ model: 'Liquid E1'
317
+ - regex: 'S510 Build'
318
+ model: 'Liquid S1'
319
+ - regex: 'S520 Build'
320
+ model: 'Liquid S2'
321
+
322
+ - regex: 'Acer; ?([^;\)]+)'
323
+ model: '$1'
324
+ - regex: 'Acer[ _-]?([^;\)]+) Build'
325
+ model: '$1'
326
+ - regex: 'acer[\-_]([a-z0-9]+)'
327
+ model: '$1'
328
+ - regex: 'a(101|110|200|210|211|500|501|510|511|700|701) Build'
329
+ model: 'Iconia Tab A$1'
330
+ device: 'tablet'
331
+
332
+ # Airness
333
+ Airness:
334
+ regex: 'AIRNESS-([\w0-9]+)'
335
+ device: 'feature phone'
336
+ model: '$1'
337
+
338
+ # Alcatel
339
+ Alcatel:
340
+ regex: 'Alcatel|Alc[a-z0-9]+|One ?Touch'
341
+ device: 'smartphone'
342
+ models:
343
+ - regex: '(?:Alcatel[ _])?One[ _]?Touch[ _]((?:T[0-9]+|TAB[^/;]+|EVO[78](?:HD)?)) Build'
344
+ device: 'tablet'
345
+ model: 'One Touch $1'
346
+ - regex: '(?:Alcatel[ _])?One[ _]?Touch([^/;]*) Build'
347
+ model: 'One Touch$1'
348
+ - regex: 'Alcatel UP'
349
+ model: ''
350
+ - regex: 'ALCATEL([^/;]+) Build'
351
+ model: '$1'
352
+ - regex: 'ALCATEL[ \-]?([^/;\)]+)'
353
+ model: '$1'
354
+ - regex: 'ALCATEL_([^/;\)]+)'
355
+ model: '$1'
356
+ - regex: 'Alc([a-z0-9]+)'
357
+ model: '$1'
358
+
359
+ # Amoi
360
+ Amoi:
361
+ regex: 'Amoi'
362
+ device: 'smartphone'
363
+ models:
364
+ - regex: 'Amoi[\- /]([a-z0-9]+)'
365
+ model: '$1'
366
+ - regex: 'Amoisonic-([a-z0-9]+)'
367
+ model: '$1'
368
+
369
+ # Archos
370
+ Archos:
371
+ regex: 'Archos'
372
+ device: 'smartphone'
373
+ models:
374
+ - regex: 'Archos ?5 Build'
375
+ device: 'tablet'
376
+ model: '5'
377
+ - regex: 'Archos ([^/;]*(?:PAD)[^/;]*) Build'
378
+ device: 'tablet'
379
+ model: '$1'
380
+ - regex: 'Archos ((?:[789]|10)[0-9]?[a-z]* ?(?:G9|G10|Helium|Titanium|Cobalt|Platinum|Xenon|Carbon|Neon|XS|IT)[^/;]*) Build'
381
+ device: 'tablet'
382
+ model: '$1'
383
+ - regex: 'Archos ([a-z0-9 ]+) Build'
384
+ model: '$1'
385
+ - regex: 'Archos ([a-z0-9]+)'
386
+ model: '$1'
387
+
388
+ # Axxion
389
+ Axxion:
390
+ regex: 'Axxion ATAB-[0-9]+ Build'
391
+ device: 'tablet'
392
+ models:
393
+ - regex: 'Axxion ATAB-([0-9]+) Build'
394
+ model: 'ATAB-$1'
395
+
396
+ # Meu
397
+ MEU:
398
+ regex: 'MEU ([a-z0-9]+) Build'
399
+ device: 'smartphone'
400
+ model: '$1'
401
+
402
+ # Arnova
403
+ Arnova:
404
+ regex: 'arnova|AN[0-9]'
405
+ device: 'tablet'
406
+ models:
407
+ - regex: 'Arnova ([^/;]*) Build'
408
+ model: '$1'
409
+ - regex: 'AN([0-9][a-z0-9]+)'
410
+ model: '$1'
411
+
412
+ # Asus
413
+ Asus:
414
+ regex: 'Asus|Transformer|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|K00[0-9a-z] Build'
415
+ device: 'smartphone'
416
+ models:
417
+ # explicit tablet models
418
+ - regex: 'ME171 Build'
419
+ model: 'Eee Pad MeMO 171'
420
+ device: 'tablet'
421
+ - regex: 'ME172V'
422
+ model: 'MeMO Pad'
423
+ device: 'tablet'
424
+ - regex: 'ME302C Build'
425
+ model: 'MeMO Pad FHD 10'
426
+ device: 'tablet'
427
+ - regex: 'ME302KL Build'
428
+ model: 'MeMO Pad FHD 10 LTE'
429
+ device: 'tablet'
430
+ - regex: 'ME301T Build'
431
+ model: 'MeMO Pad Smart 10'
432
+ device: 'tablet'
433
+ - regex: 'ME371MG Build'
434
+ model: 'Fonepad'
435
+ device: 'tablet'
436
+ - regex: 'K00U|ME173X Build'
437
+ model: 'MeMO Pad HD 7'
438
+ device: 'tablet'
439
+ - regex: 'K00L Build'
440
+ model: 'MeMO Pad 8'
441
+ device: 'tablet'
442
+ - regex: 'K00S Build'
443
+ model: 'MeMO Pad HD 7 Dual SIM'
444
+ device: 'tablet'
445
+ - regex: 'K00E Build'
446
+ model: 'Fonepad 7'
447
+ device: 'tablet'
448
+ - regex: 'K00Z Build'
449
+ model: 'Fonepad 7 Dual SIM'
450
+ device: 'tablet'
451
+ - regex: 'K00F Build'
452
+ model: 'MeMO Pad 10'
453
+ device: 'tablet'
454
+ - regex: 'K00G Build'
455
+ model: 'Fonepad Note 6'
456
+ device: 'tablet'
457
+ - regex: 'K00C Build'
458
+ model: 'Transformer Pad TF701T'
459
+ device: 'tablet'
460
+ - regex: 'TF300T Build'
461
+ model: 'Transformer Pad TF300T'
462
+ device: 'tablet'
463
+ - regex: 'Slider SL101'
464
+ model: 'Eee Pad Slider SL101'
465
+ device: 'tablet'
466
+
467
+ # explicit smartphone models
468
+ - regex: '(?:ASUS_)?T00[IQ]'
469
+ model: 'ZenFone 4'
470
+
471
+ # general detections
472
+ - regex: 'Asus(?:-|;)?([a-z0-9]+)'
473
+ model: '$1'
474
+ - regex: '(PadFone(?: [^;/]+)?) Build'
475
+ model: '$1'
476
+ - regex: '(PadFone(?: [a-z0-9]+)?)'
477
+ model: '$1'
478
+ - regex: '(?:Asus|Transformer) ((?:Pad |Prime )?TF[0-9a-z]+)'
479
+ device: 'tablet'
480
+ model: 'Transformer $1'
481
+
482
+ # Audiovox
483
+ Audiovox:
484
+ regex: 'Audiovox|CDM|UTS(?:TARCOM)?\-|audio[a-z0-9\-]+'
485
+ device: 'smartphone'
486
+ models:
487
+ - regex: 'Audiovox[_\-]([a-z0-9\-]+)'
488
+ model: '$1'
489
+ - regex: 'CDM(?:-)?([a-z0-9]+)'
490
+ model: 'CDM-$1'
491
+ - regex: 'UTS(?:TARCOM)?-([a-z0-9\-]+)'
492
+ model: 'CDM-$1'
493
+ - regex: 'audio([a-z0-9\-]+)'
494
+ model: 'CDM-$1'
495
+
496
+ # Avvio
497
+ Avvio:
498
+ regex: 'Avvio[ _]([a-z0-9\-]+)'
499
+ device: 'smartphone'
500
+ models:
501
+ - regex: 'Avvio[ _]PAD'
502
+ model: 'PAD'
503
+ device: 'tablet'
504
+ - regex: 'Avvio[ _]([a-z0-9\-]+)'
505
+ model: '$1'
506
+
507
+ #Barnes & Noble
508
+ 'Barnes & Noble':
509
+ regex: 'Nook|BN[TR]V[0-9]+'
510
+ device: 'tablet'
511
+ models:
512
+ - regex: 'Nook([a-z0-9]+)'
513
+ model: 'Nook $1'
514
+ - regex: 'Nook[ _]([^/;]+)[ _]Build'
515
+ model: 'Nook $1'
516
+ - regex: '(BN[TR]V[0-9]+)'
517
+ model: 'Nook $1'
518
+
519
+ # Blu
520
+ Blu:
521
+ regex: 'blu ([^/;]+) Build'
522
+ device: 'smartphone'
523
+ model: '$1'
524
+
525
+ #BBK
526
+ BBK:
527
+ regex: 'vivo'
528
+ device: 'smartphone'
529
+ models:
530
+ - regex: 'vivo ([^/;]+) Build'
531
+ model: 'Vivo $1'
532
+ - regex: 'vivo_([a-z0-9]+)'
533
+ model: 'Vivo $1'
534
+
535
+ # Bird
536
+ Bird:
537
+ regex: 'BIRD[\-. _]([^;/]+)'
538
+ device: 'feature phone'
539
+ models:
540
+ - regex: 'BIRD[\-. _]([^;/]+) Build'
541
+ model: '$1'
542
+ - regex: 'BIRD[\-. _]([^;/]+)_TD'
543
+ model: '$1'
544
+ - regex: 'BIRD[\-. _]([^;/]+)'
545
+ model: '$1'
546
+
547
+ # Becker
548
+ Becker:
549
+ regex: 'Becker-([a-z0-9]+)'
550
+ device: 'feature phone'
551
+ model: '$1'
552
+
553
+ # Beetel
554
+ Beetel:
555
+ regex: 'Beetel ([a-z0-9]+)'
556
+ device: 'feature phone'
557
+ model: '$1'
558
+
559
+ # BenQ-Siemens
560
+ BenQ-Siemens:
561
+ regex: 'BENQ-SIEMENS - ([a-z0-9]+)'
562
+ device: 'feature phone'
563
+ model: '$1'
564
+
565
+ # BenQ
566
+ BenQ:
567
+ regex: 'BENQ(?:[ \-])?([a-z0-9]+)'
568
+ device: 'feature phone'
569
+ model: '$1'
570
+
571
+ # Bmobile
572
+ Bmobile:
573
+ regex: 'Bmobile_([a-z0-9]+)'
574
+ device: 'smartphone'
575
+ model: '$1'
576
+
577
+ # bq
578
+ bq:
579
+ regex: 'bq [^/;]+ Build'
580
+ device: 'tablet'
581
+ models:
582
+ - regex: 'bq (Aquaris[^/;]*) Build'
583
+ model: '$1'
584
+ device: 'smartphone'
585
+ - regex: 'bq ([^/;]+) Build'
586
+ model: '$1'
587
+
588
+ # Capitel
589
+ Capitel:
590
+ regex: 'Capitel-([a-z0-9]+)'
591
+ device: 'feature phone'
592
+ model: '$1'
593
+
594
+ # Cat
595
+ Cat:
596
+ regex: 'Cat ?(tablet|stargate|nova)'
597
+ device: 'tablet'
598
+ models:
599
+ - regex: 'Cat ?(?:tablet)? ?((?:Galactica|Nova|StarGate|PHOENIX)[^/;]*) Build'
600
+ model: '$1'
601
+ - regex: 'Cat ?tablet'
602
+ model: 'Nova'
603
+
604
+ # Celkon
605
+ Celkon:
606
+ regex: 'Celkon'
607
+ device: 'smartphone'
608
+ models:
609
+ - regex: 'Celkon[ _*](C[78]20)'
610
+ model: '$1'
611
+ device: 'tablet'
612
+ - regex: 'Celkon[ _*](CT[^;/]+) Build'
613
+ model: '$1'
614
+ device: 'tablet'
615
+ - regex: 'Celkon[ _*]([^;/]+) Build'
616
+ model: '$1'
617
+ - regex: 'Celkon[\. _*]([^;/\)]+)[\)/]'
618
+ model: '$1'
619
+
620
+ # Cherry Mobile
621
+ 'Cherry Mobile':
622
+ regex: 'Cherry|Flare2X|Fusion Bolt'
623
+ device: 'smartphone'
624
+ models:
625
+ - regex: 'Cherry(?: ?Mobile)?[ _]?([^/;]+) Build'
626
+ model: '$1'
627
+ - regex: '(Flare2X)'
628
+ model: '$1'
629
+ - regex: '(Fusion Bolt)'
630
+ model: '$1'
631
+ device: 'tablet'
632
+
633
+ # Compal
634
+ Compal:
635
+ regex: 'Compal-[a-z0-9]+'
636
+ device: 'feature phone'
637
+ model: '$1'
638
+
639
+ # ConCorde
640
+ ConCorde:
641
+ regex: 'ConCorde ([^/;]+) Build'
642
+ device: 'smartphone'
643
+ models:
644
+ - regex: 'ConCorde Tab ?([^/;]+) Build'
645
+ model: 'Tab $1'
646
+ device: 'tablet'
647
+ - regex: 'ConCorde ReadMan ?([^/;]+) Build'
648
+ model: 'ReadMan $1'
649
+ device: 'tablet'
650
+ - regex: 'ConCorde ([^/;]+) Build'
651
+ model: '$1'
652
+
653
+ # Coolpad
654
+ Coolpad:
655
+ regex: '(?:YL-)?Coolpad'
656
+ device: 'smartphone'
657
+ models:
658
+ - regex: '(?:YL-)?Coolpad[ _-]?([^/;]+) Build'
659
+ model: '$1'
660
+ - regex: '(?:YL-)?Coolpad[ _-]?([a-z0-9-]+)'
661
+ model: '$1'
662
+
663
+ # Cricket
664
+ Cricket:
665
+ regex: 'Cricket-([a-z0-9]+)'
666
+ device: 'feature phone'
667
+ model: '$1'
668
+
669
+ # Crius
670
+ 'Crius Mea':
671
+ regex: '(Q7A\+?) Build'
672
+ device: 'tablet'
673
+ model: '$1'
674
+
675
+ # Cube
676
+ Cube:
677
+ regex: 'Cube|(U[0-9]+GT(?:[0-9]|[\-_][a-z]+)|K8GT)'
678
+ device: 'tablet'
679
+ models:
680
+ - regex: '(U[0-9]+GT(?:[0-9]|[\-_][a-z]+))'
681
+ model: '$1'
682
+ - regex: '(K8GT)'
683
+ model: '$1'
684
+
685
+ # Danew
686
+ Danew:
687
+ regex: 'Dslide ?([^;/]+) Build'
688
+ device: 'tablet'
689
+ model: 'DSlide $1'
690
+
691
+ # Denver Electronics
692
+ Denver:
693
+ regex: '(TA[CDQ]-[0-9]+)'
694
+ device: 'tablet'
695
+ model: '$1'
696
+
697
+ # Dell
698
+ Dell:
699
+ regex: 'Dell'
700
+ device: 'smartphone'
701
+ models:
702
+ - regex: 'Dell ((?:Streak|Venue)[^/;]*) Build'
703
+ model: '$1'
704
+ device: 'tablet'
705
+ - regex: 'Dell; ((?:Streak|Venue)[^;/\)]*)'
706
+ model: '$1'
707
+ device: 'tablet'
708
+ - regex: 'Dell; ([^;/\)]+)'
709
+ model: '$1'
710
+ - regex: 'Dell[ _-]([^/;]+) Build'
711
+ model: '$1'
712
+
713
+ # Dbtel
714
+ Dbtel:
715
+ regex: 'DBTEL(?:[\-/])?([a-z0-9]+)'
716
+ device: 'feature phone'
717
+ model: '$1'
718
+
719
+ # Dicam
720
+ Dicam:
721
+ regex: 'DICAM-([a-z0-9]+)'
722
+ device: 'feature phone'
723
+ model: '$1'
724
+
725
+ # DoCoMo
726
+ DoCoMo:
727
+ regex: 'DoCoMo|\;FOMA|KGT/1\.0'
728
+ device: 'feature phone'
729
+ models:
730
+ - regex: 'DoCoMo/[12]\.0[/ ]([a-z0-9]+)'
731
+ model: '$1'
732
+ - regex: '([a-z0-9]+)(?:_W)?\;FOMA'
733
+ model: '$1'
734
+ - regex: 'KGT/1\.0 ([a-z0-9]+)'
735
+ model: '$1'
736
+
737
+ # Doogee
738
+ Doogee:
739
+ regex: '((?:BIGBOY|COLLO[23]?|DAGGER|DISCOVERY|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER) DG[0-9]+) Build'
740
+ device: 'smartphone'
741
+ model: '$1'
742
+
743
+ # Dopod
744
+ Dopod:
745
+ regex: 'Dopod(?: )?([a-z0-9]+)'
746
+ device: 'feature phone'
747
+ model: '$1'
748
+
749
+ # E-Boda
750
+ E-Boda:
751
+ regex: 'E-Boda'
752
+ device: 'smartphone'
753
+ models:
754
+ - regex: 'E-Boda ((?:Revo|Izzycomm|Essential|Intelligence|Supreme)[^/;]+) Build'
755
+ device: 'tablet'
756
+ model: '$1'
757
+ - regex: 'E-Boda ([^/;]+) Build'
758
+ model: '$1'
759
+
760
+ # Easypix
761
+ Easypix:
762
+ regex: 'EasyPad|EasyPhone'
763
+ device: 'smartphone'
764
+ models:
765
+ - regex: '(EasyPhone[^/;]+) Build'
766
+ model: '$1'
767
+ - regex: '(EasyPad[^/;]+) Build'
768
+ model: '$1'
769
+ device: 'tablet'
770
+
771
+ # Ericy
772
+ Ericy:
773
+ regex: 'Ericy-([a-z0-9]+)'
774
+ device: 'feature phone'
775
+ model: '$1'
776
+
777
+ # Sony Ericsson
778
+ Sony Ericsson:
779
+ regex: 'Sony ?Ericsson|portalmmm/2\.0 K|(?:WT|LT|SO|ST|SK)[0-9]+[a-z]*[0-9]*(?: Build|\))|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build'
780
+ device: 'smartphone'
781
+ models:
782
+ # explicit smartphone models
783
+ - regex: '(?:SonyEricsson)?CK13i'
784
+ model: 'txt'
785
+ - regex: '(?:SonyEricsson)?CK15[ai]'
786
+ model: 'txt pro'
787
+ - regex: '(?:SonyEricsson)?E10[ai]v?'
788
+ model: 'Xperia X10 mini'
789
+ - regex: '(?:SonyEricsson)?E15[ai]v?'
790
+ model: 'Xperia X8'
791
+ - regex: '(?:SonyEricsson)?LT15[ai]v?'
792
+ model: 'Xperia arc'
793
+ - regex: '(?:SonyEricsson)?LT18[ai]v?'
794
+ model: 'Xperia arc S'
795
+ - regex: '(?:SonyEricsson)?X10[ai]v?'
796
+ model: 'Xperia X10'
797
+
798
+ - regex: 'SonyEricsson([a-z0-9]+) Build'
799
+ model: '$1'
800
+ - regex: 'Sony(?: )?Ericsson ?([a-z0-9\-]+)'
801
+ model: '$1'
802
+ - regex: '((?:WT|LT|SO|ST|SK)[0-9]+[a-z]*[0-9]*)(?: Build|\))'
803
+ model: '$1'
804
+ - regex: '(MT[0-9]{2}[a-z]?) Build'
805
+ model: '$1'
806
+ - regex: 'portalmmm/2.0 K([a-z0-9]+)'
807
+ model: 'K$1'
808
+
809
+ # Ericsson
810
+ Ericsson:
811
+ regex: '(?:Ericsson(?:/ )?[a-z0-9]+)|(?:R380 2.0 WAP1.1)'
812
+ device: 'feature phone'
813
+ models:
814
+ - regex: 'Ericsson(?:/ )?([a-z0-9]+)'
815
+ model: '$1'
816
+ - regex: 'R380 2.0 WAP1.1'
817
+ model: 'R380'
818
+
819
+ # eTouch
820
+ eTouch:
821
+ regex: 'eTouch ?([a-z0-9]+)'
822
+ device: 'smartphone'
823
+ model: '$1'
824
+
825
+ # Storex
826
+ Storex:
827
+ regex: "eZee[^a-z]*Tab ?([^;/]*) Build"
828
+ device: 'tablet'
829
+ model: "eZee'Tab$1"
830
+
831
+ # Evertek
832
+ Evertek:
833
+ regex: '(Ever(?:Glory|Shine|Miracle|Mellow|Classic|Trendy|Fancy)[^/;]*) Build'
834
+ device: 'smartphone'
835
+ model: '$1'
836
+
837
+ # Ezze
838
+ Ezze:
839
+ regex: 'EZZE-|EZ[a-z0-9]+'
840
+ device: 'feature phone'
841
+ models:
842
+ - regex: 'EZZE-([a-z0-9]+)'
843
+ model: '$1'
844
+ - regex: 'EZ([a-z0-9]+)'
845
+ model: 'EZ$1'
846
+
847
+ # Ezio
848
+ Ezio:
849
+ regex: 'EZIO-([a-z0-9]+)'
850
+ device: 'feature phone'
851
+ model: '$1'
852
+
853
+ # Gemini
854
+ Gemini:
855
+ regex: '(GEM[0-9]+[a-z]*)'
856
+ device: 'tablet'
857
+ model: '$1'
858
+
859
+ # Gigabyte
860
+ Gigabyte:
861
+ regex: 'GSmart [a-z0-9 ]+ Build|Gigabyte-[a-z0-9]+'
862
+ device: 'smartphone'
863
+ models:
864
+ - regex: '(GSmart [a-z0-9 ]+) Build'
865
+ model: '$1'
866
+ - regex: 'Gigabyte-([a-z0-9]+)'
867
+ model: '$1'
868
+
869
+ # Gigaset
870
+ Gigaset:
871
+ regex: 'Gigaset QV(1030|830)'
872
+ device: 'tablet'
873
+ model: 'Gigaset QV$1'
874
+
875
+ # Gionee
876
+ Gionee:
877
+ regex: 'GIONEE-[a-z0-9]+'
878
+ device: 'smartphone'
879
+ models:
880
+ - regex: 'GIONEE-([a-z0-9]+).*Android'
881
+ model: '$1'
882
+ - regex: 'Android.*GIONEE-([a-z0-9]+)'
883
+ model: '$1'
884
+ - regex: 'GIONEE-([a-z0-9]+)'
885
+ model: '$1'
886
+ device: 'feature phone'
887
+
888
+ # Google
889
+ Google:
890
+ regex: 'Nexus|GoogleTV|Glass'
891
+ device: 'smartphone'
892
+ models:
893
+ - regex: 'Glass'
894
+ model: 'Glass'
895
+ - regex: 'Galaxy Nexus'
896
+ model: 'Galaxy Nexus'
897
+ - regex: '(Nexus (?:S|4|5|6|One))'
898
+ model: '$1'
899
+ - regex: '(Nexus (?:7|9|10))'
900
+ device: 'tablet'
901
+ model: '$1'
902
+ - regex: 'GoogleTV'
903
+ device: 'tv'
904
+ model: 'GoogleTV'
905
+
906
+ # Gradiente
907
+ Gradiente:
908
+ regex: 'GRADIENTE'
909
+ device: 'feature phone'
910
+ models:
911
+ - regex: 'GRADIENTE-([a-z0-9]+)'
912
+ model: '$1'
913
+ - regex: 'GRADIENTE ([a-z0-9\-]+)'
914
+ model: '$1'
915
+
916
+ # Grundig
917
+ Grundig:
918
+ regex: 'GR?-TB[0-9]+[a-z]*|GRUNDIG|portalmmm/2\.0 G'
919
+ device: 'tv'
920
+ models:
921
+ - regex: '(GR?-TB[0-9]+[a-z]*)'
922
+ device: 'tablet'
923
+ model: '$1'
924
+ - regex: 'GRUNDIG ([a-z0-9]+)'
925
+ model: '$1'
926
+ - regex: 'portalmmm/2\.0 G([a-z0-9]+)'
927
+ model: 'G$1'
928
+
929
+ # Haier
930
+ Haier:
931
+ regex: 'Haier'
932
+ device: 'smartphone'
933
+ models:
934
+ - regex: 'Haier[ _-](H[WT]-[^/;]+) Build'
935
+ model: '$1'
936
+ - regex: 'Haier[ _-](H[WT]-[a-z0-9_-]+)'
937
+ model: '$1'
938
+ - regex: 'Haier[ _-](sy[0-9]+)'
939
+ model: '$1'
940
+ - regex: 'Haier[ _-]([a-z0-9\-]+)'
941
+ model: '$1'
942
+ device: 'feature phone'
943
+
944
+ # Huawei
945
+ Huawei:
946
+ regex: '(HW-)?Huawei|Ideos|vodafone[a-z0-9]+'
947
+ device: 'smartphone'
948
+ models:
949
+ - regex: '(MediaPad[^/;]*) Build'
950
+ device: 'tablet'
951
+ model: '$1'
952
+ - regex: 'Ideos([^;/]*) Build'
953
+ model: 'Ideos$1'
954
+ - regex: 'Huawei[ _-]?([^/;]*) Build'
955
+ model: '$1'
956
+ - regex: '(?:HW-)?Huawei(?:/1\.0/0?(?:Huawei))?[_\- /]?([a-z0-9\-_]+)'
957
+ model: '$1'
958
+ - regex: 'Huawei; ([a-z0-9 -]+)'
959
+ model: '$1'
960
+ - regex: 'vodafone([a-z0-9]+)'
961
+ model: 'Vodafone $1'
962
+
963
+ # iBall
964
+ iBall:
965
+ regex: 'iBall[ _]([^/;]*)[ _]Build'
966
+ device: 'tablet'
967
+ model: '$1'
968
+
969
+ iBerry:
970
+ regex: 'AUXUS ([^/;]+) Build'
971
+ device: 'smartphone'
972
+ models:
973
+ - regex: 'AUXUS (Core[^/;]+) Build'
974
+ device: 'tablet'
975
+ model: '$1'
976
+ - regex: 'AUXUS ([^/;]+) Build'
977
+ model: '$1'
978
+
979
+ # Infinix
980
+ Infinix:
981
+ regex: 'Infinix'
982
+ device: 'smartphone'
983
+ models:
984
+ - regex: 'Infinix (X[78]00)'
985
+ device: 'tablet'
986
+ model: '$1'
987
+ - regex: 'Infinix (X\d+)'
988
+ model: '$1'
989
+ - regex: 'Infinix[ _]([a-z0-9_-]+)'
990
+ model: '$1'
991
+
992
+ # Inkti
993
+ Inkti:
994
+ regex: 'intki[ _]([^/;]*)[ _]Build'
995
+ device: 'smartphone'
996
+ model: '$1'
997
+
998
+ # Innostream
999
+ Innostream:
1000
+ regex: 'INNO([a-z0-9]+)'
1001
+ device: 'feature phone'
1002
+ model: 'INNO$1'
1003
+
1004
+ # Inq
1005
+ INQ:
1006
+ regex: 'INQ[/ ]'
1007
+ device: 'feature phone'
1008
+ models:
1009
+ - regex: 'INQ/([a-z0-9\-]+)'
1010
+ model: '$1'
1011
+ - regex: 'INQ ([^;/]+) Build'
1012
+ model: '$1'
1013
+ device: 'smartphone'
1014
+
1015
+ # Intex
1016
+ Intex:
1017
+ regex: 'Intex|(Aqua|Cloud)[ _\.]([^/;\)]+)(?:[ _]Build|(?<!Build)/|\))'
1018
+ device: 'smartphone'
1019
+ models:
1020
+ - regex: 'Intex[ _]([^/;]*)[ _]Build'
1021
+ model: '$1'
1022
+ - regex: '(Aqua|Cloud)[ _\.]([^/;\)]+)(?:[ _]Build|(?<!Build)/|\))'
1023
+ model: '$1 $2'
1024
+ - regex: 'Intex[ _]([a-z0-9_+-]+)'
1025
+ model: '$1'
1026
+
1027
+ # i-mate
1028
+ i-mate:
1029
+ regex: 'i-mate ([a-z0-9]+)'
1030
+ device: 'feature phone'
1031
+ model: '$1'
1032
+
1033
+ # i-mobile
1034
+ i-mobile:
1035
+ regex: 'i-mobile ?[a-z0-9]+'
1036
+ device: 'feature phone'
1037
+ models:
1038
+ - regex: 'i-mobile (i-note[^/;]*) Build'
1039
+ model: '$1'
1040
+ device: 'tablet'
1041
+ - regex: 'i-mobile ((?:IQ|i-style)[^/;]*) Build'
1042
+ model: '$1'
1043
+ device: 'smartphone'
1044
+ - regex: 'i-mobile(?: )?([a-z0-9\- ]+) Build'
1045
+ model: '$1'
1046
+ - regex: 'i-mobile(?: )?([a-z0-9]+)'
1047
+ model: '$1'
1048
+
1049
+ # ikomo
1050
+ iKoMo:
1051
+ regex: 'iKoMo ([a-z0-9]+)'
1052
+ device: 'feature phone'
1053
+ model: '$1'
1054
+
1055
+ # iTel
1056
+ iTel:
1057
+ regex: 'itel|iNote'
1058
+ device: 'smartphone'
1059
+ models:
1060
+ - regex: 'iNote ([^/;]*)Build'
1061
+ model: 'iNote $1'
1062
+ - regex: 'iNote_([a-z0-9\-_]+)'
1063
+ model: 'iNote $1'
1064
+ - regex: 'iTel ([^/;]*)Build'
1065
+ model: '$1'
1066
+ - regex: 'iTel_([a-z0-9\-_]*)'
1067
+ model: '$1'
1068
+
1069
+ #Jiayu
1070
+ Jiayu:
1071
+ regex: '(JY-[a-z0-9]+) Build'
1072
+ device: 'smartphone'
1073
+ model: '$1'
1074
+
1075
+ # Jolla
1076
+ Jolla:
1077
+ regex: 'Jolla'
1078
+ device: 'smartphone'
1079
+ model: ''
1080
+
1081
+ # Kazam
1082
+ Kazam:
1083
+ regex: 'Kazam ([^;/]+) Build|Trooper_X[0-9][0-9] Build'
1084
+ device: 'smartphone'
1085
+ models:
1086
+ - regex: 'Trooper_X([0-9])([0-9]) Build'
1087
+ model: 'Trooper X$1.$2'
1088
+ - regex: 'Kazam ([^;/]+) Build'
1089
+ model: '$1'
1090
+
1091
+ # KT-Tech
1092
+ KT-Tech:
1093
+ regex: '(KM-[a-z0-9]+|EV-[a-z0-9]+) Build'
1094
+ device: 'smartphone'
1095
+ model: '$1'
1096
+
1097
+ # kddi
1098
+ KDDI:
1099
+ regex: 'kddi-([a-z0-9]+)'
1100
+ device: 'feature phone'
1101
+ model: '$1'
1102
+
1103
+ #k-touch
1104
+ K-Touch:
1105
+ regex: 'K-Touch[ _][a-z0-9]+'
1106
+ device: 'smartphone'
1107
+ models:
1108
+ - regex: 'K-Touch[ _]([^/;]*)[ _]Build'
1109
+ model: '$1'
1110
+ - regex: 'K-Touch[ _]([a-z0-9]+)'
1111
+ model: '$1'
1112
+
1113
+ # kyocera
1114
+ Kyocera:
1115
+ regex: 'Kyocera|KWC-|QC-|C5170|C5155|C5215|C6750|C6522N?|S2151'
1116
+ device: 'smartphone'
1117
+ models:
1118
+ # explicit smartphone models
1119
+ - regex: 'C5155'
1120
+ model: 'Rise'
1121
+ - regex: 'C5170'
1122
+ model: 'Hydro'
1123
+ - regex: 'C5215'
1124
+ model: 'Hydro EDGE'
1125
+ - regex: 'C6522N?'
1126
+ model: 'Hydro XTRM'
1127
+ - regex: 'C6750'
1128
+ model: 'Hydro ELITE'
1129
+
1130
+ # explicit feature phone models
1131
+ - regex: 'S2151'
1132
+ model: 'Coast'
1133
+ device: 'feature phone'
1134
+
1135
+ - regex: 'Kyocera-KZ-([a-z0-9]+)'
1136
+ model: 'KZ $1'
1137
+ - regex: 'Kyocera(?:[\-/])?([a-z0-9]+)'
1138
+ model: '$1'
1139
+ - regex: '(?:KWC|QC)-([a-z0-9]+)'
1140
+ model: '$1'
1141
+
1142
+ # Lava
1143
+ Lava:
1144
+ regex: 'iris[ _]?([^/;]+)(?:\)| Build)'
1145
+ device: 'smartphone'
1146
+ models:
1147
+ - regex: 'iris[ _]?([^/;]+)(?:\)| Build)'
1148
+ model: 'Iris $1'
1149
+
1150
+ # lanix
1151
+ Lanix:
1152
+ regex: 'LANIX-([a-z0-9]+)'
1153
+ device: 'feature phone'
1154
+ model: '$1'
1155
+
1156
+ # lct
1157
+ LCT:
1158
+ regex: 'LCT_([a-z0-9]+)'
1159
+ device: 'feature phone'
1160
+ model: '$1'
1161
+
1162
+ # lenco
1163
+ Lenco:
1164
+ regex: 'Lenco ([^/;]*) Build'
1165
+ device: 'tablet'
1166
+ model: '$1'
1167
+
1168
+ # lenovo
1169
+ Lenovo:
1170
+ regex: '(?:LNV-)?Lenovo|IdeaTab'
1171
+ device: 'smartphone'
1172
+ models:
1173
+ - regex: 'Lenovo (B[0-9]+[^/;]*) Build'
1174
+ model: 'IdeaTab $1'
1175
+ device: 'tablet'
1176
+ - regex: 'Lenovo ([^/;]*) Build'
1177
+ model: '$1'
1178
+ - regex: '(?:LNV-|Lenovo-)?Lenovo[ \-_]([a-z0-9_+-]+)'
1179
+ model: '$1'
1180
+ - regex: 'IdeaTab[ \-_]?([a-z0-9]+)'
1181
+ model: 'IdeaTab $1'
1182
+ device: 'tablet'
1183
+
1184
+ # lexibook
1185
+ Lexibook:
1186
+ regex: '(MFC[0-9]{3}[a-z]{2,})'
1187
+ device: 'tablet'
1188
+ models:
1189
+ # Explicit tablet models
1190
+ - regex: 'MFC191FR'
1191
+ model: 'Tablet Ultra 3 XL'
1192
+ - regex: 'MFC045FR'
1193
+ model: 'TabTab'
1194
+ - regex: 'MFC163FR'
1195
+ model: 'Tablet Master 3'
1196
+ - regex: 'MFC142FR'
1197
+ model: 'Tablet Kids'
1198
+ - regex: 'MFC250FR'
1199
+ model: 'Tablet Junior'
1200
+ - regex: 'MFC270FR'
1201
+ model: 'Tablet Junior Power Touch'
1202
+ - regex: 'MFC280FR'
1203
+ model: 'Tablet Junior 2'
1204
+ - regex: 'MFC156FR'
1205
+ model: 'Tablet One'
1206
+ - regex: 'MFC155FR'
1207
+ model: 'Tablet Master'
1208
+ - regex: 'MFC157FR'
1209
+ model: 'Tablet Master 2'
1210
+ - regex: 'MFC17[05]FR'
1211
+ model: 'Tablet Ultra'
1212
+ - regex: 'MFC375FR'
1213
+ model: 'Tablet Ultra 2'
1214
+ - regex: 'MFC162FR'
1215
+ model: 'Power Tablet'
1216
+ - regex: 'MFC180FR'
1217
+ model: 'Tablet Advanced'
1218
+ - regex: 'MFC181FR'
1219
+ model: 'Tablet Advanced 2'
1220
+ - regex: 'MFC500FR'
1221
+ model: 'Tablet XL'
1222
+ - regex: 'MFC190BBFR'
1223
+ model: 'Barbie Tablet'
1224
+ - regex: 'MFC195DCFR'
1225
+ model: 'Tablet Disney Cars HD'
1226
+ - regex: 'MFC195FUFR'
1227
+ model: 'Furby Tablet'
1228
+ - regex: 'MFC195DPFR'
1229
+ model: 'Tablet Disney Princesse HD'
1230
+ - regex: 'MFC140FR'
1231
+ model: 'LapTab'
1232
+ - regex: 'MFC141FR'
1233
+ model: 'LapTab 2'
1234
+
1235
+ - regex: '(MFC[0-9]{3}[a-z]{2,})'
1236
+ model: '$1'
1237
+
1238
+ # lg
1239
+ LG:
1240
+ regex: 'LG|portalmmm/2\.0 (?:KE|KG|KP|L3)|VX[0-9]+'
1241
+ device: 'smartphone'
1242
+ models:
1243
+ - regex: 'LGE_DLNA_SDK|NetCast'
1244
+ device: 'tv'
1245
+ model: 'NetCast'
1246
+ - regex: 'LGE(?: |-LG| LG-AX|-)([a-z0-9]+)'
1247
+ model: '$1'
1248
+ - regex: 'LGE;([a-z0-9\-]+)'
1249
+ model: '$1'
1250
+ - regex: 'LG[ _-](V90.*|Optimus[ _-]Pad.*) Build'
1251
+ device: 'tablet'
1252
+ model: '$1'
1253
+ - regex: 'LG(?:/|-LG| |-)?([^/;]*) Build'
1254
+ model: '$1'
1255
+ - regex: 'LG(?:/|-LG| |-)?([a-z0-9]+)'
1256
+ model: '$1'
1257
+ - regex: 'LG; ([a-z0-9 ]+)'
1258
+ model: '$1'
1259
+ - regex: 'portalmmm/2.0 ((?:KE|KG|KP|L3)[a-z0-9]+)'
1260
+ model: '$1'
1261
+ - regex: '(VX[0-9]+)'
1262
+ model: '$1'
1263
+
1264
+ # Logicom
1265
+ Logicom:
1266
+ regex: '(TAB950|TAB1062|E731|E812|E912|E1031) Build'
1267
+ device: 'tablet'
1268
+ model: '$1'
1269
+
1270
+ # microsoft
1271
+ Microsoft:
1272
+ regex: 'KIN\.(One|Two)'
1273
+ device: 'feature phone'
1274
+ model: 'Kin $1'
1275
+
1276
+ # Konka
1277
+ Konka:
1278
+ regex: 'KONKA[_ ]([a-z0-9]+)'
1279
+ device: 'smartphone'
1280
+ models:
1281
+ # Explicit smartphone models
1282
+ - regex: 'E5660S'
1283
+ model: 'Viva 5660s'
1284
+ - regex: 'W830'
1285
+ model: 'Tango 830'
1286
+ - regex: 'W(9[67]0)'
1287
+ model: 'Expose $1'
1288
+ - regex: 'W990'
1289
+ model: 'Tuxedo 990'
1290
+
1291
+ - regex: 'KONKA[_ ]([a-z0-9]+)'
1292
+ device: 'feature phone'
1293
+ model: '$1'
1294
+
1295
+ # Karbonn
1296
+ Karbonn:
1297
+ regex: '(?:Browser-)?Karbonn'
1298
+ device: 'smartphone'
1299
+ models:
1300
+ - regex: 'Karbonn ([a-z0-9]+) WAP-Browser'
1301
+ model: '$1'
1302
+ device: 'feature phone'
1303
+ - regex: 'WAP Browser-Karbonn ([a-z0-9]+)/'
1304
+ model: '$1'
1305
+ device: 'feature phone'
1306
+ - regex: 'Karbonn_([^;/)]+)'
1307
+ model: '$1'
1308
+ - regex: 'Karbonn ([^;/]+) Build'
1309
+ model: '$1'
1310
+ - regex: 'Karbonn ([^;/]+)/'
1311
+ model: '$1'
1312
+
1313
+ # Sagem
1314
+ Sagem:
1315
+ regex: 'SAGEM|portalmmm/2.0 (?:SG|my)'
1316
+ device: 'smartphone'
1317
+ models:
1318
+ - regex: 'SAGEM-(my[a-z0-9-]+)'
1319
+ model: '$1'
1320
+ device: 'feature phone'
1321
+ - regex: 'SAGEM ([a-z0-9]+)'
1322
+ model: '$1'
1323
+ - regex: 'SAGEM-([a-z0-9\-]+)'
1324
+ model: '$1'
1325
+ - regex: 'portalmmm/2.0 ((?:SG|my)[a-z0-9]+)'
1326
+ model: '$1'
1327
+
1328
+ # Coby Kyros
1329
+ Coby Kyros:
1330
+ regex: '(MID(?:1024|1125|1126|1045|1048|1060|1065|4331|7012|7015A?|7016|7022|7032|7035|7036|7042|7047|7048|7052|7065|7120|8024|8042|8048|8065|8125|8127|8128|9724|9740|9742)) Build'
1331
+ device: 'tablet'
1332
+ model: '$1'
1333
+
1334
+ # Mpman
1335
+ Mpman:
1336
+ regex: '(?:MPQC|MPDC)[0-9]+|PH(?:150|340|350|360|451|500|520)|(?:MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7) Build'
1337
+ device: 'tablet'
1338
+ models:
1339
+ - regex: '((?:MPQC|MPDC)[0-9]+[^/;]+) Build'
1340
+ model: '$1'
1341
+ - regex: '(MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7) Build'
1342
+ model: '$1'
1343
+ - regex: '(PH(?:150|340|350|360|451|500|520))'
1344
+ model: '$1'
1345
+ device: 'smartphone'
1346
+
1347
+
1348
+ # Manta Multimedia
1349
+ Manta Multimedia:
1350
+ regex: '(MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|1001|1002|1003|1004(?: 3G)?|1005|7802|9701|9702)) Build'
1351
+ device: 'tablet'
1352
+ model: '$1'
1353
+
1354
+ #Medion
1355
+ Medion:
1356
+ regex: 'Medion|(?:MD_)?LIFETAB'
1357
+ device: 'smartphone'
1358
+ models:
1359
+ - regex: '(?:MD_)?LIFETAB_([a-z0-9]+)'
1360
+ device: 'tablet'
1361
+ model: 'Lifetab $1'
1362
+ - regex: 'Medion(?: Smartphone)? ([^/;]+) Build'
1363
+ model: '$1'
1364
+
1365
+ # Memup
1366
+ Memup:
1367
+ regex: 'SlidePad ?([^;/]*) Build'
1368
+ device: 'tablet'
1369
+ model: 'SlidePad $1'
1370
+
1371
+ # mio
1372
+ Mio:
1373
+ regex: 'MIO(?:/)?([a-z0-9]+)'
1374
+ device: 'smartphone'
1375
+ model: '$1'
1376
+
1377
+ # mitsubishi
1378
+ Mitsubishi:
1379
+ regex: 'MITSU|portalmmm/[12]\.0 M'
1380
+ device: 'feature phone'
1381
+ models:
1382
+ - regex: 'MITSU/[a-z0-9.]+ \(([a-z0-9]+)\)'
1383
+ model: '$1'
1384
+ - regex: 'MITSU[ \-]?([a-z0-9]+)'
1385
+ model: '$1'
1386
+ - regex: 'portalmmm/[12]\.0 (M[a-z0-9]+)'
1387
+ model: '$1'
1388
+
1389
+ # Mobistel
1390
+ Mobistel:
1391
+ regex: '(Cynus [^/;]+) Build'
1392
+ device: 'smartphone'
1393
+ model: '$1'
1394
+
1395
+ # motorola
1396
+ Motorola:
1397
+ regex: 'MOT|(?<!AN)DROID ?(?:Build|[a-z0-9]+)|portalmmm/2.0 (?:E378i|L6|L7|v3)|XOOM [^;/]*Build|(?:XT|MZ|MB|ME)[0-9]{3,4}[a-z]?(?:\(Defy\))?(?: Build|\))'
1398
+ device: 'smartphone'
1399
+ models:
1400
+ # Explicit feature phone models
1401
+ - regex: 'MOT-V360'
1402
+ model: 'V360'
1403
+ device: 'feature phone'
1404
+
1405
+ # Explicit smartphone models
1406
+ - regex: '(?:MOT-|Motorola-)?XT300'
1407
+ model: 'Spice'
1408
+ - regex: '(?:MOT-|Motorola-)?XT30[35]'
1409
+ model: 'Motosmart ME'
1410
+ - regex: '(?:MOT-|Motorola-)?XT31[16]'
1411
+ model: 'Fire'
1412
+ - regex: '(?:MOT-|Motorola-)?XT32[01]'
1413
+ model: 'Defy Mini'
1414
+ - regex: '(?:MOT-|Motorola-)?XT3(?:89|90)'
1415
+ model: 'Motosmart'
1416
+ - regex: '(?:MOT-|Motorola-)?XT502'
1417
+ model: 'Quench'
1418
+ - regex: '(?:MOT-|Motorola-)?XT531'
1419
+ model: 'Fire XT'
1420
+ - regex: '(?:MOT-|Motorola-)?XT535'
1421
+ model: 'Defy'
1422
+ - regex: '(?:MOT-|Motorola-)?XT55[567]C?'
1423
+ model: 'Defy XT'
1424
+ - regex: '(?:MOT-|Motorola-)?XT603'
1425
+ model: 'Admiral'
1426
+ - regex: '(?:MOT-|Motorola-)?XT610'
1427
+ model: 'Droid Pro'
1428
+ - regex: '(?:MOT-|Motorola-)?XT615'
1429
+ model: 'Motoluxe'
1430
+ - regex: '(?:MOT-|Motorola-)?XT621'
1431
+ model: 'Primus'
1432
+ - regex: '(?:MOT-|Motorola-)?XT626'
1433
+ model: 'IronRock'
1434
+ - regex: '(?:MOT-|Motorola-)?XT682'
1435
+ model: 'Atrix'
1436
+ - regex: '(?:MOT-|Motorola-)?XT685'
1437
+ model: 'Motoluxe Dual-SIM'
1438
+ - regex: '(?:MOT-|Motorola-)?XT687'
1439
+ model: 'Atrix TV'
1440
+ - regex: '(?:MOT-|Motorola-)?XT720'
1441
+ model: 'Milestone'
1442
+ - regex: '(?:MOT-|Motorola-)?XT800W'
1443
+ model: 'Glam'
1444
+ - regex: '(?:MOT-|Motorola-)?XT860'
1445
+ model: 'Milestone 3'
1446
+ - regex: '(?:MOT-|Motorola-)?XT881'
1447
+ model: 'Electrify 2'
1448
+ - regex: '(?:MOT-|Motorola-)?XT882'
1449
+ model: 'Moto XT882'
1450
+ - regex: '(?:MOT-|Motorola-)?XT88[56]'
1451
+ model: 'Droid RAZR V'
1452
+ - regex: '(?:MOT-|Motorola-)?XT890'
1453
+ model: 'Droid RAZR i'
1454
+ - regex: '(?:MOT-|Motorola-)?XT894'
1455
+ model: 'Droid 4'
1456
+ - regex: '(?:MOT-|Motorola-)?XT897'
1457
+ model: 'Photon Q'
1458
+ - regex: '(?:MOT-|Motorola-)?XT901'
1459
+ model: 'Electrify M'
1460
+ - regex: '(?:MOT-|Motorola-)?XT90[567]'
1461
+ model: 'Droid RAZR M'
1462
+ - regex: '(?:MOT-|Motorola-)?XT910S?'
1463
+ model: 'Droid RAZR'
1464
+ - regex: '(?:MOT-|Motorola-)?XT91[4568]'
1465
+ model: 'Droid RAZR D1'
1466
+ - regex: '(?:MOT-|Motorola-)?XT9(?:19|20)'
1467
+ model: 'Droid RAZR D3'
1468
+ - regex: '(?:MOT-|Motorola-)?XT925'
1469
+ model: 'Droid RAZR HD'
1470
+ - regex: '(?:MOT-|Motorola-)?XT1022'
1471
+ model: 'Moto E'
1472
+ - regex: '(?:MOT-|Motorola-)?XT1030'
1473
+ model: 'Droid Mini'
1474
+ - regex: '(?:MOT-|Motorola-)?XT10(?:28|3[1234])'
1475
+ model: 'Moto G'
1476
+ - regex: '(?:MOT-|Motorola-)?XT10(?:49|5[23568]|60)'
1477
+ model: 'Moto X'
1478
+ - regex: '(?:MOT-|Motorola-)?XT1080'
1479
+ model: 'Droid Ultra'
1480
+
1481
+ - regex: 'Motorola[ _\-]([a-z0-9]+)'
1482
+ model: '$1'
1483
+ - regex: 'MOTORAZR[ _\-]([a-z0-9]+)'
1484
+ model: 'RAZR $1'
1485
+ - regex: 'MOTORIZR[ _\-]([a-z0-9]+)'
1486
+ model: 'RIZR $1'
1487
+ - regex: 'MOT[O]?[_\-]?([a-z0-9.]+)'
1488
+ model: '$1'
1489
+ - regex: '(?<!AN)DROID ?([a-z0-9 ]*) Build'
1490
+ model: 'DROID $1'
1491
+ - regex: '(?<!AN)DROID ?([a-z0-9]+)'
1492
+ model: 'DROID $1'
1493
+ - regex: 'portalmmm/2.0 ((?:E378i|L6|L7|V3)[a-z0-9]+)'
1494
+ model: '$1'
1495
+ - regex: '(XOOM [^;/]*)Build'
1496
+ device: 'tablet'
1497
+ model: '$1'
1498
+ - regex: '(MZ[0-9]{3}) Build'
1499
+ device: 'tablet'
1500
+ model: '$1'
1501
+ - regex: '((?:ME|MB|XT)[0-9]{3,4}(?:\(Defy\))?) Build'
1502
+ model: '$1'
1503
+
1504
+ # myphone
1505
+ MyPhone:
1506
+ regex: '(?:MyPhone|MyPad) .+ Build'
1507
+ device: 'smartphone'
1508
+ models:
1509
+ - regex: 'MyPad (.+) Build'
1510
+ model: 'MyPad $1'
1511
+ device: 'tablet'
1512
+ - regex: 'MyPhone (.+) Build'
1513
+ model: '$1'
1514
+
1515
+ # nec
1516
+ NEC:
1517
+ regex: 'NEC|KGT/2\.0|portalmmm/1\.0 (?:DB|N)|(?:portalmmm|o2imode)/2.0[ ,]N'
1518
+ device: 'smartphone'
1519
+ models:
1520
+ - regex: '(?:NEC-|KGT/2\.0 )([a-z0-9]+)'
1521
+ model: '$1'
1522
+ - regex: 'portalmmm/1\.0 ((?:DB|N)[a-z0-9]+)'
1523
+ model: '$1'
1524
+ - regex: '(?:portalmmm|o2imode)/2\.0[ ,](N[a-z0-9]+)'
1525
+ model: '$1'
1526
+
1527
+ # newgen
1528
+ Newgen:
1529
+ regex: 'NEWGEN\-([a-z0-9]+)'
1530
+ device: 'feature phone'
1531
+ model: '$1'
1532
+
1533
+ # ngm
1534
+ NGM:
1535
+ regex: 'NGM_[a-z0-9]+|(Forward|Dynamic)[ _][^/;]+(?:Build|/)'
1536
+ device: 'smartphone'
1537
+ models:
1538
+ - regex: '((?:Forward|Dynamic)[ _][^/;]+) Build'
1539
+ model: '$1'
1540
+ - regex: '((?:Forward|Dynamic)[ _][^/;]+)/'
1541
+ model: '$1'
1542
+ - regex: 'NGM_([a-z0-9]+)'
1543
+ model: '$1'
1544
+
1545
+ # nexian
1546
+ Nexian:
1547
+ regex: 'S?Nexian'
1548
+ device: 'smartphone'
1549
+ models:
1550
+ - regex: 'S?Nexian[ ]?([a-z0-9\-]+)'
1551
+ model: '$1'
1552
+ - regex: 'S?Nexian-([a-z0-9]+)'
1553
+ model: '$1'
1554
+
1555
+ # o2
1556
+ O2:
1557
+ regex: 'Xda|O2[ \-]|COCOON'
1558
+ device: 'smartphone'
1559
+ models:
1560
+ - regex: '(Xda[ _][a-z0-9_]+)'
1561
+ model: '$1'
1562
+ - regex: '(COCOON)'
1563
+ model: '$1'
1564
+ - regex: 'O2 ([a-z0-9 ]+)'
1565
+ model: '$1'
1566
+ - regex: 'O2-([a-z0-9]+)'
1567
+ model: '$1'
1568
+
1569
+ # onda
1570
+ Onda:
1571
+ regex: 'Onda'
1572
+ device: 'smartphone'
1573
+ models:
1574
+ # explicit tablet models
1575
+ - regex: 'ONDA MID'
1576
+ model: 'MID'
1577
+ device: 'tablet'
1578
+
1579
+ - regex: '([a-z0-9]+)[ _]Onda'
1580
+ model: '$1'
1581
+ - regex: 'Onda ([a-z0-9]+)'
1582
+ model: '$1'
1583
+
1584
+ # oppo
1585
+ OPPO:
1586
+ regex: 'OPPO[ _]?([a-z0-9]+)|X9006'
1587
+ device: 'smartphone'
1588
+ models:
1589
+ - regex: 'OPPO[ _]?([a-z0-9]+)'
1590
+ model: '$1'
1591
+ - regex: 'X9006'
1592
+ model: 'Find 7a'
1593
+
1594
+ # Opsson
1595
+ Opsson:
1596
+ regex: 'Opsson ([^/;]+) Build'
1597
+ device: 'smartphone'
1598
+ model: '$1'
1599
+
1600
+ # orange
1601
+ Orange:
1602
+ regex: 'SPV[ \-]?([a-z0-9]+)|Orange ([^/;]+) Build'
1603
+ device: 'smartphone'
1604
+ models:
1605
+ - regex: 'Orange ([^/;]+) Build'
1606
+ model: '$1'
1607
+ - regex: 'SPV[ \-]?([a-z0-9]+)'
1608
+ model: 'SPV $1'
1609
+
1610
+ # Oysters
1611
+ Oysters:
1612
+ regex: 'Oysters'
1613
+ device: 'tablet'
1614
+ models:
1615
+ - regex: 'Oysters ((?:Arctic|Indian|Atlantic|Pacific)[^/;]+) Build'
1616
+ device: 'smartphone'
1617
+ model: '$1'
1618
+ - regex: 'Oysters ([^/;]+) Build'
1619
+ model: '$1'
1620
+
1621
+ # panasonic
1622
+ Panasonic:
1623
+ regex: 'Panasonic'
1624
+ device: 'smartphone'
1625
+ models:
1626
+ - regex: 'Panasonic MIL DLNA'
1627
+ device: 'tv'
1628
+ model: 'Viera Cast'
1629
+ - regex: 'Panasonic[ \-]?([a-z0-9]+)'
1630
+ model: '$1'
1631
+ - regex: 'portalmmm/2.0 (P[a-z0-9]+)'
1632
+ model: '$1'
1633
+
1634
+ # philips
1635
+ Philips:
1636
+ regex: 'Philips'
1637
+ device: 'smartphone'
1638
+ models:
1639
+ - regex: 'Philips-FISIO ([a-z0-9]+)'
1640
+ model: 'Fisio $1'
1641
+ - regex: 'Philips[ ]?([a-z0-9]+)'
1642
+ model: '$1'
1643
+ - regex: 'Philips-([a-z0-9\-@]+)'
1644
+ model: '$1'
1645
+
1646
+ # phoneOne
1647
+ phoneOne:
1648
+ regex: 'phoneOne[ \-]?([a-z0-9]+)'
1649
+ device: 'smartphone'
1650
+ model: '$1'
1651
+
1652
+ # Rover
1653
+ Rover:
1654
+ regex: 'Rover ([0-9]+)'
1655
+ device: 'feature phone'
1656
+ model: '$1'
1657
+
1658
+ # Siemens
1659
+ Siemens:
1660
+ regex: 'SIEMENS|SIE-|portalmmm/2\.0 SI|S55|SL45i'
1661
+ device: 'smartphone'
1662
+ models:
1663
+ - regex: 'SIEMENS[ \-]([a-z0-9]+)'
1664
+ model: '$1'
1665
+ - regex: 'SIE(?:MENS )?[\-]?([a-z0-9]+)'
1666
+ model: '$1'
1667
+ - regex: '(S55|SL45i)'
1668
+ model: '$1'
1669
+ - regex: 'portalmmm/2.0 (SI[a-z0-9]+)'
1670
+ model: '$1'
1671
+
1672
+ # Samsung
1673
+ Samsung:
1674
+ regex: 'SAMSUNG|SC-(?:02C|04E|01F)|S(?:CH|GH|PH|EC|AM|HV|HW|M)-|SMART-TV|GT-|Galaxy|(?:portalmmm|o2imode)/2\.0 [SZ]|sam[rua]'
1675
+ device: 'smartphone'
1676
+ models:
1677
+ # explicit tablet models
1678
+ - regex: '(?:SAMSUNG-)?GT-P1000M?'
1679
+ device: 'tablet'
1680
+ model: 'GALAXY Tab'
1681
+ - regex: '(?:SAMSUNG-)?GT-P3100B?'
1682
+ device: 'tablet'
1683
+ model: 'GALAXY Tab 2 7"'
1684
+ - regex: '(?:SAMSUNG-)?GT-P311[03]'
1685
+ device: 'tablet'
1686
+ model: 'GALAXY Tab 2 7" WiFi'
1687
+ - regex: '(?:SAMSUNG-)?GT-P5100'
1688
+ device: 'tablet'
1689
+ model: 'GALAXY Tab 2 10.1"'
1690
+ - regex: '(?:SAMSUNG-)?GT-P511[03]'
1691
+ device: 'tablet'
1692
+ model: 'GALAXY Tab 2 10.1" WiFi'
1693
+ - regex: '(?:SAMSUNG-)?GT-P5200'
1694
+ device: 'tablet'
1695
+ model: 'GALAXY Tab 3 10.1"'
1696
+ - regex: '(?:SAMSUNG-)?GT-P5210'
1697
+ device: 'tablet'
1698
+ model: 'GALAXY Tab 3 10.1" WiFi'
1699
+ - regex: '(?:SAMSUNG-)?GT-P5220'
1700
+ device: 'tablet'
1701
+ model: 'GALAXY Tab 3 10.1" LTE'
1702
+ - regex: '(?:SAMSUNG-)?GT-P6200'
1703
+ device: 'tablet'
1704
+ model: 'GALAXY Tab 7" Plus'
1705
+ - regex: '(?:SAMSUNG-)?GT-P6201'
1706
+ device: 'tablet'
1707
+ model: 'GALAXY Tab 7" Plus N'
1708
+ - regex: '(?:SAMSUNG-)?GT-P6810'
1709
+ device: 'tablet'
1710
+ model: 'GALAXY Tab 7.7"'
1711
+ - regex: '(?:SAMSUNG-)?GT-P7100'
1712
+ device: 'tablet'
1713
+ model: 'GALAXY Tab 10.1v'
1714
+ - regex: '(?:SAMSUNG-)?GT-P7500'
1715
+ device: 'tablet'
1716
+ model: 'GALAXY Tab 10.1" P7500'
1717
+ - regex: '(?:SAMSUNG-)?SM-P600'
1718
+ device: 'tablet'
1719
+ model: 'GALAXY Note 10.1" 2014 Edition WiFi'
1720
+ - regex: '(?:SAMSUNG-)?SM-P60[12]'
1721
+ device: 'tablet'
1722
+ model: 'GALAXY Note 10.1" 2014 Edition'
1723
+ - regex: '(?:SAMSUNG-)?SM-P605'
1724
+ device: 'tablet'
1725
+ model: 'GALAXY Note 10.1" 2014 Edition LTE'
1726
+ - regex: '(?:SAMSUNG-)?SM-P900'
1727
+ device: 'tablet'
1728
+ model: 'GALAXY NotePRO 12.2" WiFi'
1729
+ - regex: '(?:SAMSUNG-)?SM-P901'
1730
+ device: 'tablet'
1731
+ model: 'GALAXY NotePRO 12.2"'
1732
+ - regex: '(?:SAMSUNG-)?SM-P905'
1733
+ device: 'tablet'
1734
+ model: 'GALAXY NotePRO 12.2" LTE'
1735
+ - regex: '(?:SAMSUNG-)?SM-T110'
1736
+ device: 'tablet'
1737
+ model: 'GALAXY Tab 3 7.0" Lite WiFi'
1738
+ - regex: '(?:SAMSUNG-)?SM-T111'
1739
+ device: 'tablet'
1740
+ model: 'GALAXY Tab 3 7.0" Lite'
1741
+ - regex: '(?:SAMSUNG-)?SM-T2105'
1742
+ device: 'tablet'
1743
+ model: 'GALAXY Tab 3 7.0" Kids'
1744
+ - regex: '(?:SAMSUNG-)?SM-T210R?'
1745
+ device: 'tablet'
1746
+ model: 'GALAXY Tab 3 7.0" WiFi'
1747
+ - regex: '(?:SAMSUNG-)?SM-T21(?:1|7[AS])'
1748
+ device: 'tablet'
1749
+ model: 'GALAXY Tab 3 7.0"'
1750
+ - regex: '(?:SAMSUNG-)?SM-T230(?:NU)?'
1751
+ device: 'tablet'
1752
+ model: 'GALAXY Tab 4 7.0" WiFi'
1753
+ - regex: '(?:SAMSUNG-)?SM-T310'
1754
+ device: 'tablet'
1755
+ model: 'GALAXY Tab 3 8.0" WiFi'
1756
+ - regex: '(?:SAMSUNG-)?SM-T311'
1757
+ device: 'tablet'
1758
+ model: 'GALAXY Tab 3 8.0"'
1759
+ - regex: '(?:SAMSUNG-)?SM-T315'
1760
+ device: 'tablet'
1761
+ model: 'GALAXY Tab 3 8.0" LTE'
1762
+ - regex: '(?:SAMSUNG-)?SM-T520'
1763
+ device: 'tablet'
1764
+ model: 'GALAXY TabPRO 10.1" WiFi'
1765
+ - regex: '(?:SAMSUNG-)?SM-T320'
1766
+ device: 'tablet'
1767
+ model: 'GALAXY TabPRO 8.4" WiFi'
1768
+ - regex: '(?:SAMSUNG-)?SM-T325'
1769
+ device: 'tablet'
1770
+ model: 'GALAXY TabPRO 8.4" LTE'
1771
+ - regex: '(?:SAMSUNG-)?SM-T525'
1772
+ device: 'tablet'
1773
+ model: 'GALAXY TabPRO 10.1" LTE'
1774
+ - regex: '(?:SAMSUNG-)?SM-T530(?:NU)?'
1775
+ device: 'tablet'
1776
+ model: 'GALAXY Tab 4 10.1" WiFi'
1777
+ - regex: '(?:SAMSUNG-)?SM-T900'
1778
+ device: 'tablet'
1779
+ model: 'GALAXY TabPRO 12.2" WiFi'
1780
+
1781
+ # explicit smartphone models
1782
+ - regex: '(?:SAMSUNG-)?SM-C101'
1783
+ model: 'GALAXY S4 zoom'
1784
+ - regex: '(?:SAMSUNG-)?SM-C115'
1785
+ model: 'GALAXY K zoom'
1786
+ - regex: '(?:SAMSUNG-)?SM-G350'
1787
+ model: 'GALAXY CORE Plus'
1788
+ - regex: '(?:SAMSUNG-)?SM-G386F'
1789
+ model: 'GALAXY CORE LTE'
1790
+ - regex: '(?:SAMSUNG-)?SM-G3815'
1791
+ model: 'GALAXY EXPRESS II'
1792
+ - regex: '(?:SAMSUNG-)?SM-G9009D'
1793
+ model: 'GALAXY S5 Dual-SIM'
1794
+ - regex: '(?:SAMSUNG-)?SM-G900'
1795
+ model: 'GALAXY S5'
1796
+ - regex: '(?:SAMSUNG-)?SM-N7502'
1797
+ model: 'Galaxy Note 3 Neo Duos'
1798
+ - regex: '(?:SAMSUNG-)?SM-N750[L50]?'
1799
+ model: 'Galaxy Note 3 Neo'
1800
+ - regex: '(?:SAMSUNG-)?SM-N9002'
1801
+ model: 'GALAXY Note 3 Duos'
1802
+ - regex: '(?:SAMSUNG-)?SM-N900(?:[05689][VQ]?|[AKLPSTV]|W8)?'
1803
+ model: 'GALAXY Note 3'
1804
+ - regex: '(?:SAMSUNG-)?SM-N910'
1805
+ model: 'GALAXY Note 4'
1806
+ - regex: '(?:SAMSUNG-)?SM-N915'
1807
+ model: 'GALAXY Note 4 Edge'
1808
+
1809
+ # general detections
1810
+ - regex: '(?:SAMSUNG-)?(GT-(P|N8|N5)[0-9]+[a-z]?)'
1811
+ device: 'tablet'
1812
+ model: '$1'
1813
+ - regex: 'SC-02C'
1814
+ model: 'GALAXY S II'
1815
+ - regex: 'SC-01F'
1816
+ model: 'GALAXY Note 3'
1817
+ - regex: 'SC-04E'
1818
+ model: 'GALAXY S4'
1819
+ - regex: '(?:SAMSUNG-)?((?:SM-[TNP]|GT-P)[a-z0-9_-]+)'
1820
+ device: 'tablet'
1821
+ model: '$1'
1822
+ - regex: '((?:SCH|SGH|SPH|SHV|SHW|GT|SM)-[a-z0-9_-]+)'
1823
+ model: '$1'
1824
+ - regex: 'SAMSUNG[\-][ ]?([a-z0-9]+[\-_][a-z0-9]+)'
1825
+ model: '$1'
1826
+ - regex: 'SAMSUNG;[ ]?([a-z0-9]+[\-_][a-z0-9]+)'
1827
+ model: '$1'
1828
+ - regex: 'SAMSUNG[ _/-]?([a-z0-9\-]+)'
1829
+ model: '$1'
1830
+ - regex: 'SAMSUNG;[ ]?([a-z0-9 ]+)'
1831
+ model: '$1'
1832
+ - regex: 'SEC-([a-z0-9]+)'
1833
+ model: '$1'
1834
+ - regex: 'SAM-([a-z0-9]+)'
1835
+ model: 'SCH-$1'
1836
+ - regex: 'SMART-TV'
1837
+ device: 'tv'
1838
+ model: 'Smart TV'
1839
+ - regex: 'Galaxy ([^/;]+) Build'
1840
+ model: 'GALAXY $1'
1841
+ - regex: 'Galaxy ([a-z0-9]+)'
1842
+ model: 'GALAXY $1'
1843
+ - regex: '(?:portalmmm|o2imode)/2\.0 ([SZ][a-z0-9]+)'
1844
+ model: '$1'
1845
+ - regex: 'sam([rua][0-9]+)'
1846
+ model: 'SCH-$1'
1847
+
1848
+ # SuperSonic
1849
+ SuperSonic:
1850
+ regex: '(SC-[0-9]+[a-z]+)'
1851
+ device: 'tablet'
1852
+ model: '$1'
1853
+
1854
+ # Sumvision
1855
+ Sumvision:
1856
+ regex: '(Cyclone [^/;]+) Build'
1857
+ device: 'tablet'
1858
+ model: '$1'
1859
+
1860
+ # pantech
1861
+ Pantech:
1862
+ regex: 'Pantech|P[GN]-|PT-[a-z0-9]{3,}|TX[T]?[0-9]+|IM-[a-z0-9]+ Build|ADR910L'
1863
+ device: 'smartphone'
1864
+ models:
1865
+ # explicit smartphone models
1866
+ - regex: 'ADR910L'
1867
+ model: 'Star Q'
1868
+
1869
+ - regex: 'Pantech[ \-]?([a-z0-9]+)'
1870
+ model: '$1'
1871
+ - regex: 'Pantech_([a-z0-9\-]+)'
1872
+ model: '$1'
1873
+ - regex: '(P[GTN]-[a-z0-9]+)'
1874
+ model: '$1'
1875
+ - regex: '(TX[T]?[0-9]+)'
1876
+ model: '$1'
1877
+ - regex: '(IM-[a-z0-9]+) Build'
1878
+ model: '$1'
1879
+
1880
+ #Polaroid
1881
+ Polaroid:
1882
+ regex: 'Polaroid|(?:PMID|MIDC)[0-9a-z]+ Build|MID(?:1014|0714)'
1883
+ device: 'tablet'
1884
+ models:
1885
+ - regex: '(MID(?:1014|0714))'
1886
+ model: '$1'
1887
+ - regex: '((?:PMID|MIDC)[0-9a-z]+) Build'
1888
+ model: '$1'
1889
+ - regex: 'Polaroid'
1890
+ model: ''
1891
+
1892
+ # PolyPad
1893
+ PolyPad:
1894
+ regex: 'POLY ?PAD'
1895
+ device: 'tablet'
1896
+ models:
1897
+ - regex: 'POLY ?PAD[_ \.]([a-z0-9]+) Build'
1898
+ model: '$1'
1899
+ - regex: 'POLY ?PAD[_\.]([a-z0-9]+)'
1900
+ model: '$1'
1901
+
1902
+ # Positivo
1903
+ Positivo:
1904
+ regex: 'YPY_S450'
1905
+ device: 'smartphone'
1906
+ models:
1907
+ - regex: 'YPY_S450'
1908
+ model: 'YPY S450'
1909
+
1910
+ # Prestigio
1911
+ Prestigio:
1912
+ regex: '(?:PMP|PAP)[0-9]+[a-z0-9_]+ Build'
1913
+ device: 'tablet'
1914
+ models:
1915
+ - regex: '(PMP[0-9]+[a-z0-9_]+) Build'
1916
+ model: '$1'
1917
+ - regex: '(PAP[0-9]+[a-z0-9_]+) Build'
1918
+ model: '$1'
1919
+ device: 'smartphone'
1920
+
1921
+ # Sanyo
1922
+ Sanyo:
1923
+ regex: 'Sanyo|MobilePhone[ ;]'
1924
+ device: 'feature phone'
1925
+ models:
1926
+ # explicit feature phone models
1927
+ - regex: 'SCP-?6750'
1928
+ model: 'Katana Eclipse X'
1929
+ - regex: 'SCP-?6760'
1930
+ model: 'Incognito'
1931
+ - regex: 'SCP-?6780'
1932
+ model: 'Innuendo'
1933
+
1934
+ - regex: 'SANYO[ \-_]([a-z0-9\-]+)'
1935
+ model: '$1'
1936
+ - regex: 'MobilePhone ([a-z0-9\-]+)'
1937
+ model: '$1'
1938
+
1939
+ # Qilive
1940
+ Qilive:
1941
+ regex: 'Qilive [0-9][^;/]*'
1942
+ device: 'smartphone'
1943
+ models:
1944
+ - regex: 'Qilive ([0-5][^;/]*) Build'
1945
+ model: '$1'
1946
+ - regex: 'Qilive ([0-5][^;/]*)/'
1947
+ model: '$1'
1948
+ - regex: 'Qilive ([6-9][^;/]*) Build'
1949
+ model: '$1'
1950
+ device: 'tablet'
1951
+ - regex: 'Qilive ([6-9][^;/]*)/'
1952
+ model: '$1'
1953
+ device: 'tablet'
1954
+
1955
+ # Quechua
1956
+ Quechua:
1957
+ regex: 'Quechua Phone 5'
1958
+ device: 'smartphone'
1959
+ model: 'Quechua Phone 5'
1960
+
1961
+ # Ramos
1962
+ Ramos:
1963
+ regex: 'Ramos ?([^/;]+) Build'
1964
+ device: 'tablet'
1965
+ model: '$1'
1966
+
1967
+ # Sendo
1968
+ Sendo:
1969
+ regex: 'Sendo([a-z0-9]+)'
1970
+ device: 'feature phone'
1971
+ model: '$1'
1972
+
1973
+ # Spice
1974
+ Spice:
1975
+ regex: 'Spice'
1976
+ device: 'smartphone'
1977
+ models:
1978
+ - regex: 'Spice[ _-]?([^/;]+)(?:[\)]| Build)'
1979
+ model: '$1'
1980
+ - regex: 'Spice[ _-]?([^/;]+)(?:/|$)'
1981
+ model: '$1'
1982
+
1983
+ # Sharp
1984
+ Sharp:
1985
+ regex: 'SHARP|SBM|SH-[0-9]+[a-z]? Build|AQUOS'
1986
+ device: 'smartphone'
1987
+ models:
1988
+ # explicit smartphone models
1989
+ - regex: 'SH-02E'
1990
+ model: 'Aquos Phone Zeta'
1991
+ - regex: 'SH06D'
1992
+ model: 'Aquos Phone SH-06D'
1993
+
1994
+ # explicit tablet models
1995
+ - regex: 'SH-08E'
1996
+ device: 'tablet'
1997
+ model: 'Sharp Aquos Pad'
1998
+
1999
+ - regex: 'SHARP-AQUOS|AQUOSBrowser'
2000
+ device: 'tv'
2001
+ model: 'Aquos Net Plus'
2002
+ - regex: 'SHARP[ \-]([a-z0-9\-]+)'
2003
+ model: '$1'
2004
+ - regex: '(?:SHARP|SBM)([a-z0-9]+)'
2005
+ model: '$1'
2006
+ - regex: '(SH-[0-9]+[a-z]?) Build'
2007
+ model: '$1'
2008
+
2009
+ # Softbank
2010
+ Softbank:
2011
+ regex: 'Softbank|J-PHONE'
2012
+ device: 'smartphone'
2013
+ models:
2014
+ - regex: 'Softbank/[12]\.0/([a-z0-9]+)'
2015
+ model: '$1'
2016
+ - regex: '([a-z0-9]+);Softbank;'
2017
+ model: '$1'
2018
+ - regex: 'J-PHONE/[0-9]\.[0-9]/([a-z0-9\-]+)'
2019
+ model: '$1'
2020
+
2021
+ # Sony
2022
+ Sony:
2023
+ regex: 'Sony(?! ?Ericsson)|SGP|Xperia|C1[569]0[45]|C2[01]0[45]|C2305|C530[236]|C5502|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D530[36]|D5322|D5503|D65(?:0[23]|43)|LT22i|XL39H'
2024
+ device: 'smartphone'
2025
+ models:
2026
+ # explicit smartphone models
2027
+ - regex: '(?:Sony)?C150[45]'
2028
+ model: 'Xperia E'
2029
+ - regex: '(?:Sony)?C160[45]'
2030
+ model: 'Xperia E Dual'
2031
+ - regex: '(?:Sony)?C190[45]'
2032
+ model: 'Xperia M'
2033
+ - regex: '(?:Sony)?C200[45]'
2034
+ model: 'Xperia M Dual'
2035
+ - regex: '(?:Sony)?C210[45]'
2036
+ model: 'Xperia L'
2037
+ - regex: '(?:Sony)?C2305'
2038
+ model: 'Xperia C'
2039
+ - regex: '(?:Sony)?C530[236]'
2040
+ model: 'Xperia SP'
2041
+ - regex: '(?:Sony)?C5502'
2042
+ model: 'Xperia ZR'
2043
+ - regex: '(?:Sony)?C650[236]'
2044
+ model: 'Xperia ZL'
2045
+ - regex: '(?:Sony)?C66(?:0[236]|16)'
2046
+ model: 'Xperia Z'
2047
+ - regex: '(?:Sony)?(?:C68(?:0[26]|[34]3)|XL39H)'
2048
+ model: 'Xperia Z Ultra'
2049
+ - regex: '(?:Sony)?C69(?:0[236]|16|43)'
2050
+ model: 'Xperia Z1'
2051
+ - regex: '(?:Sony)?D200[45]'
2052
+ model: 'Xperia E1'
2053
+ - regex: '(?:Sony)?D21(?:0[45]|14)'
2054
+ model: 'Xperia E1 Dual'
2055
+ - regex: '(?:Sony)?D22(?:0[236]|43)'
2056
+ model: 'Xperia E3'
2057
+ - regex: '(?:Sony)?D2212'
2058
+ model: 'Xperia E3 Dual'
2059
+ - regex: '(?:Sony)?D2302'
2060
+ model: 'Xperia M2 Dual'
2061
+ - regex: '(?:Sony)?D230[356]'
2062
+ model: 'Xperia M2'
2063
+ - regex: '(?:Sony)?D530[36]'
2064
+ model: 'Xperia T2 Ultra'
2065
+ - regex: '(?:Sony)?D5322'
2066
+ model: 'Xperia T2 Ultra Dual'
2067
+ - regex: '(?:Sony)?D5503'
2068
+ model: 'Xperia Z1 Compact'
2069
+ - regex: '(?:Sony)?D65(?:0[23]|43)'
2070
+ model: 'Xperia Z2'
2071
+
2072
+ # explicit tablet models
2073
+ - regex: 'SGP(?:311|312|321) Build'
2074
+ model: 'Xperia Tablet Z'
2075
+ device: 'tablet'
2076
+ - regex: 'SGP(?:511|512|521) Build'
2077
+ model: 'Xperia Tablet Z2'
2078
+ device: 'tablet'
2079
+ - regex: 'SGP(?:6[24]1) Build'
2080
+ model: 'Xperia Tablet Z3 Compact'
2081
+ device: 'tablet'
2082
+ - regex: 'SGPT(?:12|121|122|123|13|131|132|133) Build'
2083
+ model: 'Xperia Tablet S'
2084
+ device: 'tablet'
2085
+
2086
+ # general detections
2087
+ - regex: 'Sony (Tablet[^/;]*) Build'
2088
+ model: '$1'
2089
+ device: 'tablet'
2090
+ - regex: '(SGP[^/;]*) Build'
2091
+ model: '$1'
2092
+ device: 'tablet'
2093
+ - regex: 'Xperia ([^/;]*Tablet[^/;]*) Build'
2094
+ model: 'Xperia $1'
2095
+ device: 'tablet'
2096
+ - regex: 'Xperia ([^;/]+) Build'
2097
+ model: 'Xperia $1'
2098
+ - regex: 'Sony[ ]?([^/;]*) Build'
2099
+ model: '$1'
2100
+ - regex: 'Sony[ ]?([a-z0-9\-]+)'
2101
+ model: '$1'
2102
+
2103
+ # Kindle
2104
+ Kindle:
2105
+ regex: 'KF(?:OT|TT|JWI|JWA|SOWI|APWI|THWI) Build|Kindle|Silk/\d+\.\d+'
2106
+ device: 'tablet'
2107
+ models:
2108
+ - regex: 'KFTT Build'
2109
+ model: 'Kindle Fire HD'
2110
+ - regex: 'KFJWI Build'
2111
+ model: 'Kindle Fire HD 8.9" WiFi'
2112
+ - regex: 'KFJWA Build'
2113
+ model: 'Kindle Fire HD 8.9" 4G'
2114
+ - regex: 'KFSOWI Build'
2115
+ model: 'Kindle Fire HD 7" WiFi'
2116
+ - regex: 'KFTHWI Build'
2117
+ model: 'Kindle Fire HDX 7" WiFi'
2118
+ - regex: 'KFTHWA Build'
2119
+ model: 'Kindle Fire HDX 7" 4G'
2120
+ - regex: 'KFAPWI Build'
2121
+ model: 'Kindle Fire HDX 8.9" WiFi'
2122
+ - regex: 'KFAPWA Build'
2123
+ model: 'Kindle Fire HDX 8.9" 4G'
2124
+ - regex: 'KFOT|Kindle Fire|Silk/\d+\.\d+'
2125
+ model: 'Kindle Fire'
2126
+ - regex: 'Kindle'
2127
+ model: 'Kindle'
2128
+
2129
+ # Symphony
2130
+ Symphony:
2131
+ regex: 'SYMPHONY[ \_]([a-z0-9]+)'
2132
+ device: 'smartphone'
2133
+ model: '$1'
2134
+
2135
+ # Qtek
2136
+ Qtek:
2137
+ regex: 'Qtek[ _]?([a-z0-9]+)'
2138
+ device: 'smartphone'
2139
+ model: '$1'
2140
+
2141
+ # T-Mobile
2142
+ T-Mobile:
2143
+ regex: 'T-Mobile[ _][a-z0-9 ]+'
2144
+ device: 'smartphone'
2145
+ models:
2146
+ - regex: 'T-Mobile[ _]([a-z0-9_ ]+) Build'
2147
+ model: '$1'
2148
+ - regex: 'T-Mobile[ _]([a-z0-9_ ]+)'
2149
+ model: '$1'
2150
+
2151
+ # Tcl
2152
+ TCL:
2153
+ regex: 'TCL-([a-z0-9]+)'
2154
+ device: 'smartphone'
2155
+ model: '$1'
2156
+
2157
+ # Tecno Mobile
2158
+ Tecno Mobile:
2159
+ regex: 'Tecno'
2160
+ device: 'smartphone'
2161
+ models:
2162
+ - regex: 'Tecno ([^;/]+) Build'
2163
+ model: '$1'
2164
+ - regex: 'Tecno_?([a-z0-9_-]+)'
2165
+ model: '$1'
2166
+
2167
+ # teXet
2168
+ teXet:
2169
+ regex: '(NaviPad [^/;]*) Build'
2170
+ device: 'tablet'
2171
+ model: '$1'
2172
+
2173
+ # Telit
2174
+ Telit:
2175
+ regex: 'Telit'
2176
+ device: 'feature phone'
2177
+ models:
2178
+ - regex: 'Telit_Mobile_Terminals-([a-z0-9]+)'
2179
+ model: '$1'
2180
+ - regex: 'Telit[\-_]?([a-z0-9]+)'
2181
+ model: '$1'
2182
+
2183
+ # Tianyu
2184
+ TIANYU:
2185
+ regex: 'TIANYU'
2186
+ device: 'feature phone'
2187
+ models:
2188
+ - regex: 'TIANYU ([a-z0-9]+)'
2189
+ model: '$1'
2190
+ - regex: 'TIANYU-KTOUCH/([a-z0-9]+)'
2191
+ model: '$1'
2192
+
2193
+ # Tolino
2194
+ Tolino:
2195
+ regex: 'Tolino Tab ([^/;]+) Build'
2196
+ device: 'tablet'
2197
+ model: 'Tolino Tab $1'
2198
+
2199
+ # Toplux
2200
+ Toplux:
2201
+ regex: 'Toplux ([a-z0-9]+)'
2202
+ device: 'feature phone'
2203
+ model: '$1'
2204
+
2205
+ #TVC
2206
+ TVC:
2207
+ regex: '(NuclearSX-SP5)'
2208
+ device: 'smartphone'
2209
+ model: 'Nuclear SX-SP5'
2210
+
2211
+ # UTStarcom
2212
+ UTStarcom:
2213
+ regex: 'utstar[ _-]?([a-z0-9]+)'
2214
+ device: 'feature phone'
2215
+ model: '$1'
2216
+
2217
+ # ViewSonic
2218
+ ViewSonic:
2219
+ regex: 'ViewSonic|VSD[0-9]+ Build'
2220
+ device: 'smart display'
2221
+ models:
2222
+ - regex: 'ViewSonic-ViewPad([a-z0-9]+) Build'
2223
+ model: 'ViewPad $1'
2224
+ device: 'tablet'
2225
+ - regex: '(VSD[0-9]+) Build'
2226
+ model: '$1'
2227
+
2228
+ # Vitelcom
2229
+ Vitelcom:
2230
+ regex: 'Vitelcom|portalmmm/[12].0 TSM'
2231
+ device: 'feature phone'
2232
+ models:
2233
+ - regex: 'TSM-([a-z0-9]+)'
2234
+ model: '$1'
2235
+ - regex: 'TSM([a-z0-9\-]+)'
2236
+ model: '$1'
2237
+ - regex: 'portalmmm/[12].0 (TSM[a-z0-9 ]+)'
2238
+ model: '$1'
2239
+
2240
+ # VK Mobile
2241
+ VK Mobile:
2242
+ regex: 'VK[\-]?([a-z0-9 ]+)'
2243
+ device: 'feature phone'
2244
+ model: '$1'
2245
+
2246
+ # Vertu
2247
+ Vertu:
2248
+ regex: 'Vertu[ ]?([a-z0-9]+)'
2249
+ device: 'feature phone'
2250
+ model: '$1'
2251
+
2252
+ # Videocon
2253
+ Videocon:
2254
+ regex: 'Videocon[_ ]([a-z0-9]+)'
2255
+ device: 'smartphone'
2256
+ model: '$1'
2257
+
2258
+ # Voxtel
2259
+ Voxtel:
2260
+ regex: 'Voxtel_([a-z0-9]+)'
2261
+ device: 'feature phone'
2262
+ model: '$1'
2263
+
2264
+ # Wellcom
2265
+ WellcoM:
2266
+ regex: 'WELLCOM[ _\-/]([a-z0-9]+)'
2267
+ device: 'smartphone'
2268
+ model: '$1'
2269
+
2270
+ # Wiko
2271
+ Wiko:
2272
+ regex: '(?:Wiko-)?(?:CINK|IGGY|Stairway|Rainbow|Highway|Darkside|Darkmoon|Darkfull|Darknight|Sublim|Ozzy|Barry)'
2273
+ device: 'smartphone'
2274
+ models:
2275
+ - regex: '(?:Wiko-)?CINK(.*) Build'
2276
+ model: 'Cink$1'
2277
+ - regex: '(?:Wiko-)?CINK[ _-]([a-z0-9]+)'
2278
+ model: 'Cink $1'
2279
+ - regex: '(?:Wiko-)?IGGY(.*) Build'
2280
+ model: 'Iggy$1'
2281
+ - regex: '(?:Wiko-)?IGGY[ _-]([a-z0-9]+)'
2282
+ model: 'Iggy $1'
2283
+ - regex: 'Stairway'
2284
+ model: 'Stairway'
2285
+ - regex: 'Highway'
2286
+ model: 'Highway'
2287
+ - regex: 'Rainbow'
2288
+ model: 'Rainbow'
2289
+ - regex: 'Darkside'
2290
+ model: 'Darkside'
2291
+ - regex: 'Darkmoon'
2292
+ model: 'Darkmoon'
2293
+ - regex: 'Darkfull'
2294
+ model: 'Darkfull'
2295
+ - regex: 'Darknight'
2296
+ model: 'Darknight'
2297
+ - regex: 'Sublim'
2298
+ model: 'Sublim'
2299
+ - regex: 'Ozzy'
2300
+ model: 'Ozzy'
2301
+ - regex: 'Barry'
2302
+ model: 'Barry'
2303
+
2304
+ # Wolder
2305
+ Wolder:
2306
+ regex: 'miSmart|miTab'
2307
+ device: 'smartphone'
2308
+ models:
2309
+ - regex: 'miSmart[ -_]?([^/]+) Build'
2310
+ model: 'miSmart $1'
2311
+ - regex: 'miTab[ -_]?([^/]+) Build'
2312
+ device: 'tablet'
2313
+ model: 'miTab $1'
2314
+
2315
+ # Wonu
2316
+ Wonu:
2317
+ regex: 'Wonu ([a-z0-9]+)'
2318
+ device: 'feature phone'
2319
+ model: '$1'
2320
+
2321
+ # Woxter
2322
+ Woxter:
2323
+ regex: 'Woxter (.+) Build'
2324
+ device: 'tablet'
2325
+ model: '$1'
2326
+
2327
+ #Xiaomi
2328
+ Xiaomi:
2329
+ regex: '(MI [a-z0-9]+|MI-One[ _]Plus) Build'
2330
+ device: 'smartphone'
2331
+ model: '$1'
2332
+
2333
+ #Yuandao
2334
+ Yuandao:
2335
+ regex: 'N101[ _]DUAL(?:[ _]CORE)?(?:[ _]?2|\|\|)?(?:[ _]V11)? Build'
2336
+ device: 'tablet'
2337
+ model: 'N101'
2338
+
2339
+ # Zonda
2340
+ Zonda:
2341
+ regex: '(ZM(?:CK|EM|TFTV|TN)[a-z0-9]+)'
2342
+ device: 'feature phone'
2343
+ model: '$1'
2344
+
2345
+ # Toshiba
2346
+ Toshiba:
2347
+ regex: 'Toshiba|portalmmm/[12].0 TS'
2348
+ device: 'smartphone'
2349
+ models:
2350
+ - regex: 'Toshiba[ /_\-]?([a-z0-9_ -]+) Build'
2351
+ model: '$1'
2352
+ - regex: 'Toshiba[ /_\-]?([a-z0-9_-]+)'
2353
+ model: '$1'
2354
+ - regex: 'portalmmm/[12].0 (TS[a-z0-9 ]+)'
2355
+ model: '$1'
2356
+
2357
+ # Fly
2358
+ Fly:
2359
+ regex: 'Fly(?!Flow|touch)|MERIDIAN-'
2360
+ device: 'smartphone'
2361
+ models:
2362
+ - regex: 'Fly[ _\-]?([a-z0-9_]+)/'
2363
+ model: '$1'
2364
+ device: 'feature phone'
2365
+ - regex: 'Flylife[ _\-]?(.*) Build'
2366
+ model: 'Flylife $1'
2367
+ device: 'tablet'
2368
+ - regex: 'Fly[ _\-]?([a-z0-9]+)'
2369
+ model: '$1'
2370
+ - regex: 'MERIDIAN-([a-z0-9]+)'
2371
+ model: '$1'
2372
+
2373
+ # Web TV
2374
+ Web TV:
2375
+ regex: 'WebTV/(\d+\.\d+)'
2376
+ device: 'tv'
2377
+ model: ''
2378
+
2379
+ # Zopo
2380
+ Zopo:
2381
+ regex: '(?:ZOPO[_ ])?(ZP[0-9]{2,}[^/;]+) Build'
2382
+ device: 'smartphone'
2383
+ model: '$1'
2384
+
2385
+ # ZTE
2386
+ ZTE:
2387
+ regex: 'ZTE|Z331|N799D|([a-z0-9]+)_USA_Cricket'
2388
+ device: 'smartphone'
2389
+ models:
2390
+ # Explicit smartphone models
2391
+ - regex: 'N799D'
2392
+ model: 'MTS Blaze 4'
2393
+
2394
+ - regex: '([a-z0-9]+)_USA_Cricket'
2395
+ model: '$1'
2396
+ - regex: 'ZTE[\- ](V98|V96A|V81|V70) Build'
2397
+ model: '$1'
2398
+ device: 'tablet'
2399
+ - regex: 'ZTE[\- ]([a-z0-9\-_ ]+) Build'
2400
+ model: '$1'
2401
+ - regex: 'ZTE-(?:G |G-)?([a-z0-9 _]+)'
2402
+ model: '$1'
2403
+ - regex: 'ZTE[ _]([a-z0-9]+)'
2404
+ model: '$1'
2405
+ - regex: 'Z331'
2406
+ model: 'Z331'
2407
+
2408
+ # Symbian to Nokia ??
2409
+ # Change name from Nokia to other to not change above Nokia element
2410
+ #Nokia:
2411
+ # regex: 'Symbian'
2412
+ # device: 'feature phone'