From c3e9e32a2a0e3816d29d31f95aceaf68df6a2d1a Mon Sep 17 00:00:00 2001 From: Rajat <11173135+malikrajat@users.noreply.github.com> Date: Sun, 8 Sep 2024 00:49:50 +0530 Subject: [PATCH] init for 18.2.0 init for 18.2.0 --- .npmignore | 2 + LICENSE | 36 + README.md | 105 +++ esm2022/lib/device-detector.constants.mjs | 575 ++++++++++++ esm2022/lib/retree.mjs | 47 + .../lib/rm-ng-device-detection.service.mjs | 206 +++++ esm2022/public-api.mjs | 6 + esm2022/rm-ng-device-detection.mjs | 5 + fesm2022/rm-ng-device-detection.mjs | 856 ++++++++++++++++++ fesm2022/rm-ng-device-detection.mjs.map | 1 + index.d.ts | 5 + lib/device-detector.constants.d.ts | 234 +++++ lib/retree.d.ts | 8 + lib/rm-ng-device-detection.service.d.ts | 43 + package.json | 64 ++ public-api.d.ts | 2 + 16 files changed, 2195 insertions(+) create mode 100644 .npmignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 esm2022/lib/device-detector.constants.mjs create mode 100644 esm2022/lib/retree.mjs create mode 100644 esm2022/lib/rm-ng-device-detection.service.mjs create mode 100644 esm2022/public-api.mjs create mode 100644 esm2022/rm-ng-device-detection.mjs create mode 100644 fesm2022/rm-ng-device-detection.mjs create mode 100644 fesm2022/rm-ng-device-detection.mjs.map create mode 100644 index.d.ts create mode 100644 lib/device-detector.constants.d.ts create mode 100644 lib/retree.d.ts create mode 100644 lib/rm-ng-device-detection.service.d.ts create mode 100644 package.json create mode 100644 public-api.d.ts diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..c97ccf2 --- /dev/null +++ b/.npmignore @@ -0,0 +1,2 @@ +# Nested package.json's are only needed for development. +**/package.json \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e2e0c97 --- /dev/null +++ b/LICENSE @@ -0,0 +1,36 @@ +MIT License + + +Copyright (c) 2024 Rajat Malik + +Permission is hereby granted, free of charge, to any person obtaining a copy + +of this software and associated documentation files (the "Software"), to deal + +in the Software without restriction, including without limitation the rights + +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + +copies of the Software, and to permit persons to whom the Software is + +furnished to do so, subject to the following conditions: + + +The above copyright notice and this permission notice shall be included in all + +copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..bcb4915 --- /dev/null +++ b/README.md @@ -0,0 +1,105 @@ + + +

rm-ng-device-detection

+
+ +

+rm-ng-device-detection Library is a powerful tool for detecting and classifying devices in Angular applications. It provides an easy-to-use service that can identify the user's device type (mobile, tablet, desktop), operating system, browser, and more based on the user agent string. This library is designed to help developers tailor user experiences based on device characteristics, enhancing responsiveness and usability. +

