Files
app-odoo/app_common/lib/ua_parser/_regexes.py
2021-12-03 14:20:22 +08:00

7407 lines
162 KiB
Python

# -*- coding: utf-8 -*-
############################################
# NOTICE: This file is autogenerated from #
# regexes.yaml. Do not edit by hand, #
# instead, re-run `setup.py build_regexes` #
############################################
from __future__ import absolute_import, unicode_literals
from .user_agent_parser import (
UserAgentParser, DeviceParser, OSParser,
)
__all__ = (
'USER_AGENT_PARSERS', 'DEVICE_PARSERS', 'OS_PARSERS',
)
USER_AGENT_PARSERS = [
UserAgentParser(
'^(Luminary)[Stage]+/(\\d+) CFNetwork',
None,
None,
None,
),
UserAgentParser(
'(ESPN)[%20| ]+Radio/(\\d+)\\.(\\d+)\\.(\\d+) CFNetwork',
None,
None,
None,
),
UserAgentParser(
'(Antenna)/(\\d+) CFNetwork',
'AntennaPod',
None,
None,
),
UserAgentParser(
'(TopPodcasts)Pro/(\\d+) CFNetwork',
None,
None,
None,
),
UserAgentParser(
'(MusicDownloader)Lite/(\\d+)\\.(\\d+)\\.(\\d+) CFNetwork',
None,
None,
None,
),
UserAgentParser(
'^(.*)-iPad\\/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork',
None,
None,
None,
),
UserAgentParser(
'^(.*)-iPhone/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork',
None,
None,
None,
),
UserAgentParser(
'^(.*)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork',
None,
None,
None,
),
UserAgentParser(
'^(Luminary)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(espn\\.go)',
'ESPN',
None,
None,
),
UserAgentParser(
'(espnradio\\.com)',
'ESPN',
None,
None,
),
UserAgentParser(
'ESPN APP$',
'ESPN',
None,
None,
),
UserAgentParser(
'(audioboom\\.com)',
'AudioBoom',
None,
None,
),
UserAgentParser(
' (Rivo) RHYTHM',
None,
None,
None,
),
UserAgentParser(
'(CFNetwork)(?:/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)',
'CFNetwork',
None,
None,
),
UserAgentParser(
'(Pingdom\\.com_bot_version_)(\\d+)\\.(\\d+)',
'PingdomBot',
None,
None,
),
UserAgentParser(
'(PingdomTMS)/(\\d+)\\.(\\d+)\\.(\\d+)',
'PingdomBot',
None,
None,
),
UserAgentParser(
' (PTST)/(\\d+)(?:\\.(\\d+)|)$',
'WebPageTest.org bot',
None,
None,
),
UserAgentParser(
'X11; (Datanyze); Linux',
None,
None,
None,
),
UserAgentParser(
'(NewRelicPinger)/(\\d+)\\.(\\d+)',
'NewRelicPingerBot',
None,
None,
),
UserAgentParser(
'(Tableau)/(\\d+)\\.(\\d+)',
'Tableau',
None,
None,
),
UserAgentParser(
'AppleWebKit/\\d+\\.\\d+.* Safari.* (CreativeCloud)/(\\d+)\\.(\\d+).(\\d+)',
'Adobe CreativeCloud',
None,
None,
),
UserAgentParser(
'(Salesforce)(?:.)\\/(\\d+)\\.(\\d?)',
None,
None,
None,
),
UserAgentParser(
'(\\(StatusCake\\))',
'StatusCakeBot',
None,
None,
),
UserAgentParser(
'(facebookexternalhit)/(\\d+)\\.(\\d+)',
'FacebookBot',
None,
None,
),
UserAgentParser(
'Google.*/\\+/web/snippet',
'GooglePlusBot',
None,
None,
),
UserAgentParser(
'via ggpht\\.com GoogleImageProxy',
'GmailImageProxy',
None,
None,
),
UserAgentParser(
'YahooMailProxy; https://help\\.yahoo\\.com/kb/yahoo-mail-proxy-SLN28749\\.html',
'YahooMailProxy',
None,
None,
),
UserAgentParser(
'(Twitterbot)/(\\d+)\\.(\\d+)',
'Twitterbot',
None,
None,
),
UserAgentParser(
'/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \\-](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'\\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(MSIE) (\\d+)\\.(\\d+)([a-z]\\d|[a-z]|);.* MSIECrawler',
'MSIECrawler',
None,
None,
),
UserAgentParser(
'(DAVdroid)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest|axios|unirest-(?:java|python|ruby|nodejs|php|net))(?:[ /](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)',
None,
None,
None,
),
UserAgentParser(
'(Pinterest(?:bot|))/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)[;\\s(]+\\+https://www.pinterest.com/bot.html',
'Pinterestbot',
None,
None,
),
UserAgentParser(
'(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\\/\\$BotVersion|123metaspider-Bot|1470\\.net crawler|50\\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\\b\\w{0,30}favicon\\w{0,30}\\b|\\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\\(S\\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\\.almaden\\.ibm\\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\\.ze\\.bz|ZooShot|ZyBorg)(?:[ /]v?(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)|)',
None,
None,
None,
),
UserAgentParser(
'\\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?|dotnet-(?:\\d{1,2}|core)))|s3fs)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'\\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)',
'Facebook Messenger',
None,
None,
),
UserAgentParser(
'\\[FB.*;(FBAV)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)',
'Facebook',
None,
None,
),
UserAgentParser(
'\\[FB.*;',
'Facebook',
None,
None,
),
UserAgentParser(
'(?:\\/[A-Za-z0-9\\.]+|) {0,5}([A-Za-z0-9 \\-_\\!\\[\\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)',
None,
None,
None,
),
UserAgentParser(
'((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\\b(?:(?:[ /]| v)(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)',
None,
None,
None,
),
UserAgentParser(
'((?:[A-z0-9]{1,50}|[A-z\\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)',
None,
None,
None,
),
UserAgentParser(
'(HbbTV)/(\\d+)\\.(\\d+)\\.(\\d+) \\(',
None,
None,
None,
),
UserAgentParser(
'(Chimera|SeaMonkey|Camino|Waterfox)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*|)',
None,
None,
None,
),
UserAgentParser(
'(SailfishBrowser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'Sailfish Browser',
None,
None,
),
UserAgentParser(
'\\[(Pinterest)/[^\\]]+\\]',
None,
None,
None,
),
UserAgentParser(
'(Pinterest)(?: for Android(?: Tablet|)|)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'Mozilla.*Mobile.*(Instagram).(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'Mozilla.*Mobile.*(Flipboard).(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'Mozilla.*Mobile.*(Flipboard-Briefing).(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'Mozilla.*Mobile.*(Onefootball)\\/Android.(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Snapchat)\\/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\\/(\\d+)\\.(\\d+)|)',
'Twitter',
None,
None,
),
UserAgentParser(
'(Firefox)/(\\d+)\\.(\\d+) Basilisk/(\\d+)',
'Basilisk',
None,
None,
),
UserAgentParser(
'(PaleMoon)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'Pale Moon',
None,
None,
),
UserAgentParser(
'(Fennec)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)',
'Firefox Mobile',
None,
None,
),
UserAgentParser(
'(Fennec)/(\\d+)\\.(\\d+)(pre)',
'Firefox Mobile',
None,
None,
),
UserAgentParser(
'(Fennec)/(\\d+)\\.(\\d+)',
'Firefox Mobile',
None,
None,
),
UserAgentParser(
'(?:Mobile|Tablet);.*(Firefox)/(\\d+)\\.(\\d+)',
'Firefox Mobile',
None,
None,
),
UserAgentParser(
'(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre|))',
'Firefox ($1)',
None,
None,
),
UserAgentParser(
'(Firefox)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)',
'Firefox Alpha',
None,
None,
),
UserAgentParser(
'(Firefox)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)',
'Firefox Beta',
None,
None,
),
UserAgentParser(
'(Firefox)-(?:\\d+\\.\\d+|)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)',
'Firefox Alpha',
None,
None,
),
UserAgentParser(
'(Firefox)-(?:\\d+\\.\\d+|)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)',
'Firefox Beta',
None,
None,
),
UserAgentParser(
'(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*|)',
'Firefox ($1)',
None,
None,
),
UserAgentParser(
'(Firefox).*Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)',
'MicroB',
None,
None,
),
UserAgentParser(
'(MozillaDeveloperPreview)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*|)',
None,
None,
None,
),
UserAgentParser(
'(FxiOS)/(\\d+)\\.(\\d+)(\\.(\\d+)|)(\\.(\\d+)|)',
'Firefox iOS',
None,
None,
),
UserAgentParser(
'(Flock)/(\\d+)\\.(\\d+)(b\\d+?)',
None,
None,
None,
),
UserAgentParser(
'(RockMelt)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Navigator)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Netscape',
None,
None,
),
UserAgentParser(
'(Navigator)/(\\d+)\\.(\\d+)([ab]\\d+)',
'Netscape',
None,
None,
),
UserAgentParser(
'(Netscape6)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+|)',
'Netscape',
None,
None,
),
UserAgentParser(
'(MyIBrow)/(\\d+)\\.(\\d+)',
'My Internet Browser',
None,
None,
),
UserAgentParser(
'(UC? ?Browser|UCWEB|U3)[ /]?(\\d+)\\.(\\d+)\\.(\\d+)',
'UC Browser',
None,
None,
),
UserAgentParser(
'(Opera Tablet).*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(Opera Mini)(?:/att|)/?(\\d+|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(Opera)/.+Opera Mobi.+Version/(\\d+)\\.(\\d+)',
'Opera Mobile',
None,
None,
),
UserAgentParser(
'(Opera)/(\\d+)\\.(\\d+).+Opera Mobi',
'Opera Mobile',
None,
None,
),
UserAgentParser(
'Opera Mobi.+(Opera)(?:/|\\s+)(\\d+)\\.(\\d+)',
'Opera Mobile',
None,
None,
),
UserAgentParser(
'Opera Mobi',
'Opera Mobile',
None,
None,
),
UserAgentParser(
'(Opera)/9.80.*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(?:Mobile Safari).*(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Opera Mobile',
None,
None,
),
UserAgentParser(
'(?:Chrome).*(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Opera',
None,
None,
),
UserAgentParser(
'(Coast)/(\\d+).(\\d+).(\\d+)',
'Opera Coast',
None,
None,
),
UserAgentParser(
'(OPiOS)/(\\d+).(\\d+).(\\d+)',
'Opera Mini',
None,
None,
),
UserAgentParser(
'Chrome/.+( MMS)/(\\d+).(\\d+).(\\d+)',
'Opera Neon',
None,
None,
),
UserAgentParser(
'(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'webOS Browser',
None,
None,
),
UserAgentParser(
'(luakit)',
'LuaKit',
None,
None,
),
UserAgentParser(
'(Snowshoe)/(\\d+)\\.(\\d+).(\\d+)',
None,
None,
None,
),
UserAgentParser(
'Gecko/\\d+ (Lightning)/(\\d+)\\.(\\d+)\\.?((?:[ab]?\\d+[a-z]*)|(?:\\d*))',
None,
None,
None,
),
UserAgentParser(
'(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre|)) \\(Swiftfox\\)',
'Swiftfox',
None,
None,
),
UserAgentParser(
'(Firefox)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*|) \\(Swiftfox\\)',
'Swiftfox',
None,
None,
),
UserAgentParser(
'(rekonq)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|) Safari',
'Rekonq',
None,
None,
),
UserAgentParser(
'rekonq',
'Rekonq',
None,
None,
),
UserAgentParser(
'(conkeror|Conkeror)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'Conkeror',
None,
None,
),
UserAgentParser(
'(konqueror)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Konqueror',
None,
None,
),
UserAgentParser(
'(WeTab)-Browser',
None,
None,
None,
),
UserAgentParser(
'(Comodo_Dragon)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Comodo Dragon',
None,
None,
),
UserAgentParser(
'(Symphony) (\\d+).(\\d+)',
None,
None,
None,
),
UserAgentParser(
'PLAYSTATION 3.+WebKit',
'NetFront NX',
None,
None,
),
UserAgentParser(
'PLAYSTATION 3',
'NetFront',
None,
None,
),
UserAgentParser(
'(PlayStation Portable)',
'NetFront',
None,
None,
),
UserAgentParser(
'(PlayStation Vita)',
'NetFront NX',
None,
None,
),
UserAgentParser(
'AppleWebKit.+ (NX)/(\\d+)\\.(\\d+)\\.(\\d+)',
'NetFront NX',
None,
None,
),
UserAgentParser(
'(Nintendo 3DS)',
'NetFront NX',
None,
None,
),
UserAgentParser(
'(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+)|)',
'Amazon Silk',
None,
None,
),
UserAgentParser(
'(Puffin)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'Windows Phone .*(Edge)/(\\d+)\\.(\\d+)',
'Edge Mobile',
None,
None,
),
UserAgentParser(
'(EdgA)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
'Edge Mobile',
None,
None,
),
UserAgentParser(
'(EdgiOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
'Edge Mobile',
None,
None,
),
UserAgentParser(
'(SamsungBrowser)/(\\d+)\\.(\\d+)',
'Samsung Internet',
None,
None,
),
UserAgentParser(
'(SznProhlizec)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'Seznam prohlížeč',
None,
None,
),
UserAgentParser(
'(coc_coc_browser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'Coc Coc',
None,
None,
),
UserAgentParser(
'(baidubrowser)[/\\s](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)',
'Baidu Browser',
None,
None,
),
UserAgentParser(
'(FlyFlow)/(\\d+)\\.(\\d+)',
'Baidu Explorer',
None,
None,
),
UserAgentParser(
'(MxBrowser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'Maxthon',
None,
None,
),
UserAgentParser(
'(Crosswalk)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Line)/(\\d+)\\.(\\d+)\\.(\\d+)',
'LINE',
None,
None,
),
UserAgentParser(
'(MiuiBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)',
'MiuiBrowser',
None,
None,
),
UserAgentParser(
'(Mint Browser)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Mint Browser',
None,
None,
),
UserAgentParser(
'(TopBuzz)/(\\d+).(\\d+).(\\d+)',
'TopBuzz',
None,
None,
),
UserAgentParser(
'Mozilla.+Android.+(GSA)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Google',
None,
None,
),
UserAgentParser(
'(MQQBrowser/Mini)(?:(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)',
'QQ Browser Mini',
None,
None,
),
UserAgentParser(
'(MQQBrowser)(?:/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)',
'QQ Browser Mobile',
None,
None,
),
UserAgentParser(
'(QQBrowser)(?:/(\\d+)(?:\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)|)',
'QQ Browser',
None,
None,
),
UserAgentParser(
'Version/.+(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
'Chrome Mobile WebView',
None,
None,
),
UserAgentParser(
'; wv\\).+(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
'Chrome Mobile WebView',
None,
None,
),
UserAgentParser(
'(CrMo)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
'Chrome Mobile',
None,
None,
),
UserAgentParser(
'(CriOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
'Chrome Mobile iOS',
None,
None,
),
UserAgentParser(
'(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile(?:[ /]|$)',
'Chrome Mobile',
None,
None,
),
UserAgentParser(
' Mobile .*(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
'Chrome Mobile',
None,
None,
),
UserAgentParser(
'(chromeframe)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Chrome Frame',
None,
None,
),
UserAgentParser(
'(SLP Browser)/(\\d+)\\.(\\d+)',
'Tizen Browser',
None,
None,
),
UserAgentParser(
'(SE 2\\.X) MetaSr (\\d+)\\.(\\d+)',
'Sogou Explorer',
None,
None,
),
UserAgentParser(
'(Rackspace Monitoring)/(\\d+)\\.(\\d+)',
'RackspaceBot',
None,
None,
),
UserAgentParser(
'(PyAMF)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(YaBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Yandex Browser',
None,
None,
),
UserAgentParser(
'(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+).* MRCHROME',
'Mail.ru Chromium Browser',
None,
None,
),
UserAgentParser(
'(AOL) (\\d+)\\.(\\d+); AOLBuild (\\d+)',
None,
None,
None,
),
UserAgentParser(
'(PodCruncher|Downcast)[ /]?(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
' (BoxNotes)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Whale)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile(?:[ /]|$)',
'Whale',
None,
None,
),
UserAgentParser(
'(Whale)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Whale',
None,
None,
),
UserAgentParser(
'(1Password)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Ghost)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Slack_SSB)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Slack Desktop Client',
None,
None,
),
UserAgentParser(
'(HipChat)/?(\\d+|)',
'HipChat Desktop Client',
None,
None,
),
UserAgentParser(
'\\b(MobileIron|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Spotify|Flock|Netscape|Lunascape|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave|MacOutlook|Electron|OktaMobile)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'Microsoft Office Outlook 12\\.\\d+\\.\\d+|MSOffice 12',
'Outlook',
'2007',
None,
),
UserAgentParser(
'Microsoft Outlook 14\\.\\d+\\.\\d+|MSOffice 14',
'Outlook',
'2010',
None,
),
UserAgentParser(
'Microsoft Outlook 15\\.\\d+\\.\\d+',
'Outlook',
'2013',
None,
),
UserAgentParser(
'Microsoft Outlook (?:Mail )?16\\.\\d+\\.\\d+|MSOffice 16',
'Outlook',
'2016',
None,
),
UserAgentParser(
'Microsoft Office (Word) 2014',
None,
None,
None,
),
UserAgentParser(
'Outlook-Express\\/7\\.0.*',
'Windows Live Mail',
None,
None,
),
UserAgentParser(
'(Airmail) (\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(Thunderbird)/(\\d+)\\.(\\d+)(?:\\.(\\d+(?:pre|))|)',
'Thunderbird',
None,
None,
),
UserAgentParser(
'(Postbox)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Postbox',
None,
None,
),
UserAgentParser(
'(Barca(?:Pro)?)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'Barca',
None,
None,
),
UserAgentParser(
'(Lotus-Notes)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'Lotus Notes',
None,
None,
),
UserAgentParser(
'Superhuman',
'Superhuman',
None,
None,
),
UserAgentParser(
'(Vivaldi)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Edge?)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)',
'Edge',
None,
None,
),
UserAgentParser(
'(brave)/(\\d+)\\.(\\d+)\\.(\\d+) Chrome',
'Brave',
None,
None,
),
UserAgentParser(
'(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)[\\d.]* Iron[^/]',
'Iron',
None,
None,
),
UserAgentParser(
'\\b(Dolphin)(?: |HDCN/|/INT\\-)(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(HeadlessChrome)(?:/(\\d+)\\.(\\d+)\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(Evolution)/(\\d+)\\.(\\d+)\\.(\\d+\\.\\d+)',
None,
None,
None,
),
UserAgentParser(
'(RCM CardDAV plugin)/(\\d+)\\.(\\d+)\\.(\\d+(?:-dev|))',
None,
None,
None,
),
UserAgentParser(
'(bingbot|Bolt|AdobeAIR|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin|qutebrowser|Otter|QupZilla|MailBar|kmail2|YahooMobileMail|ExchangeWebServices|ExchangeServicesClient|Dragon|Outlook-iOS-Android)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(Chromium|Chrome)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(IEMobile)[ /](\\d+)\\.(\\d+)',
'IE Mobile',
None,
None,
),
UserAgentParser(
'(BacaBerita App)\\/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'^(bPod|Pocket Casts|Player FM)$',
None,
None,
None,
),
UserAgentParser(
'^(AlexaMediaPlayer|VLC)/(\\d+)\\.(\\d+)\\.([^.\\s]+)',
None,
None,
None,
),
UserAgentParser(
'^(AntennaPod|WMPlayer|Zune|Podkicker|Radio|ExoPlayerDemo|Overcast|PocketTunes|NSPlayer|okhttp|DoggCatcher|QuickNews|QuickTime|Peapod|Podcasts|GoldenPod|VLC|Spotify|Miro|MediaGo|Juice|iPodder|gPodder|Banshee)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'^(Peapod|Liferea)/([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)',
None,
None,
None,
),
UserAgentParser(
'^(bPod|Player FM) BMID/(\\S+)',
None,
None,
None,
),
UserAgentParser(
'^(Podcast ?Addict)/v(\\d+) ',
None,
None,
None,
),
UserAgentParser(
'^(Podcast ?Addict) ',
'PodcastAddict',
None,
None,
),
UserAgentParser(
'(Replay) AV',
None,
None,
None,
),
UserAgentParser(
'(VOX) Music Player',
None,
None,
None,
),
UserAgentParser(
'(CITA) RSS Aggregator/(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Pocket Casts)$',
None,
None,
None,
),
UserAgentParser(
'(Player FM)$',
None,
None,
None,
),
UserAgentParser(
'(LG Player|Doppler|FancyMusic|MediaMonkey|Clementine) (\\d+)\\.(\\d+)\\.?([^.\\s]+|)\\.?([^.\\s]+|)',
None,
None,
None,
),
UserAgentParser(
'(philpodder)/(\\d+)\\.(\\d+)\\.?([^.\\s]+|)\\.?([^.\\s]+|)',
None,
None,
None,
),
UserAgentParser(
'(Player FM|Pocket Casts|DoggCatcher|Spotify|MediaMonkey|MediaGo|BashPodder)',
None,
None,
None,
),
UserAgentParser(
'(QuickTime)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Kinoma)(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Fancy) Cloud Music (\\d+)\\.(\\d+)',
'FancyMusic',
None,
None,
),
UserAgentParser(
'EspnDownloadManager',
'ESPN',
None,
None,
),
UserAgentParser(
'(ESPN) Radio (\\d+)\\.(\\d+)(?:\\.(\\d+)|) ?(?:rv:(\\d+)|) ',
None,
None,
None,
),
UserAgentParser(
'(podracer|jPodder) v ?(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(ZDM)/(\\d+)\\.(\\d+)[; ]?',
None,
None,
None,
),
UserAgentParser(
'(Zune|BeyondPod) (\\d+)(?:\\.(\\d+)|)[\\);]',
None,
None,
None,
),
UserAgentParser(
'(WMPlayer)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'^(Lavf)',
'WMPlayer',
None,
None,
),
UserAgentParser(
'^(RSSRadio)[ /]?(\\d+|)',
None,
None,
None,
),
UserAgentParser(
'(RSS_Radio) (\\d+)\\.(\\d+)',
'RSSRadio',
None,
None,
),
UserAgentParser(
'(Podkicker) \\S+/(\\d+)\\.(\\d+)\\.(\\d+)',
'Podkicker',
None,
None,
),
UserAgentParser(
'^(HTC) Streaming Player \\S+ / \\S+ / \\S+ / (\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'^(Stitcher)/iOS',
None,
None,
None,
),
UserAgentParser(
'^(Stitcher)/Android',
None,
None,
None,
),
UserAgentParser(
'^(VLC) .*version (\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
' (VLC) for',
None,
None,
None,
),
UserAgentParser(
'(vlc)/(\\d+)\\.(\\d+)\\.(\\d+)',
'VLC',
None,
None,
),
UserAgentParser(
'^(foobar)\\S+/([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)',
None,
None,
None,
),
UserAgentParser(
'^(Clementine)\\S+ ([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)',
None,
None,
None,
),
UserAgentParser(
'(amarok)/([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)',
'Amarok',
None,
None,
),
UserAgentParser(
'(Custom)-Feed Reader',
None,
None,
None,
),
UserAgentParser(
'(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(Kindle)/(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Android) Donut',
None,
'1',
'2',
),
UserAgentParser(
'(Android) Eclair',
None,
'2',
'1',
),
UserAgentParser(
'(Android) Froyo',
None,
'2',
'2',
),
UserAgentParser(
'(Android) Gingerbread',
None,
'2',
'3',
),
UserAgentParser(
'(Android) Honeycomb',
None,
'3',
None,
),
UserAgentParser(
'(MSIE) (\\d+)\\.(\\d+).*XBLWP7',
'IE Large Screen',
None,
None,
),
UserAgentParser(
'(Nextcloud)',
None,
None,
None,
),
UserAgentParser(
'(mirall)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(ownCloud-android)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Owncloud',
None,
None,
),
UserAgentParser(
'(OC)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) \\(Skype for Business\\)',
'Skype',
None,
None,
),
UserAgentParser(
'(Obigo)InternetBrowser',
None,
None,
None,
),
UserAgentParser(
'(Obigo)\\-Browser',
None,
None,
None,
),
UserAgentParser(
'(Obigo|OBIGO)[^\\d]*(\\d+)(?:.(\\d+)|)',
'Obigo',
None,
None,
),
UserAgentParser(
'(MAXTHON|Maxthon) (\\d+)\\.(\\d+)',
'Maxthon',
None,
None,
),
UserAgentParser(
'(Maxthon|MyIE2|Uzbl|Shiira)',
None,
'0',
None,
),
UserAgentParser(
'(BrowseX) \\((\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(NCSA_Mosaic)/(\\d+)\\.(\\d+)',
'NCSA Mosaic',
None,
None,
),
UserAgentParser(
'(POLARIS)/(\\d+)\\.(\\d+)',
'Polaris',
None,
None,
),
UserAgentParser(
'(Embider)/(\\d+)\\.(\\d+)',
'Polaris',
None,
None,
),
UserAgentParser(
'(BonEcho)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+|)',
'Bon Echo',
None,
None,
),
UserAgentParser(
'(TopBuzz) com.alex.NewsMaster/(\\d+).(\\d+).(\\d+)',
'TopBuzz',
None,
None,
),
UserAgentParser(
'(TopBuzz) com.mobilesrepublic.newsrepublic/(\\d+).(\\d+).(\\d+)',
'TopBuzz',
None,
None,
),
UserAgentParser(
'(TopBuzz) com.topbuzz.videoen/(\\d+).(\\d+).(\\d+)',
'TopBuzz',
None,
None,
),
UserAgentParser(
'(iPod|iPhone|iPad).+GSA/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|) Mobile',
'Google',
None,
None,
),
UserAgentParser(
'(iPod|iPhone|iPad).+Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|).*[ +]Safari',
'Mobile Safari',
None,
None,
),
UserAgentParser(
'(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\\d+)_(\\d+)(?:_(\\d+)|).* AppleNews\\/\\d+\\.\\d+\\.\\d+?',
'Mobile Safari UI/WKWebView',
None,
None,
),
UserAgentParser(
'(iPod|iPhone|iPad).+Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'Mobile Safari UI/WKWebView',
None,
None,
),
UserAgentParser(
'(iPod|iPod touch|iPhone|iPad).* Safari',
'Mobile Safari',
None,
None,
),
UserAgentParser(
'(iPod|iPod touch|iPhone|iPad)',
'Mobile Safari UI/WKWebView',
None,
None,
),
UserAgentParser(
'(Watch)(\\d+),(\\d+)',
'Apple $1 App',
None,
None,
),
UserAgentParser(
'(Outlook-iOS)/\\d+\\.\\d+\\.prod\\.iphone \\((\\d+)\\.(\\d+)\\.(\\d+)\\)',
None,
None,
None,
),
UserAgentParser(
'(AvantGo) (\\d+).(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(OneBrowser)/(\\d+).(\\d+)',
'ONE Browser',
None,
None,
),
UserAgentParser(
'(Avant)',
None,
'1',
None,
),
UserAgentParser(
'(QtCarBrowser)',
None,
'1',
None,
),
UserAgentParser(
'^(iBrowser/Mini)(\\d+).(\\d+)',
'iBrowser Mini',
None,
None,
),
UserAgentParser(
'^(iBrowser|iRAPP)/(\\d+).(\\d+)',
None,
None,
None,
),
UserAgentParser(
'^(Nokia)',
'Nokia Services (WAP) Browser',
None,
None,
),
UserAgentParser(
'(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)\\.(\\d+)',
'Nokia Browser',
None,
None,
),
UserAgentParser(
'(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)',
'Nokia Browser',
None,
None,
),
UserAgentParser(
'(NokiaBrowser)/(\\d+)\\.(\\d+)',
'Nokia Browser',
None,
None,
),
UserAgentParser(
'(BrowserNG)/(\\d+)\\.(\\d+).(\\d+)',
'Nokia Browser',
None,
None,
),
UserAgentParser(
'(Series60)/5\\.0',
'Nokia Browser',
'7',
'0',
),
UserAgentParser(
'(Series60)/(\\d+)\\.(\\d+)',
'Nokia OSS Browser',
None,
None,
),
UserAgentParser(
'(S40OviBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
'Ovi Browser',
None,
None,
),
UserAgentParser(
'(Nokia)[EN]?(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(PlayBook).+RIM Tablet OS (\\d+)\\.(\\d+)\\.(\\d+)',
'BlackBerry WebKit',
None,
None,
),
UserAgentParser(
'(Black[bB]erry|BB10).+Version/(\\d+)\\.(\\d+)\\.(\\d+)',
'BlackBerry WebKit',
None,
None,
),
UserAgentParser(
'(Black[bB]erry)\\s?(\\d+)',
'BlackBerry',
None,
None,
),
UserAgentParser(
'(OmniWeb)/v(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Blazer)/(\\d+)\\.(\\d+)',
'Palm Blazer',
None,
None,
),
UserAgentParser(
'(Pre)/(\\d+)\\.(\\d+)',
'Palm Pre',
None,
None,
),
UserAgentParser(
'(ELinks)/(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(ELinks) \\((\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Links) \\((\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(QtWeb) Internet Browser/(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(PhantomJS)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(AppleWebKit)/(\\d+)(?:\\.(\\d+)|)\\+ .* Safari',
'WebKit Nightly',
None,
None,
),
UserAgentParser(
'(Version)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|).*Safari/',
'Safari',
None,
None,
),
UserAgentParser(
'(Safari)/\\d+',
None,
None,
None,
),
UserAgentParser(
'(OLPC)/Update(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(OLPC)/Update()\\.(\\d+)',
None,
'0',
None,
),
UserAgentParser(
'(SEMC\\-Browser)/(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Teleca)',
'Teleca Browser',
None,
None,
),
UserAgentParser(
'(Phantom)/V(\\d+)\\.(\\d+)',
'Phantom Browser',
None,
None,
),
UserAgentParser(
'(Trident)/(7|8)\\.(0)',
'IE',
'11',
None,
),
UserAgentParser(
'(Trident)/(6)\\.(0)',
'IE',
'10',
None,
),
UserAgentParser(
'(Trident)/(5)\\.(0)',
'IE',
'9',
None,
),
UserAgentParser(
'(Trident)/(4)\\.(0)',
'IE',
'8',
None,
),
UserAgentParser(
'(Espial)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'(AppleWebKit)/(\\d+)\\.(\\d+)\\.(\\d+)',
'Apple Mail',
None,
None,
),
UserAgentParser(
'(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Firefox)/(\\d+)\\.(\\d+)(pre|[ab]\\d+[a-z]*|)',
None,
None,
None,
),
UserAgentParser(
'([MS]?IE) (\\d+)\\.(\\d+)',
'IE',
None,
None,
),
UserAgentParser(
'(python-requests)/(\\d+)\\.(\\d+)',
'Python Requests',
None,
None,
),
UserAgentParser(
'\\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got)(?:[ /](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)',
None,
None,
None,
),
UserAgentParser(
'(Python/3\\.\\d{1,3} aiohttp)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Python/3\\.\\d{1,3} aiohttp)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Java)[/ ]?\\d+\\.(\\d+)\\.(\\d+)[_-]*([a-zA-Z0-9]+|)',
None,
None,
None,
),
UserAgentParser(
'^(Cyberduck)/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.\\d+|)',
None,
None,
None,
),
UserAgentParser(
'^(S3 Browser) (\\d+)-(\\d+)-(\\d+)(?:\\s*http://s3browser\\.com|)',
None,
None,
None,
),
UserAgentParser(
'(S3Gof3r)',
None,
None,
None,
),
UserAgentParser(
'\\b(ibm-cos-sdk-(?:core|java|js|python))/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
None,
None,
None,
),
UserAgentParser(
'^(rusoto)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'^(rclone)/v(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'^(Roku)/DVP-(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'(Kurio)\\/(\\d+)\\.(\\d+)\\.(\\d+)',
'Kurio App',
None,
None,
),
UserAgentParser(
'^(Box(?: Sync)?)/(\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
),
UserAgentParser(
'^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\\d+)\\.(\\d+)\\.(\\d+)',
'ViaFree',
None,
None,
),
]
DEVICE_PARSERS = [
DeviceParser(
'(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\\d|(?:bot|spider)\\.html)|AdsBot-Google-Mobile.*iPhone)',
'i',
'Spider',
'Spider',
'Smartphone',
),
DeviceParser(
'(?:DoCoMo|\\bMOT\\b|\\bLG\\b|Nokia|Samsung|SonyEricsson).*(?:(?:Bot|Yeti)-Mobile|bots?/\\d|(?:bot|crawler)\\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)',
'i',
'Spider',
'Spider',
'Feature Phone',
),
DeviceParser(
' PTST/\\d+(?:\\.)?\\d+$',
None,
'Spider',
'Spider',
None,
),
DeviceParser(
'X11; Datanyze; Linux',
None,
'Spider',
'Spider',
None,
),
DeviceParser(
'\\bSmartWatch {0,2}\\( {0,2}([^;]+) {0,2}; {0,2}([^;]+) {0,2};',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'Android Application[^\\-]+ - (Sony) ?(Ericsson|) (.+) \\w+ - ',
None,
'$1 $2',
'$1$2',
'$3',
),
DeviceParser(
'Android Application[^\\-]+ - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\\-](.+) \\w+ - ',
'i',
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'Android Application[^\\-]+ - ([^ ]+) (.+) \\w+ - ',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'; *([BLRQ]C\\d{4}[A-Z]+?)(?: Build|\\) AppleWebKit)',
None,
'3Q $1',
'3Q',
'$1',
),
DeviceParser(
'; *(?:3Q_)([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'3Q $1',
'3Q',
'$1',
),
DeviceParser(
'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\\d{3}|B1-\\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Acer',
'$1',
),
DeviceParser(
'; *Acer Iconia Tab ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Acer',
'$1',
),
DeviceParser(
'; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\\d+)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Acer',
'$1',
),
DeviceParser(
'; *(Acer |ACER )([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Acer',
'$2',
),
DeviceParser(
'; *(Advent |)(Vega(?:Bean|Comb|)).*?(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Advent',
'$2',
),
DeviceParser(
'; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Ainol',
'$2',
),
DeviceParser(
'; *AIRIS[ _\\-]?([^/;\\)]+) *(?:;|\\)|Build)',
'i',
'$1',
'Airis',
'$1',
),
DeviceParser(
'; *(OnePAD[^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'$1',
'Airis',
'$1',
),
DeviceParser(
'; *Airpad[ \\-]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Airpad $1',
'Airpad',
'$1',
),
DeviceParser(
'; *(one ?touch) (EVO7|T10|T20)(?: Build|\\) AppleWebKit)',
None,
'Alcatel One Touch $2',
'Alcatel',
'One Touch $2',
),
DeviceParser(
'; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \\-])([^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'Alcatel One Touch $1',
'Alcatel',
'One Touch $1',
),
DeviceParser(
'; *(TCL)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'; *(Vodafone Smart II|Optimus_Madrid)(?: Build|\\) AppleWebKit)',
None,
'Alcatel $1',
'Alcatel',
'$1',
),
DeviceParser(
'; *BASE_Lutea_3(?: Build|\\) AppleWebKit)',
None,
'Alcatel One Touch 998',
'Alcatel',
'One Touch 998',
),
DeviceParser(
'; *BASE_Varia(?: Build|\\) AppleWebKit)',
None,
'Alcatel One Touch 918D',
'Alcatel',
'One Touch 918D',
),
DeviceParser(
'; *((?:FINE|Fine)\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Allfine',
'$1',
),
DeviceParser(
'; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*?)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Allview',
'$2',
),
DeviceParser(
'; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Allview',
'$2',
),
DeviceParser(
'; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Allview',
'$2',
),
DeviceParser(
'; *(A13-MID)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Allwinner',
'$1',
),
DeviceParser(
'; *(Allwinner)[ _\\-]?([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Allwinner',
'$1',
),
DeviceParser(
'; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Amaway',
'$1',
),
DeviceParser(
'; *(?:AMOI|Amoi)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Amoi $1',
'Amoi',
'$1',
),
DeviceParser(
'^(?:AMOI|Amoi)[ _]([^;/]+?) Linux',
None,
'Amoi $1',
'Amoi',
'$1',
),
DeviceParser(
'; *(MW(?:0[789]|10)[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Aoc',
'$1',
),
DeviceParser(
'; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\\) AppleWebKit)',
None,
'Aoson $1',
'Aoson',
'$1',
),
DeviceParser(
'; *Aoson ([^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'Aoson $1',
'Aoson',
'$1',
),
DeviceParser(
'; *[Aa]panda[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Apanda $1',
'Apanda',
'$1',
),
DeviceParser(
'; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|\\) AppleWebKit)',
None,
'Archos $1',
'Archos',
'$1',
),
DeviceParser(
'ARCHOS; GOGI; ([^;]+);',
None,
'Archos $1',
'Archos',
'$1',
),
DeviceParser(
'(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\\(\\)\\-]|$)',
None,
'Archos $1',
'Archos',
'$1',
),
DeviceParser(
'; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\\) AppleWebKit)',
None,
'Archos $1',
'Archos',
'$1',
),
DeviceParser(
'; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\\) AppleWebKit)',
None,
'Archos $1',
'Archos',
'$1',
),
DeviceParser(
'; *(PAD-FMD[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Arival',
'$1',
),
DeviceParser(
'; *(BioniQ) ?([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Arival',
'$1 $2',
),
DeviceParser(
'; *(AN\\d[^;/]+|ARCHM\\d+)(?: Build|\\) AppleWebKit)',
None,
'Arnova $1',
'Arnova',
'$1',
),
DeviceParser(
'; *(?:ARNOVA|Arnova) ?([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Arnova $1',
'Arnova',
'$1',
),
DeviceParser(
'; *(?:ASSISTANT |)(AP)-?([1789]\\d{2}[A-Z]{0,2}|80104)(?: Build|\\) AppleWebKit)',
None,
'Assistant $1-$2',
'Assistant',
'$1-$2',
),
DeviceParser(
'; *(ME17\\d[^;/]*|ME3\\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\\d{3}[^;/]*|eeepc)(?: Build|\\) AppleWebKit)',
None,
'Asus $1',
'Asus',
'$1',
),
DeviceParser(
'; *ASUS[ _]*([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Asus $1',
'Asus',
'$1',
),
DeviceParser(
'; *Garmin-Asus ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Garmin-Asus $1',
'Garmin-Asus',
'$1',
),
DeviceParser(
'; *(Garminfone)(?: Build|\\) AppleWebKit)',
None,
'Garmin $1',
'Garmin-Asus',
'$1',
),
DeviceParser(
'; (@TAB-[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Attab',
'$1',
),
DeviceParser(
'; *(T-(?:07|[^0]\\d)[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Audiosonic',
'$1',
),
DeviceParser(
'; *(?:Axioo[ _\\-]([^;/]+?)|(picopad)[ _\\-]([^;/]+?))(?: Build|\\) AppleWebKit)',
'i',
'Axioo $1$2 $3',
'Axioo',
'$1$2 $3',
),
DeviceParser(
'; *(V(?:100|700|800)[^;/]*)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Azend',
'$1',
),
DeviceParser(
'; *(IBAK\\-[^;/]*)(?: Build|\\) AppleWebKit)',
'i',
'$1',
'Bak',
'$1',
),
DeviceParser(
'; *(HY5001|HY6501|X12|X21|I5)(?: Build|\\) AppleWebKit)',
None,
'Bedove $1',
'Bedove',
'$1',
),
DeviceParser(
'; *(JC-[^;/]*)(?: Build|\\) AppleWebKit)',
None,
'Benss $1',
'Benss',
'$1',
),
DeviceParser(
'; *(BB) ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Blackberry',
'$2',
),
DeviceParser(
'; *(BlackBird)[ _](I8.*?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'; *(BlackBird)[ _](.*?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Blaupunkt $1',
'Blaupunkt',
'$1',
),
DeviceParser(
'; *((?:BLU|Blu)[ _\\-])([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Blu',
'$2',
),
DeviceParser(
'; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\\.3|TANK 4\\.5)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Blu',
'$1',
),
DeviceParser(
'; *(TOUCH\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Blusens',
'$1',
),
DeviceParser(
'; *(AX5\\d+)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Bmobile',
'$1',
),
DeviceParser(
'; *([Bb]q) ([^;/]+?);?(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'bq',
'$2',
),
DeviceParser(
'; *(Maxwell [^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'bq',
'$1',
),
DeviceParser(
'; *((?:B-Tab|B-TAB) ?\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Braun',
'$1',
),
DeviceParser(
'; *(Broncho) ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'; *CAPTIVA ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Captiva $1',
'Captiva',
'$1',
),
DeviceParser(
'; *(C771|CAL21|IS11CA)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Casio',
'$1',
),
DeviceParser(
'; *(?:Cat|CAT) ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Cat $1',
'Cat',
'$1',
),
DeviceParser(
'; *(?:Cat)(Nova.*?)(?: Build|\\) AppleWebKit)',
None,
'Cat $1',
'Cat',
'$1',
),
DeviceParser(
'; *(INM8002KP|ADM8000KP_[AB])(?: Build|\\) AppleWebKit)',
None,
'$1',
'Cat',
'Tablet PHOENIX 8.1J0',
),
DeviceParser(
'; *(?:[Cc]elkon[ _\\*]|CELKON[ _\\*])([^;/\\)]+) ?(?:Build|;|\\))',
None,
'$1',
'Celkon',
'$1',
),
DeviceParser(
'Build/(?:[Cc]elkon)+_?([^;/_\\)]+)',
None,
'$1',
'Celkon',
'$1',
),
DeviceParser(
'; *(CT)-?(\\d+)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Celkon',
'$1$2',
),
DeviceParser(
'; *(A19|A19Q|A105|A107[^;/\\)]*) ?(?:Build|;|\\))',
None,
'$1',
'Celkon',
'$1',
),
DeviceParser(
'; *(TPC[0-9]{4,5})(?: Build|\\) AppleWebKit)',
None,
'$1',
'ChangJia',
'$1',
),
DeviceParser(
'; *(Cloudfone)[ _](Excite)([^ ][^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2 $3',
'Cloudfone',
'$1 $2 $3',
),
DeviceParser(
'; *(Excite|ICE)[ _](\\d+[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Cloudfone $1 $2',
'Cloudfone',
'Cloudfone $1 $2',
),
DeviceParser(
'; *(Cloudfone|CloudPad)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Cloudfone',
'$1 $2',
),
DeviceParser(
'; *((?:Aquila|Clanga|Rapax)[^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'$1',
'Cmx',
'$1',
),
DeviceParser(
'; *(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\\(3G\\)-4G| GB 8K| 3G| 8K| GB)? *(?:Build|[;\\)])',
None,
'CobyKyros $1$2',
'CobyKyros',
'$1$2',
),
DeviceParser(
'; *([^;/]*)Coolpad[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Coolpad',
'$1$2',
),
DeviceParser(
'; *(CUBE[ _])?([KU][0-9]+ ?GT.*?|A5300)(?: Build|\\) AppleWebKit)',
'i',
'$1$2',
'Cube',
'$2',
),
DeviceParser(
'; *CUBOT ([^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'$1',
'Cubot',
'$1',
),
DeviceParser(
'; *(BOBBY)(?: Build|\\) AppleWebKit)',
'i',
'$1',
'Cubot',
'$1',
),
DeviceParser(
'; *(Dslide [^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Danew',
'$1',
),
DeviceParser(
'; *(XCD)[ _]?(28|35)(?: Build|\\) AppleWebKit)',
None,
'Dell $1$2',
'Dell',
'$1$2',
),
DeviceParser(
'; *(001DL)(?: Build|\\) AppleWebKit)',
None,
'Dell $1',
'Dell',
'Streak',
),
DeviceParser(
'; *(?:Dell|DELL) (Streak)(?: Build|\\) AppleWebKit)',
None,
'Dell $1',
'Dell',
'Streak',
),
DeviceParser(
'; *(101DL|GS01|Streak Pro[^;/]*)(?: Build|\\) AppleWebKit)',
None,
'Dell $1',
'Dell',
'Streak Pro',
),
DeviceParser(
'; *([Ss]treak ?7)(?: Build|\\) AppleWebKit)',
None,
'Dell $1',
'Dell',
'Streak 7',
),
DeviceParser(
'; *(Mini-3iX)(?: Build|\\) AppleWebKit)',
None,
'Dell $1',
'Dell',
'$1',
),
DeviceParser(
'; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*?|Streak[ _]Pro)(?: Build|\\) AppleWebKit)',
None,
'Dell $1',
'Dell',
'$1',
),
DeviceParser(
'; *Dell[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Dell $1',
'Dell',
'$1',
),
DeviceParser(
'; *Dell ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Dell $1',
'Dell',
'$1',
),
DeviceParser(
'; *(TA[CD]-\\d+[^;/]*)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Denver',
'$1',
),
DeviceParser(
'; *(iP[789]\\d{2}(?:-3G)?|IP10\\d{2}(?:-8GB)?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Dex',
'$1',
),
DeviceParser(
'; *(AirTab)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'DNS',
'$1 $2',
),
DeviceParser(
'; *(F\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Fujitsu',
'$1',
),
DeviceParser(
'; *(HT-03A)(?: Build|\\) AppleWebKit)',
None,
'$1',
'HTC',
'Magic',
),
DeviceParser(
'; *(HT\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'HTC',
'$1',
),
DeviceParser(
'; *(L\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'LG',
'$1',
),
DeviceParser(
'; *(N\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Nec',
'$1',
),
DeviceParser(
'; *(P\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Panasonic',
'$1',
),
DeviceParser(
'; *(SC\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Samsung',
'$1',
),
DeviceParser(
'; *(SH\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Sharp',
'$1',
),
DeviceParser(
'; *(SO\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'SonyEricsson',
'$1',
),
DeviceParser(
'; *(T\\-0[12][^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Toshiba',
'$1',
),
DeviceParser(
'; *(DOOV)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'DOOV',
'$2',
),
DeviceParser(
'; *(Enot|ENOT)[ -]?([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Enot',
'$2',
),
DeviceParser(
'; *[^;/]+ Build/(?:CROSS|Cross)+[ _\\-]([^\\)]+)',
None,
'CROSS $1',
'Evercoss',
'Cross $1',
),
DeviceParser(
'; *(CROSS|Cross)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Evercoss',
'Cross $2',
),
DeviceParser(
'; *Explay[_ ](.+?)(?:[\\)]| Build)',
None,
'$1',
'Explay',
'$1',
),
DeviceParser(
'; *(IQ.*?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Fly',
'$1',
),
DeviceParser(
'; *(Fly|FLY)[ _](IQ[^;]+?|F[34]\\d+[^;]*?);?(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Fly',
'$2',
),
DeviceParser(
'; *(M532|Q572|FJL21)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Fujitsu',
'$1',
),
DeviceParser(
'; *(G1)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Galapad',
'$1',
),
DeviceParser(
'; *(Geeksphone) ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'; *(G[^F]?FIVE) ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Gfive',
'$2',
),
DeviceParser(
'; *(Gionee)[ _\\-]([^;/]+?)(?:/[^;/]+|)(?: Build|\\) AppleWebKit)',
'i',
'$1 $2',
'Gionee',
'$2',
),
DeviceParser(
'; *(GN\\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\\) AppleWebKit)',
None,
'Gionee $1',
'Gionee',
'$1',
),
DeviceParser(
'; *(E3) Build/JOP40D',
None,
'Gionee $1',
'Gionee',
'$1',
),
DeviceParser(
'\\sGIONEE[-\\s_](\\w*)',
'i',
'Gionee $1',
'Gionee',
'$1',
),
DeviceParser(
'; *((?:FONE|QUANTUM|INSIGNIA) \\d+[^;/]*|PLAYTAB)(?: Build|\\) AppleWebKit)',
None,
'GoClever $1',
'GoClever',
'$1',
),
DeviceParser(
'; *GOCLEVER ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'GoClever $1',
'GoClever',
'$1',
),
DeviceParser(
'; *(Glass \\d+)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Google',
'$1',
),
DeviceParser(
'; *(Pixel.*?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Google',
'$1',
),
DeviceParser(
'; *(GSmart)[ -]([^/]+)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Gigabyte',
'$1 $2',
),
DeviceParser(
'; *(imx5[13]_[^/]+)(?: Build|\\) AppleWebKit)',
None,
'Freescale $1',
'Freescale',
'$1',
),
DeviceParser(
'; *Haier[ _\\-]([^/]+)(?: Build|\\) AppleWebKit)',
None,
'Haier $1',
'Haier',
'$1',
),
DeviceParser(
'; *(PAD1016)(?: Build|\\) AppleWebKit)',
None,
'Haipad $1',
'Haipad',
'$1',
),
DeviceParser(
'; *(M701|M7|M8|M9)(?: Build|\\) AppleWebKit)',
None,
'Haipad $1',
'Haipad',
'$1',
),
DeviceParser(
'; *(SN\\d+T[^;\\)/]*)(?: Build|[;\\)])',
None,
'Hannspree $1',
'Hannspree',
'$1',
),
DeviceParser(
'Build/HCL ME Tablet ([^;\\)]+)[\\);]',
None,
'HCLme $1',
'HCLme',
'$1',
),
DeviceParser(
'; *([^;\\/]+) Build/HCL',
None,
'HCLme $1',
'HCLme',
'$1',
),
DeviceParser(
'; *(MID-?\\d{4}C[EM])(?: Build|\\) AppleWebKit)',
None,
'Hena $1',
'Hena',
'$1',
),
DeviceParser(
'; *(EG\\d{2,}|HS-[^;/]+|MIRA[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Hisense $1',
'Hisense',
'$1',
),
DeviceParser(
'; *(andromax[^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'Hisense $1',
'Hisense',
'$1',
),
DeviceParser(
'; *(?:AMAZE[ _](S\\d+)|(S\\d+)[ _]AMAZE)(?: Build|\\) AppleWebKit)',
None,
'AMAZE $1$2',
'hitech',
'AMAZE $1$2',
),
DeviceParser(
'; *(PlayBook)(?: Build|\\) AppleWebKit)',
None,
'HP $1',
'HP',
'$1',
),
DeviceParser(
'; *HP ([^/]+)(?: Build|\\) AppleWebKit)',
None,
'HP $1',
'HP',
'$1',
),
DeviceParser(
'; *([^/]+_tenderloin)(?: Build|\\) AppleWebKit)',
None,
'HP TouchPad',
'HP',
'TouchPad',
),
DeviceParser(
'; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\\);]+)\\)',
None,
'$1$2',
'Huawei',
'$2',
),
DeviceParser(
'; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\\d+[^\\);]+)\\)',
None,
'$1',
'Huawei',
'$2',
),
DeviceParser(
'; *(S7|M860) Build',
None,
'$1',
'Huawei',
'$1',
),
DeviceParser(
'; *((?:HUAWEI|Huawei)[ \\-]?)(MediaPad) Build',
None,
'$1$2',
'Huawei',
'$2',
),
DeviceParser(
'; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build',
None,
'$1$2',
'Huawei',
'$2',
),
DeviceParser(
'; *((?:HUAWEI|Huawei)[ _\\-]?)((?:G700-|MT-)[^;/]+) Build',
None,
'$1$2',
'Huawei',
'$2',
),
DeviceParser(
'; *((?:HUAWEI|Huawei)[ _\\-]?)([^;/]+) Build',
None,
'$1$2',
'Huawei',
'$2',
),
DeviceParser(
'; *(MediaPad[^;]+|SpringBoard) Build/Huawei',
None,
'$1',
'Huawei',
'$1',
),
DeviceParser(
'; *([^;]+) Build/(?:Huawei|HUAWEI)',
None,
'$1',
'Huawei',
'$1',
),
DeviceParser(
'; *([Uu])([89]\\d{3}) Build',
None,
'$1$2',
'Huawei',
'U$2',
),
DeviceParser(
'; *(?:Ideos |IDEOS )(S7) Build',
None,
'Huawei Ideos$1',
'Huawei',
'Ideos$1',
),
DeviceParser(
'; *(?:Ideos |IDEOS )([^;/]+\\s*|\\s*)Build',
None,
'Huawei Ideos$1',
'Huawei',
'Ideos$1',
),
DeviceParser(
'; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]',
None,
'Huawei $1',
'Huawei',
'$1',
),
DeviceParser(
'; *((?:[A-Z]{3})\\-L[A-Za0-9]{2})[\\)]',
None,
'Huawei $1',
'Huawei',
'$1',
),
DeviceParser(
'; *HTC[ _]([^;]+); Windows Phone',
None,
'HTC $1',
'HTC',
'$1',
),
DeviceParser(
'; *(?:HTC[ _/])+([^ _/]+)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))',
None,
'HTC $1',
'HTC',
'$1',
),
DeviceParser(
'; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))',
None,
'HTC $1 $2',
'HTC',
'$1 $2',
),
DeviceParser(
'; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))',
None,
'HTC $1 $2 $3',
'HTC',
'$1 $2 $3',
),
DeviceParser(
'; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))',
None,
'HTC $1 $2 $3 $4',
'HTC',
'$1 $2 $3 $4',
),
DeviceParser(
'; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\\)]| - )',
None,
'HTC $1',
'HTC',
'$1',
),
DeviceParser(
'; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\\)]+)|)(?: *Build|[;\\)]| - )',
None,
'HTC $1 $2',
'HTC',
'$1 $2',
),
DeviceParser(
'; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\\)]+)|)|)(?: *Build|[;\\)]| - )',
None,
'HTC $1 $2 $3',
'HTC',
'$1 $2 $3',
),
DeviceParser(
'; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\\)]| - )',
None,
'HTC $1 $2 $3 $4',
'HTC',
'$1 $2 $3 $4',
),
DeviceParser(
'HTC Streaming Player [^\\/]*/[^\\/]*/ htc_([^/]+) /',
None,
'HTC $1',
'HTC',
'$1',
),
DeviceParser(
'(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\\(\\)]|$)',
'i',
'HTC $1',
'HTC',
'$1',
),
DeviceParser(
'; *(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\\+?)\\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\\(\\)])',
'i',
'HTC $1',
'HTC',
'$1',
),
DeviceParser(
'; *(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.+?)(?:[/;\\)]|Build|MIUI|1\\.0)',
'i',
'HTC $1 $2',
'HTC',
'$1 $2',
),
DeviceParser(
'; *HYUNDAI (T\\d[^/]*)(?: Build|\\) AppleWebKit)',
None,
'Hyundai $1',
'Hyundai',
'$1',
),
DeviceParser(
'; *HYUNDAI ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Hyundai $1',
'Hyundai',
'$1',
),
DeviceParser(
'; *(X700|Hold X|MB-6900)(?: Build|\\) AppleWebKit)',
None,
'Hyundai $1',
'Hyundai',
'$1',
),
DeviceParser(
'; *(?:iBall[ _\\-]|)(Andi)[ _]?(\\d[^;/]*)(?: Build|\\) AppleWebKit)',
'i',
'$1 $2',
'iBall',
'$1 $2',
),
DeviceParser(
'; *(IBall)(?:[ _]([^;/]+?)|)(?: Build|\\) AppleWebKit)',
'i',
'$1 $2',
'iBall',
'$2',
),
DeviceParser(
'; *(NT-\\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|)(?: Build|\\) AppleWebKit)',
None,
'$1',
'IconBIT',
'$1',
),
DeviceParser(
'; *(IMO)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'$1 $2',
'IMO',
'$2',
),
DeviceParser(
'; *i-?mobile[ _]([^/]+)(?: Build|\\) AppleWebKit)',
'i',
'i-mobile $1',
'imobile',
'$1',
),
DeviceParser(
'; *(i-(?:style|note)[^/]*)(?: Build|\\) AppleWebKit)',
'i',
'i-mobile $1',
'imobile',
'$1',
),
DeviceParser(
'; *(ImPAD) ?(\\d+(?:.)*?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Impression',
'$1 $2',
),
DeviceParser(
'; *(Infinix)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Infinix',
'$2',
),
DeviceParser(
'; *(Informer)[ \\-]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Informer',
'$2',
),
DeviceParser(
'; *(TAB) ?([78][12]4)(?: Build|\\) AppleWebKit)',
None,
'Intenso $1',
'Intenso',
'$1 $2',
),
DeviceParser(
'; *(?:Intex[ _]|)(AQUA|Aqua)([ _\\.\\-])([^;/]+?) *(?:Build|;)',
None,
'$1$2$3',
'Intex',
'$1 $3',
),
DeviceParser(
'; *(?:INTEX|Intex)(?:[_ ]([^\\ _;/]+))(?:[_ ]([^\\ _;/]+)|) *(?:Build|;)',
None,
'$1 $2',
'Intex',
'$1 $2',
),
DeviceParser(
'; *([iI]Buddy)[ _]?(Connect)(?:_|\\?_| |)([^;/]*) *(?:Build|;)',
None,
'$1 $2 $3',
'Intex',
'iBuddy $2 $3',
),
DeviceParser(
'; *(I-Buddy)[ _]([^;/]+?) *(?:Build|;)',
None,
'$1 $2',
'Intex',
'iBuddy $2',
),
DeviceParser(
'; *(iOCEAN) ([^/]+)(?: Build|\\) AppleWebKit)',
'i',
'$1 $2',
'iOCEAN',
'$2',
),
DeviceParser(
'; *(TP\\d+(?:\\.\\d+|)\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'ionik $1',
'ionik',
'$1',
),
DeviceParser(
'; *(M702pro)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Iru',
'$1',
),
DeviceParser(
'; *(DE88Plus|MD70)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Ivio',
'$1',
),
DeviceParser(
'; *IVIO[_\\-]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Ivio',
'$1',
),
DeviceParser(
'; *(TPC-\\d+|JAY-TECH)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Jaytech',
'$1',
),
DeviceParser(
'; *(JY-[^;/]+|G[234]S?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Jiayu',
'$1',
),
DeviceParser(
'; *(JXD)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'JXD',
'$2',
),
DeviceParser(
'; *Karbonn[ _]?([^;/]+) *(?:Build|;)',
'i',
'$1',
'Karbonn',
'$1',
),
DeviceParser(
'; *([^;]+) Build/Karbonn',
None,
'$1',
'Karbonn',
'$1',
),
DeviceParser(
'; *(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\\d) +Build',
None,
'$1',
'Karbonn',
'$1',
),
DeviceParser(
'; *(IS01|IS03|IS05|IS\\d{2}SH)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Sharp',
'$1',
),
DeviceParser(
'; *(IS04)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Regza',
'$1',
),
DeviceParser(
'; *(IS06|IS\\d{2}PT)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Pantech',
'$1',
),
DeviceParser(
'; *(IS11S)(?: Build|\\) AppleWebKit)',
None,
'$1',
'SonyEricsson',
'Xperia Acro',
),
DeviceParser(
'; *(IS11CA)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Casio',
'GzOne $1',
),
DeviceParser(
'; *(IS11LG)(?: Build|\\) AppleWebKit)',
None,
'$1',
'LG',
'Optimus X',
),
DeviceParser(
'; *(IS11N)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Medias',
'$1',
),
DeviceParser(
'; *(IS11PT)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Pantech',
'MIRACH',
),
DeviceParser(
'; *(IS12F)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Fujitsu',
'Arrows ES',
),
DeviceParser(
'; *(IS12M)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Motorola',
'XT909',
),
DeviceParser(
'; *(IS12S)(?: Build|\\) AppleWebKit)',
None,
'$1',
'SonyEricsson',
'Xperia Acro HD',
),
DeviceParser(
'; *(ISW11F)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Fujitsu',
'Arrowz Z',
),
DeviceParser(
'; *(ISW11HT)(?: Build|\\) AppleWebKit)',
None,
'$1',
'HTC',
'EVO',
),
DeviceParser(
'; *(ISW11K)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Kyocera',
'DIGNO',
),
DeviceParser(
'; *(ISW11M)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Motorola',
'Photon',
),
DeviceParser(
'; *(ISW11SC)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Samsung',
'GALAXY S II WiMAX',
),
DeviceParser(
'; *(ISW12HT)(?: Build|\\) AppleWebKit)',
None,
'$1',
'HTC',
'EVO 3D',
),
DeviceParser(
'; *(ISW13HT)(?: Build|\\) AppleWebKit)',
None,
'$1',
'HTC',
'J',
),
DeviceParser(
'; *(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\\) AppleWebKit)',
None,
'$1',
'KDDI',
'$1',
),
DeviceParser(
'; *(INFOBAR [^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'KDDI',
'$1',
),
DeviceParser(
'; *(JOYPAD|Joypad)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Kingcom',
'$1 $2',
),
DeviceParser(
'; *(Vox|VOX|Arc|K080)(?: Build|\\) AppleWebKit)',
'i',
'$1',
'Kobo',
'$1',
),
DeviceParser(
'\\b(Kobo Touch)\\b',
None,
'$1',
'Kobo',
'$1',
),
DeviceParser(
'; *(K-Touch)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'$1 $2',
'Ktouch',
'$2',
),
DeviceParser(
'; *((?:EV|KM)-S\\d+[A-Z]?)(?: Build|\\) AppleWebKit)',
'i',
'$1',
'KTtech',
'$1',
),
DeviceParser(
'; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\\d{2})(?: Build|\\) AppleWebKit)',
None,
'$1',
'Kyocera',
'$1',
),
DeviceParser(
'; *(?:LAVA[ _]|)IRIS[ _\\-]?([^/;\\)]+) *(?:;|\\)|Build)',
'i',
'Iris $1',
'Lava',
'Iris $1',
),
DeviceParser(
'; *LAVA[ _]([^;/]+) Build',
None,
'$1',
'Lava',
'$1',
),
DeviceParser(
'; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_?(?: Build|\\) AppleWebKit)',
None,
'Lemon $1$2',
'Lemon',
'$1$2',
),
DeviceParser(
'; *(TAB-1012)(?: Build|\\) AppleWebKit)',
None,
'Lenco $1',
'Lenco',
'$1',
),
DeviceParser(
'; Lenco ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Lenco $1',
'Lenco',
'$1',
),
DeviceParser(
'; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build',
None,
'$1',
'Lenovo',
'$1',
),
DeviceParser(
'; *(Idea[Tp]ab)[ _]([^;/]+);? Build',
None,
'Lenovo $1 $2',
'Lenovo',
'$1 $2',
),
DeviceParser(
'; *(Idea(?:Tab|pad)) ?([^;/]+) Build',
None,
'Lenovo $1 $2',
'Lenovo',
'$1 $2',
),
DeviceParser(
'; *(ThinkPad) ?(Tablet) Build/',
None,
'Lenovo $1 $2',
'Lenovo',
'$1 $2',
),
DeviceParser(
'; *(?:LNV-|)(?:=?[Ll]enovo[ _\\-]?|LENOVO[ _])(.+?)(?:Build|[;/\\)])',
None,
'Lenovo $1',
'Lenovo',
'$1',
),
DeviceParser(
'[;,] (?:Vodafone |)(SmartTab) ?(II) ?(\\d+) Build/',
None,
'Lenovo $1 $2 $3',
'Lenovo',
'$1 $2 $3',
),
DeviceParser(
'; *(?:Ideapad |)K1 Build/',
None,
'Lenovo Ideapad K1',
'Lenovo',
'Ideapad K1',
),
DeviceParser(
'; *(3GC101|3GW10[01]|A390) Build/',
None,
'$1',
'Lenovo',
'$1',
),
DeviceParser(
'\\b(?:Lenovo|LENOVO)+[ _\\-]?([^,;:/ ]+)',
None,
'Lenovo $1',
'Lenovo',
'$1',
),
DeviceParser(
'; *(MFC\\d+)[A-Z]{2}([^;,/]*),?(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Lexibook',
'$1$2',
),
DeviceParser(
'; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)',
None,
'$1',
'LG',
'$1',
),
DeviceParser(
'[;:] *(L-\\d+[A-Z]|LGL\\d+[A-Z]?)(?:/V\\d+|) *(?:Build|[;\\)])',
None,
'$1',
'LG',
'$1',
),
DeviceParser(
'; *(LG-)([A-Z]{1,2}\\d{2,}[^,;/\\)\\(]*?)(?:Build| V\\d+|[,;/\\)\\(]|$)',
None,
'$1$2',
'LG',
'$2',
),
DeviceParser(
'; *(LG[ \\-]|LG)([^;/]+)[;/]? Build',
None,
'$1$2',
'LG',
'$2',
),
DeviceParser(
'^(LG)-([^;/]+)/ Mozilla/.*; Android',
None,
'$1 $2',
'LG',
'$2',
),
DeviceParser(
'(Web0S); Linux/(SmartTV)',
None,
'LG $1 $2',
'LG',
'$1 $2',
),
DeviceParser(
'; *((?:SMB|smb)[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Malata',
'$1',
),
DeviceParser(
'; *(?:Malata|MALATA) ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Malata',
'$1',
),
DeviceParser(
'; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\\) AppleWebKit)',
None,
'$1',
'Manta',
'$1',
),
DeviceParser(
'; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Match',
'$1',
),
DeviceParser(
'; *(GenxDroid7|MSD7.*?|AX\\d.*?|Tab 701|Tab 722)(?: Build|\\) AppleWebKit)',
None,
'Maxx $1',
'Maxx',
'$1',
),
DeviceParser(
'; *(M-PP[^;/]+|PhonePad ?\\d{2,}[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Mediacom $1',
'Mediacom',
'$1',
),
DeviceParser(
'; *(M-MP[^;/]+|SmartPad ?\\d{2,}[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Mediacom $1',
'Mediacom',
'$1',
),
DeviceParser(
'; *(?:MD_|)LIFETAB[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'Medion Lifetab $1',
'Medion',
'Lifetab $1',
),
DeviceParser(
'; *MEDION ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Medion $1',
'Medion',
'$1',
),
DeviceParser(
'; *(M030|M031|M035|M040|M065|m9)(?: Build|\\) AppleWebKit)',
None,
'Meizu $1',
'Meizu',
'$1',
),
DeviceParser(
'; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\\)])',
None,
'Meizu $1',
'Meizu',
'$1',
),
DeviceParser(
'; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build',
'i',
'Micromax $1$2',
'Micromax',
'$1$2',
),
DeviceParser(
'; *Micromax[ _](A\\d{2,3}[^;/]*) Build',
'i',
'Micromax $1',
'Micromax',
'$1',
),
DeviceParser(
'; *(A\\d{2}|A[12]\\d{2}|A90S|A110Q) Build',
'i',
'Micromax $1',
'Micromax',
'$1',
),
DeviceParser(
'; *Micromax[ _](P\\d{3}[^;/]*) Build',
'i',
'Micromax $1',
'Micromax',
'$1',
),
DeviceParser(
'; *(P\\d{3}|P\\d{3}\\(Funbook\\)) Build',
'i',
'Micromax $1',
'Micromax',
'$1',
),
DeviceParser(
'; *(MITO)[ _\\-]?([^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'$1 $2',
'Mito',
'$2',
),
DeviceParser(
'; *(Cynus)[ _](F5|T\\d|.+?) *(?:Build|[;/\\)])',
'i',
'$1 $2',
'Mobistel',
'$1 $2',
),
DeviceParser(
'; *(MODECOM |)(FreeTab) ?([^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'$1$2 $3',
'Modecom',
'$2 $3',
),
DeviceParser(
'; *(MODECOM )([^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'$1 $2',
'Modecom',
'$2',
),
DeviceParser(
'; *(MZ\\d{3}\\+?|MZ\\d{3} 4G|Xoom|XOOM[^;/]*) Build',
None,
'Motorola $1',
'Motorola',
'$1',
),
DeviceParser(
'; *(Milestone )(XT[^;/]*) Build',
None,
'Motorola $1$2',
'Motorola',
'$2',
),
DeviceParser(
'; *(Motoroi ?x|Droid X|DROIDX) Build',
'i',
'Motorola $1',
'Motorola',
'DROID X',
),
DeviceParser(
'; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build',
None,
'Motorola $1',
'Motorola',
'$1',
),
DeviceParser(
'; *(A555|A85[34][^;/]*|A95[356]|ME[58]\\d{2}\\+?|ME600|ME632|ME722|MB\\d{3}\\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\\d{3,4}[A-Z\\+]*|CL[iI]Q|CL[iI]Q XT) Build',
None,
'$1',
'Motorola',
'$1',
),
DeviceParser(
'; *(Motorola MOT-|Motorola[ _\\-]|MOT\\-?)([^;/]+) Build',
None,
'$1$2',
'Motorola',
'$2',
),
DeviceParser(
'; *(Moto[_ ]?|MOT\\-)([^;/]+) Build',
None,
'$1$2',
'Motorola',
'$2',
),
DeviceParser(
'; *((?:MP[DQ]C|MPG\\d{1,4}|MP\\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Mpman',
'$1',
),
DeviceParser(
'; *(?:MSI[ _]|)(Primo\\d+|Enjoy[ _\\-][^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'$1',
'Msi',
'$1',
),
DeviceParser(
'; *Multilaser[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Multilaser',
'$1',
),
DeviceParser(
'; *(My)[_]?(Pad)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1$2 $3',
'MyPhone',
'$1$2 $3',
),
DeviceParser(
'; *(My)\\|?(Phone)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1$2 $3',
'MyPhone',
'$3',
),
DeviceParser(
'; *(A\\d+)[ _](Duo|)(?: Build|\\) AppleWebKit)',
'i',
'$1 $2',
'MyPhone',
'$1 $2',
),
DeviceParser(
'; *(myTab[^;/]*)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Mytab',
'$1',
),
DeviceParser(
'; *(NABI2?-)([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Nabi',
'$2',
),
DeviceParser(
'; *(N-\\d+[CDE])(?: Build|\\) AppleWebKit)',
None,
'$1',
'Nec',
'$1',
),
DeviceParser(
'; ?(NEC-)(.*?)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Nec',
'$2',
),
DeviceParser(
'; *(LT-NA7)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Nec',
'Lifetouch Note',
),
DeviceParser(
'; *(NXM\\d+[A-Za-z0-9_]*|Next\\d[A-Za-z0-9_ \\-]*|NEXT\\d[A-Za-z0-9_ \\-]*|Nextbook [A-Za-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\\);])',
None,
'$1',
'Nextbook',
'$1',
),
DeviceParser(
'; *(Nokia)([ _\\-]*)([^;/]*) Build',
'i',
'$1$2$3',
'Nokia',
'$3',
),
DeviceParser(
'; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Nook',
'$2',
),
DeviceParser(
'; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Nook',
'$2',
),
DeviceParser(
'; Build/(Nook)',
None,
'$1',
'Nook',
'Tablet',
),
DeviceParser(
'; *(OP110|OliPad[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Olivetti $1',
'Olivetti',
'$1',
),
DeviceParser(
'; *OMEGA[ _\\-](MID[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Omega $1',
'Omega',
'$1',
),
DeviceParser(
'^(MID7500|MID\\d+) Mozilla/5\\.0 \\(iPad;',
None,
'Omega $1',
'Omega',
'$1',
),
DeviceParser(
'; *((?:CIUS|cius)[^;/]*)(?: Build|\\) AppleWebKit)',
None,
'Openpeak $1',
'Openpeak',
'$1',
),
DeviceParser(
'; *(Find ?(?:5|7a)|R8[012]\\d{1,2}|T703\\d?|U70\\d{1,2}T?|X90\\d{1,2})(?: Build|\\) AppleWebKit)',
None,
'Oppo $1',
'Oppo',
'$1',
),
DeviceParser(
'; *OPPO ?([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Oppo $1',
'Oppo',
'$1',
),
DeviceParser(
'; *(?:Odys\\-|ODYS\\-|ODYS )([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Odys $1',
'Odys',
'$1',
),
DeviceParser(
'; *(SELECT) ?(7)(?: Build|\\) AppleWebKit)',
None,
'Odys $1 $2',
'Odys',
'$1 $2',
),
DeviceParser(
'; *(PEDI)_(PLUS)_(W)(?: Build|\\) AppleWebKit)',
None,
'Odys $1 $2 $3',
'Odys',
'$1 $2 $3',
),
DeviceParser(
'; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\\) AppleWebKit)',
None,
'Odys $1',
'Odys',
'$1',
),
DeviceParser(
'; (ONE [a-zA-Z]\\d+)(?: Build|\\) AppleWebKit)',
None,
'OnePlus $1',
'OnePlus',
'$1',
),
DeviceParser(
'; (ONEPLUS [a-zA-Z]\\d+)(?: Build|\\) AppleWebKit)',
None,
'OnePlus $1',
'OnePlus',
'$1',
),
DeviceParser(
'; *(TP-\\d+)(?: Build|\\) AppleWebKit)',
None,
'Orion $1',
'Orion',
'$1',
),
DeviceParser(
'; *(G100W?)(?: Build|\\) AppleWebKit)',
None,
'PackardBell $1',
'PackardBell',
'$1',
),
DeviceParser(
'; *(Panasonic)[_ ]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'; *(FZ-A1B|JT-B1)(?: Build|\\) AppleWebKit)',
None,
'Panasonic $1',
'Panasonic',
'$1',
),
DeviceParser(
'; *(dL1|DL1)(?: Build|\\) AppleWebKit)',
None,
'Panasonic $1',
'Panasonic',
'$1',
),
DeviceParser(
'; *(SKY[ _]|)(IM\\-[AT]\\d{3}[^;/]+).* Build/',
None,
'Pantech $1$2',
'Pantech',
'$1$2',
),
DeviceParser(
'; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/',
None,
'$1',
'Pantech',
'$1',
),
DeviceParser(
'; *Pantech([^;/]+).* Build/',
None,
'Pantech $1',
'Pantech',
'$1',
),
DeviceParser(
'; *(papyre)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'$1 $2',
'Papyre',
'$2',
),
DeviceParser(
'; *(?:Touchlet )?(X10\\.[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Pearl $1',
'Pearl',
'$1',
),
DeviceParser(
'; PHICOMM (i800)(?: Build|\\) AppleWebKit)',
None,
'Phicomm $1',
'Phicomm',
'$1',
),
DeviceParser(
'; PHICOMM ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Phicomm $1',
'Phicomm',
'$1',
),
DeviceParser(
'; *(FWS\\d{3}[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Phicomm $1',
'Phicomm',
'$1',
),
DeviceParser(
'; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Philips',
'$1',
),
DeviceParser(
'; *(?:Philips|PHILIPS)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Philips $1',
'Philips',
'$1',
),
DeviceParser(
'Android 4\\..*; *(M[12356789]|U[12368]|S[123])\\ ?(pro)?(?: Build|\\) AppleWebKit)',
None,
'Pipo $1$2',
'Pipo',
'$1$2',
),
DeviceParser(
'; *(MOMO[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Ployer',
'$1',
),
DeviceParser(
'; *(?:Polaroid[ _]|)((?:MIDC\\d{3,}|PMID\\d{2,}|PTAB\\d{3,})[^;/]*?)(\\/[^;/]*|)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Polaroid',
'$1',
),
DeviceParser(
'; *(?:Polaroid )(Tablet)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Polaroid',
'$1',
),
DeviceParser(
'; *(POMP)[ _\\-](.+?) *(?:Build|[;/\\)])',
None,
'$1 $2',
'Pomp',
'$2',
),
DeviceParser(
'; *(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Positivo',
'$1',
),
DeviceParser(
'; *(?:Positivo |)((?:YPY|Ypy)[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Positivo',
'$1',
),
DeviceParser(
'; *(MOB-[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'POV',
'$1',
),
DeviceParser(
'; *POV[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'POV $1',
'POV',
'$1',
),
DeviceParser(
'; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\\-]|TAB-P)[^;/]*)(?: Build|\\) AppleWebKit)',
None,
'POV $1',
'POV',
'$1',
),
DeviceParser(
'; *(?:Prestigio |)((?:PAP|PMP)\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Prestigio $1',
'Prestigio',
'$1',
),
DeviceParser(
'; *(PLT[0-9]{4}.*?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Proscan',
'$1',
),
DeviceParser(
'; *(A2|A5|A8|A900)_?(Classic|)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Qmobile',
'$1 $2',
),
DeviceParser(
'; *(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\\) AppleWebKit)',
None,
'Qmobile $2 $3',
'Qmobile',
'$2 $3',
),
DeviceParser(
'; *(Q\\-?[Mm]obile)[_ ](A[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Qmobile $2',
'Qmobile',
'$2',
),
DeviceParser(
'; *(Q\\-Smart)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Qmobilevn',
'$2',
),
DeviceParser(
'; *(Q\\-?[Mm]obile)[ _\\-](S[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Qmobilevn',
'$2',
),
DeviceParser(
'; *(TA1013)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Quanta',
'$1',
),
DeviceParser(
'; (RCT\\w+)(?: Build|\\) AppleWebKit)',
None,
'$1',
'RCA',
'$1',
),
DeviceParser(
'; RCA (\\w+)(?: Build|\\) AppleWebKit)',
None,
'RCA $1',
'RCA',
'$1',
),
DeviceParser(
'; *(RK\\d+),?(?: Build|\\) AppleWebKit)',
None,
'$1',
'Rockchip',
'$1',
),
DeviceParser(
' Build/(RK\\d+)',
None,
'$1',
'Rockchip',
'$1',
),
DeviceParser(
'; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\\d)|GT-I9082|GT-I9205|GT-N7\\d{3}|SM-N9005)[^;/]*)\\/?[^;/]* Build/',
None,
'Samsung $1$2',
'Samsung',
'$2',
),
DeviceParser(
'; *(Google |)(Nexus [Ss](?: 4G|)) Build/',
None,
'Samsung $1$2',
'Samsung',
'$2',
),
DeviceParser(
'; *(SAMSUNG |Samsung )([^\\/]*)\\/[^ ]* Build/',
None,
'Samsung $2',
'Samsung',
'$2',
),
DeviceParser(
'; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/',
None,
'Samsung $1',
'Samsung',
'$1',
),
DeviceParser(
'; *(SAMSUNG[ _\\-]|)(?:SAMSUNG[ _\\-])([^;/]+) Build',
None,
'Samsung $2',
'Samsung',
'$2',
),
DeviceParser(
'; *(SAMSUNG-|)(GT\\-[BINPS]\\d{4}[^\\/]*)(\\/[^ ]*) Build',
None,
'Samsung $1$2$3',
'Samsung',
'$2',
),
DeviceParser(
'(?:; *|^)((?:GT\\-[BIiNPS]\\d{4}|I9\\d{2}0[A-Za-z\\+]?\\b)[^;/\\)]*?)(?:Build|Linux|MIUI|[;/\\)])',
None,
'Samsung $1',
'Samsung',
'$1',
),
DeviceParser(
'; (SAMSUNG-)([A-Za-z0-9\\-]+).* Build/',
None,
'Samsung $1$2',
'Samsung',
'$2',
),
DeviceParser(
'; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build',
None,
'Samsung $1',
'Samsung',
'$1',
),
DeviceParser(
'; *((?:SC)\\-[A-Za-z0-9 ]+)(/?[^ ]*|)\\)',
None,
'Samsung $1',
'Samsung',
'$1',
),
DeviceParser(
' ((?:SCH)\\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build',
None,
'Samsung $1',
'Samsung',
'$1',
),
DeviceParser(
'; *(Behold ?(?:2|II)|YP\\-G[^;/]+|EK-GC100|SCL21|I9300) Build',
None,
'Samsung $1',
'Samsung',
'$1',
),
DeviceParser(
'; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\\-[A-Za-z0-9]{5,6})[\\)]',
None,
'Samsung $1',
'Samsung',
'$1',
),
DeviceParser(
'; *(SH\\-?\\d\\d[^;/]+|SBM\\d[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Sharp',
'$1',
),
DeviceParser(
'; *(SHARP[ -])([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Sharp',
'$2',
),
DeviceParser(
'; *(SPX[_\\-]\\d[^;/]*)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Simvalley',
'$1',
),
DeviceParser(
'; *(SX7\\-PEARL\\.GmbH)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Simvalley',
'$1',
),
DeviceParser(
'; *(SP[T]?\\-\\d{2}[^;/]*)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Simvalley',
'$1',
),
DeviceParser(
'; *(SK\\-.*?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'SKtelesys',
'$1',
),
DeviceParser(
'; *(?:SKYTEX|SX)-([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Skytex',
'$1',
),
DeviceParser(
'; *(IMAGINE [^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Skytex',
'$1',
),
DeviceParser(
'; *(SmartQ) ?([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'; *(WF7C|WF10C|SBT[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Smartbitt',
'$1',
),
DeviceParser(
'; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build',
None,
'$1',
'Sharp',
'$1',
),
DeviceParser(
'; *(003P|101P|101P11C|102P) Build',
None,
'$1',
'Panasonic',
'$1',
),
DeviceParser(
'; *(00\\dZ) Build/',
None,
'$1',
'ZTE',
'$1',
),
DeviceParser(
'; HTC(X06HT) Build',
None,
'$1',
'HTC',
'$1',
),
DeviceParser(
'; *(001HT|X06HT) Build',
None,
'$1',
'HTC',
'$1',
),
DeviceParser(
'; *(201M) Build',
None,
'$1',
'Motorola',
'XT902',
),
DeviceParser(
'; *(ST\\d{4}.*)Build/ST',
None,
'Trekstor $1',
'Trekstor',
'$1',
),
DeviceParser(
'; *(ST\\d{4}.*?)(?: Build|\\) AppleWebKit)',
None,
'Trekstor $1',
'Trekstor',
'$1',
),
DeviceParser(
'; *(Sony ?Ericsson ?)([^;/]+) Build',
None,
'$1$2',
'SonyEricsson',
'$2',
),
DeviceParser(
'; *((?:SK|ST|E|X|LT|MK|MT|WT)\\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build',
None,
'$1',
'SonyEricsson',
'$1',
),
DeviceParser(
'; *(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\\d+)[^;/]*) Build',
'i',
'$1',
'SonyEricsson',
'$1',
),
DeviceParser(
'; Sony (Tablet[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Sony $1',
'Sony',
'$1',
),
DeviceParser(
'; Sony ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Sony $1',
'Sony',
'$1',
),
DeviceParser(
'; *(Sony)([A-Za-z0-9\\-]+)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'; *(Xperia [^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Sony',
'$1',
),
DeviceParser(
'; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\\d{3}|D6[56]\\d{2})(?: Build|\\) AppleWebKit)',
None,
'$1',
'Sony',
'$1',
),
DeviceParser(
'; *(SGP\\d{3}|SGPT\\d{2})(?: Build|\\) AppleWebKit)',
None,
'$1',
'Sony',
'$1',
),
DeviceParser(
'; *(NW-Z1000Series)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Sony',
'$1',
),
DeviceParser(
'PLAYSTATION 3',
None,
'PlayStation 3',
'Sony',
'PlayStation 3',
),
DeviceParser(
'(PlayStation (?:Portable|Vita|\\d+))',
None,
'$1',
'Sony',
'$1',
),
DeviceParser(
'; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\\-]?|)([Mm][Ii])([ _\\-]|)(\\d{3}[^;/]*)(?: Build|\\) AppleWebKit)',
None,
'$1$2$3$4',
'Spice',
'Mi$4',
),
DeviceParser(
'; *(Sprint )(.+?) *(?:Build|[;/])',
None,
'$1$2',
'Sprint',
'$2',
),
DeviceParser(
'\\b(Sprint)[: ]([^;,/ ]+)',
None,
'$1$2',
'Sprint',
'$2',
),
DeviceParser(
'; *(TAGI[ ]?)(MID) ?([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1$2$3',
'Tagi',
'$2$3',
),
DeviceParser(
'; *(Oyster500|Opal 800)(?: Build|\\) AppleWebKit)',
None,
'Tecmobile $1',
'Tecmobile',
'$1',
),
DeviceParser(
'; *(TECNO[ _])([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Tecno',
'$2',
),
DeviceParser(
'; *Android for (Telechips|Techvision) ([^ ]+) ',
'i',
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'; *(T-Hub2)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Telstra',
'$1',
),
DeviceParser(
'; *(PAD) ?(100[12])(?: Build|\\) AppleWebKit)',
None,
'Terra $1$2',
'Terra',
'$1$2',
),
DeviceParser(
'; *(T[BM]-\\d{3}[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Texet',
'$1',
),
DeviceParser(
'; *(tolino [^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Thalia',
'$1',
),
DeviceParser(
'; *Build/.* (TOLINO_BROWSER)',
None,
'$1',
'Thalia',
'Tolino Shine',
),
DeviceParser(
'; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Thl',
'$2',
),
DeviceParser(
'; *(T100|T200|T5|W100|W200|W8s)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Thl',
'$1',
),
DeviceParser(
'; *(T-Mobile[ _]G2[ _]Touch) Build',
None,
'$1',
'HTC',
'Hero',
),
DeviceParser(
'; *(T-Mobile[ _]G2) Build',
None,
'$1',
'HTC',
'Desire Z',
),
DeviceParser(
'; *(T-Mobile myTouch Q) Build',
None,
'$1',
'Huawei',
'U8730',
),
DeviceParser(
'; *(T-Mobile myTouch) Build',
None,
'$1',
'Huawei',
'U8680',
),
DeviceParser(
'; *(T-Mobile_Espresso) Build',
None,
'$1',
'HTC',
'Espresso',
),
DeviceParser(
'; *(T-Mobile G1) Build',
None,
'$1',
'HTC',
'Dream',
),
DeviceParser(
'\\b(T-Mobile ?|)(myTouch)[ _]?([34]G)[ _]?([^\\/]*) (?:Mozilla|Build)',
None,
'$1$2 $3 $4',
'HTC',
'$2 $3 $4',
),
DeviceParser(
'\\b(T-Mobile)_([^_]+)_(.*) Build',
None,
'$1 $2 $3',
'Tmobile',
'$2 $3',
),
DeviceParser(
'\\b(T-Mobile)[_ ]?(.*?)Build',
None,
'$1 $2',
'Tmobile',
'$2',
),
DeviceParser(
' (ATP[0-9]{4})(?: Build|\\) AppleWebKit)',
None,
'$1',
'Tomtec',
'$1',
),
DeviceParser(
' *(TOOKY)[ _\\-]([^;/]+?) ?(?:Build|;)',
'i',
'$1 $2',
'Tooky',
'$2',
),
DeviceParser(
'\\b(TOSHIBA_AC_AND_AZ|TOSHIBA_FOLIO_AND_A|FOLIO_AND_A)',
None,
'$1',
'Toshiba',
'Folio 100',
),
DeviceParser(
'; *([Ff]olio ?100)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Toshiba',
'Folio 100',
),
DeviceParser(
'; *(AT[0-9]{2,3}(?:\\-A|LE\\-A|PE\\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)(?: Build|\\) AppleWebKit)',
None,
'Toshiba $1',
'Toshiba',
'$1',
),
DeviceParser(
'; *(TM-MID\\d+[^;/]+|TOUCHMATE|MID-750)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Touchmate',
'$1',
),
DeviceParser(
'; *(TM-SM\\d+[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Touchmate',
'$1',
),
DeviceParser(
'; *(A10 [Bb]asic2?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Treq',
'$1',
),
DeviceParser(
'; *(TREQ[ _\\-])([^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'$1$2',
'Treq',
'$2',
),
DeviceParser(
'; *(X-?5|X-?3)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Umeox',
'$1',
),
DeviceParser(
'; *(A502\\+?|A936|A603|X1|X2)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Umeox',
'$1',
),
DeviceParser(
'(TOUCH(?:TAB|PAD).+?)(?: Build|\\) AppleWebKit)',
'i',
'Versus $1',
'Versus',
'$1',
),
DeviceParser(
'(VERTU) ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'Vertu',
'$2',
),
DeviceParser(
'; *(Videocon)[ _\\-]([^;/]+?) *(?:Build|;)',
None,
'$1 $2',
'Videocon',
'$2',
),
DeviceParser(
' (VT\\d{2}[A-Za-z]*)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Videocon',
'$1',
),
DeviceParser(
'; *((?:ViewPad|ViewPhone|VSD)[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Viewsonic',
'$1',
),
DeviceParser(
'; *(ViewSonic-)([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'Viewsonic',
'$2',
),
DeviceParser(
'; *(GTablet.*?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Viewsonic',
'$1',
),
DeviceParser(
'; *([Vv]ivo)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'vivo',
'$2',
),
DeviceParser(
'(Vodafone) (.*?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'; *(?:Walton[ _\\-]|)(Primo[ _\\-][^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'Walton $1',
'Walton',
'$1',
),
DeviceParser(
'; *(?:WIKO[ \\-]|)(CINK\\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'Wiko $1',
'Wiko',
'$1',
),
DeviceParser(
'; *WellcoM-([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Wellcom $1',
'Wellcom',
'$1',
),
DeviceParser(
'(?:(WeTab)-Browser|; (wetab) Build)',
None,
'$1',
'WeTab',
'WeTab',
),
DeviceParser(
'; *(AT-AS[^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Wolfgang $1',
'Wolfgang',
'$1',
),
DeviceParser(
'; *(?:Woxter|Wxt) ([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'Woxter $1',
'Woxter',
'$1',
),
DeviceParser(
'; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\\d{3}|TAB0?9-\\d{3}|TAB1[03]-\\d{3}|SMP\\d{2}-\\d{3})(?: Build|\\) AppleWebKit)',
None,
'Yarvik $1',
'Yarvik',
'$1',
),
DeviceParser(
'; *([A-Z]{2,4})(M\\d{3,}[A-Z]{2})([^;\\)\\/]*)(?: Build|[;\\)])',
None,
'Yifang $1$2$3',
'Yifang',
'$2',
),
DeviceParser(
'; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/',
None,
'XiaoMi $1',
'XiaoMi',
'$1',
),
DeviceParser(
'; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\\)]*)',
None,
'XiaoMi $1',
'XiaoMi',
'$1',
),
DeviceParser(
'; *(MIX) (Build|MIUI)/',
None,
'XiaoMi $1',
'XiaoMi',
'$1',
),
DeviceParser(
'; *((MIX) ([^;/]*)) (Build|MIUI)/',
None,
'XiaoMi $1',
'XiaoMi',
'$1',
),
DeviceParser(
'; *XOLO[ _]([^;/]*tab.*)(?: Build|\\) AppleWebKit)',
'i',
'Xolo $1',
'Xolo',
'$1',
),
DeviceParser(
'; *XOLO[ _]([^;/]+?)(?: Build|\\) AppleWebKit)',
'i',
'Xolo $1',
'Xolo',
'$1',
),
DeviceParser(
'; *(q\\d0{2,3}[a-z]?)(?: Build|\\) AppleWebKit)',
'i',
'Xolo $1',
'Xolo',
'$1',
),
DeviceParser(
'; *(PAD ?[79]\\d+[^;/]*|TelePAD\\d+[^;/])(?: Build|\\) AppleWebKit)',
None,
'Xoro $1',
'Xoro',
'$1',
),
DeviceParser(
'; *(?:(?:ZOPO|Zopo)[ _]([^;/]+?)|(ZP ?(?:\\d{2}[^;/]+|C2))|(C[2379]))(?: Build|\\) AppleWebKit)',
None,
'$1$2$3',
'Zopo',
'$1$2$3',
),
DeviceParser(
'; *(ZiiLABS) (Zii[^;/]*)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'ZiiLabs',
'$2',
),
DeviceParser(
'; *(Zii)_([^;/]*)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'ZiiLabs',
'$2',
),
DeviceParser(
'; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]*?|Era|Memo[^;]*?)|JOE|(?:Kis|KIS)\\b[^;]*?|Libra|Light [^;]*?|N8[056][01]|N850L|N8000|N9[15]\\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]*?|RacerII|RACERII|San Francisco[^;]*?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\\) AppleWebKit)',
None,
'$1',
'ZTE',
'$1',
),
DeviceParser(
'; *([A-Z]\\d+)_USA_[^;]*(?: Build|\\) AppleWebKit)',
None,
'$1',
'ZTE',
'$1',
),
DeviceParser(
'; *(SmartTab\\d+)[^;]*(?: Build|\\) AppleWebKit)',
None,
'$1',
'ZTE',
'$1',
),
DeviceParser(
'; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\\) AppleWebKit)',
None,
'ZTE Blade$1',
'ZTE',
'Blade$1',
),
DeviceParser(
'; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\\) AppleWebKit)',
None,
'ZTE Skate$1',
'ZTE',
'Skate$1',
),
DeviceParser(
'; *(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\\) AppleWebKit)',
None,
'$1$2',
'ZTE',
'$1$2',
),
DeviceParser(
'; *(?:ZXY-ZTE_|ZTE\\-U |ZTE[\\- _]|ZTE-C[_ ])([^;/]+?)(?: Build|\\) AppleWebKit)',
None,
'ZTE $1',
'ZTE',
'$1',
),
DeviceParser(
'; (BASE) (lutea|Lutea 2|Tab[^;]*?)(?: Build|\\) AppleWebKit)',
None,
'$1 $2',
'ZTE',
'$1 $2',
),
DeviceParser(
'; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link)(?: Build|\\) AppleWebKit)',
'i',
'$1',
'ZTE',
'$1',
),
DeviceParser(
'; *(vp9plus)\\)',
None,
'$1',
'ZTE',
'$1',
),
DeviceParser(
'; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900)(?: Build|\\) AppleWebKit)',
None,
'$1',
'Zync',
'$1',
),
DeviceParser(
'; ?(KFOT|Kindle Fire) Build\\b',
None,
'Kindle Fire',
'Amazon',
'Kindle Fire',
),
DeviceParser(
'; ?(KFOTE|Amazon Kindle Fire2) Build\\b',
None,
'Kindle Fire 2',
'Amazon',
'Kindle Fire 2',
),
DeviceParser(
'; ?(KFTT) Build\\b',
None,
'Kindle Fire HD',
'Amazon',
'Kindle Fire HD 7"',
),
DeviceParser(
'; ?(KFJWI) Build\\b',
None,
'Kindle Fire HD 8.9" WiFi',
'Amazon',
'Kindle Fire HD 8.9" WiFi',
),
DeviceParser(
'; ?(KFJWA) Build\\b',
None,
'Kindle Fire HD 8.9" 4G',
'Amazon',
'Kindle Fire HD 8.9" 4G',
),
DeviceParser(
'; ?(KFSOWI) Build\\b',
None,
'Kindle Fire HD 7" WiFi',
'Amazon',
'Kindle Fire HD 7" WiFi',
),
DeviceParser(
'; ?(KFTHWI) Build\\b',
None,
'Kindle Fire HDX 7" WiFi',
'Amazon',
'Kindle Fire HDX 7" WiFi',
),
DeviceParser(
'; ?(KFTHWA) Build\\b',
None,
'Kindle Fire HDX 7" 4G',
'Amazon',
'Kindle Fire HDX 7" 4G',
),
DeviceParser(
'; ?(KFAPWI) Build\\b',
None,
'Kindle Fire HDX 8.9" WiFi',
'Amazon',
'Kindle Fire HDX 8.9" WiFi',
),
DeviceParser(
'; ?(KFAPWA) Build\\b',
None,
'Kindle Fire HDX 8.9" 4G',
'Amazon',
'Kindle Fire HDX 8.9" 4G',
),
DeviceParser(
'; ?Amazon ([^;/]+) Build\\b',
None,
'$1',
'Amazon',
'$1',
),
DeviceParser(
'; ?(Kindle) Build\\b',
None,
'Kindle',
'Amazon',
'Kindle',
),
DeviceParser(
'; ?(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+)|) Build\\b',
None,
'Kindle Fire',
'Amazon',
'Kindle Fire$2',
),
DeviceParser(
' (Kindle)/(\\d+\\.\\d+)',
None,
'Kindle',
'Amazon',
'$1 $2',
),
DeviceParser(
' (Silk|Kindle)/(\\d+)\\.',
None,
'Kindle',
'Amazon',
'Kindle',
),
DeviceParser(
'(sprd)\\-([^/]+)/',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'; *(H\\d{2}00\\+?) Build',
None,
'$1',
'Hero',
'$1',
),
DeviceParser(
'; *(iphone|iPhone5) Build/',
None,
'Xianghe $1',
'Xianghe',
'$1',
),
DeviceParser(
'; *(e\\d{4}[a-z]?_?v\\d+|v89_[^;/]+)[^;/]+ Build/',
None,
'Xianghe $1',
'Xianghe',
'$1',
),
DeviceParser(
'\\bUSCC[_\\-]?([^ ;/\\)]+)',
None,
'$1',
'Cellular',
'$1',
),
DeviceParser(
'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\\)]+)',
None,
'Alcatel $1',
'Alcatel',
'$1',
),
DeviceParser(
'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\\)]+)',
None,
'Asus $1',
'Asus',
'$1',
),
DeviceParser(
'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\\)]+)',
None,
'Dell $1',
'Dell',
'$1',
),
DeviceParser(
'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\\)]+)',
None,
'HTC $1',
'HTC',
'$1',
),
DeviceParser(
'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\\)]+)',
None,
'Huawei $1',
'Huawei',
'$1',
),
DeviceParser(
'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \\-]|)([^;,\\)]+)',
None,
'LG $1',
'LG',
'$1',
),
DeviceParser(
'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\\d{3,10}[^;\\)]*)',
None,
'Lumia $1',
'Nokia',
'Lumia $1',
),
DeviceParser(
'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\\d{3,})',
None,
'Nokia $1',
'Nokia',
'$1',
),
DeviceParser(
'(?:Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\\)]+)',
None,
'Nokia $1',
'Nokia',
'$1',
),
DeviceParser(
'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\\)]+)',
None,
'Microsoft $1',
'Microsoft',
'$1',
),
DeviceParser(
'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\\.\\)]+)',
None,
'Samsung $1',
'Samsung',
'$1',
),
DeviceParser(
'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\\)]+)',
None,
'Toshiba $1',
'Toshiba',
'$1',
),
DeviceParser(
'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\\)]+)',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'(?:^|; )SAMSUNG\\-([A-Za-z0-9\\-]+).* Bada/',
None,
'Samsung $1',
'Samsung',
'$1',
),
DeviceParser(
'\\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+?)(?:/[^;]+|); rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/',
None,
'Alcatel $1 $2 $3',
'Alcatel',
'One Touch $3',
),
DeviceParser(
'\\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/',
None,
'ZTE $1$2',
'ZTE',
'$1$2',
),
DeviceParser(
'\\(Mobile; ALCATEL([A-Za-z0-9\\-]+); rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/[^\\/]+ KaiOS/',
None,
'Alcatel $1',
'Alcatel',
'$1',
),
DeviceParser(
'\\(Mobile; LYF\\/([A-Za-z0-9\\-]+)\\/.+;.+rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/[^\\/]+ KAIOS/',
None,
'LYF $1',
'LYF',
'$1',
),
DeviceParser(
'\\(Mobile; Nokia_([A-Za-z0-9\\-]+)_.+; rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/[^\\/]+ KAIOS/',
None,
'Nokia $1',
'Nokia',
'$1',
),
DeviceParser(
'Nokia(N[0-9]+)([A-Za-z_\\-][A-Za-z0-9_\\-]*)',
None,
'Nokia $1',
'Nokia',
'$1$2',
),
DeviceParser(
'(?:NOKIA|Nokia)(?:\\-| *)(?:([A-Za-z0-9]+)\\-[0-9a-f]{32}|([A-Za-z0-9\\-]+)(?:UCBrowser)|([A-Za-z0-9\\-]+))',
None,
'Nokia $1$2$3',
'Nokia',
'$1$2$3',
),
DeviceParser(
'Lumia ([A-Za-z0-9\\-]+)',
None,
'Lumia $1',
'Nokia',
'Lumia $1',
),
DeviceParser(
'\\(Symbian; U; S60 V5; [A-z]{2}\\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+?)\\)',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'\\(Symbian(?:/3|); U; ([^;]+);',
None,
'Nokia $1',
'Nokia',
'$1',
),
DeviceParser(
'BB10; ([A-Za-z0-9\\- ]+)\\)',
None,
'BlackBerry $1',
'BlackBerry',
'$1',
),
DeviceParser(
'Play[Bb]ook.+RIM Tablet OS',
None,
'BlackBerry Playbook',
'BlackBerry',
'Playbook',
),
DeviceParser(
'Black[Bb]erry ([0-9]+);',
None,
'BlackBerry $1',
'BlackBerry',
'$1',
),
DeviceParser(
'Black[Bb]erry([0-9]+)',
None,
'BlackBerry $1',
'BlackBerry',
'$1',
),
DeviceParser(
'Black[Bb]erry;',
None,
'BlackBerry',
'BlackBerry',
None,
),
DeviceParser(
'(Pre|Pixi)/\\d+\\.\\d+',
None,
'Palm $1',
'Palm',
'$1',
),
DeviceParser(
'Palm([0-9]+)',
None,
'Palm $1',
'Palm',
'$1',
),
DeviceParser(
'Treo([A-Za-z0-9]+)',
None,
'Palm Treo $1',
'Palm',
'Treo $1',
),
DeviceParser(
'webOS.*(P160U(?:NA|))/(\\d+).(\\d+)',
None,
'HP Veer',
'HP',
'Veer',
),
DeviceParser(
'(Touch[Pp]ad)/\\d+\\.\\d+',
None,
'HP TouchPad',
'HP',
'TouchPad',
),
DeviceParser(
'HPiPAQ([A-Za-z0-9]+)/\\d+.\\d+',
None,
'HP iPAQ $1',
'HP',
'iPAQ $1',
),
DeviceParser(
'PDA; (PalmOS)/sony/model ([a-z]+)/Revision',
None,
'$1',
'Sony',
'$1 $2',
),
DeviceParser(
'(Apple\\s?TV)',
None,
'AppleTV',
'Apple',
'AppleTV',
),
DeviceParser(
'(QtCarBrowser)',
None,
'Tesla Model S',
'Tesla',
'Model S',
),
DeviceParser(
'(iPhone|iPad|iPod)(\\d+,\\d+)',
None,
'$1',
'Apple',
'$1$2',
),
DeviceParser(
'(iPad)(?:;| Simulator;)',
None,
'$1',
'Apple',
'$1',
),
DeviceParser(
'(iPod)(?:;| touch;| Simulator;)',
None,
'$1',
'Apple',
'$1',
),
DeviceParser(
'(iPhone)(?:;| Simulator;)',
None,
'$1',
'Apple',
'$1',
),
DeviceParser(
'(Watch)(\\d+,\\d+)',
None,
'Apple $1',
'Apple',
'$1$2',
),
DeviceParser(
'(Apple Watch)(?:;| Simulator;)',
None,
'$1',
'Apple',
'$1',
),
DeviceParser(
'(HomePod)(?:;| Simulator;)',
None,
'$1',
'Apple',
'$1',
),
DeviceParser(
'iPhone',
None,
'iPhone',
'Apple',
'iPhone',
),
DeviceParser(
'CFNetwork/.* Darwin/\\d.*\\(((?:Mac|iMac|PowerMac|PowerBook)[^\\d]*)(\\d+)(?:,|%2C)(\\d+)',
None,
'$1$2,$3',
'Apple',
'$1$2,$3',
),
DeviceParser(
'CFNetwork/.* Darwin/\\d+\\.\\d+\\.\\d+ \\(x86_64\\)',
None,
'Mac',
'Apple',
'Mac',
),
DeviceParser(
'CFNetwork/.* Darwin/\\d',
None,
'iOS-Device',
'Apple',
'iOS-Device',
),
DeviceParser(
'Outlook-(iOS)/\\d+\\.\\d+\\.prod\\.iphone',
None,
'iPhone',
'Apple',
'iPhone',
),
DeviceParser(
'acer_([A-Za-z0-9]+)_',
None,
'Acer $1',
'Acer',
'$1',
),
DeviceParser(
'(?:ALCATEL|Alcatel)-([A-Za-z0-9\\-]+)',
None,
'Alcatel $1',
'Alcatel',
'$1',
),
DeviceParser(
'(?:Amoi|AMOI)\\-([A-Za-z0-9]+)',
None,
'Amoi $1',
'Amoi',
'$1',
),
DeviceParser(
'(?:; |\\/|^)((?:Transformer (?:Pad|Prime) |Transformer |PadFone[ _]?)[A-Za-z0-9]*)',
None,
'Asus $1',
'Asus',
'$1',
),
DeviceParser(
'(?:asus.*?ASUS|Asus|ASUS|asus)[\\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)',
None,
'Asus $1',
'Asus',
'$1',
),
DeviceParser(
'(?:ASUS)_([A-Za-z0-9\\-]+)',
None,
'Asus $1',
'Asus',
'$1',
),
DeviceParser(
'\\bBIRD[ \\-\\.]([A-Za-z0-9]+)',
None,
'Bird $1',
'Bird',
'$1',
),
DeviceParser(
'\\bDell ([A-Za-z0-9]+)',
None,
'Dell $1',
'Dell',
'$1',
),
DeviceParser(
'DoCoMo/2\\.0 ([A-Za-z0-9]+)',
None,
'DoCoMo $1',
'DoCoMo',
'$1',
),
DeviceParser(
'([A-Za-z0-9]+)_W;FOMA',
None,
'DoCoMo $1',
'DoCoMo',
'$1',
),
DeviceParser(
'([A-Za-z0-9]+);FOMA',
None,
'DoCoMo $1',
'DoCoMo',
'$1',
),
DeviceParser(
'\\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\\(\\)]|$)',
None,
'HTC $1',
'HTC',
'$1',
),
DeviceParser(
'Huawei([A-Za-z0-9]+)',
None,
'Huawei $1',
'Huawei',
'$1',
),
DeviceParser(
'HUAWEI-([A-Za-z0-9]+)',
None,
'Huawei $1',
'Huawei',
'$1',
),
DeviceParser(
'HUAWEI ([A-Za-z0-9\\-]+)',
None,
'Huawei $1',
'Huawei',
'$1',
),
DeviceParser(
'vodafone([A-Za-z0-9]+)',
None,
'Huawei Vodafone $1',
'Huawei',
'Vodafone $1',
),
DeviceParser(
'i\\-mate ([A-Za-z0-9]+)',
None,
'i-mate $1',
'i-mate',
'$1',
),
DeviceParser(
'Kyocera\\-([A-Za-z0-9]+)',
None,
'Kyocera $1',
'Kyocera',
'$1',
),
DeviceParser(
'KWC\\-([A-Za-z0-9]+)',
None,
'Kyocera $1',
'Kyocera',
'$1',
),
DeviceParser(
'Lenovo[_\\-]([A-Za-z0-9]+)',
None,
'Lenovo $1',
'Lenovo',
'$1',
),
DeviceParser(
'(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+ \\( ?;(LG)E ?;([^;]{0,30})',
None,
'$1',
'$2',
'$3',
),
DeviceParser(
'(HbbTV)/1\\.1\\.1.*CE-HTML/1\\.\\d;(Vendor/|)(THOM[^;]*?)[;\\s].{0,30}(LF[^;]+);?',
None,
'$1',
'Thomson',
'$4',
),
DeviceParser(
'(HbbTV)(?:/1\\.1\\.1|) ?(?: \\(;;;;;\\)|); *CE-HTML(?:/1\\.\\d|); *([^ ]+) ([^;]+);',
None,
'$1',
'$2',
'$3',
),
DeviceParser(
'(HbbTV)/1\\.1\\.1 \\(;;;;;\\) Maple_2011',
None,
'$1',
'Samsung',
None,
),
DeviceParser(
'(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+ \\([^;]{0,30}; ?(?:CUS:([^;]*)|([^;]+)) ?; ?([^;]{0,30})',
None,
'$1',
'$2$3',
'$4',
),
DeviceParser(
'(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+',
None,
'$1',
None,
None,
),
DeviceParser(
'LGE; (?:Media\\/|)([^;]*);[^;]*;[^;]*;?\\); "?LG NetCast(\\.TV|\\.Media|)-\\d+',
None,
'NetCast$2',
'LG',
'$1',
),
DeviceParser(
'InettvBrowser/[0-9]+\\.[0-9A-Z]+ \\([^;]*;(Sony)([^;]*);[^;]*;[^\\)]*\\)',
None,
'Inettv',
'$1',
'$2',
),
DeviceParser(
'InettvBrowser/[0-9]+\\.[0-9A-Z]+ \\([^;]*;([^;]*);[^;]*;[^\\)]*\\)',
None,
'Inettv',
'Generic_Inettv',
'$1',
),
DeviceParser(
'(?:InettvBrowser|TSBNetTV|NETTV|HBBTV)',
None,
'Inettv',
'Generic_Inettv',
None,
),
DeviceParser(
'Series60/\\d\\.\\d (LG)[\\-]?([A-Za-z0-9 \\-]+)',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'\\b(?:LGE[ \\-]LG\\-(?:AX|)|LGE |LGE?-LG|LGE?[ \\-]|LG[ /\\-]|lg[\\-])([A-Za-z0-9]+)\\b',
None,
'LG $1',
'LG',
'$1',
),
DeviceParser(
'(?:^LG[\\-]?|^LGE[\\-/]?)([A-Za-z]+[0-9]+[A-Za-z]*)',
None,
'LG $1',
'LG',
'$1',
),
DeviceParser(
'^LG([0-9]+[A-Za-z]*)',
None,
'LG $1',
'LG',
'$1',
),
DeviceParser(
'(KIN\\.[^ ]+) (\\d+)\\.(\\d+)',
None,
'Microsoft $1',
'Microsoft',
'$1',
),
DeviceParser(
'(?:MSIE|XBMC).*\\b(Xbox)\\b',
None,
'$1',
'Microsoft',
'$1',
),
DeviceParser(
'; ARM; Trident/6\\.0; Touch[\\);]',
None,
'Microsoft Surface RT',
'Microsoft',
'Surface RT',
),
DeviceParser(
'Motorola\\-([A-Za-z0-9]+)',
None,
'Motorola $1',
'Motorola',
'$1',
),
DeviceParser(
'MOTO\\-([A-Za-z0-9]+)',
None,
'Motorola $1',
'Motorola',
'$1',
),
DeviceParser(
'MOT\\-([A-z0-9][A-z0-9\\-]*)',
None,
'Motorola $1',
'Motorola',
'$1',
),
DeviceParser(
'Nintendo WiiU',
None,
'Nintendo Wii U',
'Nintendo',
'Wii U',
),
DeviceParser(
'Nintendo (DS|3DS|DSi|Wii);',
None,
'Nintendo $1',
'Nintendo',
'$1',
),
DeviceParser(
'(?:Pantech|PANTECH)[ _-]?([A-Za-z0-9\\-]+)',
None,
'Pantech $1',
'Pantech',
'$1',
),
DeviceParser(
'Philips([A-Za-z0-9]+)',
None,
'Philips $1',
'Philips',
'$1',
),
DeviceParser(
'Philips ([A-Za-z0-9]+)',
None,
'Philips $1',
'Philips',
'$1',
),
DeviceParser(
'(SMART-TV); .* Tizen ',
None,
'Samsung $1',
'Samsung',
'$1',
),
DeviceParser(
'SymbianOS/9\\.\\d.* Samsung[/\\-]([A-Za-z0-9 \\-]+)',
None,
'Samsung $1',
'Samsung',
'$1',
),
DeviceParser(
'(Samsung)(SGH)(i[0-9]+)',
None,
'$1 $2$3',
'$1',
'$2-$3',
),
DeviceParser(
'SAMSUNG-ANDROID-MMS/([^;/]+)',
None,
'$1',
'Samsung',
'$1',
),
DeviceParser(
'SAMSUNG(?:; |[ -/])([A-Za-z0-9\\-]+)',
'i',
'Samsung $1',
'Samsung',
'$1',
),
DeviceParser(
'(Dreamcast)',
None,
'Sega $1',
'Sega',
'$1',
),
DeviceParser(
'^SIE-([A-Za-z0-9]+)',
None,
'Siemens $1',
'Siemens',
'$1',
),
DeviceParser(
'Softbank/[12]\\.0/([A-Za-z0-9]+)',
None,
'Softbank $1',
'Softbank',
'$1',
),
DeviceParser(
'SonyEricsson ?([A-Za-z0-9\\-]+)',
None,
'Ericsson $1',
'SonyEricsson',
'$1',
),
DeviceParser(
'Android [^;]+; ([^ ]+) (Sony)/',
None,
'$2 $1',
'$2',
'$1',
),
DeviceParser(
'(Sony)(?:BDP\\/|\\/|)([^ /;\\)]+)[ /;\\)]',
None,
'$1 $2',
'$1',
'$2',
),
DeviceParser(
'Puffin/[\\d\\.]+IT',
None,
'iPad',
'Apple',
'iPad',
),
DeviceParser(
'Puffin/[\\d\\.]+IP',
None,
'iPhone',
'Apple',
'iPhone',
),
DeviceParser(
'Puffin/[\\d\\.]+AT',
None,
'Generic Tablet',
'Generic',
'Tablet',
),
DeviceParser(
'Puffin/[\\d\\.]+AP',
None,
'Generic Smartphone',
'Generic',
'Smartphone',
),
DeviceParser(
'Android[\\- ][\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\\))',
None,
None,
'Generic_Android',
'$1',
),
DeviceParser(
'Android[\\- ][\\d]+\\.[\\d]+\\-update1; [A-Za-z]{2}\\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\\))',
None,
None,
'Generic_Android',
'$1',
),
DeviceParser(
'Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *[A-Za-z]{2}[_\\-][A-Za-z]{0,2}\\-? *; *(.+?)( Build[/ ]|\\))',
None,
None,
'Generic_Android',
'$1',
),
DeviceParser(
'Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *[A-Za-z]{0,2}\\- *; *(.+?)( Build[/ ]|\\))',
None,
None,
'Generic_Android',
'$1',
),
DeviceParser(
'Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *[a-z]{0,2}[_\\-]?[A-Za-z]{0,2};?( Build[/ ]|\\))',
None,
'Generic Smartphone',
'Generic',
'Smartphone',
),
DeviceParser(
'Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *\\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\\))',
None,
None,
'Generic_Android',
'$1',
),
DeviceParser(
'Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]+?)(?: Build|\\) AppleWebKit).+? Mobile Safari',
None,
None,
'Generic_Android',
'$1',
),
DeviceParser(
'Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]+?)(?: Build|\\) AppleWebKit).+? Safari',
None,
None,
'Generic_Android_Tablet',
'$1',
),
DeviceParser(
'Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]+?)(?: Build|\\))',
None,
None,
'Generic_Android',
'$1',
),
DeviceParser(
'(GoogleTV)',
None,
None,
'Generic_Inettv',
'$1',
),
DeviceParser(
'(WebTV)/\\d+.\\d+',
None,
None,
'Generic_Inettv',
'$1',
),
DeviceParser(
'^(Roku)/DVP-\\d+\\.\\d+',
None,
None,
'Generic_Inettv',
'$1',
),
DeviceParser(
'(Android 3\\.\\d|Opera Tablet|Tablet; .+Firefox/|Android.*(?:Tab|Pad))',
'i',
'Generic Tablet',
'Generic',
'Tablet',
),
DeviceParser(
'(Symbian|\\bS60(Version|V\\d)|\\bS60\\b|\\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .+Firefox/|iPhone OS|Android|MobileSafari|Windows *Phone|\\(webOS/|PalmOS)',
None,
'Generic Smartphone',
'Generic',
'Smartphone',
),
DeviceParser(
'(hiptop|avantgo|plucker|xiino|blazer|elaine)',
'i',
'Generic Smartphone',
'Generic',
'Smartphone',
),
DeviceParser(
'(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper)',
'i',
'Spider',
'Spider',
'Desktop',
),
DeviceParser(
'^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\\-|airn|alav|asus|attw|au\\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bmobile|bell|bird|bw\\-n|bw\\-u|beck|benq|bilb|blac|c55/|cdm\\-|chtm|capi|comp|cond|dall|dbte|dc\\-s|dica|ds\\-d|ds12|dait|devi|dmob|doco|dopo|dorado|el(?:38|39|48|49|50|55|58|68)|el[3456]\\d{2}dual|erk0|esl8|ex300|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\\-|fly_|g\\-mo|g1 u|g560|gf\\-5|grun|gene|go.w|good|grad|hcit|hd\\-m|hd\\-p|hd\\-t|hei\\-|hp i|hpip|hs\\-c|htc |htc\\-|htca|htcg)',
'i',
'Generic Feature Phone',
'Generic',
'Feature Phone',
),
DeviceParser(
'^(htcp|htcs|htct|htc_|haie|hita|huaw|hutc|i\\-20|i\\-go|i\\-ma|i\\-mobile|i230|iac|iac\\-|iac/|ig01|im1k|inno|iris|jata|kddi|kgt|kgt/|kpt |kwc\\-|klon|lexi|lg g|lg\\-a|lg\\-b|lg\\-c|lg\\-d|lg\\-f|lg\\-g|lg\\-k|lg\\-l|lg\\-m|lg\\-o|lg\\-p|lg\\-s|lg\\-t|lg\\-u|lg\\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\\-|lge/|leno|m1\\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\\-|nem\\-|newg|neon)',
'i',
'Generic Feature Phone',
'Generic',
'Feature Phone',
),
DeviceParser(
'^(netf|noki|nzph|o2 x|o2\\-x|opwv|owg1|opti|oran|ot\\-s|p800|pand|pg\\-1|pg\\-2|pg\\-3|pg\\-6|pg\\-8|pg\\-c|pg13|phil|pn\\-2|pt\\-g|palm|pana|pire|pock|pose|psio|qa\\-a|qc\\-2|qc\\-3|qc\\-5|qc\\-7|qc07|qc12|qc21|qc32|qc60|qci\\-|qwap|qtek|r380|r600|raks|rim9|rove|s55/|sage|sams|sc01|sch\\-|scp\\-|sdk/|se47|sec\\-|sec0|sec1|semc|sgh\\-|shar|sie\\-|sk\\-0|sl45|slid|smb3|smt5|sp01|sph\\-|spv |spv\\-|sy01|samm|sany|sava|scoo|send|siem|smar|smit|soft|sony|t\\-mo|t218|t250|t600|t610|t618|tcl\\-|tdg\\-|telm|tim\\-|ts70|tsm\\-|tsm3|tsm5|tx\\-9|tagt)',
'i',
'Generic Feature Phone',
'Generic',
'Feature Phone',
),
DeviceParser(
'^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vertu|vite|voda|vulc|w3c |w3c\\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\\-|your|zte\\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\\-|webc|whit|wmlb|xda\\-|xda_)',
'i',
'Generic Feature Phone',
'Generic',
'Feature Phone',
),
DeviceParser(
'^(Ice)$',
None,
'Generic Feature Phone',
'Generic',
'Feature Phone',
),
DeviceParser(
'(wap[\\-\\ ]browser|maui|netfront|obigo|teleca|up\\.browser|midp|Opera Mini)',
'i',
'Generic Feature Phone',
'Generic',
'Feature Phone',
),
DeviceParser(
'Mac OS',
None,
'Mac',
'Apple',
'Mac',
),
]
OS_PARSERS = [
OSParser(
'HbbTV/\\d+\\.\\d+\\.\\d+ \\( ;(LG)E ;NetCast 4.0',
None,
'2013',
None,
None,
None,
),
OSParser(
'HbbTV/\\d+\\.\\d+\\.\\d+ \\( ;(LG)E ;NetCast 3.0',
None,
'2012',
None,
None,
None,
),
OSParser(
'HbbTV/1.1.1 \\(;;;;;\\) Maple_2011',
'Samsung',
'2011',
None,
None,
None,
),
OSParser(
'HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC',
None,
None,
'UE40F7000',
None,
None,
),
OSParser(
'HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC',
None,
None,
'UE32F4500',
None,
None,
),
OSParser(
'HbbTV/1\\.1\\.1 \\(; (Philips);.*NETTV/4',
None,
'2013',
None,
None,
None,
),
OSParser(
'HbbTV/1\\.1\\.1 \\(; (Philips);.*NETTV/3',
None,
'2012',
None,
None,
None,
),
OSParser(
'HbbTV/1\\.1\\.1 \\(; (Philips);.*NETTV/2',
None,
'2011',
None,
None,
None,
),
OSParser(
'HbbTV/\\d+\\.\\d+\\.\\d+.*(firetv)-firefox-plugin (\\d+).(\\d+).(\\d+)',
'FireHbbTV',
None,
None,
None,
None,
),
OSParser(
'HbbTV/\\d+\\.\\d+\\.\\d+ \\(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\\)',
None,
None,
None,
None,
None,
),
OSParser(
'(Windows Phone) (?:OS[ /])?(\\d+)\\.(\\d+)',
None,
None,
None,
None,
None,
),
OSParser(
'(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+)|).*Outlook-iOS-Android',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(Android)[ \\-/](\\d+)(?:\\.(\\d+)|)(?:[.\\-]([a-z0-9]+)|)',
None,
None,
None,
None,
None,
),
OSParser(
'(Android) Donut',
None,
'1',
'2',
None,
None,
),
OSParser(
'(Android) Eclair',
None,
'2',
'1',
None,
None,
),
OSParser(
'(Android) Froyo',
None,
'2',
'2',
None,
None,
),
OSParser(
'(Android) Gingerbread',
None,
'2',
'3',
None,
None,
),
OSParser(
'(Android) Honeycomb',
None,
'3',
None,
None,
None,
),
OSParser(
'(Android) (\\d+);',
None,
None,
None,
None,
None,
),
OSParser(
'^UCWEB.*; (Adr) (\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+)|);',
'Android',
None,
None,
None,
None,
),
OSParser(
'^UCWEB.*; (iPad|iPh|iPd) OS (\\d+)_(\\d+)(?:_(\\d+)|);',
'iOS',
None,
None,
None,
None,
),
OSParser(
'^UCWEB.*; (wds) (\\d+)\\.(\\d+)(?:\\.(\\d+)|);',
'Windows Phone',
None,
None,
None,
None,
),
OSParser(
'^(JUC).*; ?U; ?(?:Android|)(\\d+)\\.(\\d+)(?:[\\.\\-]([a-z0-9]+)|)',
'Android',
None,
None,
None,
None,
),
OSParser(
'(android)\\s(?:mobile\\/)(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)',
'Android',
None,
None,
None,
None,
),
OSParser(
'(Silk-Accelerated=[a-z]{4,5})',
'Android',
None,
None,
None,
None,
),
OSParser(
'(x86_64|aarch64)\\ (\\d+)\\.(\\d+)\\.(\\d+).*Chrome.*(?:CitrixChromeApp)$',
'Chrome OS',
None,
None,
None,
None,
),
OSParser(
'(XBLWP7)',
'Windows Phone',
None,
None,
None,
None,
),
OSParser(
'(Windows ?Mobile)',
'Windows Mobile',
None,
None,
None,
None,
),
OSParser(
'(Windows 10)',
'Windows',
'10',
None,
None,
None,
),
OSParser(
'(Windows (?:NT 5\\.2|NT 5\\.1))',
'Windows',
'XP',
None,
None,
None,
),
OSParser(
'(Windows NT 6\\.1)',
'Windows',
'7',
None,
None,
None,
),
OSParser(
'(Windows NT 6\\.0)',
'Windows',
'Vista',
None,
None,
None,
),
OSParser(
'(Win 9x 4\\.90)',
'Windows',
'ME',
None,
None,
None,
),
OSParser(
'(Windows NT 6\\.2; ARM;)',
'Windows',
'RT',
None,
None,
None,
),
OSParser(
'(Windows NT 6\\.2)',
'Windows',
'8',
None,
None,
None,
),
OSParser(
'(Windows NT 6\\.3; ARM;)',
'Windows',
'RT 8',
'1',
None,
None,
),
OSParser(
'(Windows NT 6\\.3)',
'Windows',
'8',
'1',
None,
None,
),
OSParser(
'(Windows NT 6\\.4)',
'Windows',
'10',
None,
None,
None,
),
OSParser(
'(Windows NT 10\\.0)',
'Windows',
'10',
None,
None,
None,
),
OSParser(
'(Windows NT 5\\.0)',
'Windows',
'2000',
None,
None,
None,
),
OSParser(
'(WinNT4.0)',
'Windows',
'NT 4.0',
None,
None,
None,
),
OSParser(
'(Windows ?CE)',
'Windows',
'CE',
None,
None,
None,
),
OSParser(
'Win(?:dows)? ?(95|98|3.1|NT|ME|2000|XP|Vista|7|CE)',
'Windows',
'$1',
None,
None,
None,
),
OSParser(
'Win16',
'Windows',
'3.1',
None,
None,
None,
),
OSParser(
'Win32',
'Windows',
'95',
None,
None,
None,
),
OSParser(
'^Box.*Windows/([\\d.]+);',
'Windows',
'$1',
None,
None,
None,
),
OSParser(
'(Tizen)[/ ](\\d+)\\.(\\d+)',
None,
None,
None,
None,
None,
),
OSParser(
'((?:Mac[ +]?|; )OS[ +]X)[\\s+/](?:(\\d+)[_.](\\d+)(?:[_.](\\d+)|)|Mach-O)',
'Mac OS X',
None,
None,
None,
None,
),
OSParser(
'\\w+\\s+Mac OS X\\s+\\w+\\s+(\\d+).(\\d+).(\\d+).*',
'Mac OS X',
'$1',
'$2',
'$3',
None,
),
OSParser(
' (Dar)(win)/(9).(\\d+).*\\((?:i386|x86_64|Power Macintosh)\\)',
'Mac OS X',
'10',
'5',
None,
None,
),
OSParser(
' (Dar)(win)/(10).(\\d+).*\\((?:i386|x86_64)\\)',
'Mac OS X',
'10',
'6',
None,
None,
),
OSParser(
' (Dar)(win)/(11).(\\d+).*\\((?:i386|x86_64)\\)',
'Mac OS X',
'10',
'7',
None,
None,
),
OSParser(
' (Dar)(win)/(12).(\\d+).*\\((?:i386|x86_64)\\)',
'Mac OS X',
'10',
'8',
None,
None,
),
OSParser(
' (Dar)(win)/(13).(\\d+).*\\((?:i386|x86_64)\\)',
'Mac OS X',
'10',
'9',
None,
None,
),
OSParser(
'Mac_PowerPC',
'Mac OS',
None,
None,
None,
None,
),
OSParser(
'(?:PPC|Intel) (Mac OS X)',
None,
None,
None,
None,
None,
),
OSParser(
'^Box.*;(Darwin)/(10)\\.(1\\d)(?:\\.(\\d+)|)',
'Mac OS X',
None,
None,
None,
None,
),
OSParser(
'(Apple\\s?TV)(?:/(\\d+)\\.(\\d+)|)',
'ATV OS X',
None,
None,
None,
None,
),
OSParser(
'(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+)|)',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(iPhone|iPad|iPod); Opera',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(iPhone|iPad|iPod).*Mac OS X.*Version/(\\d+)\\.(\\d+)',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(CFNetwork)/(5)48\\.0\\.3.* Darwin/11\\.0\\.0',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(CFNetwork)/(5)48\\.(0)\\.4.* Darwin/(1)1\\.0\\.0',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(CFNetwork)/(5)48\\.(1)\\.4',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(CFNetwork)/(4)85\\.1(3)\\.9',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(CFNetwork)/(6)09\\.(1)\\.4',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(CFNetwork)/(6)(0)9',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(CFNetwork)/6(7)2\\.(1)\\.13',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(CFNetwork)/6(7)2\\.(1)\\.(1)4',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(CF)(Network)/6(7)(2)\\.1\\.15',
'iOS',
'7',
'1',
None,
None,
),
OSParser(
'(CFNetwork)/6(7)2\\.(0)\\.(?:2|8)',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(CFNetwork)/709\\.1',
'iOS',
'8',
'0.b5',
None,
None,
),
OSParser(
'(CF)(Network)/711\\.(\\d)',
'iOS',
'8',
None,
None,
None,
),
OSParser(
'(CF)(Network)/(720)\\.(\\d)',
'Mac OS X',
'10',
'10',
None,
None,
),
OSParser(
'(CF)(Network)/(760)\\.(\\d)',
'Mac OS X',
'10',
'11',
None,
None,
),
OSParser(
'CFNetwork/7.* Darwin/15\\.4\\.\\d+',
'iOS',
'9',
'3',
'1',
None,
),
OSParser(
'CFNetwork/7.* Darwin/15\\.5\\.\\d+',
'iOS',
'9',
'3',
'2',
None,
),
OSParser(
'CFNetwork/7.* Darwin/15\\.6\\.\\d+',
'iOS',
'9',
'3',
'5',
None,
),
OSParser(
'(CF)(Network)/758\\.(\\d)',
'iOS',
'9',
None,
None,
None,
),
OSParser(
'CFNetwork/808\\.3 Darwin/16\\.3\\.\\d+',
'iOS',
'10',
'2',
'1',
None,
),
OSParser(
'(CF)(Network)/808\\.(\\d)',
'iOS',
'10',
None,
None,
None,
),
OSParser(
'CFNetwork/.* Darwin/17\\.\\d+.*\\(x86_64\\)',
'Mac OS X',
'10',
'13',
None,
None,
),
OSParser(
'CFNetwork/.* Darwin/16\\.\\d+.*\\(x86_64\\)',
'Mac OS X',
'10',
'12',
None,
None,
),
OSParser(
'CFNetwork/8.* Darwin/15\\.\\d+.*\\(x86_64\\)',
'Mac OS X',
'10',
'11',
None,
None,
),
OSParser(
'CFNetwork/.* Darwin/(9)\\.\\d+',
'iOS',
'1',
None,
None,
None,
),
OSParser(
'CFNetwork/.* Darwin/(10)\\.\\d+',
'iOS',
'4',
None,
None,
None,
),
OSParser(
'CFNetwork/.* Darwin/(11)\\.\\d+',
'iOS',
'5',
None,
None,
None,
),
OSParser(
'CFNetwork/.* Darwin/(13)\\.\\d+',
'iOS',
'6',
None,
None,
None,
),
OSParser(
'CFNetwork/6.* Darwin/(14)\\.\\d+',
'iOS',
'7',
None,
None,
None,
),
OSParser(
'CFNetwork/7.* Darwin/(14)\\.\\d+',
'iOS',
'8',
'0',
None,
None,
),
OSParser(
'CFNetwork/7.* Darwin/(15)\\.\\d+',
'iOS',
'9',
'0',
None,
None,
),
OSParser(
'CFNetwork/8.* Darwin/16\\.5\\.\\d+',
'iOS',
'10',
'3',
None,
None,
),
OSParser(
'CFNetwork/8.* Darwin/16\\.6\\.\\d+',
'iOS',
'10',
'3',
'2',
None,
),
OSParser(
'CFNetwork/8.* Darwin/16\\.7\\.\\d+',
'iOS',
'10',
'3',
'3',
None,
),
OSParser(
'CFNetwork/8.* Darwin/(16)\\.\\d+',
'iOS',
'10',
None,
None,
None,
),
OSParser(
'CFNetwork/8.* Darwin/17\\.0\\.\\d+',
'iOS',
'11',
'0',
None,
None,
),
OSParser(
'CFNetwork/8.* Darwin/17\\.2\\.\\d+',
'iOS',
'11',
'1',
None,
None,
),
OSParser(
'CFNetwork/8.* Darwin/17\\.3\\.\\d+',
'iOS',
'11',
'2',
None,
None,
),
OSParser(
'CFNetwork/8.* Darwin/17\\.4\\.\\d+',
'iOS',
'11',
'2',
'6',
None,
),
OSParser(
'CFNetwork/8.* Darwin/17\\.5\\.\\d+',
'iOS',
'11',
'3',
None,
None,
),
OSParser(
'CFNetwork/9.* Darwin/17\\.6\\.\\d+',
'iOS',
'11',
'4',
None,
None,
),
OSParser(
'CFNetwork/9.* Darwin/17\\.7\\.\\d+',
'iOS',
'11',
'4',
'1',
None,
),
OSParser(
'CFNetwork/8.* Darwin/(17)\\.\\d+',
'iOS',
'11',
None,
None,
None,
),
OSParser(
'CFNetwork/9.* Darwin/18\\.0\\.\\d+',
'iOS',
'12',
'0',
None,
None,
),
OSParser(
'CFNetwork/9.* Darwin/(18)\\.\\d+',
'iOS',
'12',
None,
None,
None,
),
OSParser(
'CFNetwork/.* Darwin/',
'iOS',
None,
None,
None,
None,
),
OSParser(
'\\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\\d,\\d/|\\d,\\d; )|iPad/)(\\d{1,2})[_\\.](\\d{1,2})(?:[_\\.](\\d+)|)',
'iOS',
None,
None,
None,
None,
),
OSParser(
'\\((iOS);',
None,
None,
None,
None,
None,
),
OSParser(
'(watchOS)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'WatchOS',
None,
None,
None,
None,
),
OSParser(
'Outlook-(iOS)/\\d+\\.\\d+\\.prod\\.iphone',
None,
None,
None,
None,
None,
),
OSParser(
'(iPod|iPhone|iPad)',
'iOS',
None,
None,
None,
None,
),
OSParser(
'(tvOS)[/ ](\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'tvOS',
None,
None,
None,
None,
),
OSParser(
'(CrOS) [a-z0-9_]+ (\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'Chrome OS',
None,
None,
None,
None,
),
OSParser(
'([Dd]ebian)',
'Debian',
None,
None,
None,
None,
),
OSParser(
'(Linux Mint)(?:/(\\d+)|)',
None,
None,
None,
None,
None,
),
OSParser(
'(Mandriva)(?: Linux|)/(?:[\\d.-]+m[a-z]{2}(\\d+).(\\d)|)',
None,
None,
None,
None,
None,
),
OSParser(
'(Symbian[Oo][Ss])[/ ](\\d+)\\.(\\d+)',
'Symbian OS',
None,
None,
None,
None,
),
OSParser(
'(Symbian/3).+NokiaBrowser/7\\.3',
'Symbian^3 Anna',
None,
None,
None,
None,
),
OSParser(
'(Symbian/3).+NokiaBrowser/7\\.4',
'Symbian^3 Belle',
None,
None,
None,
None,
),
OSParser(
'(Symbian/3)',
'Symbian^3',
None,
None,
None,
None,
),
OSParser(
'\\b(Series 60|SymbOS|S60Version|S60V\\d|S60\\b)',
'Symbian OS',
None,
None,
None,
None,
),
OSParser(
'(MeeGo)',
None,
None,
None,
None,
None,
),
OSParser(
'Symbian [Oo][Ss]',
'Symbian OS',
None,
None,
None,
None,
),
OSParser(
'Series40;',
'Nokia Series 40',
None,
None,
None,
None,
),
OSParser(
'Series30Plus;',
'Nokia Series 30 Plus',
None,
None,
None,
None,
),
OSParser(
'(BB10);.+Version/(\\d+)\\.(\\d+)\\.(\\d+)',
'BlackBerry OS',
None,
None,
None,
None,
),
OSParser(
'(Black[Bb]erry)[0-9a-z]+/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'BlackBerry OS',
None,
None,
None,
None,
),
OSParser(
'(Black[Bb]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'BlackBerry OS',
None,
None,
None,
None,
),
OSParser(
'(RIM Tablet OS) (\\d+)\\.(\\d+)\\.(\\d+)',
'BlackBerry Tablet OS',
None,
None,
None,
None,
),
OSParser(
'(Play[Bb]ook)',
'BlackBerry Tablet OS',
None,
None,
None,
None,
),
OSParser(
'(Black[Bb]erry)',
'BlackBerry OS',
None,
None,
None,
None,
),
OSParser(
'(K[Aa][Ii]OS)\\/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'KaiOS',
None,
None,
None,
None,
),
OSParser(
'\\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\\d+\\.\\d+',
'Firefox OS',
'1',
'0',
'1',
None,
),
OSParser(
'\\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\\d+\\.\\d+',
'Firefox OS',
'1',
'1',
None,
None,
),
OSParser(
'\\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\\d+\\.\\d+',
'Firefox OS',
'1',
'2',
None,
None,
),
OSParser(
'\\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\\d+\\.\\d+',
'Firefox OS',
'1',
'3',
None,
None,
),
OSParser(
'\\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\\d+\\.\\d+',
'Firefox OS',
'1',
'4',
None,
None,
),
OSParser(
'\\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\\d+\\.\\d+',
'Firefox OS',
'2',
'0',
None,
None,
),
OSParser(
'\\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\\d+\\.\\d+',
'Firefox OS',
'2',
'1',
None,
None,
),
OSParser(
'\\((?:Mobile|Tablet);.+Firefox/\\d+\\.\\d+',
'Firefox OS',
None,
None,
None,
None,
),
OSParser(
'(BREW)[ /](\\d+)\\.(\\d+)\\.(\\d+)',
None,
None,
None,
None,
None,
),
OSParser(
'(BREW);',
None,
None,
None,
None,
None,
),
OSParser(
'(Brew MP|BMP)[ /](\\d+)\\.(\\d+)\\.(\\d+)',
'Brew MP',
None,
None,
None,
None,
),
OSParser(
'BMP;',
'Brew MP',
None,
None,
None,
None,
),
OSParser(
'(GoogleTV)(?: (\\d+)\\.(\\d+)(?:\\.(\\d+)|)|/[\\da-z]+)',
None,
None,
None,
None,
None,
),
OSParser(
'(WebTV)/(\\d+).(\\d+)',
None,
None,
None,
None,
None,
),
OSParser(
'(CrKey)(?:[/](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)',
'Chromecast',
None,
None,
None,
None,
),
OSParser(
'(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)',
'webOS',
None,
None,
None,
None,
),
OSParser(
'(VRE);',
None,
None,
None,
None,
None,
),
OSParser(
'(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\\b)BSD)[/ ](\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)',
None,
None,
None,
None,
None,
),
OSParser(
'(Linux)[ /](\\d+)\\.(\\d+)(?:\\.(\\d+)|).*gentoo',
'Gentoo',
None,
None,
None,
None,
),
OSParser(
'\\((Bada);',
None,
None,
None,
None,
None,
),
OSParser(
'(Windows|Android|WeTab|Maemo|Web0S)',
None,
None,
None,
None,
None,
),
OSParser(
'(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\\b)BSD)',
None,
None,
None,
None,
None,
),
OSParser(
'(Linux)(?:[ /](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)',
None,
None,
None,
None,
None,
),
OSParser(
'SunOS',
'Solaris',
None,
None,
None,
None,
),
OSParser(
'\\(linux-gnu\\)',
'Linux',
None,
None,
None,
None,
),
OSParser(
'\\(x86_64-redhat-linux-gnu\\)',
'Red Hat',
None,
None,
None,
None,
),
OSParser(
'\\((freebsd)(\\d+)\\.(\\d+)\\)',
'FreeBSD',
None,
None,
None,
None,
),
OSParser(
'linux',
'Linux',
None,
None,
None,
None,
),
OSParser(
'^(Roku)/DVP-(\\d+)\\.(\\d+)',
None,
None,
None,
None,
None,
),
]