Repository: appium/appium
Pull request #17325 (2022-08-07 19:52:24)

feat(appium): Adjust NODE_PATH so NPM could properly resolve component peer dependencies
## Proposed changes

According to https://nodejs.org/api/modules.html#loading-from-the-global-folders NPM should respect NODE_PATH every time it tries to resolve a module path. The idea here is that all NPM processes we start using `appium` CLI should automatically inherit parent process env, so this variable should always contain a valid path to `node_modules` root where `appium` monorepo is installed. I assume this solution would allow to avoid issues we got in https://github.com/appium/appium/pull/17297 and at the same time would allow to reduce the deployment size and the unnecessary modules duplication. This approach should also work for older NPM releases

## Types of changes

- [ ] Bugfix (non-breaking change which fixes an issue)
- [x] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Documentation Update (if none of the other choices apply)



Patch:
diff --git a/.eslintignore b/.eslintignore
index 3f6c2c929..8422e9b35 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -7,3 +7,4 @@ sample-code
 **/*.d.ts
 **/build-fixtures/**
 **/*.ts
+packages/appium/docs/**/assets/**
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 49f703ccb..7ccc01891 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -29,11 +29,10 @@ jobs:
         with:
           useRollingCache: true
       - name: Run smoke tests
-        uses: boneskull/nodejs-production-test-action@v1
+        uses: boneskull/nodejs-production-test-action@fb21ee0ae5c9e7213d795de9dfc1919332ffe9e1 # tag=v1
         with:
           script: test:smoke
           workspaces: true
-          quiet: true
       - name: Run unit & E2E tests
         run: npm run test:ci
 
diff --git a/package-lock.json b/package-lock.json
index c3a48beb5..33b23eac9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -36,17 +36,16 @@
         "@appium/fake-plugin": "1.3.1",
         "@babel/cli": "7.18.10",
         "@babel/core": "7.18.10",
-        "@babel/eslint-parser": "7.18.9",
         "@babel/plugin-transform-runtime": "7.18.10",
         "@babel/preset-env": "7.18.10",
         "@babel/register": "7.18.9",
         "@babel/runtime": "7.18.9",
         "@colors/colors": "1.5.0",
-        "@types/chai": "4.3.1",
+        "@types/chai": "4.3.3",
         "@types/chai-as-promised": "7.1.5",
         "@types/mocha": "9.1.1",
-        "@types/node": "16.11.47",
-        "@types/semver": "7.3.10",
+        "@types/node": "16.11.51",
+        "@types/semver": "7.3.12",
         "@types/sinon": "10.0.13",
         "@types/sinon-chai": "3.2.8",
         "@types/teen_process": "1.16.1",
@@ -57,11 +56,11 @@
         "chai": "4.3.6",
         "chai-as-promised": "7.1.1",
         "chai-webdriverio-async": "2.7.0",
-        "eslint": "7.32.0",
+        "eslint": "8.22.0",
         "eslint-config-prettier": "8.5.0",
         "eslint-find-rules": "4.1.0",
         "eslint-plugin-import": "2.26.0",
-        "eslint-plugin-mocha": "9.0.0",
+        "eslint-plugin-mocha": "10.1.0",
         "eslint-plugin-promise": "6.0.0",
         "fancy-log": "2.0.0",
         "finalhandler": "1.2.0",
@@ -87,7 +86,7 @@
         "through2": "4.0.2",
         "typescript": "4.7.4",
         "validate.js": "0.13.1",
-        "webdriverio": "7.20.9",
+        "webdriverio": "7.21.0",
         "ws": "8.8.1",
         "yaml-js": "0.3.1"
       },
@@ -188,9 +187,8 @@
     },
     "node_modules/@babel/cli": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.18.10.tgz",
-      "integrity": "sha512-dLvWH+ZDFAkd2jPBSghrsFBuXrREvFwjpDycXbmUoeochqKYe4zNSLEJYErpLg8dvxvZYe79/MkN461XCwpnGw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/trace-mapping": "^0.3.8",
         "commander": "^4.0.1",
@@ -217,9 +215,8 @@
     },
     "node_modules/@babel/cli/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -247,16 +244,14 @@
     },
     "node_modules/@babel/compat-data": {
       "version": "7.18.8",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz",
-      "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/core": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz",
-      "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==",
+      "license": "MIT",
       "dependencies": {
         "@ampproject/remapping": "^2.1.0",
         "@babel/code-frame": "^7.18.6",
@@ -284,16 +279,14 @@
     },
     "node_modules/@babel/core/node_modules/semver": {
       "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/eslint-parser": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz",
-      "integrity": "sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ==",
+      "license": "MIT",
       "dependencies": {
         "eslint-scope": "^5.1.1",
         "eslint-visitor-keys": "^2.1.0",
@@ -309,16 +302,14 @@
     },
     "node_modules/@babel/eslint-parser/node_modules/semver": {
       "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/generator": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz",
-      "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==",
+      "license": "MIT",
       "dependencies": {
         "@babel/types": "^7.18.10",
         "@jridgewell/gen-mapping": "^0.3.2",
@@ -330,8 +321,7 @@
     },
     "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
       "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
-      "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/set-array": "^1.0.1",
         "@jridgewell/sourcemap-codec": "^1.4.10",
@@ -364,8 +354,7 @@
     },
     "node_modules/@babel/helper-compilation-targets": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz",
-      "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==",
+      "license": "MIT",
       "dependencies": {
         "@babel/compat-data": "^7.18.8",
         "@babel/helper-validator-option": "^7.18.6",
@@ -421,8 +410,7 @@
     },
     "node_modules/@babel/helper-define-polyfill-provider": {
       "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz",
-      "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-compilation-targets": "^7.17.7",
         "@babel/helper-plugin-utils": "^7.16.7",
@@ -437,16 +425,14 @@
     },
     "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": {
       "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/helper-environment-visitor": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
-      "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -463,8 +449,7 @@
     },
     "node_modules/@babel/helper-function-name": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz",
-      "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==",
+      "license": "MIT",
       "dependencies": {
         "@babel/template": "^7.18.6",
         "@babel/types": "^7.18.9"
@@ -485,8 +470,7 @@
     },
     "node_modules/@babel/helper-member-expression-to-functions": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz",
-      "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==",
+      "license": "MIT",
       "dependencies": {
         "@babel/types": "^7.18.9"
       },
@@ -506,8 +490,7 @@
     },
     "node_modules/@babel/helper-module-transforms": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz",
-      "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-environment-visitor": "^7.18.9",
         "@babel/helper-module-imports": "^7.18.6",
@@ -534,16 +517,14 @@
     },
     "node_modules/@babel/helper-plugin-utils": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz",
-      "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-remap-async-to-generator": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz",
-      "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
         "@babel/helper-environment-visitor": "^7.18.9",
@@ -559,8 +540,7 @@
     },
     "node_modules/@babel/helper-replace-supers": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz",
-      "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-environment-visitor": "^7.18.9",
         "@babel/helper-member-expression-to-functions": "^7.18.9",
@@ -584,8 +564,7 @@
     },
     "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz",
-      "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==",
+      "license": "MIT",
       "dependencies": {
         "@babel/types": "^7.18.9"
       },
@@ -605,8 +584,7 @@
     },
     "node_modules/@babel/helper-string-parser": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz",
-      "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -627,8 +605,7 @@
     },
     "node_modules/@babel/helper-wrap-function": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz",
-      "integrity": "sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-function-name": "^7.18.9",
         "@babel/template": "^7.18.10",
@@ -641,8 +618,7 @@
     },
     "node_modules/@babel/helpers": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz",
-      "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==",
+      "license": "MIT",
       "dependencies": {
         "@babel/template": "^7.18.6",
         "@babel/traverse": "^7.18.9",
@@ -666,8 +642,7 @@
     },
     "node_modules/@babel/parser": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.10.tgz",
-      "integrity": "sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg==",
+      "license": "MIT",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -690,8 +665,7 @@
     },
     "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz",
-      "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.9",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
@@ -706,8 +680,7 @@
     },
     "node_modules/@babel/plugin-proposal-async-generator-functions": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz",
-      "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-environment-visitor": "^7.18.9",
         "@babel/helper-plugin-utils": "^7.18.9",
@@ -766,8 +739,7 @@
     },
     "node_modules/@babel/plugin-proposal-export-namespace-from": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz",
-      "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.9",
         "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
@@ -795,8 +767,7 @@
     },
     "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz",
-      "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.9",
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
@@ -838,8 +809,7 @@
     },
     "node_modules/@babel/plugin-proposal-object-rest-spread": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz",
-      "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==",
+      "license": "MIT",
       "dependencies": {
         "@babel/compat-data": "^7.18.8",
         "@babel/helper-compilation-targets": "^7.18.9",
@@ -870,8 +840,7 @@
     },
     "node_modules/@babel/plugin-proposal-optional-chaining": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz",
-      "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.9",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
@@ -1133,8 +1102,7 @@
     },
     "node_modules/@babel/plugin-transform-block-scoping": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz",
-      "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.9"
       },
@@ -1147,8 +1115,7 @@
     },
     "node_modules/@babel/plugin-transform-classes": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz",
-      "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
         "@babel/helper-environment-visitor": "^7.18.9",
@@ -1168,8 +1135,7 @@
     },
     "node_modules/@babel/plugin-transform-computed-properties": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz",
-      "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.9"
       },
@@ -1182,8 +1148,7 @@
     },
     "node_modules/@babel/plugin-transform-destructuring": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz",
-      "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.9"
       },
@@ -1210,8 +1175,7 @@
     },
     "node_modules/@babel/plugin-transform-duplicate-keys": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz",
-      "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.9"
       },
@@ -1238,8 +1202,7 @@
     },
     "node_modules/@babel/plugin-transform-for-of": {
       "version": "7.18.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz",
-      "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.6"
       },
@@ -1252,8 +1215,7 @@
     },
     "node_modules/@babel/plugin-transform-function-name": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz",
-      "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-compilation-targets": "^7.18.9",
         "@babel/helper-function-name": "^7.18.9",
@@ -1268,8 +1230,7 @@
     },
     "node_modules/@babel/plugin-transform-literals": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz",
-      "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.9"
       },
@@ -1326,8 +1287,7 @@
     },
     "node_modules/@babel/plugin-transform-modules-systemjs": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz",
-      "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-hoist-variables": "^7.18.6",
         "@babel/helper-module-transforms": "^7.18.9",
@@ -1399,8 +1359,7 @@
     },
     "node_modules/@babel/plugin-transform-parameters": {
       "version": "7.18.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz",
-      "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.6"
       },
@@ -1453,8 +1412,7 @@
     },
     "node_modules/@babel/plugin-transform-runtime": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz",
-      "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-module-imports": "^7.18.6",
         "@babel/helper-plugin-utils": "^7.18.9",
@@ -1472,8 +1430,7 @@
     },
     "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
       "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
@@ -1493,8 +1450,7 @@
     },
     "node_modules/@babel/plugin-transform-spread": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz",
-      "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.9",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9"
@@ -1521,8 +1477,7 @@
     },
     "node_modules/@babel/plugin-transform-template-literals": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz",
-      "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.9"
       },
@@ -1535,8 +1490,7 @@
     },
     "node_modules/@babel/plugin-transform-typeof-symbol": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz",
-      "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.9"
       },
@@ -1549,8 +1503,7 @@
     },
     "node_modules/@babel/plugin-transform-unicode-escapes": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz",
-      "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.18.9"
       },
@@ -1577,8 +1530,7 @@
     },
     "node_modules/@babel/preset-env": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz",
-      "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==",
+      "license": "MIT",
       "dependencies": {
         "@babel/compat-data": "^7.18.8",
         "@babel/helper-compilation-targets": "^7.18.9",
@@ -1665,8 +1617,7 @@
     },
     "node_modules/@babel/preset-env/node_modules/semver": {
       "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
@@ -1687,9 +1638,8 @@
     },
     "node_modules/@babel/register": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.9.tgz",
-      "integrity": "sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "clone-deep": "^4.0.1",
         "find-cache-dir": "^2.0.0",
@@ -1706,8 +1656,7 @@
     },
     "node_modules/@babel/runtime": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz",
-      "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==",
+      "license": "MIT",
       "dependencies": {
         "regenerator-runtime": "^0.13.4"
       },
@@ -1717,8 +1666,7 @@
     },
     "node_modules/@babel/template": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
-      "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
+      "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.18.6",
         "@babel/parser": "^7.18.10",
@@ -1730,8 +1678,7 @@
     },
     "node_modules/@babel/traverse": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.10.tgz",
-      "integrity": "sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g==",
+      "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.18.6",
         "@babel/generator": "^7.18.10",
@@ -1750,8 +1697,7 @@
     },
     "node_modules/@babel/types": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz",
-      "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-string-parser": "^7.18.10",
         "@babel/helper-validator-identifier": "^7.18.6",
@@ -1778,26 +1724,28 @@
       }
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "0.4.3",
-      "license": "MIT",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
+      "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
       "dependencies": {
         "ajv": "^6.12.4",
-        "debug": "^4.1.1",
-        "espree": "^7.3.0",
-        "globals": "^13.9.0",
-        "ignore": "^4.0.6",
+        "debug": "^4.3.2",
+        "espree": "^9.3.2",
+        "globals": "^13.15.0",
+        "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
-        "js-yaml": "^3.13.1",
-        "minimatch": "^3.0.4",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
         "strip-json-comments": "^3.1.1"
       },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
     "node_modules/@eslint/eslintrc/node_modules/ajv": {
       "version": "6.12.6",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -1809,16 +1757,10 @@
         "url": "https://github.com/sponsors/epoberezkin"
       }
     },
-    "node_modules/@eslint/eslintrc/node_modules/argparse": {
-      "version": "1.0.10",
-      "license": "MIT",
-      "dependencies": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
     "node_modules/@eslint/eslintrc/node_modules/globals": {
-      "version": "13.15.0",
-      "license": "MIT",
+      "version": "13.17.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+      "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
       "dependencies": {
         "type-fest": "^0.20.2"
       },
@@ -1829,24 +1771,23 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
-      "version": "3.14.1",
-      "license": "MIT",
-      "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
+    "node_modules/@eslint/eslintrc/node_modules/ignore": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+      "engines": {
+        "node": ">= 4"
       }
     },
     "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
       "version": "0.4.1",
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
     },
     "node_modules/@eslint/eslintrc/node_modules/type-fest": {
       "version": "0.20.2",
-      "license": "(MIT OR CC0-1.0)",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
       "engines": {
         "node": ">=10"
       },
@@ -1945,10 +1886,11 @@
       }
     },
     "node_modules/@humanwhocodes/config-array": {
-      "version": "0.5.0",
-      "license": "Apache-2.0",
+      "version": "0.10.4",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz",
+      "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==",
       "dependencies": {
-        "@humanwhocodes/object-schema": "^1.2.0",
+        "@humanwhocodes/object-schema": "^1.2.1",
         "debug": "^4.1.1",
         "minimatch": "^3.0.4"
       },
@@ -1956,9 +1898,19 @@
         "node": ">=10.10.0"
       }
     },
+    "node_modules/@humanwhocodes/gitignore-to-minimatch": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz",
+      "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
     "node_modules/@humanwhocodes/object-schema": {
       "version": "1.2.1",
-      "license": "BSD-3-Clause"
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
     },
     "node_modules/@hutson/parse-repository-url": {
       "version": "3.0.2",
@@ -6747,9 +6699,8 @@
     },
     "node_modules/@npmcli/run-script/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -7133,7 +7084,7 @@
       }
     },
     "node_modules/@types/chai": {
-      "version": "4.3.1",
+      "version": "4.3.3",
       "dev": true,
       "license": "MIT"
     },
@@ -7307,9 +7258,9 @@
       }
     },
     "node_modules/@types/node": {
-      "version": "16.11.47",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.47.tgz",
-      "integrity": "sha512-fpP+jk2zJ4VW66+wAMFoBJlx1bxmBKx4DUFf68UHgdGCOuyUTDlLWqsaNPJh7xhNDykyJ9eIzAygilP/4WoN8g=="
+      "version": "16.11.51",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.51.tgz",
+      "integrity": "sha512-h6p1A77pHBDdOcI9y6Wfh9iRGa8lMUZMk2ebHJTNTtRwgbQzgemZow6PW7+Xs7Z0r0IQFY1+iRlcNAkRrf53nA=="
     },
     "node_modules/@types/normalize-package-data": {
       "version": "2.4.1",
@@ -7364,8 +7315,9 @@
       }
     },
     "node_modules/@types/semver": {
-      "version": "7.3.10",
-      "license": "MIT"
+      "version": "7.3.12",
+      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz",
+      "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A=="
     },
     "node_modules/@types/serve-favicon": {
       "version": "2.5.3",
@@ -7388,9 +7340,8 @@
     },
     "node_modules/@types/sinon": {
       "version": "10.0.13",
-      "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz",
-      "integrity": "sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/sinonjs__fake-timers": "*"
       }
@@ -7475,8 +7426,8 @@
     },
     "node_modules/@types/ws": {
       "version": "8.5.3",
-      "dev": true,
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
+      "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==",
       "dependencies": {
         "@types/node": "*"
       }
@@ -7498,13 +7449,13 @@
       "license": "ISC"
     },
     "node_modules/@wdio/config": {
-      "version": "7.20.8",
-      "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.20.8.tgz",
-      "integrity": "sha512-MPB88Njua6T2PYkkpUdLmPn73XWPBbew46twQLNuQ99Q5pdRrsiPFgPT4aO9pPfIMMGpQQ8QCy8s0xpCuTEwBQ==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.21.0.tgz",
+      "integrity": "sha512-FnShYzSuJfFjjqCwWqOVwwSpFQd57jYBwuQ2EbncS0nO/rnG8a/q0CZACwXwpDXwUXRqM8JoTidpEi3bIFjBoQ==",
       "dependencies": {
         "@wdio/logger": "7.19.0",
-        "@wdio/types": "7.20.7",
-        "@wdio/utils": "7.20.7",
+        "@wdio/types": "7.21.0",
+        "@wdio/utils": "7.21.0",
         "deepmerge": "^4.0.0",
         "glob": "^8.0.3"
       },
@@ -7578,27 +7529,26 @@
     },
     "node_modules/@wdio/protocols": {
       "version": "7.20.6",
-      "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.20.6.tgz",
-      "integrity": "sha512-+G7zAw7MsjohFU+xVJO9unc4eUuTX3UdVT3mQGDHQLuSGNGVL5QrtgEGYx8x32OMkFX4zs6ncObVAf0kR6H4Mg==",
+      "license": "MIT",
       "engines": {
         "node": ">=12.0.0"
       }
     },
     "node_modules/@wdio/repl": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.20.7.tgz",
-      "integrity": "sha512-9FXLyRWX7arYScEf9wFqkDuttVAPMJ91WA3C0FDf3vqbTxv1/4V5etkds/b7nH6SHq1FHdlcN4LCZ7lIfbu72Q==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.21.0.tgz",
+      "integrity": "sha512-4j81NL4NLSddpPZSvObTD6UFFJaqgWmSKE4cobqdJbxAnNhFM9h/Q63sgNnH8+cJPG7O8bmEqrvdCr5MtKCcuA==",
       "dependencies": {
-        "@wdio/utils": "7.20.7"
+        "@wdio/utils": "7.21.0"
       },
       "engines": {
         "node": ">=12.0.0"
       }
     },
     "node_modules/@wdio/types": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.20.7.tgz",
-      "integrity": "sha512-MXz/J5GYswCaa+pyWEVpJoafnbqZr0eJf4p/Z9KsSB5xPWh5Co/1Y8gNLlR1msjV8jKhoWCh55uoBZFU//7G1A==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.21.0.tgz",
+      "integrity": "sha512-mKVMNRhUN4Idhz5u3PwblmkyhxQxAw03fOO8q0P0trxncqAFauqn7SJPgObBUui2zvtLUZvXwSHJR3dyns5CBA==",
       "dependencies": {
         "@types/node": "^18.0.0",
         "got": "^11.8.1"
@@ -7608,20 +7558,25 @@
       },
       "peerDependencies": {
         "typescript": "^4.6.2"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
       }
     },
     "node_modules/@wdio/types/node_modules/@types/node": {
-      "version": "18.0.6",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz",
-      "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw=="
+      "version": "18.7.6",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.6.tgz",
+      "integrity": "sha512-EdxgKRXgYsNITy5mjjXjVE/CS8YENSdhiagGrLqjG0pvA2owgJ6i4l7wy/PFZGC0B1/H20lWKN7ONVDNYDZm7A=="
     },
     "node_modules/@wdio/utils": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.20.7.tgz",
-      "integrity": "sha512-9KnvQ3J6+Jb/1Hzqhpf/QMr3t0rWG76A/gpw80ZIzUoMZzdquqSkDSlF1sOW2+GF2W3K1VsSB7ZcPelpadAsvw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.21.0.tgz",
+      "integrity": "sha512-26tlT4jrHQGxkFJtlGhkmcdcmtQrEBg6X1jPF4KWGKrwTNl7ocoszZzSrEgUhKEa6itWpzgQHZ1+L4UQZn57Pg==",
       "dependencies": {
         "@wdio/logger": "7.19.0",
-        "@wdio/types": "7.20.7",
+        "@wdio/types": "7.21.0",
         "p-iteration": "^1.1.8"
       },
       "engines": {
@@ -7689,6 +7644,7 @@
     },
     "node_modules/adbkit-apkreader/node_modules/debug": {
       "version": "4.1.1",
+      "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
       "license": "MIT",
       "dependencies": {
         "ms": "^2.1.1"
@@ -7764,7 +7720,10 @@
     },
     "node_modules/ansi-colors": {
       "version": "4.1.3",
+      "dev": true,
       "license": "MIT",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=6"
       }
@@ -7889,11 +7848,10 @@
     },
     "node_modules/appium-adb": {
       "version": "9.10.2",
-      "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-9.10.2.tgz",
-      "integrity": "sha512-aeH0BJDUZzLRBlRwBtMZVIPmHqnRu8z+aQeIAd23JD0y3+d7d3Bk+Qa5q1+VhOuSSNU+ElWkJqnmaj8cRu+3FA==",
       "engines": [
         "node"
       ],
+      "license": "Apache-2.0",
       "dependencies": {
         "@appium/support": "^2.55.3",
         "@babel/runtime": "^7.0.0",
@@ -7951,8 +7909,7 @@
     },
     "node_modules/archiver-utils/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -8396,31 +8353,6 @@
         "form-data": "^4.0.0"
       }
     },
-    "node_modules/babel-eslint": {
-      "version": "10.1.0",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.7.0",
-        "@babel/traverse": "^7.7.0",
-        "@babel/types": "^7.7.0",
-        "eslint-visitor-keys": "^1.0.0",
-        "resolve": "^1.12.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "peerDependencies": {
-        "eslint": ">= 4.12.1"
-      }
-    },
-    "node_modules/babel-eslint/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/babel-plugin-dynamic-import-node": {
       "version": "2.3.3",
       "license": "MIT",
@@ -8444,8 +8376,7 @@
     },
     "node_modules/babel-plugin-polyfill-corejs2": {
       "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz",
-      "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==",
+      "license": "MIT",
       "dependencies": {
         "@babel/compat-data": "^7.17.7",
         "@babel/helper-define-polyfill-provider": "^0.3.2",
@@ -8464,8 +8395,7 @@
     },
     "node_modules/babel-plugin-polyfill-corejs3": {
       "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz",
-      "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-define-polyfill-provider": "^0.3.2",
         "core-js-compat": "^3.21.0"
@@ -8476,8 +8406,7 @@
     },
     "node_modules/babel-plugin-polyfill-regenerator": {
       "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz",
-      "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-define-polyfill-provider": "^0.3.2"
       },
@@ -8970,9 +8899,8 @@
     },
     "node_modules/cacache/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -10190,6 +10118,7 @@
     },
     "node_modules/core-js": {
       "version": "2.6.12",
+      "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
       "dev": true,
       "hasInstallScript": true,
       "license": "MIT"
@@ -10302,8 +10231,7 @@
     },
     "node_modules/cross-env": {
       "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
-      "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+      "license": "MIT",
       "dependencies": {
         "cross-spawn": "^7.0.1"
       },
@@ -10708,17 +10636,17 @@
       }
     },
     "node_modules/devtools": {
-      "version": "7.20.8",
-      "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.20.8.tgz",
-      "integrity": "sha512-EsJSICiJiY7hjXN18Ys1q5Hg3pSaTY5I7sBrwpVycYddm41UYGGTCcQOLEDJZZb0wxwgj2gyW0/i2vh7UYU/sw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.21.0.tgz",
+      "integrity": "sha512-HKAOzLleo4rcEkjNv4l0Ozo1I99KSt67/kedXhU2GSAsnaEtd3LkVrl9GBZXelorTe5qeA4+r5Svw6R6i1GyKA==",
       "dependencies": {
         "@types/node": "^18.0.0",
         "@types/ua-parser-js": "^0.7.33",
-        "@wdio/config": "7.20.8",
+        "@wdio/config": "7.21.0",
         "@wdio/logger": "7.19.0",
         "@wdio/protocols": "7.20.6",
-        "@wdio/types": "7.20.7",
-        "@wdio/utils": "7.20.7",
+        "@wdio/types": "7.21.0",
+        "@wdio/utils": "7.21.0",
         "chrome-launcher": "^0.15.0",
         "edge-paths": "^2.1.0",
         "puppeteer-core": "^13.1.3",
@@ -10731,9 +10659,9 @@
       }
     },
     "node_modules/devtools-protocol": {
-      "version": "0.0.1029085",
-      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1029085.tgz",
-      "integrity": "sha512-48FoiceZWyYdE1LXAptQeWG1Hz4VfHpTlAdh9kvZ+0WCglbShPeKzKgg+rvsJvlUbpAXyjmi/bvCamPFI5jkZw=="
+      "version": "0.0.1034970",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1034970.tgz",
+      "integrity": "sha512-kC7Wo+7z+Bo202DVB7qVqccreL+RpcGk/6eCrpM1qj2azag6UCMg05GL3ty2adg8CXWFpUGdMeyFJfIN8lQtgw=="
     },
     "node_modules/devtools/node_modules/@types/node": {
       "version": "18.0.0",
@@ -10944,7 +10872,10 @@
     },
     "node_modules/enquirer": {
       "version": "2.3.6",
+      "dev": true,
       "license": "MIT",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "ansi-colors": "^4.1.1"
       },
@@ -11125,47 +11056,47 @@
       }
     },
     "node_modules/eslint": {
-      "version": "7.32.0",
-      "license": "MIT",
+      "version": "8.22.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz",
+      "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==",
       "dependencies": {
-        "@babel/code-frame": "7.12.11",
-        "@eslint/eslintrc": "^0.4.3",
-        "@humanwhocodes/config-array": "^0.5.0",
+        "@eslint/eslintrc": "^1.3.0",
+        "@humanwhocodes/config-array": "^0.10.4",
+        "@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
         "ajv": "^6.10.0",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
-        "debug": "^4.0.1",
+        "debug": "^4.3.2",
         "doctrine": "^3.0.0",
-        "enquirer": "^2.3.5",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^5.1.1",
-        "eslint-utils": "^2.1.0",
-        "eslint-visitor-keys": "^2.0.0",
-        "espree": "^7.3.1",
+        "eslint-scope": "^7.1.1",
+        "eslint-utils": "^3.0.0",
+        "eslint-visitor-keys": "^3.3.0",
+        "espree": "^9.3.3",
         "esquery": "^1.4.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
         "file-entry-cache": "^6.0.1",
+        "find-up": "^5.0.0",
         "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.1.2",
-        "globals": "^13.6.0",
-        "ignore": "^4.0.6",
+        "glob-parent": "^6.0.1",
+        "globals": "^13.15.0",
+        "globby": "^11.1.0",
+        "grapheme-splitter": "^1.0.4",
+        "ignore": "^5.2.0",
         "import-fresh": "^3.0.0",
         "imurmurhash": "^0.1.4",
         "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
+        "js-yaml": "^4.1.0",
         "json-stable-stringify-without-jsonify": "^1.0.1",
         "levn": "^0.4.1",
         "lodash.merge": "^4.6.2",
-        "minimatch": "^3.0.4",
+        "minimatch": "^3.1.2",
         "natural-compare": "^1.4.0",
         "optionator": "^0.9.1",
-        "progress": "^2.0.0",
-        "regexpp": "^3.1.0",
-        "semver": "^7.2.1",
-        "strip-ansi": "^6.0.0",
+        "regexpp": "^3.2.0",
+        "strip-ansi": "^6.0.1",
         "strip-json-comments": "^3.1.0",
-        "table": "^6.0.9",
         "text-table": "^0.2.0",
         "v8-compile-cache": "^2.0.3"
       },
@@ -11173,7 +11104,7 @@
         "eslint": "bin/eslint.js"
       },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       },
       "funding": {
         "url": "https://opencollective.com/eslint"
@@ -11214,9 +11145,8 @@
     },
     "node_modules/eslint-find-rules/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -11434,35 +11364,20 @@
       "license": "MIT"
     },
     "node_modules/eslint-plugin-mocha": {
-      "version": "9.0.0",
-      "license": "MIT",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz",
+      "integrity": "sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==",
       "dependencies": {
         "eslint-utils": "^3.0.0",
-        "ramda": "^0.27.1"
+        "rambda": "^7.1.0"
       },
       "engines": {
-        "node": ">=12.0.0"
+        "node": ">=14.0.0"
       },
       "peerDependencies": {
         "eslint": ">=7.0.0"
       }
     },
-    "node_modules/eslint-plugin-mocha/node_modules/eslint-utils": {
-      "version": "3.0.0",
-      "license": "MIT",
-      "dependencies": {
-        "eslint-visitor-keys": "^2.0.0"
-      },
-      "engines": {
-        "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
-      },
-      "peerDependencies": {
-        "eslint": ">=5"
-      }
-    },
     "node_modules/eslint-plugin-promise": {
       "version": "6.0.0",
       "license": "ISC",
@@ -11493,23 +11408,20 @@
       }
     },
     "node_modules/eslint-utils": {
-      "version": "2.1.0",
-      "license": "MIT",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
       "dependencies": {
-        "eslint-visitor-keys": "^1.1.0"
+        "eslint-visitor-keys": "^2.0.0"
       },
       "engines": {
-        "node": ">=6"
+        "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
       },
       "funding": {
         "url": "https://github.com/sponsors/mysticatea"
-      }
-    },
-    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=4"
+      },
+      "peerDependencies": {
+        "eslint": ">=5"
       }
     },
     "node_modules/eslint-visitor-keys": {
@@ -11519,16 +11431,10 @@
         "node": ">=10"
       }
     },
-    "node_modules/eslint/node_modules/@babel/code-frame": {
-      "version": "7.12.11",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/highlight": "^7.10.4"
-      }
-    },
     "node_modules/eslint/node_modules/ajv": {
       "version": "6.12.6",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -11542,7 +11448,8 @@
     },
     "node_modules/eslint/node_modules/ansi-styles": {
       "version": "4.3.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
       "dependencies": {
         "color-convert": "^2.0.1"
       },
@@ -11553,16 +11460,10 @@
         "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "node_modules/eslint/node_modules/argparse": {
-      "version": "1.0.10",
-      "license": "MIT",
-      "dependencies": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
     "node_modules/eslint/node_modules/chalk": {
       "version": "4.1.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
       "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
@@ -11576,7 +11477,8 @@
     },
     "node_modules/eslint/node_modules/color-convert": {
       "version": "2.0.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
       "dependencies": {
         "color-name": "~1.1.4"
       },
@@ -11586,11 +11488,13 @@
     },
     "node_modules/eslint/node_modules/color-name": {
       "version": "1.1.4",
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
     "node_modules/eslint/node_modules/escape-string-regexp": {
       "version": "4.0.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
       "engines": {
         "node": ">=10"
       },
@@ -11598,9 +11502,64 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/eslint/node_modules/eslint-scope": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+      "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
+    },
+    "node_modules/eslint/node_modules/eslint-visitor-keys": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+      "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
+    },
+    "node_modules/eslint/node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/eslint/node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
     "node_modules/eslint/node_modules/globals": {
-      "version": "13.15.0",
-      "license": "MIT",
+      "version": "13.17.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+      "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
       "dependencies": {
         "type-fest": "^0.20.2"
       },
@@ -11611,24 +11570,65 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/eslint/node_modules/js-yaml": {
-      "version": "3.14.1",
-      "license": "MIT",
-      "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
+    "node_modules/eslint/node_modules/ignore": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+      "engines": {
+        "node": ">= 4"
       }
     },
     "node_modules/eslint/node_modules/json-schema-traverse": {
       "version": "0.4.1",
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+    },
+    "node_modules/eslint/node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
     },
     "node_modules/eslint/node_modules/supports-color": {
       "version": "7.2.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -11638,7 +11638,8 @@
     },
     "node_modules/eslint/node_modules/type-fest": {
       "version": "0.20.2",
-      "license": "(MIT OR CC0-1.0)",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
       "engines": {
         "node": ">=10"
       },
@@ -11647,22 +11648,38 @@
       }
     },
     "node_modules/espree": {
-      "version": "7.3.1",
-      "license": "BSD-2-Clause",
+      "version": "9.3.3",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz",
+      "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==",
       "dependencies": {
-        "acorn": "^7.4.0",
-        "acorn-jsx": "^5.3.1",
-        "eslint-visitor-keys": "^1.3.0"
+        "acorn": "^8.8.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.3.0"
       },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/espree/node_modules/acorn": {
+      "version": "8.8.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
+      "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
       }
     },
     "node_modules/espree/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "license": "Apache-2.0",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+      "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
       "engines": {
-        "node": ">=4"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
     "node_modules/esprima": {
@@ -13177,8 +13194,7 @@
     },
     "node_modules/glob": {
       "version": "8.0.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz",
-      "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==",
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -13238,8 +13254,7 @@
     },
     "node_modules/glob-stream/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -13369,6 +13384,7 @@
     },
     "node_modules/glob-watcher/node_modules/chokidar": {
       "version": "2.1.8",
+      "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies",
       "license": "MIT",
       "dependencies": {
         "anymatch": "^2.0.0",
@@ -13412,6 +13428,7 @@
     },
     "node_modules/glob-watcher/node_modules/fsevents": {
       "version": "1.2.13",
+      "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.",
       "hasInstallScript": true,
       "license": "MIT",
       "optional": true,
@@ -13560,16 +13577,14 @@
     },
     "node_modules/glob/node_modules/brace-expansion": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "license": "MIT",
       "dependencies": {
         "balanced-match": "^1.0.0"
       }
     },
     "node_modules/glob/node_modules/minimatch": {
       "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
-      "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
+      "license": "ISC",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -13750,8 +13765,7 @@
     },
     "node_modules/gulp-babel/node_modules/ansi-colors": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-      "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+      "license": "MIT",
       "dependencies": {
         "ansi-wrap": "^0.1.0"
       },
@@ -13765,8 +13779,7 @@
     },
     "node_modules/gulp-babel/node_modules/plugin-error": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
-      "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+      "license": "MIT",
       "dependencies": {
         "ansi-colors": "^1.0.1",
         "arr-diff": "^4.0.0",
@@ -14106,8 +14119,7 @@
     },
     "node_modules/gulp-eslint/node_modules/ansi-colors": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-      "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+      "license": "MIT",
       "dependencies": {
         "ansi-wrap": "^0.1.0"
       },
@@ -14276,8 +14288,7 @@
     },
     "node_modules/gulp-eslint/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -14363,8 +14374,7 @@
     },
     "node_modules/gulp-eslint/node_modules/plugin-error": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
-      "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+      "license": "MIT",
       "dependencies": {
         "ansi-colors": "^1.0.1",
         "arr-diff": "^4.0.0",
@@ -14835,8 +14845,7 @@
     },
     "node_modules/gulp-mocha/node_modules/plugin-error": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
-      "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+      "license": "MIT",
       "dependencies": {
         "ansi-colors": "^1.0.1",
         "arr-diff": "^4.0.0",
@@ -14849,8 +14858,7 @@
     },
     "node_modules/gulp-mocha/node_modules/plugin-error/node_modules/ansi-colors": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-      "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+      "license": "MIT",
       "dependencies": {
         "ansi-wrap": "^0.1.0"
       },
@@ -15048,6 +15056,7 @@
     },
     "node_modules/har-validator": {
       "version": "5.1.5",
+      "deprecated": "this library is no longer supported",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -15574,9 +15583,8 @@
     },
     "node_modules/init-package-json/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -16390,8 +16398,7 @@
     },
     "node_modules/jsdoc": {
       "version": "3.6.11",
-      "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.11.tgz",
-      "integrity": "sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg==",
+      "license": "Apache-2.0",
       "dependencies": {
         "@babel/parser": "^7.9.4",
         "@types/markdown-it": "^12.2.3",
@@ -16418,8 +16425,7 @@
     },
     "node_modules/jsdoc-plugin-typescript": {
       "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/jsdoc-plugin-typescript/-/jsdoc-plugin-typescript-2.1.1.tgz",
-      "integrity": "sha512-zbGdmQ6uxe2yR9vG04hEA+wrYFxOxjQ3P1fRXDTTIttozMIWwUuljSgcR+lOZ5O7jb9P7a/GCtftJzQN22qEsg==",
+      "license": "BSD-2-Clause",
       "dependencies": {
         "string.prototype.matchall": "^4.0.0"
       },
@@ -16429,16 +16435,14 @@
     },
     "node_modules/jsdoc/node_modules/escape-string-regexp": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
-      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
     "node_modules/jsdoc/node_modules/mkdirp": {
       "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "license": "MIT",
       "bin": {
         "mkdirp": "bin/cmd.js"
       },
@@ -16536,9 +16540,8 @@
     },
     "node_modules/json-schema-to-typescript/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -16674,8 +16677,7 @@
     },
     "node_modules/ky": {
       "version": "0.30.0",
-      "resolved": "https://registry.npmjs.org/ky/-/ky-0.30.0.tgz",
-      "integrity": "sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog==",
+      "license": "MIT",
       "engines": {
         "node": ">=12"
       },
@@ -17435,8 +17437,7 @@
     },
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+      "license": "MIT"
     },
     "node_modules/lodash.defaults": {
       "version": "4.2.0",
@@ -17497,10 +17498,6 @@
         "lodash._reinterpolate": "^3.0.0"
       }
     },
-    "node_modules/lodash.truncate": {
-      "version": "4.4.2",
-      "license": "MIT"
-    },
     "node_modules/lodash.union": {
       "version": "4.6.0",
       "license": "MIT"
@@ -17741,9 +17738,9 @@
       }
     },
     "node_modules/lru-cache": {
-      "version": "7.13.2",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.2.tgz",
-      "integrity": "sha512-VJL3nIpA79TodY/ctmZEfhASgqekbT574/c4j3jn4bKXbSCnTTCH/KltZyvL2GlV+tGSMtsWyem8DCX7qKTMBA==",
+      "version": "7.14.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz",
+      "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==",
       "engines": {
         "node": ">=12"
       }
@@ -18421,9 +18418,8 @@
     },
     "node_modules/mjpeg-consumer": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mjpeg-consumer/-/mjpeg-consumer-2.0.0.tgz",
-      "integrity": "sha512-nyVOIMOQ7JEXwFPUkcbDgekBJGXSK/53nqhPnKZen3a4CAOM4HxqzPZQxDo/8NPhoueuXlvKN3DeDLV2OSi1fw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8.0.0"
       }
@@ -19014,9 +19010,8 @@
     },
     "node_modules/node-gyp/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -19405,9 +19400,8 @@
     },
     "node_modules/npm-packlist/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -19763,8 +19757,7 @@
     },
     "node_modules/nyc/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -20980,8 +20973,7 @@
     },
     "node_modules/plugin-error": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-2.0.0.tgz",
-      "integrity": "sha512-o4bwIOmuFwUg2MU6xt7plGEQY3YyENx6kvwaFZBrUpamA91FdS9w3U+pU0y4OuDoBQe+jf3RLGSfQebSRBEVsQ==",
+      "license": "MIT",
       "dependencies": {
         "ansi-colors": "^1.0.1"
       },
@@ -20991,8 +20983,7 @@
     },
     "node_modules/plugin-error/node_modules/ansi-colors": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-      "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+      "license": "MIT",
       "dependencies": {
         "ansi-wrap": "^0.1.0"
       },
@@ -21370,6 +21361,7 @@
     },
     "node_modules/qs": {
       "version": "6.10.5",
+      "deprecated": "when using stringify with arrayFormat comma, `[]` is appended on single-item arrays. Upgrade to v6.11.0 or downgrade to v6.10.4 to fix.",
       "dev": true,
       "license": "BSD-3-Clause",
       "dependencies": {
@@ -21405,6 +21397,7 @@
     },
     "node_modules/querystring": {
       "version": "0.2.0",
+      "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
       "dev": true,
       "engines": {
         "node": ">=0.4.x"
@@ -21445,9 +21438,10 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/ramda": {
-      "version": "0.27.2",
-      "license": "MIT"
+    "node_modules/rambda": {
+      "version": "7.2.1",
+      "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.2.1.tgz",
+      "integrity": "sha512-Wswj8ZvzdI3VhaGPkZAxaCTwuMmGtgWt7Zxsgyo4P+iTmVnkojvyWaOep5q3ZjMIecW0wtQa66GWxaKkZ24RAA=="
     },
     "node_modules/randombytes": {
       "version": "2.1.0",
@@ -21529,9 +21523,8 @@
     },
     "node_modules/read-package-json/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -21549,6 +21542,7 @@
     },
     "node_modules/read-package-tree": {
       "version": "5.3.1",
+      "deprecated": "The functionality that this package provided is now in @npmcli/arborist",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -21559,9 +21553,8 @@
     },
     "node_modules/read-package-tree/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -22133,8 +22126,7 @@
     },
     "node_modules/replace-in-file/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -22195,6 +22187,7 @@
     },
     "node_modules/request": {
       "version": "2.88.2",
+      "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -22246,6 +22239,7 @@
     },
     "node_modules/request/node_modules/uuid": {
       "version": "3.4.0",
+      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -22337,6 +22331,7 @@
     },
     "node_modules/resolve-url": {
       "version": "0.2.1",
+      "deprecated": "https://github.com/lydell/resolve-url#deprecated",
       "license": "MIT"
     },
     "node_modules/responselike": {
@@ -22435,8 +22430,7 @@
     },
     "node_modules/rimraf/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -23053,6 +23047,7 @@
     },
     "node_modules/snapdragon/node_modules/source-map-resolve": {
       "version": "0.5.3",
+      "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
       "license": "MIT",
       "dependencies": {
         "atob": "^2.1.2",
@@ -23119,6 +23114,7 @@
     },
     "node_modules/source-map-resolve": {
       "version": "0.6.0",
+      "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
       "license": "MIT",
       "dependencies": {
         "atob": "^2.1.2",
@@ -23135,6 +23131,7 @@
     },
     "node_modules/source-map-url": {
       "version": "0.4.1",
+      "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
       "license": "MIT"
     },
     "node_modules/sparkles": {
@@ -23806,9 +23803,8 @@
     },
     "node_modules/sync-monorepo-packages/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -23962,88 +23958,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/table": {
-      "version": "6.8.0",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "ajv": "^8.0.1",
-        "lodash.truncate": "^4.4.2",
-        "slice-ansi": "^4.0.0",
-        "string-width": "^4.2.3",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/table/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "license": "MIT",
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/table/node_modules/astral-regex": {
-      "version": "2.0.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/table/node_modules/color-convert": {
-      "version": "2.0.1",
-      "license": "MIT",
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/table/node_modules/color-name": {
-      "version": "1.1.4",
-      "license": "MIT"
-    },
-    "node_modules/table/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/table/node_modules/slice-ansi": {
-      "version": "4.0.0",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "astral-regex": "^2.0.0",
-        "is-fullwidth-code-point": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
-      }
-    },
-    "node_modules/table/node_modules/string-width": {
-      "version": "4.2.3",
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/taffydb": {
       "version": "2.6.2"
     },
@@ -24172,6 +24086,7 @@
     },
     "node_modules/temp-write/node_modules/uuid": {
       "version": "3.4.0",
+      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -24221,8 +24136,7 @@
     },
     "node_modules/test-exclude/node_modules/glob": {
       "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -24638,9 +24552,9 @@
       }
     },
     "node_modules/type-fest": {
-      "version": "2.18.0",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.18.0.tgz",
-      "integrity": "sha512-pRS+/yrW5TjPPHNOvxhbNZexr2bS63WjrMU8a+VzEBhUi9Tz1pZeD+vQz3ut0svZ46P+SRqMEPnJmk2XnvNzTw==",
+      "version": "2.18.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.18.1.tgz",
+      "integrity": "sha512-UKCINsd4qiATXD6OIlnQw9t1ux/n2ld+Nl0kzPbCONhCaUIS/BhJbNw14w6584HCQWf3frBK8vmWnGZq/sbPHQ==",
       "engines": {
         "node": ">=12.20"
       },
@@ -24672,6 +24586,7 @@
     },
     "node_modules/typescript": {
       "version": "4.7.4",
+      "devOptional": true,
       "license": "Apache-2.0",
       "bin": {
         "tsc": "bin/tsc",
@@ -24959,6 +24874,7 @@
     },
     "node_modules/urix": {
       "version": "0.1.0",
+      "deprecated": "Please see https://github.com/lydell/urix#deprecated",
       "license": "MIT"
     },
     "node_modules/url": {
@@ -25274,16 +25190,16 @@
       }
     },
     "node_modules/webdriver": {
-      "version": "7.20.8",
-      "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.20.8.tgz",
-      "integrity": "sha512-XMOy6K/jHR7GkU8BMzl5jmzoYf9jWoEDrieG16EobFFV5m1tC5ZoTPIx+pLAfleMKJdbjj9Lf5QpoY23M1BSuw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.21.0.tgz",
+      "integrity": "sha512-FZV+2AtlmrQCAwH3ecnF9kcWCrATEEaU8xHfY3l7MSAaW/sAR38XKzhdzeVffOQlwXBVIeePbhUW+qAW+OmDww==",
       "dependencies": {
         "@types/node": "^18.0.0",
-        "@wdio/config": "7.20.8",
+        "@wdio/config": "7.21.0",
         "@wdio/logger": "7.19.0",
         "@wdio/protocols": "7.20.6",
-        "@wdio/types": "7.20.7",
-        "@wdio/utils": "7.20.7",
+        "@wdio/types": "7.21.0",
+        "@wdio/utils": "7.21.0",
         "got": "^11.0.2",
         "ky": "0.30.0",
         "lodash.merge": "^4.6.1"
@@ -25297,24 +25213,24 @@
       "license": "MIT"
     },
     "node_modules/webdriverio": {
-      "version": "7.20.9",
-      "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.20.9.tgz",
-      "integrity": "sha512-p/XNuIL1fSeF4oR9sKYDHKijDFZyay/J+EW5G8rTwKvAnve/psskLcS+59gGTcUrWRSrqZ/Rfhn3ybrccEGAuw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.21.0.tgz",
+      "integrity": "sha512-R6QOwYxlWL1Eu+AwcORd5NKKAgyMOmTYcRxe+TI5eaKFBj+QOWwtF+2cN8xSXA7jT7rNTkSyBUonTAS2aty9hQ==",
       "dependencies": {
         "@types/aria-query": "^5.0.0",
         "@types/node": "^18.0.0",
-        "@wdio/config": "7.20.8",
+        "@wdio/config": "7.21.0",
         "@wdio/logger": "7.19.0",
         "@wdio/protocols": "7.20.6",
-        "@wdio/repl": "7.20.7",
-        "@wdio/types": "7.20.7",
-        "@wdio/utils": "7.20.7",
+        "@wdio/repl": "7.21.0",
+        "@wdio/types": "7.21.0",
+        "@wdio/utils": "7.21.0",
         "archiver": "^5.0.0",
         "aria-query": "^5.0.0",
         "css-shorthand-properties": "^1.1.1",
         "css-value": "^0.0.1",
-        "devtools": "7.20.8",
-        "devtools-protocol": "^0.0.1029085",
+        "devtools": "7.21.0",
+        "devtools-protocol": "^0.0.1034970",
         "fs-extra": "^10.0.0",
         "grapheme-splitter": "^1.0.2",
         "lodash.clonedeep": "^4.5.0",
@@ -25327,16 +25243,16 @@
         "resq": "^1.9.1",
         "rgb2hex": "0.2.5",
         "serialize-error": "^8.0.0",
-        "webdriver": "7.20.8"
+        "webdriver": "7.21.0"
       },
       "engines": {
         "node": ">=12.0.0"
       }
     },
     "node_modules/webdriverio/node_modules/@types/node": {
-      "version": "18.6.2",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.2.tgz",
-      "integrity": "sha512-KcfkBq9H4PI6Vpu5B/KoPeuVDAbmi+2mDBqGPGUgoL7yXQtcWGu2vJWmmRkneWK3Rh0nIAX192Aa87AqKHYChQ=="
+      "version": "18.7.6",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.6.tgz",
+      "integrity": "sha512-EdxgKRXgYsNITy5mjjXjVE/CS8YENSdhiagGrLqjG0pvA2owgJ6i4l7wy/PFZGC0B1/H20lWKN7ONVDNYDZm7A=="
     },
     "node_modules/webdriverio/node_modules/brace-expansion": {
       "version": "2.0.1",
@@ -25710,9 +25626,8 @@
     },
     "node_modules/ws": {
       "version": "8.8.1",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz",
-      "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10.0.0"
       },
@@ -25941,23 +25856,23 @@
       }
     },
     "packages/appium": {
-      "version": "2.0.0-beta.42",
+      "version": "2.0.0-beta.43",
       "hasInstallScript": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@appium/base-driver": "^8.6.1",
-        "@appium/base-plugin": "^1.10.1",
-        "@appium/docutils": "^0.0.9",
+        "@appium/base-driver": "^8.7.0",
+        "@appium/base-plugin": "^1.10.2",
+        "@appium/docutils": "^0.0.10",
         "@appium/schema": "^0.0.9",
-        "@appium/support": "^2.59.4",
-        "@appium/test-support": "^1.4.1",
-        "@appium/types": "^0.3.1",
+        "@appium/support": "^2.59.5",
+        "@appium/test-support": "^1.5.0",
+        "@appium/types": "^0.4.0",
         "@babel/runtime": "7.18.9",
         "@sidvind/better-ajv-errors": "2.0.0",
         "@types/argparse": "2.0.10",
         "@types/bluebird": "3.5.36",
         "@types/fancy-log": "2.0.0",
-        "@types/semver": "7.3.10",
+        "@types/semver": "7.3.12",
         "@types/teen_process": "1.16.1",
         "@types/wrap-ansi": "3.0.0",
         "ajv": "8.11.0",
@@ -25979,7 +25894,7 @@
         "semver": "7.3.7",
         "source-map-support": "0.5.21",
         "teen_process": "1.16.0",
-        "type-fest": "2.18.0",
+        "type-fest": "2.18.1",
         "winston": "3.8.1",
         "wrap-ansi": "7.0.0",
         "yaml": "2.1.1"
@@ -26054,10 +25969,10 @@
     },
     "packages/base-driver": {
       "name": "@appium/base-driver",
-      "version": "8.6.1",
+      "version": "8.7.0",
       "license": "Apache-2.0",
       "dependencies": {
-        "@appium/support": "^2.59.4",
+        "@appium/support": "^2.59.5",
         "@babel/runtime": "7.18.9",
         "@colors/colors": "1.5.0",
         "@types/async-lock": "1.1.5",
@@ -26074,12 +25989,12 @@
         "express": "4.18.1",
         "http-status-codes": "2.2.0",
         "lodash": "4.17.21",
-        "lru-cache": "7.13.2",
+        "lru-cache": "7.14.0",
         "method-override": "3.0.0",
         "morgan": "1.10.0",
         "serve-favicon": "2.5.0",
         "source-map-support": "0.5.21",
-        "type-fest": "2.18.0",
+        "type-fest": "2.18.1",
         "validate.js": "0.13.1"
       },
       "engines": {
@@ -26089,10 +26004,10 @@
     },
     "packages/base-plugin": {
       "name": "@appium/base-plugin",
-      "version": "1.10.1",
+      "version": "1.10.2",
       "license": "Apache-2.0",
       "dependencies": {
-        "@appium/support": "^2.59.4"
+        "@appium/support": "^2.59.5"
       },
       "engines": {
         "node": ">=14",
@@ -26101,10 +26016,10 @@
     },
     "packages/doctor": {
       "name": "@appium/doctor",
-      "version": "1.16.24",
+      "version": "1.16.25",
       "license": "Apache-2.0",
       "dependencies": {
-        "@appium/support": "^2.59.4",
+        "@appium/support": "^2.59.5",
         "@babel/runtime": "7.18.9",
         "@colors/colors": "1.5.0",
         "@types/bluebird": "3.5.36",
@@ -26232,10 +26147,10 @@
     },
     "packages/docutils": {
       "name": "@appium/docutils",
-      "version": "0.0.9",
+      "version": "0.0.10",
       "license": "Apache-2.0",
       "dependencies": {
-        "@appium/support": "^2.59.4",
+        "@appium/support": "^2.59.5",
         "@babel/runtime": "7.18.9",
         "docdash": "1.2.0",
         "jsdoc": "3.6.11",
@@ -26257,13 +26172,11 @@
         "npm": ">=8"
       },
       "peerDependencies": {
-        "@babel/core": "7.18.10",
-        "@babel/eslint-parser": "7.18.9",
-        "eslint": "7.32.0",
-        "eslint-config-prettier": "8.5.0",
-        "eslint-plugin-import": "2.26.0",
-        "eslint-plugin-mocha": "9.0.0",
-        "eslint-plugin-promise": "6.0.0"
+        "eslint": "^8.21.0",
+        "eslint-config-prettier": "^8.5.0",
+        "eslint-plugin-import": "^2.26.0",
+        "eslint-plugin-mocha": "^10.1.0",
+        "eslint-plugin-promise": "^6.0.0"
       }
     },
     "packages/execute-driver-plugin": {
@@ -26277,7 +26190,7 @@
         "lodash": "4.17.21",
         "source-map-support": "0.5.21",
         "vm2": "3.9.10",
-        "webdriverio": "7.20.9"
+        "webdriverio": "7.21.0"
       },
       "engines": {
         "node": ">=14",
@@ -26289,7 +26202,7 @@
     },
     "packages/fake-driver": {
       "name": "@appium/fake-driver",
-      "version": "4.1.0",
+      "version": "4.2.0",
       "license": "Apache-2.0",
       "dependencies": {
         "@babel/runtime": "7.18.9",
@@ -26314,11 +26227,11 @@
     },
     "packages/fake-plugin": {
       "name": "@appium/fake-plugin",
-      "version": "2.0.5",
+      "version": "2.1.0",
       "license": "Apache-2.0",
       "dependencies": {
-        "@appium/base-plugin": "^1.10.1",
-        "@appium/support": "^2.59.4",
+        "@appium/base-plugin": "^1.10.2",
+        "@appium/support": "^2.59.5",
         "@babel/runtime": "7.18.9",
         "@types/bluebird": "3.5.36",
         "bluebird": "3.7.2",
@@ -26335,7 +26248,7 @@
     },
     "packages/gulp-plugins": {
       "name": "@appium/gulp-plugins",
-      "version": "7.0.4",
+      "version": "7.0.5",
       "license": "Apache-2.0",
       "dependencies": {
         "@appium/eslint-config-appium": "^6.0.4",
@@ -26347,19 +26260,18 @@
         "@octokit/rest": "18.12.0",
         "@types/fancy-log": "2.0.0",
         "@types/gulp": "4.0.9",
-        "@types/semver": "7.3.10",
+        "@types/semver": "7.3.12",
         "@types/through2": "2.0.36",
         "ansi-red": "0.1.1",
         "axios": "0.27.2",
-        "babel-eslint": "10.1.0",
         "babel-plugin-istanbul": "6.1.1",
         "babel-plugin-source-map-support": "2.2.0",
         "bluebird": "3.7.2",
         "del": "6.1.1",
-        "eslint": "7.32.0",
+        "eslint": "8.22.0",
         "eslint-config-prettier": "8.5.0",
         "eslint-plugin-import": "2.26.0",
-        "eslint-plugin-mocha": "9.0.0",
+        "eslint-plugin-mocha": "10.1.0",
         "eslint-plugin-promise": "6.0.0",
         "fancy-log": "2.0.0",
         "form-data": "4.0.0",
@@ -26401,12 +26313,12 @@
     },
     "packages/images-plugin": {
       "name": "@appium/images-plugin",
-      "version": "1.3.4",
+      "version": "1.3.5",
       "license": "Apache-2.0",
       "dependencies": {
         "@appium/opencv": "^1.0.11",
         "@babel/runtime": "7.18.9",
-        "lru-cache": "7.13.2",
+        "lru-cache": "7.14.0",
         "source-map-support": "0.5.21"
       },
       "engines": {
@@ -26468,9 +26380,10 @@
     },
     "packages/support": {
       "name": "@appium/support",
-      "version": "2.59.4",
+      "version": "2.59.5",
       "license": "Apache-2.0",
       "dependencies": {
+        "@appium/types": "^0.4.0",
         "@babel/runtime": "7.18.9",
         "@colors/colors": "1.5.0",
         "@types/archiver": "5.3.1",
@@ -26486,7 +26399,7 @@
         "@types/pluralize": "0.0.29",
         "@types/pngjs": "6.0.1",
         "@types/rimraf": "3.0.2",
-        "@types/semver": "7.3.10",
+        "@types/semver": "7.3.12",
         "@types/shell-quote": "1.7.1",
         "@types/supports-color": "8.1.1",
         "@types/teen_process": "1.16.1",
@@ -26524,7 +26437,7 @@
         "source-map-support": "0.5.21",
         "supports-color": "8.1.1",
         "teen_process": "1.16.0",
-        "type-fest": "2.18.0",
+        "type-fest": "2.18.1",
         "uuid": "8.3.2",
         "which": "2.0.2",
         "yauzl": "2.10.0"
@@ -26536,7 +26449,7 @@
     },
     "packages/test-support": {
       "name": "@appium/test-support",
-      "version": "1.4.1",
+      "version": "1.5.0",
       "license": "Apache-2.0",
       "dependencies": {
         "@babel/runtime": "7.18.9",
@@ -26565,14 +26478,15 @@
     },
     "packages/types": {
       "name": "@appium/types",
-      "version": "0.3.1",
+      "version": "0.4.0",
       "license": "Apache-2.0",
       "dependencies": {
         "@appium/schema": "^0.0.9",
         "@types/express": "4.17.13",
         "@types/npmlog": "4.1.4",
-        "@wdio/types": "7.20.7",
-        "type-fest": "2.18.0"
+        "@types/ws": "8.5.3",
+        "@wdio/types": "7.21.0",
+        "type-fest": "2.18.1"
       },
       "engines": {
         "node": ">=14",
@@ -26621,7 +26535,7 @@
     "@appium/base-driver": {
       "version": "file:packages/base-driver",
       "requires": {
-        "@appium/support": "^2.59.4",
+        "@appium/support": "^2.59.5",
         "@babel/runtime": "7.18.9",
         "@colors/colors": "1.5.0",
         "@types/async-lock": "1.1.5",
@@ -26638,25 +26552,25 @@
         "express": "4.18.1",
         "http-status-codes": "2.2.0",
         "lodash": "4.17.21",
-        "lru-cache": "7.13.2",
+        "lru-cache": "7.14.0",
         "method-override": "3.0.0",
         "morgan": "1.10.0",
         "serve-favicon": "2.5.0",
         "source-map-support": "0.5.21",
-        "type-fest": "2.18.0",
+        "type-fest": "2.18.1",
         "validate.js": "0.13.1"
       }
     },
     "@appium/base-plugin": {
       "version": "file:packages/base-plugin",
       "requires": {
-        "@appium/support": "^2.59.4"
+        "@appium/support": "^2.59.5"
       }
     },
     "@appium/doctor": {
       "version": "file:packages/doctor",
       "requires": {
-        "@appium/support": "^2.59.4",
+        "@appium/support": "^2.59.5",
         "@babel/runtime": "7.18.9",
         "@colors/colors": "1.5.0",
         "@types/bluebird": "3.5.36",
@@ -26743,7 +26657,7 @@
     "@appium/docutils": {
       "version": "file:packages/docutils",
       "requires": {
-        "@appium/support": "^2.59.4",
+        "@appium/support": "^2.59.5",
         "@babel/runtime": "7.18.9",
         "docdash": "1.2.0",
         "jsdoc": "3.6.11",
@@ -26765,7 +26679,7 @@
         "lodash": "4.17.21",
         "source-map-support": "0.5.21",
         "vm2": "3.9.10",
-        "webdriverio": "7.20.9"
+        "webdriverio": "7.21.0"
       }
     },
     "@appium/fake-driver": {
@@ -26784,8 +26698,8 @@
     "@appium/fake-plugin": {
       "version": "file:packages/fake-plugin",
       "requires": {
-        "@appium/base-plugin": "^1.10.1",
-        "@appium/support": "^2.59.4",
+        "@appium/base-plugin": "^1.10.2",
+        "@appium/support": "^2.59.5",
         "@babel/runtime": "7.18.9",
         "@types/bluebird": "3.5.36",
         "bluebird": "3.7.2",
@@ -26805,19 +26719,18 @@
         "@octokit/rest": "18.12.0",
         "@types/fancy-log": "2.0.0",
         "@types/gulp": "4.0.9",
-        "@types/semver": "7.3.10",
+        "@types/semver": "7.3.12",
         "@types/through2": "2.0.36",
         "ansi-red": "0.1.1",
         "axios": "0.27.2",
-        "babel-eslint": "10.1.0",
         "babel-plugin-istanbul": "6.1.1",
         "babel-plugin-source-map-support": "2.2.0",
         "bluebird": "3.7.2",
         "del": "6.1.1",
-        "eslint": "7.32.0",
+        "eslint": "8.22.0",
         "eslint-config-prettier": "8.5.0",
         "eslint-plugin-import": "2.26.0",
-        "eslint-plugin-mocha": "9.0.0",
+        "eslint-plugin-mocha": "10.1.0",
         "eslint-plugin-promise": "6.0.0",
         "fancy-log": "2.0.0",
         "form-data": "4.0.0",
@@ -26855,7 +26768,7 @@
       "requires": {
         "@appium/opencv": "^1.0.11",
         "@babel/runtime": "7.18.9",
-        "lru-cache": "7.13.2",
+        "lru-cache": "7.14.0",
         "source-map-support": "0.5.21"
       }
     },
@@ -26890,6 +26803,7 @@
     "@appium/support": {
       "version": "file:packages/support",
       "requires": {
+        "@appium/types": "^0.4.0",
         "@babel/runtime": "7.18.9",
         "@colors/colors": "1.5.0",
         "@types/archiver": "5.3.1",
@@ -26905,7 +26819,7 @@
         "@types/pluralize": "0.0.29",
         "@types/pngjs": "6.0.1",
         "@types/rimraf": "3.0.2",
-        "@types/semver": "7.3.10",
+        "@types/semver": "7.3.12",
         "@types/shell-quote": "1.7.1",
         "@types/supports-color": "8.1.1",
         "@types/teen_process": "1.16.1",
@@ -26943,7 +26857,7 @@
         "source-map-support": "0.5.21",
         "supports-color": "8.1.1",
         "teen_process": "1.16.0",
-        "type-fest": "2.18.0",
+        "type-fest": "2.18.1",
         "uuid": "8.3.2",
         "which": "2.0.2",
         "yauzl": "2.10.0"
@@ -26971,8 +26885,9 @@
         "@appium/schema": "^0.0.9",
         "@types/express": "4.17.13",
         "@types/npmlog": "4.1.4",
-        "@wdio/types": "7.20.7",
-        "type-fest": "2.18.0"
+        "@types/ws": "8.5.3",
+        "@wdio/types": "7.21.0",
+        "type-fest": "2.18.1"
       }
     },
     "@appium/universal-xml-plugin": {
@@ -26988,8 +26903,6 @@
     },
     "@babel/cli": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.18.10.tgz",
-      "integrity": "sha512-dLvWH+ZDFAkd2jPBSghrsFBuXrREvFwjpDycXbmUoeochqKYe4zNSLEJYErpLg8dvxvZYe79/MkN461XCwpnGw==",
       "dev": true,
       "requires": {
         "@jridgewell/trace-mapping": "^0.3.8",
@@ -27005,8 +26918,6 @@
       "dependencies": {
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -27026,14 +26937,10 @@
       }
     },
     "@babel/compat-data": {
-      "version": "7.18.8",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz",
-      "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ=="
+      "version": "7.18.8"
     },
     "@babel/core": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz",
-      "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==",
       "requires": {
         "@ampproject/remapping": "^2.1.0",
         "@babel/code-frame": "^7.18.6",
@@ -27053,16 +26960,12 @@
       },
       "dependencies": {
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+          "version": "6.3.0"
         }
       }
     },
     "@babel/eslint-parser": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz",
-      "integrity": "sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ==",
       "requires": {
         "eslint-scope": "^5.1.1",
         "eslint-visitor-keys": "^2.1.0",
@@ -27070,16 +26973,12 @@
       },
       "dependencies": {
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+          "version": "6.3.0"
         }
       }
     },
     "@babel/generator": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz",
-      "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==",
       "requires": {
         "@babel/types": "^7.18.10",
         "@jridgewell/gen-mapping": "^0.3.2",
@@ -27088,8 +26987,6 @@
       "dependencies": {
         "@jridgewell/gen-mapping": {
           "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
-          "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
           "requires": {
             "@jridgewell/set-array": "^1.0.1",
             "@jridgewell/sourcemap-codec": "^1.4.10",
@@ -27113,8 +27010,6 @@
     },
     "@babel/helper-compilation-targets": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz",
-      "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==",
       "requires": {
         "@babel/compat-data": "^7.18.8",
         "@babel/helper-validator-option": "^7.18.6",
@@ -27148,8 +27043,6 @@
     },
     "@babel/helper-define-polyfill-provider": {
       "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz",
-      "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==",
       "requires": {
         "@babel/helper-compilation-targets": "^7.17.7",
         "@babel/helper-plugin-utils": "^7.16.7",
@@ -27160,16 +27053,12 @@
       },
       "dependencies": {
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+          "version": "6.3.0"
         }
       }
     },
     "@babel/helper-environment-visitor": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
-      "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg=="
+      "version": "7.18.9"
     },
     "@babel/helper-explode-assignable-expression": {
       "version": "7.18.6",
@@ -27179,8 +27068,6 @@
     },
     "@babel/helper-function-name": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz",
-      "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==",
       "requires": {
         "@babel/template": "^7.18.6",
         "@babel/types": "^7.18.9"
@@ -27194,8 +27081,6 @@
     },
     "@babel/helper-member-expression-to-functions": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz",
-      "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==",
       "requires": {
         "@babel/types": "^7.18.9"
       }
@@ -27208,8 +27093,6 @@
     },
     "@babel/helper-module-transforms": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz",
-      "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==",
       "requires": {
         "@babel/helper-environment-visitor": "^7.18.9",
         "@babel/helper-module-imports": "^7.18.6",
@@ -27228,14 +27111,10 @@
       }
     },
     "@babel/helper-plugin-utils": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz",
-      "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w=="
+      "version": "7.18.9"
     },
     "@babel/helper-remap-async-to-generator": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz",
-      "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==",
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
         "@babel/helper-environment-visitor": "^7.18.9",
@@ -27245,8 +27124,6 @@
     },
     "@babel/helper-replace-supers": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz",
-      "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==",
       "requires": {
         "@babel/helper-environment-visitor": "^7.18.9",
         "@babel/helper-member-expression-to-functions": "^7.18.9",
@@ -27263,8 +27140,6 @@
     },
     "@babel/helper-skip-transparent-expression-wrappers": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz",
-      "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==",
       "requires": {
         "@babel/types": "^7.18.9"
       }
@@ -27276,9 +27151,7 @@
       }
     },
     "@babel/helper-string-parser": {
-      "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz",
-      "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw=="
+      "version": "7.18.10"
     },
     "@babel/helper-validator-identifier": {
       "version": "7.18.6"
@@ -27288,8 +27161,6 @@
     },
     "@babel/helper-wrap-function": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz",
-      "integrity": "sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ==",
       "requires": {
         "@babel/helper-function-name": "^7.18.9",
         "@babel/template": "^7.18.10",
@@ -27299,8 +27170,6 @@
     },
     "@babel/helpers": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz",
-      "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==",
       "requires": {
         "@babel/template": "^7.18.6",
         "@babel/traverse": "^7.18.9",
@@ -27316,9 +27185,7 @@
       }
     },
     "@babel/parser": {
-      "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.10.tgz",
-      "integrity": "sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg=="
+      "version": "7.18.10"
     },
     "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
       "version": "7.18.6",
@@ -27328,8 +27195,6 @@
     },
     "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz",
-      "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.9",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
@@ -27338,8 +27203,6 @@
     },
     "@babel/plugin-proposal-async-generator-functions": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz",
-      "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==",
       "requires": {
         "@babel/helper-environment-visitor": "^7.18.9",
         "@babel/helper-plugin-utils": "^7.18.9",
@@ -27371,8 +27234,6 @@
     },
     "@babel/plugin-proposal-export-namespace-from": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz",
-      "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.9",
         "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
@@ -27387,8 +27248,6 @@
     },
     "@babel/plugin-proposal-logical-assignment-operators": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz",
-      "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.9",
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
@@ -27410,8 +27269,6 @@
     },
     "@babel/plugin-proposal-object-rest-spread": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz",
-      "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==",
       "requires": {
         "@babel/compat-data": "^7.18.8",
         "@babel/helper-compilation-targets": "^7.18.9",
@@ -27429,8 +27286,6 @@
     },
     "@babel/plugin-proposal-optional-chaining": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz",
-      "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.9",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
@@ -27572,16 +27427,12 @@
     },
     "@babel/plugin-transform-block-scoping": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz",
-      "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.9"
       }
     },
     "@babel/plugin-transform-classes": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz",
-      "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==",
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
         "@babel/helper-environment-visitor": "^7.18.9",
@@ -27595,16 +27446,12 @@
     },
     "@babel/plugin-transform-computed-properties": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz",
-      "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.9"
       }
     },
     "@babel/plugin-transform-destructuring": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz",
-      "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.9"
       }
@@ -27618,8 +27465,6 @@
     },
     "@babel/plugin-transform-duplicate-keys": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz",
-      "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.9"
       }
@@ -27633,16 +27478,12 @@
     },
     "@babel/plugin-transform-for-of": {
       "version": "7.18.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz",
-      "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.6"
       }
     },
     "@babel/plugin-transform-function-name": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz",
-      "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==",
       "requires": {
         "@babel/helper-compilation-targets": "^7.18.9",
         "@babel/helper-function-name": "^7.18.9",
@@ -27651,8 +27492,6 @@
     },
     "@babel/plugin-transform-literals": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz",
-      "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.9"
       }
@@ -27682,8 +27521,6 @@
     },
     "@babel/plugin-transform-modules-systemjs": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz",
-      "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==",
       "requires": {
         "@babel/helper-hoist-variables": "^7.18.6",
         "@babel/helper-module-transforms": "^7.18.9",
@@ -27721,8 +27558,6 @@
     },
     "@babel/plugin-transform-parameters": {
       "version": "7.18.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz",
-      "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.6"
       }
@@ -27748,8 +27583,6 @@
     },
     "@babel/plugin-transform-runtime": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz",
-      "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==",
       "requires": {
         "@babel/helper-module-imports": "^7.18.6",
         "@babel/helper-plugin-utils": "^7.18.9",
@@ -27760,9 +27593,7 @@
       },
       "dependencies": {
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+          "version": "6.3.0"
         }
       }
     },
@@ -27774,8 +27605,6 @@
     },
     "@babel/plugin-transform-spread": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz",
-      "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.9",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9"
@@ -27789,24 +27618,18 @@
     },
     "@babel/plugin-transform-template-literals": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz",
-      "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.9"
       }
     },
     "@babel/plugin-transform-typeof-symbol": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz",
-      "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.9"
       }
     },
     "@babel/plugin-transform-unicode-escapes": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz",
-      "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==",
       "requires": {
         "@babel/helper-plugin-utils": "^7.18.9"
       }
@@ -27820,8 +27643,6 @@
     },
     "@babel/preset-env": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz",
-      "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==",
       "requires": {
         "@babel/compat-data": "^7.18.8",
         "@babel/helper-compilation-targets": "^7.18.9",
@@ -27901,9 +27722,7 @@
       },
       "dependencies": {
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+          "version": "6.3.0"
         }
       }
     },
@@ -27919,8 +27738,6 @@
     },
     "@babel/register": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.9.tgz",
-      "integrity": "sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==",
       "dev": true,
       "requires": {
         "clone-deep": "^4.0.1",
@@ -27932,16 +27749,12 @@
     },
     "@babel/runtime": {
       "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz",
-      "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==",
       "requires": {
         "regenerator-runtime": "^0.13.4"
       }
     },
     "@babel/template": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
-      "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
       "requires": {
         "@babel/code-frame": "^7.18.6",
         "@babel/parser": "^7.18.10",
@@ -27950,8 +27763,6 @@
     },
     "@babel/traverse": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.10.tgz",
-      "integrity": "sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g==",
       "requires": {
         "@babel/code-frame": "^7.18.6",
         "@babel/generator": "^7.18.10",
@@ -27967,8 +27778,6 @@
     },
     "@babel/types": {
       "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz",
-      "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==",
       "requires": {
         "@babel/helper-string-parser": "^7.18.10",
         "@babel/helper-validator-identifier": "^7.18.6",
@@ -27987,21 +27796,25 @@
       }
     },
     "@eslint/eslintrc": {
-      "version": "0.4.3",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
+      "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
       "requires": {
         "ajv": "^6.12.4",
-        "debug": "^4.1.1",
-        "espree": "^7.3.0",
-        "globals": "^13.9.0",
-        "ignore": "^4.0.6",
+        "debug": "^4.3.2",
+        "espree": "^9.3.2",
+        "globals": "^13.15.0",
+        "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
-        "js-yaml": "^3.13.1",
-        "minimatch": "^3.0.4",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
         "strip-json-comments": "^3.1.1"
       },
       "dependencies": {
         "ajv": {
           "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
           "requires": {
             "fast-deep-equal": "^3.1.1",
             "fast-json-stable-stringify": "^2.0.0",
@@ -28009,30 +27822,28 @@
             "uri-js": "^4.2.2"
           }
         },
-        "argparse": {
-          "version": "1.0.10",
-          "requires": {
-            "sprintf-js": "~1.0.2"
-          }
-        },
         "globals": {
-          "version": "13.15.0",
+          "version": "13.17.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+          "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
           "requires": {
             "type-fest": "^0.20.2"
           }
         },
-        "js-yaml": {
-          "version": "3.14.1",
-          "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
-          }
+        "ignore": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+          "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ=="
         },
         "json-schema-traverse": {
-          "version": "0.4.1"
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
         },
         "type-fest": {
-          "version": "0.20.2"
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+          "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
         }
       }
     },
@@ -28106,15 +27917,24 @@
       }
     },
     "@humanwhocodes/config-array": {
-      "version": "0.5.0",
+      "version": "0.10.4",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz",
+      "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==",
       "requires": {
-        "@humanwhocodes/object-schema": "^1.2.0",
+        "@humanwhocodes/object-schema": "^1.2.1",
         "debug": "^4.1.1",
         "minimatch": "^3.0.4"
       }
     },
+    "@humanwhocodes/gitignore-to-minimatch": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz",
+      "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA=="
+    },
     "@humanwhocodes/object-schema": {
-      "version": "1.2.1"
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
     },
     "@hutson/parse-repository-url": {
       "version": "3.0.2",
@@ -31887,8 +31707,6 @@
         },
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -32171,7 +31989,7 @@
       }
     },
     "@types/chai": {
-      "version": "4.3.1",
+      "version": "4.3.3",
       "dev": true
     },
     "@types/chai-as-promised": {
@@ -32315,9 +32133,9 @@
       }
     },
     "@types/node": {
-      "version": "16.11.47",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.47.tgz",
-      "integrity": "sha512-fpP+jk2zJ4VW66+wAMFoBJlx1bxmBKx4DUFf68UHgdGCOuyUTDlLWqsaNPJh7xhNDykyJ9eIzAygilP/4WoN8g=="
+      "version": "16.11.51",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.51.tgz",
+      "integrity": "sha512-h6p1A77pHBDdOcI9y6Wfh9iRGa8lMUZMk2ebHJTNTtRwgbQzgemZow6PW7+Xs7Z0r0IQFY1+iRlcNAkRrf53nA=="
     },
     "@types/normalize-package-data": {
       "version": "2.4.1"
@@ -32362,7 +32180,9 @@
       }
     },
     "@types/semver": {
-      "version": "7.3.10"
+      "version": "7.3.12",
+      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz",
+      "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A=="
     },
     "@types/serve-favicon": {
       "version": "2.5.3",
@@ -32382,8 +32202,6 @@
     },
     "@types/sinon": {
       "version": "10.0.13",
-      "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz",
-      "integrity": "sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==",
       "dev": true,
       "requires": {
         "@types/sinonjs__fake-timers": "*"
@@ -32456,7 +32274,8 @@
     },
     "@types/ws": {
       "version": "8.5.3",
-      "dev": true,
+      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
+      "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==",
       "requires": {
         "@types/node": "*"
       }
@@ -32475,13 +32294,13 @@
       "version": "1.1.2"
     },
     "@wdio/config": {
-      "version": "7.20.8",
-      "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.20.8.tgz",
-      "integrity": "sha512-MPB88Njua6T2PYkkpUdLmPn73XWPBbew46twQLNuQ99Q5pdRrsiPFgPT4aO9pPfIMMGpQQ8QCy8s0xpCuTEwBQ==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.21.0.tgz",
+      "integrity": "sha512-FnShYzSuJfFjjqCwWqOVwwSpFQd57jYBwuQ2EbncS0nO/rnG8a/q0CZACwXwpDXwUXRqM8JoTidpEi3bIFjBoQ==",
       "requires": {
         "@wdio/logger": "7.19.0",
-        "@wdio/types": "7.20.7",
-        "@wdio/utils": "7.20.7",
+        "@wdio/types": "7.21.0",
+        "@wdio/utils": "7.21.0",
         "deepmerge": "^4.0.0",
         "glob": "^8.0.3"
       }
@@ -32526,41 +32345,39 @@
       }
     },
     "@wdio/protocols": {
-      "version": "7.20.6",
-      "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.20.6.tgz",
-      "integrity": "sha512-+G7zAw7MsjohFU+xVJO9unc4eUuTX3UdVT3mQGDHQLuSGNGVL5QrtgEGYx8x32OMkFX4zs6ncObVAf0kR6H4Mg=="
+      "version": "7.20.6"
     },
     "@wdio/repl": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.20.7.tgz",
-      "integrity": "sha512-9FXLyRWX7arYScEf9wFqkDuttVAPMJ91WA3C0FDf3vqbTxv1/4V5etkds/b7nH6SHq1FHdlcN4LCZ7lIfbu72Q==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.21.0.tgz",
+      "integrity": "sha512-4j81NL4NLSddpPZSvObTD6UFFJaqgWmSKE4cobqdJbxAnNhFM9h/Q63sgNnH8+cJPG7O8bmEqrvdCr5MtKCcuA==",
       "requires": {
-        "@wdio/utils": "7.20.7"
+        "@wdio/utils": "7.21.0"
       }
     },
     "@wdio/types": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.20.7.tgz",
-      "integrity": "sha512-MXz/J5GYswCaa+pyWEVpJoafnbqZr0eJf4p/Z9KsSB5xPWh5Co/1Y8gNLlR1msjV8jKhoWCh55uoBZFU//7G1A==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.21.0.tgz",
+      "integrity": "sha512-mKVMNRhUN4Idhz5u3PwblmkyhxQxAw03fOO8q0P0trxncqAFauqn7SJPgObBUui2zvtLUZvXwSHJR3dyns5CBA==",
       "requires": {
         "@types/node": "^18.0.0",
         "got": "^11.8.1"
       },
       "dependencies": {
         "@types/node": {
-          "version": "18.0.6",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz",
-          "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw=="
+          "version": "18.7.6",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.6.tgz",
+          "integrity": "sha512-EdxgKRXgYsNITy5mjjXjVE/CS8YENSdhiagGrLqjG0pvA2owgJ6i4l7wy/PFZGC0B1/H20lWKN7ONVDNYDZm7A=="
         }
       }
     },
     "@wdio/utils": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.20.7.tgz",
-      "integrity": "sha512-9KnvQ3J6+Jb/1Hzqhpf/QMr3t0rWG76A/gpw80ZIzUoMZzdquqSkDSlF1sOW2+GF2W3K1VsSB7ZcPelpadAsvw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.21.0.tgz",
+      "integrity": "sha512-26tlT4jrHQGxkFJtlGhkmcdcmtQrEBg6X1jPF4KWGKrwTNl7ocoszZzSrEgUhKEa6itWpzgQHZ1+L4UQZn57Pg==",
       "requires": {
         "@wdio/logger": "7.19.0",
-        "@wdio/types": "7.20.7",
+        "@wdio/types": "7.21.0",
         "p-iteration": "^1.1.8"
       }
     },
@@ -32646,7 +32463,10 @@
       }
     },
     "ansi-colors": {
-      "version": "4.1.3"
+      "version": "4.1.3",
+      "dev": true,
+      "optional": true,
+      "peer": true
     },
     "ansi-escapes": {
       "version": "4.3.2",
@@ -32717,19 +32537,19 @@
     "appium": {
       "version": "file:packages/appium",
       "requires": {
-        "@appium/base-driver": "^8.6.1",
-        "@appium/base-plugin": "^1.10.1",
-        "@appium/docutils": "^0.0.9",
+        "@appium/base-driver": "^8.7.0",
+        "@appium/base-plugin": "^1.10.2",
+        "@appium/docutils": "^0.0.10",
         "@appium/schema": "^0.0.9",
-        "@appium/support": "^2.59.4",
-        "@appium/test-support": "^1.4.1",
-        "@appium/types": "^0.3.1",
+        "@appium/support": "^2.59.5",
+        "@appium/test-support": "^1.5.0",
+        "@appium/types": "^0.4.0",
         "@babel/runtime": "7.18.9",
         "@sidvind/better-ajv-errors": "2.0.0",
         "@types/argparse": "2.0.10",
         "@types/bluebird": "3.5.36",
         "@types/fancy-log": "2.0.0",
-        "@types/semver": "7.3.10",
+        "@types/semver": "7.3.12",
         "@types/teen_process": "1.16.1",
         "@types/wrap-ansi": "3.0.0",
         "ajv": "8.11.0",
@@ -32751,7 +32571,7 @@
         "semver": "7.3.7",
         "source-map-support": "0.5.21",
         "teen_process": "1.16.0",
-        "type-fest": "2.18.0",
+        "type-fest": "2.18.1",
         "winston": "3.8.1",
         "wrap-ansi": "7.0.0",
         "yaml": "2.1.1"
@@ -32789,8 +32609,6 @@
     },
     "appium-adb": {
       "version": "9.10.2",
-      "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-9.10.2.tgz",
-      "integrity": "sha512-aeH0BJDUZzLRBlRwBtMZVIPmHqnRu8z+aQeIAd23JD0y3+d7d3Bk+Qa5q1+VhOuSSNU+ElWkJqnmaj8cRu+3FA==",
       "requires": {
         "@appium/support": "^2.55.3",
         "@babel/runtime": "^7.0.0",
@@ -32839,8 +32657,6 @@
       "dependencies": {
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "requires": {
             "fs.realpath": "^1.0.0",
             "inflight": "^1.0.4",
@@ -33126,22 +32942,6 @@
         "form-data": "^4.0.0"
       }
     },
-    "babel-eslint": {
-      "version": "10.1.0",
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.7.0",
-        "@babel/traverse": "^7.7.0",
-        "@babel/types": "^7.7.0",
-        "eslint-visitor-keys": "^1.0.0",
-        "resolve": "^1.12.0"
-      },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "1.3.0"
-        }
-      }
-    },
     "babel-plugin-dynamic-import-node": {
       "version": "2.3.3",
       "requires": {
@@ -33160,8 +32960,6 @@
     },
     "babel-plugin-polyfill-corejs2": {
       "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz",
-      "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==",
       "requires": {
         "@babel/compat-data": "^7.17.7",
         "@babel/helper-define-polyfill-provider": "^0.3.2",
@@ -33175,8 +32973,6 @@
     },
     "babel-plugin-polyfill-corejs3": {
       "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz",
-      "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==",
       "requires": {
         "@babel/helper-define-polyfill-provider": "^0.3.2",
         "core-js-compat": "^3.21.0"
@@ -33184,8 +32980,6 @@
     },
     "babel-plugin-polyfill-regenerator": {
       "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz",
-      "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==",
       "requires": {
         "@babel/helper-define-polyfill-provider": "^0.3.2"
       }
@@ -33514,8 +33308,6 @@
       "dependencies": {
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -34415,8 +34207,6 @@
     },
     "cross-env": {
       "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
-      "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
       "requires": {
         "cross-spawn": "^7.0.1"
       }
@@ -34667,17 +34457,17 @@
       "version": "2.1.0"
     },
     "devtools": {
-      "version": "7.20.8",
-      "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.20.8.tgz",
-      "integrity": "sha512-EsJSICiJiY7hjXN18Ys1q5Hg3pSaTY5I7sBrwpVycYddm41UYGGTCcQOLEDJZZb0wxwgj2gyW0/i2vh7UYU/sw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.21.0.tgz",
+      "integrity": "sha512-HKAOzLleo4rcEkjNv4l0Ozo1I99KSt67/kedXhU2GSAsnaEtd3LkVrl9GBZXelorTe5qeA4+r5Svw6R6i1GyKA==",
       "requires": {
         "@types/node": "^18.0.0",
         "@types/ua-parser-js": "^0.7.33",
-        "@wdio/config": "7.20.8",
+        "@wdio/config": "7.21.0",
         "@wdio/logger": "7.19.0",
         "@wdio/protocols": "7.20.6",
-        "@wdio/types": "7.20.7",
-        "@wdio/utils": "7.20.7",
+        "@wdio/types": "7.21.0",
+        "@wdio/utils": "7.21.0",
         "chrome-launcher": "^0.15.0",
         "edge-paths": "^2.1.0",
         "puppeteer-core": "^13.1.3",
@@ -34692,9 +34482,9 @@
       }
     },
     "devtools-protocol": {
-      "version": "0.0.1029085",
-      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1029085.tgz",
-      "integrity": "sha512-48FoiceZWyYdE1LXAptQeWG1Hz4VfHpTlAdh9kvZ+0WCglbShPeKzKgg+rvsJvlUbpAXyjmi/bvCamPFI5jkZw=="
+      "version": "0.0.1034970",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1034970.tgz",
+      "integrity": "sha512-kC7Wo+7z+Bo202DVB7qVqccreL+RpcGk/6eCrpM1qj2azag6UCMg05GL3ty2adg8CXWFpUGdMeyFJfIN8lQtgw=="
     },
     "dezalgo": {
       "version": "1.0.4",
@@ -34855,6 +34645,9 @@
     },
     "enquirer": {
       "version": "2.3.6",
+      "dev": true,
+      "optional": true,
+      "peer": true,
       "requires": {
         "ansi-colors": "^4.1.1"
       }
@@ -34977,58 +34770,55 @@
       "version": "1.0.5"
     },
     "eslint": {
-      "version": "7.32.0",
+      "version": "8.22.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz",
+      "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==",
       "requires": {
-        "@babel/code-frame": "7.12.11",
-        "@eslint/eslintrc": "^0.4.3",
-        "@humanwhocodes/config-array": "^0.5.0",
+        "@eslint/eslintrc": "^1.3.0",
+        "@humanwhocodes/config-array": "^0.10.4",
+        "@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
         "ajv": "^6.10.0",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
-        "debug": "^4.0.1",
+        "debug": "^4.3.2",
         "doctrine": "^3.0.0",
-        "enquirer": "^2.3.5",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^5.1.1",
-        "eslint-utils": "^2.1.0",
-        "eslint-visitor-keys": "^2.0.0",
-        "espree": "^7.3.1",
+        "eslint-scope": "^7.1.1",
+        "eslint-utils": "^3.0.0",
+        "eslint-visitor-keys": "^3.3.0",
+        "espree": "^9.3.3",
         "esquery": "^1.4.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
         "file-entry-cache": "^6.0.1",
+        "find-up": "^5.0.0",
         "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.1.2",
-        "globals": "^13.6.0",
-        "ignore": "^4.0.6",
+        "glob-parent": "^6.0.1",
+        "globals": "^13.15.0",
+        "globby": "^11.1.0",
+        "grapheme-splitter": "^1.0.4",
+        "ignore": "^5.2.0",
         "import-fresh": "^3.0.0",
         "imurmurhash": "^0.1.4",
         "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
+        "js-yaml": "^4.1.0",
         "json-stable-stringify-without-jsonify": "^1.0.1",
         "levn": "^0.4.1",
         "lodash.merge": "^4.6.2",
-        "minimatch": "^3.0.4",
+        "minimatch": "^3.1.2",
         "natural-compare": "^1.4.0",
         "optionator": "^0.9.1",
-        "progress": "^2.0.0",
-        "regexpp": "^3.1.0",
-        "semver": "^7.2.1",
-        "strip-ansi": "^6.0.0",
+        "regexpp": "^3.2.0",
+        "strip-ansi": "^6.0.1",
         "strip-json-comments": "^3.1.0",
-        "table": "^6.0.9",
         "text-table": "^0.2.0",
         "v8-compile-cache": "^2.0.3"
       },
       "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.12.11",
-          "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
         "ajv": {
           "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
           "requires": {
             "fast-deep-equal": "^3.1.1",
             "fast-json-stable-stringify": "^2.0.0",
@@ -35038,18 +34828,16 @@
         },
         "ansi-styles": {
           "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "requires": {
             "color-convert": "^2.0.1"
           }
         },
-        "argparse": {
-          "version": "1.0.10",
-          "requires": {
-            "sprintf-js": "~1.0.2"
-          }
-        },
         "chalk": {
           "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
           "requires": {
             "ansi-styles": "^4.1.0",
             "supports-color": "^7.1.0"
@@ -35057,40 +34845,112 @@
         },
         "color-convert": {
           "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
           "requires": {
             "color-name": "~1.1.4"
           }
         },
         "color-name": {
-          "version": "1.1.4"
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
         },
         "escape-string-regexp": {
-          "version": "4.0.0"
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+          "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+        },
+        "eslint-scope": {
+          "version": "7.1.1",
+          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+          "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+          "requires": {
+            "esrecurse": "^4.3.0",
+            "estraverse": "^5.2.0"
+          }
+        },
+        "eslint-visitor-keys": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+          "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA=="
+        },
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+        },
+        "find-up": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+          "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+          "requires": {
+            "locate-path": "^6.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "glob-parent": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+          "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+          "requires": {
+            "is-glob": "^4.0.3"
+          }
         },
         "globals": {
-          "version": "13.15.0",
+          "version": "13.17.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+          "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
           "requires": {
             "type-fest": "^0.20.2"
           }
         },
-        "js-yaml": {
-          "version": "3.14.1",
+        "ignore": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+          "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ=="
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+        },
+        "locate-path": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+          "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
           "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
+            "p-locate": "^5.0.0"
           }
         },
-        "json-schema-traverse": {
-          "version": "0.4.1"
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+          "requires": {
+            "yocto-queue": "^0.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+          "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+          "requires": {
+            "p-limit": "^3.0.2"
+          }
         },
         "supports-color": {
           "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "requires": {
             "has-flag": "^4.0.0"
           }
         },
         "type-fest": {
-          "version": "0.20.2"
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+          "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
         }
       }
     },
@@ -35112,8 +34972,6 @@
       "dependencies": {
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -35271,18 +35129,12 @@
       }
     },
     "eslint-plugin-mocha": {
-      "version": "9.0.0",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz",
+      "integrity": "sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==",
       "requires": {
         "eslint-utils": "^3.0.0",
-        "ramda": "^0.27.1"
-      },
-      "dependencies": {
-        "eslint-utils": {
-          "version": "3.0.0",
-          "requires": {
-            "eslint-visitor-keys": "^2.0.0"
-          }
-        }
+        "rambda": "^7.1.0"
       }
     },
     "eslint-plugin-promise": {
@@ -35301,29 +35153,35 @@
       }
     },
     "eslint-utils": {
-      "version": "2.1.0",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
       "requires": {
-        "eslint-visitor-keys": "^1.1.0"
-      },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "1.3.0"
-        }
+        "eslint-visitor-keys": "^2.0.0"
       }
     },
     "eslint-visitor-keys": {
       "version": "2.1.0"
     },
     "espree": {
-      "version": "7.3.1",
+      "version": "9.3.3",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz",
+      "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==",
       "requires": {
-        "acorn": "^7.4.0",
-        "acorn-jsx": "^5.3.1",
-        "eslint-visitor-keys": "^1.3.0"
+        "acorn": "^8.8.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.3.0"
       },
       "dependencies": {
+        "acorn": {
+          "version": "8.8.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
+          "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w=="
+        },
         "eslint-visitor-keys": {
-          "version": "1.3.0"
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+          "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA=="
         }
       }
     },
@@ -36332,8 +36190,6 @@
     },
     "glob": {
       "version": "8.0.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz",
-      "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==",
       "requires": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -36344,16 +36200,12 @@
       "dependencies": {
         "brace-expansion": {
           "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
           "requires": {
             "balanced-match": "^1.0.0"
           }
         },
         "minimatch": {
           "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
-          "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
           "requires": {
             "brace-expansion": "^2.0.1"
           }
@@ -36390,8 +36242,6 @@
       "dependencies": {
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "requires": {
             "fs.realpath": "^1.0.0",
             "inflight": "^1.0.4",
@@ -36741,8 +36591,6 @@
       "dependencies": {
         "ansi-colors": {
           "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-          "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
           "requires": {
             "ansi-wrap": "^0.1.0"
           }
@@ -36752,8 +36600,6 @@
         },
         "plugin-error": {
           "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
-          "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
           "requires": {
             "ansi-colors": "^1.0.1",
             "arr-diff": "^4.0.0",
@@ -37007,8 +36853,6 @@
         },
         "ansi-colors": {
           "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-          "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
           "requires": {
             "ansi-wrap": "^0.1.0"
           }
@@ -37127,8 +36971,6 @@
         },
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "requires": {
             "fs.realpath": "^1.0.0",
             "inflight": "^1.0.4",
@@ -37180,8 +37022,6 @@
         },
         "plugin-error": {
           "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
-          "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
           "requires": {
             "ansi-colors": "^1.0.1",
             "arr-diff": "^4.0.0",
@@ -37465,8 +37305,6 @@
         },
         "plugin-error": {
           "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
-          "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
           "requires": {
             "ansi-colors": "^1.0.1",
             "arr-diff": "^4.0.0",
@@ -37476,8 +37314,6 @@
           "dependencies": {
             "ansi-colors": {
               "version": "1.1.0",
-              "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-              "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
               "requires": {
                 "ansi-wrap": "^0.1.0"
               }
@@ -37951,8 +37787,6 @@
       "dependencies": {
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -38428,8 +38262,6 @@
     },
     "jsdoc": {
       "version": "3.6.11",
-      "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.11.tgz",
-      "integrity": "sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg==",
       "requires": {
         "@babel/parser": "^7.9.4",
         "@types/markdown-it": "^12.2.3",
@@ -38449,21 +38281,15 @@
       },
       "dependencies": {
         "escape-string-regexp": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
-          "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
+          "version": "2.0.0"
         },
         "mkdirp": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+          "version": "1.0.4"
         }
       }
     },
     "jsdoc-plugin-typescript": {
       "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/jsdoc-plugin-typescript/-/jsdoc-plugin-typescript-2.1.1.tgz",
-      "integrity": "sha512-zbGdmQ6uxe2yR9vG04hEA+wrYFxOxjQ3P1fRXDTTIttozMIWwUuljSgcR+lOZ5O7jb9P7a/GCtftJzQN22qEsg==",
       "requires": {
         "string.prototype.matchall": "^4.0.0"
       }
@@ -38533,8 +38359,6 @@
       "dependencies": {
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -38619,9 +38443,7 @@
       "version": "2.0.0"
     },
     "ky": {
-      "version": "0.30.0",
-      "resolved": "https://registry.npmjs.org/ky/-/ky-0.30.0.tgz",
-      "integrity": "sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog=="
+      "version": "0.30.0"
     },
     "last-run": {
       "version": "1.1.1",
@@ -39157,9 +38979,7 @@
       "version": "4.5.0"
     },
     "lodash.debounce": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+      "version": "4.0.8"
     },
     "lodash.defaults": {
       "version": "4.2.0"
@@ -39208,9 +39028,6 @@
         "lodash._reinterpolate": "^3.0.0"
       }
     },
-    "lodash.truncate": {
-      "version": "4.4.2"
-    },
     "lodash.union": {
       "version": "4.6.0"
     },
@@ -39358,9 +39175,9 @@
       "version": "2.0.0"
     },
     "lru-cache": {
-      "version": "7.13.2",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.2.tgz",
-      "integrity": "sha512-VJL3nIpA79TodY/ctmZEfhASgqekbT574/c4j3jn4bKXbSCnTTCH/KltZyvL2GlV+tGSMtsWyem8DCX7qKTMBA=="
+      "version": "7.14.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz",
+      "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ=="
     },
     "lru-queue": {
       "version": "0.1.0",
@@ -39814,8 +39631,6 @@
     },
     "mjpeg-consumer": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mjpeg-consumer/-/mjpeg-consumer-2.0.0.tgz",
-      "integrity": "sha512-nyVOIMOQ7JEXwFPUkcbDgekBJGXSK/53nqhPnKZen3a4CAOM4HxqzPZQxDo/8NPhoueuXlvKN3DeDLV2OSi1fw==",
       "dev": true
     },
     "mjpeg-server": {
@@ -40207,8 +40022,6 @@
         },
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -40498,8 +40311,6 @@
       "dependencies": {
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -40742,8 +40553,6 @@
         },
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "requires": {
             "fs.realpath": "^1.0.0",
             "inflight": "^1.0.4",
@@ -41498,16 +41307,12 @@
     },
     "plugin-error": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-2.0.0.tgz",
-      "integrity": "sha512-o4bwIOmuFwUg2MU6xt7plGEQY3YyENx6kvwaFZBrUpamA91FdS9w3U+pU0y4OuDoBQe+jf3RLGSfQebSRBEVsQ==",
       "requires": {
         "ansi-colors": "^1.0.1"
       },
       "dependencies": {
         "ansi-colors": {
           "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-          "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
           "requires": {
             "ansi-wrap": "^0.1.0"
           }
@@ -41800,8 +41605,10 @@
     "quick-lru": {
       "version": "5.1.1"
     },
-    "ramda": {
-      "version": "0.27.2"
+    "rambda": {
+      "version": "7.2.1",
+      "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.2.1.tgz",
+      "integrity": "sha512-Wswj8ZvzdI3VhaGPkZAxaCTwuMmGtgWt7Zxsgyo4P+iTmVnkojvyWaOep5q3ZjMIecW0wtQa66GWxaKkZ24RAA=="
     },
     "randombytes": {
       "version": "2.1.0",
@@ -41852,8 +41659,6 @@
       "dependencies": {
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -41885,8 +41690,6 @@
       "dependencies": {
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -42271,8 +42074,6 @@
         },
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "requires": {
             "fs.realpath": "^1.0.0",
             "inflight": "^1.0.4",
@@ -42485,8 +42286,6 @@
       "dependencies": {
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "requires": {
             "fs.realpath": "^1.0.0",
             "inflight": "^1.0.4",
@@ -43399,8 +43198,6 @@
         },
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -43500,55 +43297,6 @@
         }
       }
     },
-    "table": {
-      "version": "6.8.0",
-      "requires": {
-        "ajv": "^8.0.1",
-        "lodash.truncate": "^4.4.2",
-        "slice-ansi": "^4.0.0",
-        "string-width": "^4.2.3",
-        "strip-ansi": "^6.0.1"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "astral-regex": {
-          "version": "2.0.0"
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4"
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0"
-        },
-        "slice-ansi": {
-          "version": "4.0.0",
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "astral-regex": "^2.0.0",
-            "is-fullwidth-code-point": "^3.0.0"
-          }
-        },
-        "string-width": {
-          "version": "4.2.3",
-          "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^6.0.1"
-          }
-        }
-      }
-    },
     "taffydb": {
       "version": "2.6.2"
     },
@@ -43676,8 +43424,6 @@
       "dependencies": {
         "glob": {
           "version": "7.2.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "requires": {
             "fs.realpath": "^1.0.0",
             "inflight": "^1.0.4",
@@ -43970,9 +43716,9 @@
       "version": "4.0.8"
     },
     "type-fest": {
-      "version": "2.18.0",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.18.0.tgz",
-      "integrity": "sha512-pRS+/yrW5TjPPHNOvxhbNZexr2bS63WjrMU8a+VzEBhUi9Tz1pZeD+vQz3ut0svZ46P+SRqMEPnJmk2XnvNzTw=="
+      "version": "2.18.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.18.1.tgz",
+      "integrity": "sha512-UKCINsd4qiATXD6OIlnQw9t1ux/n2ld+Nl0kzPbCONhCaUIS/BhJbNw14w6584HCQWf3frBK8vmWnGZq/sbPHQ=="
     },
     "type-is": {
       "version": "1.6.18",
@@ -43991,7 +43737,8 @@
       }
     },
     "typescript": {
-      "version": "4.7.4"
+      "version": "4.7.4",
+      "devOptional": true
     },
     "ua-parser-js": {
       "version": "1.0.2"
@@ -44408,16 +44155,16 @@
       }
     },
     "webdriver": {
-      "version": "7.20.8",
-      "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.20.8.tgz",
-      "integrity": "sha512-XMOy6K/jHR7GkU8BMzl5jmzoYf9jWoEDrieG16EobFFV5m1tC5ZoTPIx+pLAfleMKJdbjj9Lf5QpoY23M1BSuw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.21.0.tgz",
+      "integrity": "sha512-FZV+2AtlmrQCAwH3ecnF9kcWCrATEEaU8xHfY3l7MSAaW/sAR38XKzhdzeVffOQlwXBVIeePbhUW+qAW+OmDww==",
       "requires": {
         "@types/node": "^18.0.0",
-        "@wdio/config": "7.20.8",
+        "@wdio/config": "7.21.0",
         "@wdio/logger": "7.19.0",
         "@wdio/protocols": "7.20.6",
-        "@wdio/types": "7.20.7",
-        "@wdio/utils": "7.20.7",
+        "@wdio/types": "7.21.0",
+        "@wdio/utils": "7.21.0",
         "got": "^11.0.2",
         "ky": "0.30.0",
         "lodash.merge": "^4.6.1"
@@ -44429,24 +44176,24 @@
       }
     },
     "webdriverio": {
-      "version": "7.20.9",
-      "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.20.9.tgz",
-      "integrity": "sha512-p/XNuIL1fSeF4oR9sKYDHKijDFZyay/J+EW5G8rTwKvAnve/psskLcS+59gGTcUrWRSrqZ/Rfhn3ybrccEGAuw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.21.0.tgz",
+      "integrity": "sha512-R6QOwYxlWL1Eu+AwcORd5NKKAgyMOmTYcRxe+TI5eaKFBj+QOWwtF+2cN8xSXA7jT7rNTkSyBUonTAS2aty9hQ==",
       "requires": {
         "@types/aria-query": "^5.0.0",
         "@types/node": "^18.0.0",
-        "@wdio/config": "7.20.8",
+        "@wdio/config": "7.21.0",
         "@wdio/logger": "7.19.0",
         "@wdio/protocols": "7.20.6",
-        "@wdio/repl": "7.20.7",
-        "@wdio/types": "7.20.7",
-        "@wdio/utils": "7.20.7",
+        "@wdio/repl": "7.21.0",
+        "@wdio/types": "7.21.0",
+        "@wdio/utils": "7.21.0",
         "archiver": "^5.0.0",
         "aria-query": "^5.0.0",
         "css-shorthand-properties": "^1.1.1",
         "css-value": "^0.0.1",
-        "devtools": "7.20.8",
-        "devtools-protocol": "^0.0.1029085",
+        "devtools": "7.21.0",
+        "devtools-protocol": "^0.0.1034970",
         "fs-extra": "^10.0.0",
         "grapheme-splitter": "^1.0.2",
         "lodash.clonedeep": "^4.5.0",
@@ -44459,13 +44206,13 @@
         "resq": "^1.9.1",
         "rgb2hex": "0.2.5",
         "serialize-error": "^8.0.0",
-        "webdriver": "7.20.8"
+        "webdriver": "7.21.0"
       },
       "dependencies": {
         "@types/node": {
-          "version": "18.6.2",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.2.tgz",
-          "integrity": "sha512-KcfkBq9H4PI6Vpu5B/KoPeuVDAbmi+2mDBqGPGUgoL7yXQtcWGu2vJWmmRkneWK3Rh0nIAX192Aa87AqKHYChQ=="
+          "version": "18.7.6",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.6.tgz",
+          "integrity": "sha512-EdxgKRXgYsNITy5mjjXjVE/CS8YENSdhiagGrLqjG0pvA2owgJ6i4l7wy/PFZGC0B1/H20lWKN7ONVDNYDZm7A=="
         },
         "brace-expansion": {
           "version": "2.0.1",
@@ -44717,8 +44464,6 @@
     },
     "ws": {
       "version": "8.8.1",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz",
-      "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==",
       "dev": true,
       "requires": {}
     },
diff --git a/package.json b/package.json
index f1ba9354e..45ffddc35 100644
--- a/package.json
+++ b/package.json
@@ -103,17 +103,16 @@
     "@appium/fake-plugin": "1.3.1",
     "@babel/cli": "7.18.10",
     "@babel/core": "7.18.10",
-    "@babel/eslint-parser": "7.18.9",
     "@babel/plugin-transform-runtime": "7.18.10",
     "@babel/preset-env": "7.18.10",
     "@babel/register": "7.18.9",
     "@babel/runtime": "7.18.9",
     "@colors/colors": "1.5.0",
-    "@types/chai": "4.3.1",
+    "@types/chai": "4.3.3",
     "@types/chai-as-promised": "7.1.5",
     "@types/mocha": "9.1.1",
-    "@types/node": "16.11.47",
-    "@types/semver": "7.3.10",
+    "@types/node": "16.11.51",
+    "@types/semver": "7.3.12",
     "@types/sinon": "10.0.13",
     "@types/sinon-chai": "3.2.8",
     "@types/teen_process": "1.16.1",
@@ -124,11 +123,11 @@
     "chai": "4.3.6",
     "chai-as-promised": "7.1.1",
     "chai-webdriverio-async": "2.7.0",
-    "eslint": "7.32.0",
+    "eslint": "8.22.0",
     "eslint-config-prettier": "8.5.0",
     "eslint-find-rules": "4.1.0",
     "eslint-plugin-import": "2.26.0",
-    "eslint-plugin-mocha": "9.0.0",
+    "eslint-plugin-mocha": "10.1.0",
     "eslint-plugin-promise": "6.0.0",
     "fancy-log": "2.0.0",
     "finalhandler": "1.2.0",
@@ -154,7 +153,7 @@
     "through2": "4.0.2",
     "typescript": "4.7.4",
     "validate.js": "0.13.1",
-    "webdriverio": "7.20.9",
+    "webdriverio": "7.21.0",
     "ws": "8.8.1",
     "yaml-js": "0.3.1"
   },
diff --git a/packages/appium/CHANGELOG.md b/packages/appium/CHANGELOG.md
index 93a7eb99d..bd9024c41 100644
--- a/packages/appium/CHANGELOG.md
+++ b/packages/appium/CHANGELOG.md
@@ -3,6 +3,23 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+# [2.0.0-beta.43](https://github.com/appium/appium/compare/appium@2.0.0-beta.42...appium@2.0.0-beta.43) (2022-08-10)
+
+
+### Bug Fixes
+
+* **appium:** fix busted config file normalization algorithm ([dc4835f](https://github.com/appium/appium/commit/dc4835f293f371c36873801a0060bb22eead2cc0))
+
+
+### Features
+
+* **appium,base-driver,fake-driver,fake-plugin,test-support,types:** updateServer receives cliArgs param ([d4b9833](https://github.com/appium/appium/commit/d4b983328af21d1e5c27a91e438e7934eb152ab1)), closes [#17304](https://github.com/appium/appium/issues/17304)
+* **base-driver,fake-driver,appium:** add convenience methods for defining execute script overloads ([#17321](https://github.com/appium/appium/issues/17321)) ([337ec3e](https://github.com/appium/appium/commit/337ec3e7ba216dd6f8cdc88143ecaa4c75f5d266))
+
+
+
+
+
 # [2.0.0-beta.42](https://github.com/appium/appium/compare/appium@2.0.0-beta.41...appium@2.0.0-beta.42) (2022-08-03)
 
 
diff --git a/packages/appium/docs/en/ecosystem/build-drivers.md b/packages/appium/docs/en/ecosystem/build-drivers.md
index 76af39da0..ec728aa17 100644
--- a/packages/appium/docs/en/ecosystem/build-drivers.md
+++ b/packages/appium/docs/en/ecosystem/build-drivers.md
@@ -537,7 +537,7 @@ behaviours that don't map to any of the existing commands, you can create new co
 two ways:
 
 1. Extending the WebDriver protocol and creating client-side plugins to access the extensions
-1. Overloading the Execute Script command
+1. Overloading the Execute Script command by defining "Execute Methods"
 
 If you want to follow the first path, you can direct Appium to recognize new methods and add them
 to its set of allowed HTTP routes and command names. You do this by assigning the `newMethodMap`
@@ -566,37 +566,56 @@ create and release client-side plugins for each language you want to support (di
 examples can be found at the relevant client docs).
 
 An alternative to this way of doing things is to overload a command which all WebDriver clients
-have access to already: Execute Script. A common driver pattern is to create a magic prefix which
-the driver looks for at the beginning of any Execute Script invocation, and if it's present, to
-treat the rest of the script string as the name of a custom command to execute. This works in large
-part because for most platforms beyond web browsers, executing arbitrary JavaScript isn't a thing
-that makes sense.
-
-Let's say you are building a driver for stereo system called `soundz`, and you wanted to create
-a command for playing a song by name. You could expose this to your users in such a way that they
-call something like:
+have access to already: Execute Script. Appium provides some a convenient tool for making this
+easy. Let's say you are building a driver for stereo system called `soundz`, and you wanted to
+create a command for playing a song by name. You could expose this to your users in such a way that
+they call something like:
 
 ```js
-// webdriverio example
+// webdriverio example. Calling webdriverio's `executeScript` command is what trigger's Appium's
+// Execute Script command handler
 driver.executeScript('soundz: playSong', [{song: 'Stairway to Heaven', artist: 'Led Zeppelin'}]);
 ```
 
-Then in your driver code you could simply look for `soundz:` at the beginning of your
-`execute` override, and do the appropriate thing:
+Then in your driver code you can define the static property `executeMethodMap` as a mapping of
+script names to methods on your driver. It has the same basic form as `newMethodMap`, described
+above. Once `executeMethodMap` is defined, you'll also need to implement the Execute Script command
+handler, which according to Appium's routes mapping is called `execute`. The implementation can
+call a single helper function, `this.executeMethod`, which takes care of looking at the script and
+arguments the user sent in and routing it to the correct custom handler you've defined. Here's an
+example:
 
 ```js
-async execute(script, args) {
-  if (script === 'soundz: playSong') {
-    const {song, artist} = args[0];
-    // play the song based on song and artist details
-    return;
+static executeMethodMap = {
+  'soundz: playSong', {
+    command: 'soundzPlaySong',
+    params: {required: ['song', 'artist'], optional: []},
   }
+}
 
-  // otherwise do the normal thing, or throw errors.NotYetImplementedError if you have nothing to
-  // do (see the section on WebDriver errors in this guide)
+async soundzPlaySong(song, artist) {
+  // play the song based on song and artist details
+}
+
+async execute(script, args) {
+  return await this.executeMethod(script, args);
 }
 ```
 
+A couple notes about this system:
+1. The arguments array sent via the call to Execute Script must contain only zero or one element(s). The
+   first item in the list is considered to be the parameters object for your method. These parameters
+   will be parsed, validated, and then applied to your overload method in the order specified in
+   `executeMethodMap` (the order specified in the `required` parameters list, followed by the
+   `optional` parameters list). I.e., this framework assumes only a single actual argument sent in via
+   Execute Script (and this argument should be an object with keys/values representing the
+   parameters your execute method expects).
+1. Appium does not automatically implement `execute` (the Execute Script handler) for you. You may
+   wish, for example, to only call the `executeMethod` helper function when you're not in proxy
+   mode!
+1. The `executeMethod` helper will reject with an error if a script name doesn't match one of the
+   script names defined as a command in `executeMethodMap`, or if there are missing parameters.
+
 ### Implement handling of Appium settings
 
 Appium users can send parameters to your driver via CLI args as well as via capabilities. But these
diff --git a/packages/appium/docs/scripts/build-docs.js b/packages/appium/docs/scripts/build-docs.js
index f9e21441b..4ad3db312 100644
--- a/packages/appium/docs/scripts/build-docs.js
+++ b/packages/appium/docs/scripts/build-docs.js
@@ -19,7 +19,7 @@ const {version} = require('../../package.json');
 
 const branch = process.env.APPIUM_DOCS_BRANCH || DOCS_BRANCH;
 const prefix = process.env.APPIUM_DOCS_PREFIX || DOCS_PREFIX;
-const remote = process.env.APPIUM_DOCS_PREFIX || DOCS_REMOTE;
+const remote = process.env.APPIUM_DOCS_REMOTE || DOCS_REMOTE;
 
 const shouldPush = !!process.env.APPIUM_DOCS_PUBLISH;
 
diff --git a/packages/appium/lib/main.js b/packages/appium/lib/main.js
index 07e34fc20..8a238b1bc 100755
--- a/packages/appium/lib/main.js
+++ b/packages/appium/lib/main.js
@@ -26,7 +26,7 @@ import {loadExtensions, getActivePlugins, getActiveDrivers} from './extension';
 import {DRIVER_TYPE, PLUGIN_TYPE, SERVER_SUBCOMMAND} from './constants';
 import registerNode from './grid-register';
 import {getDefaultsForSchema, validate} from './schema/schema';
-import {inspect} from './utils';
+import {inspect, adjustNodePath} from './utils';
 
 const {resolveAppiumHome} = env;
 
@@ -172,6 +172,8 @@ function areServerCommandArgs(args) {
 async function init(args) {
   const appiumHome = args?.appiumHome ?? (await resolveAppiumHome());
 
+  await adjustNodePath();
+
   const {driverConfig, pluginConfig} = await loadExtensions(appiumHome);
 
   const parser = getParser();
@@ -304,6 +306,7 @@ async function main(args) {
   const serverUpdaters = getServerUpdaters(driverClasses, pluginClasses);
   const extraMethodMap = getExtraMethodMap(driverClasses, pluginClasses);
 
+  /** @type {import('@appium/base-driver').ServerOpts} */
   const serverOpts = {
     routeConfiguringFunction,
     port: parsedArgs.port,
@@ -312,6 +315,7 @@ async function main(args) {
     basePath: parsedArgs.basePath,
     serverUpdaters,
     extraMethodMap,
+    cliArgs: parsedArgs,
   };
   if (parsedArgs.keepAliveTimeout) {
     serverOpts.keepAliveTimeout = parsedArgs.keepAliveTimeout * 1000;
diff --git a/packages/appium/lib/schema/cli-transformers.js b/packages/appium/lib/schema/cli-transformers.js
index 297b06357..591d5e6cd 100644
--- a/packages/appium/lib/schema/cli-transformers.js
+++ b/packages/appium/lib/schema/cli-transformers.js
@@ -94,8 +94,9 @@ export const transformers = {
       json = readFileSync(jsonOrPath, 'utf8');
       loadedFromFile = true;
     } catch (err) {
-      // unreadable files don't count... but other problems do.
-      if (err.code !== 'ENOENT') {
+      // unreadable files don't count.
+      // also `ENAMETOOLONG` can happen if we try to open a file that's a huge JSON string.
+      if (err.code !== 'ENOENT' && err.code !== 'ENAMETOOLONG') {
         throw err;
       }
     }
diff --git a/packages/appium/lib/utils.js b/packages/appium/lib/utils.js
index a926a7fc2..9dac648b6 100644
--- a/packages/appium/lib/utils.js
+++ b/packages/appium/lib/utils.js
@@ -2,6 +2,8 @@ import _ from 'lodash';
 import logger from './logger';
 import {processCapabilities, PROTOCOLS} from '@appium/base-driver';
 import {inspect as dump} from 'util';
+import {fs} from '@appium/support';
+import path from 'path';
 
 const W3C_APPIUM_PREFIX = 'appium';
 
@@ -209,6 +211,77 @@ function getPackageVersion(pkgName) {
   return pkgInfo.version;
 }
 
+/**
+ * Adjusts NODE_PATH environment variable,
+ * so drivers and plugins could load their peer dependencies.
+ * Read https://nodejs.org/api/modules.html#loading-from-the-global-folders
+ * for more details.
+ * @returns {Promise<void>}
+ */
+async function adjustNodePath() {
+  const pathParts = path.resolve(...(__filename.split(path.sep)))
+    .split(path.sep)
+    .map((x) => x === '' ? path.sep : x);
+  let nodeModulesRoot = null;
+  for (let pathItemIdx = pathParts.length - 1; pathItemIdx > 0; --pathItemIdx) {
+    const manifestPath = path.join(...(pathParts.slice(0, pathItemIdx)), 'package.json');
+    if (!await fs.exists(manifestPath)) {
+      continue;
+    }
+    try {
+      if (JSON.parse(await fs.readFile(manifestPath, 'utf8')).name === 'appium') {
+        nodeModulesRoot = path.join(...(pathParts.slice(0, pathItemIdx - 1)));
+        break;
+      }
+    } catch (ign) {}
+  }
+  if (!nodeModulesRoot) {
+    return;
+  }
+
+  const refreshRequirePaths = () => {
+    try {
+      // ! This hack allows us to avoid modification of import
+      // ! statements in client modules. It uses a private API though,
+      // ! so it could break (maybe, eventually).
+      // See https://gist.github.com/branneman/8048520#7-the-hack
+      // @ts-ignore
+      require('module').Module._initPaths();
+      return true;
+    } catch (e) {
+      logger.info(`Module init paths cannot be refreshed. Original error: ${e.message}`);
+      return false;
+    }
+  };
+
+  if (!process.env.NODE_PATH) {
+    process.env.NODE_PATH = nodeModulesRoot;
+    if (refreshRequirePaths()) {
+      logger.info(`Setting NODE_PATH to '${nodeModulesRoot}'`);
+      process.env.APPIUM_OMIT_PEER_DEPS = '1';
+    } else {
+      delete process.env.NODE_PATH;
+    }
+    return;
+  }
+
+  const nodePathParts = process.env.NODE_PATH.split(path.delimiter);
+  if (nodePathParts.includes(nodeModulesRoot)) {
+    logger.info(`NODE_PATH already includes '${nodeModulesRoot}'`);
+    process.env.APPIUM_OMIT_PEER_DEPS = '1';
+    return;
+  }
+
+  nodePathParts.push(nodeModulesRoot);
+  process.env.NODE_PATH = nodePathParts.join(path.delimiter);
+  if (refreshRequirePaths()) {
+    logger.info(`Adding '${nodeModulesRoot}' to NODE_PATH`);
+    process.env.APPIUM_OMIT_PEER_DEPS = '1';
+  } else {
+    process.env.NODE_PATH = _.without(nodePathParts, nodeModulesRoot).join(path.delimiter);
+  }
+}
+
 /**
  * Pulls the initial values of Appium settings from the given capabilities argument.
  * Each setting item must satisfy the following format:
@@ -250,6 +323,7 @@ export {
   getPackageVersion,
   pullSettings,
   removeAppiumPrefixes,
+  adjustNodePath,
 };
 
 /**
diff --git a/packages/appium/package.json b/packages/appium/package.json
index 60b939aaf..c3d6312d9 100644
--- a/packages/appium/package.json
+++ b/packages/appium/package.json
@@ -1,6 +1,6 @@
 {
   "name": "appium",
-  "version": "2.0.0-beta.42",
+  "version": "2.0.0-beta.43",
   "description": "Automation for Apps.",
   "keywords": [
     "automation",
@@ -61,19 +61,19 @@
     "test:unit": "mocha \"./test/unit/**/*.spec.js\""
   },
   "dependencies": {
-    "@appium/base-driver": "^8.6.1",
-    "@appium/base-plugin": "^1.10.1",
-    "@appium/docutils": "^0.0.9",
+    "@appium/base-driver": "^8.7.0",
+    "@appium/base-plugin": "^1.10.2",
+    "@appium/docutils": "^0.0.10",
     "@appium/schema": "^0.0.9",
-    "@appium/support": "^2.59.4",
-    "@appium/test-support": "^1.4.1",
-    "@appium/types": "^0.3.1",
+    "@appium/support": "^2.59.5",
+    "@appium/test-support": "^1.5.0",
+    "@appium/types": "^0.4.0",
     "@babel/runtime": "7.18.9",
     "@sidvind/better-ajv-errors": "2.0.0",
     "@types/argparse": "2.0.10",
     "@types/bluebird": "3.5.36",
     "@types/fancy-log": "2.0.0",
-    "@types/semver": "7.3.10",
+    "@types/semver": "7.3.12",
     "@types/teen_process": "1.16.1",
     "@types/wrap-ansi": "3.0.0",
     "ajv": "8.11.0",
@@ -95,7 +95,7 @@
     "semver": "7.3.7",
     "source-map-support": "0.5.21",
     "teen_process": "1.16.0",
-    "type-fest": "2.18.0",
+    "type-fest": "2.18.1",
     "winston": "3.8.1",
     "wrap-ansi": "7.0.0",
     "yaml": "2.1.1"
diff --git a/packages/base-driver/CHANGELOG.md b/packages/base-driver/CHANGELOG.md
index fbc531f24..e6ae163b9 100644
--- a/packages/base-driver/CHANGELOG.md
+++ b/packages/base-driver/CHANGELOG.md
@@ -3,6 +3,18 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+# [8.7.0](https://github.com/appium/appium/compare/@appium/base-driver@8.6.1...@appium/base-driver@8.7.0) (2022-08-10)
+
+
+### Features
+
+* **appium,base-driver,fake-driver,fake-plugin,test-support,types:** updateServer receives cliArgs param ([d4b9833](https://github.com/appium/appium/commit/d4b983328af21d1e5c27a91e438e7934eb152ab1)), closes [#17304](https://github.com/appium/appium/issues/17304)
+* **base-driver,fake-driver,appium:** add convenience methods for defining execute script overloads ([#17321](https://github.com/appium/appium/issues/17321)) ([337ec3e](https://github.com/appium/appium/commit/337ec3e7ba216dd6f8cdc88143ecaa4c75f5d266))
+
+
+
+
+
 ## [8.6.1](https://github.com/appium/appium/compare/@appium/base-driver@8.6.0...@appium/base-driver@8.6.1) (2022-08-03)
 
 
diff --git a/packages/base-driver/lib/basedriver/commands/execute.js b/packages/base-driver/lib/basedriver/commands/execute.js
new file mode 100644
index 000000000..7bbf3c2b8
--- /dev/null
+++ b/packages/base-driver/lib/basedriver/commands/execute.js
@@ -0,0 +1,65 @@
+import _ from 'lodash';
+import {errors, makeArgs, checkParams} from '../../protocol';
+
+/**
+ * @param {SessionBase} Base
+ * @returns {ExecuteBase}
+ */
+export function ExecuteMixin(Base) {
+  /**
+   * @implements {IExecuteCommands}
+   */
+  class ExecuteCommands extends Base {
+    /**
+     * @param {string} script
+     * @param {[Record<string, any>]|[]} protoArgs
+     */
+    async executeMethod(script, protoArgs) {
+      // the w3c protocol will give us an array of arguments to apply to a javascript function.
+      // that's not what we're doing. we're going to look for a JS object as the first arg, so we
+      // can perform validation on it. we'll ignore everything else.
+      if (!protoArgs || !_.isArray(protoArgs) || protoArgs.length > 1) {
+        throw new errors.InvalidArgumentError(
+          `Did not get correct format of arguments for execute method. Expected zero or one ` +
+            `arguments to execute script and instead received: ${JSON.stringify(protoArgs)}`
+        );
+      }
+      let args = protoArgs[0] ?? {};
+      if (!_.isPlainObject(args)) {
+        throw new errors.InvalidArgumentError(
+          `Did not receive an appropriate execute method parameters object. It needs to be ` +
+            `deserializable as a plain JS object`
+        );
+      }
+
+      const Driver = /** @type {DriverClass} */ (this.constructor);
+      const availableScripts = _.keys(Driver.executeMethodMap);
+      const commandMetadata = Driver.executeMethodMap[script];
+      if (!commandMetadata) {
+        throw new errors.UnsupportedOperationError(
+          `Unsupported execute method '${script}'. Available methods ` +
+            `are: ${availableScripts.join(', ')}`
+        );
+      }
+      let argsToApply = [];
+      if (!commandMetadata.params) {
+        commandMetadata.params = {required: [], optional: []};
+      } else {
+        commandMetadata.params.required ??= [];
+        commandMetadata.params.optional ??= [];
+        checkParams(commandMetadata.params, args, null);
+      }
+      argsToApply = makeArgs({}, args, commandMetadata.params, null);
+      return await this[Driver.executeMethodMap[script].command](...argsToApply);
+    }
+  }
+  return ExecuteCommands;
+}
+
+/**
+ * @typedef {import('@appium/types').ExecuteCommands} IExecuteCommands
+ * @typedef {import('@appium/types').Driver} Driver
+ * @typedef {import('@appium/types').DriverClass} DriverClass
+ * @typedef {import('./session').SessionBase} SessionBase
+ * @typedef {import('../driver').BaseDriverBase<import('@appium/types').TimeoutCommands & import('@appium/types').EventCommands & import('@appium/types').FindCommands & import('@appium/types').LogCommands & import('@appium/types').SettingsCommands & import('@appium/types').SessionCommands & IExecuteCommands>} ExecuteBase
+ */
diff --git a/packages/base-driver/lib/basedriver/commands/index.js b/packages/base-driver/lib/basedriver/commands/index.js
index 659d5ffe3..1dae4b232 100644
--- a/packages/base-driver/lib/basedriver/commands/index.js
+++ b/packages/base-driver/lib/basedriver/commands/index.js
@@ -6,6 +6,7 @@ import {LogMixin} from './log';
 import {SessionMixin} from './session';
 import {SettingsMixin} from './settings';
 import {TimeoutMixin} from './timeout';
+import {ExecuteMixin} from './execute';
 
 /**
  * Applies all the mixins to the `BaseDriverBase` class.
@@ -19,7 +20,8 @@ export function createBaseDriverClass(Base) {
   const WithLogCommands = LogMixin(WithFindCommands);
   const WithSettingsCommands = SettingsMixin(WithLogCommands);
   const WithSessionCommands = SessionMixin(WithSettingsCommands);
-  return WithSessionCommands;
+  const WithExecuteCommands = ExecuteMixin(WithSessionCommands);
+  return WithExecuteCommands;
 }
 
 /**
diff --git a/packages/base-driver/lib/basedriver/core.js b/packages/base-driver/lib/basedriver/core.js
index f3ebeaa3b..69308999c 100644
--- a/packages/base-driver/lib/basedriver/core.js
+++ b/packages/base-driver/lib/basedriver/core.js
@@ -27,6 +27,9 @@ class DriverCore {
    */
   static baseVersion = BASEDRIVER_VER;
 
+  /** @type {ExecuteMethodMap} */
+  static executeMethodMap = {};
+
   /**
    * @type {string?}
    */
@@ -423,6 +426,7 @@ export {DriverCore};
  * @typedef {import('@appium/types').W3CCapabilities} W3CCapabilities
  * @typedef {import('@appium/types').Driver} Driver
  * @typedef {import('@appium/types').Core} Core
+ * @typedef {import('@appium/types').ExecuteMethodMap} ExecuteMethodMap
  * @typedef {import('@appium/types').ServerArgs} ServerArgs
  * @typedef {import('@appium/types').EventHistory} EventHistory
  * @typedef {import('@appium/types').AppiumLogger} AppiumLogger
diff --git a/packages/base-driver/lib/express/server.js b/packages/base-driver/lib/express/server.js
index 880d69b74..fb1e727a7 100644
--- a/packages/base-driver/lib/express/server.js
+++ b/packages/base-driver/lib/express/server.js
@@ -40,6 +40,7 @@ async function server(opts) {
     routeConfiguringFunction,
     port,
     hostname,
+    cliArgs,
     allowCors = true,
     basePath = DEFAULT_BASE_PATH,
     extraMethodMap = {},
@@ -71,7 +72,7 @@ async function server(opts) {
       });
       // allow extensions to update the app and http server objects
       for (const updater of serverUpdaters) {
-        await updater(app, appiumServer);
+        await updater(app, appiumServer, cliArgs);
       }
 
       // once all configurations and updaters have been applied, make sure to set up a catchall
@@ -292,6 +293,7 @@ export {server, configureServer, normalizeBasePath};
  * @typedef ServerOpts
  * @property {RouteConfiguringFunction} routeConfiguringFunction
  * @property {number} port
+ * @property {import('@appium/types').ServerArgs} cliArgs
  * @property {string} [hostname]
  * @property {boolean} [allowCors]
  * @property {string} [basePath]
diff --git a/packages/base-driver/lib/index.js b/packages/base-driver/lib/index.js
index 051df990b..d4db0ec1c 100644
--- a/packages/base-driver/lib/index.js
+++ b/packages/base-driver/lib/index.js
@@ -37,3 +37,7 @@ export {
 
 // Web socket helpers
 export {DEFAULT_WS_PATHNAME_PREFIX} from './express/websocket';
+
+/**
+ * @typedef {import('./express/server').ServerOpts} ServerOpts
+ */
diff --git a/packages/base-driver/lib/protocol/index.js b/packages/base-driver/lib/protocol/index.js
index b171f722f..e97990dab 100644
--- a/packages/base-driver/lib/protocol/index.js
+++ b/packages/base-driver/lib/protocol/index.js
@@ -5,6 +5,8 @@ import {
   CREATE_SESSION_COMMAND,
   DELETE_SESSION_COMMAND,
   GET_STATUS_COMMAND,
+  makeArgs,
+  checkParams,
 } from './protocol';
 import {NO_SESSION_ID_COMMANDS, ALL_COMMANDS, METHOD_MAP, routeToCommandName} from './routes';
 import {errors, isErrorType, errorFromMJSONWPStatusCode, errorFromW3CJsonCode} from './errors';
@@ -13,6 +15,8 @@ export {
   routeConfiguringFunction,
   errors,
   isErrorType,
+  makeArgs,
+  checkParams,
   errorFromMJSONWPStatusCode,
   errorFromW3CJsonCode,
   ALL_COMMANDS,
diff --git a/packages/base-driver/lib/protocol/protocol.js b/packages/base-driver/lib/protocol/protocol.js
index c12ddb29d..a14323bea 100644
--- a/packages/base-driver/lib/protocol/protocol.js
+++ b/packages/base-driver/lib/protocol/protocol.js
@@ -94,7 +94,7 @@ function unwrapParams(paramSets, jsonObj) {
   return res;
 }
 
-function checkParams(paramSets, jsonObj, protocol) {
+export function checkParams(paramSets, jsonObj, protocol) {
   let requiredParams = [];
   let optionalParams = [];
   let receivedParams = _.keys(jsonObj);
@@ -162,7 +162,7 @@ function checkParams(paramSets, jsonObj, protocol) {
  * on handling parameters. This method returns an array of arguments which will
  * be applied to a command.
  */
-function makeArgs(requestParams, jsonObj, payloadParams, protocol) {
+export function makeArgs(requestParams, jsonObj, payloadParams, protocol) {
   // We want to pass the "url" parameters to the commands in reverse order
   // since the command will sometimes want to ignore, say, the sessionId.
   // This has the effect of putting sessionId last, which means in JS we can
diff --git a/packages/base-driver/package.json b/packages/base-driver/package.json
index 8423e8adb..e02eb3220 100644
--- a/packages/base-driver/package.json
+++ b/packages/base-driver/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@appium/base-driver",
-  "version": "8.6.1",
+  "version": "8.7.0",
   "description": "Base driver class for Appium drivers",
   "keywords": [
     "automation",
@@ -45,7 +45,7 @@
     "test:unit": "mocha \"./test/unit/**/*.spec.js\""
   },
   "dependencies": {
-    "@appium/support": "^2.59.4",
+    "@appium/support": "^2.59.5",
     "@babel/runtime": "7.18.9",
     "@colors/colors": "1.5.0",
     "@types/async-lock": "1.1.5",
@@ -62,12 +62,12 @@
     "express": "4.18.1",
     "http-status-codes": "2.2.0",
     "lodash": "4.17.21",
-    "lru-cache": "7.13.2",
+    "lru-cache": "7.14.0",
     "method-override": "3.0.0",
     "morgan": "1.10.0",
     "serve-favicon": "2.5.0",
     "source-map-support": "0.5.21",
-    "type-fest": "2.18.0",
+    "type-fest": "2.18.1",
     "validate.js": "0.13.1"
   },
   "engines": {
diff --git a/packages/base-plugin/CHANGELOG.md b/packages/base-plugin/CHANGELOG.md
index b2d016ac6..d1b10bde1 100644
--- a/packages/base-plugin/CHANGELOG.md
+++ b/packages/base-plugin/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [1.10.2](https://github.com/appium/appium/compare/@appium/base-plugin@1.10.1...@appium/base-plugin@1.10.2) (2022-08-10)
+
+**Note:** Version bump only for package @appium/base-plugin
+
+
+
+
+
 ## [1.10.1](https://github.com/appium/appium/compare/@appium/base-plugin@1.10.0...@appium/base-plugin@1.10.1) (2022-08-03)
 
 
diff --git a/packages/base-plugin/package.json b/packages/base-plugin/package.json
index 65fa3abdc..90b59a1ae 100644
--- a/packages/base-plugin/package.json
+++ b/packages/base-plugin/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@appium/base-plugin",
-  "version": "1.10.1",
+  "version": "1.10.2",
   "description": "The base plugin used to create Appium 2.0 plugins",
   "bugs": {
     "url": "https://github.com/appium/appium/issues"
@@ -31,7 +31,7 @@
     "test:unit": "mocha \"./test/unit/**/*.spec.js\""
   },
   "dependencies": {
-    "@appium/support": "^2.59.4"
+    "@appium/support": "^2.59.5"
   },
   "engines": {
     "node": ">=14",
diff --git a/packages/doctor/CHANGELOG.md b/packages/doctor/CHANGELOG.md
index 280030c4d..1a893e4ab 100644
--- a/packages/doctor/CHANGELOG.md
+++ b/packages/doctor/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [1.16.25](https://github.com/appium/appium/compare/@appium/doctor@1.16.24...@appium/doctor@1.16.25) (2022-08-10)
+
+**Note:** Version bump only for package @appium/doctor
+
+
+
+
+
 ## [1.16.24](https://github.com/appium/appium/compare/@appium/doctor@1.16.23...@appium/doctor@1.16.24) (2022-08-03)
 
 
diff --git a/packages/doctor/package.json b/packages/doctor/package.json
index aa1962370..fce707c2b 100644
--- a/packages/doctor/package.json
+++ b/packages/doctor/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@appium/doctor",
-  "version": "1.16.24",
+  "version": "1.16.25",
   "description": "Test environment for fitness to run Appium",
   "keywords": [
     "automation",
@@ -49,7 +49,7 @@
     "test:unit": "mocha \"./test/unit/**/*.spec.js\""
   },
   "dependencies": {
-    "@appium/support": "^2.59.4",
+    "@appium/support": "^2.59.5",
     "@babel/runtime": "7.18.9",
     "@colors/colors": "1.5.0",
     "@types/bluebird": "3.5.36",
diff --git a/packages/docutils/CHANGELOG.md b/packages/docutils/CHANGELOG.md
index 0398a2c50..a5535acef 100644
--- a/packages/docutils/CHANGELOG.md
+++ b/packages/docutils/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [0.0.10](https://github.com/appium/appium/compare/@appium/docutils@0.0.9...@appium/docutils@0.0.10) (2022-08-10)
+
+**Note:** Version bump only for package @appium/docutils
+
+
+
+
+
 ## [0.0.9](https://github.com/appium/appium/compare/@appium/docutils@0.0.8...@appium/docutils@0.0.9) (2022-08-03)
 
 
diff --git a/packages/docutils/package.json b/packages/docutils/package.json
index a0558fa4c..9c861ea20 100644
--- a/packages/docutils/package.json
+++ b/packages/docutils/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@appium/docutils",
-  "version": "0.0.9",
+  "version": "0.0.10",
   "description": "Documentation generation utilities for Appium and related projects",
   "keywords": [
     "appium",
@@ -41,7 +41,7 @@
     "test:unit": "mocha \"./test/unit/**/*.spec.js\""
   },
   "dependencies": {
-    "@appium/support": "^2.59.4",
+    "@appium/support": "^2.59.5",
     "@babel/runtime": "7.18.9",
     "docdash": "1.2.0",
     "jsdoc": "3.6.11",
diff --git a/packages/eslint-config-appium/README.md b/packages/eslint-config-appium/README.md
index ca4e7d439..8b27c9159 100644
--- a/packages/eslint-config-appium/README.md
+++ b/packages/eslint-config-appium/README.md
@@ -1,18 +1,16 @@
-## Appium ESLint Shared Configuation
+# @appium/eslint-config-appium
 
-This package works to provide [eslint](http://eslint.org/) [shared configuration](http://eslint.org/docs/developer-guide/shareable-configs) to replace the need for a local `.eslintrc` file.
+> Provides a reusable [ESLint](http://eslint.org/) [shared configuration](http://eslint.org/docs/developer-guide/shareable-configs) for [Appium](https://github.com/appium/appium) and Appium-adjacent projects.
 
-It uses [babel-eslint](https://github.com/babel/babel-eslint) as a parser.
+## Usage
 
-### Usage
-
-Install the package
+Install the package with **`npm` v7 or newer** (for automatic installation of peer dependencies):
 
 ```bash
-npm install @appium/eslint-config-appium eslint-plugin-import eslint-plugin-mocha eslint-plugin-promise -D
+npm install @appium/eslint-config-appium --save-dev
 ```
 
-And then, in your `.eslintrc` file extend the configuration
+And then, in your `.eslintrc` file, extend the configuration:
 
 ```json
 {
@@ -20,18 +18,21 @@ And then, in your `.eslintrc` file extend the configuration
 }
 ```
 
-If you are using [@appium/gulp-plugins](https://www.npmjs.com/package/@appium/gulp-plugins) you can then run
+## Peer Dependencies
 
-```bash
-gulp eslint
-```
+This config requires the following packages be installed (as dev dependencies) in your project.  See the `package.json` for the required versions.
+
+- [eslint](https://www.npmjs.com/package/eslint)
+- [eslint-config-prettier](https://www.npmjs.com/package/eslint-config-prettier)
+- [eslint-plugin-import](https://www.npmjs.com/package/eslint-plugin-import)
+- [eslint-plugin-mocha](https://www.npmjs.com/package/eslint-plugin-mocha)
+- [eslint-plugin-promise](https://www.npmjs.com/package/eslint-plugin-promise)
+
+## Notes
 
-### Peer Dependencies
+- This configuration is intended to be used alongside [Prettier](https://www.npmjs.com/package/prettier).
+- This package was previously published as `eslint-config-appium`.
 
-This config requires the following packages be installed (as dev dependencies) in your project:
+## License
 
-* [babel-eslint](https://www.npmjs.com/package/babel-eslint)
-* [eslint](https://www.npmjs.com/package/eslint)
-* [eslint-plugin-import](https://www.npmjs.com/package/eslint-plugin-import)
-* [eslint-plugin-mocha](https://www.npmjs.com/package/eslint-plugin-mocha)
-* [eslint-plugin-promise](https://www.npmjs.com/package/eslint-plugin-promise)
+Copyright © 2016 OpenJS Foundation. Licensed Apache-2.0
diff --git a/packages/eslint-config-appium/index.js b/packages/eslint-config-appium/index.js
index f7c27cecf..12d7e05d5 100644
--- a/packages/eslint-config-appium/index.js
+++ b/packages/eslint-config-appium/index.js
@@ -1,18 +1,12 @@
 module.exports = {
-  parser: '@babel/eslint-parser',
   parserOptions: {
     requireConfigFile: false,
-    ecmaVersion: 12,
     sourceType: 'module',
-    ecmaFeatures: {
-      impliedStrict: true,
-      experimentalObjectRestSpread: true,
-    },
   },
   env: {
     node: true,
     mocha: true,
-    es6: true,
+    es2022: true,
   },
   plugins: ['import', 'mocha', 'promise'],
   globals: {
diff --git a/packages/eslint-config-appium/package.json b/packages/eslint-config-appium/package.json
index 5361becee..b05fab0f9 100644
--- a/packages/eslint-config-appium/package.json
+++ b/packages/eslint-config-appium/package.json
@@ -1,12 +1,11 @@
 {
   "name": "@appium/eslint-config-appium",
   "version": "6.0.4",
-  "description": "Shared config for Appium's eslint style",
+  "description": "Shared ESLint config for Appium projects",
   "keywords": [
     "eslint",
     "eslintconfig",
-    "appium",
-    "es2015"
+    "appium"
   ],
   "homepage": "https://appium.io",
   "bugs": {
@@ -32,13 +31,11 @@
     "test:smoke": "node ./index.js"
   },
   "peerDependencies": {
-    "@babel/core": "7.18.10",
-    "@babel/eslint-parser": "7.18.9",
-    "eslint": "7.32.0",
-    "eslint-config-prettier": "8.5.0",
-    "eslint-plugin-import": "2.26.0",
-    "eslint-plugin-mocha": "9.0.0",
-    "eslint-plugin-promise": "6.0.0"
+    "eslint": "^8.21.0",
+    "eslint-config-prettier": "^8.5.0",
+    "eslint-plugin-import": "^2.26.0",
+    "eslint-plugin-mocha": "^10.1.0",
+    "eslint-plugin-promise": "^6.0.0"
   },
   "engines": {
     "node": ">=14",
diff --git a/packages/execute-driver-plugin/package.json b/packages/execute-driver-plugin/package.json
index 89c45938b..e52349506 100644
--- a/packages/execute-driver-plugin/package.json
+++ b/packages/execute-driver-plugin/package.json
@@ -41,7 +41,7 @@
     "lodash": "4.17.21",
     "source-map-support": "0.5.21",
     "vm2": "3.9.10",
-    "webdriverio": "7.20.9"
+    "webdriverio": "7.21.0"
   },
   "peerDependencies": {
     "appium": "^2.0.0-beta.35"
diff --git a/packages/fake-driver/CHANGELOG.md b/packages/fake-driver/CHANGELOG.md
index b56d2d3a0..65563407b 100644
--- a/packages/fake-driver/CHANGELOG.md
+++ b/packages/fake-driver/CHANGELOG.md
@@ -3,6 +3,18 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+# [4.2.0](https://github.com/appium/appium/compare/@appium/fake-driver@4.1.0...@appium/fake-driver@4.2.0) (2022-08-10)
+
+
+### Features
+
+* **appium,base-driver,fake-driver,fake-plugin,test-support,types:** updateServer receives cliArgs param ([d4b9833](https://github.com/appium/appium/commit/d4b983328af21d1e5c27a91e438e7934eb152ab1)), closes [#17304](https://github.com/appium/appium/issues/17304)
+* **base-driver,fake-driver,appium:** add convenience methods for defining execute script overloads ([#17321](https://github.com/appium/appium/issues/17321)) ([337ec3e](https://github.com/appium/appium/commit/337ec3e7ba216dd6f8cdc88143ecaa4c75f5d266))
+
+
+
+
+
 # [4.1.0](https://github.com/appium/appium/compare/@appium/fake-driver@4.0.2...@appium/fake-driver@4.1.0) (2022-08-03)
 
 
diff --git a/packages/fake-driver/lib/commands/general.js b/packages/fake-driver/lib/commands/general.js
index 2686699e5..b2161db55 100644
--- a/packages/fake-driver/lib/commands/general.js
+++ b/packages/fake-driver/lib/commands/general.js
@@ -69,6 +69,14 @@ commands.getLog = async function getLog(type) {
   }
 };
 
+commands.execute = async function execute(script, args) {
+  return await this.executeMethod(script, args);
+};
+
+commands.fakeAddition = async function fakeAddition(num1, num2, num3) {
+  return num1 + num2 + (num3 ?? 0);
+};
+
 Object.assign(extensions, commands, helpers);
 export {commands, helpers};
 export default extensions;
diff --git a/packages/fake-driver/lib/driver.js b/packages/fake-driver/lib/driver.js
index 2bf61b014..5cd6cb6de 100644
--- a/packages/fake-driver/lib/driver.js
+++ b/packages/fake-driver/lib/driver.js
@@ -113,13 +113,30 @@ class FakeDriver extends BaseDriver {
     },
   };
 
+  static executeMethodMap = {
+    'fake: addition': {
+      command: 'fakeAddition',
+      params: {required: ['num1', 'num2'], optional: ['num3']},
+    },
+    'fake: getThing': {
+      command: 'getFakeThing',
+    },
+    'fake: setThing': {
+      command: 'setFakeThing',
+      params: {required: ['thing']},
+    },
+  };
+
   static fakeRoute(req, res) {
     res.send(JSON.stringify({fakedriver: 'fakeResponse'}));
   }
 
-  static async updateServer(expressApp /*, httpServer*/) {
+  static async updateServer(expressApp, httpServer, cliArgs) {
     // eslint-disable-line require-await
     expressApp.all('/fakedriver', FakeDriver.fakeRoute);
+    expressApp.all('/fakedriverCliArgs', (req, res) => {
+      res.send(JSON.stringify(cliArgs));
+    });
   }
 }
 
diff --git a/packages/fake-driver/package.json b/packages/fake-driver/package.json
index 8da364d3b..341b60051 100644
--- a/packages/fake-driver/package.json
+++ b/packages/fake-driver/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@appium/fake-driver",
-  "version": "4.1.0",
+  "version": "4.2.0",
   "description": "Mock driver used internally by Appium for testing. Ignore",
   "keywords": [
     "automation",
diff --git a/packages/fake-plugin/CHANGELOG.md b/packages/fake-plugin/CHANGELOG.md
index 555693c55..2a5823c85 100644
--- a/packages/fake-plugin/CHANGELOG.md
+++ b/packages/fake-plugin/CHANGELOG.md
@@ -3,6 +3,17 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+# [2.1.0](https://github.com/appium/appium/compare/@appium/fake-plugin@2.0.5...@appium/fake-plugin@2.1.0) (2022-08-10)
+
+
+### Features
+
+* **appium,base-driver,fake-driver,fake-plugin,test-support,types:** updateServer receives cliArgs param ([d4b9833](https://github.com/appium/appium/commit/d4b983328af21d1e5c27a91e438e7934eb152ab1)), closes [#17304](https://github.com/appium/appium/issues/17304)
+
+
+
+
+
 ## [2.0.5](https://github.com/appium/appium/compare/@appium/fake-plugin@2.0.4...@appium/fake-plugin@2.0.5) (2022-08-03)
 
 
diff --git a/packages/fake-plugin/lib/plugin.js b/packages/fake-plugin/lib/plugin.js
index ef6361039..8a152da6d 100644
--- a/packages/fake-plugin/lib/plugin.js
+++ b/packages/fake-plugin/lib/plugin.js
@@ -40,9 +40,12 @@ class FakePlugin extends BasePlugin {
   }
 
   // eslint-disable-next-line no-unused-vars,require-await
-  static async updateServer(expressApp, httpServer) {
+  static async updateServer(expressApp, httpServer, cliArgs) {
     expressApp.all('/fake', FakePlugin.fakeRoute);
     expressApp.all('/unexpected', FakePlugin.unexpectedData);
+    expressApp.all('/cliArgs', (req, res) => {
+      res.send(JSON.stringify(cliArgs));
+    });
   }
 
   async getPageSource(next, driver, ...args) {
diff --git a/packages/fake-plugin/package.json b/packages/fake-plugin/package.json
index 990735e27..4d5c9393d 100644
--- a/packages/fake-plugin/package.json
+++ b/packages/fake-plugin/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@appium/fake-plugin",
-  "version": "2.0.5",
+  "version": "2.1.0",
   "description": "A fake Appium 2.0 plugin",
   "homepage": "https://appium.io",
   "bugs": {
@@ -33,8 +33,8 @@
     "test:unit": "mocha \"./test/unit/**/*.spec.js\""
   },
   "dependencies": {
-    "@appium/base-plugin": "^1.10.1",
-    "@appium/support": "^2.59.4",
+    "@appium/base-plugin": "^1.10.2",
+    "@appium/support": "^2.59.5",
     "@babel/runtime": "7.18.9",
     "@types/bluebird": "3.5.36",
     "bluebird": "3.7.2",
diff --git a/packages/gulp-plugins/CHANGELOG.md b/packages/gulp-plugins/CHANGELOG.md
index 163900918..396f619c8 100644
--- a/packages/gulp-plugins/CHANGELOG.md
+++ b/packages/gulp-plugins/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [7.0.5](https://github.com/appium/appium/compare/@appium/gulp-plugins@7.0.4...@appium/gulp-plugins@7.0.5) (2022-08-10)
+
+**Note:** Version bump only for package @appium/gulp-plugins
+
+
+
+
+
 ## [7.0.4](https://github.com/appium/appium/compare/@appium/gulp-plugins@7.0.3...@appium/gulp-plugins@7.0.4) (2022-08-03)
 
 
diff --git a/packages/gulp-plugins/package.json b/packages/gulp-plugins/package.json
index e69a71c06..9ae30ecfd 100644
--- a/packages/gulp-plugins/package.json
+++ b/packages/gulp-plugins/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@appium/gulp-plugins",
-  "version": "7.0.4",
+  "version": "7.0.5",
   "description": "Custom gulp plugins to be used across all appium modules",
   "keywords": [
     "automation",
@@ -52,19 +52,18 @@
     "@octokit/rest": "18.12.0",
     "@types/fancy-log": "2.0.0",
     "@types/gulp": "4.0.9",
-    "@types/semver": "7.3.10",
+    "@types/semver": "7.3.12",
     "@types/through2": "2.0.36",
     "ansi-red": "0.1.1",
     "axios": "0.27.2",
-    "babel-eslint": "10.1.0",
     "babel-plugin-istanbul": "6.1.1",
     "babel-plugin-source-map-support": "2.2.0",
     "bluebird": "3.7.2",
     "del": "6.1.1",
-    "eslint": "7.32.0",
+    "eslint": "8.22.0",
     "eslint-config-prettier": "8.5.0",
     "eslint-plugin-import": "2.26.0",
-    "eslint-plugin-mocha": "9.0.0",
+    "eslint-plugin-mocha": "10.1.0",
     "eslint-plugin-promise": "6.0.0",
     "fancy-log": "2.0.0",
     "form-data": "4.0.0",
diff --git a/packages/images-plugin/CHANGELOG.md b/packages/images-plugin/CHANGELOG.md
index fc4d6e479..f00942d76 100644
--- a/packages/images-plugin/CHANGELOG.md
+++ b/packages/images-plugin/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [1.3.5](https://github.com/appium/appium/compare/@appium/images-plugin@1.3.4...@appium/images-plugin@1.3.5) (2022-08-10)
+
+**Note:** Version bump only for package @appium/images-plugin
+
+
+
+
+
 ## [1.3.4](https://github.com/appium/appium/compare/@appium/images-plugin@1.3.3...@appium/images-plugin@1.3.4) (2022-08-03)
 
 
diff --git a/packages/images-plugin/package.json b/packages/images-plugin/package.json
index ac4825732..a1dde7ba2 100644
--- a/packages/images-plugin/package.json
+++ b/packages/images-plugin/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@appium/images-plugin",
-  "version": "1.3.4",
+  "version": "1.3.5",
   "description": "Plugin for working with images and image elements in Appium",
   "keywords": [
     "appium",
@@ -39,7 +39,7 @@
   "dependencies": {
     "@appium/opencv": "^1.0.11",
     "@babel/runtime": "7.18.9",
-    "lru-cache": "7.13.2",
+    "lru-cache": "7.14.0",
     "source-map-support": "0.5.21"
   },
   "peerDependencies": {
diff --git a/packages/support/CHANGELOG.md b/packages/support/CHANGELOG.md
index f779a1ed5..008d686f8 100644
--- a/packages/support/CHANGELOG.md
+++ b/packages/support/CHANGELOG.md
@@ -3,6 +3,18 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [2.59.5](https://github.com/appium/appium/compare/@appium/support@2.59.4...@appium/support@2.59.5) (2022-08-10)
+
+
+### Bug Fixes
+
+* **support:** add missing @appium/types ([888aac8](https://github.com/appium/appium/commit/888aac85ffcf9974023ad1173ae89ebf0f27d09a))
+* **support:** path to APPIUM_HOME must always be absolute ([8d6ffe0](https://github.com/appium/appium/commit/8d6ffe0932fd2aab0dbdf64e483bb906ad626e17)), closes [#17338](https://github.com/appium/appium/issues/17338)
+
+
+
+
+
 ## [2.59.4](https://github.com/appium/appium/compare/@appium/support@2.59.3...@appium/support@2.59.4) (2022-08-03)
 
 
diff --git a/packages/support/lib/env.js b/packages/support/lib/env.js
index 695ba9222..35b3e53d2 100644
--- a/packages/support/lib/env.js
+++ b/packages/support/lib/env.js
@@ -112,6 +112,8 @@ export const readPackageInDir = _.memoize(
  * - If `APPIUM_HOME` is set in the environment, use that
  * - If we have an `extensions.yaml` in {@linkcode DEFAULT_APPIUM_HOME}, then use that.
  * - If we find a `package.json` in or above `cwd` and {@linkcode shouldUseCwdForAppiumHome} returns `true`, then use the directory containing the `package.json`.
+ *
+ * All returned paths will be absolute.
  */
 export const resolveAppiumHome = _.memoize(
   /**
@@ -119,14 +121,14 @@ export const resolveAppiumHome = _.memoize(
    * @returns {Promise<string>}
    */
   async function _resolveAppiumHome(cwd = process.cwd()) {
-    if (process.env.APPIUM_HOME) {
-      return process.env.APPIUM_HOME;
-    }
-
     if (!path.isAbsolute(cwd)) {
       throw new TypeError('`cwd` parameter must be an absolute path');
     }
 
+    if (process.env.APPIUM_HOME) {
+      return path.resolve(cwd, process.env.APPIUM_HOME);
+    }
+
     /** @type {string|undefined} */
     let currentPkgDir;
 
@@ -136,6 +138,10 @@ export const resolveAppiumHome = _.memoize(
       // if we can't find a `package.json`, use the default
       if (!currentPkgDir) {
         return DEFAULT_APPIUM_HOME;
+      } else {
+        // it's unclear from the contract of `pkgDir` whether or not it can return a relative path,
+        // so let's just be defensive.
+        currentPkgDir = path.resolve(cwd, currentPkgDir);
       }
     } catch {
       // unclear if this can actually happen
diff --git a/packages/support/lib/npm.js b/packages/support/lib/npm.js
index 5d13fb84f..cbf59a0bf 100644
--- a/packages/support/lib/npm.js
+++ b/packages/support/lib/npm.js
@@ -193,20 +193,13 @@ export class NPM {
       }
     }
 
-    /**
-     * If we've found a `package.json` containined the `appiumCreated` property,
-     * then we can do whatever we please with it, since we created it.  This is
-     * likely when `APPIUM_HOME` is the default (in `~/.appium`).  In that case,
-     * we want `--global-style` to avoid deduping, and we also do not need a
-     * `package-lock.json`.
-     *
-     * If we _haven't_ found such a key, then this `package.json` isn't a
-     * "dummy" and is controlled by the user.  So we'll just add it as a dev
-     * dep; whatever else it does is up to the user's npm config.
-     */
-    const installOpts = (await hasAppiumDependency(cwd))
-      ? ['--save-dev']
-      : ['--save-dev', '--save-exact', '--global-style', '--no-package-lock'];
+    const installOpts = ['--save-dev'];
+    if (!await hasAppiumDependency(cwd)) {
+      if (process.env.APPIUM_OMIT_PEER_DEPS) {
+        installOpts.push('--omit=peer');
+      }
+      installOpts.push('--save-exact', '--global-style', '--no-package-lock');
+    }
 
     const res = await this.exec(
       'install',
diff --git a/packages/support/package.json b/packages/support/package.json
index 370ce7be3..07dad9b61 100644
--- a/packages/support/package.json
+++ b/packages/support/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@appium/support",
-  "version": "2.59.4",
+  "version": "2.59.5",
   "description": "Support libs used across appium packages",
   "keywords": [
     "automation",
@@ -44,6 +44,7 @@
     "test:unit": "mocha \"./test/unit/**/*.spec.js\""
   },
   "dependencies": {
+    "@appium/types": "^0.4.0",
     "@babel/runtime": "7.18.9",
     "@colors/colors": "1.5.0",
     "@types/archiver": "5.3.1",
@@ -59,7 +60,7 @@
     "@types/pluralize": "0.0.29",
     "@types/pngjs": "6.0.1",
     "@types/rimraf": "3.0.2",
-    "@types/semver": "7.3.10",
+    "@types/semver": "7.3.12",
     "@types/shell-quote": "1.7.1",
     "@types/supports-color": "8.1.1",
     "@types/teen_process": "1.16.1",
@@ -97,7 +98,7 @@
     "source-map-support": "0.5.21",
     "supports-color": "8.1.1",
     "teen_process": "1.16.0",
-    "type-fest": "2.18.0",
+    "type-fest": "2.18.1",
     "uuid": "8.3.2",
     "which": "2.0.2",
     "yauzl": "2.10.0"
diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md
index d3e8f2d95..4f50b776f 100644
--- a/packages/types/CHANGELOG.md
+++ b/packages/types/CHANGELOG.md
@@ -3,6 +3,18 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+# [0.4.0](https://github.com/appium/appium/compare/@appium/types@0.3.1...@appium/types@0.4.0) (2022-08-10)
+
+
+### Features
+
+* **appium,base-driver,fake-driver,fake-plugin,test-support,types:** updateServer receives cliArgs param ([d4b9833](https://github.com/appium/appium/commit/d4b983328af21d1e5c27a91e438e7934eb152ab1)), closes [#17304](https://github.com/appium/appium/issues/17304)
+* **base-driver,fake-driver,appium:** add convenience methods for defining execute script overloads ([#17321](https://github.com/appium/appium/issues/17321)) ([337ec3e](https://github.com/appium/appium/commit/337ec3e7ba216dd6f8cdc88143ecaa4c75f5d266))
+
+
+
+
+
 ## [0.3.1](https://github.com/appium/appium/compare/@appium/types@0.3.0...@appium/types@0.3.1) (2022-08-03)
 
 
diff --git a/packages/types/lib/driver.ts b/packages/types/lib/driver.ts
index 249fa83aa..de394ba1c 100644
--- a/packages/types/lib/driver.ts
+++ b/packages/types/lib/driver.ts
@@ -44,6 +44,19 @@ export interface SessionCommands {
   getSession(): Promise<SingularSessionData>;
 }
 
+export interface ExecuteCommands {
+  executeMethod(script: string, args: [Record<string, any>]|[]): Promise<any>;
+}
+
+export interface ExecuteMethodDef {
+  command: string,
+  params?: {
+    required?: string[],
+    optional?: string[],
+  }
+};
+export type ExecuteMethodMap = Record<string, ExecuteMethodDef>;
+
 export interface MultiSessionData {
   id: string;
   capabilities: Capabilities;
@@ -328,6 +341,7 @@ export interface Driver
     TimeoutCommands,
     EventCommands,
     SessionHandler<[string, any], void>,
+    ExecuteCommands,
     Core {
   cliArgs?: Record<string, any>;
   // The following methods are implemented by `BaseDriver`.
@@ -574,6 +588,7 @@ export interface DriverStatic {
   baseVersion: string;
   updateServer?: UpdateServerCallback;
   newMethodMap?: MethodMap<ExternalDriver>;
+  executeMethodMap: ExecuteMethodMap;
 }
 
 /**
diff --git a/packages/types/lib/index.ts b/packages/types/lib/index.ts
index 3a7629604..317a2f050 100644
--- a/packages/types/lib/index.ts
+++ b/packages/types/lib/index.ts
@@ -161,8 +161,10 @@ export type ExtensionType = DriverType | PluginType;
  *
  * @param expressApp - the Express 'app' object used by Appium for route handling
  * @param httpServer - the node HTTP server that hosts the app
+ * @param cliArgs - Arguments from config files, CLI, etc.
  */
-export type UpdateServerCallback = (expressApp: Express, httpServer: AppiumServer) => Promise<void>;
+export type UpdateServerCallback = (expressApp: Express, httpServer: AppiumServer, cliArgs: ServerArgs) => Promise<void>;
+
 
 /**
  * Possible HTTP methods, as stolen from `axios`.
diff --git a/packages/types/lib/plugin.ts b/packages/types/lib/plugin.ts
index 9f7a6243a..6a2e3e0ac 100644
--- a/packages/types/lib/plugin.ts
+++ b/packages/types/lib/plugin.ts
@@ -1,4 +1,4 @@
-import {MethodMap, UpdateServerCallback, Class, AppiumLogger} from '.';
+import {MethodMap, UpdateServerCallback, Class, AppiumLogger, PluginType} from '.';
 import {Driver, ExternalDriver} from './driver';
 
 /**
diff --git a/packages/types/package.json b/packages/types/package.json
index 09076275f..41a229ead 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@appium/types",
-  "version": "0.3.1",
+  "version": "0.4.0",
   "description": "Various type declarations used across Appium",
   "keywords": [
     "appium",
@@ -35,8 +35,9 @@
     "@appium/schema": "^0.0.9",
     "@types/express": "4.17.13",
     "@types/npmlog": "4.1.4",
-    "@wdio/types": "7.20.7",
-    "type-fest": "2.18.0"
+    "@types/ws": "8.5.3",
+    "@wdio/types": "7.21.0",
+    "type-fest": "2.18.1"
   },
   "engines": {
     "node": ">=14",


Test patch:
diff --git a/packages/appium/test/e2e/cli.e2e.spec.js b/packages/appium/test/e2e/cli.e2e.spec.js
index 3d6f163b8..75a5d2c1a 100644
--- a/packages/appium/test/e2e/cli.e2e.spec.js
+++ b/packages/appium/test/e2e/cli.e2e.spec.js
@@ -1,5 +1,7 @@
 // @ts-check
 
+import getPort from 'get-port';
+import {exec} from 'teen_process';
 import {npm, env, fs, tempDir, util} from '@appium/support';
 import B from 'bluebird';
 import path from 'path';
@@ -15,13 +17,14 @@ import {
   KNOWN_DRIVERS,
   PLUGIN_TYPE,
 } from '../../lib/constants';
-import {FAKE_DRIVER_DIR, resolveFixture} from '../helpers';
+import {FAKE_DRIVER_DIR, PACKAGE_ROOT, resolveFixture} from '../helpers';
 import {
   installLocalExtension,
   runAppiumJson,
   runAppiumRaw,
   readAppiumArgErrorFixture,
   formatAppiumArgErrorOutput,
+  EXECUTABLE,
 } from './e2e-helpers';
 
 const {MANIFEST_RELATIVE_PATH} = env;
@@ -38,6 +41,22 @@ describe('CLI behavior', function () {
     resolveFixture('test-driver-invalid-peer-dep/package.json')
   );
 
+  describe('when appium is already installed', function () {
+    before(async function () {
+      appiumHome = await tempDir.openDir();
+    });
+
+    after(async function () {
+      await fs.rimraf(appiumHome);
+    });
+
+    it('should not duplicate it as peer dependencies for drivers', async function () {
+      const run = runAppiumJson(appiumHome);
+      await run([DRIVER_TYPE, INSTALL, 'appium-fake-driver', '--source', 'npm']);
+      await fs.exists(path.join(appiumHome, 'node_modules', 'appium')).should.eventually.be.false;
+    });
+  });
+
   describe('when appium is a dependency of the project in the current working directory', function () {
     /** @type {string} */
     let hashPath;
@@ -523,7 +542,41 @@ describe('CLI behavior', function () {
     });
   });
 
-  describe('argument error handling', function () {
+  describe('argument parsing', function () {
+    describe('when the user provides a very long string for an arg accepting a blob or filename', function () {
+      describe('when the very long string is a JSON blob', function () {
+        it('should not throw an ENAMETOOLONG exception', async function () {
+          this.timeout(10000);
+          const capsArg = JSON.stringify({
+            'appium:platformName': 'ANDROID',
+            'appium:platformVersion': '11',
+            'appium:deviceName':
+              'Spicy jalapeno bacon ipsum dolor amet deserunt tempor pork belly aliqua drumstick, occaecat dolor venison et labore. Rump meatball pork chop tail. Consequat adipisicing kielbasa occaecat laborum pig. Qui pork chop chicken nostrud boudin fugiat. Proident ut culpa, chuck nulla sunt pastrami ut tri-tip. Buffalo dolore adipisicing, labore venison elit beef fatback kevin burgdoggen tail pancetta filet mignon. Dolor turducken rump, anim kevin sunt exercitation ham filet mignon beef ribs ad officia eiusmod id cillum.',
+          });
+
+          await expect(
+            exec(
+              process.execPath,
+              [
+                EXECUTABLE,
+                '-pa=/wd/hub',
+                '--session-override',
+                '--local-timezone',
+                '--relaxed-security',
+                `--default-capabilities=${capsArg}`,
+                '--port',
+                await getPort(),
+              ],
+              {
+                env: {APPIUM_HOME: appiumHome, PATH: process.env.PATH},
+                cwd: PACKAGE_ROOT,
+                timeout: 5000,
+              }
+            )
+          ).to.be.rejectedWith(Error, /timed out/);
+        });
+      });
+    });
     describe('when the user provides an string where a number was expected', function () {
       describe('when color output is supported', function () {
         it('should output a fancy error message', async function () {
diff --git a/packages/appium/test/e2e/driver.e2e.spec.js b/packages/appium/test/e2e/driver.e2e.spec.js
index 0cfc4c33f..749316825 100644
--- a/packages/appium/test/e2e/driver.e2e.spec.js
+++ b/packages/appium/test/e2e/driver.e2e.spec.js
@@ -114,6 +114,14 @@ describe('FakeDriver - via HTTP', function () {
       const {data} = await axios.get(`${testServerBaseUrl}/fakedriver`);
       data.should.eql({fakedriver: 'fakeResponse'});
     });
+    it('should update the server with cliArgs', async function () {
+      // we don't need to check the entire object, since it's large, but we can ensure an
+      // arg got through.
+      (await axios.post(`http://${TEST_HOST}:${port}/fakedriverCliArgs`)).data.should.have.property(
+        'appiumHome',
+        appiumHome
+      );
+    });
   });
 
   describe('cli args handling for empty args', function () {
diff --git a/packages/appium/test/e2e/plugin.e2e.spec.js b/packages/appium/test/e2e/plugin.e2e.spec.js
index edbe1e10f..3f3aed414 100644
--- a/packages/appium/test/e2e/plugin.e2e.spec.js
+++ b/packages/appium/test/e2e/plugin.e2e.spec.js
@@ -24,7 +24,7 @@ const wdOpts = {
   capabilities: W3C_PREFIXED_CAPS,
 };
 const FAKE_DRIVER_DIR = path.join(PROJECT_ROOT, 'packages', 'fake-driver');
-const FAKE_PLUGIN_DIR = path.join(PROJECT_ROOT, 'node_modules', '@appium', 'fake-plugin');
+const FAKE_PLUGIN_DIR = path.join(PROJECT_ROOT, 'packages', 'fake-plugin');
 
 describe('FakePlugin', function () {
   /** @type {string} */
@@ -150,9 +150,11 @@ describe('FakePlugin', function () {
     describe(`with plugin registered via type ${registrationType}`, function () {
       /** @type {AppiumServer} */
       let server;
+      /** @type {import('type-fest').LiteralUnion<'all', string>[]} */
+      let usePlugins;
       before(async function () {
         // then start server if we need to
-        const usePlugins = registrationType === 'explicit' ? ['fake', 'p2', 'p3'] : ['all'];
+        usePlugins = registrationType === 'explicit' ? ['fake', 'p2', 'p3'] : ['all'];
         const args = {
           appiumHome,
           port,
@@ -171,7 +173,12 @@ describe('FakePlugin', function () {
         const res = {fake: 'fakeResponse'};
         (await axios.post(`http://${TEST_HOST}:${port}/fake`)).data.should.eql(res);
       });
-
+      it('should update the server with cliArgs', async function () {
+        const res = usePlugins;
+        // we don't need to check the entire object, since it's large, but we can ensure an
+        // arg got through.
+        (await axios.post(`http://${TEST_HOST}:${port}/cliArgs`)).data.usePlugins.should.eql(res);
+      });
       it('should modify the method map with new commands', async function () {
         const driver = await wdio(wdOpts);
         const {sessionId} = driver;
diff --git a/packages/appium/test/unit/utils.spec.js b/packages/appium/test/unit/utils.spec.js
index 47b0fe0f3..db6583f78 100644
--- a/packages/appium/test/unit/utils.spec.js
+++ b/packages/appium/test/unit/utils.spec.js
@@ -4,12 +4,14 @@ import {
   pullSettings,
   removeAppiumPrefixes,
   inspect,
+  adjustNodePath,
 } from '../../lib/utils';
 import {BASE_CAPS, W3C_CAPS} from '../helpers';
 import _ from 'lodash';
 import {stripColors} from '@colors/colors';
 import {createSandbox} from 'sinon';
 import logger from '../../lib/logger';
+import {fs} from '@appium/support';
 
 describe('utils', function () {
   describe('parseCapsForInnerDriver()', function () {
@@ -252,4 +254,25 @@ describe('utils', function () {
       );
     });
   });
+
+  describe('adjustNodePath()', function () {
+    const prevValue = process.env.NODE_PATH;
+
+    beforeEach(function () {
+      if (process.env.NODE_PATH) {
+        delete process.env.NODE_PATH;
+      }
+    });
+
+    afterEach(function () {
+      if (prevValue) {
+        process.env.NODE_PATH = prevValue;
+      }
+    });
+
+    it('should adjust NODE_PATH', async function () {
+      await adjustNodePath();
+      (await fs.exists(process.env.NODE_PATH)).should.be.true;
+    });
+  });
 });
diff --git a/packages/fake-driver/test/e2e/general-tests.js b/packages/fake-driver/test/e2e/general-tests.js
index d8410abbc..cf01d6b35 100644
--- a/packages/fake-driver/test/e2e/general-tests.js
+++ b/packages/fake-driver/test/e2e/general-tests.js
@@ -106,6 +106,45 @@ function generalTests() {
       res[0].type.should.eql('pointer');
       res[0].actions.should.have.length(2);
     });
+
+    it('should get and set a fake thing via execute overloads', async function () {
+      let thing = await driver.executeScript('fake: getThing', []);
+      should.not.exist(thing);
+      await driver.executeScript('fake: setThing', [{thing: 1234}]);
+      thing = await driver.executeScript('fake: getThing', []);
+      thing.should.eql(1234);
+    });
+
+    it('should add 2 numbers via execute overloads', async function () {
+      await driver.executeScript('fake: addition', [{num1: 2, num2: 3}]).should.eventually.eql(5);
+      await driver
+        .executeScript('fake: addition', [{num1: 2, num2: 3, num3: 4}])
+        .should.eventually.eql(9);
+    });
+
+    it('should throw not implemented if an execute overload isnt supported', async function () {
+      await driver
+        .executeScript('fake: blarg', [])
+        .should.be.rejectedWith(/Unsupported execute method/);
+    });
+
+    it('should throw an error if a required overload param is missing', async function () {
+      await driver
+        .executeScript('fake: addition', [{num3: 4}])
+        .should.be.rejectedWith(/Parameters were incorrect/);
+    });
+
+    it('should throw an error if sending in wrong types of params', async function () {
+      await driver
+        .executeScript('fake: addition', [4, 5])
+        .should.be.rejectedWith(/correct format of arg/);
+      await driver
+        .executeScript('fake: addition', [4])
+        .should.be.rejectedWith(/not receive an appropriate execute/);
+      await driver
+        .executeScript('fake: addition', [{num1: 2}, {extra: 'bad'}])
+        .should.be.rejectedWith(/correct format of arg/);
+    });
   });
 }
 
diff --git a/packages/support/test/unit/env.spec.js b/packages/support/test/unit/env.spec.js
index bbbf4ce92..e7e14741d 100644
--- a/packages/support/test/unit/env.spec.js
+++ b/packages/support/test/unit/env.spec.js
@@ -70,12 +70,25 @@ describe('env', function () {
     });
 
     describe('when APPIUM_HOME is set in env', function () {
-      beforeEach(function () {
-        process.env.APPIUM_HOME = '/some/path/to/appium';
+      describe('when APPIUM_HOME is absolute', function () {
+        beforeEach(function () {
+          process.env.APPIUM_HOME = '/some/path/to/appium-home';
+        });
+
+        it('should resolve APPIUM_HOME from env', async function () {
+          await expect(env.resolveAppiumHome()).to.eventually.equal(process.env.APPIUM_HOME);
+        });
       });
 
-      it('should resolve APPIUM_HOME from env', async function () {
-        await expect(env.resolveAppiumHome()).to.eventually.equal(process.env.APPIUM_HOME);
+      describe('when APPIUM_HOME is relative', function () {
+        beforeEach(function () {
+          process.env.APPIUM_HOME = 'some/path/to/appium-home';
+        });
+        it('should resolve to an absolute path', async function () {
+          await expect(env.resolveAppiumHome()).to.eventually.equal(
+            path.join(process.cwd(), process.env.APPIUM_HOME)
+          );
+        });
       });
     });
 
diff --git a/packages/test-support/CHANGELOG.md b/packages/test-support/CHANGELOG.md
index df58f808c..40cfdd754 100644
--- a/packages/test-support/CHANGELOG.md
+++ b/packages/test-support/CHANGELOG.md
@@ -3,6 +3,17 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+# [1.5.0](https://github.com/appium/appium/compare/@appium/test-support@1.4.1...@appium/test-support@1.5.0) (2022-08-10)
+
+
+### Features
+
+* **appium,base-driver,fake-driver,fake-plugin,test-support,types:** updateServer receives cliArgs param ([d4b9833](https://github.com/appium/appium/commit/d4b983328af21d1e5c27a91e438e7934eb152ab1)), closes [#17304](https://github.com/appium/appium/issues/17304)
+
+
+
+
+
 ## [1.4.1](https://github.com/appium/appium/compare/@appium/test-support@1.4.0...@appium/test-support@1.4.1) (2022-08-03)
 
 
diff --git a/packages/test-support/lib/driver-e2e-suite.js b/packages/test-support/lib/driver-e2e-suite.js
index fff2283ae..10100befd 100644
--- a/packages/test-support/lib/driver-e2e-suite.js
+++ b/packages/test-support/lib/driver-e2e-suite.js
@@ -136,6 +136,8 @@ export function driverE2ETestSuite(DriverClass, defaultCaps = {}) {
         routeConfiguringFunction: routeConfiguringFunction(d),
         port,
         hostname: address,
+        // @ts-expect-error
+        cliArgs: {},
       });
       ({startSession, getSession, endSession, newSessionURL, getCommand, postCommand} =
         createSessionHelpers(port, address));
diff --git a/packages/test-support/package.json b/packages/test-support/package.json
index 16ddad041..716c330d2 100644
--- a/packages/test-support/package.json
+++ b/packages/test-support/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@appium/test-support",
-  "version": "1.4.1",
+  "version": "1.5.0",
   "description": "A collection of test utilities used across Appium packages",
   "keywords": [
     "automation",