+ +## Installation + +To install this library, run: + +```bash +$ npm install rm-ng-device-detection --save +``` + +In your component where you want to use the Device Service + +```typescript + import { Component } from '@angular/core'; + ... + import { RmNgDeviceDetectionService } from 'rm-ng-device-detection'; + ... + @Component({ + selector: 'app-root', + standalone: true, + imports: [RouterOutlet], + templateUrl: './app.component.html', + styleUrl: './app.component.scss', + }) + + export class HomeComponent { + deviceInfo = null; + constructor(private service: RmNgDeviceDetectionService) { + this.epicFunction(); + } + ... + epicFunction() { + this.deviceInfo = this.service.getDeviceInfo(); + const isMobile = this.service.isMobile(); + const isTablet = this.service.isTablet(); + const isDesktop = this.service.isDesktop(); + console.log(this.deviceInfo); + console.log(isMobile); + console.log(isTablet); + console.log(isDesktop); + } + ... + } + +``` + +## Device service + +Holds the following properties + +- browser +- os +- device +- userAgent +- os_version + +## Helper Methods + +- **isMobile() :** returns if the device is a mobile device (android / iPhone/ windows-phone etc) +- **isTablet() :** returns if the device us a tablet (iPad etc) +- **isDesktop() :** returns if the app is running on a Desktop browser. + + + + +### Version Mapping + +| Version | Ng | +|---------|------| +| 1.x.x | 18.x | + + + + +## Issues + +If you identify any errors in this component, or have an idea for an improvement, please open +an [issue](https://github.com/malikrajat/rm-ng-device-detection/issues). I am excited to see what the community thinks of this +project, and I would love your input! + + + +## Author services + +Are you interested in this library but lacks features? Write to the author, he can do it for you. + + +## Credits + +The library is inspired by one other library. + + + +## Author + +**Rajat Malik** + +- [github/malikrajat](https://github.com/malikrajat) diff --git a/esm2022/lib/device-detector.constants.mjs b/esm2022/lib/device-detector.constants.mjs new file mode 100644 index 0000000..1b50966 --- /dev/null +++ b/esm2022/lib/device-detector.constants.mjs @@ -0,0 +1,575 @@ +export const GENERAL = { + UKNOWN: 'Unknown', +}; +export const BROWSERS = { + CHROME: 'Chrome', + FIREFOX: 'Firefox', + SAFARI: 'Safari', + OPERA: 'Opera', + IE: 'IE', + MS_EDGE: 'MS-Edge', + MS_EDGE_CHROMIUM: 'MS-Edge-Chromium', + FB_MESSANGER: 'FB-Messanger', + SAMSUNG: 'Samsung', + UCBROWSER: 'UC-Browser', + UNKNOWN: GENERAL.UKNOWN, +}; +export const MOBILES_RE = { + // tslint:disable-next-line:max-line-length + HTC: /HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel/, + NEXUS_PHONE: /Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6/, + DELL: /Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b/, + MOTOROLA: new RegExp(`Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853| + A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511| + MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600| + ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435| + WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611| + XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909| + XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\bMoto E\\b|XT1068|XT1092|XT1052`), + SAMSUNG: new RegExp(`\\bSamsung\\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710| + GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320| + GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I| + GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500| + GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070| + GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130| + GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100| + GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652| + GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410| + GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703| + GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103| + GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603| + GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770| + GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270| + GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600| + GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102| + GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562| + GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630| + SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100| + SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830| + SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410| + SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450| + SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740| + SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137| + SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597| + SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767| + SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927| + SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170| + SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357| + SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335| + SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577| + SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777| + SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937| + SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600| + SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777| + SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219| + SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369| + SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539| + SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719| + SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929| + SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120| + SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630| + SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400| + SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790| + SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720| + SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240| + SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550| + SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910| + SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100| + GT-N7105|SCH-I535|SM-N900A|SM-N900T|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312| + GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560| + GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F| + SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V| + SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F| + SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F|SM-J330F`), + LG: new RegExp(`\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970| + LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272| + C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510| + LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271| + VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802| + MS323|M257)`), + SONY: /SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533/, + ASUS: /Asus.*Galaxy|PadFone.*Mobile/, + NOKIA_LUMIA: /Lumia [0-9]{3,4}/, + MICROMAX: /Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b/, + PALM: /PalmSource|Palm/, + VERTU: /Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature/, + PANTECH: new RegExp(`PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K| + IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L| + IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000| + CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020| + P2000|P7040|P7000|C790`), + FLY: /IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250/, + WIKO: new RegExp(`KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM| + SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +| + CINK KING|CINK PEAX|CINK SLIM|SUBLIM`), + I_MOBILE: /i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)/, + SIMVALLEY: /\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b/, + WOLFGANG: /AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q/, + ALCATEL: /Alcatel|Mobile; rv:49.0|Mobile; ALCATEL 4052R; rv:48.0/, + NINTENDO: /Nintendo (3DS|Switch)/, + AMOI: /Amoi/, + INQ: /INQ/, + VITA: /\bVita\b/, + BLACKBERRY: /\bBlackBerry\b|\bBB10\b|rim[0-9]+/, + FIREFOX_OS: /\bFirefox-OS\b/, + IPHONE: /\biPhone\b/, + iPod: /\biPod\b/, + ANDROID: /\bAndroid\b/, + WINDOWS_PHONE: /\bWindows-Phone\b/, + GENERIC_PHONE: new RegExp(`Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser| + up.link|vodafone|\\bwap\\b|nokia|Nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser`), +}; +export const TABLETS_RE = { + iPad: /iPad|iPad.*Mobile/, + NexusTablet: /Android.*Nexus[\s]+(7|9|10)/, + GoogleTablet: /Android.*Pixel C/, + SamsungTablet: new RegExp(`SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210| + GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905| + SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100| + GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705| + SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201| + GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L| + SHV-E230S|SHW-M180K|SHW-M180L|SM-T865|SM-T290|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W| + SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925| + GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T385M|SM-P585M|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600| + SM-P601|SM-P605|SM-P615|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110| + GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321| + SM-T510|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V| + SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T500|SM-T330| + SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A| + SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550| + SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533| + SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713| + SM-T719|SM-T725|SM-T813|SM-T819|SM-T580|SM-T590|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350| + SM-P555M|SM-P355M|SM-T113NU|SM-T815Y|SM-T585|SM-T285|SM-T825|SM-W708|SM-T835|SM-P585Y|SM-X200|SM-T970`), + Kindle: new RegExp(`Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI| + KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\\b|Android.*Silk\/[0-9.]+ like Chrome\ + /[0-9.]+ (?!Mobile)`), + SurfaceTablet: /Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)/, + HPTablet: /HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10/, + AsusTablet: new RegExp(`^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL| + TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C| + Slider SL101|\\bK00F\\b|\\bK00C\\b|\\bK00E\\b|\\bK00L\\b|TX201LA|ME176C|ME102A|\\bM80TA\\b|ME372CL| + ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\\bME70C\\b|ME581C| + ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\\bP027\\b|\\bP024\\b|\\bP00C\\b`), + BlackBerryTablet: /PlayBook|RIM Tablet/, + HTCtablet: /HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410/, + MotorolaTablet: /xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617/, + NookTablet: /Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2/, + AcerTablet: new RegExp(`Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501| + W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\b|W3-810|\\bA3-A10\\b|\\bA3-A11\\b| + \\bA3-A20\\b|\\bA3-A30`), + ToshibaTablet: /Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO/, + LGTablet: /\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b/, + FujitsuTablet: /Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b/, + PrestigioTablet: new RegExp(`PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C| + PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D| + PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D| + PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008| + PMT5887|PMT5001|PMT5002`), + LenovoTablet: new RegExp(`Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F| + YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000| + B8000|B8080)(-|)(FL|F|HV|H|)|TB-X606F|TB-X103F|TB-X304F|TB-X304L|TB-X704F|TB-8703F|Tab2A7-10F|TB2-X30L|TB-8504F`), + DellTablet: /Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7/, + YarvikTablet: new RegExp(`Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411| + TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151| + TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485| + TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211| + TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b`), + MedionTablet: /Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB/, + ArnovaTablet: /97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2/, + IntensoTablet: /INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004/, + IRUTablet: /M702pro/, + MegafonTablet: /MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b/, + EbodaTablet: /E-Boda (Supreme|Impresspeed|Izzycomm|Essential)/, + AllViewTablet: /Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)/, + ArchosTablet: new RegExp(`\\b(101G9|80G9|A101IT)\\b|Qilive 97R|Archos5|\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| + Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\b`), + AinolTablet: /NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark/, + NokiaLumiaTablet: /Lumia 2520/, + SonyTablet: new RegExp(`Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123| + SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101| + EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP641|SGP612|SOT31|SGP771|SGP611| + SGP612|SGP712`), + PhilipsTablet: /\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b/, + CubeTablet: /Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT/, + CobyTablet: new RegExp(`MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048| + MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010`), + MIDTablet: new RegExp(`M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933| + MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737| + MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10`), + MSITablet: new RegExp(`MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81| + Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b`), + SMiTTablet: /Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)/, + RockChipTablet: /Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A/, + FlyTablet: /IQ310|Fly Vision/, + bqTablet: new RegExp(`Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton| + Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))|Maxwell.*Lite|Maxwell.*Plus`), + HuaweiTablet: new RegExp(`MediaPad|MediaPad 7 Youth|MediaPad T3 10|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106| + S7-201|S7-Slim|M2-A01L|BAH-L09|BAH-W09|AGS-W09|AGS-L09`), + NecTablet: /\bN-06D|\bN-08D/, + PantechTablet: /Pantech.*P4100/, + BronchoTablet: /Broncho.*(N701|N708|N802|a710)/, + VersusTablet: /TOUCHPAD.*[78910]|\bTOUCHTAB\b/, + ZyncTablet: /z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900/, + PositivoTablet: /TB07STA|TB10STA|TB07FTA|TB10FTA/, + NabiTablet: /Android.*\bNabi/, + KoboTablet: /Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build/, + DanewTablet: /DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b/, + TexetTablet: new RegExp(`NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047| + TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025| + TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A| + TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD| + TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD| + TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446| + TB-436|TB-416|TB-146SE|TB-126SE`), + PlaystationTablet: /Playstation.*(Portable|Vita)/, + TrekstorTablet: /ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab/, + PyleAudioTablet: /\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b/, + AdvanTablet: new RegExp(`Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci| + T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b`), + DanyTechTablet: `Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II| + Genius TAB GII|Genius TAB GIII|Genius Tab S1`, + GalapadTablet: /Android.*\bG1\b(?!\))/, + MicromaxTablet: /Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b/, + KarbonnTablet: /Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b/, + AllFineTablet: /Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide/, + PROSCANTablet: new RegExp(`\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030| + PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G| + PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088| + PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b`), + YONESTablet: /BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026/, + ChangJiaTablet: new RegExp(`TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709| + TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103| + TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106| + TPC10111|TPC10203|TPC10205|TPC10503`), + GUTablet: /TX-A1301|TX-M9002|Q702|kf026/, + PointOfViewTablet: new RegExp(`TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N| + TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+| + TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL| + TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10`), + OvermaxTablet: new RegExp(`OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab| + MagicTab|Stream|TB-08|TB-09)|Qualcore 1027`), + HCLTablet: /HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync/, + DPSTablet: /DPS Dream 9|DPS Dual 7/, + VistureTablet: /V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10/, + CrestaTablet: /CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989/, + MediatekTablet: /\bMT8125|MT8389|MT8135|MT8377\b/, + ConcordeTablet: /Concorde([ ]+)?Tab|ConCorde ReadMan/, + GoCleverTablet: new RegExp(`GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G| + TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721| + GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72| + TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2| + TAB R104|TAB R83.3|TAB A1042`), + ModecomTablet: new RegExp(`FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014| + FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801| + FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003`), + VoninoTablet: new RegExp(`\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z| + Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD| + Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b`), + ECSTablet: /V07OT2|TM105A|S10OT1|TR10CS1/, + StorexTablet: /eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab/, + VodafoneTablet: /SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497/, + EssentielBTablet: /Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2/, + RossMoorTablet: /RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711/, + iMobileTablet: /i-mobile i-note/, + TolinoTablet: /tolino tab [0-9.]+|tolino shine/, + AudioSonicTablet: /\bC-22Q|T7-QC|T-17B|T-17P\b/, + AMPETablet: /Android.* A78 /, + SkkTablet: /Android.* (SKYPAD|PHOENIX|CYCLOPS)/, + TecnoTablet: /TECNO P9|TECNO DP8D/, + JXDTablet: new RegExp(`Android.* \\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300| + S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908| + P1000|P300|S18|S6600|S9100)\\b`), + iJoyTablet: new RegExp(`Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon| + Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel| + Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity| + Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II| + Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)`), + FX2Tablet: /FX2 PAD7|FX2 PAD10/, + XoroTablet: new RegExp(`KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721| + PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR| + PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730| + TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151`), + ViewsonicTablet: /ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a/, + VerizonTablet: /QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1/, + OdysTablet: /LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10/, + CaptivaTablet: /CAPTIVA PAD/, + IconbitTablet: new RegExp(`NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C| + NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S`), + TeclastTablet: new RegExp(`T98 4G|\\bP80\\b|\\bX90HD\\b|X98 Air|X98 Air 3G|\\bX89\\b|P80 3G|\\bX80h\\b|P98 Air| + \\bX89HD\\b|P98 3G|\\bP90HD\\b|P89 3G|X98 3G|\\bP70h\\b|P79HD 3G|G18d 3G|\\bP79HD\\b|\\bP89s\\b|\\bA88\\b| + \\bP10HD\\b|\\bP19HD\\b|G18 3G|\\bP78HD\\b|\\bA78\\b|\\bP75\\b|G17s 3G|G17h 3G|\\bP85t\\b|\\bP90\\b| + \\bP11\\b|\\bP98t\\b|\\bP98HD\\b|\\bG18d\\b|\\bP85s\\b|\\bP11HD\\b|\\bP88s\\b|\\bA80HD\\b|\\bA80se\\b| + \\bA10h\\b|\\bP89\\b|\\bP78s\\b|\\bG18\\b|\\bP85\\b|\\bA70h\\b|\\bA70\\b|\\bG17\\b|\\bP18\\b|\\bA80s\\b| + \\bA11s\\b|\\bP88HD\\b|\\bA80h\\b|\\bP76s\\b|\\bP76h\\b|\\bP98\\b|\\bA10HD\\b|\\bP78\\b|\\bP88\\b|\\bA11\\b| + \\bA10t\\b|\\bP76a\\b|\\bP76t\\b|\\bP76e\\b|\\bP85HD\\b|\\bP85a\\b|\\bP86\\b|\\bP75HD\\b|\\bP76v\\b|\\bA12\\b| + \\bP75a\\b|\\bA15\\b|\\bP76Ti\\b|\\bP81HD\\b|\\bA10\\b|\\bT760VE\\b|\\bT720HD\\b|\\bP76\\b|\\bP73\\b|\\bP71\\b| + \\bP72\\b|\\bT720SE\\b|\\bC520Ti\\b|\\bT760\\b|\\bT720VE\\b|T720-3GE|T720-WiFi`), + OndaTablet: new RegExp(`\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10| + V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819| + V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973| + Vi40)\\b[\s]+|V10 \\b4G\\b`), + JaytechTablet: /TPC-PA762/, + BlaupunktTablet: /Endeavour 800NG|Endeavour 1010/, + DigmaTablet: /\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b/, + EvolioTablet: /ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b/, + LavaTablet: /QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b/, + AocTablet: /MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712/, + MpmanTablet: new RegExp(`MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780| + \\bMPG7\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110| + MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010`), + CelkonTablet: /CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b/, + WolderTablet: new RegExp(`miTab \\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS| + POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK| + FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\b`), + MediacomTablet: 'M-MPI10C3G|M-SP10EG|M-SP10EGP|M-SP10HXAH|M-SP7HXAH|M-SP10HXBH|M-SP8HXAH|M-SP8MXA', + MiTablet: /\bMI PAD\b|\bHM NOTE 1W\b/, + NibiruTablet: /Nibiru M1|Nibiru Jupiter One/, + NexoTablet: /NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI/, + LeaderTablet: new RegExp(`TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I| + TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100`), + UbislateTablet: /UbiSlate[\s]?7C/, + PocketBookTablet: /Pocketbook/, + KocasoTablet: /\b(TB-1207)\b/, + HisenseTablet: /\b(F5281|E2371)\b/, + Hudl: /Hudl HT7S3|Hudl 2/, + TelstraTablet: /T-Hub2/, + Honeywell: /RT10A/, + GenericTablet: new RegExp(`Android.*\\b97D\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8| + A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010| + Tablet-PC-4|Tagi Tab|\\bM6pro\\b|CT1020W|arc 10HD|\\bTP750\\b|\\bQTAQZ3\\b|WVT101|TM1088|KT107`), +}; +export const DEVICES = { + BLACKBERRY: 'Blackberry', + FIREFOX_OS: 'Firefox-OS', + CHROME_BOOK: 'Chrome-Book', + WINDOWS_PHONE: 'Windows-Phone', + VITA: 'Vita', + PS4: 'PS4', + MAC: 'Macintosh', + CHROMECAST: 'Chromecast', + APPLE_TV: 'Apple-TV', + GOOGLE_TV: 'Google-TV', + ANDROID: 'Android', + Tesla: 'Tesla', + iPad: 'iPad', + IPHONE: 'iPhone', + iPod: 'iPod', + UNKNOWN: GENERAL.UKNOWN, + HTC: 'HTC', + NEXUS_PHONE: 'Nexus Phone', + NexusTablet: 'Nexus Tablet', + DELL: 'Dell', + MOTOROLA: 'Motorola', + SAMSUNG: 'Samsung', + LG: 'LG', + SONY: 'Sony', + ASUS: 'Asus', + NOKIA_LUMIA: 'Nokia Lumia', + MICROMAX: 'Micromax', + PALM: 'Palm', + VERTU: 'Vertu', + PANTECH: 'PANTECH', + FLY: 'Fly', + WIKO: `WIKO`, + I_MOBILE: 'i-mobile', + SIMVALLEY: 'Simvalley', + WOLFGANG: 'Wolfgang', + ALCATEL: 'Alcatel', + HONEYWELL: 'Honeywell', + NINTENDO: 'Nintendo', + AMOI: 'Amoi', + INQ: 'INQ', + GENERIC_PHONE: 'Generic Phone', + MI_SE_9: 'Mi SE 9', +}; +export const DESKTOP_DEVICES = [ + DEVICES.PS4, + DEVICES.CHROME_BOOK, + DEVICES.MAC, + DEVICES.DELL, + DEVICES.ASUS, + DEVICES.UNKNOWN, +]; +export const OS = { + WINDOWS: 'Windows', + MAC: 'Mac', + IOS: 'iOS', + ANDROID: 'Android', + LINUX: 'Linux', + UNIX: 'Unix', + FIREFOX_OS: 'Firefox-OS', + CHROME_OS: 'Chrome-OS', + WINDOWS_PHONE: 'Windows-Phone', + UNKNOWN: GENERAL.UKNOWN, +}; +export const OS_VERSIONS = { + WINDOWS_3_11: 'windows-3-11', + WINDOWS_95: 'windows-95', + WINDOWS_ME: 'windows-me', + WINDOWS_98: 'windows-98', + WINDOWS_CE: 'windows-ce', + WINDOWS_2000: 'windows-2000', + WINDOWS_XP: 'windows-xp', + WINDOWS_SERVER_2003: 'windows-server-2003', + WINDOWS_VISTA: 'windows-vista', + WINDOWS_7: 'windows-7', + WINDOWS_8_1: 'windows-8-1', + WINDOWS_8: 'windows-8', + WINDOWS_10: 'windows-10', + WINDOWS_PHONE_7_5: 'windows-phone-7-5', + WINDOWS_PHONE_8_1: 'windows-phone-8-1', + WINDOWS_PHONE_10: 'windows-phone-10', + WINDOWS_NT_4_0: 'windows-nt-4-0', + MACOSX_11_0: 'mac-os-x-11-0', + MACOSX_16: 'mac-os-x-16', + MACOSX_15: 'mac-os-x-15', + MACOSX_14: 'mac-os-x-14', + MACOSX_13: 'mac-os-x-13', + MACOSX_12: 'mac-os-x-12', + MACOSX_11: 'mac-os-x-11', + MACOSX_10: 'mac-os-x-10', + MACOSX_9: 'mac-os-x-9', + MACOSX_8: 'mac-os-x-8', + MACOSX_7: 'mac-os-x-7', + MACOSX_6: 'mac-os-x-6', + MACOSX_5: 'mac-os-x-5', + MACOSX_4: 'mac-os-x-4', + MACOSX_3: 'mac-os-x-3', + MACOSX_2: 'mac-os-x-2', + MACOSX: 'mac-os-x', + iOS: 'iOS', + ANDROID_9: 'android-9', + UNKNOWN: GENERAL.UKNOWN.toLowerCase(), +}; +export const OS_RE = { + WINDOWS: { + and: [{ or: [/\bWindows|(Win\d\d)\b/, /\bWin 9x\b/] }, { not: /\bWindows Phone\b/ }], + }, + MAC: { + and: [/\bMac OS\b/, { not: { or: [/\biPhone\b/, /\biPad\b/, /\biPod\b/, /\bWindows Phone\b/] } }], + }, + IOS: { + and: [{ or: [/\biPad\b/, /\biPhone\b/, /\biPod\b/] }, { not: /\bWindows Phone\b/ }], + }, + ANDROID: { and: [/\bAndroid\b/, { not: /\bWindows Phone\b/ }] }, + LINUX: /\bLinux\b/, + UNIX: /\bUNIX\b/, + FIREFOX_OS: { and: [/\bFirefox\b/, /Mobile\b/] }, + CHROME_OS: /\bCrOS\b/, + WINDOWS_PHONE: { or: [/\bIEMobile\b/, /\bWindows Phone\b/] }, + PS4: /\bMozilla\/5.0 \(PlayStation 4\b/, + VITA: /\bMozilla\/5.0 \(Play(S|s)tation Vita\b/, +}; +export const BROWSERS_RE = { + CHROME: { + and: [ + { or: [/\bChrome\b/, /\bCriOS\b/, /\bHeadlessChrome\b/] }, + { + not: { + or: [/\bOPR\b/, /\bEdg(e|A|iOS)\b/, /\bEdg\/\b/, /\bSamsungBrowser\b/, /\bUCBrowser\b/], + }, + }, + ], + }, + FIREFOX: { or: [/\bFirefox\b/, /\bFxiOS\b/] }, + SAFARI: { + and: [ + /^((?!CriOS).)*\Safari\b.*$/, + { + not: { + or: [/\bOPR\b/, /\bEdg(e|A|iOS)\b/, /\bEdg\/\b/, /\bWindows Phone\b/, /\bSamsungBrowser\b/, /\bUCBrowser\b/], + }, + }, + ], + }, + OPERA: { or: [/Opera\b/, /\bOPR\b/] }, + IE: { + or: [/\bMSIE\b/, /\bTrident\b/, /^Mozilla\/5\.0 \(Windows NT 10\.0; Win64; x64\)$/], + }, + MS_EDGE: { or: [/\bEdg(e|A|iOS)\b/] }, + MS_EDGE_CHROMIUM: /\bEdg\/\b/, + PS4: /\bMozilla\/5.0 \(PlayStation 4\b/, + VITA: /\bMozilla\/5.0 \(Play(S|s)tation Vita\b/, + FB_MESSANGER: /\bFBAN\/MessengerForiOS\b/, + SAMSUNG: /\bSamsungBrowser\b/, + UCBROWSER: /\bUCBrowser\b/, +}; +export const DEVICES_RE = { + ...MOBILES_RE, + ...TABLETS_RE, + ...OS_RE, + FIREFOX_OS: { and: [/\bFirefox\b/, /\bMobile\b/] }, + CHROME_BOOK: /\bCrOS\b/, + PS4: /\bMozilla\/5.0 \(PlayStation 4\b/, + CHROMECAST: /\bCrKey\b/, + APPLE_TV: /^iTunes-AppleTV\/4.1$/, + GOOGLE_TV: /\bGoogleTV\b/, + Tesla: /Tesla\/([0-9]{4}.[0-9]{1,2}.?[0-9]{0,2}.?[0-9]{0,2})-(.{7})/, + MI_SE_9: /\bXiaomi\b/, + MAC: { + and: [/\bMac OS\b/, { not: { or: [/\biPhone\b/, /\biPad\b/, /\biPod\b/, /\bWindows Phone\b/] } }], + }, +}; +export const OS_VERSIONS_RE_MAP = { + WINDOWS_3_11: /Win16/, + WINDOWS_95: /(Windows 95|Win95|Windows_95)/, + WINDOWS_ME: /(Win 9x 4.90|Windows ME)/, + WINDOWS_98: /(Windows 98|Win98)/, + WINDOWS_CE: /Windows CE/, + WINDOWS_2000: /(Windows NT 5.0|Windows 2000)/, + WINDOWS_XP: /(Windows NT 5.1|Windows XP)/, + WINDOWS_SERVER_2003: /Windows NT 5.2/, + WINDOWS_VISTA: /Windows NT 6.0/, + WINDOWS_7: /(Windows 7|Windows NT 6.1)/, + WINDOWS_8_1: /(Windows 8.1|Windows NT 6.3)/, + WINDOWS_8: /(Windows 8|Windows NT 6.2)/, + WINDOWS_10: /(Windows NT 10.0)/, + WINDOWS_PHONE_7_5: /(Windows Phone OS 7.5)/, + WINDOWS_PHONE_8_1: /(Windows Phone 8.1)/, + WINDOWS_PHONE_10: /(Windows Phone 10)/, + WINDOWS_NT_4_0: { + and: [/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/, { not: /Windows NT 10.0/ }], + }, + MACOSX: /(MAC OS X\s*[^ 0-9])/, + MACOSX_3: /(Darwin 10.3|Mac OS X 10.3)/, + MACOSX_4: /(Darwin 10.4|Mac OS X 10.4)/, + MACOSX_5: /(Mac OS X 10.5)/, + MACOSX_6: /(Mac OS X 10.6)/, + MACOSX_7: /(Mac OS X 10.7)/, + MACOSX_8: /(Mac OS X 10.8)/, + MACOSX_9: /(Mac OS X 10.9)/, + MACOSX_10: /(Mac OS X 10.10)/, + MACOSX_11: /(Mac OS X 10.11)/, + MACOSX_12: /(Mac OS X 10.12)/, + MACOSX_13: /(Mac OS X 10.13)/, + MACOSX_14: /(Mac OS X 10.14)/, + MACOSX_15: /(Mac OS X 10.15)/, + MACOSX_16: /(Mac OS X 10.16)/, + MACOSX_11_0: { + or: [/11_0 like Mac OS X/, /Mac OS X 11/], + }, + iOS: /(iPhone OS\s*[0-9_]+)/, + ANDROID_9: /(Android 9)/, +}; +export const BROWSER_VERSIONS_RE_MAP = { + CHROME: [/\bChrome\/([\d\.]+)\b/, /\bCriOS\/([\d\.]+)\b/, /\bHeadlessChrome\/([\d\.]+)\b/], + FIREFOX: [/\bFirefox\/([\d\.]+)\b/, /\bFxiOS\/([\d\.]+)\b/], + SAFARI: [/\bVersion\/([\d\.]+)\b/, /\bSafari\/([\d\.]+)\b/], + OPERA: [/\bVersion\/([\d\.]+)\b/, /\bOPR\/([\d\.]+)\b/], + IE: [/\bMSIE ([\d\.]+\w?)\b/, /\brv:([\d\.]+\w?)\b/], + MS_EDGE: /\bEdg(?:e|A|iOS)\/([\d\.]+)\b/, + MS_EDGE_CHROMIUM: /\bEdg\/([\d\.]+)\b/, + SAMSUNG: /\bSamsungBrowser\/([\d\.]+)\b/, + UCBROWSER: /\bUCBrowser\/([\d\.]+)\b/, +}; +export const OS_VERSIONS_RE = Object.keys(OS_VERSIONS_RE_MAP).reduce((obj, key) => { + obj[key] = OS_VERSIONS_RE_MAP[key]; + return obj; +}, {}); +export const BROWSER_VERSIONS_RE = Object.keys(BROWSER_VERSIONS_RE_MAP).reduce((obj, key) => { + obj[BROWSERS[key]] = BROWSER_VERSIONS_RE_MAP[key]; + return obj; +}, {}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWRldGVjdG9yLmNvbnN0YW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3JtLW5nLWRldmljZS1kZXRlY3Rpb24vc3JjL2xpYi9kZXZpY2UtZGV0ZWN0b3IuY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRztJQUNyQixNQUFNLEVBQUUsU0FBUztDQUNsQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHO0lBQ3RCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLEtBQUssRUFBRSxPQUFPO0lBQ2QsRUFBRSxFQUFFLElBQUk7SUFDUixPQUFPLEVBQUUsU0FBUztJQUNsQixnQkFBZ0IsRUFBRSxrQkFBa0I7SUFDcEMsWUFBWSxFQUFFLGNBQWM7SUFDNUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsU0FBUyxFQUFFLFlBQVk7SUFDdkIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNO0NBQ3hCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUc7SUFDeEIsMkNBQTJDO0lBQzNDLEdBQUcsRUFBRSwwUkFBMFI7SUFDL1IsV0FBVyxFQUFFLGdGQUFnRjtJQUM3RixJQUFJLEVBQUUsc0dBQXNHO0lBQzVHLFFBQVEsRUFBRSxJQUFJLE1BQU0sQ0FBQzs7Ozs7O3lGQU1rRSxDQUFDO0lBQ3hGLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzZEQXNEdUMsQ0FBQztJQUM1RCxFQUFFLEVBQUUsSUFBSSxNQUFNLENBQUM7Ozs7O2tCQUtDLENBQUM7SUFDakIsSUFBSSxFQUFFLDRIQUE0SDtJQUNsSSxJQUFJLEVBQUUsOEJBQThCO0lBQ3BDLFdBQVcsRUFBRSxrQkFB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SUFDNUcsR0FBRyxDQUFFLFFBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBHRU5FUkFMID0ge1xyXG4gIFVLTk9XTjogJ1Vua25vd24nLFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEJST1dTRVJTID0ge1xyXG4gIENIUk9NRTogJ0Nocm9tZScsXHJcbiAgRklSRUZPWDogJ0ZpcmVmb3gnLFxyXG4gIFNBRkFSSTogJ1NhZmFyaScsXHJcbiAgT1BFUkE6ICdPcGVyYScsXHJcbiAgSUU6ICdJRScsXHJcbiAgTVNfRURHRTogJ01TLUVkZ2UnLFxyXG4gIE1TX0VER0VfQ0hST01JVU06ICdNUy1FZGdlLUNocm9taXVtJyxcclxuICBGQl9NRVNTQU5HRVI6ICdGQi1NZXNzYW5nZXInLFxyXG4gIFNBTVNVTkc6ICdTYW1zdW5nJyxcclxuICBVQ0JST1dTRVI6ICdVQy1Ccm93c2VyJyxcclxuICBVTktOT1dOOiBHRU5FUkFMLlVLTk9XTixcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBNT0JJTEVTX1JFID0ge1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICBIVEM6IC9IVEN8SFRDLiooU2Vuc2F0aW9ufEV2b3xWaXNpb258RXhwbG9yZXJ8NjgwMHw4MTAwfDg5MDB8QTcyNzJ8UzUxMGV8QzExMGV8TGVnZW5kfERlc2lyZXxUODI4Mil8QVBYNTE1Q0tUfFF0ZWs5MDkwfEFQQTkyOTJLVHxIRF9taW5pfFNlbnNhdGlvbi4qWjcxMGV8UEc4NjEwMHxaNzE1ZXxEZXNpcmUuKihBODE4MXxIRCl8QURSNjIwMHxBRFI2NDAwTHxBRFI2NDI1fDAwMUhUfEluc3BpcmUgNEd8QW5kcm9pZC4qXFxiRVZPXFxifFQtTW9iaWxlIEcxfFo1MjBtfEFuZHJvaWQgWzAtOS5dKzsgUGl4ZWwvLFxyXG4gIE5FWFVTX1BIT05FOiAvTmV4dXMgT25lfE5leHVzIFN8R2FsYXh5LipOZXh1c3xBbmRyb2lkLipOZXh1cy4qTW9iaWxlfE5leHVzIDR8TmV4dXMgNXxOZXh1cyA2LyxcclxuICBERUxMOiAvRGVsbFs7XT8gKFN0cmVha3xBZXJvfFZlbnVlfFZlbnVlIFByb3xGbGFzaHxTbW9rZXxNaW5pIDNpWCl8WENEMjh8WENEMzV8XFxiMDAxRExcXGJ8XFxiMTAxRExcXGJ8XFxiR1MwMVxcYi8sXHJcbiAgTU9UT1JPTEE6IG5ldyBSZWdFeHAoYE1vdG9yb2xhfERST0lEWHxEUk9JRCBCSU9OSUN8XFxcXGJEcm9pZFxcXFxiLipCdWlsZHxBbmRyb2lkLipYb29tfEhSSTM5fE1PVC18QTEyNjB8QTE2ODB8QTU1NXxBODUzfFxyXG4gICAgICBBODU1fEE5NTN8QTk1NXxBOTU2fE1vdG9yb2xhLipFTEVDVFJJRll8TW90b3JvbGEuKmkxfGk4Njd8aTk0MHxNQjIwMHxNQjMwMHxNQjUwMXxNQjUwMnxNQjUwOHxNQjUxMXxcclxuICAgICAgTUI1MjB8TUI1MjV8TUI1MjZ8TUI2MTF8TUI2MTJ8TUI2MzJ8TUI4MTB8TUI4NTV8TUI4NjB8TUI4NjF8TUI4NjV8TUI4NzB8TUU1MDF8TUU1MDJ8TUU1MTF8TUU1MjV8TUU2MDB8XHJcbiAgICAgIE1FNjMyfE1FNzIyfE1FODExfE1FODYwfE1FODYzfE1FODY1fE1UNjIwfE1UNzEwfE1UNzE2fE1UNzIwfE1UODEwfE1UODcwfE1UOTE3fE1vdG9yb2xhLipUSVRBTklVTXxXWDQzNXxcclxuICAgICAgV1g0NDV8WFQzMDB8WFQzMDF8WFQzMTF8WFQzMTZ8WFQzMTd8WFQzMTl8WFQzMjB8WFQzOTB8WFQ1MDJ8WFQ1MzB8WFQ1MzF8WFQ1MzJ8WFQ1MzV8WFQ2MDN8WFQ2MTB8WFQ2MTF8XHJcbiAgICAgIFhUNjE1fFhUNjgxfFhUNzAxfFhUNzAyfFhUNzExfFhUNzIwfFhUODAwfFhUODA2fFhUODYwfFhUODYyfFhUODc1fFhUODgyfFhUODgzfFhUODk0fFhUOTAxfFhUOTA3fFhUOTA5fFxyXG4gICAgICBYVDkxMHxYVDkxMnxYVDkyOHxYVDkyNnxYVDkxNXxYVDkxOXxYVDkyNXxYVDEwMjF8XFxcXGJNb3RvIEVcXFxcYnxYVDEwNjh8WFQxMDkyfFhUMTA1MmApLFxyXG4gIFNBTVNVTkc6IG5ldyBSZWdFeHAoYFxcXFxiU2Ftc3VuZ1xcXFxifFNNLUc5NTBGfFNNLUc5NTVGfFNNLUc5MjUwfEdULTE5MzAwfFNHSC1JMzM3fEJHVC1TNTIzMHxHVC1CMjEwMHxHVC1CMjcwMHxHVC1CMjcxMHxcclxuICAgICAgR1QtQjMyMTB8R1QtQjMzMTB8R1QtQjM0MTB8R1QtQjM3MzB8R1QtQjM3NDB8R1QtQjU1MTB8R1QtQjU1MTJ8R1QtQjU3MjJ8R1QtQjY1MjB8R1QtQjczMDB8R1QtQjczMjB8XHJcbiAgICAgIEdULUI3MzMwfEdULUI3MzUwfEdULUI3NTEwfEdULUI3NzIyfEdULUI3ODAwfEdULUMzMDEwfEdULUMzMDExfEdULUMzMDYwfEdULUMzMjAwfEdULUMzMjEyfEdULUMzMjEySXxcclxuICAgICAgR1QtQzMyNjJ8R1QtQzMyMjJ8R1QtQzMzMDB8R1QtQzMzMDBLfEdULUMzMzAzfEdULUMzMzAzS3xHVC1DMzMxMHxHVC1DMzMyMnxHVC1DMzMzMHxHVC1DMzM1MHxHVC1DMzUwMHxcclxuICAgICAgR1QtQzM1MTB8R1QtQzM1MzB8R1QtQzM2MzB8R1QtQzM3ODB8R1QtQzUwMTB8R1QtQzUyMTJ8R1QtQzY2MjB8R1QtQzY2MjV8R1QtQzY3MTJ8R1QtRTEwNTB8R1QtRTEwNzB8XHJcbiAgICAgIEdULUUxMDc1fEdULUUxMDgwfEdULUUxMDgxfEdULUUxMDg1fEdULUUxMDg3fEdULUUxMTAwfEdULUUxMTA3fEdULUUxMTEwfEdULUUxMTIwfEdULUUxMTI1fEdULUUxMTMwfFxyXG4gICAgICBHVC1FMTE2MHxHVC1FMTE3MHxHVC1FMTE3NXxHVC1FMTE4MHxHVC1FMTE4MnxHVC1FMTIwMHxHVC1FMTIxMHxHVC1FMTIyNXxHVC1FMTIzMHxHVC1FMTM5MHxHVC1FMjEwMHxcclxuICAgICAgR1QtRTIxMjB8R1QtRTIxMjF8R1QtRTIxNTJ8R1QtRTIyMjB8R1QtRTIyMjJ8R1QtRTIyMzB8R1QtRTIyMzJ8R1QtRTIyNTB8R1QtRTIzNzB8R1QtRTI1NTB8R1QtRTI2NTJ8XHJcbiAgICAgIEdULUUzMjEwfEdULUUzMjEzfEdULUk1NTAwfEdULUk1NTAzfEdULUk1NzAwfEdULUk1ODAwfEdULUk1ODAxfEdULUk2NDEwfEdULUk2NDIwfEdULUk3MTEwfEdULUk3NDEwfFxyXG4gICAgICBHVC1JNzUwMHxHVC1JODAwMHxHVC1JODE1MHxHVC1JODE2MHxHVC1JODE5MHxHVC1JODMyMHxHVC1JODMzMHxHVC1JODM1MHxHVC1JODUzMHxHVC1JODcwMHxHVC1JODcwM3xcclxuICAgICAgR1QtSTg5MTB8R1QtSTkwMDB8R1QtSTkwMDF8R1QtSTkwMDN8R1QtSTkwMTB8R1QtSTkwMjB8R1QtSTkwMjN8R1QtSTkwNzB8R1QtSTkwODJ8R1QtSTkxMDB8R1QtSTkxMDN8XHJcbiAgICAgIEdULUk5MjIwfEdULUk5MjUwfEdULUk5MzAwfEdULUk5MzA1fEdULUk5NTAwfEdULUk5NTA1fEdULU0zNTEwfEdULU01NjUwfEdULU03NTAwfEdULU03NjAwfEdULU03NjAzfFxyXG4gICAgICBHVC1NODgwMHxHVC1NODkxMHxHVC1ONzAwMHxHVC1TMzExMHxHVC1TMzMxMHxHVC1TMzM1MHxHVC1TMzM1M3xHVC1TMzM3MHxHVC1TMzY1MHxHVC1TMzY1M3xHVC1TMzc3MHxcclxuICAgICAgR1QtUzM4NTB8R1QtUzUyMTB8R1QtUzUyMjB8R1QtUzUyMjl8R1QtUzUyMzB8R1QtUzUyMzN8R1QtUzUyNTB8R1QtUzUyNTN8R1QtUzUyNjB8R1QtUzUyNjN8R1QtUzUyNzB8XHJcbiAgICAgIEdULVM1MzAwfEdULVM1MzMwfEdULVM1MzUwfEdULVM1MzYwfEdULVM1MzYzfEdULVM1MzY5fEdULVM1MzgwfEdULVM1MzgwRHxHVC1TNTU2MHxHVC1TNTU3MHxHVC1TNTYwMHxcclxuICAgICAgR1QtUzU2MDN8R1QtUzU2MTB8R1QtUzU2MjB8R1QtUzU2NjB8R1QtUzU2NzB8R1QtUzU2OTB8R1QtUzU3NTB8R1QtUzU3ODB8R1QtUzU4MzB8R1QtUzU4Mzl8R1QtUzYxMDJ8XHJcbiAgICAgIEdULVM2NTAwfEdULVM3MDcwfEdULVM3MjAwfEdULVM3MjIwfEdULVM3MjMwfEdULVM3MjMzfEdULVM3MjUwfEdULVM3NTAwfEdULVM3NTMwfEdULVM3NTUwfEdULVM3NTYyfFxyXG4gICAgICBHVC1TNzcxMHxHVC1TODAwMHxHVC1TODAwM3xHVC1TODUwMHxHVC1TODUzMHxHVC1TODYwMHxTQ0gtQTMxMHxTQ0gtQTUzMHxTQ0gtQTU3MHxTQ0gtQTYxMHxTQ0gtQTYzMHxcclxuICAgICAgU0NILUE2NTB8U0NILUE3OTB8U0NILUE3OTV8U0NILUE4NTB8U0NILUE4NzB8U0NILUE4OTB8U0NILUE5MzB8U0NILUE5NTB8U0NILUE5NzB8U0NILUE5OTB8U0NILUkxMDB8XHJcbiAgICAgIFNDSC1JMTEwfFNDSC1JNDAwfFNDSC1JNDA1fFNDSC1JNTAwfFNDSC1JNTEwfFNDSC1JNTE1fFNDSC1JNjAwfFNDSC1JNzMwfFNDSC1JNzYwfFNDSC1JNzcwfFNDSC1JODMwfFxyXG4gICAgICBTQ0gtSTkxMHxTQ0gtSTkyMHxTQ0gtSTk1OXxTQ0gtTEMxMXxTQ0gtTjE1MHxTQ0gtTjMwMHxTQ0gtUjEwMHxTQ0gtUjMwMHxTQ0gtUjM1MXxTQ0gtUjQwMHxTQ0gtUjQxMHxcclxuICAgICAgU0NILVQzMDB8U0NILVUzMTB8U0NILVUzMjB8U0NILVUzNTB8U0NILVUzNjB8U0NILVUzNjV8U0NILVUzNzB8U0NILVUzODB8U0NILVU0MTB8U0NILVU0MzB8U0NILVU0NTB8XHJcbiAgICAgIFNDSC1VNDYwfFNDSC1VNDcwfFNDSC1VNDkwfFNDSC1VNTQwfFNDSC1VNTUwfFNDSC1VNjIwfFNDSC1VNjQwfFNDSC1VNjUwfFNDSC1VNjYwfFNDSC1VNzAwfFNDSC1VNzQwfFxyXG4gICAgICBTQ0gtVTc1MHxTQ0gtVTgxMHxTQ0gtVTgyMHxTQ0gtVTkwMHxTQ0gtVTk0MHxTQ0gtVTk2MHxTQ1MtMjZVQ3xTR0gtQTEwN3xTR0gtQTExN3xTR0gtQTEyN3xTR0gtQTEzN3xcclxuICAgICAgU0dILUExNTd8U0dILUExNjd8U0dILUExNzd8U0dILUExODd8U0dILUExOTd8U0dILUEyMjd8U0dILUEyMzd8U0dILUEyNTd8U0dILUE0Mzd8U0dILUE1MTd8U0dILUE1OTd8XHJcbiAgICAgIFNHSC1BNjM3fFNHSC1BNjU3fFNHSC1BNjY3fFNHSC1BNjg3fFNHSC1BNjk3fFNHSC1BNzA3fFNHSC1BNzE3fFNHSC1BNzI3fFNHSC1BNzM3fFNHSC1BNzQ3fFNHSC1BNzY3fFxyXG4gICAgICBTR0gtQTc3N3xTR0gtQTc5N3xTR0gtQTgxN3xTR0gtQTgyN3xTR0gtQTgzN3xTR0gtQTg0N3xTR0gtQTg2N3xTR0gtQTg3N3xTR0gtQTg4N3xTR0gtQTg5N3xTR0gtQTkyN3xcclxuICAgICAgU0dILUIxMDB8U0dILUIxMzB8U0dILUIyMDB8U0dILUIyMjB8U0dILUMxMDB8U0dILUMxMTB8U0dILUMxMjB8U0dILUMxMzB8U0dILUMxNDB8U0dILUMxNjB8U0dILUMxNzB8XHJcbiAgICAgIFNHSC1DMTgwfFNHSC1DMjAwfFNHSC1DMjA3fFNHSC1DMjEwfFNHSC1DMjI1fFNHSC1DMjMwfFNHSC1DNDE3fFNHSC1DNDUwfFNHSC1EMzA3fFNHSC1EMzQ3fFNHSC1EMzU3fFxyXG4gICAgICBTR0gtRDQwN3xTR0gtRDQxNXxTR0gtRDc4MHxTR0gtRDgwN3xTR0gtRDk4MHxTR0gtRTEwNXxTR0gtRTIwMHxTR0gtRTMxNXxTR0gtRTMxNnxTR0gtRTMxN3xTR0gtRTMzNXxcclxuICAgICAgU0dILUU1OTB8U0dILUU2MzV8U0dILUU3MTV8U0dILUU4OTB8U0dILUYzMDB8U0dILUY0ODB8U0dILUkyMDB8U0dILUkzMDB8U0dILUkzMjB8U0dILUk1NTB8U0dILUk1Nzd8XHJcbiAgICAgIFNHSC1JNjAwfFNHSC1JNjA3fFNHSC1JNjE3fFNHSC1JNjI3fFNHSC1JNjM3fFNHSC1JNjc3fFNHSC1JNzAwfFNHSC1JNzE3fFNHSC1JNzI3fFNHSC1pNzQ3TXxTR0gtSTc3N3xcclxuICAgICAgU0dILUk3ODB8U0dILUk4Mjd8U0dILUk4NDd8U0dILUk4NTd8U0dILUk4OTZ8U0dILUk4OTd8U0dILUk5MDB8U0dILUk5MDd8U0dILUk5MTd8U0dILUk5Mjd8U0dILUk5Mzd8XHJcbiAgICAgIFNHSC1JOTk3fFNHSC1KMTUwfFNHSC1KMjAwfFNHSC1MMTcwfFNHSC1MNzAwfFNHSC1NMTEwfFNHSC1NMTUwfFNHSC1NMjAwfFNHSC1OMTA1fFNHSC1ONTAwfFNHSC1ONjAwfFxyXG4gICAgICBTR0gtTjYyMHxTR0gtTjYyNXxTR0gtTjcwMHxTR0gtTjcxMHxTR0gtUDEwN3xTR0gtUDIwN3xTR0gtUDMwMHxTR0gtUDMxMHxTR0gtUDUyMHxTR0gtUDczNXxTR0gtUDc3N3xcclxuICAgICAgU0dILVExMDV8U0dILVIyMTB8U0dILVIyMjB8U0dILVIyMjV8U0dILVMxMDV8U0dILVMzMDd8U0dILVQxMDl8U0dILVQxMTl8U0dILVQxMzl8U0dILVQyMDl8U0dILVQyMTl8XHJcbiAgICAgIFNHSC1UMjI5fFNHSC1UMjM5fFNHSC1UMjQ5fFNHSC1UMjU5fFNHSC1UMzA5fFNHSC1UMzE5fFNHSC1UMzI5fFNHSC1UMzM5fFNHSC1UMzQ5fFNHSC1UMzU5fFNHSC1UMzY5fFxyXG4gICAgICBTR0gtVDM3OXxTR0gtVDQwOXxTR0gtVDQyOXxTR0gtVDQzOXxTR0gtVDQ1OXxTR0gtVDQ2OXxTR0gtVDQ3OXxTR0gtVDQ5OXxTR0gtVDUwOXxTR0gtVDUxOXxTR0gtVDUzOXxcclxuICAgICAgU0dILVQ1NTl8U0dILVQ1ODl8U0dILVQ2MDl8U0dILVQ2MTl8U0dILVQ2Mjl8U0dILVQ2Mzl8U0dILVQ2NTl8U0dILVQ2Njl8U0dILVQ2Nzl8U0dILVQ3MDl8U0dILVQ3MTl8XHJcbiAgICAgIFNHSC1UNzI5fFNHSC1UNzM5fFNHSC1UNzQ2fFNHSC1UNzQ5fFNHSC1UNzU5fFNHSC1UNzY5fFNHSC1UODA5fFNHSC1UODE5fFNHSC1UODM5fFNHSC1UOTE5fFNHSC1UOTI5fFxyXG4gICAgICBTR0gtVDkzOXxTR0gtVDk1OXxTR0gtVDk4OXxTR0gtVTEwMHxTR0gtVTIwMHxTR0gtVTgwMHxTR0gtVjIwNXxTR0gtVjIwNnxTR0gtWDEwMHxTR0gtWDEwNXxTR0gtWDEyMHxcclxuICAgICAgU0dILVgxNDB8U0dILVg0MjZ8U0dILVg0Mjd8U0dILVg0NzV8U0dILVg0OTV8U0dILVg0OTd8U0dILVg1MDd8U0dILVg2MDB8U0dILVg2MTB8U0dILVg2MjB8U0dILVg2MzB8XHJcbiAgICAgIFNHSC1YNzAwfFNHSC1YODIwfFNHSC1YODkwfFNHSC1aMTMwfFNHSC1aMTUwfFNHSC1aMTcwfFNHSC1aWDEwfFNHSC1aWDIwfFNIVy1NMTEwfFNQSC1BMTIwfFNQSC1BNDAwfFxyXG4gICAgICBTUEgtQTQyMHxTUEgtQTQ2MHxTUEgtQTUwMHxTUEgtQTU2MHxTUEgtQTYwMHxTUEgtQTYyMHxTUEgtQTY2MHxTUEgtQTcwMHxTUEgtQTc0MHxTUEgtQTc2MHxTUEgtQTc5MHxcclxuICAgICAgU1BILUE4MDB8U1BILUE4MjB8U1BILUE4NDB8U1BILUE4ODB8U1BILUE5MDB8U1BILUE5NDB8U1BILUE5NjB8U1BILUQ2MDB8U1BILUQ3MDB8U1BILUQ3MTB8U1BILUQ3MjB8XHJcbiAgICAgIFNQSC1JMzAwfFNQSC1JMzI1fFNQSC1JMzMwfFNQSC1JMzUwfFNQSC1JNTAwfFNQSC1JNjAwfFNQSC1JNzAwfFNQSC1MNzAwfFNQSC1NMTAwfFNQSC1NMjIwfFNQSC1NMjQwfFxyXG4gICAgICBTUEgtTTMwMHxTUEgtTTMwNXxTUEgtTTMyMHxTUEgtTTMzMHxTUEgtTTM1MHxTUEgtTTM2MHxTUEgtTTM3MHxTUEgtTTM4MHxTUEgtTTUxMHxTUEgtTTU0MHxTUEgtTTU1MHxcclxuICAgICAgU1BILU01NjB8U1BILU01NzB8U1BILU01ODB8U1BILU02MTB8U1BILU02MjB8U1BILU02MzB8U1BILU04MDB8U1BILU04MTB8U1BILU04NTB8U1BILU05MDB8U1BILU05MTB8XHJcbiAgICAgIFNQSC1NOTIwfFNQSC1NOTMwfFNQSC1OMTAwfFNQSC1OMjAwfFNQSC1OMjQwfFNQSC1OMzAwfFNQSC1ONDAwfFNQSC1aNDAwfFNXQy1FMTAwfFNDSC1pOTA5fEdULU43MTAwfFxyXG4gICAgICBHVC1ONzEwNXxTQ0gtSTUzNXxTTS1OOTAwQXxTTS1OOTAwVHxTR0gtSTMxN3xTR0gtVDk5OUx8R1QtUzUzNjBCfEdULUk4MjYyfEdULVM2ODAyfEdULVM2MzEyfEdULVM2MzEwfEdULVM1MzEyfFxyXG4gICAgICBHVC1TNTMxMHxHVC1JOTEwNXxHVC1JODUxMHxHVC1TNjc5ME58U00tRzcxMDV8U00tTjkwMDV8R1QtUzUzMDF8R1QtSTkyOTV8R1QtSTkxOTV8U00tQzEwMXxHVC1TNzM5MnxHVC1TNzU2MHxcclxuICAgICAgR1QtQjc2MTB8R1QtSTU1MTB8R1QtUzc1ODJ8R1QtUzc1MzBFfEdULUk4NzUwfFNNLUc5MDA2VnxTTS1HOTAwOFZ8U00tRzkwMDlEfFNNLUc5MDBBfFNNLUc5MDBEfFNNLUc5MDBGfFxyXG4gICAgICBTTS1HOTAwSHxTTS1HOTAwSXxTTS1HOTAwSnxTTS1HOTAwS3xTTS1HOTAwTHxTTS1HOTAwTXxTTS1HOTAwUHxTTS1HOTAwUjR8U00tRzkwMFN8U00tRzkwMFR8U00tRzkwMFZ8XHJcbiAgICAgIFNNLUc5MDBXOHxTSFYtRTE2MEt8U0NILVA3MDl8U0NILVA3Mjl8U00tVDI1NTh8R1QtSTkyMDV8U00tRzkzNTB8U00tSjEyMEZ8U00tRzkyMEZ8U00tRzkyMFZ8U00tRzkzMEZ8XHJcbiAgICAgIFNNLU45MTBDfFNNLUEzMTBGfEdULUk5MTkwfFNNLUo1MDBGTnxTTS1HOTAzRnxTTS1KMzMwRmApLFxyXG4gIExHOiBuZXcgUmVnRXhwKGBcXFxcYkxHXFxcXGI7fExHWy0gXT8oQzgwMHxDOTAwfEU0MDB8RTYxMHxFOTAwfEUtOTAwfEYxNjB8RjE4MEt8RjE4MEx8RjE4MFN8NzMwfDg1NXxMMTYwfExTNzQwfExTODQwfExTOTcwfFxyXG4gICAgICBMVTYyMDB8TVM2OTB8TVM2OTV8TVM3NzB8TVM4NDB8TVM4NzB8TVM5MTB8UDUwMHxQNzAwfFA3MDV8Vk02OTZ8QVM2ODB8QVM2OTV8QVg4NDB8QzcyOXxFOTcwfEdTNTA1fDI3MnxcclxuICAgICAgQzM5NXxFNzM5Qkt8RTk2MHxMNTVDfEw3NUN8TFM2OTZ8TFM4NjB8UDc2OUJLfFAzNTB8UDUwMHxQNTA5fFA4NzB8VU4yNzJ8VVM3MzB8VlM4NDB8VlM5NTB8TE4yNzJ8TE41MTB8XHJcbiAgICAgIExTNjcwfExTODU1fExXNjkwfE1OMjcwfE1ONTEwfFA1MDl8UDc2OXxQOTMwfFVOMjAwfFVOMjcwfFVONTEwfFVONjEwfFVTNjcwfFVTNzQwfFVTNzYwfFVYMjY1fFVYODQwfFZOMjcxfFxyXG4gICAgICBWTjUzMHxWUzY2MHxWUzcwMHxWUzc0MHxWUzc1MHxWUzkxMHxWUzkyMHxWUzkzMHxWWDkyMDB8VlgxMTAwMHxBWDg0MEF8TFc3NzB8UDUwNnxQOTI1fFA5OTl8RTYxMnxEOTU1fEQ4MDJ8XHJcbiAgICAgIE1TMzIzfE0yNTcpYCksXHJcbiAgU09OWTogL1NvbnlTVHxTb255TFR8U29ueUVyaWNzc29ufFNvbnlFcmljc3NvbkxUMTVpdnxMVDE4aXxFMTBpfExUMjhofExUMjZ3fFNvbnlFcmljc3Nvbk1UMjdpfEM1MzAzfEM2OTAyfEM2OTAzfEM2OTA2fEM2OTQzfEQyNTMzLyxcclxuICBBU1VTOiAvQXN1cy4qR2FsYXh5fFBhZEZvbmUuKk1vYmlsZS8sXHJcbiAgTk9LSUFfTFVNSUE6IC9MdW1pYSBbMC05XXszLDR9LyxcclxuICBNSUNST01BWDpcclxuICAgIC9NaWNyb21heC4qXFxiKEEyMTB8QTkyfEE4OHxBNzJ8QTExMXxBMTEwUXxBMTE1fEExMTZ8QTExMHxBOTBTfEEyNnxBNTF8QTM1fEE1NHxBMjV8QTI3fEE4OXxBNjh8QTY1fEE1N3xBOTApXFxiLyxcclxuICBQQUxNOiAvUGFsbVNvdXJjZXxQYWxtLyxcclxuICBWRVJUVTogL1ZlcnR1fFZlcnR1LipMdGR8VmVydHUuKkFzY2VudHxWZXJ0dS4qQXl4dGF8VmVydHUuKkNvbnN0ZWxsYXRpb24oRnxRdWVzdCk/fFZlcnR1LipNb25pa2F8VmVydHUuKlNpZ25hdHVyZS8sXHJcbiAgUEFOVEVDSDpcclxuICAgIG5ldyBSZWdFeHAoYFBBTlRFQ0h8SU0tQTg1MFN8SU0tQTg0MFN8SU0tQTgzMEx8SU0tQTgzMEt8SU0tQTgzMFN8SU0tQTgyMEx8SU0tQTgxMEt8SU0tQTgxMFN8SU0tQTgwMFN8SU0tVDEwMEt8XHJcbiAgICAgICAgSU0tQTcyNUx8SU0tQTc4MEx8SU0tQTc3NUN8SU0tQTc3MEt8SU0tQTc2MFN8SU0tQTc1MEt8SU0tQTc0MFN8SU0tQTczMFN8SU0tQTcyMEx8SU0tQTcxMEt8SU0tQTY5MEx8XHJcbiAgICAgICAgSU0tQTY5MFN8SU0tQTY1MFN8SU0tQTYzMEt8SU0tQTYwMFN8VkVHQSBQVEwyMXxQVDAwM3xQODAxMHxBRFI5MTBMfFA2MDMwfFA2MDIwfFA5MDcwfFA0MTAwfFA5MDYwfFA1MDAwfFxyXG4gICAgICAgIENETTg5OTJ8VFhUODA0NXxBRFI4OTk1fElTMTFQVHxQMjAzMHxQNjAxMHxQODAwMHxQVDAwMnxJUzA2fENETTg5OTl8UDkwNTB8UFQwMDF8VFhUODA0MHxQMjAyMHxQOTAyMHxcclxuICAgICAgICBQMjAwMHxQNzA0MHxQNzAwMHxDNzkwYCksXHJcbiAgRkxZOiAvSVEyMzB8SVE0NDR8SVE0NTB8SVE0NDB8SVE0NDJ8SVE0NDF8SVEyNDV8SVEyNTZ8SVEyMzZ8SVEyNTV8SVEyMzV8SVEyNDV8SVEyNzV8SVEyNDB8SVEyODV8SVEyODB8SVEyNzB8SVEyNjB8SVEyNTAvLFxyXG4gIFdJS086IG5ldyBSZWdFeHAoYEtJVEUgNEd8SElHSFdBWXxHRVRBV0FZfFNUQUlSV0FZfERBUktTSURFfERBUktGVUxMfERBUktOSUdIVHxEQVJLTU9PTnxTTElERXxXQVggNEd8UkFJTkJPV3xCTE9PTXxcclxuICAgICAgICBTVU5TRVR8R09BKD8hbm5hKXxMRU5OWXxCQVJSWXxJR0dZfE9aWll8Q0lOSyBGSVZFfENJTksgUEVBWHxDSU5LIFBFQVggMnxDSU5LIFNMSU18Q0lOSyBTTElNIDJ8Q0lOSyArfFxyXG4gICAgICAgIENJTksgS0lOR3xDSU5LIFBFQVh8Q0lOSyBTTElNfFNVQkxJTWApLFxyXG4gIElfTU9CSUxFOiAvaS1tb2JpbGUgKElRfGktU1RZTEV8aWRlYXxaQUF8SGl0eikvLFxyXG4gIFNJTVZBTExFWTpcclxuICAgIC9cXGIoU1AtODB8WFQtOTMwfFNYLTM0MHxYVC05MzB8U1gtMzEwfFNQLTM2MHxTUDYwfFNQVC04MDB8U1AtMTIwfFNQVC04MDB8U1AtMTQwfFNQWC01fFNQWC04fFNQLTEwMHxTUFgtOHxTUFgtMTIpXFxiLyxcclxuICBXT0xGR0FORzogL0FULUIyNER8QVQtQVM1MEhEfEFULUFTNDBXfEFULUFTNTVIRHxBVC1BUzQ1cTJ8QVQtQjI2RHxBVC1BUzUwUS8sXHJcbiAgQUxDQVRFTDogL0FsY2F0ZWx8TW9iaWxlOyBydjo0OS4wfE1vYmlsZTsgQUxDQVRFTCA0MDUyUjsgcnY6NDguMC8sXHJcbiAgTklOVEVORE86IC9OaW50ZW5kbyAoM0RTfFN3aXRjaCkvLFxyXG4gIEFNT0k6IC9BbW9pLyxcclxuICBJTlE6IC9JTlEvLFxyXG4gIFZJVEE6IC9cXGJWaXRhXFxiLyxcclxuICBCTEFDS0JFUlJZOiAvXFxiQmxhY2tCZXJyeVxcYnxcXGJCQjEwXFxifHJpbVswLTldKy8sXHJcbiAgRklSRUZPWF9PUzogL1xcYkZpcmVmb3gtT1NcXGIvLFxyXG4gIElQSE9ORTogL1xcYmlQaG9uZVxcYi8sXHJcbiAgaVBvZDogL1xcYmlQb2RcXGIvLFxyXG4gIEFORFJPSUQ6IC9cXGJBbmRyb2lkXFxiLyxcclxuICBXSU5ET1dTX1BIT05FOiAvXFxiV2luZG93cy1QaG9uZVxcYi8sXHJcbiAgR0VORVJJQ19QSE9ORTogbmV3IFJlZ0V4cChgVGFwYXRhbGt8UERBO3xTQUdFTXxcXFxcYm1tcFxcXFxifHBvY2tldHxcXFxcYnBzcFxcXFxifHN5bWJpYW58U21hcnRwaG9uZXxzbWFydGZvbnx0cmVvfHVwLmJyb3dzZXJ8XHJcbiAgICAgICAgdXAubGlua3x2b2RhZm9uZXxcXFxcYndhcFxcXFxifG5va2lhfE5va2lhfFNlcmllczQwfFNlcmllczYwfFM2MHxTb255RXJpY3Nzb258TjkwMHxNQVVJLipXQVAuKkJyb3dzZXJgKSxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBUQUJMRVRTX1JFID0ge1xyXG4gIGlQYWQ6IC9pUGFkfGlQYWQuKk1vYmlsZS8sXHJcbiAgTmV4dXNUYWJsZXQ6IC9BbmRyb2lkLipOZXh1c1tcXHNdKyg3fDl8MTApLyxcclxuICBHb29nbGVUYWJsZXQ6IC9BbmRyb2lkLipQaXhlbCBDLyxcclxuICBTYW1zdW5nVGFibGV0OiBuZXcgUmVnRXhwKGBTQU1TVU5HLipUYWJsZXR8R2FsYXh5LipUYWJ8U0MtMDFDfEdULVAxMDAwfEdULVAxMDAzfEdULVAxMDEwfEdULVAzMTA1fEdULVA2MjEwfFxyXG4gICAgICAgIEdULVA2ODAwfEdULVA2ODEwfEdULVA3MTAwfEdULVA3MzAwfEdULVA3MzEwfEdULVA3NTAwfEdULVA3NTEwfFNDSC1JODAwfFNDSC1JODE1fFNDSC1JOTA1fFxyXG4gICAgICAgIFNHSC1JOTU3fFNHSC1JOTg3fFNHSC1UODQ5fFNHSC1UODU5fFNHSC1UODY5fFNQSC1QMTAwfEdULVAzMTAwfEdULVAzMTA4fEdULVAzMTEwfEdULVA1MTAwfFxyXG4gICAgICAgIEdULVA1MTEwfEdULVA2MjAwfEdULVA3MzIwfEdULVA3NTExfEdULU44MDAwfEdULVA4NTEwfFNHSC1JNDk3fFNQSC1QNTAwfFNHSC1UNzc5fFNDSC1JNzA1fFxyXG4gICAgICAgIFNDSC1JOTE1fEdULU44MDEzfEdULVAzMTEzfEdULVA1MTEzfEdULVA4MTEwfEdULU44MDEwfEdULU44MDA1fEdULU44MDIwfEdULVAxMDEzfEdULVA2MjAxfFxyXG4gICAgICAgIEdULVA3NTAxfEdULU41MTAwfEdULU41MTA1fEdULU41MTEwfFNIVi1FMTQwS3xTSFYtRTE0MEx8U0hWLUUxNDBTfFNIVi1FMTUwU3xTSFYtRTIzMEt8U0hWLUUyMzBMfFxyXG4gICAgICAgIFNIVi1FMjMwU3xTSFctTTE4MEt8U0hXLU0xODBMfFNNLVQ4NjV8U00tVDI5MHxTSFctTTE4MFN8U0hXLU0xODBXfFNIVy1NMzAwV3xTSFctTTMwNVd8U0hXLU0zODBLfFNIVy1NMzgwU3xTSFctTTM4MFd8XHJcbiAgICAgICAgU0hXLU00MzBXfFNIVy1NNDgwS3xTSFctTTQ4MFN8U0hXLU00ODBXfFNIVy1NNDg1V3xTSFctTTQ4Nld8U0hXLU01MDBXfEdULUk5MjI4fFNDSC1QNzM5fFNDSC1JOTI1fFxyXG4gICAgICAgIEdULUk5MjAwfEdULVA1MjAwfEdULVA1MjEwfEdULVA1MjEwWHxTTS1UMzg1TXxTTS1QNTg1TXxTTS1UMzExfFNNLVQzMTB8U00tVDMxMFh8U00tVDIxMHxTTS1UMjEwUnxTTS1UMjExfFNNLVA2MDB8XHJcbiAgICAgICAgU00tUDYwMXxTTS1QNjA1fFNNLVA2MTV8U00tUDkwMHxTTS1QOTAxfFNNLVQyMTd8U00tVDIxN0F8U00tVDIxN1N8U00tUDYwMDB8U00tVDMxMDB8U0dILUk0Njd8WEU1MDB8U00tVDExMHxcclxuICAgICAgICBHVC1QNTIyMHxHVC1JOTIwMFh8R1QtTjUxMTBYfEdULU41MTIwfFNNLVA5MDV8U00tVDExMXxTTS1UMjEwNXxTTS1UMzE1fFNNLVQzMjB8U00tVDMyMFh8U00tVDMyMXxcclxuICAgICAgICBTTS1UNTEwfFNNLVQ1MjB8U00tVDUyNXxTTS1UNTMwTlV8U00tVDIzME5VfFNNLVQzMzBOVXxTTS1UOTAwfFhFNTAwVDFDfFNNLVA2MDVWfFNNLVA5MDVWfFNNLVQzMzdWfFNNLVQ1MzdWfFxyXG4gICAgICAgIFNNLVQ3MDdWfFNNLVQ4MDdWfFNNLVA2MDBYfFNNLVA5MDBYfFNNLVQyMTBYfFNNLVQyMzB8U00tVDIzMFh8U00tVDMyNXxHVC1QNzUwM3xTTS1UNTMxfFNNLVQ1MDB8U00tVDMzMHxcclxuICAgICAgICBTTS1UNTMwfFNNLVQ3MDV8U00tVDcwNUN8U00tVDUzNXxTTS1UMzMxfFNNLVQ4MDB8U00tVDcwMHxTTS1UNTM3fFNNLVQ4MDd8U00tUDkwN0F8U00tVDMzN0F8U00tVDUzN0F8XHJcbiAgICAgICAgU00tVDcwN0F8U00tVDgwN0F8U00tVDIzN3xTTS1UODA3UHxTTS1QNjA3VHxTTS1UMjE3VHxTTS1UMzM3VHxTTS1UODA3VHxTTS1UMTE2TlF8U00tVDExNkJVfFNNLVA1NTB8XHJcbiAgICAgICAgU00tVDM1MHxTTS1UNTUwfFNNLVQ5MDAwfFNNLVA5MDAwfFNNLVQ3MDVZfFNNLVQ4MDV8R1QtUDMxMTN8U00tVDcxMHxTTS1UODEwfFNNLVQ4MTV8U00tVDM2MHxTTS1UNTMzfFxyXG4gICAgICAgIFNNLVQxMTN8U00tVDMzNXxTTS1UNzE1fFNNLVQ1NjB8U00tVDY3MHxTTS1UNjc3fFNNLVQzNzd8U00tVDU2N3xTTS1UMzU3VHxTTS1UNTU1fFNNLVQ1NjF8U00tVDcxM3xcclxuICAgICAgICBTTS1UNzE5fFNNLVQ3MjV8U00tVDgxM3xTTS1UODE5fFNNLVQ1ODB8U00tVDU5MHxTTS1UMzU1WT98U00tVDI4MHxTTS1UODE3QXxTTS1UODIwfFNNLVc3MDB8U00tUDU4MHxTTS1UNTg3fFNNLVAzNTB8XHJcbiAgICAgICAgU00tUDU1NU18U00tUDM1NU18U00tVDExM05VfFNNLVQ4MTVZfFNNLVQ1ODV8U00tVDI4NXxTTS1UODI1fFNNLVc3MDh8U00tVDgzNXxTTS1QNTg1WXxTTS1YMjAwfFNNLVQ5NzBgKSxcclxuICBLaW5kbGU6IG5ldyBSZWdFeHAoYEtpbmRsZXxTaWxrLipBY2NlbGVyYXRlZHxBbmRyb2lkLipcXFxcYihLRk9UfEtGVFR8S0ZKV0l8S0ZKV0F8S0ZPVEV8S0ZTT1dJfEtGVEhXSXxLRlRIV0F8S0ZBUFdJfFxyXG4gICAgICAgIEtGQVBXQXxXRkpXQUV8S0ZTQVdBfEtGU0FXSXxLRkFTV0l8S0ZBUldJfEtGRk9XSXxLRkdJV0l8S0ZNRVdJKVxcXFxifEFuZHJvaWQuKlNpbGtcXC9bMC05Ll0rIGxpa2UgQ2hyb21lXFxcclxuICAgICAgICAvWzAtOS5dKyAoPyFNb2JpbGUpYCksXHJcbiAgU3VyZmFjZVRhYmxldDogL1dpbmRvd3MgTlQgWzAtOS5dKzsgQVJNOy4qKFRhYmxldHxBUk1CSlMpLyxcclxuICBIUFRhYmxldDogL0hQIFNsYXRlICg3fDh8MTApfEhQIEVsaXRlUGFkIDkwMHxocC10YWJsZXR8RWxpdGVCb29rLipUb3VjaHxIUCA4fFNsYXRlIDIxfEhQIFNsYXRlQm9vayAxMC8sXHJcbiAgQXN1c1RhYmxldDogbmV3IFJlZ0V4cChgXi4qUGFkRm9uZSgoPyFNb2JpbGUpLikqJHxUcmFuc2Zvcm1lcnxURjEwMXxURjEwMUd8VEYzMDBUfFRGMzAwVEd8VEYzMDBUTHxURjcwMFR8VEY3MDBLTHxcclxuICAgICAgICBURjcwMVR8VEY4MTBDfE1FMTcxfE1FMzAxVHxNRTMwMkN8TUUzNzFNR3xNRTM3MFR8TUUzNzJNR3xNRTE3MlZ8TUUxNzNYfE1FNDAwQ3xcclxuICAgICAgICBTbGlkZXIgU0wxMDF8XFxcXGJLMDBGXFxcXGJ8XFxcXGJLMDBDXFxcXGJ8XFxcXGJLMDBFXFxcXGJ8XFxcXGJLMDBMXFxcXGJ8VFgyMDFMQXxNRTE3NkN8TUUxMDJBfFxcXFxiTTgwVEFcXFxcYnxNRTM3MkNMfFxyXG4gICAgICAgIE1FNTYwQ0d8TUUzNzJDR3xNRTMwMktMfCBLMDEwIHwgSzAxMSB8IEswMTcgfCBLMDFFIHxNRTU3MkN8TUUxMDNLfE1FMTcwQ3xNRTE3MUN8XFxcXGJNRTcwQ1xcXFxifE1FNTgxQ3xcclxuICAgICAgICBNRTU4MUNMfE1FODUxMEN8TUUxODFDfFAwMVl8UE8xTUF8UDAxWnxcXFxcYlAwMjdcXFxcYnxcXFxcYlAwMjRcXFxcYnxcXFxcYlAwMENcXFxcYmApLFxyXG4gIEJsYWNrQmVycnlUYWJsZXQ6IC9QbGF5Qm9va3xSSU0gVGFibGV0LyxcclxuICBIVEN0YWJsZXQ6IC9IVENfRmx5ZXJfUDUxMnxIVEMgRmx5ZXJ8SFRDIEpldHN0cmVhbXxIVEMtUDcxNWF8SFRDIEVWTyBWaWV3IDRHfFBHNDEyMDB8UEcwOTQxMC8sXHJcbiAgTW90b3JvbGFUYWJsZXQ6IC94b29tfHNob2xlc3R8TVo2MTV8TVo2MDV8TVo1MDV8TVo2MDF8TVo2MDJ8TVo2MDN8TVo2MDR8TVo2MDZ8TVo2MDd8TVo2MDh8TVo2MDl8TVo2MTV8TVo2MTZ8TVo2MTcvLFxyXG4gIE5vb2tUYWJsZXQ6IC9BbmRyb2lkLipOb29rfE5vb2tDb2xvcnxub29rIGJyb3dzZXJ8Qk5SVjIwMHxCTlJWMjAwQXxCTlRWMjUwfEJOVFYyNTBBfEJOVFY0MDB8Qk5UVjYwMHxMb2dpY1BEIFpvb20yLyxcclxuICBBY2VyVGFibGV0OiBuZXcgUmVnRXhwKGBBbmRyb2lkLio7IFxcXFxiKEExMDB8QTEwMXxBMTEwfEEyMDB8QTIxMHxBMjExfEE1MDB8QTUwMXxBNTEwfEE1MTF8QTcwMHxBNzAxfFc1MDB8VzUwMFB8VzUwMXxcclxuICAgICAgICBXNTAxUHxXNTEwfFc1MTF8VzcwMHxHMTAwfEcxMDBXfEIxLUE3MXxCMS03MTB8QjEtNzExfEExLTgxMHxBMS04MTF8QTEtODMwKVxcXFxifFczLTgxMHxcXFxcYkEzLUExMFxcXFxifFxcXFxiQTMtQTExXFxcXGJ8XHJcbiAgICAgICAgXFxcXGJBMy1BMjBcXFxcYnxcXFxcYkEzLUEzMGApLFxyXG4gIFRvc2hpYmFUYWJsZXQ6XHJcbiAgICAvQW5kcm9pZC4qKEFUMTAwfEFUMTA1fEFUMjAwfEFUMjA1fEFUMjcwfEFUMjc1fEFUMzAwfEFUMzA1fEFUMVM1fEFUNTAwfEFUNTcwfEFUNzAwfEFUODMwKXxUT1NISUJBLipGT0xJTy8sXHJcbiAgTEdUYWJsZXQ6IC9cXGJMLTA2Q3xMRy1WOTA5fExHLVY5MDB8TEctVjcwMHxMRy1WNTEwfExHLVY1MDB8TEctVjQxMHxMRy1WNDAwfExHLVZLODEwXFxiLyxcclxuICBGdWppdHN1VGFibGV0OiAvQW5kcm9pZC4qXFxiKEYtMDFEfEYtMDJGfEYtMDVFfEYtMTBEfE01MzJ8UTU3MilcXGIvLFxyXG4gIFByZXN0aWdpb1RhYmxldDogbmV3IFJlZ0V4cChgUE1QMzE3MEJ8UE1QMzI3MEJ8UE1QMzQ3MEJ8UE1QNzE3MEJ8UE1QMzM3MEJ8UE1QMzU3MEN8UE1QNTg3MEN8UE1QMzY3MEJ8UE1QNTU3MEN8XHJcbiAgICAgICAgUE1QNTc3MER8UE1QMzk3MEJ8UE1QMzg3MEN8UE1QNTU4MEN8UE1QNTg4MER8UE1QNTc4MER8UE1QNTU4OEN8UE1QNzI4MEN8UE1QNzI4MEMzR3xQTVA3MjgwfFBNUDc4ODBEfFxyXG4gICAgICAgIFBNUDU1OTdEfFBNUDU1OTd8UE1QNzEwMER8UEVSMzQ2NHxQRVIzMjc0fFBFUjM1NzR8UEVSMzg4NHxQRVI1Mjc0fFBFUjU0NzR8UE1QNTA5N0NQUk98UE1QNTA5N3xQTVA3MzgwRHxcclxuICAgICAgICBQTVA1Mjk3Q3xQTVA1Mjk3Q19RVUFEfFBNUDgxMkV8UE1QODEyRTNHfFBNUDgxMkZ8UE1QODEwRXxQTVA4ODBURHxQTVQzMDE3fFBNVDMwMzd8UE1UMzA0N3xQTVQzMDU3fFBNVDcwMDh8XHJcbiAgICAgICAgUE1UNTg4N3xQTVQ1MDAxfFBNVDUwMDJgKSxcclxuICBMZW5vdm9UYWJsZXQ6IG5ldyBSZWdFeHAoYExlbm92byBUQUJ8SWRlYShUYWJ8UGFkKSggQTF8QTEwfCBLMXwpfFRoaW5rUGFkKFsgXSspP1RhYmxldHxZVDMtODUwTXxZVDMtWDkwTHxZVDMtWDkwRnxcclxuICAgICAgICBZVDMtWDkwWHxMZW5vdm8uKihTMjEwOXxTMjExMHxTNTAwMHxTNjAwMHxLMzAxMXxBMzAwMHxBMzUwMHxBMTAwMHxBMjEwN3xBMjEwOXxBMTEwN3xBNTUwMHxBNzYwMHxCNjAwMHxcclxuICAgICAgICBCODAwMHxCODA4MCkoLXwpKEZMfEZ8SFZ8SHwpfFRCLVg2MDZGfFRCLVgxMDNGfFRCLVgzMDRGfFRCLVgzMDRMfFRCLVg3MDRGfFRCLTg3MDNGfFRhYjJBNy0xMEZ8VEIyLVgzMEx8VEItODUwNEZgKSxcclxuICBEZWxsVGFibGV0OiAvVmVudWUgMTF8VmVudWUgOHxWZW51ZSA3fERlbGwgU3RyZWFrIDEwfERlbGwgU3RyZWFrIDcvLFxyXG4gIFlhcnZpa1RhYmxldDogbmV3IFJlZ0V4cChgQW5kcm9pZC4qXFxcXGIoVEFCMjEwfFRBQjIxMXxUQUIyMjR8VEFCMjUwfFRBQjI2MHxUQUIyNjR8VEFCMzEwfFRBQjM2MHxUQUIzNjR8VEFCNDEwfFRBQjQxMXxcclxuICAgICAgICBUQUI0MjB8VEFCNDI0fFRBQjQ1MHxUQUI0NjB8VEFCNDYxfFRBQjQ2NHxUQUI0NjV8VEFCNDY3fFRBQjQ2OHxUQUIwNy0xMDB8VEFCMDctMTAxfFRBQjA3LTE1MHxUQUIwNy0xNTF8XHJcbiAgICAgICAgVEFCMDctMTUyfFRBQjA3LTIwMHxUQUIwNy0yMDEtM0d8VEFCMDctMjEwfFRBQjA3LTIxMXxUQUIwNy0yMTJ8VEFCMDctMjE0fFRBQjA3LTIyMHxUQUIwNy00MDB8VEFCMDctNDg1fFxyXG4gICAgICAgIFRBQjA4LTE1MHxUQUIwOC0yMDB8VEFCMDgtMjAxLTNHfFRBQjA4LTIwMS0zMHxUQUIwOS0xMDB8VEFCMDktMjExfFRBQjA5LTQxMHxUQUIxMC0xNTB8VEFCMTAtMjAxfFRBQjEwLTIxMXxcclxuICAgICAgICBUQUIxMC00MDB8VEFCMTAtNDEwfFRBQjEzLTIwMXxUQUIyNzRFVUt8VEFCMjc1RVVLfFRBQjM3NEVVS3xUQUI0NjJFVUt8VEFCNDc0RVVLfFRBQjktMjAwKVxcXFxiYCksXHJcbiAgTWVkaW9uVGFibGV0OiAvQW5kcm9pZC4qXFxiT1lPXFxifExJRkUuKihQOTIxMnxQOTUxNHxQOTUxNnxTOTUxMil8TElGRVRBQi8sXHJcbiAgQXJub3ZhVGFibGV0OlxyXG4gICAgLzk3RzR8QU4xMEcyfEFON2JHM3xBTjdmRzN8QU44RzN8QU44Y0czfEFON0czfEFOOUczfEFON2RHM3xBTjdkRzNTVHxBTjdkRzNDaGlsZFBhZHxBTjEwYkczfEFOMTBiRzNEVHxBTjlHMi8sXHJcbiAgSW50ZW5zb1RhYmxldDogL0lOTTgwMDJLUHxJTk0xMDEwRlB8SU5NODA1TkR8SW50ZW5zbyBUYWJ8VEFCMTAwNC8sXHJcbiAgSVJVVGFibGV0OiAvTTcwMnByby8sXHJcbiAgTWVnYWZvblRhYmxldDogL01lZ2FGb24gVjl8XFxiWlRFIFY5XFxifEFuZHJvaWQuKlxcYk1UN0FcXGIvLFxyXG4gIEVib2RhVGFibGV0OiAvRS1Cb2RhIChTdXByZW1lfEltcHJlc3NwZWVkfEl6enljb21tfEVzc2VudGlhbCkvLFxyXG4gIEFsbFZpZXdUYWJsZXQ6IC9BbGx2aWV3LiooVml2YXxBbGxkcm98Q2l0eXxTcGVlZHxBbGwgVFZ8RnJlbnp5fFF1YXNhcnxTaGluZXxUWDF8QVgxfEFYMikvLFxyXG4gIEFyY2hvc1RhYmxldDpcclxuICAgIG5ldyBSZWdFeHAoYFxcXFxiKDEwMUc5fDgwRzl8QTEwMUlUKVxcXFxifFFpbGl2ZSA5N1J8QXJjaG9zNXxcXFxcYkFSQ0hPUyAoNzB8Nzl8ODB8OTB8OTd8MTAxfEZBTUlMWVBBRHwpKGJ8Y3wpKEcxMHxcclxuICAgICAgICAgQ29iYWx0fCBUSVRBTklVTShIRHwpfCBYZW5vbnwgTmVvbnxYU0t8IDJ8IFhTIDJ8IFBMQVRJTlVNfCBDQVJCT058R0FNRVBBRClcXFxcYmApLFxyXG4gIEFpbm9sVGFibGV0OiAvTk9WTzd8Tk9WTzh8Tk9WTzEwfE5vdm83QXVyb3JhfE5vdm83QmFzaWN8Tk9WTzdQQUxBRElOfG5vdm85LVNwYXJrLyxcclxuICBOb2tpYUx1bWlhVGFibGV0OiAvTHVtaWEgMjUyMC8sXHJcbiAgU29ueVRhYmxldDogbmV3IFJlZ0V4cChgU29ueS4qVGFibGV0fFhwZXJpYSBUYWJsZXR8U29ueSBUYWJsZXQgU3xTTy0wM0V8U0dQVDEyfFNHUFQxM3xTR1BUMTE0fFNHUFQxMjF8U0dQVDEyMnxTR1BUMTIzfFxyXG4gICAgICAgIFNHUFQxMTF8U0dQVDExMnxTR1BUMTEzfFNHUFQxMzF8U0dQVDEzMnxTR1BUMTMzfFNHUFQyMTF8U0dQVDIxMnxTR1BUMjEzfFNHUDMxMXxTR1AzMTJ8U0dQMzIxfEVCUkQxMTAxfFxyXG4gICAgICAgIEVCUkQxMTAyfEVCUkQxMjAxfFNHUDM1MXxTR1AzNDF8U0dQNTExfFNHUDUxMnxTR1A1MjF8U0dQNTQxfFNHUDU1MXxTR1A2MjF8U0dQNjQxfFNHUDYxMnxTT1QzMXxTR1A3NzF8U0dQNjExfFxyXG4gICAgICAgIFNHUDYxMnxTR1A3MTJgKSxcclxuICBQaGlsaXBzVGFibGV0OiAvXFxiKFBJMjAxMHxQSTMwMDB8UEkzMTAwfFBJMzEwNXxQSTMxMTB8UEkzMjA1fFBJMzIxMHxQSTM5MDB8UEk0MDEwfFBJNzAwMHxQSTcxMDApXFxiLyxcclxuICBDdWJlVGFibGV0OiAvQW5kcm9pZC4qKEs4R1R8VTlHVHxVMTBHVHxVMTZHVHxVMTdHVHxVMThHVHxVMTlHVHxVMjBHVHxVMjNHVHxVMzBHVCl8Q1VCRSBVOEdULyxcclxuICBDb2J5VGFibGV0OlxyXG4gICAgbmV3IFJlZ0V4cChgTUlEMTA0MnxNSUQxMDQ1fE1JRDExMjV8TUlEMTEyNnxNSUQ3MDEyfE1JRDcwMTR8TUlENzAxNXxNSUQ3MDM0fE1JRDcwMzV8TUlENzAzNnxNSUQ3MDQyfE1JRDcwNDh8XHJcbiAgICAgICAgTUlENzEyN3xNSUQ4MDQyfE1JRDgwNDh8TUlEODEyN3xNSUQ5MDQyfE1JRDk3NDB8TUlEOTc0MnxNSUQ3MDIyfE1JRDcwMTBgKSxcclxuICBNSURUYWJsZXQ6IG5ldyBSZWdFeHAoYE05NzAxfE05MDAwfE05MTAwfE04MDZ8TTEwNTJ8TTgwNnxUNzAzfE1JRDcwMXxNSUQ3MTN8TUlENzEwfE1JRDcyN3xNSUQ3NjB8TUlEODMwfE1JRDcyOHxNSUQ5MzN8XHJcbiAgICAgICAgTUlEMTI1fE1JRDgxMHxNSUQ3MzJ8TUlEMTIwfE1JRDkzMHxNSUQ4MDB8TUlENzMxfE1JRDkwMHxNSUQxMDB8TUlEODIwfE1JRDczNXxNSUQ5ODB8TUlEMTMwfE1JRDgzM3xNSUQ3Mzd8XHJcbiAgICAgICAgTUlEOTYwfE1JRDEzNXxNSUQ4NjB8TUlENzM2fE1JRDE0MHxNSUQ5MzB8TUlEODM1fE1JRDczM3xNSUQ0WDEwYCksXHJcbiAgTVNJVGFibGV0OiBuZXcgUmVnRXhwKGBNU0kgXFxcXGIoUHJpbW8gNzNLfFByaW1vIDczTHxQcmltbyA4MUx8UHJpbW8gNzd8UHJpbW8gOTN8UHJpbW8gNzV8UHJpbW8gNzZ8UHJpbW8gNzN8UHJpbW8gODF8XHJcbiAgICAgICAgUHJpbW8gOTF8UHJpbW8gOTB8RW5qb3kgNzF8RW5qb3kgN3xFbmpveSAxMClcXFxcYmApLFxyXG4gIFNNaVRUYWJsZXQ6IC9BbmRyb2lkLiooXFxiTUlEXFxifE1JRC01NjB8TVRWLVQxMjAwfE1UVi1QTkQ1MzF8TVRWLVAxMTAxfE1UVi1QTkQ1MzApLyxcclxuICBSb2NrQ2hpcFRhYmxldDogL0FuZHJvaWQuKihSSzI4MTh8UksyODA4QXxSSzI5MTh8UkszMDY2KXxSSzI3Mzh8UksyODA4QS8sXHJcbiAgRmx5VGFibGV0OiAvSVEzMTB8Rmx5IFZpc2lvbi8sXHJcbiAgYnFUYWJsZXQ6IG5ldyBSZWdFeHAoYEFuZHJvaWQuKihicSk/LiooRWxjYW5vfEN1cmllfEVkaXNvbnxNYXh3ZWxsfEtlcGxlcnxQYXNjYWx8VGVzbGF8SHlwYXRpYXxQbGF0b258TmV3dG9ufFxyXG4gICAgICAgIExpdmluZ3N0b25lfENlcnZhbnRlc3xBdmFudHxBcXVhcmlzIChbRXxNXTEwfE04KSl8TWF4d2VsbC4qTGl0ZXxNYXh3ZWxsLipQbHVzYCksXHJcbiAgSHVhd2VpVGFibGV0OlxyXG4gICAgbmV3IFJlZ0V4cChgTWVkaWFQYWR8TWVkaWFQYWQgNyBZb3V0aHxNZWRpYVBhZCBUMyAxMHxJREVPUyBTN3xTNy0yMDFjfFM3LTIwMnV8UzctMTAxfFM3LTEwM3xTNy0xMDR8UzctMTA1fFM3LTEwNnxcclxuICAgICAgICBTNy0yMDF8UzctU2xpbXxNMi1BMDFMfEJBSC1MMDl8QkFILVcwOXxBR1MtVzA5fEFHUy1MMDlgKSxcclxuICBOZWNUYWJsZXQ6IC9cXGJOLTA2RHxcXGJOLTA4RC8sXHJcbiAgUGFudGVjaFRhYmxldDogL1BhbnRlY2guKlA0MTAwLyxcclxuICBCcm9uY2hvVGFibGV0OiAvQnJvbmNoby4qKE43MDF8TjcwOHxOODAyfGE3MTApLyxcclxuICBWZXJzdXNUYWJsZXQ6IC9UT1VDSFBBRC4qWzc4OTEwXXxcXGJUT1VDSFRBQlxcYi8sXHJcbiAgWnluY1RhYmxldDogL3oxMDAwfFo5OSAyR3x6OTl8ejkzMHx6OTk5fHo5OTB8ejkwOXxaOTE5fHo5MDAvLFxyXG4gIFBvc2l0aXZvVGFibGV0OiAvVEIwN1NUQXxUQjEwU1RBfFRCMDdGVEF8VEIxMEZUQS8sXHJcbiAgTmFiaVRhYmxldDogL0FuZHJvaWQuKlxcYk5hYmkvLFxyXG4gIEtvYm9UYWJsZXQ6IC9Lb2JvIFRvdWNofFxcYkswODBcXGJ8XFxiVm94XFxiIEJ1aWxkfFxcYkFyY1xcYiBCdWlsZC8sXHJcbiAgRGFuZXdUYWJsZXQ6IC9EU2xpZGUuKlxcYig3MDB8NzAxUnw3MDJ8NzAzUnw3MDR8ODAyfDk3MHw5NzF8OTcyfDk3M3w5NzR8MTAxMHwxMDEyKVxcYi8sXHJcbiAgVGV4ZXRUYWJsZXQ6IG5ldyBSZWdFeHAoYE5hdmlQYWR8VEItNzcyQXxUTS03MDQ1fFRNLTcwNTV8VE0tOTc1MHxUTS03MDE2fFRNLTcwMjR8VE0tNzAyNnxUTS03MDQxfFRNLTcwNDN8VE0tNzA0N3xcclxuICAgICAgICBUTS04MDQxfFRNLTk3NDF8VE0tOTc0N3xUTS05NzQ4fFRNLTk3NTF8VE0tNzAyMnxUTS03MDIxfFRNLTcwMjB8VE0tNzAxMXxUTS03MDEwfFRNLTcwMjN8VE0tNzAyNXxcclxuICAgICAgICBUTS03MDM3V3xUTS03MDM4V3xUTS03MDI3V3xUTS05NzIwfFRNLTk3MjV8VE0tOTczN1d8VE0tMTAyMHxUTS05NzM4V3xUTS05NzQwfFRNLTk3NDNXfFRCLTgwN0F8VEItNzcxQXxcclxuICAgICAgICBUQi03MjdBfFRCLTcyNUF8VEItNzE5QXxUQi04MjNBfFRCLTgwNUF8VEItNzIzQXxUQi03MTVBfFRCLTcwN0F8VEItNzA1QXxUQi03MDlBfFRCLTcxMUF8VEItODkwSER8XHJcbiAgICAgICAgVEItODgwSER8VEItNzkwSER8VEItNzgwSER8VEItNzcwSER8VEItNzIxSER8VEItNzEwSER8VEItNDM0SER8VEItODYwSER8VEItODQwSER8VEItNzYwSER8VEItNzUwSER8XHJcbiAgICAgICAgVEItNzQwSER8VEItNzMwSER8VEItNzIySER8VEItNzIwSER8VEItNzAwSER8VEItNTAwSER8VEItNDcwSER8VEItNDMxSER8VEItNDMwSER8VEItNTA2fFRCLTUwNHxUQi00NDZ8XHJcbiAgICAgICAgVEItNDM2fFRCLTQxNnxUQi0xNDZTRXxUQi0xMjZTRWApLFxyXG4gIFBsYXlzdGF0aW9uVGFibGV0OiAvUGxheXN0YXRpb24uKihQb3J0YWJsZXxWaXRhKS8sXHJcbiAgVHJla3N0b3JUYWJsZXQ6XHJcbiAgICAvU1QxMDQxNi0xfFZUMTA0MTYtMXxTVDcwNDA4LTF8U1Q3MDJ4eC0xfFNUNzAyeHgtMnxTVDgwMjA4fFNUOTcyMTZ8U1Q3MDEwNC0yfFZUMTA0MTYtMnxTVDEwMjE2LTJBfFN1cmZUYWIvLFxyXG4gIFB5bGVBdWRpb1RhYmxldDpcclxuICAgIC9cXGIoUFRCTDEwQ0VVfFBUQkwxMEN8UFRCTDcyQkN8UFRCTDcyQkNFVXxQVEJMN0NFVXxQVEJMN0N8UFRCTDkyQkN8UFRCTDkyQkNFVXxQVEJMOUNFVXxQVEJMOUNVS3xQVEJMOUMpXFxiLyxcclxuICBBZHZhblRhYmxldDogbmV3IFJlZ0V4cChgQW5kcm9pZC4qIFxcXFxiKEUzQXxUM1h8VDVDfFQ1QnxUM0V8VDNDfFQzQnxUMUp8VDFGfFQyQXxUMUh8VDFpfEUxQ3xUMS1FfFQ1LUF8VDR8RTEtQnxUMkNpfFxyXG4gICAgICAgIFQxLUJ8VDEtRHxPMS1BfEUxLUF8VDEtQXxUM0F8VDRpKVxcXFxiYCksXHJcbiAgRGFueVRlY2hUYWJsZXQ6IGBHZW5pdXMgVGFiIEczfEdlbml1cyBUYWIgUzJ8R2VuaXVzIFRhYiBRM3xHZW5pdXMgVGFiIEc0fEdlbml1cyBUYWIgUTR8R2VuaXVzIFRhYiBHLUlJfFxyXG4gICAgICAgIEdlbml1cyBUQUIgR0lJfEdlbml1cyBUQUIgR0lJSXxHZW5pdXMgVGFiIFMxYCxcclxuICBHYWxhcGFkVGFibGV0OiAvQW5kcm9pZC4qXFxiRzFcXGIoPyFcXCkpLyxcclxuICBNaWNyb21heFRhYmxldDogL0Z1bmJvb2t8TWljcm9tYXguKlxcYihQMjUwfFA1NjB8UDM2MHxQMzYyfFA2MDB8UDMwMHxQMzUwfFA1MDB8UDI3NSlcXGIvLFxyXG4gIEthcmJvbm5UYWJsZXQ6IC9BbmRyb2lkLipcXGIoQTM5fEEzN3xBMzR8U1Q4fFNUMTB8U1Q3fFNtYXJ0IFRhYjN8U21hcnQgVGFiMilcXGIvLFxyXG4gIEFsbEZpbmVUYWJsZXQ6IC9GaW5lNyBHZW5pdXN8RmluZTcgU2hpbmV8RmluZTcgQWlyfEZpbmU4IFN0eWxlfEZpbmU5IE1vcmV8RmluZTEwIEpveXxGaW5lMTEgV2lkZS8sXHJcbiAgUFJPU0NBTlRhYmxldDogbmV3IFJlZ0V4cChgXFxcXGIoUEVNNjN8UExUMTAyM0d8UExUMTA0MXxQTFQxMDQ0fFBMVDEwNDRHfFBMVDEwOTF8UExUNDMxMXxQTFQ0MzExUEx8UExUNDMxNXxQTFQ3MDMwfFxyXG4gICAgICAgIFBMVDcwMzN8UExUNzAzM0R8UExUNzAzNXxQTFQ3MDM1RHxQTFQ3MDQ0S3xQTFQ3MDQ1S3xQTFQ3MDQ1S0J8UExUNzA3MUtHfFBMVDcwNzJ8UExUNzIyM0d8UExUNzIyNUd8XHJcbiAgICAgICAgUExUNzc3N0d8UExUNzgxMEt8UExUNzg0OUd8UExUNzg1MUd8UExUNzg1Mkd8UExUODAxNXxQTFQ4MDMxfFBMVDgwMzR8UExUODAzNnxQTFQ4MDgwS3xQTFQ4MDgyfFBMVDgwODh8XHJcbiAgICAgICAgUExUODIyM0d8UExUODIzNEd8UExUODIzNUd8UExUODgxNkt8UExUOTAxMXxQTFQ5MDQ1S3xQTFQ5MjMzR3xQTFQ5NzM1fFBMVDk3NjBHfFBMVDk3NzBHKVxcXFxiYCksXHJcbiAgWU9ORVNUYWJsZXQ6IC9CUTEwNzh8QkMxMDAzfEJDMTA3N3xSSzk3MDJ8QkM5NzMwfEJDOTAwMXxJVDkwMDF8QkM3MDA4fEJDNzAxMHxCQzcwOHxCQzcyOHxCQzcwMTJ8QkM3MDMwfEJDNzAyN3xCQzcwMjYvLFxyXG4gIENoYW5nSmlhVGFibGV0OiBuZXcgUmVnRXhwKGBUUEM3MTAyfFRQQzcxMDN8VFBDNzEwNXxUUEM3MTA2fFRQQzcxMDd8VFBDNzIwMXxUUEM3MjAzfFRQQzcyMDV8VFBDNzIxMHxUUEM3NzA4fFRQQzc3MDl8XHJcbiAgICAgICAgVFBDNzcxMnxUUEM3MTEwfFRQQzgxMDF8VFBDODEwM3xUUEM4MTA1fFRQQzgxMDZ8VFBDODIwM3xUUEM4MjA1fFRQQzg1MDN8VFBDOTEwNnxUUEM5NzAxfFRQQzk3MTAxfFRQQzk3MTAzfFxyXG4gICAgICAgIFRQQzk3MTA1fFRQQzk3MTA2fFRQQzk3MTExfFRQQzk3MTEzfFRQQzk3MjAzfFRQQzk3NjAzfFRQQzk3ODA5fFRQQzk3MjA1fFRQQzEwMTAxfFRQQzEwMTAzfFRQQzEwMTA2fFxyXG4gICAgICAgIFRQQzEwMTExfFRQQzEwMjAzfFRQQzEwMjA1fFRQQzEwNTAzYCksXHJcbiAgR1VUYWJsZXQ6IC9UWC1BMTMwMXxUWC1NOTAwMnxRNzAyfGtmMDI2LyxcclxuICBQb2ludE9mVmlld1RhYmxldDogbmV3IFJlZ0V4cChgVEFCLVA1MDZ8VEFCLW5hdmktNy0zRy1NfFRBQi1QNTE3fFRBQi1QLTUyN3xUQUItUDcwMXxUQUItUDcwM3xUQUItUDcyMXxUQUItUDczMU58XHJcbiAgICAgICAgVEFCLVA3NDF8VEFCLVA4MjV8VEFCLVA5MDV8VEFCLVA5MjV8VEFCLVBSOTQ1fFRBQi1QTDEwMTV8VEFCLVAxMDI1fFRBQi1QSTEwNDV8VEFCLVAxMzI1fFRBQi1QUk9UQUJbMC05XSt8XHJcbiAgICAgICAgVEFCLVBST1RBQjI1fFRBQi1QUk9UQUIyNnxUQUItUFJPVEFCMjd8VEFCLVBST1RBQjI2WEx8VEFCLVBST1RBQjItSVBTOXxUQUItUFJPVEFCMzAtSVBTOXxUQUItUFJPVEFCMjVYWEx8XHJcbiAgICAgICAgVEFCLVBST1RBQjI2LUlQUzEwfFRBQi1QUk9UQUIzMC1JUFMxMGApLFxyXG4gIE92ZXJtYXhUYWJsZXQ6XHJcbiAgICBuZXcgUmVnRXhwKGBPVi0oU3RlZWxDb3JlfE5ld0Jhc2V8QmFzZWNvcmV8QmFzZW9uZXxFeGVsbGVufFF1YXR0b3J8RWR1VGFifFNvbHV0aW9ufEFDVElPTnxCYXNpY1RhYnxUZWRkeVRhYnxcclxuICAgICAgICBNYWdpY1RhYnxTdHJlYW18VEItMDh8VEItMDkpfFF1YWxjb3JlIDEwMjdgKSxcclxuICBIQ0xUYWJsZXQ6XHJcbiAgICAvSENMLipUYWJsZXR8Q29ubmVjdC0zRy0yLjB8Q29ubmVjdC0yRy0yLjB8TUUgVGFibGV0IFUxfE1FIFRhYmxldCBVMnxNRSBUYWJsZXQgRzF8TUUgVGFibGV0IFgxfE1FIFRhYmxldCBZMnxNRSBUYWJsZXQgU3luYy8sXHJcbiAgRFBTVGFibGV0OiAvRFBTIERyZWFtIDl8RFBTIER1YWwgNy8sXHJcbiAgVmlzdHVyZVRhYmxldDogL1Y5NyBIRHxpNzUgM0d8VmlzdHVyZSBWNCggSEQpP3xWaXN0dXJlIFY1KCBIRCk/fFZpc3R1cmUgVjEwLyxcclxuICBDcmVzdGFUYWJsZXQ6XHJcbiAgICAvQ1RQKC0pPzgxMHxDVFAoLSk/ODE4fENUUCgtKT84Mjh8Q1RQKC0pPzgzOHxDVFAoLSk/ODg4fENUUCgtKT85Nzh8Q1RQKC0pPzk4MHxDVFAoLSk/OTg3fENUUCgtKT85ODh8Q1RQKC0pPzk4OS8sXHJcbiAgTWVkaWF0ZWtUYWJsZXQ6IC9cXGJNVDgxMjV8TVQ4Mzg5fE1UODEzNXxNVDgzNzdcXGIvLFxyXG4gIENvbmNvcmRlVGFibGV0OiAvQ29uY29yZGUoWyBdKyk/VGFifENvbkNvcmRlIFJlYWRNYW4vLFxyXG4gIEdvQ2xldmVyVGFibGV0OlxyXG4gICAgbmV3IFJlZ0V4cChgR09DTEVWRVIgVEFCfEE3R09DTEVWRVJ8TTEwNDJ8TTc4NDF8TTc0MnxSMTA0MkJLfFIxMDQxfFRBQiBBOTc1fFRBQiBBNzg0MnxUQUIgQTc0MXxUQUIgQTc0MUx8VEFCIE03MjNHfFxyXG4gICAgICAgIFRBQiBNNzIxfFRBQiBBMTAyMXxUQUIgSTkyMXxUQUIgUjcyMXxUQUIgSTcyMHxUQUIgVDc2fFRBQiBSNzB8VEFCIFI3Ni4yfFRBQiBSMTA2fFRBQiBSODMuMnxUQUIgTTgxM0d8VEFCIEk3MjF8XHJcbiAgICAgICAgR0NUQTcyMnxUQUIgSTcwfFRBQiBJNzF8VEFCIFM3M3xUQUIgUjczfFRBQiBSNzR8VEFCIFI5M3xUQUIgUjc1fFRBQiBSNzYuMXxUQUIgQTczfFRBQiBBOTN8VEFCIEE5My4yfFRBQiBUNzJ8XHJcbiAgICAgICAgVEFCIFI4M3xUQUIgUjk3NHxUQUIgUjk3M3xUQUIgQTEwMXxUQUIgQTEwM3xUQUIgQTEwNHxUQUIgQTEwNC4yfFIxMDVCS3xNNzEzR3xBOTcyQkt8VEFCIEE5NzF8VEFCIFI5NzQuMnxcclxuICAgICAgICBUQUIgUjEwNHxUQUIgUjgzLjN8VEFCIEExMDQyYCksXHJcbiAgTW9kZWNvbVRhYmxldDogbmV3IFJlZ0V4cChgRnJlZVRBQiA5MDAwfEZyZWVUQUIgNy40fEZyZWVUQUIgNzAwNHxGcmVlVEFCIDc4MDB8RnJlZVRBQiAyMDk2fEZyZWVUQUIgNy41fEZyZWVUQUIgMTAxNHxcclxuICAgICAgICBGcmVlVEFCIDEwMDEgfEZyZWVUQUIgODAwMXxGcmVlVEFCIDk3MDZ8RnJlZVRBQiA5NzAyfEZyZWVUQUIgNzAwM3xGcmVlVEFCIDcwMDJ8RnJlZVRBQiAxMDAyfEZyZWVUQUIgNzgwMXxcclxuICAgICAgICBGcmVlVEFCIDEzMzF8RnJlZVRBQiAxMDA0fEZyZWVUQUIgODAwMnxGcmVlVEFCIDgwMTR8RnJlZVRBQiA5NzA0fEZyZWVUQUIgMTAwM2ApLFxyXG4gIFZvbmlub1RhYmxldDogbmV3IFJlZ0V4cChgXFxcXGIoQXJndXNbIF9dP1N8RGlhbW9uZFsgX10/NzlIRHxFbWVyYWxkWyBfXT83OEV8THVuYVsgX10/NzBDfE9ueXhbIF9dP1N8T255eFsgX10/WnxcclxuICAgICAgICBPcmluWyBfXT9IRHxPcmluWyBfXT9TfE90aXNbIF9dP1N8U3BlZWRTdGFyWyBfXT9TfE1hZ25ldFsgX10/TTl8UHJpbXVzWyBfXT85NFsgX10/M0d8UHJpbXVzWyBfXT85NEhEfFxyXG4gICAgICAgIFByaW11c1sgX10/UVN8QW5kcm9pZC4qXFxcXGJROFxcXFxifFNpcml1c1sgX10/RVZPWyBfXT9RU3xTaXJpdXNbIF9dP1FTfFNwaXJpdFsgX10/UylcXFxcYmApLFxyXG4gIEVDU1RhYmxldDogL1YwN09UMnxUTTEwNUF8UzEwT1QxfFRSMTBDUzEvLFxyXG4gIFN0b3JleFRhYmxldDogL2VaZWVbXyddPyhUYWJ8R28pWzAtOV0rfFRhYkxDN3xMb29uZXkgVHVuZXMgVGFiLyxcclxuICBWb2RhZm9uZVRhYmxldDogL1NtYXJ0VGFiKFsgXSspP1swLTldK3xTbWFydFRhYklJMTB8U21hcnRUYWJJSTd8VkYtMTQ5Ny8sXHJcbiAgRXNzZW50aWVsQlRhYmxldDogL1NtYXJ0WyAnXT9UQUJbIF0rP1swLTldK3xGYW1pbHlbICddP1RBQjIvLFxyXG4gIFJvc3NNb29yVGFibGV0OiAvUk0tNzkwfFJNLTk5N3xSTUQtODc4R3xSTUQtOTc0UnxSTVQtNzA1QXxSTVQtNzAxfFJNRS02MDF8Uk1ULTUwMXxSTVQtNzExLyxcclxuICBpTW9iaWxlVGFibGV0OiAvaS1tb2JpbGUgaS1ub3RlLyxcclxuICBUb2xpbm9UYWJsZXQ6IC90b2xpbm8gdGFiIFswLTkuXSt8dG9saW5vIHNoaW5lLyxcclxuICBBdWRpb1NvbmljVGFibGV0OiAvXFxiQy0yMlF8VDctUUN8VC0xN0J8VC0xN1BcXGIvLFxyXG4gIEFNUEVUYWJsZXQ6IC9BbmRyb2lkLiogQTc4IC8sXHJcbiAgU2trVGFibGV0OiAvQW5kcm9pZC4qIChTS1lQQUR8UEhPRU5JWHxDWUNMT1BTKS8sXHJcbiAgVGVjbm9UYWJsZXQ6IC9URUNOTyBQOXxURUNOTyBEUDhELyxcclxuICBKWERUYWJsZXQ6XHJcbiAgICBuZXcgUmVnRXhwKGBBbmRyb2lkLiogXFxcXGIoRjMwMDB8QTMzMDB8SlhENTAwMHxKWEQzMDAwfEpYRDIwMDB8SlhEMzAwQnxKWEQzMDB8UzU4MDB8Uzc4MDB8UzYwMmJ8UzUxMTBifFM3MzAwfFxyXG4gICAgICAgIFM1MzAwfFM2MDJ8UzYwM3xTNTEwMHxTNTExMHxTNjAxfFM3MTAwYXxQMzAwMEZ8UDMwMDBzfFAxMDF8UDIwMHN8UDEwMDBtfFAyMDBtfFA5MTAwfFAxMDAwc3xTNjYwMGJ8UzkwOHxcclxuICAgICAgICBQMTAwMHxQMzAwfFMxOHxTNjYwMHxTOTEwMClcXFxcYmApLFxyXG4gIGlKb3lUYWJsZXQ6IG5ldyBSZWdFeHAoYFRhYmxldCAoU3Bpcml0IDd8RXNzZW50aWF8R2FsYXRlYXxGdXNpb258T25peCA3fExhbmRhfFRpdGFufFNjb29ieXxEZW94fFN0ZWxsYXxUaGVtaXN8QXJnb258XHJcbiAgICAgICAgVW5pcXVlIDd8U3lnbnVzfEhleGVufEZpbml0eSA3fENyZWFtfENyZWFtIFgyfEphZGV8TmVvbiA3fE5lcm9uIDd8S2FuZHl8U2NhcGV8U2FwaHlyIDd8UmViZWx8QmlveHxSZWJlbHxcclxuICAgICAgICBSZWJlbCA4R0J8TXlzdHxEcmFjbyA3fE15c3R8VGFiNy0wMDR8TXlzdHxUYWRlbyBKb25lc3xUYWJsZXQgQm9pbmd8QXJyb3d8RHJhY28gRHVhbCBDYW18QXVyaXh8TWludHxBbWl0eXxcclxuICAgICAgICBSZXZvbHV0aW9ufEZpbml0eSA5fE5lb24gOXxUOXd8QW1pdHkgNEdCIER1YWwgQ2FtfFN0b25lIDRHQnxTdG9uZSA4R0J8QW5kcm9tZWRhfFNpbGtlbnxYMnxBbmRyb21lZGEgSUl8XHJcbiAgICAgICAgSGFsbGV5fEZsYW1lfFNhcGh5ciA5LDd8VG91Y2ggOHxQbGFuZXR8VHJpdG9ufFVuaXF1ZSAxMHxIZXhlbiAxMHxNZW1waGlzIDRHQnxNZW1waGlzIDhHQnxPbml4IDEwKWApLFxyXG4gIEZYMlRhYmxldDogL0ZYMiBQQUQ3fEZYMiBQQUQxMC8sXHJcbiAgWG9yb1RhYmxldDogbmV3IFJlZ0V4cChgS2lkc1BBRCA3MDF8UEFEWyBdPzcxMnxQQURbIF0/NzE0fFBBRFsgXT83MTZ8UEFEWyBdPzcxN3xQQURbIF0/NzE4fFBBRFsgXT83MjB8UEFEWyBdPzcyMXxcclxuICAgICAgICBQQURbIF0/NzIyfFBBRFsgXT83OTB8UEFEWyBdPzc5MnxQQURbIF0/OTAwfFBBRFsgXT85NzE1RHxQQURbIF0/OTcxNkRSfFBBRFsgXT85NzE4RFJ8UEFEWyBdPzk3MTlRUnxcclxuICAgICAgICBQQURbIF0/OTcyMFFSfFRlbGVQQUQxMDMwfFRlbGVwYWQxMDMyfFRlbGVQQUQ3MzB8VGVsZVBBRDczMXxUZWxlUEFENzMyfFRlbGVQQUQ3MzVRfFRlbGVQQUQ4MzB8VGVsZVBBRDk3MzB8XHJcbiAgICAgICAgVGVsZVBBRDc5NXxNZWdhUEFEIDEzMzF8TWVnYVBBRCAxODUxfE1lZ2FQQUQgMjE1MWApLFxyXG4gIFZpZXdzb25pY1RhYmxldDpcclxuICAgIC9WaWV3UGFkIDEwcGl8Vmlld1BhZCAxMGV8Vmlld1BhZCAxMHN8Vmlld1BhZCBFNzJ8Vmlld1BhZDd8Vmlld1BhZCBFMTAwfFZpZXdQYWQgN2V8Vmlld1NvbmljIFZCNzMzfFZCMTAwYS8sXHJcbiAgVmVyaXpvblRhYmxldDogL1FUQVFaM3xRVEFJUjd8UVRBUVRaM3xRVEFTVU4xfFFUQVNVTjJ8UVRBWElBMS8sXHJcbiAgT2R5c1RhYmxldDpcclxuICAgIC9MT09YfFhFTk8xMHxPRFlTWyAtXShTcGFjZXxFVk98WHByZXNzfE5PT04pfFxcYlhFTElPXFxifFhlbGlvMTBQcm98WEVMSU83UEhPTkVUQUJ8WEVMSU8xMEVYVFJFTUV8WEVMSU9QVDJ8TkVPX1FVQUQxMC8sXHJcbiAgQ2FwdGl2YVRhYmxldDogL0NBUFRJVkEgUEFELyxcclxuICBJY29uYml0VGFibGV0OiBuZXcgUmVnRXhwKGBOZXRUQUJ8TlQtMzcwMnxOVC0zNzAyU3xOVC0zNzAyU3xOVC0zNjAzUHxOVC0zNjAzUHxOVC0wNzA0U3xOVC0wNzA0U3xOVC0zODA1Q3xOVC0zODA1Q3xcclxuICAgICAgICBOVC0wODA2Q3xOVC0wODA2Q3xOVC0wOTA5VHxOVC0wOTA5VHxOVC0wOTA3U3xOVC0wOTA3U3xOVC0wOTAyU3xOVC0wOTAyU2ApLFxyXG4gIFRlY2xhc3RUYWJsZXQ6IG5ldyBSZWdFeHAoYFQ5OCA0R3xcXFxcYlA4MFxcXFxifFxcXFxiWDkwSERcXFxcYnxYOTggQWlyfFg5OCBBaXIgM0d8XFxcXGJYODlcXFxcYnxQODAgM0d8XFxcXGJYODBoXFxcXGJ8UDk4IEFpcnxcclxuICAgICAgICBcXFxcYlg4OUhEXFxcXGJ8UDk4IDNHfFxcXFxiUDkwSERcXFxcYnxQODkgM0d8WDk4IDNHfFxcXFxiUDcwaFxcXFxifFA3OUhEIDNHfEcxOGQgM0d8XFxcXGJQNzlIRFxcXFxifFxcXFxiUDg5c1xcXFxifFxcXFxiQTg4XFxcXGJ8XHJcbiAgICAgICAgXFxcXGJQMTBIRFxcXFxifFxcXFxiUDE5SERcXFxcYnxHMTggM0d8XFxcXGJQNzhIRFxcXFxifFxcXFxiQTc4XFxcXGJ8XFxcXGJQNzVcXFxcYnxHMTdzIDNHfEcxN2ggM0d8XFxcXGJQODV0XFxcXGJ8XFxcXGJQOTBcXFxcYnxcclxuICAgICAgICBcXFxcYlAxMVxcXFxifFxcXFxiUDk4dFxcXFxifFxcXFxiUDk4SERcXFxcYnxcXFxcYkcxOGRcXFxcYnxcXFxcYlA4NXNcXFxcYnxcXFxcYlAxMUhEXFxcXGJ8XFxcXGJQODhzXFxcXGJ8XFxcXGJBODBIRFxcXFxifFxcXFxiQTgwc2VcXFxcYnxcclxuICAgICAgICBcXFxcYkExMGhcXFxcYnxcXFxcYlA4OVxcXFxifFxcXFxiUDc4c1xcXFxifFxcXFxiRzE4XFxcXGJ8XFxcXGJQODVcXFxcYnxcXFxcYkE3MGhcXFxcYnxcXFxcYkE3MFxcXFxifFxcXFxiRzE3XFxcXGJ8XFxcXGJQMThcXFxcYnxcXFxcYkE4MHNcXFxcYnxcclxuICAgICAgICBcXFxcYkExMXNcXFxcYnxcXFxcYlA4OEhEXFxcXGJ8XFxcXGJBODBoXFxcXGJ8XFxcXGJQNzZzXFxcXGJ8XFxcXGJQNzZoXFxcXGJ8XFxcXGJQOThcXFxcYnxcXFxcYkExMEhEXFxcXGJ8XFxcXGJQNzhcXFxcYnxcXFxcYlA4OFxcXFxifFxcXFxiQTExXFxcXGJ8XHJcbiAgICAgICAgXFxcXGJBMTB0XFxcXGJ8XFxcXGJQNzZhXFxcXGJ8XFxcXGJQNzZ0XFxcXGJ8XFxcXGJQNzZlXFxcXGJ8XFxcXGJQODVIRFxcXFxifFxcXFxiUDg1YVxcXFxifFxcXFxiUDg2XFxcXGJ8XFxcXGJQNzVIRFxcXFxifFxcXFxiUDc2dlxcXFxifFxcXFxiQTEyXFxcXGJ8XHJcbiAgICAgICAgXFxcXGJQNzVhXFxcXGJ8XFxcXGJBMTVcXFxcYnxcXFxcYlA3NlRpXFxcXGJ8XFxcXGJQODFIRFxcXFxifFxcXFxiQTEwXFxcXGJ8XFxcXGJUNzYwVkVcXFxcYnxcXFxcYlQ3MjBIRFxcXFxifFxcXFxiUDc2XFxcXGJ8XFxcXGJQNzNcXFxcYnxcXFxcYlA3MVxcXFxifFxyXG4gICAgICAgIFxcXFxiUDcyXFxcXGJ8XFxcXGJUNzIwU0VcXFxcYnxcXFxcYkM1MjBUaVxcXFxifFxcXFxiVDc2MFxcXFxifFxcXFxiVDcyMFZFXFxcXGJ8VDcyMC0zR0V8VDcyMC1XaUZpYCksXHJcbiAgT25kYVRhYmxldDogbmV3IFJlZ0V4cChgXFxcXGIoVjk3NWl8VmkzMHxWWDUzMHxWNzAxfFZpNjB8VjcwMXN8Vmk1MHxWODAxc3xWNzE5fFZ4NjEwd3xWWDYxMFd8VjgxOWl8VmkxMHxWWDU4MFd8VmkxMHxcclxuICAgICAgICBWNzExc3xWODEzfFY4MTF8VjgyMHd8VjgyMHxWaTIwfFY3MTF8VkkzMFd8VjcxMnxWODkxd3xWOTcyfFY4MTl3fFY4MjB3fFZpNjB8VjgyMHd8VjcxMXxWODEzc3xWODAxfFY4MTl8XHJcbiAgICAgICAgVjk3NXN8VjgwMXxWODE5fFY4MTl8VjgxOHxWODExfFY3MTJ8Vjk3NW18VjEwMXd8Vjk2MXd8VjgxMnxWODE4fFY5NzF8Vjk3MXN8VjkxOXxWOTg5fFYxMTZ3fFYxMDJ3fFY5NzN8XHJcbiAgICAgICAgVmk0MClcXFxcYltcXHNdK3xWMTAgXFxcXGI0R1xcXFxiYCksXHJcbiAgSmF5dGVjaFRhYmxldDogL1RQQy1QQTc2Mi8sXHJcbiAgQmxhdXB1bmt0VGFibGV0OiAvRW5kZWF2b3VyIDgwME5HfEVuZGVhdm91ciAxMDEwLyxcclxuICBEaWdtYVRhYmxldDogL1xcYihpRHgxMHxpRHg5fGlEeDh8aUR4N3xpRHhEN3xpRHhEOHxpRHNROHxpRHNRN3xpRHNROHxpRHNEMTB8aURuRDd8M1RTODA0SHxpRHNRMTF8aURqN3xpRHMxMClcXGIvLFxyXG4gIEV2b2xpb1RhYmxldDogL0FSSUFfTWluaV93aWZpfEFyaWFbIF9dTWluaXxFdm9saW8gWDEwfEV2b2xpbyBYN3xFdm9saW8gWDh8XFxiRXZvdGFiXFxifFxcYk5ldXJhXFxiLyxcclxuICBMYXZhVGFibGV0OiAvUVBBRCBFNzA0fFxcYkl2b3J5U1xcYnxFLVRBQiBJVk9SWXxcXGJFLVRBQlxcYi8sXHJcbiAgQW9jVGFibGV0OiAvTVcwODExfE1XMDgxMnxNVzA5MjJ8TVRLODM4MnxNVzEwMzF8TVcwODMxfE1XMDgyMXxNVzA5MzF8TVcwNzEyLyxcclxuICBNcG1hblRhYmxldDogbmV3IFJlZ0V4cChgTVAxMSBPQ1RBfE1QMTAgT0NUQXxNUFFDMTExNHxNUFFDMTAwNHxNUFFDOTk0fE1QUUM5NzR8TVBRQzk3M3xNUFFDODA0fE1QUUM3ODR8TVBRQzc4MHxcclxuICAgICAgICBcXFxcYk1QRzdcXFxcYnxNUERDRzc1fE1QRENHNzF8TVBEQzEwMDZ8TVAxMDFEQ3xNUERDOTAwMHxNUERDOTA1fE1QREM3MDZIRHxNUERDNzA2fE1QREM3MDV8TVBEQzExMHxcclxuICAgICAgICBNUERDMTAwfE1QREM5OXxNUERDOTd8TVBEQzg4fE1QREM4fE1QREM3N3xNUDcwOXxNSUQ3MDF8TUlENzExfE1JRDE3MHxNUERDNzAzfE1QUUMxMDEwYCksXHJcbiAgQ2Vsa29uVGFibGV0OiAvQ1Q2OTV8Q1Q4ODh8Q1RbXFxzXT85MTB8Q1Q3IFRhYnxDVDkgVGFifENUMyBUYWJ8Q1QyIFRhYnxDVDEgVGFifEM4MjB8QzcyMHxcXGJDVC0xXFxiLyxcclxuICBXb2xkZXJUYWJsZXQ6IG5ldyBSZWdFeHAoYG1pVGFiIFxcXFxiKERJQU1PTkR8U1BBQ0V8QlJPT0tMWU58TkVPfEZMWXxNQU5IQVRUQU58RlVOS3xFVk9MVVRJT058U0tZfEdPQ0FSfElST058R0VOSVVTfFxyXG4gICAgICAgIFBPUHxNSU5UfEVQU0lMT058QlJPQURXQVl8SlVNUHxIT1B8TEVHRU5EfE5FVyBBR0V8TElORXxBRFZBTkNFfEZFRUx8Rk9MTE9XfExJS0V8TElOS3xMSVZFfFRISU5LfFxyXG4gICAgICAgIEZSRUVET018Q0hJQ0FHT3xDTEVWRUxBTkR8QkFMVElNT1JFLUdIfElPV0F8Qk9TVE9OfFNFQVRUTEV8UEhPRU5JWHxEQUxMQVN8SU4gMTAxfE1hc3RlckNoZWYpXFxcXGJgKSxcclxuICBNZWRpYWNvbVRhYmxldDogJ00tTVBJMTBDM0d8TS1TUDEwRUd8TS1TUDEwRUdQfE0tU1AxMEhYQUh8TS1TUDdIWEFIfE0tU1AxMEhYQkh8TS1TUDhIWEFIfE0tU1A4TVhBJyxcclxuICBNaVRhYmxldDogL1xcYk1JIFBBRFxcYnxcXGJITSBOT1RFIDFXXFxiLyxcclxuICBOaWJpcnVUYWJsZXQ6IC9OaWJpcnUgTTF8TmliaXJ1IEp1cGl0ZXIgT25lLyxcclxuICBOZXhvVGFibGV0OiAvTkVYTyBOT1ZBfE5FWE8gMTB8TkVYTyBBVklPfE5FWE8gRlJFRXxORVhPIEdPfE5FWE8gRVZPfE5FWE8gM0d8TkVYTyBTTUFSVHxORVhPIEtJRERPfE5FWE8gTU9CSS8sXHJcbiAgTGVhZGVyVGFibGV0OiBuZXcgUmVnRXhwKGBUQkxUMTBRfFRCTFQxMEl8VEJMLTEwV0RLQnxUQkwtMTBXREtCTzIwMTN8VEJMLVcyMzBWMnxUQkwtVzQ1MHxUQkwtVzUwMHxTVjU3MnxUQkxUN0l8XHJcbiAgICAgICAgVEJBLUFDNy04R3xUQkxUNzl8VEJMLThXMTZ8VEJMLTEwVzMyfFRCTC0xMFdLQnxUQkwtVzEwMGApLFxyXG4gIFViaXNsYXRlVGFibGV0OiAvVWJpU2xhdGVbXFxzXT83Qy8sXHJcbiAgUG9ja2V0Qm9va1RhYmxldDogL1BvY2tldGJvb2svLFxyXG4gIEtvY2Fzb1RhYmxldDogL1xcYihUQi0xMjA3KVxcYi8sXHJcbiAgSGlzZW5zZVRhYmxldDogL1xcYihGNTI4MXxFMjM3MSlcXGIvLFxyXG4gIEh1ZGw6IC9IdWRsIEhUN1MzfEh1ZGwgMi8sXHJcbiAgVGVsc3RyYVRhYmxldDogL1QtSHViMi8sXHJcbiAgSG9uZXl3ZWxsOiAvUlQxMEEvLFxyXG4gIEdlbmVyaWNUYWJsZXQ6IG5ldyBSZWdFeHAoYEFuZHJvaWQuKlxcXFxiOTdEXFxcXGJ8VGFibGV0KD8hLipQQyl8Qk5UVjI1MEF8TUlELVdDRE1BfExvZ2ljUEQgWm9vbTJ8XFxcXGJBN0VCXFxcXGJ8Q2F0Tm92YTh8XHJcbiAgICAgICAgQTFfMDd8Q1Q3MDR8Q1QxMDAyfFxcXFxiTTcyMVxcXFxifHJrMzBzZGt8XFxcXGJFVk9UQUJcXFxcYnxNNzU4QXxFVDkwNHxBTFVNSVVNMTB8U21hcnRmcmVuIFRhYnxFbmRlYXZvdXIgMTAxMHxcclxuICAgICAgICBUYWJsZXQtUEMtNHxUYWdpIFRhYnxcXFxcYk02cHJvXFxcXGJ8Q1QxMDIwV3xhcmMgMTBIRHxcXFxcYlRQNzUwXFxcXGJ8XFxcXGJRVEFRWjNcXFxcYnxXVlQxMDF8VE0xMDg4fEtUMTA3YCksXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgREVWSUNFUyA9IHtcclxuICBCTEFDS0JFUlJZOiAnQmxhY2tiZXJyeScsXHJcbiAgRklSRUZPWF9PUzogJ0ZpcmVmb3gtT1MnLFxyXG4gIENIUk9NRV9CT09LOiAnQ2hyb21lLUJvb2snLFxyXG4gIFdJTkRPV1NfUEhPTkU6ICdXaW5kb3dzLVBob25lJyxcclxuICBWSVRBOiAnVml0YScsXHJcbiAgUFM0OiAnUFM0JyxcclxuICBNQUM6ICdNYWNpbnRvc2gnLFxyXG4gIENIUk9NRUNBU1Q6ICdDaHJvbWVjYXN0JyxcclxuICBBUFBMRV9UVjogJ0FwcGxlLVRWJyxcclxuICBHT09HTEVfVFY6ICdHb29nbGUtVFYnLFxyXG4gIEFORFJPSUQ6ICdBbmRyb2lkJyxcclxuICBUZXNsYTogJ1Rlc2xhJyxcclxuICBpUGFkOiAnaVBhZCcsXHJcbiAgSVBIT05FOiAnaVBob25lJyxcclxuICBpUG9kOiAnaVBvZCcsXHJcbiAgVU5LTk9XTjogR0VORVJBTC5VS05PV04sXHJcbiAgSFRDOiAnSFRDJyxcclxuICBORVhVU19QSE9ORTogJ05leHVzIFBob25lJyxcclxuICBOZXh1c1RhYmxldDogJ05leHVzIFRhYmxldCcsXHJcbiAgREVMTDogJ0RlbGwnLFxyXG4gIE1PVE9ST0xBOiAnTW90b3JvbGEnLFxyXG4gIFNBTVNVTkc6ICdTYW1zdW5nJyxcclxuICBMRzogJ0xHJyxcclxuICBTT05ZOiAnU29ueScsXHJcbiAgQVNVUzogJ0FzdXMnLFxyXG4gIE5PS0lBX0xVTUlBOiAnTm9raWEgTHVtaWEnLFxyXG4gIE1JQ1JPTUFYOiAnTWljcm9tYXgnLFxyXG4gIFBBTE06ICdQYWxtJyxcclxuICBWRVJUVTogJ1ZlcnR1JyxcclxuICBQQU5URUNIOiAnUEFOVEVDSCcsXHJcbiAgRkxZOiAnRmx5JyxcclxuICBXSUtPOiBgV0lLT2AsXHJcbiAgSV9NT0JJTEU6ICdpLW1vYmlsZScsXHJcbiAgU0lNVkFMTEVZOiAnU2ltdmFsbGV5JyxcclxuICBXT0xGR0FORzogJ1dvbGZnYW5nJyxcclxuICBBTENBVEVMOiAnQWxjYXRlbCcsXHJcbiAgSE9ORVlXRUxMOiAnSG9uZXl3ZWxsJyxcclxuICBOSU5URU5ETzogJ05pbnRlbmRvJyxcclxuICBBTU9JOiAnQW1vaScsXHJcbiAgSU5ROiAnSU5RJyxcclxuICBHRU5FUklDX1BIT05FOiAnR2VuZXJpYyBQaG9uZScsXHJcbiAgTUlfU0VfOTogJ01pIFNFIDknLFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IERFU0tUT1BfREVWSUNFUyA9IFtcclxuICBERVZJQ0VTLlBTNCxcclxuICBERVZJQ0VTLkNIUk9NRV9CT09LLFxyXG4gIERFVklDRVMuTUFDLFxyXG4gIERFVklDRVMuREVMTCxcclxuICBERVZJQ0VTLkFTVVMsXHJcbiAgREVWSUNFUy5VTktOT1dOLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IE9TID0ge1xyXG4gIFdJTkRPV1M6ICdXaW5kb3dzJyxcclxuICBNQUM6ICdNYWMnLFxyXG4gIElPUzogJ2lPUycsXHJcbiAgQU5EUk9JRDogJ0FuZHJvaWQnLFxyXG4gIExJTlVYOiAnTGludXgnLFxyXG4gIFVOSVg6ICdVbml4JyxcclxuICBGSVJFRk9YX09TOiAnRmlyZWZveC1PUycsXHJcbiAgQ0hST01FX09TOiAnQ2hyb21lLU9TJyxcclxuICBXSU5ET1dTX1BIT05FOiAnV2luZG93cy1QaG9uZScsXHJcbiAgVU5LTk9XTjogR0VORVJBTC5VS05PV04sXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgT1NfVkVSU0lPTlM6IGFueSA9IHtcclxuICBXSU5ET1dTXzNfMTE6ICd3aW5kb3dzLTMtMTEnLFxyXG4gIFdJTkRPV1NfOTU6ICd3aW5kb3dzLTk1JyxcclxuICBXSU5ET1dTX01FOiAnd2luZG93cy1tZScsXHJcbiAgV0lORE9XU185ODogJ3dpbmRvd3MtOTgnLFxyXG4gIFdJTkRPV1NfQ0U6ICd3aW5kb3dzLWNlJyxcclxuICBXSU5ET1dTXzIwMDA6ICd3aW5kb3dzLTIwMDAnLFxyXG4gIFdJTkRPV1NfWFA6ICd3aW5kb3dzLXhwJyxcclxuICBXSU5ET1dTX1NFUlZFUl8yMDAzOiAnd2luZG93cy1zZXJ2ZXItMjAwMycsXHJcbiAgV0lORE9XU19WSVNUQTogJ3dpbmRvd3MtdmlzdGEnLFxyXG4gIFdJTkRPV1NfNzogJ3dpbmRvd3MtNycsXHJcbiAgV0lORE9XU184XzE6ICd3aW5kb3dzLTgtMScsXHJcbiAgV0lORE9XU184OiAnd2luZG93cy04JyxcclxuICBXSU5ET1dTXzEwOiAnd2luZG93cy0xMCcsXHJcbiAgV0lORE9XU19QSE9ORV83XzU6ICd3aW5kb3dzLXBob25lLTctNScsXHJcbiAgV0lORE9XU19QSE9ORV84XzE6ICd3aW5kb3dzLXBob25lLTgtMScsXHJcbiAgV0lORE9XU19QSE9ORV8xMDogJ3dpbmRvd3MtcGhvbmUtMTAnLFxyXG4gIFdJTkRPV1NfTlRfNF8wOiAnd2luZG93cy1udC00LTAnLFxyXG4gIE1BQ09TWF8xMV8wOiAnbWFjLW9zLXgtMTEtMCcsXHJcbiAgTUFDT1NYXzE2OiAnbWFjLW9zLXgtMTYnLFxyXG4gIE1BQ09TWF8xNTogJ21hYy1vcy14LTE1JyxcclxuICBNQUNPU1hfMTQ6ICdtYWMtb3MteC0xNCcsXHJcbiAgTUFDT1NYXzEzOiAnbWFjLW9zLXgtMTMnLFxyXG4gIE1BQ09TWF8xMjogJ21hYy1vcy14LTEyJyxcclxuICBNQUNPU1hfMTE6ICdtYWMtb3MteC0xMScsXHJcbiAgTUFDT1NYXzEwOiAnbWFjLW9zLXgtMTAnLFxyXG4gIE1BQ09TWF85OiAnbWFjLW9zLXgtOScsXHJcbiAgTUFDT1NYXzg6ICdtYWMtb3MteC04JyxcclxuICBNQUNPU1hfNzogJ21hYy1vcy14LTcnLFxyXG4gIE1BQ09TWF82OiAnbWFjLW9zLXgtNicsXHJcbiAgTUFDT1NYXzU6ICdtYWMtb3MteC01JyxcclxuICBNQUNPU1hfNDogJ21hYy1vcy14LTQnLFxyXG4gIE1BQ09TWF8zOiAnbWFjLW9zLXgtMycsXHJcbiAgTUFDT1NYXzI6ICdtYWMtb3MteC0yJyxcclxuICBNQUNPU1g6ICdtYWMtb3MteCcsXHJcbiAgaU9TOiAnaU9TJyxcclxuICBBTkRST0lEXzk6ICdhbmRyb2lkLTknLFxyXG4gIFVOS05PV046IEdFTkVSQUwuVUtOT1dOLnRvTG93ZXJDYXNlKCksXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgT1NfUkU6IGFueSA9IHtcclxuICBXSU5ET1dTOiB7XHJcbiAgICBhbmQ6IFt7IG9yOiBbL1xcYldpbmRvd3N8KFdpblxcZFxcZClcXGIvLCAvXFxiV2luIDl4XFxiL10gfSwgeyBub3Q6IC9cXGJXaW5kb3dzIFBob25lXFxiLyB9XSxcclxuICB9LFxyXG4gIE1BQzoge1xyXG4gICAgYW5kOiBbL1xcYk1hYyBPU1xcYi8sIHsgbm90OiB7IG9yOiBbL1xcYmlQaG9uZVxcYi8sIC9cXGJpUGFkXFxiLywgL1xcYmlQb2RcXGIvLCAvXFxiV2luZG93cyBQaG9uZVxcYi9dIH0gfV0sXHJcbiAgfSxcclxuICBJT1M6IHtcclxuICAgIGFuZDogW3sgb3I6IFsvXFxiaVBhZFxcYi8sIC9cXGJpUGhvbmVcXGIvLCAvXFxiaVBvZFxcYi9dIH0sIHsgbm90OiAvXFxiV2luZG93cyBQaG9uZVxcYi8gfV0sXHJcbiAgfSxcclxuICBBTkRST0lEOiB7IGFuZDogWy9cXGJBbmRyb2lkXFxiLywgeyBub3Q6IC9cXGJXaW5kb3dzIFBob25lXFxiLyB9XSB9LFxyXG4gIExJTlVYOiAvXFxiTGludXhcXGIvLFxyXG4gIFVOSVg6IC9cXGJVTklYXFxiLyxcclxuICBGSVJFRk9YX09TOiB7IGFuZDogWy9cXGJGaXJlZm94XFxiLywgL01vYmlsZVxcYi9dIH0sXHJcbiAgQ0hST01FX09TOiAvXFxiQ3JPU1xcYi8sXHJcbiAgV0lORE9XU19QSE9ORTogeyBvcjogWy9cXGJJRU1vYmlsZVxcYi8sIC9cXGJXaW5kb3dzIFBob25lXFxiL10gfSxcclxuICBQUzQ6IC9cXGJNb3ppbGxhXFwvNS4wIFxcKFBsYXlTdGF0aW9uIDRcXGIvLFxyXG4gIFZJVEE6IC9cXGJNb3ppbGxhXFwvNS4wIFxcKFBsYXkoU3xzKXRhdGlvbiBWaXRhXFxiLyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBCUk9XU0VSU19SRTogYW55ID0ge1xyXG4gIENIUk9NRToge1xyXG4gICAgYW5kOiBbXHJcbiAgICAgIHsgb3I6IFsvXFxiQ2hyb21lXFxiLywgL1xcYkNyaU9TXFxiLywgL1xcYkhlYWRsZXNzQ2hyb21lXFxiL10gfSxcclxuICAgICAge1xyXG4gICAgICAgIG5vdDoge1xyXG4gICAgICAgICAgb3I6IFsvXFxiT1BSXFxiLywgL1xcYkVkZyhlfEF8aU9TKVxcYi8sIC9cXGJFZGdcXC9cXGIvLCAvXFxiU2Ftc3VuZ0Jyb3dzZXJcXGIvLCAvXFxiVUNCcm93c2VyXFxiL10sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIF0sXHJcbiAgfSxcclxuICBGSVJFRk9YOiB7IG9yOiBbL1xcYkZpcmVmb3hcXGIvLCAvXFxiRnhpT1NcXGIvXSB9LFxyXG4gIFNBRkFSSToge1xyXG4gICAgYW5kOiBbXHJcbiAgICAgIC9eKCg/IUNyaU9TKS4pKlxcU2FmYXJpXFxiLiokLyxcclxuICAgICAge1xyXG4gICAgICAgIG5vdDoge1xyXG4gICAgICAgICAgb3I6IFsvXFxiT1BSXFxiLywgL1xcYkVkZyhlfEF8aU9TKVxcYi8sIC9cXGJFZGdcXC9cXGIvLCAvXFxiV2luZG93cyBQaG9uZVxcYi8sIC9cXGJTYW1zdW5nQnJvd3NlclxcYi8sIC9cXGJVQ0Jyb3dzZXJcXGIvXSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSxcclxuICB9LFxyXG4gIE9QRVJBOiB7IG9yOiBbL09wZXJhXFxiLywgL1xcYk9QUlxcYi9dIH0sXHJcbiAgSUU6IHtcclxuICAgIG9yOiBbL1xcYk1TSUVcXGIvLCAvXFxiVHJpZGVudFxcYi8sIC9eTW96aWxsYVxcLzVcXC4wIFxcKFdpbmRvd3MgTlQgMTBcXC4wOyBXaW42NDsgeDY0XFwpJC9dLFxyXG4gIH0sXHJcbiAgTVNfRURHRTogeyBvcjogWy9cXGJFZGcoZXxBfGlPUylcXGIvXSB9LFxyXG4gIE1TX0VER0VfQ0hST01JVU06IC9cXGJFZGdcXC9cXGIvLFxyXG4gIFBTNDogL1xcYk1vemlsbGFcXC81LjAgXFwoUGxheVN0YXRpb24gNFxcYi8sXHJcbiAgVklUQTogL1xcYk1vemlsbGFcXC81LjAgXFwoUGxheShTfHMpdGF0aW9uIFZpdGFcXGIvLFxyXG4gIEZCX01FU1NBTkdFUjogL1xcYkZCQU5cXC9NZXNzZW5nZXJGb3JpT1NcXGIvLFxyXG4gIFNBTVNVTkc6IC9cXGJTYW1zdW5nQnJvd3NlclxcYi8sXHJcbiAgVUNCUk9XU0VSOiAvXFxiVUNCcm93c2VyXFxiLyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBERVZJQ0VTX1JFOiBhbnkgPSB7XHJcbiAgLi4uTU9CSUxFU19SRSxcclxuICAuLi5UQUJMRVRTX1JFLFxyXG4gIC4uLk9TX1JFLFxyXG4gIEZJUkVGT1hfT1M6IHsgYW5kOiBbL1xcYkZpcmVmb3hcXGIvLCAvXFxiTW9iaWxlXFxiL10gfSxcclxuICBDSFJPTUVfQk9PSzogL1xcYkNyT1NcXGIvLFxyXG4gIFBTNDogL1xcYk1vemlsbGFcXC81LjAgXFwoUGxheVN0YXRpb24gNFxcYi8sXHJcbiAgQ0hST01FQ0FTVDogL1xcYkNyS2V5XFxiLyxcclxuICBBUFBMRV9UVjogL15pVHVuZXMtQXBwbGVUVlxcLzQuMSQvLFxyXG4gIEdPT0dMRV9UVjogL1xcYkdvb2dsZVRWXFxiLyxcclxuICBUZXNsYTogL1Rlc2xhXFwvKFswLTldezR9LlswLTldezEsMn0uP1swLTldezAsMn0uP1swLTldezAsMn0pLSguezd9KS8sXHJcbiAgTUlfU0VfOTogL1xcYlhpYW9taVxcYi8sXHJcbiAgTUFDOiB7XHJcbiAgICBhbmQ6IFsvXFxiTWFjIE9TXFxiLywgeyBub3Q6IHsgb3I6IFsvXFxiaVBob25lXFxiLywgL1xcYmlQYWRcXGIvLCAvXFxiaVBvZFxcYi8sIC9cXGJXaW5kb3dzIFBob25lXFxiL10gfSB9XSxcclxuICB9LFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IE9TX1ZFUlNJT05TX1JFX01BUDogYW55ID0ge1xyXG4gIFdJTkRPV1NfM18xMTogL1dpbjE2LyxcclxuICBXSU5ET1dTXzk1OiAvKFdpbmRvd3MgOTV8V2luOTV8V2luZG93c185NSkvLFxyXG4gIFdJTkRPV1NfTUU6IC8oV2luIDl4IDQuOTB8V2luZG93cyBNRSkvLFxyXG4gIFdJTkRPV1NfOTg6IC8oV2luZG93cyA5OHxXaW45OCkvLFxyXG4gIFdJTkRPV1NfQ0U6IC9XaW5kb3dzIENFLyxcclxuICBXSU5ET1dTXzIwMDA6IC8oV2luZG93cyBOVCA1LjB8V2luZG93cyAyMDAwKS8sXHJcbiAgV0lORE9XU19YUDogLyhXaW5kb3dzIE5UIDUuMXxXaW5kb3dzIFhQKS8sXHJcbiAgV0lORE9XU19TRVJWRVJfMjAwMzogL1dpbmRvd3MgTlQgNS4yLyxcclxuICBXSU5ET1dTX1ZJU1RBOiAvV2luZG93cyBOVCA2LjAvLFxyXG4gIFdJTkRPV1NfNzogLyhXaW5kb3dzIDd8V2luZG93cyBOVCA2LjEpLyxcclxuICBXSU5ET1dTXzhfMTogLyhXaW5kb3dzIDguMXxXaW5kb3dzIE5UIDYuMykvLFxyXG4gIFdJTkRPV1NfODogLyhXaW5kb3dzIDh8V2luZG93cyBOVCA2LjIpLyxcclxuICBXSU5ET1dTXzEwOiAvKFdpbmRvd3MgTlQgMTAuMCkvLFxyXG4gIFdJTkRPV1NfUEhPTkVfN181OiAvKFdpbmRvd3MgUGhvbmUgT1MgNy41KS8sXHJcbiAgV0lORE9XU19QSE9ORV84XzE6IC8oV2luZG93cyBQaG9uZSA4LjEpLyxcclxuICBXSU5ET1dTX1BIT05FXzEwOiAvKFdpbmRvd3MgUGhvbmUgMTApLyxcclxuICBXSU5ET1dTX05UXzRfMDoge1xyXG4gICAgYW5kOiBbLyhXaW5kb3dzIE5UIDQuMHxXaW5OVDQuMHxXaW5OVHxXaW5kb3dzIE5UKS8sIHsgbm90OiAvV2luZG93cyBOVCAxMC4wLyB9XSxcclxuICB9LFxyXG4gIE1BQ09TWDogLyhNQUMgT1MgWFxccypbXiAwLTldKS8sXHJcbiAgTUFDT1NYXzM6IC8oRGFyd2luIDEwLjN8TWFjIE9TIFggMTAuMykvLFxyXG4gIE1BQ09TWF80OiAvKERhcndpbiAxMC40fE1hYyBPUyBYIDEwLjQpLyxcclxuICBNQUNPU1hfNTogLyhNYWMgT1MgWCAxMC41KS8sXHJcbiAgTUFDT1NYXzY6IC8oTWFjIE9TIFggMTAuNikvLFxyXG4gIE1BQ09TWF83OiAvKE1hYyBPUyBYIDEwLjcpLyxcclxuICBNQUNPU1hfODogLyhNYWMgT1MgWCAxMC44KS8sXHJcbiAgTUFDT1NYXzk6IC8oTWFjIE9TIFggMTAuOSkvLFxyXG4gIE1BQ09TWF8xMDogLyhNYWMgT1MgWCAxMC4xMCkvLFxyXG4gIE1BQ09TWF8xMTogLyhNYWMgT1MgWCAxMC4xMSkvLFxyXG4gIE1BQ09TWF8xMjogLyhNYWMgT1MgWCAxMC4xMikvLFxyXG4gIE1BQ09TWF8xMzogLyhNYWMgT1MgWCAxMC4xMykvLFxyXG4gIE1BQ09TWF8xNDogLyhNYWMgT1MgWCAxMC4xNCkvLFxyXG4gIE1BQ09TWF8xNTogLyhNYWMgT1MgWCAxMC4xNSkvLFxyXG4gIE1BQ09TWF8xNjogLyhNYWMgT1MgWCAxMC4xNikvLFxyXG4gIE1BQ09TWF8xMV8wOiB7XHJcbiAgICBvcjogWy8xMV8wIGxpa2UgTWFjIE9TIFgvLCAvTWFjIE9TIFggMTEvXSxcclxuICB9LFxyXG4gIGlPUzogLyhpUGhvbmUgT1NcXHMqWzAtOV9dKykvLFxyXG4gIEFORFJPSURfOTogLyhBbmRyb2lkIDkpLyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBCUk9XU0VSX1ZFUlNJT05TX1JFX01BUDogYW55ID0ge1xyXG4gIENIUk9NRTogWy9cXGJDaHJvbWVcXC8oW1xcZFxcLl0rKVxcYi8sIC9cXGJDcmlPU1xcLyhbXFxkXFwuXSspXFxiLywgL1xcYkhlYWRsZXNzQ2hyb21lXFwvKFtcXGRcXC5dKylcXGIvXSxcclxuICBGSVJFRk9YOiBbL1xcYkZpcmVmb3hcXC8oW1xcZFxcLl0rKVxcYi8sIC9cXGJGeGlPU1xcLyhbXFxkXFwuXSspXFxiL10sXHJcbiAgU0FGQVJJOiBbL1xcYlZlcnNpb25cXC8oW1xcZFxcLl0rKVxcYi8sIC9cXGJTYWZhcmlcXC8oW1xcZFxcLl0rKVxcYi9dLFxyXG4gIE9QRVJBOiBbL1xcYlZlcnNpb25cXC8oW1xcZFxcLl0rKVxcYi8sIC9cXGJPUFJcXC8oW1xcZFxcLl0rKVxcYi9dLFxyXG4gIElFOiBbL1xcYk1TSUUgKFtcXGRcXC5dK1xcdz8pXFxiLywgL1xcYnJ2OihbXFxkXFwuXStcXHc/KVxcYi9dLFxyXG4gIE1TX0VER0U6IC9cXGJFZGcoPzplfEF8aU9TKVxcLyhbXFxkXFwuXSspXFxiLyxcclxuICBNU19FREdFX0NIUk9NSVVNOiAvXFxiRWRnXFwvKFtcXGRcXC5dKylcXGIvLFxyXG4gIFNBTVNVTkc6IC9cXGJTYW1zdW5nQnJvd3NlclxcLyhbXFxkXFwuXSspXFxiLyxcclxuICBVQ0JST1dTRVI6IC9cXGJVQ0Jyb3dzZXJcXC8oW1xcZFxcLl0rKVxcYi8sXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgT1NfVkVSU0lPTlNfUkU6IGFueSA9IE9iamVjdC5rZXlzKE9TX1ZFUlNJT05TX1JFX01BUCkucmVkdWNlKChvYmo6IGFueSwga2V5OiBzdHJpbmcpID0+IHtcclxuICBvYmpba2V5XSA9IE9TX1ZFUlNJT05TX1JFX01BUFtrZXldO1xyXG4gIHJldHVybiBvYmo7XHJcbn0sIHt9KTtcclxuXHJcbmV4cG9ydCBjb25zdCBCUk9XU0VSX1ZFUlNJT05TX1JFOiBhbnkgPSBPYmplY3Qua2V5cyhCUk9XU0VSX1ZFUlNJT05TX1JFX01BUCkucmVkdWNlKChvYmo6IGFueSwga2V5OiBzdHJpbmcpID0+IHtcclxuICBvYmpbKEJST1dTRVJTIGFzIGFueSlba2V5XV0gPSBCUk9XU0VSX1ZFUlNJT05TX1JFX01BUFtrZXldO1xyXG4gIHJldHVybiBvYmo7XHJcbn0sIHt9KTtcclxuIl19 \ No newline at end of file diff --git a/esm2022/lib/retree.mjs b/esm2022/lib/retree.mjs new file mode 100644 index 0000000..918ffb1 --- /dev/null +++ b/esm2022/lib/retree.mjs @@ -0,0 +1,47 @@ +/** + * Created by ahsanayaz on 08/11/2016. + */ +export class ReTree { + constructor() { } + test(str, regex) { + if (typeof regex === 'string') { + regex = new RegExp(regex); + } + if (regex instanceof RegExp) { + return regex.test(str); + } + else if (regex && Array.isArray(regex.and)) { + return regex.and.every((item) => { + return this.test(str, item); + }); + } + else if (regex && Array.isArray(regex.or)) { + return regex.or.some((item) => { + return this.test(str, item); + }); + } + else if (regex && regex.not) { + return !this.test(str, regex.not); + } + else { + return false; + } + } + exec(str, regex) { + if (typeof regex === 'string') { + regex = new RegExp(regex); + } + if (regex instanceof RegExp) { + return regex.exec(str); + } + else if (regex && Array.isArray(regex)) { + return regex.reduce((res, item) => { + return !!res ? res : this.exec(str, item); + }, null); + } + else { + return null; + } + } +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cmVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcm0tbmctZGV2aWNlLWRldGVjdGlvbi9zcmMvbGliL3JldHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE1BQU0sT0FBTyxNQUFNO0lBQ2pCLGdCQUFlLENBQUM7SUFFVCxJQUFJLENBQUMsR0FBVyxFQUFFLEtBQVU7UUFDakMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELElBQUksS0FBSyxZQUFZLE1BQU0sRUFBRSxDQUFDO1lBQzVCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixDQUFDO2FBQU0sSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ25DLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM1QyxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ2pDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRU0sSUFBSSxDQUFDLEdBQVcsRUFBRSxLQUFVO1FBQ2pDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFFRCxJQUFJLEtBQUssWUFBWSxNQUFNLEVBQUUsQ0FBQztZQUM1QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIsQ0FBQzthQUFNLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFRLEVBQUUsSUFBUyxFQUFFLEVBQUU7Z0JBQzFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDWCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGFoc2FuYXlheiBvbiAwOC8xMS8yMDE2LlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBSZVRyZWUge1xyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgcHVibGljIHRlc3Qoc3RyOiBzdHJpbmcsIHJlZ2V4OiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKHR5cGVvZiByZWdleCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKHJlZ2V4KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVnZXggaW5zdGFuY2VvZiBSZWdFeHApIHtcclxuICAgICAgcmV0dXJuIHJlZ2V4LnRlc3Qoc3RyKTtcclxuICAgIH0gZWxzZSBpZiAocmVnZXggJiYgQXJyYXkuaXNBcnJheShyZWdleC5hbmQpKSB7XHJcbiAgICAgIHJldHVybiByZWdleC5hbmQuZXZlcnkoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRlc3Qoc3RyLCBpdGVtKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHJlZ2V4ICYmIEFycmF5LmlzQXJyYXkocmVnZXgub3IpKSB7XHJcbiAgICAgIHJldHVybiByZWdleC5vci5zb21lKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy50ZXN0KHN0ciwgaXRlbSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChyZWdleCAmJiByZWdleC5ub3QpIHtcclxuICAgICAgcmV0dXJuICF0aGlzLnRlc3Qoc3RyLCByZWdleC5ub3QpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGV4ZWMoc3RyOiBzdHJpbmcsIHJlZ2V4OiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKHR5cGVvZiByZWdleCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKHJlZ2V4KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVnZXggaW5zdGFuY2VvZiBSZWdFeHApIHtcclxuICAgICAgcmV0dXJuIHJlZ2V4LmV4ZWMoc3RyKTtcclxuICAgIH0gZWxzZSBpZiAocmVnZXggJiYgQXJyYXkuaXNBcnJheShyZWdleCkpIHtcclxuICAgICAgcmV0dXJuIHJlZ2V4LnJlZHVjZSgocmVzOiBhbnksIGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiAhIXJlcyA/IHJlcyA6IHRoaXMuZXhlYyhzdHIsIGl0ZW0pO1xyXG4gICAgICB9LCBudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0= \ No newline at end of file diff --git a/esm2022/lib/rm-ng-device-detection.service.mjs b/esm2022/lib/rm-ng-device-detection.service.mjs new file mode 100644 index 0000000..442b260 --- /dev/null +++ b/esm2022/lib/rm-ng-device-detection.service.mjs @@ -0,0 +1,206 @@ +import { PLATFORM_ID, Inject, Injectable } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; +import * as Constants from './device-detector.constants'; +import { ReTree } from './retree'; +import * as i0 from "@angular/core"; +export var DeviceType; +(function (DeviceType) { + DeviceType["Mobile"] = "mobile"; + DeviceType["Tablet"] = "tablet"; + DeviceType["Desktop"] = "desktop"; + DeviceType["Unknown"] = "unknown"; +})(DeviceType || (DeviceType = {})); +export var OrientationType; +(function (OrientationType) { + OrientationType["Portrait"] = "portrait"; + OrientationType["Landscape"] = "landscape"; +})(OrientationType || (OrientationType = {})); +const iPad = 'iPad'; +export class RmNgDeviceDetectionService { + platformId; + ua = ''; + userAgent = ''; + os = ''; + browser = ''; + device = ''; + os_version = ''; + browser_version = ''; + reTree = new ReTree(); + deviceType = ''; + orientation = ''; + constructor(platformId) { + this.platformId = platformId; + if (isPlatformBrowser(this.platformId) && typeof window !== 'undefined') { + this.userAgent = window.navigator.userAgent; + } + this.setDeviceInfo(this.userAgent); + } + setDeviceInfo(ua = this.userAgent) { + if (ua !== this.userAgent) { + this.userAgent = ua; + } + const mappings = [ + { const: 'OS', prop: 'os' }, + { const: 'BROWSERS', prop: 'browser' }, + { const: 'DEVICES', prop: 'device' }, + { const: 'OS_VERSIONS', prop: 'os_version' }, + ]; + mappings.forEach((mapping) => { + this[mapping.prop] = Object.keys(Constants[mapping.const]).reduce((obj, item) => { + if (Constants[mapping.const][item] === 'device') { + // hack for iOS 13 Tablet + if (isPlatformBrowser(this.platformId) && + (!!this.reTree.test(this.userAgent, Constants.TABLETS_RE[iPad]) || + (navigator.platform === 'MacIntel' && + navigator.maxTouchPoints > 1))) { + obj[Constants[mapping.const][item]] = + iPad; + return Object; + } + } + // obj[Constants[mapping.const as keyof typeof Constants][item]] = this.reTree.test(ua, Constants[`${mapping.const}_RE`][item]); + obj[Constants[mapping.const][item]] = this.reTree.test(ua, Constants[`${mapping.const}_RE`][item]); + return obj; + }, {}); + }); + // mappings.forEach(mapping => { + // this[mapping.prop] = Object.keys(Constants[mapping.const as keyof typeof Constants]) + // .map(key => { + // return Constants[mapping.const as keyof typeof Constants][key]; + // }) + // .reduce((previousValue, currentValue) => { + // if (mapping.prop === 'device' && previousValue === Constants[mapping.const as keyof typeof Constants].ANDROID) { + // // if we have the actual device found, instead of 'Android', return the actual device + // return this[mapping.prop][currentValue] ? currentValue : previousValue; + // } else { + // return previousValue === Constants[mapping.const as keyof typeof Constants].UNKNOWN && this[mapping.prop][currentValue] + // ? currentValue + // : previousValue; + // } + // }, Constants[mapping.const as keyof typeof Constants].UNKNOWN); + // }); + // mappings.forEach(mapping => { + // const prop = this[mapping.prop]; + // if (typeof prop === 'object' && prop !== null) { + // this[mapping.prop] = Object.keys(Constants[mapping.const as keyof typeof Constants]) + // .map(key => { + // return Constants[mapping.const as keyof typeof Constants][key]; + // }) + // .reduce((previousValue, currentValue) => { + // if (mapping.prop === 'device' && previousValue === Constants[mapping.const as keyof typeof Constants].ANDROID) { + // return prop[currentValue] ? currentValue : previousValue; + // } else { + // return previousValue === Constants[mapping.const as keyof typeof Constants].UNKNOWN && prop[currentValue] + // ? currentValue + // : previousValue; + // } + // }, Constants[mapping.const as keyof typeof Constants].UNKNOWN); + // } + // }); + mappings.forEach((mapping) => { + // Cast `this[mapping.prop]` as an object with string keys and any values + const prop = this[mapping.prop]; + // Cast Constants[mapping.const] to the expected type + const constantsMapping = Constants[mapping.const]; + // Ensure `mapping.prop` is an object and not null + if (typeof prop === 'object' && prop !== null) { + this[mapping.prop] = Object.keys(constantsMapping) + .map((key) => constantsMapping[key]) + .reduce((previousValue, currentValue) => { + if (mapping.prop === 'device' && + previousValue === + Constants[mapping.const].ANDROID) { + // Return the actual device if found + return prop[currentValue] ? currentValue : previousValue; + } + else { + // Return the currentValue if it’s found in `prop` + return previousValue === + Constants[mapping.const].UNKNOWN && + prop[currentValue] + ? currentValue + : previousValue; + } + }, Constants[mapping.const].UNKNOWN); + } + }); + this.browser_version = '0'; + if (this.browser !== Constants.BROWSERS.UNKNOWN) { + const re = Constants.BROWSER_VERSIONS_RE[this.browser]; + const res = this.reTree.exec(ua, re); + if (!!res) { + this.browser_version = res[1]; + } + } + if (typeof window !== 'undefined' && window && window.matchMedia) { + this.orientation = window.matchMedia('(orientation: landscape)').matches + ? OrientationType.Landscape + : OrientationType.Portrait; + } + else { + this.orientation = Constants.GENERAL.UKNOWN; + } + this.deviceType = this.isTablet() + ? DeviceType.Tablet + : this.isMobile(this.userAgent) + ? DeviceType.Mobile + : this.isDesktop(this.userAgent) + ? DeviceType.Desktop + : DeviceType.Unknown; + } + getDeviceInfo() { + const deviceInfo = { + userAgent: this.userAgent, + os: this.os, + browser: this.browser, + device: this.device, + os_version: this.os_version, + browser_version: this.browser_version, + deviceType: this.deviceType, + orientation: this.orientation, + }; + return deviceInfo; + } + isMobile(userAgent = this.userAgent) { + if (this.isTablet(userAgent)) { + return false; + } + const match = Object.keys(Constants.MOBILES_RE).find((mobile) => { + return this.reTree.test(userAgent, Constants.MOBILES_RE[mobile]); + }); + return !!match; + } + isTablet(userAgent = this.userAgent) { + if (isPlatformBrowser(this.platformId) && + (!!this.reTree.test(this.userAgent, Constants.TABLETS_RE[iPad]) || + (typeof navigator !== 'undefined' && + navigator.platform === 'MacIntel' && + navigator.maxTouchPoints > 1))) { + return true; + } + const match = Object.keys(Constants.TABLETS_RE).find((mobile) => { + return !!this.reTree.test(userAgent, Constants.TABLETS_RE[mobile]); + }); + return !!match; + } + isDesktop(userAgent = this.userAgent) { + if (this.device === Constants.DEVICES.UNKNOWN) { + if (this.isMobile(userAgent) || this.isTablet(userAgent)) { + return false; + } + } + return Constants.DESKTOP_DEVICES.indexOf(this.device) > -1; + } + static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: RmNgDeviceDetectionService, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); + static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: RmNgDeviceDetectionService, providedIn: 'root' }); +} +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: RmNgDeviceDetectionService, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root', + }] + }], ctorParameters: () => [{ type: undefined, decorators: [{ + type: Inject, + args: [PLATFORM_ID] + }] }] }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm0tbmctZGV2aWNlLWRldGVjdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcm0tbmctZGV2aWNlLWRldGVjdGlvbi9zcmMvbGliL3JtLW5nLWRldmljZS1kZXRlY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFZLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxLQUFLLFNBQVMsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDOztBQVlsQyxNQUFNLENBQU4sSUFBWSxVQUtYO0FBTEQsV0FBWSxVQUFVO0lBQ3BCLCtCQUFpQixDQUFBO0lBQ2pCLCtCQUFpQixDQUFBO0lBQ2pCLGlDQUFtQixDQUFBO0lBQ25CLGlDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFMVyxVQUFVLEtBQVYsVUFBVSxRQUtyQjtBQUNELE1BQU0sQ0FBTixJQUFZLGVBR1g7QUFIRCxXQUFZLGVBQWU7SUFDekIsd0NBQXFCLENBQUE7SUFDckIsMENBQXVCLENBQUE7QUFDekIsQ0FBQyxFQUhXLGVBQWUsS0FBZixlQUFlLFFBRzFCO0FBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBS3BCLE1BQU0sT0FBTywwQkFBMEI7SUFXSTtJQVZ6QyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ1IsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUNmLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDUixPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2IsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNaLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDaEIsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUNyQixNQUFNLEdBQUcsSUFBSSxN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O1lBQ2YsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO3VHQTlNVSwwQkFBMEIsa0JBV2pCLFdBQVc7MkdBWHBCLDBCQUEwQixjQUZ6QixNQUFNOzsyRkFFUCwwQkFBMEI7a0JBSHRDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFZYyxNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQTEFURk9STV9JRCwgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCAqIGFzIENvbnN0YW50cyBmcm9tICcuL2RldmljZS1kZXRlY3Rvci5jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBSZVRyZWUgfSBmcm9tICcuL3JldHJlZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERldmljZUluZm8ge1xyXG4gIHVzZXJBZ2VudDogc3RyaW5nO1xyXG4gIG9zOiBzdHJpbmc7XHJcbiAgYnJvd3Nlcjogc3RyaW5nO1xyXG4gIGRldmljZTogc3RyaW5nO1xyXG4gIG9zX3ZlcnNpb246IHN0cmluZztcclxuICBicm93c2VyX3ZlcnNpb246IHN0cmluZztcclxuICBkZXZpY2VUeXBlOiBzdHJpbmc7XHJcbiAgb3JpZW50YXRpb246IHN0cmluZztcclxufVxyXG5leHBvcnQgZW51bSBEZXZpY2VUeXBlIHtcclxuICBNb2JpbGUgPSAnbW9iaWxlJyxcclxuICBUYWJsZXQgPSAndGFibGV0JyxcclxuICBEZXNrdG9wID0gJ2Rlc2t0b3AnLFxyXG4gIFVua25vd24gPSAndW5rbm93bicsXHJcbn1cclxuZXhwb3J0IGVudW0gT3JpZW50YXRpb25UeXBlIHtcclxuICBQb3J0cmFpdCA9ICdwb3J0cmFpdCcsXHJcbiAgTGFuZHNjYXBlID0gJ2xhbmRzY2FwZScsXHJcbn1cclxuXHJcbmNvbnN0IGlQYWQgPSAnaVBhZCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUm1OZ0RldmljZURldGVjdGlvblNlcnZpY2Uge1xyXG4gIHVhID0gJyc7XHJcbiAgdXNlckFnZW50ID0gJyc7XHJcbiAgb3MgPSAnJztcclxuICBicm93c2VyID0gJyc7XHJcbiAgZGV2aWNlID0gJyc7XHJcbiAgb3NfdmVyc2lvbiA9ICcnO1xyXG4gIGJyb3dzZXJfdmVyc2lvbiA9ICcnO1xyXG4gIHJlVHJlZSA9IG5ldyBSZVRyZWUoKTtcclxuICBkZXZpY2VUeXBlID0gJyc7XHJcbiAgb3JpZW50YXRpb24gPSAnJztcclxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IGFueSkge1xyXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgdGhpcy51c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0RGV2aWNlSW5mbyh0aGlzLnVzZXJBZ2VudCk7XHJcbiAgfVxyXG5cclxuICBzZXREZXZpY2VJbmZvKHVhID0gdGhpcy51c2VyQWdlbnQpOiB2b2lkIHtcclxuICAgIGlmICh1YSAhPT0gdGhpcy51c2VyQWdlbnQpIHtcclxuICAgICAgdGhpcy51c2VyQWdlbnQgPSB1YTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1hcHBpbmdzOiB7XHJcbiAgICAgIGNvbnN0OiBrZXlvZiB0eXBlb2YgQ29uc3RhbnRzO1xyXG4gICAgICBwcm9wOiBrZXlvZiBSbU5nRGV2aWNlRGV0ZWN0aW9uU2VydmljZTtcclxuICAgIH1bXSA9IFtcclxuICAgICAgeyBjb25zdDogJ09TJywgcHJvcDogJ29zJyB9LFxyXG4gICAgICB7IGNvbnN0OiAnQlJPV1NFUlMnLCBwcm9wOiAnYnJvd3NlcicgfSxcclxuICAgICAgeyBjb25zdDogJ0RFVklDRVMnLCBwcm9wOiAnZGV2aWNlJyB9LFxyXG4gICAgICB7IGNvbnN0OiAnT1NfVkVSU0lPTlMnLCBwcm9wOiAnb3NfdmVyc2lvbicgfSxcclxuICAgIF07XHJcblxyXG4gICAgbWFwcGluZ3MuZm9yRWFjaCgobWFwcGluZykgPT4ge1xyXG4gICAgICB0aGlzW21hcHBpbmcucHJvcF0gPSBPYmplY3Qua2V5cyhcclxuICAgICAgICBDb25zdGFudHNbbWFwcGluZy5jb25zdCBhcyBrZXlvZiB0eXBlb2YgQ29uc3RhbnRzXSxcclxuICAgICAgKS5yZWR1Y2UoKG9iajogYW55LCBpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBDb25zdGFudHNbbWFwcGluZy5jb25zdCBhcyBrZXlvZiB0eXBlb2YgQ29uc3RhbnRzXVtpdGVtXSA9PT0gJ2RldmljZSdcclxuICAgICAgICApIHtcclxuICAgICAgICAgIC8vIGhhY2sgZm9yIGlPUyAxMyBUYWJsZXRcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSAmJlxyXG4gICAgICAgICAgICAoISF0aGlzLnJlVHJlZS50ZXN0KHRoaXMudXNlckFnZW50LCBDb25zdGFudHMuVEFCTEVUU19SRVtpUGFkXSkgfHxcclxuICAgICAgICAgICAgICAobmF2aWdhdG9yLnBsYXRmb3JtID09PSAnTWFjSW50ZWwnICYmXHJcbiAgICAgICAgICAgICAgICBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKSlcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBvYmpbQ29uc3RhbnRzW21hcHBpbmcuY29uc3QgYXMga2V5b2YgdHlwZW9mIENvbnN0YW50c11baXRlbV1dID1cclxuICAgICAgICAgICAgICBpUGFkO1xyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBvYmpbQ29uc3RhbnRzW21hcHBpbmcuY29uc3QgIGFzIGtleW9mIHR5cGVvZiBDb25zdGFudHNdW2l0ZW1dXSA9IHRoaXMucmVUcmVlLnRlc3QodWEsIENvbnN0YW50c1tgJHttYXBwaW5nLmNvbnN0fV9SRWBdW2l0ZW1dKTtcclxuICAgICAgICBvYmpbQ29uc3RhbnRzW21hcHBpbmcuY29uc3QgYXMga2V5b2YgdHlwZW9mIENvbnN0YW50c11baXRlbV1dID0gdGhpcy5yZVRyZWUudGVzdCh1YSwgQ29uc3RhbnRzW2Ake21hcHBpbmcuY29uc3R9X1JFYCBhcyBrZXlvZiB0eXBlb2YgQ29uc3RhbnRzXVtpdGVtXSk7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgfSwge30pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gbWFwcGluZ3MuZm9yRWFjaChtYXBwaW5nID0+IHtcclxuICAgIC8vICAgdGhpc1ttYXBwaW5nLnByb3BdID0gT2JqZWN0LmtleXMoQ29uc3RhbnRzW21hcHBpbmcuY29uc3QgIGFzIGtleW9mIHR5cGVvZiBDb25zdGFudHNdKVxyXG4gICAgLy8gICAgIC5tYXAoa2V5ID0+IHtcclxuICAgIC8vICAgICAgIHJldHVybiBDb25zdGFudHNbbWFwcGluZy5jb25zdCAgYXMga2V5b2YgdHlwZW9mIENvbnN0YW50c11ba2V5XTtcclxuICAgIC8vICAgICB9KVxyXG4gICAgLy8gICAgIC5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xyXG4gICAgLy8gICAgICAgaWYgKG1hcHBpbmcucHJvcCA9PT0gJ2RldmljZScgJiYgcHJldmlvdXNWYWx1ZSA9PT0gQ29uc3RhbnRzW21hcHBpbmcuY29uc3QgIGFzIGtleW9mIHR5cGVvZiBDb25zdGFudHNdLkFORFJPSUQpIHtcclxuICAgIC8vICAgICAgICAgLy8gaWYgd2UgaGF2ZSB0aGUgYWN0dWFsIGRldmljZSBmb3VuZCwgaW5zdGVhZCBvZiAnQW5kcm9pZCcsIHJldHVybiB0aGUgYWN0dWFsIGRldmljZVxyXG4gICAgLy8gICAgICAgICByZXR1cm4gdGhpc1ttYXBwaW5nLnByb3BdW2N1cnJlbnRWYWx1ZV0gPyBjdXJyZW50VmFsdWUgOiBwcmV2aW91c1ZhbHVlO1xyXG4gICAgLy8gICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIHByZXZpb3VzVmFsdWUgPT09IENvbnN0YW50c1ttYXBwaW5nLmNvbnN0ICBhcyBrZXlvZiB0eXBlb2YgQ29uc3RhbnRzXS5VTktOT1dOICYmIHRoaXNbbWFwcGluZy5wcm9wXVtjdXJyZW50VmFsdWVdXHJcbiAgICAvLyAgICAgICAgICAgPyBjdXJyZW50VmFsdWVcclxuICAgIC8vICAgICAgICAgICA6IHByZXZpb3VzVmFsdWU7XHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgfSwgQ29uc3RhbnRzW21hcHBpbmcuY29uc3QgIGFzIGtleW9mIHR5cGVvZiBDb25zdGFudHNdLlVOS05PV04pO1xyXG4gICAgLy8gfSk7XHJcblxyXG4gICAgLy8gbWFwcGluZ3MuZm9yRWFjaChtYXBwaW5nID0+IHtcclxuICAgIC8vICAgY29uc3QgcHJvcCA9IHRoaXNbbWFwcGluZy5wcm9wXTtcclxuXHJcbiAgICAvLyAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ29iamVjdCcgJiYgcHJvcCAhPT0gbnVsbCkge1xyXG4gICAgLy8gICAgIHRoaXNbbWFwcGluZy5wcm9wXSA9IE9iamVjdC5rZXlzKENvbnN0YW50c1ttYXBwaW5nLmNvbnN0IGFzIGtleW9mIHR5cGVvZiBDb25zdGFudHNdKVxyXG4gICAgLy8gICAgICAgLm1hcChrZXkgPT4ge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gQ29uc3RhbnRzW21hcHBpbmcuY29uc3QgYXMga2V5b2YgdHlwZW9mIENvbnN0YW50c11ba2V5XTtcclxuICAgIC8vICAgICAgIH0pXHJcbiAgICAvLyAgICAgICAucmVkdWNlKChwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUpID0+IHtcclxuICAgIC8vICAgICAgICAgaWYgKG1hcHBpbmcucHJvcCA9PT0gJ2RldmljZScgJiYgcHJldmlvdXNWYWx1ZSA9PT0gQ29uc3RhbnRzW21hcHBpbmcuY29uc3QgYXMga2V5b2YgdHlwZW9mIENvbnN0YW50c10uQU5EUk9JRCkge1xyXG4gICAgLy8gICAgICAgICAgIHJldHVybiBwcm9wW2N1cnJlbnRWYWx1ZV0gPyBjdXJyZW50VmFsdWUgOiBwcmV2aW91c1ZhbHVlO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgIHJldHVybiBwcmV2aW91c1ZhbHVlID09PSBDb25zdGFudHNbbWFwcGluZy5jb25zdCBhcyBrZXlvZiB0eXBlb2YgQ29uc3RhbnRzXS5VTktOT1dOICYmIHByb3BbY3VycmVudFZhbHVlXVxyXG4gICAgLy8gICAgICAgICAgICAgPyBjdXJyZW50VmFsdWVcclxuICAgIC8vICAgICAgICAgICAgIDogcHJldmlvdXNWYWx1ZTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSwgQ29uc3RhbnRzW21hcHBpbmcuY29uc3QgYXMga2V5b2YgdHlwZW9mIENvbnN0YW50c10uVU5LTk9XTik7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pO1xyXG5cclxuXHJcbiAgICBtYXBwaW5ncy5mb3JFYWNoKChtYXBwaW5nKSA9PiB7XHJcbiAgICAgIC8vIENhc3QgYHRoaXNbbWFwcGluZy5wcm9wXWAgYXMgYW4gb2JqZWN0IHdpdGggc3RyaW5nIGtleXMgYW5kIGFueSB2YWx1ZXNcclxuICAgICAgY29uc3QgcHJvcCA9IHRoaXNbbWFwcGluZy5wcm9wXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG5cclxuICAgICAgLy8gQ2FzdCBDb25zdGFudHNbbWFwcGluZy5jb25zdF0gdG8gdGhlIGV4cGVjdGVkIHR5cGVcclxuICAgICAgY29uc3QgY29uc3RhbnRzTWFwcGluZyA9IENvbnN0YW50c1tcclxuICAgICAgICBtYXBwaW5nLmNvbnN0IGFzIGtleW9mIHR5cGVvZiBDb25zdGFudHNcclxuICAgICAgXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG5cclxuICAgICAgLy8gRW5zdXJlIGBtYXBwaW5nLnByb3BgIGlzIGFuIG9iamVjdCBhbmQgbm90IG51bGxcclxuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnb2JqZWN0JyAmJiBwcm9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpc1ttYXBwaW5nLnByb3BdID0gT2JqZWN0LmtleXMoY29uc3RhbnRzTWFwcGluZylcclxuICAgICAgICAgIC5tYXAoKGtleSkgPT4gY29uc3RhbnRzTWFwcGluZ1trZXldKVxyXG4gICAgICAgICAgLnJlZHVjZShcclxuICAgICAgICAgICAgKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIG1hcHBpbmcucHJvcCA9PT0gJ2RldmljZScgJiZcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzVmFsdWUgPT09XHJcbiAgICAgICAgICAgICAgICAgIENvbnN0YW50c1ttYXBwaW5nLmNvbnN0IGFzIGtleW9mIHR5cGVvZiBDb25zdGFudHNdLkFORFJPSURcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgYWN0dWFsIGRldmljZSBpZiBmb3VuZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BbY3VycmVudFZhbHVlXSA/IGN1cnJlbnRWYWx1ZSA6IHByZXZpb3VzVmFsdWU7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgY3VycmVudFZhbHVlIGlmIGl04oCZcyBmb3VuZCBpbiBgcHJvcGBcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1ZhbHVlID09PVxyXG4gICAgICAgICAgICAgICAgICBDb25zdGFudHNbbWFwcGluZy5jb25zdCBhcyBrZXlvZiB0eXBlb2YgQ29uc3RhbnRzXS5VTktOT1dOICYmXHJcbiAgICAgICAgICAgICAgICAgIHByb3BbY3VycmVudFZhbHVlXVxyXG4gICAgICAgICAgICAgICAgICA/IGN1cnJlbnRWYWx1ZVxyXG4gICAgICAgICAgICAgICAgICA6IHByZXZpb3VzVmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBDb25zdGFudHNbbWFwcGluZy5jb25zdCBhcyBrZXlvZiB0eXBlb2YgQ29uc3RhbnRzXS5VTktOT1dOLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5icm93c2VyX3ZlcnNpb24gPSAnMCc7XHJcbiAgICBpZiAodGhpcy5icm93c2VyICE9PSBDb25zdGFudHMuQlJPV1NFUlMuVU5LTk9XTikge1xyXG4gICAgICBjb25zdCByZSA9IENvbnN0YW50cy5CUk9XU0VSX1ZFUlNJT05TX1JFW3RoaXMuYnJvd3Nlcl07XHJcbiAgICAgIGNvbnN0IHJlcyA9IHRoaXMucmVUcmVlLmV4ZWModWEsIHJlKTtcclxuICAgICAgaWYgKCEhcmVzKSB7XHJcbiAgICAgICAgdGhpcy5icm93c2VyX3ZlcnNpb24gPSByZXNbMV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cgJiYgd2luZG93Lm1hdGNoTWVkaWEpIHtcclxuICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IHdpbmRvdy5tYXRjaE1lZGlhKCcob3JpZW50YXRpb246IGxhbmRzY2FwZSknKS5tYXRjaGVzXHJcbiAgICAgICAgPyBPcmllbnRhdGlvblR5cGUuTGFuZHNjYXBlXHJcbiAgICAgICAgOiBPcmllbnRhdGlvblR5cGUuUG9ydHJhaXQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9yaWVudGF0aW9uID0gQ29uc3RhbnRzLkdFTkVSQUwuVUtOT1dOO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGV2aWNlVHlwZSA9IHRoaXMuaXNUYWJsZXQoKVxyXG4gICAgICA/IERldmljZVR5cGUuVGFibGV0XHJcbiAgICAgIDogdGhpcy5pc01vYmlsZSh0aGlzLnVzZXJBZ2VudClcclxuICAgICAgICA/IERldmljZVR5cGUuTW9iaWxlXHJcbiAgICAgICAgOiB0aGlzLmlzRGVza3RvcCh0aGlzLnVzZXJBZ2VudClcclxuICAgICAgICAgID8gRGV2aWNlVHlwZS5EZXNrdG9wXHJcbiAgICAgICAgICA6IERldmljZVR5cGUuVW5rbm93bjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREZXZpY2VJbmZvKCk6IERldmljZUluZm8ge1xyXG4gICAgY29uc3QgZGV2aWNlSW5mbzogRGV2aWNlSW5mbyA9IHtcclxuICAgICAgdXNlckFnZW50OiB0aGlzLnVzZXJBZ2VudCxcclxuICAgICAgb3M6IHRoaXMub3MsXHJcbiAgICAgIGJyb3dzZXI6IHRoaXMuYnJvd3NlcixcclxuICAgICAgZGV2aWNlOiB0aGlzLmRldmljZSxcclxuICAgICAgb3NfdmVyc2lvbjogdGhpcy5vc192ZXJzaW9uLFxyXG4gICAgICBicm93c2VyX3ZlcnNpb246IHRoaXMuYnJvd3Nlcl92ZXJzaW9uLFxyXG4gICAgICBkZXZpY2VUeXBlOiB0aGlzLmRldmljZVR5cGUsXHJcbiAgICAgIG9yaWVudGF0aW9uOiB0aGlzLm9yaWVudGF0aW9uLFxyXG4gICAgfTtcclxuICAgIHJldHVybiBkZXZpY2VJbmZvO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzTW9iaWxlKHVzZXJBZ2VudCA9IHRoaXMudXNlckFnZW50KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5pc1RhYmxldCh1c2VyQWdlbnQpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1hdGNoID0gT2JqZWN0LmtleXMoQ29uc3RhbnRzLk1PQklMRVNfUkUpLmZpbmQoKG1vYmlsZSkgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZVRyZWUudGVzdCh1c2VyQWdlbnQsIChDb25zdGFudHMuTU9CSUxFU19SRSBhcyBhbnkpW21vYmlsZV0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gISFtYXRjaDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1RhYmxldCh1c2VyQWdlbnQgPSB0aGlzLnVzZXJBZ2VudCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKFxyXG4gICAgICBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpICYmXHJcbiAgICAgICghIXRoaXMucmVUcmVlLnRlc3QodGhpcy51c2VyQWdlbnQsIENvbnN0YW50cy5UQUJMRVRTX1JFW2lQYWRdKSB8fFxyXG4gICAgICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgICAgbmF2aWdhdG9yLnBsYXRmb3JtID09PSAnTWFjSW50ZWwnICYmXHJcbiAgICAgICAgICBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKSlcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1hdGNoID0gT2JqZWN0LmtleXMoQ29uc3RhbnRzLlRBQkxFVFNfUkUpLmZpbmQoKG1vYmlsZSkgPT4ge1xyXG4gICAgICByZXR1cm4gISF0aGlzLnJlVHJlZS50ZXN0KFxyXG4gICAgICAgIHVzZXJBZ2VudCxcclxuICAgICAgICAoQ29uc3RhbnRzLlRBQkxFVFNfUkUgYXMgYW55KVttb2JpbGVdLFxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gISFtYXRjaDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0Rlc2t0b3AodXNlckFnZW50ID0gdGhpcy51c2VyQWdlbnQpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmRldmljZSA9PT0gQ29uc3RhbnRzLkRFVklDRVMuVU5LTk9XTikge1xyXG4gICAgICBpZiAodGhpcy5pc01vYmlsZSh1c2VyQWdlbnQpIHx8IHRoaXMuaXNUYWJsZXQodXNlckFnZW50KSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIENvbnN0YW50cy5ERVNLVE9QX0RFVklDRVMuaW5kZXhPZih0aGlzLmRldmljZSkgPiAtMTtcclxuICB9XHJcbn1cclxuIl19 \ No newline at end of file diff --git a/esm2022/public-api.mjs b/esm2022/public-api.mjs new file mode 100644 index 0000000..2679564 --- /dev/null +++ b/esm2022/public-api.mjs @@ -0,0 +1,6 @@ +/* + * Public API Surface of rm-ng-device-detection + */ +export * from './lib/rm-ng-device-detection.service'; +export * from './lib/retree'; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3JtLW5nLWRldmljZS1kZXRlY3Rpb24vc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIHJtLW5nLWRldmljZS1kZXRlY3Rpb25cclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9ybS1uZy1kZXZpY2UtZGV0ZWN0aW9uLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9yZXRyZWUnO1xyXG4iXX0= \ No newline at end of file diff --git a/esm2022/rm-ng-device-detection.mjs b/esm2022/rm-ng-device-detection.mjs new file mode 100644 index 0000000..c18afd7 --- /dev/null +++ b/esm2022/rm-ng-device-detection.mjs @@ -0,0 +1,5 @@ +/** + * Generated bundle index. Do not edit. + */ +export * from './public-api'; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm0tbmctZGV2aWNlLWRldGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3JtLW5nLWRldmljZS1kZXRlY3Rpb24vc3JjL3JtLW5nLWRldmljZS1kZXRlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ== \ No newline at end of file diff --git a/fesm2022/rm-ng-device-detection.mjs b/fesm2022/rm-ng-device-detection.mjs new file mode 100644 index 0000000..0a36231 --- /dev/null +++ b/fesm2022/rm-ng-device-detection.mjs @@ -0,0 +1,856 @@ +import * as i0 from '@angular/core'; +import { PLATFORM_ID, Injectable, Inject } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; + +const GENERAL = { + UKNOWN: 'Unknown', +}; +const BROWSERS = { + CHROME: 'Chrome', + FIREFOX: 'Firefox', + SAFARI: 'Safari', + OPERA: 'Opera', + IE: 'IE', + MS_EDGE: 'MS-Edge', + MS_EDGE_CHROMIUM: 'MS-Edge-Chromium', + FB_MESSANGER: 'FB-Messanger', + SAMSUNG: 'Samsung', + UCBROWSER: 'UC-Browser', + UNKNOWN: GENERAL.UKNOWN, +}; +const MOBILES_RE = { + // tslint:disable-next-line:max-line-length + HTC: /HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel/, + NEXUS_PHONE: /Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6/, + DELL: /Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b/, + MOTOROLA: new RegExp(`Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853| + A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511| + MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600| + ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435| + WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611| + XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909| + XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\bMoto E\\b|XT1068|XT1092|XT1052`), + SAMSUNG: new RegExp(`\\bSamsung\\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710| + GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320| + GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I| + GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500| + GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070| + GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130| + GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100| + GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652| + GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410| + GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703| + GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103| + GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603| + GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770| + GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270| + GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600| + GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102| + GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562| + GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630| + SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100| + SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830| + SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410| + SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450| + SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740| + SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137| + SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597| + SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767| + SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927| + SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170| + SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357| + SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335| + SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577| + SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777| + SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937| + SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600| + SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777| + SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219| + SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369| + SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539| + SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719| + SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929| + SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120| + SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630| + SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400| + SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790| + SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720| + SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240| + SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550| + SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910| + SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100| + GT-N7105|SCH-I535|SM-N900A|SM-N900T|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312| + GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560| + GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F| + SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V| + SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F| + SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F|SM-J330F`), + LG: new RegExp(`\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970| + LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272| + C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510| + LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271| + VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802| + MS323|M257)`), + SONY: /SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533/, + ASUS: /Asus.*Galaxy|PadFone.*Mobile/, + NOKIA_LUMIA: /Lumia [0-9]{3,4}/, + MICROMAX: /Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b/, + PALM: /PalmSource|Palm/, + VERTU: /Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature/, + PANTECH: new RegExp(`PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K| + IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L| + IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000| + CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020| + P2000|P7040|P7000|C790`), + FLY: /IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250/, + WIKO: new RegExp(`KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM| + SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +| + CINK KING|CINK PEAX|CINK SLIM|SUBLIM`), + I_MOBILE: /i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)/, + SIMVALLEY: /\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b/, + WOLFGANG: /AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q/, + ALCATEL: /Alcatel|Mobile; rv:49.0|Mobile; ALCATEL 4052R; rv:48.0/, + NINTENDO: /Nintendo (3DS|Switch)/, + AMOI: /Amoi/, + INQ: /INQ/, + VITA: /\bVita\b/, + BLACKBERRY: /\bBlackBerry\b|\bBB10\b|rim[0-9]+/, + FIREFOX_OS: /\bFirefox-OS\b/, + IPHONE: /\biPhone\b/, + iPod: /\biPod\b/, + ANDROID: /\bAndroid\b/, + WINDOWS_PHONE: /\bWindows-Phone\b/, + GENERIC_PHONE: new RegExp(`Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser| + up.link|vodafone|\\bwap\\b|nokia|Nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser`), +}; +const TABLETS_RE = { + iPad: /iPad|iPad.*Mobile/, + NexusTablet: /Android.*Nexus[\s]+(7|9|10)/, + GoogleTablet: /Android.*Pixel C/, + SamsungTablet: new RegExp(`SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210| + GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905| + SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100| + GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705| + SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201| + GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L| + SHV-E230S|SHW-M180K|SHW-M180L|SM-T865|SM-T290|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W| + SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925| + GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T385M|SM-P585M|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600| + SM-P601|SM-P605|SM-P615|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110| + GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321| + SM-T510|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V| + SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T500|SM-T330| + SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A| + SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550| + SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533| + SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713| + SM-T719|SM-T725|SM-T813|SM-T819|SM-T580|SM-T590|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350| + SM-P555M|SM-P355M|SM-T113NU|SM-T815Y|SM-T585|SM-T285|SM-T825|SM-W708|SM-T835|SM-P585Y|SM-X200|SM-T970`), + Kindle: new RegExp(`Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI| + KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\\b|Android.*Silk\/[0-9.]+ like Chrome\ + /[0-9.]+ (?!Mobile)`), + SurfaceTablet: /Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)/, + HPTablet: /HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10/, + AsusTablet: new RegExp(`^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL| + TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C| + Slider SL101|\\bK00F\\b|\\bK00C\\b|\\bK00E\\b|\\bK00L\\b|TX201LA|ME176C|ME102A|\\bM80TA\\b|ME372CL| + ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\\bME70C\\b|ME581C| + ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\\bP027\\b|\\bP024\\b|\\bP00C\\b`), + BlackBerryTablet: /PlayBook|RIM Tablet/, + HTCtablet: /HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410/, + MotorolaTablet: /xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617/, + NookTablet: /Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2/, + AcerTablet: new RegExp(`Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501| + W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\b|W3-810|\\bA3-A10\\b|\\bA3-A11\\b| + \\bA3-A20\\b|\\bA3-A30`), + ToshibaTablet: /Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO/, + LGTablet: /\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b/, + FujitsuTablet: /Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b/, + PrestigioTablet: new RegExp(`PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C| + PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D| + PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D| + PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008| + PMT5887|PMT5001|PMT5002`), + LenovoTablet: new RegExp(`Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F| + YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000| + B8000|B8080)(-|)(FL|F|HV|H|)|TB-X606F|TB-X103F|TB-X304F|TB-X304L|TB-X704F|TB-8703F|Tab2A7-10F|TB2-X30L|TB-8504F`), + DellTablet: /Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7/, + YarvikTablet: new RegExp(`Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411| + TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151| + TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485| + TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211| + TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b`), + MedionTablet: /Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB/, + ArnovaTablet: /97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2/, + IntensoTablet: /INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004/, + IRUTablet: /M702pro/, + MegafonTablet: /MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b/, + EbodaTablet: /E-Boda (Supreme|Impresspeed|Izzycomm|Essential)/, + AllViewTablet: /Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)/, + ArchosTablet: new RegExp(`\\b(101G9|80G9|A101IT)\\b|Qilive 97R|Archos5|\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| + Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\b`), + AinolTablet: /NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark/, + NokiaLumiaTablet: /Lumia 2520/, + SonyTablet: new RegExp(`Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123| + SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101| + EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP641|SGP612|SOT31|SGP771|SGP611| + SGP612|SGP712`), + PhilipsTablet: /\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b/, + CubeTablet: /Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT/, + CobyTablet: new RegExp(`MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048| + MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010`), + MIDTablet: new RegExp(`M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933| + MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737| + MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10`), + MSITablet: new RegExp(`MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81| + Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b`), + SMiTTablet: /Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)/, + RockChipTablet: /Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A/, + FlyTablet: /IQ310|Fly Vision/, + bqTablet: new RegExp(`Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton| + Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))|Maxwell.*Lite|Maxwell.*Plus`), + HuaweiTablet: new RegExp(`MediaPad|MediaPad 7 Youth|MediaPad T3 10|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106| + S7-201|S7-Slim|M2-A01L|BAH-L09|BAH-W09|AGS-W09|AGS-L09`), + NecTablet: /\bN-06D|\bN-08D/, + PantechTablet: /Pantech.*P4100/, + BronchoTablet: /Broncho.*(N701|N708|N802|a710)/, + VersusTablet: /TOUCHPAD.*[78910]|\bTOUCHTAB\b/, + ZyncTablet: /z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900/, + PositivoTablet: /TB07STA|TB10STA|TB07FTA|TB10FTA/, + NabiTablet: /Android.*\bNabi/, + KoboTablet: /Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build/, + DanewTablet: /DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b/, + TexetTablet: new RegExp(`NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047| + TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025| + TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A| + TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD| + TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD| + TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446| + TB-436|TB-416|TB-146SE|TB-126SE`), + PlaystationTablet: /Playstation.*(Portable|Vita)/, + TrekstorTablet: /ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab/, + PyleAudioTablet: /\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b/, + AdvanTablet: new RegExp(`Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci| + T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b`), + DanyTechTablet: `Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II| + Genius TAB GII|Genius TAB GIII|Genius Tab S1`, + GalapadTablet: /Android.*\bG1\b(?!\))/, + MicromaxTablet: /Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b/, + KarbonnTablet: /Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b/, + AllFineTablet: /Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide/, + PROSCANTablet: new RegExp(`\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030| + PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G| + PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088| + PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b`), + YONESTablet: /BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026/, + ChangJiaTablet: new RegExp(`TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709| + TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103| + TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106| + TPC10111|TPC10203|TPC10205|TPC10503`), + GUTablet: /TX-A1301|TX-M9002|Q702|kf026/, + PointOfViewTablet: new RegExp(`TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N| + TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+| + TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL| + TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10`), + OvermaxTablet: new RegExp(`OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab| + MagicTab|Stream|TB-08|TB-09)|Qualcore 1027`), + HCLTablet: /HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync/, + DPSTablet: /DPS Dream 9|DPS Dual 7/, + VistureTablet: /V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10/, + CrestaTablet: /CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989/, + MediatekTablet: /\bMT8125|MT8389|MT8135|MT8377\b/, + ConcordeTablet: /Concorde([ ]+)?Tab|ConCorde ReadMan/, + GoCleverTablet: new RegExp(`GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G| + TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721| + GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72| + TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2| + TAB R104|TAB R83.3|TAB A1042`), + ModecomTablet: new RegExp(`FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014| + FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801| + FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003`), + VoninoTablet: new RegExp(`\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z| + Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD| + Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b`), + ECSTablet: /V07OT2|TM105A|S10OT1|TR10CS1/, + StorexTablet: /eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab/, + VodafoneTablet: /SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497/, + EssentielBTablet: /Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2/, + RossMoorTablet: /RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711/, + iMobileTablet: /i-mobile i-note/, + TolinoTablet: /tolino tab [0-9.]+|tolino shine/, + AudioSonicTablet: /\bC-22Q|T7-QC|T-17B|T-17P\b/, + AMPETablet: /Android.* A78 /, + SkkTablet: /Android.* (SKYPAD|PHOENIX|CYCLOPS)/, + TecnoTablet: /TECNO P9|TECNO DP8D/, + JXDTablet: new RegExp(`Android.* \\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300| + S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908| + P1000|P300|S18|S6600|S9100)\\b`), + iJoyTablet: new RegExp(`Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon| + Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel| + Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity| + Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II| + Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)`), + FX2Tablet: /FX2 PAD7|FX2 PAD10/, + XoroTablet: new RegExp(`KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721| + PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR| + PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730| + TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151`), + ViewsonicTablet: /ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a/, + VerizonTablet: /QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1/, + OdysTablet: /LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10/, + CaptivaTablet: /CAPTIVA PAD/, + IconbitTablet: new RegExp(`NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C| + NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S`), + TeclastTablet: new RegExp(`T98 4G|\\bP80\\b|\\bX90HD\\b|X98 Air|X98 Air 3G|\\bX89\\b|P80 3G|\\bX80h\\b|P98 Air| + \\bX89HD\\b|P98 3G|\\bP90HD\\b|P89 3G|X98 3G|\\bP70h\\b|P79HD 3G|G18d 3G|\\bP79HD\\b|\\bP89s\\b|\\bA88\\b| + \\bP10HD\\b|\\bP19HD\\b|G18 3G|\\bP78HD\\b|\\bA78\\b|\\bP75\\b|G17s 3G|G17h 3G|\\bP85t\\b|\\bP90\\b| + \\bP11\\b|\\bP98t\\b|\\bP98HD\\b|\\bG18d\\b|\\bP85s\\b|\\bP11HD\\b|\\bP88s\\b|\\bA80HD\\b|\\bA80se\\b| + \\bA10h\\b|\\bP89\\b|\\bP78s\\b|\\bG18\\b|\\bP85\\b|\\bA70h\\b|\\bA70\\b|\\bG17\\b|\\bP18\\b|\\bA80s\\b| + \\bA11s\\b|\\bP88HD\\b|\\bA80h\\b|\\bP76s\\b|\\bP76h\\b|\\bP98\\b|\\bA10HD\\b|\\bP78\\b|\\bP88\\b|\\bA11\\b| + \\bA10t\\b|\\bP76a\\b|\\bP76t\\b|\\bP76e\\b|\\bP85HD\\b|\\bP85a\\b|\\bP86\\b|\\bP75HD\\b|\\bP76v\\b|\\bA12\\b| + \\bP75a\\b|\\bA15\\b|\\bP76Ti\\b|\\bP81HD\\b|\\bA10\\b|\\bT760VE\\b|\\bT720HD\\b|\\bP76\\b|\\bP73\\b|\\bP71\\b| + \\bP72\\b|\\bT720SE\\b|\\bC520Ti\\b|\\bT760\\b|\\bT720VE\\b|T720-3GE|T720-WiFi`), + OndaTablet: new RegExp(`\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10| + V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819| + V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973| + Vi40)\\b[\s]+|V10 \\b4G\\b`), + JaytechTablet: /TPC-PA762/, + BlaupunktTablet: /Endeavour 800NG|Endeavour 1010/, + DigmaTablet: /\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b/, + EvolioTablet: /ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b/, + LavaTablet: /QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b/, + AocTablet: /MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712/, + MpmanTablet: new RegExp(`MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780| + \\bMPG7\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110| + MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010`), + CelkonTablet: /CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b/, + WolderTablet: new RegExp(`miTab \\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS| + POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK| + FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\b`), + MediacomTablet: 'M-MPI10C3G|M-SP10EG|M-SP10EGP|M-SP10HXAH|M-SP7HXAH|M-SP10HXBH|M-SP8HXAH|M-SP8MXA', + MiTablet: /\bMI PAD\b|\bHM NOTE 1W\b/, + NibiruTablet: /Nibiru M1|Nibiru Jupiter One/, + NexoTablet: /NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI/, + LeaderTablet: new RegExp(`TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I| + TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100`), + UbislateTablet: /UbiSlate[\s]?7C/, + PocketBookTablet: /Pocketbook/, + KocasoTablet: /\b(TB-1207)\b/, + HisenseTablet: /\b(F5281|E2371)\b/, + Hudl: /Hudl HT7S3|Hudl 2/, + TelstraTablet: /T-Hub2/, + Honeywell: /RT10A/, + GenericTablet: new RegExp(`Android.*\\b97D\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8| + A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010| + Tablet-PC-4|Tagi Tab|\\bM6pro\\b|CT1020W|arc 10HD|\\bTP750\\b|\\bQTAQZ3\\b|WVT101|TM1088|KT107`), +}; +const DEVICES = { + BLACKBERRY: 'Blackberry', + FIREFOX_OS: 'Firefox-OS', + CHROME_BOOK: 'Chrome-Book', + WINDOWS_PHONE: 'Windows-Phone', + VITA: 'Vita', + PS4: 'PS4', + MAC: 'Macintosh', + CHROMECAST: 'Chromecast', + APPLE_TV: 'Apple-TV', + GOOGLE_TV: 'Google-TV', + ANDROID: 'Android', + Tesla: 'Tesla', + iPad: 'iPad', + IPHONE: 'iPhone', + iPod: 'iPod', + UNKNOWN: GENERAL.UKNOWN, + HTC: 'HTC', + NEXUS_PHONE: 'Nexus Phone', + NexusTablet: 'Nexus Tablet', + DELL: 'Dell', + MOTOROLA: 'Motorola', + SAMSUNG: 'Samsung', + LG: 'LG', + SONY: 'Sony', + ASUS: 'Asus', + NOKIA_LUMIA: 'Nokia Lumia', + MICROMAX: 'Micromax', + PALM: 'Palm', + VERTU: 'Vertu', + PANTECH: 'PANTECH', + FLY: 'Fly', + WIKO: `WIKO`, + I_MOBILE: 'i-mobile', + SIMVALLEY: 'Simvalley', + WOLFGANG: 'Wolfgang', + ALCATEL: 'Alcatel', + HONEYWELL: 'Honeywell', + NINTENDO: 'Nintendo', + AMOI: 'Amoi', + INQ: 'INQ', + GENERIC_PHONE: 'Generic Phone', + MI_SE_9: 'Mi SE 9', +}; +const DESKTOP_DEVICES = [ + DEVICES.PS4, + DEVICES.CHROME_BOOK, + DEVICES.MAC, + DEVICES.DELL, + DEVICES.ASUS, + DEVICES.UNKNOWN, +]; +const OS = { + WINDOWS: 'Windows', + MAC: 'Mac', + IOS: 'iOS', + ANDROID: 'Android', + LINUX: 'Linux', + UNIX: 'Unix', + FIREFOX_OS: 'Firefox-OS', + CHROME_OS: 'Chrome-OS', + WINDOWS_PHONE: 'Windows-Phone', + UNKNOWN: GENERAL.UKNOWN, +}; +const OS_VERSIONS = { + WINDOWS_3_11: 'windows-3-11', + WINDOWS_95: 'windows-95', + WINDOWS_ME: 'windows-me', + WINDOWS_98: 'windows-98', + WINDOWS_CE: 'windows-ce', + WINDOWS_2000: 'windows-2000', + WINDOWS_XP: 'windows-xp', + WINDOWS_SERVER_2003: 'windows-server-2003', + WINDOWS_VISTA: 'windows-vista', + WINDOWS_7: 'windows-7', + WINDOWS_8_1: 'windows-8-1', + WINDOWS_8: 'windows-8', + WINDOWS_10: 'windows-10', + WINDOWS_PHONE_7_5: 'windows-phone-7-5', + WINDOWS_PHONE_8_1: 'windows-phone-8-1', + WINDOWS_PHONE_10: 'windows-phone-10', + WINDOWS_NT_4_0: 'windows-nt-4-0', + MACOSX_11_0: 'mac-os-x-11-0', + MACOSX_16: 'mac-os-x-16', + MACOSX_15: 'mac-os-x-15', + MACOSX_14: 'mac-os-x-14', + MACOSX_13: 'mac-os-x-13', + MACOSX_12: 'mac-os-x-12', + MACOSX_11: 'mac-os-x-11', + MACOSX_10: 'mac-os-x-10', + MACOSX_9: 'mac-os-x-9', + MACOSX_8: 'mac-os-x-8', + MACOSX_7: 'mac-os-x-7', + MACOSX_6: 'mac-os-x-6', + MACOSX_5: 'mac-os-x-5', + MACOSX_4: 'mac-os-x-4', + MACOSX_3: 'mac-os-x-3', + MACOSX_2: 'mac-os-x-2', + MACOSX: 'mac-os-x', + iOS: 'iOS', + ANDROID_9: 'android-9', + UNKNOWN: GENERAL.UKNOWN.toLowerCase(), +}; +const OS_RE = { + WINDOWS: { + and: [{ or: [/\bWindows|(Win\d\d)\b/, /\bWin 9x\b/] }, { not: /\bWindows Phone\b/ }], + }, + MAC: { + and: [/\bMac OS\b/, { not: { or: [/\biPhone\b/, /\biPad\b/, /\biPod\b/, /\bWindows Phone\b/] } }], + }, + IOS: { + and: [{ or: [/\biPad\b/, /\biPhone\b/, /\biPod\b/] }, { not: /\bWindows Phone\b/ }], + }, + ANDROID: { and: [/\bAndroid\b/, { not: /\bWindows Phone\b/ }] }, + LINUX: /\bLinux\b/, + UNIX: /\bUNIX\b/, + FIREFOX_OS: { and: [/\bFirefox\b/, /Mobile\b/] }, + CHROME_OS: /\bCrOS\b/, + WINDOWS_PHONE: { or: [/\bIEMobile\b/, /\bWindows Phone\b/] }, + PS4: /\bMozilla\/5.0 \(PlayStation 4\b/, + VITA: /\bMozilla\/5.0 \(Play(S|s)tation Vita\b/, +}; +const BROWSERS_RE = { + CHROME: { + and: [ + { or: [/\bChrome\b/, /\bCriOS\b/, /\bHeadlessChrome\b/] }, + { + not: { + or: [/\bOPR\b/, /\bEdg(e|A|iOS)\b/, /\bEdg\/\b/, /\bSamsungBrowser\b/, /\bUCBrowser\b/], + }, + }, + ], + }, + FIREFOX: { or: [/\bFirefox\b/, /\bFxiOS\b/] }, + SAFARI: { + and: [ + /^((?!CriOS).)*\Safari\b.*$/, + { + not: { + or: [/\bOPR\b/, /\bEdg(e|A|iOS)\b/, /\bEdg\/\b/, /\bWindows Phone\b/, /\bSamsungBrowser\b/, /\bUCBrowser\b/], + }, + }, + ], + }, + OPERA: { or: [/Opera\b/, /\bOPR\b/] }, + IE: { + or: [/\bMSIE\b/, /\bTrident\b/, /^Mozilla\/5\.0 \(Windows NT 10\.0; Win64; x64\)$/], + }, + MS_EDGE: { or: [/\bEdg(e|A|iOS)\b/] }, + MS_EDGE_CHROMIUM: /\bEdg\/\b/, + PS4: /\bMozilla\/5.0 \(PlayStation 4\b/, + VITA: /\bMozilla\/5.0 \(Play(S|s)tation Vita\b/, + FB_MESSANGER: /\bFBAN\/MessengerForiOS\b/, + SAMSUNG: /\bSamsungBrowser\b/, + UCBROWSER: /\bUCBrowser\b/, +}; +const DEVICES_RE = { + ...MOBILES_RE, + ...TABLETS_RE, + ...OS_RE, + FIREFOX_OS: { and: [/\bFirefox\b/, /\bMobile\b/] }, + CHROME_BOOK: /\bCrOS\b/, + PS4: /\bMozilla\/5.0 \(PlayStation 4\b/, + CHROMECAST: /\bCrKey\b/, + APPLE_TV: /^iTunes-AppleTV\/4.1$/, + GOOGLE_TV: /\bGoogleTV\b/, + Tesla: /Tesla\/([0-9]{4}.[0-9]{1,2}.?[0-9]{0,2}.?[0-9]{0,2})-(.{7})/, + MI_SE_9: /\bXiaomi\b/, + MAC: { + and: [/\bMac OS\b/, { not: { or: [/\biPhone\b/, /\biPad\b/, /\biPod\b/, /\bWindows Phone\b/] } }], + }, +}; +const OS_VERSIONS_RE_MAP = { + WINDOWS_3_11: /Win16/, + WINDOWS_95: /(Windows 95|Win95|Windows_95)/, + WINDOWS_ME: /(Win 9x 4.90|Windows ME)/, + WINDOWS_98: /(Windows 98|Win98)/, + WINDOWS_CE: /Windows CE/, + WINDOWS_2000: /(Windows NT 5.0|Windows 2000)/, + WINDOWS_XP: /(Windows NT 5.1|Windows XP)/, + WINDOWS_SERVER_2003: /Windows NT 5.2/, + WINDOWS_VISTA: /Windows NT 6.0/, + WINDOWS_7: /(Windows 7|Windows NT 6.1)/, + WINDOWS_8_1: /(Windows 8.1|Windows NT 6.3)/, + WINDOWS_8: /(Windows 8|Windows NT 6.2)/, + WINDOWS_10: /(Windows NT 10.0)/, + WINDOWS_PHONE_7_5: /(Windows Phone OS 7.5)/, + WINDOWS_PHONE_8_1: /(Windows Phone 8.1)/, + WINDOWS_PHONE_10: /(Windows Phone 10)/, + WINDOWS_NT_4_0: { + and: [/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/, { not: /Windows NT 10.0/ }], + }, + MACOSX: /(MAC OS X\s*[^ 0-9])/, + MACOSX_3: /(Darwin 10.3|Mac OS X 10.3)/, + MACOSX_4: /(Darwin 10.4|Mac OS X 10.4)/, + MACOSX_5: /(Mac OS X 10.5)/, + MACOSX_6: /(Mac OS X 10.6)/, + MACOSX_7: /(Mac OS X 10.7)/, + MACOSX_8: /(Mac OS X 10.8)/, + MACOSX_9: /(Mac OS X 10.9)/, + MACOSX_10: /(Mac OS X 10.10)/, + MACOSX_11: /(Mac OS X 10.11)/, + MACOSX_12: /(Mac OS X 10.12)/, + MACOSX_13: /(Mac OS X 10.13)/, + MACOSX_14: /(Mac OS X 10.14)/, + MACOSX_15: /(Mac OS X 10.15)/, + MACOSX_16: /(Mac OS X 10.16)/, + MACOSX_11_0: { + or: [/11_0 like Mac OS X/, /Mac OS X 11/], + }, + iOS: /(iPhone OS\s*[0-9_]+)/, + ANDROID_9: /(Android 9)/, +}; +const BROWSER_VERSIONS_RE_MAP = { + CHROME: [/\bChrome\/([\d\.]+)\b/, /\bCriOS\/([\d\.]+)\b/, /\bHeadlessChrome\/([\d\.]+)\b/], + FIREFOX: [/\bFirefox\/([\d\.]+)\b/, /\bFxiOS\/([\d\.]+)\b/], + SAFARI: [/\bVersion\/([\d\.]+)\b/, /\bSafari\/([\d\.]+)\b/], + OPERA: [/\bVersion\/([\d\.]+)\b/, /\bOPR\/([\d\.]+)\b/], + IE: [/\bMSIE ([\d\.]+\w?)\b/, /\brv:([\d\.]+\w?)\b/], + MS_EDGE: /\bEdg(?:e|A|iOS)\/([\d\.]+)\b/, + MS_EDGE_CHROMIUM: /\bEdg\/([\d\.]+)\b/, + SAMSUNG: /\bSamsungBrowser\/([\d\.]+)\b/, + UCBROWSER: /\bUCBrowser\/([\d\.]+)\b/, +}; +const OS_VERSIONS_RE = Object.keys(OS_VERSIONS_RE_MAP).reduce((obj, key) => { + obj[key] = OS_VERSIONS_RE_MAP[key]; + return obj; +}, {}); +const BROWSER_VERSIONS_RE = Object.keys(BROWSER_VERSIONS_RE_MAP).reduce((obj, key) => { + obj[BROWSERS[key]] = BROWSER_VERSIONS_RE_MAP[key]; + return obj; +}, {}); + +var Constants = /*#__PURE__*/Object.freeze({ + __proto__: null, + BROWSERS: BROWSERS, + BROWSERS_RE: BROWSERS_RE, + BROWSER_VERSIONS_RE: BROWSER_VERSIONS_RE, + BROWSER_VERSIONS_RE_MAP: BROWSER_VERSIONS_RE_MAP, + DESKTOP_DEVICES: DESKTOP_DEVICES, + DEVICES: DEVICES, + DEVICES_RE: DEVICES_RE, + GENERAL: GENERAL, + MOBILES_RE: MOBILES_RE, + OS: OS, + OS_RE: OS_RE, + OS_VERSIONS: OS_VERSIONS, + OS_VERSIONS_RE: OS_VERSIONS_RE, + OS_VERSIONS_RE_MAP: OS_VERSIONS_RE_MAP, + TABLETS_RE: TABLETS_RE +}); + +/** + * Created by ahsanayaz on 08/11/2016. + */ +class ReTree { + constructor() { } + test(str, regex) { + if (typeof regex === 'string') { + regex = new RegExp(regex); + } + if (regex instanceof RegExp) { + return regex.test(str); + } + else if (regex && Array.isArray(regex.and)) { + return regex.and.every((item) => { + return this.test(str, item); + }); + } + else if (regex && Array.isArray(regex.or)) { + return regex.or.some((item) => { + return this.test(str, item); + }); + } + else if (regex && regex.not) { + return !this.test(str, regex.not); + } + else { + return false; + } + } + exec(str, regex) { + if (typeof regex === 'string') { + regex = new RegExp(regex); + } + if (regex instanceof RegExp) { + return regex.exec(str); + } + else if (regex && Array.isArray(regex)) { + return regex.reduce((res, item) => { + return !!res ? res : this.exec(str, item); + }, null); + } + else { + return null; + } + } +} + +var DeviceType; +(function (DeviceType) { + DeviceType["Mobile"] = "mobile"; + DeviceType["Tablet"] = "tablet"; + DeviceType["Desktop"] = "desktop"; + DeviceType["Unknown"] = "unknown"; +})(DeviceType || (DeviceType = {})); +var OrientationType; +(function (OrientationType) { + OrientationType["Portrait"] = "portrait"; + OrientationType["Landscape"] = "landscape"; +})(OrientationType || (OrientationType = {})); +const iPad = 'iPad'; +class RmNgDeviceDetectionService { + platformId; + ua = ''; + userAgent = ''; + os = ''; + browser = ''; + device = ''; + os_version = ''; + browser_version = ''; + reTree = new ReTree(); + deviceType = ''; + orientation = ''; + constructor(platformId) { + this.platformId = platformId; + if (isPlatformBrowser(this.platformId) && typeof window !== 'undefined') { + this.userAgent = window.navigator.userAgent; + } + this.setDeviceInfo(this.userAgent); + } + setDeviceInfo(ua = this.userAgent) { + if (ua !== this.userAgent) { + this.userAgent = ua; + } + const mappings = [ + { const: 'OS', prop: 'os' }, + { const: 'BROWSERS', prop: 'browser' }, + { const: 'DEVICES', prop: 'device' }, + { const: 'OS_VERSIONS', prop: 'os_version' }, + ]; + mappings.forEach((mapping) => { + this[mapping.prop] = Object.keys(Constants[mapping.const]).reduce((obj, item) => { + if (Constants[mapping.const][item] === 'device') { + // hack for iOS 13 Tablet + if (isPlatformBrowser(this.platformId) && + (!!this.reTree.test(this.userAgent, TABLETS_RE[iPad]) || + (navigator.platform === 'MacIntel' && + navigator.maxTouchPoints > 1))) { + obj[Constants[mapping.const][item]] = + iPad; + return Object; + } + } + // obj[Constants[mapping.const as keyof typeof Constants][item]] = this.reTree.test(ua, Constants[`${mapping.const}_RE`][item]); + obj[Constants[mapping.const][item]] = this.reTree.test(ua, Constants[`${mapping.const}_RE`][item]); + return obj; + }, {}); + }); + // mappings.forEach(mapping => { + // this[mapping.prop] = Object.keys(Constants[mapping.const as keyof typeof Constants]) + // .map(key => { + // return Constants[mapping.const as keyof typeof Constants][key]; + // }) + // .reduce((previousValue, currentValue) => { + // if (mapping.prop === 'device' && previousValue === Constants[mapping.const as keyof typeof Constants].ANDROID) { + // // if we have the actual device found, instead of 'Android', return the actual device + // return this[mapping.prop][currentValue] ? currentValue : previousValue; + // } else { + // return previousValue === Constants[mapping.const as keyof typeof Constants].UNKNOWN && this[mapping.prop][currentValue] + // ? currentValue + // : previousValue; + // } + // }, Constants[mapping.const as keyof typeof Constants].UNKNOWN); + // }); + // mappings.forEach(mapping => { + // const prop = this[mapping.prop]; + // if (typeof prop === 'object' && prop !== null) { + // this[mapping.prop] = Object.keys(Constants[mapping.const as keyof typeof Constants]) + // .map(key => { + // return Constants[mapping.const as keyof typeof Constants][key]; + // }) + // .reduce((previousValue, currentValue) => { + // if (mapping.prop === 'device' && previousValue === Constants[mapping.const as keyof typeof Constants].ANDROID) { + // return prop[currentValue] ? currentValue : previousValue; + // } else { + // return previousValue === Constants[mapping.const as keyof typeof Constants].UNKNOWN && prop[currentValue] + // ? currentValue + // : previousValue; + // } + // }, Constants[mapping.const as keyof typeof Constants].UNKNOWN); + // } + // }); + mappings.forEach((mapping) => { + // Cast `this[mapping.prop]` as an object with string keys and any values + const prop = this[mapping.prop]; + // Cast Constants[mapping.const] to the expected type + const constantsMapping = Constants[mapping.const]; + // Ensure `mapping.prop` is an object and not null + if (typeof prop === 'object' && prop !== null) { + this[mapping.prop] = Object.keys(constantsMapping) + .map((key) => constantsMapping[key]) + .reduce((previousValue, currentValue) => { + if (mapping.prop === 'device' && + previousValue === + Constants[mapping.const].ANDROID) { + // Return the actual device if found + return prop[currentValue] ? currentValue : previousValue; + } + else { + // Return the currentValue if it’s found in `prop` + return previousValue === + Constants[mapping.const].UNKNOWN && + prop[currentValue] + ? currentValue + : previousValue; + } + }, Constants[mapping.const].UNKNOWN); + } + }); + this.browser_version = '0'; + if (this.browser !== BROWSERS.UNKNOWN) { + const re = BROWSER_VERSIONS_RE[this.browser]; + const res = this.reTree.exec(ua, re); + if (!!res) { + this.browser_version = res[1]; + } + } + if (typeof window !== 'undefined' && window && window.matchMedia) { + this.orientation = window.matchMedia('(orientation: landscape)').matches + ? OrientationType.Landscape + : OrientationType.Portrait; + } + else { + this.orientation = GENERAL.UKNOWN; + } + this.deviceType = this.isTablet() + ? DeviceType.Tablet + : this.isMobile(this.userAgent) + ? DeviceType.Mobile + : this.isDesktop(this.userAgent) + ? DeviceType.Desktop + : DeviceType.Unknown; + } + getDeviceInfo() { + const deviceInfo = { + userAgent: this.userAgent, + os: this.os, + browser: this.browser, + device: this.device, + os_version: this.os_version, + browser_version: this.browser_version, + deviceType: this.deviceType, + orientation: this.orientation, + }; + return deviceInfo; + } + isMobile(userAgent = this.userAgent) { + if (this.isTablet(userAgent)) { + return false; + } + const match = Object.keys(MOBILES_RE).find((mobile) => { + return this.reTree.test(userAgent, MOBILES_RE[mobile]); + }); + return !!match; + } + isTablet(userAgent = this.userAgent) { + if (isPlatformBrowser(this.platformId) && + (!!this.reTree.test(this.userAgent, TABLETS_RE[iPad]) || + (typeof navigator !== 'undefined' && + navigator.platform === 'MacIntel' && + navigator.maxTouchPoints > 1))) { + return true; + } + const match = Object.keys(TABLETS_RE).find((mobile) => { + return !!this.reTree.test(userAgent, TABLETS_RE[mobile]); + }); + return !!match; + } + isDesktop(userAgent = this.userAgent) { + if (this.device === DEVICES.UNKNOWN) { + if (this.isMobile(userAgent) || this.isTablet(userAgent)) { + return false; + } + } + return DESKTOP_DEVICES.indexOf(this.device) > -1; + } + static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: RmNgDeviceDetectionService, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); + static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: RmNgDeviceDetectionService, providedIn: 'root' }); +} +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: RmNgDeviceDetectionService, decorators: [{ + type: Injectable, + args: [{ + providedIn: 'root', + }] + }], ctorParameters: () => [{ type: undefined, decorators: [{ + type: Inject, + args: [PLATFORM_ID] + }] }] }); + +/* + * Public API Surface of rm-ng-device-detection + */ + +/** + * Generated bundle index. Do not edit. + */ + +export { DeviceType, OrientationType, ReTree, RmNgDeviceDetectionService }; +//# sourceMappingURL=rm-ng-device-detection.mjs.map diff --git a/fesm2022/rm-ng-device-detection.mjs.map b/fesm2022/rm-ng-device-detection.mjs.map new file mode 100644 index 0000000..c077620 --- /dev/null +++ b/fesm2022/rm-ng-device-detection.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"rm-ng-device-detection.mjs","sources":["../../../projects/rm-ng-device-detection/src/lib/device-detector.constants.ts","../../../projects/rm-ng-device-detection/src/lib/retree.ts","../../../projects/rm-ng-device-detection/src/lib/rm-ng-device-detection.service.ts","../../../projects/rm-ng-device-detection/src/public-api.ts","../../../projects/rm-ng-device-detection/src/rm-ng-device-detection.ts"],"sourcesContent":["export const GENERAL = {\r\n UKNOWN: 'Unknown',\r\n};\r\n\r\nexport const BROWSERS = {\r\n CHROME: 'Chrome',\r\n FIREFOX: 'Firefox',\r\n SAFARI: 'Safari',\r\n OPERA: 'Opera',\r\n IE: 'IE',\r\n MS_EDGE: 'MS-Edge',\r\n MS_EDGE_CHROMIUM: 'MS-Edge-Chromium',\r\n FB_MESSANGER: 'FB-Messanger',\r\n SAMSUNG: 'Samsung',\r\n UCBROWSER: 'UC-Browser',\r\n UNKNOWN: GENERAL.UKNOWN,\r\n};\r\n\r\nexport const MOBILES_RE = {\r\n // tslint:disable-next-line:max-line-length\r\n HTC: /HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel/,\r\n NEXUS_PHONE: /Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6/,\r\n DELL: /Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b/,\r\n MOTOROLA: new RegExp(`Motorola|DROIDX|DROID BIONIC|\\\\bDroid\\\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|\r\n A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|\r\n MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|\r\n ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|\r\n WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|\r\n XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|\r\n XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\\\bMoto E\\\\b|XT1068|XT1092|XT1052`),\r\n SAMSUNG: new RegExp(`\\\\bSamsung\\\\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|\r\n GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|\r\n GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|\r\n GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|\r\n GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|\r\n GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|\r\n GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|\r\n GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|\r\n GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|\r\n GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|\r\n GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|\r\n GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|\r\n GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|\r\n GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|\r\n GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|\r\n GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|\r\n GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|\r\n GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|\r\n SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|\r\n SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|\r\n SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|\r\n SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|\r\n SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|\r\n SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|\r\n SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|\r\n SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|\r\n SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|\r\n SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|\r\n SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|\r\n SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|\r\n SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|\r\n SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|\r\n SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|\r\n SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|\r\n SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|\r\n SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|\r\n SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|\r\n SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|\r\n SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|\r\n SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|\r\n SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|\r\n SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|\r\n SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|\r\n SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|\r\n SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|\r\n SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|\r\n SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|\r\n SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|\r\n SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|\r\n GT-N7105|SCH-I535|SM-N900A|SM-N900T|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|\r\n GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|\r\n GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|\r\n SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|\r\n SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|\r\n SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F|SM-J330F`),\r\n LG: new RegExp(`\\\\bLG\\\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|\r\n LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|\r\n C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|\r\n LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|\r\n VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|\r\n MS323|M257)`),\r\n SONY: /SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533/,\r\n ASUS: /Asus.*Galaxy|PadFone.*Mobile/,\r\n NOKIA_LUMIA: /Lumia [0-9]{3,4}/,\r\n MICROMAX:\r\n /Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b/,\r\n PALM: /PalmSource|Palm/,\r\n VERTU: /Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature/,\r\n PANTECH:\r\n new RegExp(`PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|\r\n IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|\r\n IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|\r\n CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|\r\n P2000|P7040|P7000|C790`),\r\n FLY: /IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250/,\r\n WIKO: new RegExp(`KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|\r\n SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|\r\n CINK KING|CINK PEAX|CINK SLIM|SUBLIM`),\r\n I_MOBILE: /i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)/,\r\n SIMVALLEY:\r\n /\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b/,\r\n WOLFGANG: /AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q/,\r\n ALCATEL: /Alcatel|Mobile; rv:49.0|Mobile; ALCATEL 4052R; rv:48.0/,\r\n NINTENDO: /Nintendo (3DS|Switch)/,\r\n AMOI: /Amoi/,\r\n INQ: /INQ/,\r\n VITA: /\\bVita\\b/,\r\n BLACKBERRY: /\\bBlackBerry\\b|\\bBB10\\b|rim[0-9]+/,\r\n FIREFOX_OS: /\\bFirefox-OS\\b/,\r\n IPHONE: /\\biPhone\\b/,\r\n iPod: /\\biPod\\b/,\r\n ANDROID: /\\bAndroid\\b/,\r\n WINDOWS_PHONE: /\\bWindows-Phone\\b/,\r\n GENERIC_PHONE: new RegExp(`Tapatalk|PDA;|SAGEM|\\\\bmmp\\\\b|pocket|\\\\bpsp\\\\b|symbian|Smartphone|smartfon|treo|up.browser|\r\n up.link|vodafone|\\\\bwap\\\\b|nokia|Nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser`),\r\n};\r\n\r\nexport const TABLETS_RE = {\r\n iPad: /iPad|iPad.*Mobile/,\r\n NexusTablet: /Android.*Nexus[\\s]+(7|9|10)/,\r\n GoogleTablet: /Android.*Pixel C/,\r\n SamsungTablet: new RegExp(`SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|\r\n GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|\r\n SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|\r\n GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|\r\n SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|\r\n GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|\r\n SHV-E230S|SHW-M180K|SHW-M180L|SM-T865|SM-T290|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|\r\n SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|\r\n GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T385M|SM-P585M|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|\r\n SM-P601|SM-P605|SM-P615|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|\r\n GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|\r\n SM-T510|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|\r\n SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T500|SM-T330|\r\n SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|\r\n SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|\r\n SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|\r\n SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|\r\n SM-T719|SM-T725|SM-T813|SM-T819|SM-T580|SM-T590|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|\r\n SM-P555M|SM-P355M|SM-T113NU|SM-T815Y|SM-T585|SM-T285|SM-T825|SM-W708|SM-T835|SM-P585Y|SM-X200|SM-T970`),\r\n Kindle: new RegExp(`Kindle|Silk.*Accelerated|Android.*\\\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|\r\n KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\\\\b|Android.*Silk\\/[0-9.]+ like Chrome\\\r\n /[0-9.]+ (?!Mobile)`),\r\n SurfaceTablet: /Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)/,\r\n HPTablet: /HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10/,\r\n AsusTablet: new RegExp(`^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|\r\n TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|\r\n Slider SL101|\\\\bK00F\\\\b|\\\\bK00C\\\\b|\\\\bK00E\\\\b|\\\\bK00L\\\\b|TX201LA|ME176C|ME102A|\\\\bM80TA\\\\b|ME372CL|\r\n ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\\\\bME70C\\\\b|ME581C|\r\n ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\\\\bP027\\\\b|\\\\bP024\\\\b|\\\\bP00C\\\\b`),\r\n BlackBerryTablet: /PlayBook|RIM Tablet/,\r\n HTCtablet: /HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410/,\r\n MotorolaTablet: /xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617/,\r\n NookTablet: /Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2/,\r\n AcerTablet: new RegExp(`Android.*; \\\\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|\r\n W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\\\b|W3-810|\\\\bA3-A10\\\\b|\\\\bA3-A11\\\\b|\r\n \\\\bA3-A20\\\\b|\\\\bA3-A30`),\r\n ToshibaTablet:\r\n /Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO/,\r\n LGTablet: /\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b/,\r\n FujitsuTablet: /Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b/,\r\n PrestigioTablet: new RegExp(`PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|\r\n PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|\r\n PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|\r\n PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|\r\n PMT5887|PMT5001|PMT5002`),\r\n LenovoTablet: new RegExp(`Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|\r\n YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|\r\n B8000|B8080)(-|)(FL|F|HV|H|)|TB-X606F|TB-X103F|TB-X304F|TB-X304L|TB-X704F|TB-8703F|Tab2A7-10F|TB2-X30L|TB-8504F`),\r\n DellTablet: /Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7/,\r\n YarvikTablet: new RegExp(`Android.*\\\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|\r\n TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|\r\n TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|\r\n TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|\r\n TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\\\b`),\r\n MedionTablet: /Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB/,\r\n ArnovaTablet:\r\n /97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2/,\r\n IntensoTablet: /INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004/,\r\n IRUTablet: /M702pro/,\r\n MegafonTablet: /MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b/,\r\n EbodaTablet: /E-Boda (Supreme|Impresspeed|Izzycomm|Essential)/,\r\n AllViewTablet: /Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)/,\r\n ArchosTablet:\r\n new RegExp(`\\\\b(101G9|80G9|A101IT)\\\\b|Qilive 97R|Archos5|\\\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10|\r\n Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\\\b`),\r\n AinolTablet: /NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark/,\r\n NokiaLumiaTablet: /Lumia 2520/,\r\n SonyTablet: new RegExp(`Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|\r\n SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|\r\n EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP641|SGP612|SOT31|SGP771|SGP611|\r\n SGP612|SGP712`),\r\n PhilipsTablet: /\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b/,\r\n CubeTablet: /Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT/,\r\n CobyTablet:\r\n new RegExp(`MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|\r\n MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010`),\r\n MIDTablet: new RegExp(`M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|\r\n MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|\r\n MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10`),\r\n MSITablet: new RegExp(`MSI \\\\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|\r\n Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\\\b`),\r\n SMiTTablet: /Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)/,\r\n RockChipTablet: /Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A/,\r\n FlyTablet: /IQ310|Fly Vision/,\r\n bqTablet: new RegExp(`Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|\r\n Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))|Maxwell.*Lite|Maxwell.*Plus`),\r\n HuaweiTablet:\r\n new RegExp(`MediaPad|MediaPad 7 Youth|MediaPad T3 10|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|\r\n S7-201|S7-Slim|M2-A01L|BAH-L09|BAH-W09|AGS-W09|AGS-L09`),\r\n NecTablet: /\\bN-06D|\\bN-08D/,\r\n PantechTablet: /Pantech.*P4100/,\r\n BronchoTablet: /Broncho.*(N701|N708|N802|a710)/,\r\n VersusTablet: /TOUCHPAD.*[78910]|\\bTOUCHTAB\\b/,\r\n ZyncTablet: /z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900/,\r\n PositivoTablet: /TB07STA|TB10STA|TB07FTA|TB10FTA/,\r\n NabiTablet: /Android.*\\bNabi/,\r\n KoboTablet: /Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build/,\r\n DanewTablet: /DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b/,\r\n TexetTablet: new RegExp(`NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|\r\n TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|\r\n TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|\r\n TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|\r\n TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|\r\n TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|\r\n TB-436|TB-416|TB-146SE|TB-126SE`),\r\n PlaystationTablet: /Playstation.*(Portable|Vita)/,\r\n TrekstorTablet:\r\n /ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab/,\r\n PyleAudioTablet:\r\n /\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b/,\r\n AdvanTablet: new RegExp(`Android.* \\\\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|\r\n T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\\\b`),\r\n DanyTechTablet: `Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|\r\n Genius TAB GII|Genius TAB GIII|Genius Tab S1`,\r\n GalapadTablet: /Android.*\\bG1\\b(?!\\))/,\r\n MicromaxTablet: /Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b/,\r\n KarbonnTablet: /Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b/,\r\n AllFineTablet: /Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide/,\r\n PROSCANTablet: new RegExp(`\\\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|\r\n PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|\r\n PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|\r\n PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\\\b`),\r\n YONESTablet: /BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026/,\r\n ChangJiaTablet: new RegExp(`TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|\r\n TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|\r\n TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|\r\n TPC10111|TPC10203|TPC10205|TPC10503`),\r\n GUTablet: /TX-A1301|TX-M9002|Q702|kf026/,\r\n PointOfViewTablet: new RegExp(`TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|\r\n TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|\r\n TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|\r\n TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10`),\r\n OvermaxTablet:\r\n new RegExp(`OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|\r\n MagicTab|Stream|TB-08|TB-09)|Qualcore 1027`),\r\n HCLTablet:\r\n /HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync/,\r\n DPSTablet: /DPS Dream 9|DPS Dual 7/,\r\n VistureTablet: /V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10/,\r\n CrestaTablet:\r\n /CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989/,\r\n MediatekTablet: /\\bMT8125|MT8389|MT8135|MT8377\\b/,\r\n ConcordeTablet: /Concorde([ ]+)?Tab|ConCorde ReadMan/,\r\n GoCleverTablet:\r\n new RegExp(`GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|\r\n TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|\r\n GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|\r\n TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|\r\n TAB R104|TAB R83.3|TAB A1042`),\r\n ModecomTablet: new RegExp(`FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|\r\n FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|\r\n FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003`),\r\n VoninoTablet: new RegExp(`\\\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|\r\n Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|\r\n Primus[ _]?QS|Android.*\\\\bQ8\\\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\\\b`),\r\n ECSTablet: /V07OT2|TM105A|S10OT1|TR10CS1/,\r\n StorexTablet: /eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab/,\r\n VodafoneTablet: /SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497/,\r\n EssentielBTablet: /Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2/,\r\n RossMoorTablet: /RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711/,\r\n iMobileTablet: /i-mobile i-note/,\r\n TolinoTablet: /tolino tab [0-9.]+|tolino shine/,\r\n AudioSonicTablet: /\\bC-22Q|T7-QC|T-17B|T-17P\\b/,\r\n AMPETablet: /Android.* A78 /,\r\n SkkTablet: /Android.* (SKYPAD|PHOENIX|CYCLOPS)/,\r\n TecnoTablet: /TECNO P9|TECNO DP8D/,\r\n JXDTablet:\r\n new RegExp(`Android.* \\\\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|\r\n S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|\r\n P1000|P300|S18|S6600|S9100)\\\\b`),\r\n iJoyTablet: new RegExp(`Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|\r\n Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|\r\n Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|\r\n Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|\r\n Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)`),\r\n FX2Tablet: /FX2 PAD7|FX2 PAD10/,\r\n XoroTablet: new RegExp(`KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|\r\n PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|\r\n PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|\r\n TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151`),\r\n ViewsonicTablet:\r\n /ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a/,\r\n VerizonTablet: /QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1/,\r\n OdysTablet:\r\n /LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10/,\r\n CaptivaTablet: /CAPTIVA PAD/,\r\n IconbitTablet: new RegExp(`NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|\r\n NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S`),\r\n TeclastTablet: new RegExp(`T98 4G|\\\\bP80\\\\b|\\\\bX90HD\\\\b|X98 Air|X98 Air 3G|\\\\bX89\\\\b|P80 3G|\\\\bX80h\\\\b|P98 Air|\r\n \\\\bX89HD\\\\b|P98 3G|\\\\bP90HD\\\\b|P89 3G|X98 3G|\\\\bP70h\\\\b|P79HD 3G|G18d 3G|\\\\bP79HD\\\\b|\\\\bP89s\\\\b|\\\\bA88\\\\b|\r\n \\\\bP10HD\\\\b|\\\\bP19HD\\\\b|G18 3G|\\\\bP78HD\\\\b|\\\\bA78\\\\b|\\\\bP75\\\\b|G17s 3G|G17h 3G|\\\\bP85t\\\\b|\\\\bP90\\\\b|\r\n \\\\bP11\\\\b|\\\\bP98t\\\\b|\\\\bP98HD\\\\b|\\\\bG18d\\\\b|\\\\bP85s\\\\b|\\\\bP11HD\\\\b|\\\\bP88s\\\\b|\\\\bA80HD\\\\b|\\\\bA80se\\\\b|\r\n \\\\bA10h\\\\b|\\\\bP89\\\\b|\\\\bP78s\\\\b|\\\\bG18\\\\b|\\\\bP85\\\\b|\\\\bA70h\\\\b|\\\\bA70\\\\b|\\\\bG17\\\\b|\\\\bP18\\\\b|\\\\bA80s\\\\b|\r\n \\\\bA11s\\\\b|\\\\bP88HD\\\\b|\\\\bA80h\\\\b|\\\\bP76s\\\\b|\\\\bP76h\\\\b|\\\\bP98\\\\b|\\\\bA10HD\\\\b|\\\\bP78\\\\b|\\\\bP88\\\\b|\\\\bA11\\\\b|\r\n \\\\bA10t\\\\b|\\\\bP76a\\\\b|\\\\bP76t\\\\b|\\\\bP76e\\\\b|\\\\bP85HD\\\\b|\\\\bP85a\\\\b|\\\\bP86\\\\b|\\\\bP75HD\\\\b|\\\\bP76v\\\\b|\\\\bA12\\\\b|\r\n \\\\bP75a\\\\b|\\\\bA15\\\\b|\\\\bP76Ti\\\\b|\\\\bP81HD\\\\b|\\\\bA10\\\\b|\\\\bT760VE\\\\b|\\\\bT720HD\\\\b|\\\\bP76\\\\b|\\\\bP73\\\\b|\\\\bP71\\\\b|\r\n \\\\bP72\\\\b|\\\\bT720SE\\\\b|\\\\bC520Ti\\\\b|\\\\bT760\\\\b|\\\\bT720VE\\\\b|T720-3GE|T720-WiFi`),\r\n OndaTablet: new RegExp(`\\\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|\r\n V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|\r\n V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|\r\n Vi40)\\\\b[\\s]+|V10 \\\\b4G\\\\b`),\r\n JaytechTablet: /TPC-PA762/,\r\n BlaupunktTablet: /Endeavour 800NG|Endeavour 1010/,\r\n DigmaTablet: /\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b/,\r\n EvolioTablet: /ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b/,\r\n LavaTablet: /QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b/,\r\n AocTablet: /MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712/,\r\n MpmanTablet: new RegExp(`MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\r\n \\\\bMPG7\\\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|\r\n MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010`),\r\n CelkonTablet: /CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b/,\r\n WolderTablet: new RegExp(`miTab \\\\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|\r\n POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|\r\n FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\\\b`),\r\n MediacomTablet: 'M-MPI10C3G|M-SP10EG|M-SP10EGP|M-SP10HXAH|M-SP7HXAH|M-SP10HXBH|M-SP8HXAH|M-SP8MXA',\r\n MiTablet: /\\bMI PAD\\b|\\bHM NOTE 1W\\b/,\r\n NibiruTablet: /Nibiru M1|Nibiru Jupiter One/,\r\n NexoTablet: /NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI/,\r\n LeaderTablet: new RegExp(`TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|\r\n TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100`),\r\n UbislateTablet: /UbiSlate[\\s]?7C/,\r\n PocketBookTablet: /Pocketbook/,\r\n KocasoTablet: /\\b(TB-1207)\\b/,\r\n HisenseTablet: /\\b(F5281|E2371)\\b/,\r\n Hudl: /Hudl HT7S3|Hudl 2/,\r\n TelstraTablet: /T-Hub2/,\r\n Honeywell: /RT10A/,\r\n GenericTablet: new RegExp(`Android.*\\\\b97D\\\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\\\bA7EB\\\\b|CatNova8|\r\n A1_07|CT704|CT1002|\\\\bM721\\\\b|rk30sdk|\\\\bEVOTAB\\\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|\r\n Tablet-PC-4|Tagi Tab|\\\\bM6pro\\\\b|CT1020W|arc 10HD|\\\\bTP750\\\\b|\\\\bQTAQZ3\\\\b|WVT101|TM1088|KT107`),\r\n};\r\n\r\nexport const DEVICES = {\r\n BLACKBERRY: 'Blackberry',\r\n FIREFOX_OS: 'Firefox-OS',\r\n CHROME_BOOK: 'Chrome-Book',\r\n WINDOWS_PHONE: 'Windows-Phone',\r\n VITA: 'Vita',\r\n PS4: 'PS4',\r\n MAC: 'Macintosh',\r\n CHROMECAST: 'Chromecast',\r\n APPLE_TV: 'Apple-TV',\r\n GOOGLE_TV: 'Google-TV',\r\n ANDROID: 'Android',\r\n Tesla: 'Tesla',\r\n iPad: 'iPad',\r\n IPHONE: 'iPhone',\r\n iPod: 'iPod',\r\n UNKNOWN: GENERAL.UKNOWN,\r\n HTC: 'HTC',\r\n NEXUS_PHONE: 'Nexus Phone',\r\n NexusTablet: 'Nexus Tablet',\r\n DELL: 'Dell',\r\n MOTOROLA: 'Motorola',\r\n SAMSUNG: 'Samsung',\r\n LG: 'LG',\r\n SONY: 'Sony',\r\n ASUS: 'Asus',\r\n NOKIA_LUMIA: 'Nokia Lumia',\r\n MICROMAX: 'Micromax',\r\n PALM: 'Palm',\r\n VERTU: 'Vertu',\r\n PANTECH: 'PANTECH',\r\n FLY: 'Fly',\r\n WIKO: `WIKO`,\r\n I_MOBILE: 'i-mobile',\r\n SIMVALLEY: 'Simvalley',\r\n WOLFGANG: 'Wolfgang',\r\n ALCATEL: 'Alcatel',\r\n HONEYWELL: 'Honeywell',\r\n NINTENDO: 'Nintendo',\r\n AMOI: 'Amoi',\r\n INQ: 'INQ',\r\n GENERIC_PHONE: 'Generic Phone',\r\n MI_SE_9: 'Mi SE 9',\r\n};\r\n\r\nexport const DESKTOP_DEVICES = [\r\n DEVICES.PS4,\r\n DEVICES.CHROME_BOOK,\r\n DEVICES.MAC,\r\n DEVICES.DELL,\r\n DEVICES.ASUS,\r\n DEVICES.UNKNOWN,\r\n];\r\n\r\nexport const OS = {\r\n WINDOWS: 'Windows',\r\n MAC: 'Mac',\r\n IOS: 'iOS',\r\n ANDROID: 'Android',\r\n LINUX: 'Linux',\r\n UNIX: 'Unix',\r\n FIREFOX_OS: 'Firefox-OS',\r\n CHROME_OS: 'Chrome-OS',\r\n WINDOWS_PHONE: 'Windows-Phone',\r\n UNKNOWN: GENERAL.UKNOWN,\r\n};\r\n\r\nexport const OS_VERSIONS: any = {\r\n WINDOWS_3_11: 'windows-3-11',\r\n WINDOWS_95: 'windows-95',\r\n WINDOWS_ME: 'windows-me',\r\n WINDOWS_98: 'windows-98',\r\n WINDOWS_CE: 'windows-ce',\r\n WINDOWS_2000: 'windows-2000',\r\n WINDOWS_XP: 'windows-xp',\r\n WINDOWS_SERVER_2003: 'windows-server-2003',\r\n WINDOWS_VISTA: 'windows-vista',\r\n WINDOWS_7: 'windows-7',\r\n WINDOWS_8_1: 'windows-8-1',\r\n WINDOWS_8: 'windows-8',\r\n WINDOWS_10: 'windows-10',\r\n WINDOWS_PHONE_7_5: 'windows-phone-7-5',\r\n WINDOWS_PHONE_8_1: 'windows-phone-8-1',\r\n WINDOWS_PHONE_10: 'windows-phone-10',\r\n WINDOWS_NT_4_0: 'windows-nt-4-0',\r\n MACOSX_11_0: 'mac-os-x-11-0',\r\n MACOSX_16: 'mac-os-x-16',\r\n MACOSX_15: 'mac-os-x-15',\r\n MACOSX_14: 'mac-os-x-14',\r\n MACOSX_13: 'mac-os-x-13',\r\n MACOSX_12: 'mac-os-x-12',\r\n MACOSX_11: 'mac-os-x-11',\r\n MACOSX_10: 'mac-os-x-10',\r\n MACOSX_9: 'mac-os-x-9',\r\n MACOSX_8: 'mac-os-x-8',\r\n MACOSX_7: 'mac-os-x-7',\r\n MACOSX_6: 'mac-os-x-6',\r\n MACOSX_5: 'mac-os-x-5',\r\n MACOSX_4: 'mac-os-x-4',\r\n MACOSX_3: 'mac-os-x-3',\r\n MACOSX_2: 'mac-os-x-2',\r\n MACOSX: 'mac-os-x',\r\n iOS: 'iOS',\r\n ANDROID_9: 'android-9',\r\n UNKNOWN: GENERAL.UKNOWN.toLowerCase(),\r\n};\r\n\r\nexport const OS_RE: any = {\r\n WINDOWS: {\r\n and: [{ or: [/\\bWindows|(Win\\d\\d)\\b/, /\\bWin 9x\\b/] }, { not: /\\bWindows Phone\\b/ }],\r\n },\r\n MAC: {\r\n and: [/\\bMac OS\\b/, { not: { or: [/\\biPhone\\b/, /\\biPad\\b/, /\\biPod\\b/, /\\bWindows Phone\\b/] } }],\r\n },\r\n IOS: {\r\n and: [{ or: [/\\biPad\\b/, /\\biPhone\\b/, /\\biPod\\b/] }, { not: /\\bWindows Phone\\b/ }],\r\n },\r\n ANDROID: { and: [/\\bAndroid\\b/, { not: /\\bWindows Phone\\b/ }] },\r\n LINUX: /\\bLinux\\b/,\r\n UNIX: /\\bUNIX\\b/,\r\n FIREFOX_OS: { and: [/\\bFirefox\\b/, /Mobile\\b/] },\r\n CHROME_OS: /\\bCrOS\\b/,\r\n WINDOWS_PHONE: { or: [/\\bIEMobile\\b/, /\\bWindows Phone\\b/] },\r\n PS4: /\\bMozilla\\/5.0 \\(PlayStation 4\\b/,\r\n VITA: /\\bMozilla\\/5.0 \\(Play(S|s)tation Vita\\b/,\r\n};\r\n\r\nexport const BROWSERS_RE: any = {\r\n CHROME: {\r\n and: [\r\n { or: [/\\bChrome\\b/, /\\bCriOS\\b/, /\\bHeadlessChrome\\b/] },\r\n {\r\n not: {\r\n or: [/\\bOPR\\b/, /\\bEdg(e|A|iOS)\\b/, /\\bEdg\\/\\b/, /\\bSamsungBrowser\\b/, /\\bUCBrowser\\b/],\r\n },\r\n },\r\n ],\r\n },\r\n FIREFOX: { or: [/\\bFirefox\\b/, /\\bFxiOS\\b/] },\r\n SAFARI: {\r\n and: [\r\n /^((?!CriOS).)*\\Safari\\b.*$/,\r\n {\r\n not: {\r\n or: [/\\bOPR\\b/, /\\bEdg(e|A|iOS)\\b/, /\\bEdg\\/\\b/, /\\bWindows Phone\\b/, /\\bSamsungBrowser\\b/, /\\bUCBrowser\\b/],\r\n },\r\n },\r\n ],\r\n },\r\n OPERA: { or: [/Opera\\b/, /\\bOPR\\b/] },\r\n IE: {\r\n or: [/\\bMSIE\\b/, /\\bTrident\\b/, /^Mozilla\\/5\\.0 \\(Windows NT 10\\.0; Win64; x64\\)$/],\r\n },\r\n MS_EDGE: { or: [/\\bEdg(e|A|iOS)\\b/] },\r\n MS_EDGE_CHROMIUM: /\\bEdg\\/\\b/,\r\n PS4: /\\bMozilla\\/5.0 \\(PlayStation 4\\b/,\r\n VITA: /\\bMozilla\\/5.0 \\(Play(S|s)tation Vita\\b/,\r\n FB_MESSANGER: /\\bFBAN\\/MessengerForiOS\\b/,\r\n SAMSUNG: /\\bSamsungBrowser\\b/,\r\n UCBROWSER: /\\bUCBrowser\\b/,\r\n};\r\n\r\nexport const DEVICES_RE: any = {\r\n ...MOBILES_RE,\r\n ...TABLETS_RE,\r\n ...OS_RE,\r\n FIREFOX_OS: { and: [/\\bFirefox\\b/, /\\bMobile\\b/] },\r\n CHROME_BOOK: /\\bCrOS\\b/,\r\n PS4: /\\bMozilla\\/5.0 \\(PlayStation 4\\b/,\r\n CHROMECAST: /\\bCrKey\\b/,\r\n APPLE_TV: /^iTunes-AppleTV\\/4.1$/,\r\n GOOGLE_TV: /\\bGoogleTV\\b/,\r\n Tesla: /Tesla\\/([0-9]{4}.[0-9]{1,2}.?[0-9]{0,2}.?[0-9]{0,2})-(.{7})/,\r\n MI_SE_9: /\\bXiaomi\\b/,\r\n MAC: {\r\n and: [/\\bMac OS\\b/, { not: { or: [/\\biPhone\\b/, /\\biPad\\b/, /\\biPod\\b/, /\\bWindows Phone\\b/] } }],\r\n },\r\n};\r\n\r\nexport const OS_VERSIONS_RE_MAP: any = {\r\n WINDOWS_3_11: /Win16/,\r\n WINDOWS_95: /(Windows 95|Win95|Windows_95)/,\r\n WINDOWS_ME: /(Win 9x 4.90|Windows ME)/,\r\n WINDOWS_98: /(Windows 98|Win98)/,\r\n WINDOWS_CE: /Windows CE/,\r\n WINDOWS_2000: /(Windows NT 5.0|Windows 2000)/,\r\n WINDOWS_XP: /(Windows NT 5.1|Windows XP)/,\r\n WINDOWS_SERVER_2003: /Windows NT 5.2/,\r\n WINDOWS_VISTA: /Windows NT 6.0/,\r\n WINDOWS_7: /(Windows 7|Windows NT 6.1)/,\r\n WINDOWS_8_1: /(Windows 8.1|Windows NT 6.3)/,\r\n WINDOWS_8: /(Windows 8|Windows NT 6.2)/,\r\n WINDOWS_10: /(Windows NT 10.0)/,\r\n WINDOWS_PHONE_7_5: /(Windows Phone OS 7.5)/,\r\n WINDOWS_PHONE_8_1: /(Windows Phone 8.1)/,\r\n WINDOWS_PHONE_10: /(Windows Phone 10)/,\r\n WINDOWS_NT_4_0: {\r\n and: [/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/, { not: /Windows NT 10.0/ }],\r\n },\r\n MACOSX: /(MAC OS X\\s*[^ 0-9])/,\r\n MACOSX_3: /(Darwin 10.3|Mac OS X 10.3)/,\r\n MACOSX_4: /(Darwin 10.4|Mac OS X 10.4)/,\r\n MACOSX_5: /(Mac OS X 10.5)/,\r\n MACOSX_6: /(Mac OS X 10.6)/,\r\n MACOSX_7: /(Mac OS X 10.7)/,\r\n MACOSX_8: /(Mac OS X 10.8)/,\r\n MACOSX_9: /(Mac OS X 10.9)/,\r\n MACOSX_10: /(Mac OS X 10.10)/,\r\n MACOSX_11: /(Mac OS X 10.11)/,\r\n MACOSX_12: /(Mac OS X 10.12)/,\r\n MACOSX_13: /(Mac OS X 10.13)/,\r\n MACOSX_14: /(Mac OS X 10.14)/,\r\n MACOSX_15: /(Mac OS X 10.15)/,\r\n MACOSX_16: /(Mac OS X 10.16)/,\r\n MACOSX_11_0: {\r\n or: [/11_0 like Mac OS X/, /Mac OS X 11/],\r\n },\r\n iOS: /(iPhone OS\\s*[0-9_]+)/,\r\n ANDROID_9: /(Android 9)/,\r\n};\r\n\r\nexport const BROWSER_VERSIONS_RE_MAP: any = {\r\n CHROME: [/\\bChrome\\/([\\d\\.]+)\\b/, /\\bCriOS\\/([\\d\\.]+)\\b/, /\\bHeadlessChrome\\/([\\d\\.]+)\\b/],\r\n FIREFOX: [/\\bFirefox\\/([\\d\\.]+)\\b/, /\\bFxiOS\\/([\\d\\.]+)\\b/],\r\n SAFARI: [/\\bVersion\\/([\\d\\.]+)\\b/, /\\bSafari\\/([\\d\\.]+)\\b/],\r\n OPERA: [/\\bVersion\\/([\\d\\.]+)\\b/, /\\bOPR\\/([\\d\\.]+)\\b/],\r\n IE: [/\\bMSIE ([\\d\\.]+\\w?)\\b/, /\\brv:([\\d\\.]+\\w?)\\b/],\r\n MS_EDGE: /\\bEdg(?:e|A|iOS)\\/([\\d\\.]+)\\b/,\r\n MS_EDGE_CHROMIUM: /\\bEdg\\/([\\d\\.]+)\\b/,\r\n SAMSUNG: /\\bSamsungBrowser\\/([\\d\\.]+)\\b/,\r\n UCBROWSER: /\\bUCBrowser\\/([\\d\\.]+)\\b/,\r\n};\r\n\r\nexport const OS_VERSIONS_RE: any = Object.keys(OS_VERSIONS_RE_MAP).reduce((obj: any, key: string) => {\r\n obj[key] = OS_VERSIONS_RE_MAP[key];\r\n return obj;\r\n}, {});\r\n\r\nexport const BROWSER_VERSIONS_RE: any = Object.keys(BROWSER_VERSIONS_RE_MAP).reduce((obj: any, key: string) => {\r\n obj[(BROWSERS as any)[key]] = BROWSER_VERSIONS_RE_MAP[key];\r\n return obj;\r\n}, {});\r\n","/**\r\n * Created by ahsanayaz on 08/11/2016.\r\n */\r\n\r\nexport class ReTree {\r\n constructor() {}\r\n\r\n public test(str: string, regex: any): any {\r\n if (typeof regex === 'string') {\r\n regex = new RegExp(regex);\r\n }\r\n\r\n if (regex instanceof RegExp) {\r\n return regex.test(str);\r\n } else if (regex && Array.isArray(regex.and)) {\r\n return regex.and.every((item: any) => {\r\n return this.test(str, item);\r\n });\r\n } else if (regex && Array.isArray(regex.or)) {\r\n return regex.or.some((item: any) => {\r\n return this.test(str, item);\r\n });\r\n } else if (regex && regex.not) {\r\n return !this.test(str, regex.not);\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public exec(str: string, regex: any): any {\r\n if (typeof regex === 'string') {\r\n regex = new RegExp(regex);\r\n }\r\n\r\n if (regex instanceof RegExp) {\r\n return regex.exec(str);\r\n } else if (regex && Array.isArray(regex)) {\r\n return regex.reduce((res: any, item: any) => {\r\n return !!res ? res : this.exec(str, item);\r\n }, null);\r\n } else {\r\n return null;\r\n }\r\n }\r\n}\r\n","import { PLATFORM_ID, Inject, Injectable } from '@angular/core';\r\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\r\nimport * as Constants from './device-detector.constants';\r\nimport { ReTree } from './retree';\r\n\r\nexport interface DeviceInfo {\r\n userAgent: string;\r\n os: string;\r\n browser: string;\r\n device: string;\r\n os_version: string;\r\n browser_version: string;\r\n deviceType: string;\r\n orientation: string;\r\n}\r\nexport enum DeviceType {\r\n Mobile = 'mobile',\r\n Tablet = 'tablet',\r\n Desktop = 'desktop',\r\n Unknown = 'unknown',\r\n}\r\nexport enum OrientationType {\r\n Portrait = 'portrait',\r\n Landscape = 'landscape',\r\n}\r\n\r\nconst iPad = 'iPad';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RmNgDeviceDetectionService {\r\n ua = '';\r\n userAgent = '';\r\n os = '';\r\n browser = '';\r\n device = '';\r\n os_version = '';\r\n browser_version = '';\r\n reTree = new ReTree();\r\n deviceType = '';\r\n orientation = '';\r\n constructor(@Inject(PLATFORM_ID) private platformId: any) {\r\n if (isPlatformBrowser(this.platformId) && typeof window !== 'undefined') {\r\n this.userAgent = window.navigator.userAgent;\r\n }\r\n this.setDeviceInfo(this.userAgent);\r\n }\r\n\r\n setDeviceInfo(ua = this.userAgent): void {\r\n if (ua !== this.userAgent) {\r\n this.userAgent = ua;\r\n }\r\n const mappings: {\r\n const: keyof typeof Constants;\r\n prop: keyof RmNgDeviceDetectionService;\r\n }[] = [\r\n { const: 'OS', prop: 'os' },\r\n { const: 'BROWSERS', prop: 'browser' },\r\n { const: 'DEVICES', prop: 'device' },\r\n { const: 'OS_VERSIONS', prop: 'os_version' },\r\n ];\r\n\r\n mappings.forEach((mapping) => {\r\n this[mapping.prop] = Object.keys(\r\n Constants[mapping.const as keyof typeof Constants],\r\n ).reduce((obj: any, item: any) => {\r\n if (\r\n Constants[mapping.const as keyof typeof Constants][item] === 'device'\r\n ) {\r\n // hack for iOS 13 Tablet\r\n if (\r\n isPlatformBrowser(this.platformId) &&\r\n (!!this.reTree.test(this.userAgent, Constants.TABLETS_RE[iPad]) ||\r\n (navigator.platform === 'MacIntel' &&\r\n navigator.maxTouchPoints > 1))\r\n ) {\r\n obj[Constants[mapping.const as keyof typeof Constants][item]] =\r\n iPad;\r\n return Object;\r\n }\r\n }\r\n // obj[Constants[mapping.const as keyof typeof Constants][item]] = this.reTree.test(ua, Constants[`${mapping.const}_RE`][item]);\r\n obj[Constants[mapping.const as keyof typeof Constants][item]] = this.reTree.test(ua, Constants[`${mapping.const}_RE` as keyof typeof Constants][item]);\r\n return obj;\r\n }, {});\r\n });\r\n\r\n // mappings.forEach(mapping => {\r\n // this[mapping.prop] = Object.keys(Constants[mapping.const as keyof typeof Constants])\r\n // .map(key => {\r\n // return Constants[mapping.const as keyof typeof Constants][key];\r\n // })\r\n // .reduce((previousValue, currentValue) => {\r\n // if (mapping.prop === 'device' && previousValue === Constants[mapping.const as keyof typeof Constants].ANDROID) {\r\n // // if we have the actual device found, instead of 'Android', return the actual device\r\n // return this[mapping.prop][currentValue] ? currentValue : previousValue;\r\n // } else {\r\n // return previousValue === Constants[mapping.const as keyof typeof Constants].UNKNOWN && this[mapping.prop][currentValue]\r\n // ? currentValue\r\n // : previousValue;\r\n // }\r\n // }, Constants[mapping.const as keyof typeof Constants].UNKNOWN);\r\n // });\r\n\r\n // mappings.forEach(mapping => {\r\n // const prop = this[mapping.prop];\r\n\r\n // if (typeof prop === 'object' && prop !== null) {\r\n // this[mapping.prop] = Object.keys(Constants[mapping.const as keyof typeof Constants])\r\n // .map(key => {\r\n // return Constants[mapping.const as keyof typeof Constants][key];\r\n // })\r\n // .reduce((previousValue, currentValue) => {\r\n // if (mapping.prop === 'device' && previousValue === Constants[mapping.const as keyof typeof Constants].ANDROID) {\r\n // return prop[currentValue] ? currentValue : previousValue;\r\n // } else {\r\n // return previousValue === Constants[mapping.const as keyof typeof Constants].UNKNOWN && prop[currentValue]\r\n // ? currentValue\r\n // : previousValue;\r\n // }\r\n // }, Constants[mapping.const as keyof typeof Constants].UNKNOWN);\r\n // }\r\n // });\r\n\r\n\r\n mappings.forEach((mapping) => {\r\n // Cast `this[mapping.prop]` as an object with string keys and any values\r\n const prop = this[mapping.prop] as Record;\r\n\r\n // Cast Constants[mapping.const] to the expected type\r\n const constantsMapping = Constants[\r\n mapping.const as keyof typeof Constants\r\n ] as Record;\r\n\r\n // Ensure `mapping.prop` is an object and not null\r\n if (typeof prop === 'object' && prop !== null) {\r\n this[mapping.prop] = Object.keys(constantsMapping)\r\n .map((key) => constantsMapping[key])\r\n .reduce(\r\n (previousValue, currentValue) => {\r\n if (\r\n mapping.prop === 'device' &&\r\n previousValue ===\r\n Constants[mapping.const as keyof typeof Constants].ANDROID\r\n ) {\r\n // Return the actual device if found\r\n return prop[currentValue] ? currentValue : previousValue;\r\n } else {\r\n // Return the currentValue if it’s found in `prop`\r\n return previousValue ===\r\n Constants[mapping.const as keyof typeof Constants].UNKNOWN &&\r\n prop[currentValue]\r\n ? currentValue\r\n : previousValue;\r\n }\r\n },\r\n Constants[mapping.const as keyof typeof Constants].UNKNOWN,\r\n );\r\n }\r\n });\r\n\r\n this.browser_version = '0';\r\n if (this.browser !== Constants.BROWSERS.UNKNOWN) {\r\n const re = Constants.BROWSER_VERSIONS_RE[this.browser];\r\n const res = this.reTree.exec(ua, re);\r\n if (!!res) {\r\n this.browser_version = res[1];\r\n }\r\n }\r\n if (typeof window !== 'undefined' && window && window.matchMedia) {\r\n this.orientation = window.matchMedia('(orientation: landscape)').matches\r\n ? OrientationType.Landscape\r\n : OrientationType.Portrait;\r\n } else {\r\n this.orientation = Constants.GENERAL.UKNOWN;\r\n }\r\n\r\n this.deviceType = this.isTablet()\r\n ? DeviceType.Tablet\r\n : this.isMobile(this.userAgent)\r\n ? DeviceType.Mobile\r\n : this.isDesktop(this.userAgent)\r\n ? DeviceType.Desktop\r\n : DeviceType.Unknown;\r\n }\r\n\r\n public getDeviceInfo(): DeviceInfo {\r\n const deviceInfo: DeviceInfo = {\r\n userAgent: this.userAgent,\r\n os: this.os,\r\n browser: this.browser,\r\n device: this.device,\r\n os_version: this.os_version,\r\n browser_version: this.browser_version,\r\n deviceType: this.deviceType,\r\n orientation: this.orientation,\r\n };\r\n return deviceInfo;\r\n }\r\n\r\n public isMobile(userAgent = this.userAgent): boolean {\r\n if (this.isTablet(userAgent)) {\r\n return false;\r\n }\r\n const match = Object.keys(Constants.MOBILES_RE).find((mobile) => {\r\n return this.reTree.test(userAgent, (Constants.MOBILES_RE as any)[mobile]);\r\n });\r\n return !!match;\r\n }\r\n\r\n public isTablet(userAgent = this.userAgent): boolean {\r\n if (\r\n isPlatformBrowser(this.platformId) &&\r\n (!!this.reTree.test(this.userAgent, Constants.TABLETS_RE[iPad]) ||\r\n (typeof navigator !== 'undefined' &&\r\n navigator.platform === 'MacIntel' &&\r\n navigator.maxTouchPoints > 1))\r\n ) {\r\n return true;\r\n }\r\n const match = Object.keys(Constants.TABLETS_RE).find((mobile) => {\r\n return !!this.reTree.test(\r\n userAgent,\r\n (Constants.TABLETS_RE as any)[mobile],\r\n );\r\n });\r\n return !!match;\r\n }\r\n\r\n public isDesktop(userAgent = this.userAgent): boolean {\r\n if (this.device === Constants.DEVICES.UNKNOWN) {\r\n if (this.isMobile(userAgent) || this.isTablet(userAgent)) {\r\n return false;\r\n }\r\n }\r\n return Constants.DESKTOP_DEVICES.indexOf(this.device) > -1;\r\n }\r\n}\r\n","/*\r\n * Public API Surface of rm-ng-device-detection\r\n */\r\n\r\nexport * from './lib/rm-ng-device-detection.service';\r\nexport * from './lib/retree';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Constants.TABLETS_RE","Constants.BROWSERS","Constants.BROWSER_VERSIONS_RE","Constants.GENERAL","Constants.MOBILES_RE","Constants.DEVICES","Constants.DESKTOP_DEVICES"],"mappings":"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"} \ No newline at end of file diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..ec13213 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,5 @@ +/** + * Generated bundle index. Do not edit. + */ +/// +export * from './public-api'; diff --git a/lib/device-detector.constants.d.ts b/lib/device-detector.constants.d.ts new file mode 100644 index 0000000..31c7db4 --- /dev/null +++ b/lib/device-detector.constants.d.ts @@ -0,0 +1,234 @@ +export declare const GENERAL: { + UKNOWN: string; +}; +export declare const BROWSERS: { + CHROME: string; + FIREFOX: string; + SAFARI: string; + OPERA: string; + IE: string; + MS_EDGE: string; + MS_EDGE_CHROMIUM: string; + FB_MESSANGER: string; + SAMSUNG: string; + UCBROWSER: string; + UNKNOWN: string; +}; +export declare const MOBILES_RE: { + HTC: RegExp; + NEXUS_PHONE: RegExp; + DELL: RegExp; + MOTOROLA: RegExp; + SAMSUNG: RegExp; + LG: RegExp; + SONY: RegExp; + ASUS: RegExp; + NOKIA_LUMIA: RegExp; + MICROMAX: RegExp; + PALM: RegExp; + VERTU: RegExp; + PANTECH: RegExp; + FLY: RegExp; + WIKO: RegExp; + I_MOBILE: RegExp; + SIMVALLEY: RegExp; + WOLFGANG: RegExp; + ALCATEL: RegExp; + NINTENDO: RegExp; + AMOI: RegExp; + INQ: RegExp; + VITA: RegExp; + BLACKBERRY: RegExp; + FIREFOX_OS: RegExp; + IPHONE: RegExp; + iPod: RegExp; + ANDROID: RegExp; + WINDOWS_PHONE: RegExp; + GENERIC_PHONE: RegExp; +}; +export declare const TABLETS_RE: { + iPad: RegExp; + NexusTablet: RegExp; + GoogleTablet: RegExp; + SamsungTablet: RegExp; + Kindle: RegExp; + SurfaceTablet: RegExp; + HPTablet: RegExp; + AsusTablet: RegExp; + BlackBerryTablet: RegExp; + HTCtablet: RegExp; + MotorolaTablet: RegExp; + NookTablet: RegExp; + AcerTablet: RegExp; + ToshibaTablet: RegExp; + LGTablet: RegExp; + FujitsuTablet: RegExp; + PrestigioTablet: RegExp; + LenovoTablet: RegExp; + DellTablet: RegExp; + YarvikTablet: RegExp; + MedionTablet: RegExp; + ArnovaTablet: RegExp; + IntensoTablet: RegExp; + IRUTablet: RegExp; + MegafonTablet: RegExp; + EbodaTablet: RegExp; + AllViewTablet: RegExp; + ArchosTablet: RegExp; + AinolTablet: RegExp; + NokiaLumiaTablet: RegExp; + SonyTablet: RegExp; + PhilipsTablet: RegExp; + CubeTablet: RegExp; + CobyTablet: RegExp; + MIDTablet: RegExp; + MSITablet: RegExp; + SMiTTablet: RegExp; + RockChipTablet: RegExp; + FlyTablet: RegExp; + bqTablet: RegExp; + HuaweiTablet: RegExp; + NecTablet: RegExp; + PantechTablet: RegExp; + BronchoTablet: RegExp; + VersusTablet: RegExp; + ZyncTablet: RegExp; + PositivoTablet: RegExp; + NabiTablet: RegExp; + KoboTablet: RegExp; + DanewTablet: RegExp; + TexetTablet: RegExp; + PlaystationTablet: RegExp; + TrekstorTablet: RegExp; + PyleAudioTablet: RegExp; + AdvanTablet: RegExp; + DanyTechTablet: string; + GalapadTablet: RegExp; + MicromaxTablet: RegExp; + KarbonnTablet: RegExp; + AllFineTablet: RegExp; + PROSCANTablet: RegExp; + YONESTablet: RegExp; + ChangJiaTablet: RegExp; + GUTablet: RegExp; + PointOfViewTablet: RegExp; + OvermaxTablet: RegExp; + HCLTablet: RegExp; + DPSTablet: RegExp; + VistureTablet: RegExp; + CrestaTablet: RegExp; + MediatekTablet: RegExp; + ConcordeTablet: RegExp; + GoCleverTablet: RegExp; + ModecomTablet: RegExp; + VoninoTablet: RegExp; + ECSTablet: RegExp; + StorexTablet: RegExp; + VodafoneTablet: RegExp; + EssentielBTablet: RegExp; + RossMoorTablet: RegExp; + iMobileTablet: RegExp; + TolinoTablet: RegExp; + AudioSonicTablet: RegExp; + AMPETablet: RegExp; + SkkTablet: RegExp; + TecnoTablet: RegExp; + JXDTablet: RegExp; + iJoyTablet: RegExp; + FX2Tablet: RegExp; + XoroTablet: RegExp; + ViewsonicTablet: RegExp; + VerizonTablet: RegExp; + OdysTablet: RegExp; + CaptivaTablet: RegExp; + IconbitTablet: RegExp; + TeclastTablet: RegExp; + OndaTablet: RegExp; + JaytechTablet: RegExp; + BlaupunktTablet: RegExp; + DigmaTablet: RegExp; + EvolioTablet: RegExp; + LavaTablet: RegExp; + AocTablet: RegExp; + MpmanTablet: RegExp; + CelkonTablet: RegExp; + WolderTablet: RegExp; + MediacomTablet: string; + MiTablet: RegExp; + NibiruTablet: RegExp; + NexoTablet: RegExp; + LeaderTablet: RegExp; + UbislateTablet: RegExp; + PocketBookTablet: RegExp; + KocasoTablet: RegExp; + HisenseTablet: RegExp; + Hudl: RegExp; + TelstraTablet: RegExp; + Honeywell: RegExp; + GenericTablet: RegExp; +}; +export declare const DEVICES: { + BLACKBERRY: string; + FIREFOX_OS: string; + CHROME_BOOK: string; + WINDOWS_PHONE: string; + VITA: string; + PS4: string; + MAC: string; + CHROMECAST: string; + APPLE_TV: string; + GOOGLE_TV: string; + ANDROID: string; + Tesla: string; + iPad: string; + IPHONE: string; + iPod: string; + UNKNOWN: string; + HTC: string; + NEXUS_PHONE: string; + NexusTablet: string; + DELL: string; + MOTOROLA: string; + SAMSUNG: string; + LG: string; + SONY: string; + ASUS: string; + NOKIA_LUMIA: string; + MICROMAX: string; + PALM: string; + VERTU: string; + PANTECH: string; + FLY: string; + WIKO: string; + I_MOBILE: string; + SIMVALLEY: string; + WOLFGANG: string; + ALCATEL: string; + HONEYWELL: string; + NINTENDO: string; + AMOI: string; + INQ: string; + GENERIC_PHONE: string; + MI_SE_9: string; +}; +export declare const DESKTOP_DEVICES: string[]; +export declare const OS: { + WINDOWS: string; + MAC: string; + IOS: string; + ANDROID: string; + LINUX: string; + UNIX: string; + FIREFOX_OS: string; + CHROME_OS: string; + WINDOWS_PHONE: string; + UNKNOWN: string; +}; +export declare const OS_VERSIONS: any; +export declare const OS_RE: any; +export declare const BROWSERS_RE: any; +export declare const DEVICES_RE: any; +export declare const OS_VERSIONS_RE_MAP: any; +export declare const BROWSER_VERSIONS_RE_MAP: any; +export declare const OS_VERSIONS_RE: any; +export declare const BROWSER_VERSIONS_RE: any; diff --git a/lib/retree.d.ts b/lib/retree.d.ts new file mode 100644 index 0000000..e41d284 --- /dev/null +++ b/lib/retree.d.ts @@ -0,0 +1,8 @@ +/** + * Created by ahsanayaz on 08/11/2016. + */ +export declare class ReTree { + constructor(); + test(str: string, regex: any): any; + exec(str: string, regex: any): any; +} diff --git a/lib/rm-ng-device-detection.service.d.ts b/lib/rm-ng-device-detection.service.d.ts new file mode 100644 index 0000000..e58c0af --- /dev/null +++ b/lib/rm-ng-device-detection.service.d.ts @@ -0,0 +1,43 @@ +import { ReTree } from './retree'; +import * as i0 from "@angular/core"; +export interface DeviceInfo { + userAgent: string; + os: string; + browser: string; + device: string; + os_version: string; + browser_version: string; + deviceType: string; + orientation: string; +} +export declare enum DeviceType { + Mobile = "mobile", + Tablet = "tablet", + Desktop = "desktop", + Unknown = "unknown" +} +export declare enum OrientationType { + Portrait = "portrait", + Landscape = "landscape" +} +export declare class RmNgDeviceDetectionService { + private platformId; + ua: string; + userAgent: string; + os: string; + browser: string; + device: string; + os_version: string; + browser_version: string; + reTree: ReTree; + deviceType: string; + orientation: string; + constructor(platformId: any); + setDeviceInfo(ua?: string): void; + getDeviceInfo(): DeviceInfo; + isMobile(userAgent?: string): boolean; + isTablet(userAgent?: string): boolean; + isDesktop(userAgent?: string): boolean; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵprov: i0.ɵɵInjectableDeclaration; +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a758dc1 --- /dev/null +++ b/package.json @@ -0,0 +1,64 @@ +{ + "name": "rm-ng-device-detection", + "version": "1.0.0", + "license": "MIT", + "description": "A highly optimized and fully customizable pure angular component for value range selection.", + "keywords": [ + "library", + "angularlibrary", + "ng", + "Angular", + "native", + "angular-native", + "angular-component", + "custom", + "security", + "performance", + "device", + "device detector", + "device detection", + "rm-ng-device-detection", + "angular device detector", + "angular18" + ], + "author": { + "name": "Rajat Malik", + "email": "mr.rajatmalik@gmail.com", + "url": "https://www.linkedin.com/in/errajatmalik/" + }, + "homepage": "https://github.com/malikrajat/rm-ng-device-detection#readme", + "repository": { + "type": "git", + "url": "https://github.com/malikrajat/rm-ng-device-detection.git" + }, + "files": [ + "dist", + "README.md", + "LICENSE" + ], + "bugs": { + "url": "https://github.com/malikrajat/rm-ng-device-detection.git/issues" + }, + "peerDependencies": { + "@angular/common": "^18.2.0", + "@angular/core": "^18.2.0" + }, + "dependencies": { + "tslib": "^2.3.0" + }, + "sideEffects": false, + "type": "module", + "module": "fesm2022/rm-ng-device-detection.mjs", + "typings": "index.d.ts", + "exports": { + "./package.json": { + "default": "./package.json" + }, + ".": { + "types": "./index.d.ts", + "esm2022": "./esm2022/rm-ng-device-detection.mjs", + "esm": "./esm2022/rm-ng-device-detection.mjs", + "default": "./fesm2022/rm-ng-device-detection.mjs" + } + } +} \ No newline at end of file diff --git a/public-api.d.ts b/public-api.d.ts new file mode 100644 index 0000000..f21fa3f --- /dev/null +++ b/public-api.d.ts @@ -0,0 +1,2 @@ +export * from './lib/rm-ng-device-detection.service'; +export * from './lib/retree';