├── .gitignore ├── LICENSE ├── README.md ├── app-frida-tools ├── README.md └── etp-token-stealer.js ├── create-etp-token └── index.js ├── create-fireguard-token ├── .env.sample └── index.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | .env 3 | node_modules/ 4 | etp.public.pem 5 | etp.private.pem -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Lesley De Keyser 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Firewalla tools 2 | 3 | Code to access the firewalla API & tools for reverse engineering Firewalla 4 | If you want to use the firewalla API in your node project, checkout [node-firewalla](https://github.com/lesleyxyz/node-firewalla/) 5 | 6 | If you like my work, give this repository a `⭐` or consider [Buying Me A Coffee ☕](https://www.buymeacoffee.com/lesleydk) 7 | 8 | # Definitions 9 | **My Firewalla API**: https://my.firewalla.com A user friendly way to access your firewalla box through the browser 10 | 11 | **Internal Box API**: An API inside your firewalla box, accessable both through a public endpoint (https://firewalla.encipher.io) and a local endpoint (http://{box_ip}:8833). This API is used mostly in the app. 12 | 13 | **Fireguard token**: A type of authorization token to access the My Firewalla API 14 | 15 | **ETP token**: A type of authorization token to access the internal API of your box. This token is linked to an email and public/private keypair 16 | 17 | # Tools in this repository 18 | ## create-etp-token 19 | ```bash 20 | node create-etp-token 21 | ``` 22 | Create an ETP token by adding an additional device 23 | This is the recommended way of getting a token to access an API. 24 | 25 | ### How to use 26 | 1) Install the required modules using `npm install`. 27 | 2) Make sure you are on the same network as your firewalla & find out its IP 28 | 3) `node create-etp-token` 29 | 4) Input an email to create your ETP token. Your email will only be used to display in the app. 30 | 5) Go to Your Firewalla App -> Select your box -> Settings -> Advanced -> Allow Additional Pairing -> Turn on Additional Pairing 31 | 6) Scan or screenshot the QR code and find copy its JSON value. Then input it in the program 32 | 7) Enter the IP address of your box 33 | 8) Create a new key pair: Yes (or no if you want to generate or reuse your own) 34 | 9) Done! Now you will only need the `etp.private.pem` & `etp.public.pem` files to use with [node-firewalla](https://github.com/lesleyxyz/node-firewalla) 35 | 10) An ETP_TOKEN will also be printed out if you want to use it with `create-fireguard-token` 36 | 37 | ## create-fireguard-token 38 | ```bash 39 | npm install 40 | node create-fireguard-token 41 | ``` 42 | Create a fireguard token from an ETP token, valid for 300 days. 43 | 44 | In the app, firewalla creates a fireguard token using the qr code of the My Firewalla API 45 | This token is usually valid for only 3 hours. 46 | 47 | You can use this tool if you only want a token to access the My Firewalla API 48 | 49 | ## app-frida-tools 50 | Documentation & tools to reverse engineer the Firewalla app. 51 | -------------------------------------------------------------------------------- /app-frida-tools/README.md: -------------------------------------------------------------------------------- 1 | Tools for reverse engineering & debugging Firewalla with Frida. 2 | If you don't know what frida is, or have to set it up checkout [Setting up frida](#setting-up-frida) 3 | 4 | # Resources 5 | If you want to contribute by reverse engineering more, checkout these helpful resources 6 | - Reverse engineer APKs using [jadx](https://github.com/skylot/jadx) 7 | - Debug firewalla using [frida](https://github.com/frida/frida) 8 | - Official firewalla box [github](https://github.com/firewalla/firewalla) 9 | 10 | # Logging HTTP requests from Firewalla 11 | ```bash 12 | frida --codeshare helviojunior/okhttp-logging -U -f com.firewalla.chancellor 13 | ``` 14 | Type `%resume` in the frida console to start the app on your phone. 15 | You should be able to see all HTTP requests & responses in the console 16 | 17 | # Get ETP token 18 | With the ETP token you can make requests to your firewalla box. 19 | This token is valid for 5 years. 20 | ```bash 21 | frida -l tools/app-frida-tools/etp-token-stealer.js -f com.firewalla.chancellor 22 | ``` 23 | Type `%resume` in the frida console, and you should be able to get the ETP_TOKEN in the console. 24 | 25 | Do `CTRL+C` then type `exit` once the ETP_TOKEN has been printed out 26 | 27 | 28 | # Setting up frida 29 | [Frida](https://github.com/frida/frida) is a tool for dynamic analysis, debugging & reverse engineering. 30 | 31 | ## Requirements 32 | Rooted android phone 33 | 34 | ## Install frida on host 35 | ```bash 36 | pip install frida-tools 37 | pip install frida 38 | frida-ls-devices 39 | ``` 40 | 41 | ## Install frida on android 42 | 1. Get your phone cpu architecture 43 | ```bash 44 | adb shell getprop ro.product.cpu.abi 45 | ``` 46 | 2. Download the correct frida-server-xx.x.x-android-xxx.xz file from [here](https://github.com/frida/frida/releases) 47 | 3. Extract the .xz and rename the file to `frida-server` 48 | 4. Push the binary to your phone & enter adb shell 49 | ```bash 50 | adb push frida-server /data/local/tmp 51 | adb shell 52 | ``` 53 | 5. On your phone's shell execute 54 | ```bash 55 | su 56 | cd /data/local/tmp 57 | chmod +x frida-server 58 | ./frida-server 59 | ``` 60 | 6. If you get the error: VM::AttachCurrentThread failed: -1: 61 | ```bash 62 | setprop persist.device_config.runtime_native.usap_pool_enabled false 63 | ./frida-server 64 | ``` 65 | 7. If you are using magisk-hide on your phone 66 | ```bash 67 | magiskhide disable 68 | ``` 69 | 70 | ## Run the script 71 | ``` 72 | Make sure you have the firewalla app installed. 73 | Then execute the frida script using 74 | ```bash 75 | frida --codeshare helviojunior/okhttp-logging -U -f com.firewalla.chancellor 76 | ``` 77 | Type `%resume` in the frida console, and you should be able to get the ETP_TOKEN in the console. 78 | Do `CTRL+C` then type `exit` once the ETP_TOKEN has been printed out 79 | -------------------------------------------------------------------------------- /app-frida-tools/etp-token-stealer.js: -------------------------------------------------------------------------------- 1 | const sleep = ms => new Promise(r => setTimeout(r, ms)) 2 | const baseClass = "com.firewalla.chancellor.api.Networker" 3 | 4 | async function setup() { 5 | await findClassLoader(); 6 | await start() 7 | } 8 | setup() 9 | 10 | async function findClassLoader(){ 11 | console.log("Finding class loader") 12 | 13 | let found = false 14 | while(!found){ 15 | await sleep(200) 16 | const classLoaders = Java.enumerateClassLoadersSync() 17 | for (const classLoader of classLoaders) { 18 | try { 19 | classLoader.findClass(baseClass); 20 | Java.classFactory.loader = classLoader; 21 | found = true 22 | break; 23 | } catch { 24 | continue; 25 | } 26 | } 27 | } 28 | 29 | console.log("Found!") 30 | } 31 | 32 | function start(){ 33 | let FWGroupManager = Java.use("com.firewalla.chancellor.managers.FWGroupManager"); 34 | FWGroupManager.parseInitGroups.implementation = function(jSONObject){ 35 | console.log('ETP_TOKEN FOUND') 36 | console.log(JSON.parse(jSONObject.toString()).access_token); 37 | return this.parseInitGroups(jSONObject); 38 | }; 39 | } -------------------------------------------------------------------------------- /create-etp-token/index.js: -------------------------------------------------------------------------------- 1 | import { SecureUtil, FWGroup, FWGroupApi, NetworkService } from 'node-firewalla' 2 | import validator from 'validator'; 3 | import inquirer from 'inquirer'; 4 | import fs from 'fs'; 5 | import { exit } from 'process'; 6 | 7 | 8 | (async _ => { 9 | let {email, qr, localIp, createNewKeyPair} = await promptQuestions() 10 | 11 | if(!createNewKeyPair){ 12 | let {publicKey, privateKey} = await promptKeyPair() 13 | SecureUtil.importKeyPairFromString(publicKey, privateKey) 14 | }else{ 15 | SecureUtil.regenerateKeyPair() 16 | } 17 | 18 | try { 19 | let fwGroup = await FWGroupApi.joinGroup(JSON.parse(qr), email, localIp) 20 | let nwService = new NetworkService(fwGroup) 21 | await nwService.ping() 22 | 23 | let {access_token} = await FWGroupApi.login(email) 24 | console.log("Successfully linked to box! You can now use your public & private key to authenticate with your Firewalla Box!") 25 | console.log("You can use this ETP_TOKEN for create-fireguard-token:") 26 | console.log(access_token) 27 | 28 | if(createNewKeyPair){ 29 | writeKeyPair() 30 | } 31 | }catch(err){ 32 | console.error("An error occured linking your ETP token to your box", err) 33 | } 34 | })() 35 | 36 | 37 | function writeKeyPair(){ 38 | if(fs.existsSync("etp.private.pem")){ 39 | console.log("etp.private.pem already exists. Rename or move this file") 40 | exit(1) 41 | } 42 | if(fs.existsSync("etp.public.pem")){ 43 | console.log("etp.public.pem already exists. Rename or move this file") 44 | exit(1) 45 | } 46 | 47 | console.log("ETP Private Key written to etp.private.pem") 48 | fs.writeFileSync("etp.private.pem", SecureUtil.privateKey) 49 | console.log("ETP Public Key written to etp.public.pem") 50 | fs.writeFileSync("etp.public.pem", SecureUtil.publicKey) 51 | } 52 | 53 | async function promptQuestions(){ 54 | let questions = [ 55 | { 56 | type: 'input', 57 | name: 'email', 58 | message: "Email for ETP Token?", 59 | validate: email => !validator.isEmail(email) ? "Invalid email" : true 60 | }, 61 | { 62 | type: 'input', 63 | name: 'qr', 64 | message: "Firewalla QR code (json format)?", 65 | validate: validateQrCode, 66 | }, 67 | { 68 | type: 'input', 69 | name: 'localIp', 70 | default: '192.168.1.1', 71 | message: "Firewalla box IP address?", 72 | validate: ip => !validator.isIP(ip) ? "Invalid IP": true, 73 | }, 74 | { 75 | type: 'confirm', 76 | name: 'createNewKeyPair', 77 | default: 'Y', 78 | message: "Create new key pair?", 79 | }, 80 | ] 81 | 82 | return inquirer.prompt(questions) 83 | } 84 | 85 | async function promptKeyPair(){ 86 | let questions = [ 87 | { 88 | type: 'input', 89 | name: 'pubKeyFile', 90 | default: 'etp.public.pem', 91 | message: "Public key file?", 92 | validate: file => !fs.existsSync(file) ? "File not found" : true 93 | }, 94 | { 95 | type: 'input', 96 | name: 'privKeyFile', 97 | default: 'etp.private.pem', 98 | message: "Private key file?", 99 | validate: file => !fs.existsSync(file) ? "File not found" : true 100 | }, 101 | ] 102 | 103 | let {pubKeyFile, privKeyFile} = await inquirer.prompt(questions) 104 | 105 | return { 106 | publicKey: fs.readFileSync(pubKeyFile, {encoding: "utf8"}), 107 | privateKey: fs.readFileSync(privKeyFile, {encoding: "utf8"}) 108 | } 109 | } 110 | 111 | 112 | function validateQrCode(qr) { 113 | try{ 114 | qr = JSON.parse(qr.trim()) 115 | }catch(err){ 116 | return "QR code is not valid json" 117 | } 118 | 119 | let requiredFields = ["gid", "seed", "license", "ek", "ipaddress"] 120 | for(let field of requiredFields){ 121 | if(!(field in qr)){ 122 | return `Field ${field} not in the QR code JSON` 123 | } 124 | } 125 | 126 | return true 127 | } 128 | -------------------------------------------------------------------------------- /create-fireguard-token/.env.sample: -------------------------------------------------------------------------------- 1 | ETP_TOKEN= 2 | -------------------------------------------------------------------------------- /create-fireguard-token/index.js: -------------------------------------------------------------------------------- 1 | import fetch from "node-fetch"; 2 | import crypto from 'crypto'; 3 | import { exit } from "process"; 4 | import * as dotenv from 'dotenv' 5 | dotenv.config() 6 | 7 | const masterToken = process.env.ETP_TOKEN 8 | if(!masterToken){ 9 | console.log("Please set your master token as the ETP_TOKEN environment variable") 10 | exit(1) 11 | } 12 | 13 | const gid = process.env.FIREWALLA_GID 14 | if(!gid){ 15 | console.log("Please set your gid as the FIREWALLA_GID environment variable") 16 | exit(1) 17 | } 18 | 19 | async function authPost(relUrl, body){ 20 | return fetch(`https://my.firewalla.com${relUrl}`, { 21 | method: "POST", 22 | headers: { 23 | Authorization: `Bearer ${masterToken}`, 24 | "Content-Type": "application/json" 25 | }, 26 | body: JSON.stringify(body) 27 | }).then(r => r.json()) 28 | } 29 | 30 | async function createFireguardToken(){ 31 | let token = crypto.randomUUID(); 32 | let resp = await authPost(`/v1/auth/authorize/${token}?days=300`, [{ gid }]) 33 | return resp.token 34 | } 35 | 36 | createFireguardToken().then(console.log) -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firewalla-api", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "firewalla-api", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@types/node": "^17.0.23", 13 | "dotenv": "^16.0.3", 14 | "inquirer": "^9.1.4", 15 | "node-fetch": "^3.2.3", 16 | "node-firewalla": "^1.3.1", 17 | "validator": "^13.7.0" 18 | } 19 | }, 20 | "node_modules/@types/node": { 21 | "version": "17.0.23", 22 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", 23 | "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" 24 | }, 25 | "node_modules/ansi-escapes": { 26 | "version": "6.0.0", 27 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.0.0.tgz", 28 | "integrity": "sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==", 29 | "dependencies": { 30 | "type-fest": "^3.0.0" 31 | }, 32 | "engines": { 33 | "node": ">=14.16" 34 | }, 35 | "funding": { 36 | "url": "https://github.com/sponsors/sindresorhus" 37 | } 38 | }, 39 | "node_modules/ansi-regex": { 40 | "version": "6.0.1", 41 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", 42 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", 43 | "engines": { 44 | "node": ">=12" 45 | }, 46 | "funding": { 47 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 48 | } 49 | }, 50 | "node_modules/ansi-styles": { 51 | "version": "6.2.1", 52 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 53 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 54 | "engines": { 55 | "node": ">=12" 56 | }, 57 | "funding": { 58 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 59 | } 60 | }, 61 | "node_modules/base64-js": { 62 | "version": "1.5.1", 63 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 64 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 65 | "funding": [ 66 | { 67 | "type": "github", 68 | "url": "https://github.com/sponsors/feross" 69 | }, 70 | { 71 | "type": "patreon", 72 | "url": "https://www.patreon.com/feross" 73 | }, 74 | { 75 | "type": "consulting", 76 | "url": "https://feross.org/support" 77 | } 78 | ] 79 | }, 80 | "node_modules/bl": { 81 | "version": "5.1.0", 82 | "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", 83 | "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", 84 | "dependencies": { 85 | "buffer": "^6.0.3", 86 | "inherits": "^2.0.4", 87 | "readable-stream": "^3.4.0" 88 | } 89 | }, 90 | "node_modules/buffer": { 91 | "version": "6.0.3", 92 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 93 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 94 | "funding": [ 95 | { 96 | "type": "github", 97 | "url": "https://github.com/sponsors/feross" 98 | }, 99 | { 100 | "type": "patreon", 101 | "url": "https://www.patreon.com/feross" 102 | }, 103 | { 104 | "type": "consulting", 105 | "url": "https://feross.org/support" 106 | } 107 | ], 108 | "dependencies": { 109 | "base64-js": "^1.3.1", 110 | "ieee754": "^1.2.1" 111 | } 112 | }, 113 | "node_modules/chalk": { 114 | "version": "5.1.2", 115 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", 116 | "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", 117 | "engines": { 118 | "node": "^12.17.0 || ^14.13 || >=16.0.0" 119 | }, 120 | "funding": { 121 | "url": "https://github.com/chalk/chalk?sponsor=1" 122 | } 123 | }, 124 | "node_modules/chardet": { 125 | "version": "0.7.0", 126 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 127 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 128 | }, 129 | "node_modules/cli-cursor": { 130 | "version": "4.0.0", 131 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", 132 | "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", 133 | "dependencies": { 134 | "restore-cursor": "^4.0.0" 135 | }, 136 | "engines": { 137 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 138 | }, 139 | "funding": { 140 | "url": "https://github.com/sponsors/sindresorhus" 141 | } 142 | }, 143 | "node_modules/cli-spinners": { 144 | "version": "2.7.0", 145 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", 146 | "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", 147 | "engines": { 148 | "node": ">=6" 149 | }, 150 | "funding": { 151 | "url": "https://github.com/sponsors/sindresorhus" 152 | } 153 | }, 154 | "node_modules/cli-width": { 155 | "version": "4.0.0", 156 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", 157 | "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==", 158 | "engines": { 159 | "node": ">= 12" 160 | } 161 | }, 162 | "node_modules/clone": { 163 | "version": "1.0.4", 164 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 165 | "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", 166 | "engines": { 167 | "node": ">=0.8" 168 | } 169 | }, 170 | "node_modules/data-uri-to-buffer": { 171 | "version": "4.0.0", 172 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", 173 | "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", 174 | "engines": { 175 | "node": ">= 12" 176 | } 177 | }, 178 | "node_modules/defaults": { 179 | "version": "1.0.4", 180 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", 181 | "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", 182 | "dependencies": { 183 | "clone": "^1.0.2" 184 | }, 185 | "funding": { 186 | "url": "https://github.com/sponsors/sindresorhus" 187 | } 188 | }, 189 | "node_modules/dotenv": { 190 | "version": "16.0.3", 191 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 192 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", 193 | "engines": { 194 | "node": ">=12" 195 | } 196 | }, 197 | "node_modules/eastasianwidth": { 198 | "version": "0.2.0", 199 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 200 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" 201 | }, 202 | "node_modules/emoji-regex": { 203 | "version": "9.2.2", 204 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 205 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" 206 | }, 207 | "node_modules/escape-string-regexp": { 208 | "version": "5.0.0", 209 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", 210 | "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", 211 | "engines": { 212 | "node": ">=12" 213 | }, 214 | "funding": { 215 | "url": "https://github.com/sponsors/sindresorhus" 216 | } 217 | }, 218 | "node_modules/external-editor": { 219 | "version": "3.1.0", 220 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 221 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 222 | "dependencies": { 223 | "chardet": "^0.7.0", 224 | "iconv-lite": "^0.4.24", 225 | "tmp": "^0.0.33" 226 | }, 227 | "engines": { 228 | "node": ">=4" 229 | } 230 | }, 231 | "node_modules/fetch-blob": { 232 | "version": "3.1.5", 233 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.5.tgz", 234 | "integrity": "sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==", 235 | "funding": [ 236 | { 237 | "type": "github", 238 | "url": "https://github.com/sponsors/jimmywarting" 239 | }, 240 | { 241 | "type": "paypal", 242 | "url": "https://paypal.me/jimmywarting" 243 | } 244 | ], 245 | "dependencies": { 246 | "node-domexception": "^1.0.0", 247 | "web-streams-polyfill": "^3.0.3" 248 | }, 249 | "engines": { 250 | "node": "^12.20 || >= 14.13" 251 | } 252 | }, 253 | "node_modules/figures": { 254 | "version": "5.0.0", 255 | "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", 256 | "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", 257 | "dependencies": { 258 | "escape-string-regexp": "^5.0.0", 259 | "is-unicode-supported": "^1.2.0" 260 | }, 261 | "engines": { 262 | "node": ">=14" 263 | }, 264 | "funding": { 265 | "url": "https://github.com/sponsors/sindresorhus" 266 | } 267 | }, 268 | "node_modules/formdata-polyfill": { 269 | "version": "4.0.10", 270 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 271 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 272 | "dependencies": { 273 | "fetch-blob": "^3.1.2" 274 | }, 275 | "engines": { 276 | "node": ">=12.20.0" 277 | } 278 | }, 279 | "node_modules/iconv-lite": { 280 | "version": "0.4.24", 281 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 282 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 283 | "dependencies": { 284 | "safer-buffer": ">= 2.1.2 < 3" 285 | }, 286 | "engines": { 287 | "node": ">=0.10.0" 288 | } 289 | }, 290 | "node_modules/ieee754": { 291 | "version": "1.2.1", 292 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 293 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 294 | "funding": [ 295 | { 296 | "type": "github", 297 | "url": "https://github.com/sponsors/feross" 298 | }, 299 | { 300 | "type": "patreon", 301 | "url": "https://www.patreon.com/feross" 302 | }, 303 | { 304 | "type": "consulting", 305 | "url": "https://feross.org/support" 306 | } 307 | ] 308 | }, 309 | "node_modules/inherits": { 310 | "version": "2.0.4", 311 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 312 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 313 | }, 314 | "node_modules/inquirer": { 315 | "version": "9.1.4", 316 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.4.tgz", 317 | "integrity": "sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA==", 318 | "dependencies": { 319 | "ansi-escapes": "^6.0.0", 320 | "chalk": "^5.1.2", 321 | "cli-cursor": "^4.0.0", 322 | "cli-width": "^4.0.0", 323 | "external-editor": "^3.0.3", 324 | "figures": "^5.0.0", 325 | "lodash": "^4.17.21", 326 | "mute-stream": "0.0.8", 327 | "ora": "^6.1.2", 328 | "run-async": "^2.4.0", 329 | "rxjs": "^7.5.7", 330 | "string-width": "^5.1.2", 331 | "strip-ansi": "^7.0.1", 332 | "through": "^2.3.6", 333 | "wrap-ansi": "^8.0.1" 334 | }, 335 | "engines": { 336 | "node": ">=12.0.0" 337 | } 338 | }, 339 | "node_modules/is-interactive": { 340 | "version": "2.0.0", 341 | "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", 342 | "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", 343 | "engines": { 344 | "node": ">=12" 345 | }, 346 | "funding": { 347 | "url": "https://github.com/sponsors/sindresorhus" 348 | } 349 | }, 350 | "node_modules/is-unicode-supported": { 351 | "version": "1.3.0", 352 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", 353 | "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", 354 | "engines": { 355 | "node": ">=12" 356 | }, 357 | "funding": { 358 | "url": "https://github.com/sponsors/sindresorhus" 359 | } 360 | }, 361 | "node_modules/lodash": { 362 | "version": "4.17.21", 363 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 364 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 365 | }, 366 | "node_modules/log-symbols": { 367 | "version": "5.1.0", 368 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", 369 | "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", 370 | "dependencies": { 371 | "chalk": "^5.0.0", 372 | "is-unicode-supported": "^1.1.0" 373 | }, 374 | "engines": { 375 | "node": ">=12" 376 | }, 377 | "funding": { 378 | "url": "https://github.com/sponsors/sindresorhus" 379 | } 380 | }, 381 | "node_modules/mimic-fn": { 382 | "version": "2.1.0", 383 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 384 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 385 | "engines": { 386 | "node": ">=6" 387 | } 388 | }, 389 | "node_modules/mute-stream": { 390 | "version": "0.0.8", 391 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 392 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 393 | }, 394 | "node_modules/node-domexception": { 395 | "version": "1.0.0", 396 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 397 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 398 | "funding": [ 399 | { 400 | "type": "github", 401 | "url": "https://github.com/sponsors/jimmywarting" 402 | }, 403 | { 404 | "type": "github", 405 | "url": "https://paypal.me/jimmywarting" 406 | } 407 | ], 408 | "engines": { 409 | "node": ">=10.5.0" 410 | } 411 | }, 412 | "node_modules/node-fetch": { 413 | "version": "3.3.0", 414 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", 415 | "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", 416 | "dependencies": { 417 | "data-uri-to-buffer": "^4.0.0", 418 | "fetch-blob": "^3.1.4", 419 | "formdata-polyfill": "^4.0.10" 420 | }, 421 | "engines": { 422 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 423 | }, 424 | "funding": { 425 | "type": "opencollective", 426 | "url": "https://opencollective.com/node-fetch" 427 | } 428 | }, 429 | "node_modules/node-firewalla": { 430 | "version": "1.3.1", 431 | "resolved": "https://registry.npmjs.org/node-firewalla/-/node-firewalla-1.3.1.tgz", 432 | "integrity": "sha512-lc0XbFje0jjSVeyKphU1rf+0j60CDoa2qSiZEbYJt0j5rn3k3IMuvq2c58TlMlRuy/Sj48B9z1QnF/sOZvdD4A==", 433 | "dependencies": { 434 | "@types/node": "^17.0.23", 435 | "dotenv": "^16.0.3", 436 | "node-fetch": "^3.2.3", 437 | "typescript": "^4.9.3" 438 | } 439 | }, 440 | "node_modules/onetime": { 441 | "version": "5.1.2", 442 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 443 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 444 | "dependencies": { 445 | "mimic-fn": "^2.1.0" 446 | }, 447 | "engines": { 448 | "node": ">=6" 449 | }, 450 | "funding": { 451 | "url": "https://github.com/sponsors/sindresorhus" 452 | } 453 | }, 454 | "node_modules/ora": { 455 | "version": "6.1.2", 456 | "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", 457 | "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", 458 | "dependencies": { 459 | "bl": "^5.0.0", 460 | "chalk": "^5.0.0", 461 | "cli-cursor": "^4.0.0", 462 | "cli-spinners": "^2.6.1", 463 | "is-interactive": "^2.0.0", 464 | "is-unicode-supported": "^1.1.0", 465 | "log-symbols": "^5.1.0", 466 | "strip-ansi": "^7.0.1", 467 | "wcwidth": "^1.0.1" 468 | }, 469 | "engines": { 470 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 471 | }, 472 | "funding": { 473 | "url": "https://github.com/sponsors/sindresorhus" 474 | } 475 | }, 476 | "node_modules/os-tmpdir": { 477 | "version": "1.0.2", 478 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 479 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", 480 | "engines": { 481 | "node": ">=0.10.0" 482 | } 483 | }, 484 | "node_modules/readable-stream": { 485 | "version": "3.6.0", 486 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 487 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 488 | "dependencies": { 489 | "inherits": "^2.0.3", 490 | "string_decoder": "^1.1.1", 491 | "util-deprecate": "^1.0.1" 492 | }, 493 | "engines": { 494 | "node": ">= 6" 495 | } 496 | }, 497 | "node_modules/restore-cursor": { 498 | "version": "4.0.0", 499 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", 500 | "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", 501 | "dependencies": { 502 | "onetime": "^5.1.0", 503 | "signal-exit": "^3.0.2" 504 | }, 505 | "engines": { 506 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 507 | }, 508 | "funding": { 509 | "url": "https://github.com/sponsors/sindresorhus" 510 | } 511 | }, 512 | "node_modules/run-async": { 513 | "version": "2.4.1", 514 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 515 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 516 | "engines": { 517 | "node": ">=0.12.0" 518 | } 519 | }, 520 | "node_modules/rxjs": { 521 | "version": "7.6.0", 522 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz", 523 | "integrity": "sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==", 524 | "dependencies": { 525 | "tslib": "^2.1.0" 526 | } 527 | }, 528 | "node_modules/safe-buffer": { 529 | "version": "5.2.1", 530 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 531 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 532 | "funding": [ 533 | { 534 | "type": "github", 535 | "url": "https://github.com/sponsors/feross" 536 | }, 537 | { 538 | "type": "patreon", 539 | "url": "https://www.patreon.com/feross" 540 | }, 541 | { 542 | "type": "consulting", 543 | "url": "https://feross.org/support" 544 | } 545 | ] 546 | }, 547 | "node_modules/safer-buffer": { 548 | "version": "2.1.2", 549 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 550 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 551 | }, 552 | "node_modules/signal-exit": { 553 | "version": "3.0.7", 554 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 555 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 556 | }, 557 | "node_modules/string_decoder": { 558 | "version": "1.3.0", 559 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 560 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 561 | "dependencies": { 562 | "safe-buffer": "~5.2.0" 563 | } 564 | }, 565 | "node_modules/string-width": { 566 | "version": "5.1.2", 567 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 568 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 569 | "dependencies": { 570 | "eastasianwidth": "^0.2.0", 571 | "emoji-regex": "^9.2.2", 572 | "strip-ansi": "^7.0.1" 573 | }, 574 | "engines": { 575 | "node": ">=12" 576 | }, 577 | "funding": { 578 | "url": "https://github.com/sponsors/sindresorhus" 579 | } 580 | }, 581 | "node_modules/strip-ansi": { 582 | "version": "7.0.1", 583 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", 584 | "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", 585 | "dependencies": { 586 | "ansi-regex": "^6.0.1" 587 | }, 588 | "engines": { 589 | "node": ">=12" 590 | }, 591 | "funding": { 592 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 593 | } 594 | }, 595 | "node_modules/through": { 596 | "version": "2.3.8", 597 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 598 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" 599 | }, 600 | "node_modules/tmp": { 601 | "version": "0.0.33", 602 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 603 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 604 | "dependencies": { 605 | "os-tmpdir": "~1.0.2" 606 | }, 607 | "engines": { 608 | "node": ">=0.6.0" 609 | } 610 | }, 611 | "node_modules/tslib": { 612 | "version": "2.4.1", 613 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", 614 | "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" 615 | }, 616 | "node_modules/type-fest": { 617 | "version": "3.3.0", 618 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.3.0.tgz", 619 | "integrity": "sha512-gezeeOIZyQLGW5uuCeEnXF1aXmtt2afKspXz3YqoOcZ3l/YMJq1pujvgT+cz/Nw1O/7q/kSav5fihJHsC/AOUg==", 620 | "engines": { 621 | "node": ">=14.16" 622 | }, 623 | "funding": { 624 | "url": "https://github.com/sponsors/sindresorhus" 625 | } 626 | }, 627 | "node_modules/typescript": { 628 | "version": "4.9.3", 629 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", 630 | "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", 631 | "bin": { 632 | "tsc": "bin/tsc", 633 | "tsserver": "bin/tsserver" 634 | }, 635 | "engines": { 636 | "node": ">=4.2.0" 637 | } 638 | }, 639 | "node_modules/util-deprecate": { 640 | "version": "1.0.2", 641 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 642 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 643 | }, 644 | "node_modules/validator": { 645 | "version": "13.7.0", 646 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", 647 | "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", 648 | "engines": { 649 | "node": ">= 0.10" 650 | } 651 | }, 652 | "node_modules/wcwidth": { 653 | "version": "1.0.1", 654 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 655 | "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", 656 | "dependencies": { 657 | "defaults": "^1.0.3" 658 | } 659 | }, 660 | "node_modules/web-streams-polyfill": { 661 | "version": "3.2.0", 662 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz", 663 | "integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==", 664 | "engines": { 665 | "node": ">= 8" 666 | } 667 | }, 668 | "node_modules/wrap-ansi": { 669 | "version": "8.0.1", 670 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", 671 | "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", 672 | "dependencies": { 673 | "ansi-styles": "^6.1.0", 674 | "string-width": "^5.0.1", 675 | "strip-ansi": "^7.0.1" 676 | }, 677 | "engines": { 678 | "node": ">=12" 679 | }, 680 | "funding": { 681 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 682 | } 683 | } 684 | }, 685 | "dependencies": { 686 | "@types/node": { 687 | "version": "17.0.23", 688 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", 689 | "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" 690 | }, 691 | "ansi-escapes": { 692 | "version": "6.0.0", 693 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.0.0.tgz", 694 | "integrity": "sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==", 695 | "requires": { 696 | "type-fest": "^3.0.0" 697 | } 698 | }, 699 | "ansi-regex": { 700 | "version": "6.0.1", 701 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", 702 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" 703 | }, 704 | "ansi-styles": { 705 | "version": "6.2.1", 706 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 707 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" 708 | }, 709 | "base64-js": { 710 | "version": "1.5.1", 711 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 712 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 713 | }, 714 | "bl": { 715 | "version": "5.1.0", 716 | "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", 717 | "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", 718 | "requires": { 719 | "buffer": "^6.0.3", 720 | "inherits": "^2.0.4", 721 | "readable-stream": "^3.4.0" 722 | } 723 | }, 724 | "buffer": { 725 | "version": "6.0.3", 726 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 727 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 728 | "requires": { 729 | "base64-js": "^1.3.1", 730 | "ieee754": "^1.2.1" 731 | } 732 | }, 733 | "chalk": { 734 | "version": "5.1.2", 735 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", 736 | "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==" 737 | }, 738 | "chardet": { 739 | "version": "0.7.0", 740 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 741 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 742 | }, 743 | "cli-cursor": { 744 | "version": "4.0.0", 745 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", 746 | "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", 747 | "requires": { 748 | "restore-cursor": "^4.0.0" 749 | } 750 | }, 751 | "cli-spinners": { 752 | "version": "2.7.0", 753 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", 754 | "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==" 755 | }, 756 | "cli-width": { 757 | "version": "4.0.0", 758 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", 759 | "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==" 760 | }, 761 | "clone": { 762 | "version": "1.0.4", 763 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 764 | "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" 765 | }, 766 | "data-uri-to-buffer": { 767 | "version": "4.0.0", 768 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", 769 | "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" 770 | }, 771 | "defaults": { 772 | "version": "1.0.4", 773 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", 774 | "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", 775 | "requires": { 776 | "clone": "^1.0.2" 777 | } 778 | }, 779 | "dotenv": { 780 | "version": "16.0.3", 781 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 782 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" 783 | }, 784 | "eastasianwidth": { 785 | "version": "0.2.0", 786 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 787 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" 788 | }, 789 | "emoji-regex": { 790 | "version": "9.2.2", 791 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 792 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" 793 | }, 794 | "escape-string-regexp": { 795 | "version": "5.0.0", 796 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", 797 | "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" 798 | }, 799 | "external-editor": { 800 | "version": "3.1.0", 801 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 802 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 803 | "requires": { 804 | "chardet": "^0.7.0", 805 | "iconv-lite": "^0.4.24", 806 | "tmp": "^0.0.33" 807 | } 808 | }, 809 | "fetch-blob": { 810 | "version": "3.1.5", 811 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.5.tgz", 812 | "integrity": "sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==", 813 | "requires": { 814 | "node-domexception": "^1.0.0", 815 | "web-streams-polyfill": "^3.0.3" 816 | } 817 | }, 818 | "figures": { 819 | "version": "5.0.0", 820 | "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", 821 | "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", 822 | "requires": { 823 | "escape-string-regexp": "^5.0.0", 824 | "is-unicode-supported": "^1.2.0" 825 | } 826 | }, 827 | "formdata-polyfill": { 828 | "version": "4.0.10", 829 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 830 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 831 | "requires": { 832 | "fetch-blob": "^3.1.2" 833 | } 834 | }, 835 | "iconv-lite": { 836 | "version": "0.4.24", 837 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 838 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 839 | "requires": { 840 | "safer-buffer": ">= 2.1.2 < 3" 841 | } 842 | }, 843 | "ieee754": { 844 | "version": "1.2.1", 845 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 846 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 847 | }, 848 | "inherits": { 849 | "version": "2.0.4", 850 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 851 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 852 | }, 853 | "inquirer": { 854 | "version": "9.1.4", 855 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.4.tgz", 856 | "integrity": "sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA==", 857 | "requires": { 858 | "ansi-escapes": "^6.0.0", 859 | "chalk": "^5.1.2", 860 | "cli-cursor": "^4.0.0", 861 | "cli-width": "^4.0.0", 862 | "external-editor": "^3.0.3", 863 | "figures": "^5.0.0", 864 | "lodash": "^4.17.21", 865 | "mute-stream": "0.0.8", 866 | "ora": "^6.1.2", 867 | "run-async": "^2.4.0", 868 | "rxjs": "^7.5.7", 869 | "string-width": "^5.1.2", 870 | "strip-ansi": "^7.0.1", 871 | "through": "^2.3.6", 872 | "wrap-ansi": "^8.0.1" 873 | } 874 | }, 875 | "is-interactive": { 876 | "version": "2.0.0", 877 | "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", 878 | "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==" 879 | }, 880 | "is-unicode-supported": { 881 | "version": "1.3.0", 882 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", 883 | "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==" 884 | }, 885 | "lodash": { 886 | "version": "4.17.21", 887 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 888 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 889 | }, 890 | "log-symbols": { 891 | "version": "5.1.0", 892 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", 893 | "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", 894 | "requires": { 895 | "chalk": "^5.0.0", 896 | "is-unicode-supported": "^1.1.0" 897 | } 898 | }, 899 | "mimic-fn": { 900 | "version": "2.1.0", 901 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 902 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 903 | }, 904 | "mute-stream": { 905 | "version": "0.0.8", 906 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 907 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 908 | }, 909 | "node-domexception": { 910 | "version": "1.0.0", 911 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 912 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" 913 | }, 914 | "node-fetch": { 915 | "version": "3.3.0", 916 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", 917 | "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", 918 | "requires": { 919 | "data-uri-to-buffer": "^4.0.0", 920 | "fetch-blob": "^3.1.4", 921 | "formdata-polyfill": "^4.0.10" 922 | } 923 | }, 924 | "node-firewalla": { 925 | "version": "1.3.1", 926 | "resolved": "https://registry.npmjs.org/node-firewalla/-/node-firewalla-1.3.1.tgz", 927 | "integrity": "sha512-lc0XbFje0jjSVeyKphU1rf+0j60CDoa2qSiZEbYJt0j5rn3k3IMuvq2c58TlMlRuy/Sj48B9z1QnF/sOZvdD4A==", 928 | "requires": { 929 | "@types/node": "^17.0.23", 930 | "dotenv": "^16.0.3", 931 | "node-fetch": "^3.2.3", 932 | "typescript": "^4.9.3" 933 | } 934 | }, 935 | "onetime": { 936 | "version": "5.1.2", 937 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 938 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 939 | "requires": { 940 | "mimic-fn": "^2.1.0" 941 | } 942 | }, 943 | "ora": { 944 | "version": "6.1.2", 945 | "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", 946 | "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", 947 | "requires": { 948 | "bl": "^5.0.0", 949 | "chalk": "^5.0.0", 950 | "cli-cursor": "^4.0.0", 951 | "cli-spinners": "^2.6.1", 952 | "is-interactive": "^2.0.0", 953 | "is-unicode-supported": "^1.1.0", 954 | "log-symbols": "^5.1.0", 955 | "strip-ansi": "^7.0.1", 956 | "wcwidth": "^1.0.1" 957 | } 958 | }, 959 | "os-tmpdir": { 960 | "version": "1.0.2", 961 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 962 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" 963 | }, 964 | "readable-stream": { 965 | "version": "3.6.0", 966 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 967 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 968 | "requires": { 969 | "inherits": "^2.0.3", 970 | "string_decoder": "^1.1.1", 971 | "util-deprecate": "^1.0.1" 972 | } 973 | }, 974 | "restore-cursor": { 975 | "version": "4.0.0", 976 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", 977 | "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", 978 | "requires": { 979 | "onetime": "^5.1.0", 980 | "signal-exit": "^3.0.2" 981 | } 982 | }, 983 | "run-async": { 984 | "version": "2.4.1", 985 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 986 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" 987 | }, 988 | "rxjs": { 989 | "version": "7.6.0", 990 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz", 991 | "integrity": "sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==", 992 | "requires": { 993 | "tslib": "^2.1.0" 994 | } 995 | }, 996 | "safe-buffer": { 997 | "version": "5.2.1", 998 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 999 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1000 | }, 1001 | "safer-buffer": { 1002 | "version": "2.1.2", 1003 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1004 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1005 | }, 1006 | "signal-exit": { 1007 | "version": "3.0.7", 1008 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1009 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 1010 | }, 1011 | "string_decoder": { 1012 | "version": "1.3.0", 1013 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1014 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1015 | "requires": { 1016 | "safe-buffer": "~5.2.0" 1017 | } 1018 | }, 1019 | "string-width": { 1020 | "version": "5.1.2", 1021 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1022 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1023 | "requires": { 1024 | "eastasianwidth": "^0.2.0", 1025 | "emoji-regex": "^9.2.2", 1026 | "strip-ansi": "^7.0.1" 1027 | } 1028 | }, 1029 | "strip-ansi": { 1030 | "version": "7.0.1", 1031 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", 1032 | "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", 1033 | "requires": { 1034 | "ansi-regex": "^6.0.1" 1035 | } 1036 | }, 1037 | "through": { 1038 | "version": "2.3.8", 1039 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1040 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" 1041 | }, 1042 | "tmp": { 1043 | "version": "0.0.33", 1044 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1045 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1046 | "requires": { 1047 | "os-tmpdir": "~1.0.2" 1048 | } 1049 | }, 1050 | "tslib": { 1051 | "version": "2.4.1", 1052 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", 1053 | "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" 1054 | }, 1055 | "type-fest": { 1056 | "version": "3.3.0", 1057 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.3.0.tgz", 1058 | "integrity": "sha512-gezeeOIZyQLGW5uuCeEnXF1aXmtt2afKspXz3YqoOcZ3l/YMJq1pujvgT+cz/Nw1O/7q/kSav5fihJHsC/AOUg==" 1059 | }, 1060 | "typescript": { 1061 | "version": "4.9.3", 1062 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", 1063 | "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==" 1064 | }, 1065 | "util-deprecate": { 1066 | "version": "1.0.2", 1067 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1068 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1069 | }, 1070 | "validator": { 1071 | "version": "13.7.0", 1072 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", 1073 | "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" 1074 | }, 1075 | "wcwidth": { 1076 | "version": "1.0.1", 1077 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 1078 | "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", 1079 | "requires": { 1080 | "defaults": "^1.0.3" 1081 | } 1082 | }, 1083 | "web-streams-polyfill": { 1084 | "version": "3.2.0", 1085 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz", 1086 | "integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==" 1087 | }, 1088 | "wrap-ansi": { 1089 | "version": "8.0.1", 1090 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", 1091 | "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", 1092 | "requires": { 1093 | "ansi-styles": "^6.1.0", 1094 | "string-width": "^5.0.1", 1095 | "strip-ansi": "^7.0.1" 1096 | } 1097 | } 1098 | } 1099 | } 1100 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firewalla-api", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "description": "", 6 | "main": "index.js", 7 | "scripts": { 8 | "compile": "tsc", 9 | "start": "npm run compile && node dist/index.js", 10 | "test": "echo \"Error: no test specified\" && exit 1" 11 | }, 12 | "author": "", 13 | "license": "ISC", 14 | "dependencies": { 15 | "@types/node": "^17.0.23", 16 | "dotenv": "^16.0.3", 17 | "inquirer": "^9.1.4", 18 | "node-fetch": "^3.2.3", 19 | "node-firewalla": "^1.3.1", 20 | "validator": "^13.7.0" 21 | } 22 | } 23 | --------------------------------------------------------------------------------