PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.9.2
Independent Analytics – WordPress Analytics Plugin v2.9.2
2.15.5 2.15.4 2.15.3 2.15.2 2.15.1 2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / vendor / matomo / device-detector / Parser / Device / AbstractDeviceParser.php
independent-analytics / vendor / matomo / device-detector / Parser / Device Last commit date
AbstractDeviceParser.php 2 years ago Camera.php 2 years ago CarBrowser.php 2 years ago Console.php 2 years ago HbbTv.php 2 years ago Mobile.php 2 years ago Notebook.php 2 years ago PortableMediaPlayer.php 2 years ago ShellTv.php 2 years ago
AbstractDeviceParser.php
2136 lines
1 <?php
2
3 /**
4 * Device Detector - The Universal Device Detection library for parsing User Agents
5 *
6 * @link https://matomo.org
7 *
8 * @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
9 */
10 declare (strict_types=1);
11 namespace IAWPSCOPED\DeviceDetector\Parser\Device;
12
13 use IAWPSCOPED\DeviceDetector\Parser\AbstractParser;
14 /**
15 * Class AbstractDeviceParser
16 *
17 * Abstract class for all device parsers
18 * @internal
19 */
20 abstract class AbstractDeviceParser extends AbstractParser
21 {
22 /**
23 * @var ?int
24 */
25 protected $deviceType = null;
26 /**
27 * @var string
28 */
29 protected $model = '';
30 /**
31 * @var string
32 */
33 protected $brand = '';
34 public const DEVICE_TYPE_DESKTOP = 0;
35 public const DEVICE_TYPE_SMARTPHONE = 1;
36 public const DEVICE_TYPE_TABLET = 2;
37 public const DEVICE_TYPE_FEATURE_PHONE = 3;
38 public const DEVICE_TYPE_CONSOLE = 4;
39 public const DEVICE_TYPE_TV = 5;
40 // including set top boxes, blu-ray players,...
41 public const DEVICE_TYPE_CAR_BROWSER = 6;
42 public const DEVICE_TYPE_SMART_DISPLAY = 7;
43 public const DEVICE_TYPE_CAMERA = 8;
44 public const DEVICE_TYPE_PORTABLE_MEDIA_PAYER = 9;
45 public const DEVICE_TYPE_PHABLET = 10;
46 public const DEVICE_TYPE_SMART_SPEAKER = 11;
47 public const DEVICE_TYPE_WEARABLE = 12;
48 // including set watches, headsets
49 public const DEVICE_TYPE_PERIPHERAL = 13;
50 // including portable terminal, portable projector
51 /**
52 * Detectable device types
53 *
54 * @var array
55 */
56 protected static $deviceTypes = ['desktop' => self::DEVICE_TYPE_DESKTOP, 'smartphone' => self::DEVICE_TYPE_SMARTPHONE, 'tablet' => self::DEVICE_TYPE_TABLET, 'feature phone' => self::DEVICE_TYPE_FEATURE_PHONE, 'console' => self::DEVICE_TYPE_CONSOLE, 'tv' => self::DEVICE_TYPE_TV, 'car browser' => self::DEVICE_TYPE_CAR_BROWSER, 'smart display' => self::DEVICE_TYPE_SMART_DISPLAY, 'camera' => self::DEVICE_TYPE_CAMERA, 'portable media player' => self::DEVICE_TYPE_PORTABLE_MEDIA_PAYER, 'phablet' => self::DEVICE_TYPE_PHABLET, 'smart speaker' => self::DEVICE_TYPE_SMART_SPEAKER, 'wearable' => self::DEVICE_TYPE_WEARABLE, 'peripheral' => self::DEVICE_TYPE_PERIPHERAL];
57 /**
58 * Known device brands
59 *
60 * Note: Before using a new brand in on of the regex files, it needs to be added here
61 *
62 * @var array
63 */
64 public static $deviceBrands = [
65 '5E' => '2E',
66 '5IV' => '5IVE',
67 '2F' => 'F2 Mobile',
68 '3Q' => '3Q',
69 'J7' => '7 Mobile',
70 '2Q' => '3GNET',
71 '4G' => '4Good',
72 '27' => '3GO',
73 '04' => '4ife',
74 '36' => '360',
75 '88' => '8848',
76 '10M' => '10moons',
77 '41' => 'A1',
78 'AK1' => 'A&K',
79 '00' => 'Accent',
80 'ACC' => 'Accesstyle',
81 'AE' => 'Ace',
82 'AC' => 'Acer',
83 'ACL' => 'Aceline',
84 '3K' => 'Acteck',
85 'ACT' => 'actiMirror',
86 'A9' => 'Advan',
87 'AD' => 'Advance',
88 'ADV' => 'Advantage Air',
89 '76' => 'Adronix',
90 'AF' => 'AfriOne',
91 'FY' => 'AFFIX',
92 'A3' => 'AGM',
93 'AEE' => 'AEEZO',
94 'J0' => 'AG Mobile',
95 'AJI' => 'Ajib',
96 'AZ' => 'Ainol',
97 'AIR' => 'Airis',
98 'AI' => 'Airness',
99 'ARP' => 'Airpha',
100 'AT' => 'Airties',
101 '7U' => 'Airtel',
102 'AIT' => 'AirTouch',
103 'U0' => 'AIRON',
104 '0A' => 'AIS',
105 'AW' => 'Aiwa',
106 '85' => 'Aiuto',
107 'U7' => 'AIDATA',
108 'AK' => 'Akai',
109 'Q3' => 'AKIRA',
110 '1A' => 'Alba',
111 'AL' => 'Alcatel',
112 '20' => 'Alcor',
113 'XY' => 'Alps',
114 'XYA' => 'XY Auto',
115 '7L' => 'ALDI NORD',
116 '6L' => 'ALDI SÜD',
117 '3L' => 'Alfawise',
118 '4A' => 'Aligator',
119 'AA' => 'AllCall',
120 '3A' => 'AllDocube',
121 'A2' => 'Allview',
122 'ALI' => 'ALLINmobile',
123 'A7' => 'Allwinner',
124 'A1' => 'Altech UEC',
125 '66' => 'Altice',
126 'ALM' => 'Altimo',
127 'A5' => 'altron',
128 'ALT' => 'Altus',
129 'KN' => 'Amazon',
130 'AMZ' => 'Amazon Basics',
131 'AMA' => 'AMA',
132 'AG' => 'AMGOO',
133 '9A' => 'Amigoo',
134 'AO' => 'Amoi',
135 '3J' => 'Amino',
136 '54' => 'AMCV',
137 '60' => 'Andowl',
138 'ANX' => 'ANXONIT',
139 '6J' => 'Angelcare',
140 'ANG' => 'AngelTech',
141 '7A' => 'Anry',
142 'A0' => 'ANS',
143 '74' => 'Anker',
144 '3N' => 'Aoson',
145 'O8' => 'AOC',
146 'J2' => 'AOYODKG',
147 '55' => 'AOpen',
148 'RW' => 'Aoro',
149 '9Y' => 'Aocos',
150 'AP' => 'Apple',
151 'ARC' => 'Arçelik',
152 'AR' => 'Archos',
153 'AB' => 'Arian Space',
154 'ARI' => 'Arival',
155 'A6' => 'Ark',
156 '5A' => 'ArmPhone',
157 'AN' => 'Arnova',
158 'AS' => 'ARRIS',
159 'AQ' => 'Aspera',
160 'HJ' => 'Aquarius',
161 '40' => 'Artel',
162 '21' => 'Artizlee',
163 '59' => 'ArtLine',
164 '8A' => 'Asano',
165 '90' => 'Asanzo',
166 '1U' => 'Astro',
167 'A4' => 'Ask',
168 'A8' => 'Assistant',
169 'ASS' => 'ASSE',
170 'AU' => 'Asus',
171 '6A' => 'AT&T',
172 'ATH' => 'Athesi',
173 'ATE' => 'Atlantic Electrics',
174 '5Q' => 'Atmaca Elektronik',
175 'YH' => 'ATMAN',
176 '2A' => 'Atom',
177 'ATO' => 'ATOL',
178 'Z2' => 'Atvio',
179 'ATI' => 'Attila',
180 'AX' => 'Audiovox',
181 'AJ' => 'AURIS',
182 'YZ' => 'Autan',
183 'AUP' => 'AUPO',
184 'ZA' => 'Avenzo',
185 'AH' => 'AVH',
186 'AV' => 'Avvio',
187 'AVA' => 'Avaya',
188 'AXE' => 'AXEN',
189 'AY' => 'Axxion',
190 'AXX' => 'AXXA',
191 'AYA' => 'AYA',
192 'YR' => 'AYYA',
193 'XA' => 'Axioo',
194 'AM' => 'Azumi Mobile',
195 'AZE' => 'Azeyou',
196 'WW' => 'Awow',
197 'AWO' => 'AWOX',
198 'XU' => 'AUX',
199 'BAC' => 'Backcell',
200 'BFF' => 'BAFF',
201 'BO' => 'BangOlufsen',
202 'BN' => 'Barnes & Noble',
203 'BAR' => 'BARTEC',
204 'BAS' => 'BASE',
205 'BAU' => 'BAUHN',
206 'BB' => 'BBK',
207 '0B' => 'BB Mobile',
208 'B6' => 'BDF',
209 'QD' => 'BDQ',
210 '8Z' => 'BDsharing',
211 'BEF' => 'Beafon',
212 'BE' => 'Becker',
213 'B5' => 'Beeline',
214 'B0' => 'Beelink',
215 'BL' => 'Beetel',
216 'BEK' => 'Beko',
217 '2X' => 'Benco',
218 'BQ' => 'BenQ',
219 'BS' => 'BenQ-Siemens',
220 '4Y' => 'Benzo',
221 'XJ' => 'Benesse',
222 'BEN' => 'BenWee',
223 'YB' => 'Beista',
224 'BY' => 'BS Mobile',
225 'BZ' => 'Bezkam',
226 '9B' => 'Bellphone',
227 '63' => 'Beyond',
228 'BG' => 'BGH',
229 '6B' => 'Bigben',
230 'B8' => 'BIHEE',
231 '1B' => 'Billion',
232 'BA' => 'BilimLand',
233 'BIL' => 'Billow',
234 'BH' => 'BioRugged',
235 'BI' => 'Bird',
236 'BT' => 'Bitel',
237 'B7' => 'Bitmore',
238 'ZB' => 'Bittium',
239 'BK' => 'Bkav',
240 '5B' => 'Black Bear',
241 'BLK' => 'Black Box',
242 'BF' => 'Black Fox',
243 'BPC' => 'Blackpcs',
244 'B2' => 'Blackview',
245 '2Y' => 'b2m',
246 'BP' => 'Blaupunkt',
247 'BU' => 'Blu',
248 'BUS' => 'BluSlate',
249 'BUZ' => 'BuzzTV',
250 'B3' => 'Bluboo',
251 '2B' => 'Bluedot',
252 'BD' => 'Bluegood',
253 'LB' => 'Bluewave',
254 'J8' => 'Bluebird',
255 'BSS' => 'BlueSky',
256 '7B' => 'Blloc',
257 'UB' => 'Bleck',
258 'Q2' => 'Blow',
259 'BLI' => 'BLISS',
260 'BM' => 'Bmobile',
261 'Y5' => 'BMAX',
262 'BMX' => 'BMXC',
263 'B9' => 'Bobarry',
264 'B4' => 'bogo',
265 'BOL' => 'Bolva',
266 'BW' => 'Boway',
267 'BOO' => 'Boost',
268 'BOK' => 'Bookeen',
269 'BOT' => 'Botech',
270 'BX' => 'bq',
271 '8B' => 'Brandt',
272 'BRA' => 'BrandCode',
273 'BV' => 'Bravis',
274 'BRV' => 'BRAVE',
275 'BRG' => 'Brigmton',
276 'BR' => 'Brondi',
277 'XF' => 'BROR',
278 'BJ' => 'BrightSign',
279 'B1' => 'Bush',
280 '4Q' => 'Bundy',
281 'Y8' => 'Bubblegum',
282 'BMW' => 'BMW',
283 'C9' => 'CAGI',
284 'CAD' => 'CADENA',
285 'CT' => 'Capitel',
286 'G3' => 'CG Mobile',
287 '37' => 'CGV',
288 'CP' => 'Captiva',
289 'CF' => 'Carrefour',
290 'CA1' => 'Carbon Mobile',
291 'CS' => 'Casio',
292 'R4' => 'Casper',
293 'CA' => 'Cat',
294 'BC' => 'Camfone',
295 'CJ' => 'Cavion',
296 'CAN' => 'Canal+',
297 '4D' => 'Canal Digital',
298 'CNG' => 'Canguro',
299 'CNT' => 'CCIT',
300 'CEC' => 'Cecotec',
301 'CEP' => 'CEPTER',
302 'CEI' => 'Ceibal',
303 '02' => 'Cell-C',
304 'CEL' => 'Cellacom',
305 '34' => 'CellAllure',
306 '7C' => 'Celcus',
307 'CE' => 'Celkon',
308 'CG' => 'Cellution',
309 '62' => 'Centric',
310 'CEN' => 'CENTEK',
311 'C2' => 'Changhong',
312 'CHA' => 'Chainway',
313 'CHG' => 'ChiliGreen',
314 'CH' => 'Cherry Mobile',
315 'C3' => 'China Mobile',
316 'U9' => 'China Telecom',
317 'CI' => 'Chico Mobile',
318 'CIA' => 'C Idea',
319 'CIP' => 'CipherLab',
320 'CIT' => 'Citycall',
321 '1C' => 'Chuwi',
322 'L8' => 'Clarmin',
323 '25' => 'Claresta',
324 'CLA' => 'CLAYTON',
325 'CLT' => 'Clovertek',
326 '1J' => 'Cloud',
327 'CD' => 'Cloudfone',
328 '6C' => 'Cloudpad',
329 'C0' => 'Clout',
330 'CN' => 'CnM',
331 'CY' => 'Coby Kyros',
332 'XC' => 'Cobalt',
333 'C6' => 'Comio',
334 'CL' => 'Compal',
335 'CQ' => 'Compaq',
336 'C7' => 'ComTrade Tesla',
337 '7Z' => 'COMPUMAX',
338 'C8' => 'Concord',
339 'CC' => 'ConCorde',
340 'C5' => 'Condor',
341 'C5M' => 'C5 Mobile',
342 '4C' => 'Conquest',
343 '3C' => 'Contixo',
344 '8C' => 'Connex',
345 '53' => 'Connectce',
346 'CON' => 'Conceptum',
347 'CED' => 'Continental Edison',
348 '9C' => 'Colors',
349 'CO' => 'Coolpad',
350 'COO' => 'Coopers',
351 'CDE' => 'COOD-E',
352 '4R' => 'CORN',
353 '1O' => 'Cosmote',
354 'CW' => 'Cowon',
355 '75' => 'Covia',
356 'QG' => 'COYOTE',
357 'CKK' => 'CKK Mobile',
358 'YW' => 'ClearPHONE',
359 '33' => 'Clementoni',
360 'CR' => 'CreNova',
361 'CX' => 'Crescent',
362 'CK' => 'Cricket',
363 'CM' => 'Crius Mea',
364 '0C' => 'Crony',
365 'C1' => 'Crosscall',
366 '4W' => 'Crown',
367 'CTR' => 'Ctroniq',
368 'CU' => 'Cube',
369 'CB' => 'CUBOT',
370 'CUI' => 'Cuiud',
371 'CV' => 'CVTE',
372 'CWO' => 'Cwowdefu',
373 'C4' => 'Cyrus',
374 'D5' => 'Daewoo',
375 'DA' => 'Danew',
376 'DAN' => 'Dany',
377 'DA1' => 'DangcapHD',
378 'DAR' => 'Daria',
379 'DT' => 'Datang',
380 'D7' => 'Datawind',
381 '7D' => 'Datamini',
382 '6D' => 'Datalogic',
383 'D1' => 'Datsun',
384 'DZ' => 'Dazen',
385 'DAS' => 'DASS',
386 'DB' => 'Dbtel',
387 'DBP' => 'DbPhone',
388 'DCO' => 'Dcode',
389 'DL' => 'Dell',
390 'DL0' => 'DL',
391 'DE' => 'Denver',
392 'DS' => 'Desay',
393 'DSD' => 'DSDevices',
394 'DSI' => 'DSIC',
395 'DW' => 'DeWalt',
396 'DX' => 'DEXP',
397 'DEY' => 'DEYI',
398 'DEN' => 'Denali',
399 'DEA' => 'DEALDIG',
400 '8D' => 'DF',
401 'DGT' => 'DGTEC',
402 'DG' => 'Dialog',
403 'DIA' => 'DIALN',
404 'DI' => 'Dicam',
405 'D4' => 'Digi',
406 'D3' => 'Digicel',
407 'DDG' => 'Digidragon',
408 'DH' => 'Digihome',
409 'DD' => 'Digiland',
410 'DIJ' => 'DIJITSU',
411 'DIG' => 'Digit4G',
412 'DIC' => 'DIGICOM',
413 'Q0' => 'DIGIFORS',
414 'DIK' => 'DIKOM',
415 'DQ' => 'DISH',
416 'DIS' => 'Disney',
417 '9D' => 'Ditecma',
418 'D2' => 'Digma',
419 '1D' => 'Diva',
420 'DIV' => 'DiverMax',
421 'D6' => 'Divisat',
422 'DIO' => 'DIORA',
423 'X6' => 'DIXON',
424 'DIM' => 'DIMO',
425 '5D' => 'DING DING',
426 'DIN' => 'Dinax',
427 'DNA' => 'Dinalink',
428 'DM' => 'DMM',
429 'DN' => 'DNS',
430 'DC' => 'DoCoMo',
431 'DF' => 'Doffler',
432 'D9' => 'Dolamee',
433 'DO' => 'Doogee',
434 'D0' => 'Doopro',
435 'DV' => 'Doov',
436 'DOM' => 'Dom.ru',
437 'DP' => 'Dopod',
438 'DPA' => 'DPA',
439 'JQ' => 'Doppio',
440 'DR' => 'Doro',
441 'ZD' => 'DORLAND',
442 'DRO' => 'Droidlogic',
443 'D8' => 'Droxio',
444 'DJ' => 'Dragon Touch',
445 'DRA' => 'DRAGON',
446 'DY' => 'Dreamgate',
447 'DRE' => 'DreamTab',
448 'DR1' => 'DreamStar',
449 'DTA' => 'Dtac',
450 'DU' => 'Dune HD',
451 'UD' => 'DUNNS Mobile',
452 'DUU' => 'Duubee',
453 'DUR' => 'Durabook',
454 'DYO' => 'Dyon',
455 'DTE' => 'D-Tech',
456 'DLI' => 'D-Link',
457 'ENO' => 'eNOVA',
458 'IN2' => 'iNOVA',
459 'IN3' => 'inovo',
460 'INH' => 'Inhon',
461 'EB' => 'E-Boda',
462 'EJ' => 'Engel',
463 'ENA' => 'ENACOM',
464 'ENI' => 'ENIE',
465 '2E' => 'E-Ceros',
466 'E8' => 'E-tel',
467 'EAS' => 'EAS Electric',
468 'EP' => 'Easypix',
469 'EQ' => 'Eagle',
470 'EGS' => 'EagleSoar',
471 'EA' => 'EBEST',
472 'YC' => 'EBEN',
473 'E4' => 'Echo Mobiles',
474 'EQ1' => 'Equator',
475 'ES' => 'ECS',
476 '35' => 'ECON',
477 'ECC' => 'ECOO',
478 'ZZ' => 'ecom',
479 'EDE' => 'Edenwood',
480 'E6' => 'EE',
481 'GW' => 'EGL',
482 'EFT' => 'EFT',
483 'EK' => 'EKO',
484 'EY' => 'Einstein',
485 'EM' => 'Eks Mobility',
486 'UE' => 'Ematic',
487 'EMR' => 'Emporia',
488 '4K' => 'EKT',
489 'EKI' => 'EKINOX',
490 '7E' => 'ELARI',
491 '03' => 'Electroneum',
492 'Z8' => 'ELECTRONIA',
493 'EL1' => 'Elecson',
494 'ELK' => 'Elektroland',
495 'L0' => 'Element',
496 'EG' => 'Elenberg',
497 'EL' => 'Elephone',
498 'JE' => 'Elekta',
499 'ELE' => 'Elevate',
500 '4E' => 'Eltex',
501 'ELM' => 'Elong Mobile',
502 'ED' => 'Energizer',
503 'E1' => 'Energy Sistem',
504 '3E' => 'Enot',
505 'ENT' => 'Entity',
506 'ENV' => 'Envizen',
507 '8E' => 'Epik One',
508 'EPK' => 'Epic',
509 'XP' => 'Epson',
510 'EPH' => 'Ephone',
511 'E7' => 'Ergo',
512 'EC' => 'Ericsson',
513 '05' => 'Erisson',
514 'ER' => 'Ericy',
515 'EE' => 'Essential',
516 'E2' => 'Essentielb',
517 '6E' => 'eSTAR',
518 'ETO' => 'ETOE',
519 'EN' => 'Eton',
520 'ET' => 'eTouch',
521 '1E' => 'Etuline',
522 'EU' => 'Eurostar',
523 '4J' => 'Eurocase',
524 'E9' => 'Evercoss',
525 'EV' => 'Evertek',
526 'EVE' => 'Everest',
527 'EV1' => 'Everex',
528 'E3' => 'Evolio',
529 'EO' => 'Evolveo',
530 '0Q' => 'Evoo',
531 '5U' => 'EVPAD',
532 'E0' => 'EvroMedia',
533 'XE' => 'ExMobile',
534 '4Z' => 'Exmart',
535 'EH' => 'EXO',
536 'EX' => 'Explay',
537 'EXP' => 'Express LUCK',
538 'E5' => 'Extrem',
539 'EXL' => 'ExtraLink',
540 'EF' => 'EXCEED',
541 'QE' => 'EWIS',
542 'EI' => 'Ezio',
543 'EZ' => 'Ezze',
544 'UF' => 'EYU',
545 'EYE' => 'Eyemoo',
546 'UE1' => 'UE',
547 '5F' => 'F150',
548 'FPS' => 'F+',
549 'F6' => 'Facebook',
550 'FAC' => 'Facetel',
551 'FA1' => 'Facime',
552 'FA' => 'Fairphone',
553 'FM' => 'Famoco',
554 'FAM' => 'Famous',
555 '17' => 'FarEasTone',
556 '9R' => 'FaRao Pro',
557 'FAR' => 'Farassoo',
558 'FB' => 'Fantec',
559 'FE' => 'Fengxiang',
560 'FEN' => 'Fenoti',
561 'F7' => 'Fero',
562 '67' => 'FEONAL',
563 'FI' => 'FiGO',
564 'J9' => 'FiGi',
565 'FIG' => 'Figgers',
566 'F9' => 'FiiO',
567 'F1' => 'FinePower',
568 'FX' => 'Finlux',
569 'F3' => 'FireFly Mobile',
570 'F8' => 'FISE',
571 'FIT' => 'FITCO',
572 'FLM' => 'Filimo',
573 'FIL' => 'FILIX',
574 'FL' => 'Fly',
575 'QC' => 'FLYCAT',
576 'FLY' => 'FLYCOAY',
577 'FLU' => 'Fluo',
578 'FN' => 'FNB',
579 'FOB' => 'Fobem',
580 'FD' => 'Fondi',
581 '0F' => 'Fourel',
582 '44' => 'Four Mobile',
583 'F0' => 'Fonos',
584 'F2' => 'FORME',
585 'F5' => 'Formuler',
586 'FR' => 'Forstar',
587 'RF' => 'Fortis',
588 'FO' => 'Foxconn',
589 'FOD' => 'FoxxD',
590 'FJ' => 'FOODO',
591 'FOS' => 'FOSSiBOT',
592 'FRE' => 'free',
593 'FT' => 'Freetel',
594 'FEY' => 'FreeYond',
595 'FRU' => 'Frunsi',
596 'F4' => 'F&U',
597 '1F' => 'FMT',
598 'FPT' => 'FPT',
599 'FG' => 'Fuego',
600 'FU' => 'Fujitsu',
601 '4F' => 'Funai',
602 '5J' => 'Fusion5',
603 'FF' => 'Future Mobile Technology',
604 'FFF' => 'FFF SmartLife',
605 'FW' => 'FNF',
606 'FXT' => 'Fxtec',
607 'GT' => 'G-TiDE',
608 'G9' => 'G-Touch',
609 'GFO' => 'Gfone',
610 'GTM' => 'GTMEDIA',
611 'GTX' => 'GTX',
612 '0G' => 'GFive',
613 'GM' => 'Garmin-Asus',
614 'GA' => 'Gateway',
615 '99' => 'Galaxy Innovations',
616 'GA1' => 'Galactic',
617 'GAM' => 'Gamma',
618 'GAZ' => 'Gazer',
619 'GEA' => 'Geanee',
620 'GEN' => 'Geant',
621 'GD' => 'Gemini',
622 'GN' => 'General Mobile',
623 '2G' => 'Genesis',
624 'G2' => 'GEOFOX',
625 'GE' => 'Geotel',
626 'Q4' => 'Geotex',
627 'GEO' => 'GEOZON',
628 'GNO' => 'Getnord',
629 'GER' => 'Gear Mobile',
630 'GH' => 'Ghia',
631 '2C' => 'Ghong',
632 'GJ' => 'Ghost',
633 'GG' => 'Gigabyte',
634 'GS' => 'Gigaset',
635 'GZ' => 'Ginzzu',
636 '1G' => 'Gini',
637 'GI' => 'Gionee',
638 'GIR' => 'GIRASOLE',
639 'G4' => 'Globex',
640 'GLB' => 'Globmall',
641 '38' => 'GLONYX',
642 'U6' => 'Glofiish',
643 'G7' => 'GoGEN',
644 'GC' => 'GOCLEVER',
645 '5G' => 'Gocomma',
646 'GB' => 'Gol Mobile',
647 'GL' => 'Goly',
648 'GOL' => 'GoldMaster',
649 'GOB' => 'GOLDBERG',
650 'GX' => 'GLX',
651 'G5' => 'Gome',
652 'G1' => 'GoMobile',
653 'GO' => 'Google',
654 'G0' => 'Goophone',
655 '6G' => 'Gooweel',
656 'GOO' => 'GOODTEL',
657 '8G' => 'Gplus',
658 'GR' => 'Gradiente',
659 'GRE' => 'Graetz',
660 'GP' => 'Grape',
661 'G6' => 'Gree',
662 'GRA' => 'Great Asia',
663 '3G' => 'Greentel',
664 'GRO' => 'Green Orange',
665 'GRL' => 'Green Lion',
666 'GR1' => 'GroBerwert',
667 'GF' => 'Gretel',
668 '82' => 'Gresso',
669 'GU' => 'Grundig',
670 'GV' => 'Gtel',
671 'CUO' => 'Guophone',
672 'H13' => 'H133',
673 '9Z' => 'H96',
674 'HF' => 'Hafury',
675 '9F' => 'HAOVM',
676 'HAQ' => 'HAOQIN',
677 'HA' => 'Haier',
678 'HEC' => 'HEC',
679 'XH' => 'Haipai',
680 'HAN' => 'Handheld',
681 'HE' => 'HannSpree',
682 'HNS' => 'Hanseatic',
683 'HK' => 'Hardkernel',
684 'HAR' => 'Harper',
685 'HA1' => 'Hartens',
686 'HS' => 'Hasee',
687 '8H' => 'Hamlet',
688 'HAM' => 'Hammer',
689 'HAT' => 'Hathway',
690 'H6' => 'Helio',
691 'HQ' => 'HERO',
692 'ZH' => 'Hezire',
693 'HEX' => 'HexaByte',
694 'HEW' => 'HeadWolf',
695 'HEI' => 'Heimat',
696 'HL' => 'Hi-Level',
697 '3H' => 'Hi',
698 'HIB' => 'Hiberg',
699 'HBY' => 'HiBy',
700 'HIH' => 'HiHi',
701 'HIK' => 'HiKing',
702 'H2' => 'Highscreen',
703 'Q1' => 'High Q',
704 'HIG' => 'HiGrace',
705 '1H' => 'Hipstreet',
706 'HIR' => 'Hiremco',
707 'HI' => 'Hisense',
708 'HIP' => 'HIPER',
709 'HC' => 'Hitachi',
710 'H8' => 'Hitech',
711 'W3' => 'HiMax',
712 '8X' => 'Hi Nova',
713 'HLL' => 'HLLO',
714 'HKC' => 'HKC',
715 '8W' => 'HKPro',
716 'HOF' => 'HOFER',
717 'H1' => 'Hoffmann',
718 'HOM' => 'Homatics',
719 'H0' => 'Hometech',
720 'HLB' => 'HOLLEBERG',
721 'HM' => 'Homtom',
722 'HZ' => 'Hoozo',
723 'H7' => 'Horizon',
724 '4H' => 'Horizont',
725 'HO' => 'Hosin',
726 'H3' => 'Hotel',
727 'HV' => 'Hotwav',
728 'U8' => 'Hot Pepper',
729 'JH' => 'HOTREALS',
730 'HW' => 'How',
731 'WH' => 'Honeywell',
732 'HP' => 'HP',
733 'HDC' => 'HDC',
734 'HT' => 'HTC',
735 'QZ' => 'Huagan',
736 'HD' => 'Huadoo',
737 'HG' => 'Huavi',
738 'HU' => 'Huawei',
739 'HX' => 'Humax',
740 'HR' => 'Hurricane',
741 'H5' => 'Huskee',
742 'HUG' => 'Hugerock',
743 'HY' => 'Hyrican',
744 'HN' => 'Hyundai',
745 '7H' => 'Hyve',
746 'HYT' => 'Hytera',
747 'HYK' => 'Hykker',
748 '3I' => 'i-Cherry',
749 'IJ' => 'i-Joy',
750 'IM' => 'i-mate',
751 'IO' => 'i-mobile',
752 'INN' => 'I-INN',
753 'IPL' => 'I-Plus',
754 'OF' => 'iOutdoor',
755 'IB' => 'iBall',
756 'IY' => 'iBerry',
757 '7I' => 'iBrit',
758 'IBO' => 'ibowin',
759 'I2' => 'IconBIT',
760 'IC' => 'iDroid',
761 'IDI' => 'iDino',
762 '6Z' => 'iData',
763 'IG' => 'iGet',
764 'IH' => 'iHunt',
765 'IA' => 'Ikea',
766 'IYO' => 'iYou',
767 '8I' => 'IKU Mobile',
768 '2K' => 'IKI Mobile',
769 'IK' => 'iKoMo',
770 '58' => 'iKon',
771 '588' => 'iKonia',
772 'I7' => 'iLA',
773 '2I' => 'iLife',
774 '1I' => 'iMars',
775 'IMI' => 'iMI',
776 'U4' => 'iMan',
777 'ILE' => 'iLepo',
778 'IL' => 'IMO Mobile',
779 'IMA' => 'Imaq',
780 'IM1' => 'Imose',
781 'I3' => 'Impression',
782 'FC' => 'INCAR',
783 '2H' => 'Inch',
784 '6I' => 'Inco',
785 'INK' => 'Inka',
786 'IW' => 'iNew',
787 'IF' => 'Infinix',
788 'INF' => 'Infiniton',
789 'I0' => 'InFocus',
790 'IN1' => 'InFone',
791 'II' => 'Inkti',
792 'MIR' => 'Infomir',
793 '81' => 'InfoKit',
794 'I5' => 'InnJoo',
795 '26' => 'Innos',
796 'IN' => 'Innostream',
797 'I4' => 'Inoi',
798 'INO' => 'iNo Mobile',
799 'IQ' => 'INQ',
800 'QN' => 'iQ&T',
801 'IS' => 'Insignia',
802 'YI' => 'INSYS',
803 'IT' => 'Intek',
804 'INT' => 'Intel',
805 'IX' => 'Intex',
806 'IV' => 'Inverto',
807 '32' => 'Invens',
808 '4I' => 'Invin',
809 'INA' => 'iNavi',
810 'I1' => 'iOcean',
811 'IMU' => 'iMuz',
812 'IP' => 'iPro',
813 'X9' => 'iPEGTOP',
814 '8Q' => 'IQM',
815 'Q8' => 'IRA',
816 'I6' => 'Irbis',
817 '5I' => 'Iris',
818 'IRE' => 'iReplace',
819 'IR' => 'iRola',
820 'IU' => 'iRulu',
821 'IRO' => 'iRobot',
822 '9I' => 'iSWAG',
823 '9J' => 'iSafe Mobile',
824 'IST' => 'iStar',
825 '86' => 'IT',
826 'IZ' => 'iTel',
827 '0I' => 'iTruck',
828 'I8' => 'iVA',
829 'IE' => 'iView',
830 '0J' => 'iVooMi',
831 'UI' => 'ivvi',
832 'QW' => 'iWaylink',
833 'I9' => 'iZotron',
834 'IXT' => 'iXTech',
835 'IOT' => 'IOTWE',
836 'JA' => 'JAY-Tech',
837 'KJ' => 'Jiake',
838 'JD' => 'Jedi',
839 'JEE' => 'Jeep',
840 'J6' => 'Jeka',
841 'JF' => 'JFone',
842 'JI' => 'Jiayu',
843 'JG' => 'Jinga',
844 'JIN' => 'Jin Tu',
845 'JX' => 'Jio',
846 'VJ' => 'Jivi',
847 'JK' => 'JKL',
848 'JR1' => 'JREN',
849 'JO' => 'Jolla',
850 'JP' => 'Joy',
851 'JOY' => 'JoySurf',
852 'UJ' => 'Juniper Systems',
853 'J5' => 'Just5',
854 '7J' => 'Jumper',
855 'JPA' => 'JPay',
856 'JV' => 'JVC',
857 'JXD' => 'JXD',
858 'JS' => 'Jesy',
859 'KT' => 'K-Touch',
860 'KLT' => 'K-Lite',
861 'K4' => 'Kaan',
862 'K7' => 'Kaiomy',
863 'KL' => 'Kalley',
864 'K6' => 'Kanji',
865 'KA' => 'Karbonn',
866 'K5' => 'KATV1',
867 'KAP' => 'Kapsys',
868 'K0' => 'Kata',
869 'KZ' => 'Kazam',
870 '9K' => 'Kazuna',
871 'KD' => 'KDDI',
872 'KHA' => 'Khadas',
873 'KS' => 'Kempler & Strauss',
874 'K3' => 'Keneksi',
875 'KHI' => 'KENSHI',
876 'KX' => 'Kenxinda',
877 'KEN' => 'Kenbo',
878 'KND' => 'Kendo',
879 'KZG' => 'KZG',
880 'K1' => 'Kiano',
881 '5W' => 'Kingbox',
882 'KI' => 'Kingsun',
883 'KIS' => 'Kinstone',
884 'KF' => 'KINGZONE',
885 'KIN' => 'Kingstar',
886 '46' => 'Kiowa',
887 'KV' => 'Kivi',
888 '64' => 'Kvant',
889 'KVA' => 'KVADRA',
890 '0K' => 'Klipad',
891 'KNM' => 'KN Mobile',
892 'KC' => 'Kocaso',
893 'KK' => 'Kodak',
894 'KG' => 'Kogan',
895 'KM' => 'Komu',
896 'KO' => 'Konka',
897 'KW' => 'Konrow',
898 'KB' => 'Koobee',
899 '7K' => 'Koolnee',
900 'K9' => 'Kooper',
901 'KP' => 'KOPO',
902 'KR' => 'Koridy',
903 'XK' => 'Koslam',
904 'K2' => 'KRONO',
905 'KE' => 'Krüger&Matz',
906 '5K' => 'KREZ',
907 'WK' => 'KRIP',
908 'KRA' => 'Kraft',
909 'KH' => 'KT-Tech',
910 'Z6' => 'KUBO',
911 'KUG' => 'KuGou',
912 'K8' => 'Kuliao',
913 '8K' => 'Kult',
914 'KU' => 'Kumai',
915 '6K' => 'Kurio',
916 'KYD' => 'Kydos',
917 'KY' => 'Kyocera',
918 'KQ' => 'Kyowon',
919 '1K' => 'Kzen',
920 'LQ' => 'LAIQ',
921 'L6' => 'Land Rover',
922 'L2' => 'Landvo',
923 'LA' => 'Lanix',
924 'LA1' => 'Lanin',
925 'LK' => 'Lark',
926 'Z3' => 'Laurus',
927 'LEC' => 'Lectrus',
928 'LV' => 'Lava',
929 'LVI' => 'Lville',
930 'LC' => 'LCT',
931 'L5' => 'Leagoo',
932 'U3' => 'Leben',
933 'LEB' => 'LeBest',
934 'LD' => 'Ledstar',
935 'LEE' => 'Leelbox',
936 'L1' => 'LeEco',
937 '4B' => 'Leff',
938 'LEG' => 'Legend',
939 'L4' => 'Lemhoov',
940 'W9' => 'LEMFO',
941 'LEM' => 'Lemco',
942 'LN' => 'Lenco',
943 'LE' => 'Lenovo',
944 'LT' => 'Leotec',
945 'LP' => 'Le Pan',
946 'ZJ' => 'Leke',
947 'L7' => 'Lephone',
948 'LZ' => 'Lesia',
949 'L3' => 'Lexand',
950 'LX' => 'Lexibook',
951 'LG' => 'LG',
952 '39' => 'Liberton',
953 '5L' => 'Linsar',
954 'LIN' => 'Linsay',
955 'LF' => 'Lifemaxx',
956 'LI' => 'Lingwin',
957 'LIB' => 'Lingbo',
958 'LIM' => 'Lime',
959 'LJ' => 'L-Max',
960 'LW' => 'Linnex',
961 'JJ' => 'Listo',
962 'LNM' => 'LNMBBS',
963 'LO' => 'Loewe',
964 'YL' => 'Loview',
965 'LOV' => 'Lovme',
966 '1L' => 'Logic',
967 'LH' => 'Logic Instrument',
968 'LM' => 'Logicom',
969 'LOG' => 'Logik',
970 'GY' => 'LOKMAT',
971 'LPX' => 'LPX-G',
972 '0L' => 'Lumigon',
973 'LU' => 'Lumus',
974 'LUM' => 'Lumitel',
975 'L9' => 'Luna',
976 'LR' => 'Luxor',
977 'LY' => 'LYF',
978 'LL' => 'Leader Phone',
979 'QL' => 'LT Mobile',
980 'MQ' => 'M.T.T.',
981 'MN' => 'M4tel',
982 'XM' => 'Macoox',
983 '92' => 'MAC AUDIO',
984 'MJ' => 'Majestic',
985 'FQ' => 'Mafe',
986 'MAG' => 'MAG',
987 '6Y' => 'Magicsee',
988 '23' => 'Magnus',
989 'NH' => 'Manhattan',
990 'MAN' => 'Mango',
991 '5M' => 'Mann',
992 'MA' => 'Manta Multimedia',
993 'Z0' => 'Mantra',
994 'J4' => 'Mara',
995 'MAR' => 'Marshal',
996 '8Y' => 'Massgo',
997 'MA1' => 'Mascom',
998 '2M' => 'Masstel',
999 '3X' => 'Mastertech',
1000 'MAS' => 'Master-G',
1001 '50' => 'Matrix',
1002 'MAT' => 'Matco Tools',
1003 '7M' => 'Maxcom',
1004 '7M1' => 'Maxfone',
1005 'ZM' => 'Maximus',
1006 '6X' => 'Maxtron',
1007 '0D' => 'MAXVI',
1008 'MAX' => 'Maxwell',
1009 'XZ' => 'MAXX',
1010 'MW' => 'Maxwest',
1011 'M0' => 'Maze',
1012 'YM' => 'Maze Speed',
1013 '87' => 'Malata',
1014 'MAU' => 'Maunfeld',
1015 '28' => 'MBOX',
1016 'FK' => 'MBI',
1017 'MBK' => 'MBK',
1018 '3D' => 'MDC Store',
1019 '1Y' => 'MDTV',
1020 '09' => 'meanIT',
1021 'M3' => 'Mecer',
1022 'M3M' => 'M3 Mobile',
1023 '0M' => 'Mecool',
1024 'MEM' => 'MeMobile',
1025 'MC' => 'Mediacom',
1026 'MK' => 'MediaTek',
1027 'MD' => 'Medion',
1028 'M2' => 'MEEG',
1029 'MEG' => 'MEGA VISION',
1030 'MP' => 'MegaFon',
1031 'X0' => 'mPhone',
1032 '3M' => 'Meitu',
1033 'M1' => 'Meizu',
1034 '0E' => 'Melrose',
1035 'MU' => 'Memup',
1036 'ME' => 'Metz',
1037 'MEO' => 'MEO',
1038 'MX' => 'MEU',
1039 'MI' => 'MicroMax',
1040 'MIP' => 'mipo',
1041 'MS' => 'Microsoft',
1042 '6Q' => 'Microtech',
1043 '1X' => 'Minix',
1044 'OM' => 'Mintt',
1045 'MIN' => 'Mint',
1046 'MO' => 'Mio',
1047 'X7' => 'Mione',
1048 'M7' => 'Miray',
1049 'MIT' => 'Mitchell & Brown',
1050 '8M' => 'Mito',
1051 'MT' => 'Mitsubishi',
1052 '0Y' => 'Mitsui',
1053 'M5' => 'MIXC',
1054 '2D' => 'MIVO',
1055 '1Z' => 'MiXzo',
1056 'MIW' => 'MIWANG',
1057 'ML' => 'MLLED',
1058 'LS' => 'MLS',
1059 'MLA' => 'MLAB',
1060 '5H' => 'MMI',
1061 '4M' => 'Mobicel',
1062 'M6' => 'Mobiistar',
1063 'MOK' => 'Mobile Kingdom',
1064 'MH' => 'Mobiola',
1065 'MB' => 'Mobistel',
1066 'ID' => 'MobiIoT',
1067 '6W' => 'MobiWire',
1068 '9M' => 'Mobo',
1069 'MOB' => 'Mobell',
1070 'MVO' => 'Mobvoi',
1071 'M4' => 'Modecom',
1072 'MF' => 'Mofut',
1073 'MR' => 'Motorola',
1074 'MIV' => 'Motiv',
1075 'MV' => 'Movic',
1076 'MOV' => 'Movitel',
1077 'MO1' => 'MOVISUN',
1078 'MOS' => 'Mosimosi',
1079 'MOX' => 'Moxee',
1080 'MM' => 'Mpman',
1081 'MZ' => 'MSI',
1082 '3R' => 'MStar',
1083 'M9' => 'MTC',
1084 'N4' => 'MTN',
1085 '72' => 'M-Tech',
1086 '9H' => 'M-Horse',
1087 '1R' => 'Multilaser',
1088 'MPS' => 'MultiPOS',
1089 '1M' => 'MYFON',
1090 'MY' => 'MyPhone',
1091 '51' => 'Myros',
1092 'M8' => 'Myria',
1093 '6M' => 'Mystery',
1094 '3T' => 'MyTab',
1095 'MG' => 'MyWigo',
1096 'J3' => 'Mymaga',
1097 'MYM' => 'MyMobile',
1098 '07' => 'MyGica',
1099 'MYG' => 'MygPad',
1100 'MWA' => 'MwalimuPlus',
1101 'NEO' => 'neoCore',
1102 'NER' => 'Neoregent',
1103 '08' => 'Nabi',
1104 'N7' => 'National',
1105 'NC' => 'Navcity',
1106 '6N' => 'Navitech',
1107 '7V' => 'Navitel',
1108 'N3' => 'Navon',
1109 '7R' => 'NavRoad',
1110 'NAB' => 'NABO',
1111 'NAS' => 'NASCO',
1112 'NP' => 'Naomi Phone',
1113 'NAN' => 'Nanho',
1114 'NE' => 'NEC',
1115 'NDP' => 'Nedaphone',
1116 '8N' => 'Necnot',
1117 'NF' => 'Neffos',
1118 '9X' => 'Neo',
1119 'NEK' => 'NEKO',
1120 '1N' => 'Neomi',
1121 '7Q' => 'Neon IQ',
1122 '8F' => 'Neolix',
1123 'NET' => 'NetBox',
1124 'NA' => 'Netgear',
1125 'NEM' => 'Netmak',
1126 'NU' => 'NeuImage',
1127 'NEU' => 'NeuTab',
1128 'NEV' => 'NEVIR',
1129 'NW' => 'Newgen',
1130 'N9' => 'Newland',
1131 '0N' => 'Newman',
1132 'NS' => 'NewsMy',
1133 'ND' => 'Newsday',
1134 'HB' => 'New Balance',
1135 'BRI' => 'New Bridge',
1136 'XB' => 'NEXBOX',
1137 'NX' => 'Nexian',
1138 '7X' => 'Nexa',
1139 'N8' => 'NEXON',
1140 'N2' => 'Nextbit',
1141 'NT' => 'NextBook',
1142 'NTT' => 'NTT West',
1143 '4N' => 'NextTab',
1144 'NEX' => 'NEXT',
1145 'NST' => 'Next & NextStar',
1146 'NJO' => 'nJoy',
1147 'NG' => 'NGM',
1148 'NZ' => 'NG Optics',
1149 'NZP' => 'NGpon',
1150 'NN' => 'Nikon',
1151 'NI' => 'Nintendo',
1152 'NIN' => 'NINETEC',
1153 'N5' => 'NOA',
1154 'N1' => 'Noain',
1155 'N6' => 'Nobby',
1156 'NOC' => 'Novacom',
1157 'NOS' => 'NoviSea',
1158 'NOV' => 'Novey',
1159 'NO1' => 'NOVO',
1160 '57' => 'Nubia',
1161 'JN' => 'NOBUX',
1162 'NB' => 'Noblex',
1163 'OG' => 'NOGA',
1164 'NK' => 'Nokia',
1165 'NM' => 'Nomi',
1166 '2N' => 'Nomu',
1167 '6H' => 'Noontec',
1168 'NR' => 'Nordmende',
1169 'NOR' => 'NORMANDE',
1170 '7N' => 'NorthTech',
1171 'NOT' => 'Nothing Phone',
1172 '5N' => 'Nos',
1173 'NO' => 'Nous',
1174 'NQ' => 'Novex',
1175 'NOD' => 'noDROPOUT',
1176 'NJ' => 'NuAns',
1177 'NL' => 'NUU Mobile',
1178 'N0' => 'Nuvo',
1179 'NUV' => 'NuVision',
1180 'NV' => 'Nvidia',
1181 'NY' => 'NYX Mobile',
1182 'NON' => 'N-one',
1183 'O3' => 'O+',
1184 'OT' => 'O2',
1185 'O7' => 'Oale',
1186 'OC' => 'OASYS',
1187 'OB' => 'Obi',
1188 'OBR' => 'Ober',
1189 'OQ' => 'Meta',
1190 'O1' => 'Odys',
1191 'ODP' => 'Odotpad',
1192 'O9' => 'Ok',
1193 'OA' => 'Okapia',
1194 'OKI' => 'Oking',
1195 'OLA' => 'Olax',
1196 'OLK' => 'Olkya',
1197 'OLY' => 'Olympia',
1198 'OCE' => 'OCEANIC',
1199 'OLT' => 'OLTO',
1200 'OJ' => 'Ookee',
1201 'OD' => 'Onda',
1202 'ON' => 'OnePlus',
1203 'ONC' => 'OneClick',
1204 'ONL' => 'OneLern',
1205 'OAN' => 'Oangcc',
1206 'OX' => 'Onix',
1207 'OIN' => 'Onida',
1208 '3O' => 'ONYX BOOX',
1209 'O4' => 'ONN',
1210 '9Q' => 'Onkyo',
1211 'ONV' => 'ONVO',
1212 'OOR' => 'Ooredoo',
1213 '2O' => 'OpelMobile',
1214 'OH' => 'Openbox',
1215 '7Y' => 'Obabox',
1216 'OP' => 'OPPO',
1217 'OO' => 'Opsson',
1218 'OPT' => 'Optoma',
1219 'OPH' => 'Ophone',
1220 'OR' => 'Orange',
1221 'ORA' => 'Orava',
1222 'O5' => 'Orbic',
1223 'Y6' => 'Orbita',
1224 'ORB' => 'Orbsmart',
1225 'OS' => 'Ordissimo',
1226 '8O' => 'Orion',
1227 'OTT' => 'OTTO',
1228 'OK' => 'Ouki',
1229 '0O' => 'OINOM',
1230 'QK' => 'OKWU',
1231 'QQ' => 'OMIX',
1232 '56' => 'OKSI',
1233 'OE' => 'Oukitel',
1234 'OU' => 'OUYA',
1235 'JB' => 'OUJIA',
1236 'OV' => 'Overmax',
1237 '30' => 'Ovvi',
1238 'O2' => 'Owwo',
1239 'OSC' => 'OSCAL',
1240 'OY' => 'Oysters',
1241 'QF' => 'OYSIN',
1242 'O6' => 'Oyyu',
1243 'OZ' => 'OzoneHD',
1244 'OLL' => 'Ollee',
1245 '7P' => 'P-UP',
1246 'PRA' => 'Pacific Research Alliance',
1247 'PAG' => 'PAGRAER',
1248 'PAD' => 'Padpro',
1249 'YP' => 'Paladin',
1250 'PM' => 'Palm',
1251 'PN' => 'Panacom',
1252 'PA' => 'Panasonic',
1253 'PNV' => 'Panavox',
1254 'PT' => 'Pantech',
1255 'PAN' => 'Pano',
1256 'PND' => 'Panodic',
1257 'PA1' => 'Panoramic',
1258 'PLT' => 'Platoon',
1259 '94' => 'Packard Bell',
1260 'H9' => 'Parrot Mobile',
1261 'PAR' => 'Partner Mobile',
1262 'PAP' => 'PAPYRE',
1263 'PB' => 'PCBOX',
1264 'PCS' => 'PC Smart',
1265 'PC' => 'PCD',
1266 'PD' => 'PCD Argentina',
1267 'PE' => 'PEAQ',
1268 'PEN' => 'Penta',
1269 'PG' => 'Pentagram',
1270 'PQ' => 'Pendoo',
1271 '93' => 'Perfeo',
1272 '8J' => 'Pelitt',
1273 '1P' => 'Phicomm',
1274 '4P' => 'Philco',
1275 'PH' => 'Philips',
1276 '5P' => 'Phonemax',
1277 'PO' => 'phoneOne',
1278 'PI' => 'Pioneer',
1279 'PIC' => 'Pioneer Computers',
1280 'PJ' => 'PiPO',
1281 '8P' => 'Pixelphone',
1282 '9O' => 'Pixela',
1283 'PX' => 'Pixus',
1284 'QP' => 'Pico',
1285 'PIR' => 'PIRANHA',
1286 'PIN' => 'PINE',
1287 '9P' => 'Planet Computers',
1288 'PLA' => 'Play Now',
1289 'PY' => 'Ployer',
1290 'P4' => 'Plum',
1291 'PLU' => 'PlusStyle',
1292 '22' => 'Pluzz',
1293 'P8' => 'PocketBook',
1294 '0P' => 'POCO',
1295 'FH' => 'Point Mobile',
1296 'PV' => 'Point of View',
1297 'PL' => 'Polaroid',
1298 'Q6' => 'Polar',
1299 '97' => 'PolarLine',
1300 'PP' => 'PolyPad',
1301 'P5' => 'Polytron',
1302 'P2' => 'Pomp',
1303 'P0' => 'Poppox',
1304 '0X' => 'POPTEL',
1305 'PS' => 'Positivo',
1306 '3P' => 'Positivo BGH',
1307 '3F' => 'Porsche',
1308 'P3' => 'PPTV',
1309 'FP' => 'Premio',
1310 'PR1' => 'Premier',
1311 'PR' => 'Prestigio',
1312 'P9' => 'Primepad',
1313 'PRM' => 'PRIME',
1314 '6P' => 'Primux',
1315 '2P' => 'Prixton',
1316 'PRI' => 'Pritom',
1317 'PF' => 'PROFiLO',
1318 'P6' => 'Proline',
1319 '5O' => 'Prology',
1320 'P1' => 'ProScan',
1321 'PRO' => 'PROSONIC',
1322 'P7' => 'Protruly',
1323 'R0' => 'ProVision',
1324 '7O' => 'Polestar',
1325 'PU' => 'PULID',
1326 'UP' => 'Purism',
1327 'PUN' => 'Punos',
1328 'QFX' => 'QFX',
1329 'Q7' => 'Q-Box',
1330 'QH' => 'Q-Touch',
1331 'QB' => 'Q.Bell',
1332 'QI' => 'Qilive',
1333 'QIN' => 'QIN',
1334 'QM' => 'QMobile',
1335 'QT' => 'Qtek',
1336 'Q9' => 'QTECH',
1337 'QA' => 'Quantum',
1338 'QUE' => 'Quest',
1339 'QUA' => 'Quatro',
1340 'QU' => 'Quechua',
1341 'QUI' => 'Quipus',
1342 'QO' => 'Qumo',
1343 'UQ' => 'Qubo',
1344 'YQ' => 'QLink',
1345 'QY' => 'Qnet Mobile',
1346 'WJ' => 'Qware',
1347 'QWT' => 'QWATT',
1348 'R2' => 'R-TV',
1349 'RA' => 'Ramos',
1350 '0R' => 'Raspberry',
1351 'R9' => 'Ravoz',
1352 'RZ' => 'Razer',
1353 '95' => 'Rakuten',
1354 'RAY' => 'Raylandz',
1355 'RC' => 'RCA Tablets',
1356 '2R' => 'Reach',
1357 'REL' => 'RelNAT',
1358 'RB' => 'Readboy',
1359 'RE' => 'Realme',
1360 'RE1' => 'Redbean',
1361 'R8' => 'RED',
1362 'REW' => 'Redway',
1363 '6F' => 'Redfox',
1364 'RE2' => 'RedLine',
1365 'RD' => 'Reeder',
1366 'Z9' => 'REGAL',
1367 'RH' => 'Remdun',
1368 'RP' => 'Revo',
1369 'REV' => 'Revomovil',
1370 '8R' => 'Retroid Pocket',
1371 'REN' => 'Renova',
1372 'RIC' => 'Ricoh',
1373 'RI' => 'Rikomagic',
1374 'RM' => 'RIM',
1375 'RN' => 'Rinno',
1376 'RX' => 'Ritmix',
1377 'R7' => 'Ritzviva',
1378 'RV' => 'Riviera',
1379 '6R' => 'Rivo',
1380 'RIZ' => 'Rizzen',
1381 'RR' => 'Roadrover',
1382 'QR' => 'ROADMAX',
1383 'ROC' => 'Roam Cat',
1384 'R1' => 'Rokit',
1385 'ROI' => 'ROiK',
1386 'RK' => 'Roku',
1387 'R3' => 'Rombica',
1388 'R5' => 'Ross&Moor',
1389 'RO' => 'Rover',
1390 'R6' => 'RoverPad',
1391 'RQ' => 'RoyQueen',
1392 'RJ' => 'Royole',
1393 'RT' => 'RT Project',
1394 'RG' => 'RugGear',
1395 'RUG' => 'Ruggex',
1396 'RUT' => 'RuggeTech',
1397 'RU' => 'Runbo',
1398 'RUP' => 'Rupa',
1399 'RL' => 'Ruio',
1400 'RY' => 'Ryte',
1401 'X5' => 'Saba',
1402 '8L' => 'S-TELL',
1403 '8L1' => 'S-Color',
1404 '4O' => 'S2Tel',
1405 '89' => 'Seatel',
1406 'SEW' => 'Sewoo',
1407 'SE1' => 'SEEWO',
1408 'Y7' => 'Saiet',
1409 'SLF' => 'SAILF',
1410 'X1' => 'Safaricom',
1411 'SG' => 'Sagem',
1412 'SAG' => 'Sagemcom',
1413 '4L' => 'Salora',
1414 'SA' => 'Samsung',
1415 'SAT' => 'Samtech',
1416 'SAM' => 'Samtron',
1417 'SNA' => 'SNAMI',
1418 'S0' => 'Sanei',
1419 '12' => 'Sansui',
1420 'SAK' => 'Sankey',
1421 'SQ' => 'Santin',
1422 'SY' => 'Sanyo',
1423 'SAN' => 'SANY',
1424 'S9' => 'Savio',
1425 'Y4' => 'SCBC',
1426 'CZ' => 'Schneider',
1427 'SCO' => 'Scosmos',
1428 'ZG' => 'Schok',
1429 'G8' => 'SEG',
1430 'SEX' => 'SEHMAX',
1431 'SD' => 'Sega',
1432 '0U' => 'Selecline',
1433 '9G' => 'Selenga',
1434 'SV' => 'Selevision',
1435 'SL' => 'Selfix',
1436 '0S' => 'SEMP TCL',
1437 'S1' => 'Sencor',
1438 'SN' => 'Sendo',
1439 '01' => 'Senkatel',
1440 'S6' => 'Senseit',
1441 'EW' => 'Senwa',
1442 '24' => 'Seeken',
1443 'SEB' => 'SEBBE',
1444 '61' => 'Seuic',
1445 'SX' => 'SFR',
1446 'SGI' => 'SGIN',
1447 'SH' => 'Sharp',
1448 'JU' => 'Shanling',
1449 '7S' => 'Shift Phones',
1450 '78' => 'Shivaki',
1451 'RS' => 'Shtrikh-M',
1452 '3S' => 'Shuttle',
1453 '13' => 'Sico',
1454 'SI' => 'Siemens',
1455 '1S' => 'Sigma',
1456 '70' => 'Silelis',
1457 'SJ' => 'Silent Circle',
1458 'SIL' => 'Silva Schneider',
1459 '10' => 'Simbans',
1460 '98' => 'Simply',
1461 'SIM' => 'simfer',
1462 '52' => 'Singtech',
1463 '31' => 'Siragon',
1464 '83' => 'Sirin Labs',
1465 '5Z' => 'SK Broadband',
1466 'GK' => 'SKG',
1467 'SW' => 'Sky',
1468 'SK' => 'Skyworth',
1469 'SKY' => 'Skyline',
1470 'SK1' => 'SkyStream',
1471 'SKT' => 'Skytech',
1472 'SKK' => 'SKK Mobile',
1473 '14' => 'Smadl',
1474 '19' => 'Smailo',
1475 'SR' => 'Smart Electronic',
1476 'SMA' => 'Smart Kassel',
1477 '49' => 'Smart',
1478 '47' => 'SmartBook',
1479 '3B' => 'Smartab',
1480 '80' => 'SMARTEC',
1481 'SM1' => 'Smartex',
1482 'SC' => 'Smartfren',
1483 'S7' => 'Smartisan',
1484 'JR' => 'Sylvania',
1485 'SYH' => 'SYH',
1486 '3Y' => 'Smarty',
1487 'HH' => 'Smooth Mobile',
1488 '1Q' => 'Smotreshka',
1489 'SF' => 'Softbank',
1490 '9L' => 'SOLE',
1491 'JL' => 'SOLO',
1492 'SOS' => 'SOSH',
1493 'SOD' => 'Soda',
1494 'SOL' => 'Solas',
1495 '16' => 'Solone',
1496 'OI' => 'Sonim',
1497 'SVE' => 'Sveon',
1498 'SO' => 'Sony',
1499 'SE' => 'Sony Ericsson',
1500 'X2' => 'Soundmax',
1501 'SUL' => 'SoulLink',
1502 '8S' => 'Soyes',
1503 '77' => 'SONOS',
1504 '68' => 'Soho Style',
1505 'SOB' => 'SobieTech',
1506 'PK' => 'Spark',
1507 'SPX' => 'Sparx',
1508 'FS' => 'SPC',
1509 '6S' => 'Spectrum',
1510 '43' => 'Spectralink',
1511 'SP' => 'Spice',
1512 '84' => 'Sprint',
1513 'SPU' => 'SPURT',
1514 'QS' => 'SQOOL',
1515 'S4' => 'Star',
1516 'OL' => 'Starlight',
1517 '18' => 'Starmobile',
1518 '2S' => 'Starway',
1519 '45' => 'Starwind',
1520 'SB' => 'STF Mobile',
1521 'S8' => 'STK',
1522 'GQ' => 'STG Telecom',
1523 'S2' => 'Stonex',
1524 'ST' => 'Storex',
1525 'STR' => 'Stream',
1526 '71' => 'StrawBerry',
1527 '96' => 'STRONG',
1528 '69' => 'Stylo',
1529 '9S' => 'Sugar',
1530 'SUR' => 'Surge',
1531 '06' => 'Subor',
1532 'SZ' => 'Sumvision',
1533 '0H' => 'Sunstech',
1534 'S3' => 'SunVan',
1535 '5S' => 'Sunvell',
1536 '5Y' => 'Sunny',
1537 'W8' => 'SUNWIND',
1538 'SBX' => 'SuperBOX',
1539 'SBR' => 'Sber',
1540 'SGE' => 'Super General',
1541 'SU' => 'SuperSonic',
1542 '79' => 'SuperTab',
1543 'S5' => 'Supra',
1544 'SUP' => 'Supraim',
1545 'ZS' => 'Suzuki',
1546 '2J' => 'Sunmi',
1547 'SUN' => 'Sunmax',
1548 '0W' => 'Swipe',
1549 'SWI' => 'Switel',
1550 'SS' => 'SWISSMOBILITY',
1551 '1W' => 'Swisstone',
1552 'SSK' => 'SSKY',
1553 'SYC' => 'Syco',
1554 'SM' => 'Symphony',
1555 '4S' => 'Syrox',
1556 'SYS' => 'System76',
1557 'TM' => 'T-Mobile',
1558 'T96' => 'T96',
1559 'TAD' => 'TADAAM',
1560 'TK' => 'Takara',
1561 '73' => 'Tambo',
1562 '9N' => 'Tanix',
1563 'U5' => 'Taiga System',
1564 'TAL' => 'Talius',
1565 '7G' => 'TAG Tech',
1566 'TAU' => 'TAUBE',
1567 'T5' => 'TB Touch',
1568 'TC' => 'TCL',
1569 'T0' => 'TD Systems',
1570 'YY' => 'TD Tech',
1571 'H4' => 'Technicolor',
1572 'TEA' => 'TeachTouch',
1573 'Z5' => 'Technika',
1574 'TE1' => 'TechSmart',
1575 'TX' => 'TechniSat',
1576 'TT' => 'TechnoTrend',
1577 'TTS' => 'TECHNOSAT',
1578 'TP' => 'TechPad',
1579 'TPS' => 'TPS',
1580 '9E' => 'Techwood',
1581 '7F' => 'Technopc',
1582 'TCH' => 'Techstorm',
1583 'T7' => 'Teclast',
1584 'TB' => 'Tecno Mobile',
1585 'TEC' => 'TecToy',
1586 '91' => 'TEENO',
1587 'TLK' => 'Telkom',
1588 '2L' => 'Tele2',
1589 'TL' => 'Telefunken',
1590 'TG' => 'Telego',
1591 'T2' => 'Telenor',
1592 'TE' => 'Telit',
1593 '65' => 'Telia',
1594 'TLY' => 'Telly',
1595 'TEL' => 'Telma',
1596 'PW' => 'Telpo',
1597 'TLS' => 'TeloSystems',
1598 'TER' => 'Teracube',
1599 'TD' => 'Tesco',
1600 'TA' => 'Tesla',
1601 '9T' => 'Tetratab',
1602 'TET' => 'TETC',
1603 'TZ' => 'teXet',
1604 '29' => 'Teknosa',
1605 'JZ' => 'TJC',
1606 'JC' => 'TENPLUS',
1607 'T4' => 'ThL',
1608 'TN' => 'Thomson',
1609 'O0' => 'Thuraya',
1610 'TI' => 'TIANYU',
1611 'JY' => 'Tigers',
1612 '8T' => 'Time2',
1613 'TQ' => 'Timovi',
1614 'TIM' => 'TIMvision',
1615 '2T' => 'Tinai',
1616 'TF' => 'Tinmo',
1617 'TH' => 'TiPhone',
1618 'YV' => 'TiVo',
1619 'TIB' => 'Tibuta',
1620 'Y3' => 'TOKYO',
1621 'TOX' => 'TOX',
1622 'T1' => 'Tolino',
1623 '0T' => 'Tone',
1624 'TY' => 'Tooky',
1625 'TOO' => 'TOOGO',
1626 'T9' => 'Top House',
1627 'DK' => 'Topelotek',
1628 '42' => 'Topway',
1629 'TO' => 'Toplux',
1630 'TOD' => 'TOPDON',
1631 'TOP' => 'TopDevice',
1632 'TO2' => 'TOPSHOWS',
1633 '7T' => 'Torex',
1634 'TOR' => 'Torque',
1635 '6O' => 'TOSCIDO',
1636 'TO1' => 'Topsion',
1637 'TS' => 'Toshiba',
1638 'T8' => 'Touchmate',
1639 'TOU' => 'Touch Plus',
1640 '5R' => 'Transpeed',
1641 'T6' => 'TrekStor',
1642 'T3' => 'Trevi',
1643 'TRI' => 'TriaPlay',
1644 'TJ' => 'Trifone',
1645 'Q5' => 'Trident',
1646 '4T' => 'Tronsmart',
1647 '11' => 'True',
1648 'JT' => 'True Slim',
1649 'J1' => 'Trio',
1650 'THT' => 'Tsinghua Tongfang',
1651 '5C' => 'TTEC',
1652 'TTF' => 'TTfone',
1653 'TTK' => 'TTK-TV',
1654 'TU' => 'Tunisie Telecom',
1655 '1T' => 'Turbo',
1656 'TR' => 'Turbo-X',
1657 '5X' => 'TurboPad',
1658 '5T' => 'TurboKids',
1659 'UR' => 'Turkcell',
1660 '4U' => 'TuCEL',
1661 'TUV' => 'Tuvio',
1662 '2U' => 'Türk Telekom',
1663 'TV' => 'TVC',
1664 'TW' => 'TWM',
1665 'Z1' => 'TWZ',
1666 '6T' => 'Twoe',
1667 'TWN' => 'TwinMOS',
1668 '15' => 'Tymes',
1669 'UC' => 'U.S. Cellular',
1670 'UD1' => 'UD',
1671 'UGI' => 'UGINE',
1672 'UG' => 'Ugoos',
1673 'U1' => 'Uhans',
1674 'UH' => 'Uhappy',
1675 'UL' => 'Ulefone',
1676 'UA' => 'Umax',
1677 'UM' => 'UMIDIGI',
1678 'UNT' => 'Unitech',
1679 'UZ' => 'Unihertz',
1680 '3Z' => 'UZ Mobile',
1681 'UX' => 'Unimax',
1682 'UNQ' => 'Uniqcell',
1683 'US' => 'Uniscope',
1684 'UNI' => 'Unistrong',
1685 'U2' => 'UNIWA',
1686 'UND' => 'Uniden',
1687 'UO' => 'Unnecto',
1688 'UNN' => 'Unnion Technologies',
1689 'UU' => 'Unonu',
1690 'UN' => 'Unowhy',
1691 'UY' => 'UNNO',
1692 'UOO' => 'UOOGOU',
1693 'UNB' => 'Unblock Tech',
1694 'UK' => 'UTOK',
1695 '3U' => 'IUNI',
1696 'UT' => 'UTStarcom',
1697 '6U' => 'UTime',
1698 '9U' => 'Urovo',
1699 'UW' => 'U-Magic',
1700 '5V' => 'VAIO',
1701 'WV' => 'VAVA',
1702 'VA' => 'Vastking',
1703 'VP' => 'Vargo',
1704 'VC' => 'Vankyo',
1705 'VAL' => 'VALEM',
1706 'VAT' => 'VALTECH',
1707 'VAN' => 'VANGUARD',
1708 'VAW' => 'VANWIN',
1709 'VB' => 'VC',
1710 'VN' => 'Venso',
1711 'VNP' => 'VNPT Technology',
1712 'VEN' => 'Venstar',
1713 'UV' => 'Venturer',
1714 'VQ' => 'Vega',
1715 'WC' => 'VEON',
1716 '4V' => 'Verico',
1717 'V4' => 'Verizon',
1718 'VR' => 'Vernee',
1719 'VX' => 'Vertex',
1720 'VE' => 'Vertu',
1721 'VET' => 'VETAS',
1722 'VL' => 'Verykool',
1723 'QV' => 'Verssed',
1724 'VER' => 'Versus',
1725 'V8' => 'Vesta',
1726 'VEK' => 'Vekta',
1727 'VT' => 'Vestel',
1728 '48' => 'Vexia',
1729 'V6' => 'VGO TEL',
1730 'QJ' => 'VDVD',
1731 'VIC' => 'Victurio',
1732 'VD' => 'Videocon',
1733 'VW' => 'Videoweb',
1734 'VS' => 'ViewSonic',
1735 'V7' => 'Vinga',
1736 'V3' => 'Vinsoc',
1737 'XD' => 'Vinabox',
1738 'FV' => 'Vios',
1739 '0V' => 'Vipro',
1740 'ZV' => 'Virzo',
1741 'VIP' => 'Viper',
1742 'VI' => 'Vitelcom',
1743 'VIB' => 'ViBox',
1744 '8V' => 'Viumee',
1745 'V5' => 'Vivax',
1746 'VIV' => 'VIVIMAGE',
1747 'VV' => 'Vivo',
1748 '6V' => 'VIWA',
1749 'VII' => 'VIIPOO',
1750 'VID' => 'VIDA',
1751 'VZ' => 'Vizio',
1752 'VIZ' => 'Vizmo',
1753 'VIT' => 'Vityaz',
1754 '9V' => 'Vision Touch',
1755 'VIL' => 'Visual Land',
1756 'VI1' => 'VILLAON',
1757 'VK' => 'VK Mobile',
1758 'JM' => 'v-mobile',
1759 'VHO' => 'V-HOPE',
1760 'VHM' => 'V-HOME',
1761 'VGE' => 'V-Gen',
1762 'V0' => 'VKworld',
1763 'VM' => 'Vodacom',
1764 'VOC' => 'VOCAL',
1765 'VF' => 'Vodafone',
1766 '7W' => 'VOGA',
1767 'V2' => 'Vonino',
1768 '1V' => 'Vontar',
1769 'VG' => 'Vorago',
1770 '2V' => 'Vorke',
1771 '8U' => 'Vorcom',
1772 'JW' => 'Vortex',
1773 'VOR' => 'Vormor',
1774 'V1' => 'Voto',
1775 'Z7' => 'VOX',
1776 'VO' => 'Voxtel',
1777 'VY' => 'Voyo',
1778 'VOL' => 'Völfen',
1779 'VO1' => 'Volt',
1780 'VOP' => 'Volla',
1781 'V02' => 'VOLIA',
1782 'VH' => 'Vsmart',
1783 'V9' => 'Vsun',
1784 'VU' => 'Vulcan',
1785 '3V' => 'VVETIME',
1786 'ZC' => 'VUCATIMES',
1787 'VO2' => 'VOLKANO',
1788 'VUE' => 'Vue Micro',
1789 'WAK' => 'Walker',
1790 'WA' => 'Walton',
1791 'WAF' => 'WAF',
1792 'WAO' => 'W&O',
1793 'WAL' => 'Waltter',
1794 'WAI' => 'Wainyok',
1795 'WHI' => 'White Mobile',
1796 'WHO' => 'Whoop',
1797 'WBL' => 'We. by Loewe.',
1798 'WCP' => 'WeChip',
1799 'WM' => 'Weimei',
1800 'WE' => 'WellcoM',
1801 'W6' => 'WELLINGTON',
1802 'WD' => 'Western Digital',
1803 'WT' => 'Westpoint',
1804 'WAN' => 'Wanmukang',
1805 'WA1' => 'WANSA',
1806 'WY' => 'Wexler',
1807 '3W' => 'WE',
1808 'WEC' => 'Wecool',
1809 'WEE' => 'Weelikeit',
1810 'WP' => 'Wieppo',
1811 'W2' => 'Wigor',
1812 'WI' => 'Wiko',
1813 'WF' => 'Wileyfox',
1814 'WS' => 'Winds',
1815 'WN' => 'Wink',
1816 '9W' => 'Winmax',
1817 'W5' => 'Winnovo',
1818 'WU' => 'Wintouch',
1819 'WIS' => 'Winstar',
1820 'W0' => 'Wiseasy',
1821 '2W' => 'Wizz',
1822 'W4' => 'WIWA',
1823 'WIZ' => 'WizarPos',
1824 'WL' => 'Wolder',
1825 'WG' => 'Wolfgang',
1826 'WQ' => 'Wolki',
1827 'WON' => 'WONDER',
1828 'WO' => 'Wonu',
1829 'W1' => 'Woo',
1830 'WR' => 'Wortmann',
1831 'WX' => 'Woxter',
1832 'XQ' => 'X-AGE',
1833 'XEL' => 'XElectron',
1834 'X3' => 'X-BO',
1835 'XMO' => 'X-Mobile',
1836 'XT' => 'X-TIGI',
1837 'XV' => 'X-View',
1838 'X4' => 'X.Vision',
1839 'X88' => 'X88',
1840 'X96' => 'X96',
1841 '96Q' => 'X96Q',
1842 'A95' => 'A95X',
1843 'XG' => 'Xgody',
1844 'XGE' => 'XGEM',
1845 'QX' => 'XGIMI',
1846 'XL' => 'Xiaolajiao',
1847 'XI' => 'Xiaomi',
1848 'XW' => 'Xiaodu',
1849 'XN' => 'Xion',
1850 'XO' => 'Xolo',
1851 'XR' => 'Xoro',
1852 'XS' => 'Xshitou',
1853 'XSM' => 'Xsmart',
1854 '4X' => 'Xtouch',
1855 'X8' => 'Xtratech',
1856 'XCR' => 'Xcruiser',
1857 'XCO' => 'XCOM',
1858 'XCL' => 'Xcell',
1859 'XWA' => 'Xwave',
1860 'YD' => 'Yandex',
1861 'YA' => 'Yarvik',
1862 'Y2' => 'Yes',
1863 'YES' => 'Yestel',
1864 'YE' => 'Yezz',
1865 'YG' => 'YEPEN',
1866 'YEL' => 'YELLYOUTH',
1867 'YK' => 'Yoka TV',
1868 'YO' => 'Yota',
1869 'YOU' => 'Youin',
1870 'YO1' => 'Youwei',
1871 'YOO' => 'Yooz',
1872 'YT' => 'Ytone',
1873 'Y9' => 'YOTOPT',
1874 'Y1' => 'Yu',
1875 'YF' => 'YU Fly',
1876 'Y0' => 'YUHO',
1877 'YN' => 'Yuno',
1878 'YUN' => 'YUNDOO',
1879 'YUS' => 'YunSong',
1880 'YUM' => 'YUMKEM',
1881 'YU' => 'Yuandao',
1882 'YS' => 'Yusun',
1883 'YJ' => 'YASIN',
1884 'YX' => 'Yxtel',
1885 '0Z' => 'Zatec',
1886 '2Z' => 'Zaith',
1887 'ZAM' => 'Zamolxe',
1888 'ZEA' => 'Zealot',
1889 'PZ' => 'Zebra',
1890 'ZE1' => 'Zeblaze',
1891 'ZE' => 'Zeemi',
1892 'WZ' => 'Zeeker',
1893 'ZN' => 'Zen',
1894 'ZK' => 'Zenek',
1895 'ZL' => 'Zentality',
1896 'ZF' => 'Zfiner',
1897 'ZI' => 'Zidoo',
1898 'FZ' => 'ZIFRO',
1899 'ZX' => 'Ziox',
1900 'ZIK' => 'ZIK',
1901 'ZKI' => 'Z-Kai',
1902 'ZIG' => 'Zigo',
1903 'ZIN' => 'Zinox',
1904 'ZO' => 'Zonda',
1905 'ZW' => 'Zonko',
1906 'ZP' => 'Zopo',
1907 'ZOO' => 'ZoomSmart',
1908 'ZO1' => 'Zoom',
1909 'ZT' => 'ZTE',
1910 'ZU' => 'Zuum',
1911 'ZY' => 'Zync',
1912 'ZR' => 'Zyrex',
1913 'ZQ' => 'ZYQ',
1914 'Z4' => 'ZH&K',
1915 'OW' => 'öwn',
1916 'WBF' => 'Webfleet',
1917 'WSS' => 'WS',
1918 // legacy brands, might be removed in future versions
1919 'WB' => 'Web TV',
1920 'XX' => 'Unknown',
1921 ];
1922 /**
1923 * Returns the device type represented by one of the DEVICE_TYPE_* constants
1924 *
1925 * @return int|null
1926 */
1927 public function getDeviceType() : ?int
1928 {
1929 return $this->deviceType;
1930 }
1931 /**
1932 * Returns available device types
1933 *
1934 * @see $deviceTypes
1935 *
1936 * @return array
1937 */
1938 public static function getAvailableDeviceTypes() : array
1939 {
1940 return self::$deviceTypes;
1941 }
1942 /**
1943 * Returns names of all available device types
1944 *
1945 * @return array
1946 */
1947 public static function getAvailableDeviceTypeNames() : array
1948 {
1949 return \array_keys(self::$deviceTypes);
1950 }
1951 /**
1952 * Returns the name of the given device type
1953 *
1954 * @param int $deviceType one of the DEVICE_TYPE_* constants
1955 *
1956 * @return string
1957 */
1958 public static function getDeviceName(int $deviceType) : string
1959 {
1960 $deviceName = \array_search($deviceType, self::$deviceTypes);
1961 if (\is_string($deviceName)) {
1962 return $deviceName;
1963 }
1964 return '';
1965 }
1966 /**
1967 * Returns the detected device model
1968 *
1969 * @return string
1970 */
1971 public function getModel() : string
1972 {
1973 return $this->model;
1974 }
1975 /**
1976 * Returns the detected device brand
1977 *
1978 * @return string
1979 */
1980 public function getBrand() : string
1981 {
1982 return $this->brand;
1983 }
1984 /**
1985 * Returns the full brand name for the given short name
1986 *
1987 * @param string $brandId short brand name
1988 *
1989 * @return string
1990 */
1991 public static function getFullName(string $brandId) : string
1992 {
1993 if (\array_key_exists($brandId, self::$deviceBrands)) {
1994 return self::$deviceBrands[$brandId];
1995 }
1996 return '';
1997 }
1998 /**
1999 * Returns the brand short code for the given name
2000 *
2001 * @param string $brand brand name
2002 *
2003 * @return string
2004 *
2005 * @deprecated since 4.0 - short codes might be removed in next major release
2006 */
2007 public static function getShortCode(string $brand) : string
2008 {
2009 return (string) \array_search($brand, self::$deviceBrands) ?: '';
2010 }
2011 /**
2012 * Sets the useragent to be parsed
2013 *
2014 * @param string $userAgent
2015 */
2016 public function setUserAgent(string $userAgent) : void
2017 {
2018 $this->reset();
2019 parent::setUserAgent($userAgent);
2020 }
2021 /**
2022 * @inheritdoc
2023 */
2024 public function parse() : ?array
2025 {
2026 $resultClientHint = $this->parseClientHints();
2027 $deviceModel = $resultClientHint['model'] ?? '';
2028 // is freeze user-agent then restoring the original UA for the device definition
2029 if ('' !== $deviceModel && \preg_match('~Android 10[.\\d]*; K(?: Build/|[;)])~i', $this->userAgent)) {
2030 $osVersion = $this->clientHints ? $this->clientHints->getOperatingSystemVersion() : '';
2031 $this->setUserAgent((string) \preg_replace('(Android 10[.\\d]*; K)', \sprintf('Android %s; %s', '' !== $osVersion ? $osVersion : '10', $deviceModel), $this->userAgent));
2032 }
2033 if ('' === $deviceModel && $this->hasDesktopFragment()) {
2034 return $this->getResult();
2035 }
2036 $brand = '';
2037 $regexes = $this->getRegexes();
2038 foreach ($regexes as $brand => $regex) {
2039 $matches = $this->matchUserAgent($regex['regex']);
2040 if ($matches) {
2041 break;
2042 }
2043 }
2044 if (empty($matches)) {
2045 return $resultClientHint;
2046 }
2047 if ('Unknown' !== $brand) {
2048 if (!\in_array($brand, self::$deviceBrands)) {
2049 // This Exception should never be thrown. If so a defined brand name is missing in $deviceBrands
2050 throw new \Exception(\sprintf("The brand with name '%s' should be listed in deviceBrands array. Tried to parse user agent: %s", $brand, $this->userAgent));
2051 // @codeCoverageIgnore
2052 }
2053 $this->brand = (string) $brand;
2054 }
2055 if (isset($regex['device']) && \array_key_exists($regex['device'], self::$deviceTypes)) {
2056 $this->deviceType = self::$deviceTypes[$regex['device']];
2057 }
2058 $this->model = '';
2059 if (isset($regex['model'])) {
2060 $this->model = $this->buildModel($regex['model'], $matches);
2061 }
2062 if (isset($regex['models'])) {
2063 $modelRegex = '';
2064 foreach ($regex['models'] as $modelRegex) {
2065 $modelMatches = $this->matchUserAgent($modelRegex['regex']);
2066 if ($modelMatches) {
2067 break;
2068 }
2069 }
2070 if (empty($modelMatches)) {
2071 return $this->getResult();
2072 }
2073 $this->model = $this->buildModel($modelRegex['model'], $modelMatches);
2074 if (isset($modelRegex['brand']) && \in_array($modelRegex['brand'], self::$deviceBrands)) {
2075 $this->brand = (string) $modelRegex['brand'];
2076 }
2077 if (isset($modelRegex['device']) && \array_key_exists($modelRegex['device'], self::$deviceTypes)) {
2078 $this->deviceType = self::$deviceTypes[$modelRegex['device']];
2079 }
2080 }
2081 return $this->getResult();
2082 }
2083 /**
2084 * @param string $model
2085 * @param array $matches
2086 *
2087 * @return string
2088 */
2089 protected function buildModel(string $model, array $matches) : string
2090 {
2091 $model = $this->buildByMatch($model, $matches);
2092 $model = \str_replace('_', ' ', $model);
2093 $model = \preg_replace('/ TD$/i', '', $model);
2094 if ('Build' === $model || empty($model)) {
2095 return '';
2096 }
2097 return \trim($model);
2098 }
2099 /**
2100 * @return array|null
2101 */
2102 protected function parseClientHints() : ?array
2103 {
2104 if ($this->clientHints && $this->clientHints->getModel()) {
2105 return ['deviceType' => null, 'model' => $this->clientHints->getModel(), 'brand' => ''];
2106 }
2107 return null;
2108 }
2109 /**
2110 * Returns if the parsed UA contains the 'Windows NT;' or 'X11; Linux x86_64' fragments
2111 *
2112 * @return bool
2113 */
2114 protected function hasDesktopFragment() : bool
2115 {
2116 $regexExcludeDesktopFragment = \implode('|', ['CE-HTML', ' Mozilla/|Andr[o0]id|Tablet|Mobile|iPhone|Windows Phone|ricoh|OculusBrowser', 'PicoBrowser|Lenovo|compatible; MSIE|Trident/|Tesla/|XBOX|FBMD/|ARM; ?([^)]+)']);
2117 return $this->matchUserAgent('(?:Windows (?:NT|IoT)|X11; Linux x86_64)') && !$this->matchUserAgent($regexExcludeDesktopFragment);
2118 }
2119 /**
2120 * Resets the stored values
2121 */
2122 protected function reset() : void
2123 {
2124 $this->deviceType = null;
2125 $this->model = '';
2126 $this->brand = '';
2127 }
2128 /**
2129 * @return array
2130 */
2131 protected function getResult() : array
2132 {
2133 return ['deviceType' => $this->deviceType, 'model' => $this->model, 'brand' => $this->brand];
2134 }
2135 }
2136