Repository: microsoft/ApplicationInsights-node.js
Pull request #1018 (2022-10-05 19:37:47)

[Preview] Update Native Metrics Configuration


Patch:
diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml
index cdb45ca..faccf01 100644
--- a/.github/workflows/integration.yml
+++ b/.github/workflows/integration.yml
@@ -13,7 +13,7 @@ jobs:
 
     strategy:
       matrix:
-        node-version: [10.x, 12.x]
+        node-version: [14.x, 16.x]
 
     steps:
     - uses: actions/checkout@v2
diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml
index c458676..dc212c9 100644
--- a/.github/workflows/node.js.yml
+++ b/.github/workflows/node.js.yml
@@ -14,7 +14,7 @@ jobs:
     strategy:
       matrix:
         os: [ubuntu-latest]
-        node-version: [8.x, 10.x, 12.x, 16.x]
+        node-version: [14.x, 16.x]
 
     steps:
     - uses: actions/checkout@v2
diff --git a/README.md b/README.md
index 580c691..72046f6 100644
--- a/README.md
+++ b/README.md
@@ -235,8 +235,7 @@ separately from clients created with `new appInsights.TelemetryClient()`.
 | enableInternalDebugLogging    | Enables debug and warning logging for AppInsights itself. If true, enables debug logging |true|
 | enableInternalWarningLogging  | Enables debug and warning logging for AppInsights itself. If true, enables warning logging |true|
 | enableSendLiveMetrics         | Enables communication with Application Insights Live Metrics. If true, enables communication with the live metrics service |false|
-| disableAllExtendedMetrics     | Disable all environment variables set |true|
-| extendedMetricDisablers       | Disable individual environment variables set. `"extendedMetricDisablers": "..."` ||
+| extendedMetrics       | Enable/Disable specific extended Metrics(gc, heap and loop).  |{"gc":false,"heap":false,"loop":false}|
 | aadTokenCredential| Azure Credential instance to be used to authenticate the App. [AAD Identity Credential Classes](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#credential-classes) | |
 
 [Config.ts]: https://github.com/microsoft/ApplicationInsights-node.js/blob/develop/Library/Config.ts
diff --git a/package-lock.json b/package-lock.json
index bceacdb..c4ec961 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,7 +16,7 @@
         "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.1",
         "@opentelemetry/api": "^1.2.0",
         "@opentelemetry/api-metrics": "^0.32.0",
-        "@opentelemetry/core": "^1.6.0",
+        "@opentelemetry/core": "^1.7.0",
         "@opentelemetry/instrumentation": "^0.33.0",
         "@opentelemetry/instrumentation-http": "^0.33.0",
         "@opentelemetry/instrumentation-mongodb": "^0.32.0",
@@ -39,14 +39,14 @@
         "@types/sinon": "^10.0.12",
         "@typescript-eslint/eslint-plugin": "^5.37.0",
         "@typescript-eslint/parser": "^5.37.0",
-        "applicationinsights-native-metrics": "0.0.7",
+        "applicationinsights-native-metrics": "0.0.8",
         "eslint": "^7.29.0",
         "eslint-config-standard": "^16.0.3",
         "eslint-plugin-import": "^2.23.4",
         "eslint-plugin-node": "^11.1.0",
         "eslint-plugin-promise": "^5.1.0",
         "eslint-plugin-security": "^1.4.0",
-        "mocha": "^7.1.1",
+        "mocha": "^10.0.0",
         "nock": "^12.0.3",
         "nyc": "^15.0.0",
         "prettier": "^2.5.1",
@@ -854,15 +854,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -1765,6 +1756,12 @@
         "url": "https://opencollective.com/typescript-eslint"
       }
     },
+    "node_modules/@ungap/promise-all-settled": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
+      "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+      "dev": true
+    },
     "node_modules/abbrev": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -1891,9 +1888,9 @@
       }
     },
     "node_modules/applicationinsights-native-metrics": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/applicationinsights-native-metrics/-/applicationinsights-native-metrics-0.0.7.tgz",
-      "integrity": "sha512-dStduFRRNDJFZNvIYkRTxtvrzzHU0jdCjoKXBncDIBwsxgmIFF6n6KEe2zhIdEjYcCwgJNszJ5BeSjctcKiRRA==",
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/applicationinsights-native-metrics/-/applicationinsights-native-metrics-0.0.8.tgz",
+      "integrity": "sha512-3areRz2+Q1EPWbQYokfOgYXLkZyBzeReI9716nw97p697gFUfGqYgwJ5fCopftvHycW2zuRWTFJWmA70S5605A==",
       "dev": true,
       "hasInstallScript": true,
       "dependencies": {
@@ -1985,25 +1982,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/array.prototype.reduce": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz",
-      "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.2",
-        "es-array-method-boxes-properly": "^1.0.0",
-        "is-string": "^1.0.7"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/astral-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
@@ -2168,24 +2146,30 @@
       }
     },
     "node_modules/chokidar": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
-      "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
       "dev": true,
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://paulmillr.com/funding/"
+        }
+      ],
       "dependencies": {
-        "anymatch": "~3.1.1",
+        "anymatch": "~3.1.2",
         "braces": "~3.0.2",
-        "glob-parent": "~5.1.0",
+        "glob-parent": "~5.1.2",
         "is-binary-path": "~2.1.0",
         "is-glob": "~4.0.1",
         "normalize-path": "~3.0.0",
-        "readdirp": "~3.2.0"
+        "readdirp": "~3.6.0"
       },
       "engines": {
         "node": ">= 8.10.0"
       },
       "optionalDependencies": {
-        "fsevents": "~2.1.1"
+        "fsevents": "~2.3.2"
       }
     },
     "node_modules/chownr": {
@@ -2207,64 +2191,14 @@
       }
     },
     "node_modules/cliui": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
       "dev": true,
       "dependencies": {
-        "string-width": "^3.1.0",
-        "strip-ansi": "^5.2.0",
-        "wrap-ansi": "^5.1.0"
-      }
-    },
-    "node_modules/cliui/node_modules/ansi-regex": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
-      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/cliui/node_modules/emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-      "dev": true
-    },
-    "node_modules/cliui/node_modules/is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/cliui/node_modules/string-width": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/cliui/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=6"
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
       }
     },
     "node_modules/color-convert": {
@@ -2453,9 +2387,9 @@
       }
     },
     "node_modules/diff": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
-      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+      "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
       "dev": true,
       "engines": {
         "node": ">=0.3.1"
@@ -2546,12 +2480,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/es-array-method-boxes-properly": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
-      "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
-      "dev": true
-    },
     "node_modules/es-shim-unscopables": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
@@ -3176,25 +3104,26 @@
       }
     },
     "node_modules/find-up": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
       "dev": true,
       "dependencies": {
-        "locate-path": "^3.0.0"
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
       },
       "engines": {
-        "node": ">=6"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/flat": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz",
-      "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==",
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
       "dev": true,
-      "dependencies": {
-        "is-buffer": "~2.0.3"
-      },
       "bin": {
         "flat": "cli.js"
       }
@@ -3283,10 +3212,9 @@
       "dev": true
     },
     "node_modules/fsevents": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
-      "deprecated": "\"Please update to latest v2.3 or v2.2\"",
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
       "dev": true,
       "hasInstallScript": true,
       "optional": true,
@@ -3413,9 +3341,9 @@
       }
     },
     "node_modules/glob": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
-      "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
       "dev": true,
       "dependencies": {
         "fs.realpath": "^1.0.0",
@@ -3427,6 +3355,9 @@
       },
       "engines": {
         "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
     "node_modules/glob-parent": {
@@ -3482,15 +3413,6 @@
       "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
       "dev": true
     },
-    "node_modules/growl": {
-      "version": "1.10.5",
-      "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
-      "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4.x"
-      }
-    },
     "node_modules/has": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -3743,29 +3665,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/is-buffer": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
-      "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/is-callable": {
       "version": "1.2.6",
       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz",
@@ -3870,6 +3769,15 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/is-plain-obj": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/is-regex": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -3946,6 +3854,18 @@
       "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
       "dev": true
     },
+    "node_modules/is-unicode-supported": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/is-weakref": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
@@ -4163,16 +4083,18 @@
       }
     },
     "node_modules/locate-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
       "dev": true,
       "dependencies": {
-        "p-locate": "^3.0.0",
-        "path-exists": "^3.0.0"
+        "p-locate": "^5.0.0"
       },
       "engines": {
-        "node": ">=6"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/lodash": {
@@ -4205,86 +4127,19 @@
       "dev": true
     },
     "node_modules/log-symbols": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
-      "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^2.4.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/log-symbols/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/log-symbols/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
+        "chalk": "^4.1.0",
+        "is-unicode-supported": "^0.1.0"
       },
       "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/log-symbols/node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/log-symbols/node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-      "dev": true
-    },
-    "node_modules/log-symbols/node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/log-symbols/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/log-symbols/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
+        "node": ">=10"
       },
-      "engines": {
-        "node": ">=4"
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/lru-cache": {
@@ -4406,55 +4261,41 @@
         "node": ">= 8"
       }
     },
-    "node_modules/mkdirp": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-      "dev": true,
-      "dependencies": {
-        "minimist": "^1.2.5"
-      },
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      }
-    },
     "node_modules/mocha": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz",
-      "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==",
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz",
+      "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==",
       "dev": true,
       "dependencies": {
-        "ansi-colors": "3.2.3",
+        "@ungap/promise-all-settled": "1.1.2",
+        "ansi-colors": "4.1.1",
         "browser-stdout": "1.3.1",
-        "chokidar": "3.3.0",
-        "debug": "3.2.6",
-        "diff": "3.5.0",
-        "escape-string-regexp": "1.0.5",
-        "find-up": "3.0.0",
-        "glob": "7.1.3",
-        "growl": "1.10.5",
+        "chokidar": "3.5.3",
+        "debug": "4.3.4",
+        "diff": "5.0.0",
+        "escape-string-regexp": "4.0.0",
+        "find-up": "5.0.0",
+        "glob": "7.2.0",
         "he": "1.2.0",
-        "js-yaml": "3.13.1",
-        "log-symbols": "3.0.0",
-        "minimatch": "3.0.4",
-        "mkdirp": "0.5.5",
-        "ms": "2.1.1",
-        "node-environment-flags": "1.0.6",
-        "object.assign": "4.1.0",
-        "strip-json-comments": "2.0.1",
-        "supports-color": "6.0.0",
-        "which": "1.3.1",
-        "wide-align": "1.1.3",
-        "yargs": "13.3.2",
-        "yargs-parser": "13.1.2",
-        "yargs-unparser": "1.6.0"
+        "js-yaml": "4.1.0",
+        "log-symbols": "4.1.0",
+        "minimatch": "5.0.1",
+        "ms": "2.1.3",
+        "nanoid": "3.3.3",
+        "serialize-javascript": "6.0.0",
+        "strip-json-comments": "3.1.1",
+        "supports-color": "8.1.1",
+        "workerpool": "6.2.1",
+        "yargs": "16.2.0",
+        "yargs-parser": "20.2.4",
+        "yargs-unparser": "2.0.0"
       },
       "bin": {
         "_mocha": "bin/_mocha",
-        "mocha": "bin/mocha"
+        "mocha": "bin/mocha.js"
       },
       "engines": {
-        "node": ">= 8.10.0"
+        "node": ">= 14.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -4462,119 +4303,72 @@
       }
     },
     "node_modules/mocha/node_modules/ansi-colors": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
-      "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
       "dev": true,
       "engines": {
         "node": ">=6"
       }
     },
-    "node_modules/mocha/node_modules/debug": {
-      "version": "3.2.6",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-      "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
-      "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)",
-      "dev": true,
-      "dependencies": {
-        "ms": "^2.1.1"
-      }
-    },
-    "node_modules/mocha/node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.0"
-      }
+    "node_modules/mocha/node_modules/argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true
     },
-    "node_modules/mocha/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+    "node_modules/mocha/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==",
       "dev": true,
-      "engines": {
-        "node": ">=4"
+      "dependencies": {
+        "balanced-match": "^1.0.0"
       }
     },
     "node_modules/mocha/node_modules/js-yaml": {
-      "version": "3.13.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-      "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
       "dev": true,
       "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
+        "argparse": "^2.0.1"
       },
       "bin": {
         "js-yaml": "bin/js-yaml.js"
       }
     },
     "node_modules/mocha/node_modules/minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
+      "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
       "dev": true,
       "dependencies": {
-        "brace-expansion": "^1.1.7"
+        "brace-expansion": "^2.0.1"
       },
       "engines": {
-        "node": "*"
+        "node": ">=10"
       }
     },
     "node_modules/mocha/node_modules/ms": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-      "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
       "dev": true
     },
-    "node_modules/mocha/node_modules/object.assign": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
-      "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+    "node_modules/mocha/node_modules/supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
       "dev": true,
       "dependencies": {
-        "define-properties": "^1.1.2",
-        "function-bind": "^1.1.1",
-        "has-symbols": "^1.0.0",
-        "object-keys": "^1.0.11"
+        "has-flag": "^4.0.0"
       },
       "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/mocha/node_modules/strip-json-comments": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/mocha/node_modules/supports-color": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
-      "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/mocha/node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
       }
     },
     "node_modules/module-details-from-path": {
@@ -4593,6 +4387,18 @@
       "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==",
       "dev": true
     },
+    "node_modules/nanoid": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
+      "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
+      "dev": true,
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
     "node_modules/natural-compare": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
@@ -4627,25 +4433,6 @@
         "node": ">= 10.13"
       }
     },
-    "node_modules/node-environment-flags": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
-      "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
-      "dev": true,
-      "dependencies": {
-        "object.getownpropertydescriptors": "^2.0.3",
-        "semver": "^5.7.0"
-      }
-    },
-    "node_modules/node-environment-flags/node_modules/semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
     "node_modules/node-fetch": {
       "version": "2.6.7",
       "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
@@ -4828,15 +4615,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/nyc/node_modules/path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/nyc/node_modules/resolve-from": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -4940,24 +4718,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/object.getownpropertydescriptors": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz",
-      "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==",
-      "dev": true,
-      "dependencies": {
-        "array.prototype.reduce": "^1.0.4",
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/object.values": {
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
@@ -5017,15 +4777,33 @@
       }
     },
     "node_modules/p-locate": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+      "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==",
       "dev": true,
       "dependencies": {
-        "p-limit": "^2.0.0"
+        "p-limit": "^3.0.2"
       },
       "engines": {
-        "node": ">=6"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate/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==",
+      "dev": true,
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/p-map": {
@@ -5077,12 +4855,12 @@
       }
     },
     "node_modules/path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
       "dev": true,
       "engines": {
-        "node": ">=4"
+        "node": ">=8"
       }
     },
     "node_modules/path-is-absolute": {
@@ -5221,15 +4999,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/pkg-dir/node_modules/path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/postgres-array": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
@@ -5365,6 +5134,15 @@
         }
       ]
     },
+    "node_modules/randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "dependencies": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
     "node_modules/readable-stream": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
@@ -5380,15 +5158,15 @@
       }
     },
     "node_modules/readdirp": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
-      "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "dev": true,
       "dependencies": {
-        "picomatch": "^2.0.4"
+        "picomatch": "^2.2.1"
       },
       "engines": {
-        "node": ">= 8"
+        "node": ">=8.10.0"
       }
     },
     "node_modules/regexp-tree": {
@@ -5590,6 +5368,15 @@
         "node": ">=10"
       }
     },
+    "node_modules/serialize-javascript": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+      "dev": true,
+      "dependencies": {
+        "randombytes": "^2.1.0"
+      }
+    },
     "node_modules/set-blocking": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
@@ -6322,95 +6109,27 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/wrap-ansi": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^3.2.0",
-        "string-width": "^3.0.0",
-        "strip-ansi": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/ansi-regex": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
-      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-      "dev": true
-    },
-    "node_modules/wrap-ansi/node_modules/emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+    "node_modules/workerpool": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
+      "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
       "dev": true
     },
-    "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/string-width": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+    "node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
       "dependencies": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
       },
       "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
+        "node": ">=10"
       },
-      "engines": {
-        "node": ">=6"
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
     "node_modules/wrappy": {
@@ -6471,95 +6190,90 @@
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
     },
     "node_modules/yargs": {
-      "version": "13.3.2",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+      "version": "16.2.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
       "dev": true,
       "dependencies": {
-        "cliui": "^5.0.0",
-        "find-up": "^3.0.0",
-        "get-caller-file": "^2.0.1",
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
         "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^3.0.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^13.1.2"
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
     "node_modules/yargs-parser": {
-      "version": "13.1.2",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+      "version": "20.2.4",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+      "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
       "dev": true,
-      "dependencies": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
+      "engines": {
+        "node": ">=10"
       }
     },
     "node_modules/yargs-unparser": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
-      "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+      "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
       "dev": true,
       "dependencies": {
-        "flat": "^4.1.0",
-        "lodash": "^4.17.15",
-        "yargs": "^13.3.0"
+        "camelcase": "^6.0.0",
+        "decamelize": "^4.0.0",
+        "flat": "^5.0.2",
+        "is-plain-obj": "^2.1.0"
       },
       "engines": {
-        "node": ">=6"
+        "node": ">=10"
       }
     },
-    "node_modules/yargs/node_modules/ansi-regex": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
-      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+    "node_modules/yargs-unparser/node_modules/camelcase": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
       "dev": true,
       "engines": {
-        "node": ">=6"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/yargs/node_modules/emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-      "dev": true
-    },
-    "node_modules/yargs/node_modules/is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+    "node_modules/yargs-unparser/node_modules/decamelize": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+      "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
       "dev": true,
       "engines": {
-        "node": ">=4"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/yargs/node_modules/string-width": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+    "node_modules/yargs/node_modules/y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
       "dev": true,
-      "dependencies": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
-      },
       "engines": {
-        "node": ">=6"
+        "node": ">=10"
       }
     },
-    "node_modules/yargs/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+    "node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
       "dev": true,
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
       "engines": {
-        "node": ">=6"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     }
   },
@@ -7186,12 +6900,6 @@
             "p-limit": "^2.2.0"
           }
         },
-        "path-exists": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-          "dev": true
-        },
         "resolve-from": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -7832,6 +7540,12 @@
         "eslint-visitor-keys": "^3.3.0"
       }
     },
+    "@ungap/promise-all-settled": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
+      "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+      "dev": true
+    },
     "abbrev": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -7922,9 +7636,9 @@
       }
     },
     "applicationinsights-native-metrics": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/applicationinsights-native-metrics/-/applicationinsights-native-metrics-0.0.7.tgz",
-      "integrity": "sha512-dStduFRRNDJFZNvIYkRTxtvrzzHU0jdCjoKXBncDIBwsxgmIFF6n6KEe2zhIdEjYcCwgJNszJ5BeSjctcKiRRA==",
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/applicationinsights-native-metrics/-/applicationinsights-native-metrics-0.0.8.tgz",
+      "integrity": "sha512-3areRz2+Q1EPWbQYokfOgYXLkZyBzeReI9716nw97p697gFUfGqYgwJ5fCopftvHycW2zuRWTFJWmA70S5605A==",
       "dev": true,
       "requires": {
         "@mapbox/node-pre-gyp": "^1.0.8",
@@ -7993,19 +7707,6 @@
         "es-shim-unscopables": "^1.0.0"
       }
     },
-    "array.prototype.reduce": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz",
-      "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.2",
-        "es-array-method-boxes-properly": "^1.0.0",
-        "is-string": "^1.0.7"
-      }
-    },
     "astral-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
@@ -8117,19 +7818,19 @@
       }
     },
     "chokidar": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
-      "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
       "dev": true,
       "requires": {
-        "anymatch": "~3.1.1",
+        "anymatch": "~3.1.2",
         "braces": "~3.0.2",
-        "fsevents": "~2.1.1",
-        "glob-parent": "~5.1.0",
+        "fsevents": "~2.3.2",
+        "glob-parent": "~5.1.2",
         "is-binary-path": "~2.1.0",
         "is-glob": "~4.0.1",
         "normalize-path": "~3.0.0",
-        "readdirp": "~3.2.0"
+        "readdirp": "~3.6.0"
       }
     },
     "chownr": {
@@ -8145,54 +7846,14 @@
       "dev": true
     },
     "cliui": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
       "dev": true,
       "requires": {
-        "string-width": "^3.1.0",
-        "strip-ansi": "^5.2.0",
-        "wrap-ansi": "^5.1.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
-          "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
       }
     },
     "color-convert": {
@@ -8340,9 +8001,9 @@
       "requires": {}
     },
     "diff": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
-      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+      "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
       "dev": true
     },
     "dir-glob": {
@@ -8415,12 +8076,6 @@
         "unbox-primitive": "^1.0.2"
       }
     },
-    "es-array-method-boxes-properly": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
-      "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
-      "dev": true
-    },
     "es-shim-unscopables": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
@@ -8887,22 +8542,20 @@
       }
     },
     "find-up": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
       "dev": true,
       "requires": {
-        "locate-path": "^3.0.0"
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
       }
     },
     "flat": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz",
-      "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==",
-      "dev": true,
-      "requires": {
-        "is-buffer": "~2.0.3"
-      }
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+      "dev": true
     },
     "flat-cache": {
       "version": "3.0.4",
@@ -8962,9 +8615,9 @@
       "dev": true
     },
     "fsevents": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
       "dev": true,
       "optional": true
     },
@@ -9054,9 +8707,9 @@
       }
     },
     "glob": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
-      "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
       "dev": true,
       "requires": {
         "fs.realpath": "^1.0.0",
@@ -9105,12 +8758,6 @@
       "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
       "dev": true
     },
-    "growl": {
-      "version": "1.10.5",
-      "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
-      "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
-      "dev": true
-    },
     "has": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -9293,12 +8940,6 @@
         "has-tostringtag": "^1.0.0"
       }
     },
-    "is-buffer": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
-      "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
-      "dev": true
-    },
     "is-callable": {
       "version": "1.2.6",
       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz",
@@ -9364,6 +9005,12 @@
         "has-tostringtag": "^1.0.0"
       }
     },
+    "is-plain-obj": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+      "dev": true
+    },
     "is-regex": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -9413,6 +9060,12 @@
       "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
       "dev": true
     },
+    "is-unicode-supported": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+      "dev": true
+    },
     "is-weakref": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
@@ -9584,13 +9237,12 @@
       }
     },
     "locate-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
       "dev": true,
       "requires": {
-        "p-locate": "^3.0.0",
-        "path-exists": "^3.0.0"
+        "p-locate": "^5.0.0"
       }
     },
     "lodash": {
@@ -9623,70 +9275,13 @@
       "dev": true
     },
     "log-symbols": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
-      "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
       "dev": true,
       "requires": {
-        "chalk": "^2.4.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "dev": true,
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-          "dev": true
-        },
-        "escape-string-regexp": {
-          "version": "1.0.5",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-          "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
+        "chalk": "^4.1.0",
+        "is-unicode-supported": "^0.1.0"
       }
     },
     "lru-cache": {
@@ -9777,133 +9372,88 @@
         "yallist": "^4.0.0"
       }
     },
-    "mkdirp": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-      "dev": true,
-      "requires": {
-        "minimist": "^1.2.5"
-      }
-    },
     "mocha": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz",
-      "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==",
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz",
+      "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==",
       "dev": true,
       "requires": {
-        "ansi-colors": "3.2.3",
+        "@ungap/promise-all-settled": "1.1.2",
+        "ansi-colors": "4.1.1",
         "browser-stdout": "1.3.1",
-        "chokidar": "3.3.0",
-        "debug": "3.2.6",
-        "diff": "3.5.0",
-        "escape-string-regexp": "1.0.5",
-        "find-up": "3.0.0",
-        "glob": "7.1.3",
-        "growl": "1.10.5",
+        "chokidar": "3.5.3",
+        "debug": "4.3.4",
+        "diff": "5.0.0",
+        "escape-string-regexp": "4.0.0",
+        "find-up": "5.0.0",
+        "glob": "7.2.0",
         "he": "1.2.0",
-        "js-yaml": "3.13.1",
-        "log-symbols": "3.0.0",
-        "minimatch": "3.0.4",
-        "mkdirp": "0.5.5",
-        "ms": "2.1.1",
-        "node-environment-flags": "1.0.6",
-        "object.assign": "4.1.0",
-        "strip-json-comments": "2.0.1",
-        "supports-color": "6.0.0",
-        "which": "1.3.1",
-        "wide-align": "1.1.3",
-        "yargs": "13.3.2",
-        "yargs-parser": "13.1.2",
-        "yargs-unparser": "1.6.0"
+        "js-yaml": "4.1.0",
+        "log-symbols": "4.1.0",
+        "minimatch": "5.0.1",
+        "ms": "2.1.3",
+        "nanoid": "3.3.3",
+        "serialize-javascript": "6.0.0",
+        "strip-json-comments": "3.1.1",
+        "supports-color": "8.1.1",
+        "workerpool": "6.2.1",
+        "yargs": "16.2.0",
+        "yargs-parser": "20.2.4",
+        "yargs-unparser": "2.0.0"
       },
       "dependencies": {
         "ansi-colors": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
-          "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+          "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
           "dev": true
         },
-        "debug": {
-          "version": "3.2.6",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+        "argparse": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+          "dev": true
+        },
+        "brace-expansion": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
           "dev": true,
           "requires": {
-            "ms": "^2.1.1"
+            "balanced-match": "^1.0.0"
           }
         },
-        "escape-string-regexp": {
-          "version": "1.0.5",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-          "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-          "dev": true
-        },
         "js-yaml": {
-          "version": "3.13.1",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-          "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+          "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
           "dev": true,
           "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
+            "argparse": "^2.0.1"
           }
         },
         "minimatch": {
-          "version": "3.0.4",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-          "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
+          "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
           "dev": true,
           "requires": {
-            "brace-expansion": "^1.1.7"
+            "brace-expansion": "^2.0.1"
           }
         },
         "ms": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
-          "dev": true
-        },
-        "object.assign": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
-          "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
-          "dev": true,
-          "requires": {
-            "define-properties": "^1.1.2",
-            "function-bind": "^1.1.1",
-            "has-symbols": "^1.0.0",
-            "object-keys": "^1.0.11"
-          }
-        },
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-          "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
           "dev": true
         },
         "supports-color": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
-          "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        },
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+          "version": "8.1.1",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
           "dev": true,
           "requires": {
-            "isexe": "^2.0.0"
+            "has-flag": "^4.0.0"
           }
         }
       }
@@ -9924,6 +9474,12 @@
       "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==",
       "dev": true
     },
+    "nanoid": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
+      "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
+      "dev": true
+    },
     "natural-compare": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
@@ -9955,24 +9511,6 @@
         "propagate": "^2.0.0"
       }
     },
-    "node-environment-flags": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
-      "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
-      "dev": true,
-      "requires": {
-        "object.getownpropertydescriptors": "^2.0.3",
-        "semver": "^5.7.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
-        }
-      }
-    },
     "node-fetch": {
       "version": "2.6.7",
       "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
@@ -10111,12 +9649,6 @@
             "p-limit": "^2.2.0"
           }
         },
-        "path-exists": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-          "dev": true
-        },
         "resolve-from": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -10195,18 +9727,6 @@
         "object-keys": "^1.1.1"
       }
     },
-    "object.getownpropertydescriptors": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz",
-      "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==",
-      "dev": true,
-      "requires": {
-        "array.prototype.reduce": "^1.0.4",
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.1"
-      }
-    },
     "object.values": {
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
@@ -10251,12 +9771,23 @@
       }
     },
     "p-locate": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+      "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==",
       "dev": true,
       "requires": {
-        "p-limit": "^2.0.0"
+        "p-limit": "^3.0.2"
+      },
+      "dependencies": {
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+          "dev": true,
+          "requires": {
+            "yocto-queue": "^0.1.0"
+          }
+        }
       }
     },
     "p-map": {
@@ -10296,9 +9827,9 @@
       }
     },
     "path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
       "dev": true
     },
     "path-is-absolute": {
@@ -10403,12 +9934,6 @@
           "requires": {
             "p-limit": "^2.2.0"
           }
-        },
-        "path-exists": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-          "dev": true
         }
       }
     },
@@ -10494,6 +10019,15 @@
       "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
       "dev": true
     },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
     "readable-stream": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
@@ -10506,12 +10040,12 @@
       }
     },
     "readdirp": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
-      "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "dev": true,
       "requires": {
-        "picomatch": "^2.0.4"
+        "picomatch": "^2.2.1"
       }
     },
     "regexp-tree": {
@@ -10647,6 +10181,15 @@
         "lru-cache": "^6.0.0"
       }
     },
+    "serialize-javascript": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.1.0"
+      }
+    },
     "set-blocking": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
@@ -11203,79 +10746,21 @@
       "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
       "dev": true
     },
+    "workerpool": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
+      "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
+      "dev": true
+    },
     "wrap-ansi": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
       "requires": {
-        "ansi-styles": "^3.2.0",
-        "string-width": "^3.0.0",
-        "strip-ansi": "^5.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
-          "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "dev": true,
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
       }
     },
     "wrappy": {
@@ -11327,83 +10812,65 @@
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
     },
     "yargs": {
-      "version": "13.3.2",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+      "version": "16.2.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
       "dev": true,
       "requires": {
-        "cliui": "^5.0.0",
-        "find-up": "^3.0.0",
-        "get-caller-file": "^2.0.1",
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
         "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^3.0.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^13.1.2"
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
       },
       "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
-          "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+        "y18n": {
+          "version": "5.0.8",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+          "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
           "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
         }
       }
     },
     "yargs-parser": {
-      "version": "13.1.2",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
-      "dev": true,
-      "requires": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
-      }
+      "version": "20.2.4",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+      "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+      "dev": true
     },
     "yargs-unparser": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
-      "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+      "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
       "dev": true,
       "requires": {
-        "flat": "^4.1.0",
-        "lodash": "^4.17.15",
-        "yargs": "^13.3.0"
+        "camelcase": "^6.0.0",
+        "decamelize": "^4.0.0",
+        "flat": "^5.0.2",
+        "is-plain-obj": "^2.1.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+          "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+          "dev": true
+        },
+        "decamelize": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+          "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+          "dev": true
+        }
       }
+    },
+    "yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true
     }
   }
 }
diff --git a/package.json b/package.json
index a2e8836..8af7c2c 100644
--- a/package.json
+++ b/package.json
@@ -51,14 +51,14 @@
     "@types/sinon": "^10.0.12",
     "@typescript-eslint/eslint-plugin": "^5.37.0",
     "@typescript-eslint/parser": "^5.37.0",
-    "applicationinsights-native-metrics": "0.0.7",
+    "applicationinsights-native-metrics": "0.0.8",
     "eslint": "^7.29.0",
     "eslint-config-standard": "^16.0.3",
     "eslint-plugin-import": "^2.23.4",
     "eslint-plugin-node": "^11.1.0",
     "eslint-plugin-promise": "^5.1.0",
     "eslint-plugin-security": "^1.4.0",
-    "mocha": "^7.1.1",
+    "mocha": "^10.0.0",
     "nock": "^12.0.3",
     "nyc": "^15.0.0",
     "prettier": "^2.5.1",
@@ -73,7 +73,7 @@
     "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.1",
     "@opentelemetry/api": "^1.2.0",
     "@opentelemetry/api-metrics": "^0.32.0",
-    "@opentelemetry/core": "^1.6.0",
+    "@opentelemetry/core": "^1.7.0",
     "@opentelemetry/instrumentation": "^0.33.0",
     "@opentelemetry/instrumentation-http": "^0.33.0",
     "@opentelemetry/instrumentation-mongodb": "^0.32.0",
diff --git a/src/autoCollection/metrics/collection/nativePerformanceMetrics.ts b/src/autoCollection/metrics/collection/nativePerformanceMetrics.ts
index 3147b41..a21a527 100644
--- a/src/autoCollection/metrics/collection/nativePerformanceMetrics.ts
+++ b/src/autoCollection/metrics/collection/nativePerformanceMetrics.ts
@@ -1,7 +1,6 @@
 import { Meter, ObservableGauge, ObservableResult, Histogram } from "@opentelemetry/api-metrics";
 import { GarbageCollectionType, NativeMetricsCounter } from "../types";
 import { Logger } from "../../../library/logging";
-import { IBaseConfig, IDisabledExtendedMetrics } from "../../../library/configuration/interfaces";
 
 
 export class NativePerformanceMetrics {
@@ -12,7 +11,6 @@ export class NativePerformanceMetrics {
     private _handle: NodeJS.Timer;
     private _meter: Meter;
     private _collectionInterval: number = 15000; // 15 seconds
-    private _disabledMetrics: IDisabledExtendedMetrics = {};
     private _eventLoopHistogram: Histogram;
     private _garbageCollectionScavenge: Histogram;
     private _garbageCollectionMarkSweepCompact: Histogram;
@@ -39,10 +37,7 @@ export class NativePerformanceMetrics {
      * @param {boolean} isEnabled
      * @memberof AutoCollectNativePerformance
      */
-    public enable(
-        isEnabled: boolean,
-        disabledMetrics: IDisabledExtendedMetrics = {}
-    ): void {
+    public enable(isEnabled: boolean): void {
         if (this._metricsAvailable == undefined && isEnabled && !this._isInitialized) {
             // Try to require in the native-metrics library. If it's found initialize it, else do nothing and never try again.
             try {
@@ -57,15 +52,20 @@ export class NativePerformanceMetrics {
             }
         }
         this._isEnabled = isEnabled;
-        this._disabledMetrics = disabledMetrics;// TODO: Use to filter out metrics in View
         if (this._isEnabled && !this._isInitialized) {
             this._isInitialized = true;
         }
 
         // Enable the emitter if we were able to construct one
         if (this._isEnabled && this._emitter) {
-            // enable self
-            this._emitter.enable(true, this._collectionInterval);
+            try {
+                // enable self
+                this._emitter.enable(true, this._collectionInterval);
+            }
+            catch (err) {
+                Logger.getInstance().error("Native metrics enable failed", err);
+            }
+
             // Add histogram data collection
             if (!this._handle) {
                 this._handle = setInterval(() => this._collectHistogramData(), this._collectionInterval);
@@ -77,8 +77,6 @@ export class NativePerformanceMetrics {
             this._memoryUsageNonHeapGauge.addCallback(this._getNonHeapUsage.bind(this));
 
         } else if (this._emitter) {
-            // disable self
-            this._emitter.enable(false);
             if (this._handle) {
                 clearInterval(this._handle);
                 this._handle = undefined;
@@ -114,83 +112,39 @@ export class NativePerformanceMetrics {
     }
 
     private _getEventLoopCpu() {
-        const loopData = this._emitter.getLoopData();
-        const metrics = loopData.loopUsage;
-        if (metrics.count == 0) {
-            return;
-        }
-        this._eventLoopHistogram.record(metrics.total);
-    }
-
-    private _getGarbageCollection() {
-        const gcData = this._emitter.getGCData();
-        for (let gc in gcData) {
-            const metrics = gcData[gc].metrics;
-            switch (gc) {
-                case GarbageCollectionType.IncrementalMarking:
-                    this._garbageCollectionIncrementalMarking.record(metrics.total);
-                    break;
-                case GarbageCollectionType.MarkSweepCompact:
-                    this._garbageCollectionMarkSweepCompact.record(metrics.total);
-                    break;
-                case GarbageCollectionType.Scavenge:
-                    this._garbageCollectionScavenge.record(metrics.total);
-                    break;
+        try {
+            const loopData = this._emitter.getLoopData();
+            const metrics = loopData.loopUsage;
+            if (metrics.count == 0) {
+                return;
             }
+            this._eventLoopHistogram.record(metrics.total);
+        }
+        catch (err) {
+            Logger.getInstance().error("Native metrics failed to get event loop CPU", err);
         }
-    }
-}
-
-
-/**
-* Parse environment variable and overwrite isEnabled based on respective fields being set
-*
-* @private
-* @param {(boolean | IDisabledExtendedMetrics)} collectExtendedMetrics
-* @param {(IBaseConfig)} customConfig
-* @returns {(boolean | IDisabledExtendedMetrics)}
-* @memberof AutoCollectNativePerformance
-*/
-export function getNativeMetricsConfig(
-    collectExtendedMetrics: boolean | IDisabledExtendedMetrics,
-    customConfig: IBaseConfig
-): { isEnabled: boolean; disabledMetrics: IDisabledExtendedMetrics } {
-    const disableAll = customConfig.disableAllExtendedMetrics;
-    const individualOptOuts = customConfig.extendedMetricDisablers;
-
-    // case 1: disable all env var set, RETURN with isEnabled=false
-    if (disableAll) {
-        return { isEnabled: false, disabledMetrics: {} };
     }
 
-    // case 2: individual env vars set, RETURN with isEnabled=true, disabledMetrics={...}
-    if (individualOptOuts) {
-        const optOutsArr = individualOptOuts.split(",");
-        const disabledMetrics: any = {};
-        if (optOutsArr.length > 0) {
-            for (const opt of optOutsArr) {
-                disabledMetrics[opt] = true;
+    private _getGarbageCollection() {
+        try {
+            const gcData = this._emitter.getGCData();
+            for (let gc in gcData) {
+                const metrics = gcData[gc].metrics;
+                switch (gc) {
+                    case GarbageCollectionType.IncrementalMarking:
+                        this._garbageCollectionIncrementalMarking.record(metrics.total);
+                        break;
+                    case GarbageCollectionType.MarkSweepCompact:
+                        this._garbageCollectionMarkSweepCompact.record(metrics.total);
+                        break;
+                    case GarbageCollectionType.Scavenge:
+                        this._garbageCollectionScavenge.record(metrics.total);
+                        break;
+                }
             }
         }
-
-        // case 2a: collectExtendedMetrics is an object, overwrite existing ones if they exist
-        if (typeof collectExtendedMetrics === "object") {
-            return {
-                isEnabled: true,
-                disabledMetrics: { ...collectExtendedMetrics, ...disabledMetrics },
-            };
+        catch (err) {
+            Logger.getInstance().error("Native metrics failed to get event Garbage Collection metrics", err);
         }
-
-        // case 2b: collectExtendedMetrics is a boolean, set disabledMetrics as is
-        return { isEnabled: collectExtendedMetrics, disabledMetrics };
-    }
-
-    // case 4: no env vars set, input arg is a boolean, RETURN with isEnabled=collectExtendedMetrics, disabledMetrics={}
-    if (typeof collectExtendedMetrics === "boolean") {
-        return { isEnabled: collectExtendedMetrics, disabledMetrics: {} };
-    } else {
-        // use else so we don't need to force typing on collectExtendedMetrics
-        // case 5: no env vars set, input arg is object, RETURN with isEnabled=true, disabledMetrics=collectExtendedMetrics
-        return { isEnabled: true, disabledMetrics: collectExtendedMetrics };
     }
 }
diff --git a/src/autoCollection/metrics/handlers/performanceCounterMetricsHandler.ts b/src/autoCollection/metrics/handlers/performanceCounterMetricsHandler.ts
index 073f8e4..1fdafe5 100644
--- a/src/autoCollection/metrics/handlers/performanceCounterMetricsHandler.ts
+++ b/src/autoCollection/metrics/handlers/performanceCounterMetricsHandler.ts
@@ -10,8 +10,7 @@ import { ProcessMetrics } from "../collection/processMetrics";
 import { RequestMetrics } from "../collection/requestMetrics";
 import { Config } from "../../../library";
 import { ResourceManager } from "../../../library/handlers";
-import { getNativeMetricsConfig, NativePerformanceMetrics } from "../collection/nativePerformanceMetrics";
-import { IDisabledExtendedMetrics } from "../../../library/configuration/interfaces";
+import { NativePerformanceMetrics } from "../collection/nativePerformanceMetrics";
 
 
 export class PerformanceCounterMetricsHandler {
@@ -28,13 +27,9 @@ export class PerformanceCounterMetricsHandler {
 
     constructor(config: Config, options?: { collectionInterval: number }) {
         this._config = config;
-        const nativePerformanceConfig = getNativeMetricsConfig(
-            this._config.enableAutoCollectExtendedMetrics,
-            this._config
-        );
         const meterProviderConfig: MeterProviderOptions = {
             resource: ResourceManager.getInstance().getMetricResource(),
-            views: this._getViews(nativePerformanceConfig)
+            views: this._getViews()
         };
         this._meterProvider = new MeterProvider(meterProviderConfig);
         let exporterConfig: AzureExporterConfig = {
@@ -61,9 +56,7 @@ export class PerformanceCounterMetricsHandler {
         this._httpMetrics = new HttpMetricsInstrumentation(httpMetricsConfig);
         this._processMetrics = new ProcessMetrics(this._meter);
         this._requestMetrics = new RequestMetrics(this._meter, this._httpMetrics);
-        if (nativePerformanceConfig.isEnabled) {
-            this._nativeMetrics = new NativePerformanceMetrics(this._meter);
-        }
+        this._nativeMetrics = new NativePerformanceMetrics(this._meter);
     }
 
     public start() {
@@ -88,7 +81,7 @@ export class PerformanceCounterMetricsHandler {
         return this._requestMetrics;
     }
 
-    private _getViews(nativePerformanceConfig: { isEnabled: boolean; disabledMetrics: IDisabledExtendedMetrics }): View[] {
+    private _getViews(): View[] {
         let views = [];
         views.push(new View({
             name: PerformanceCounter.REQUEST_DURATION,
@@ -137,41 +130,39 @@ export class PerformanceCounterMetricsHandler {
             instrumentName: MetricName.DEPENDENCY_RATE,
             aggregation: new DropAggregation(),
         }));
-        if (nativePerformanceConfig.isEnabled) {
-            if (nativePerformanceConfig.disabledMetrics?.gc) {
-                views.push(new View({
-                    instrumentName: NativeMetricsCounter.GARBAGE_COLLECTION_INCREMENTAL_MARKING,
-                    aggregation: new DropAggregation(),
-                }));
-                views.push(new View({
-                    instrumentName: NativeMetricsCounter.GARBAGE_COLLECTION_SCAVENGE,
-                    aggregation: new DropAggregation(),
-                }));
-                views.push(new View({
-                    instrumentName: NativeMetricsCounter.GARBAGE_COLLECTION_SWEEP_COMPACT,
-                    aggregation: new DropAggregation(),
-                }));
-            }
-            if (nativePerformanceConfig.disabledMetrics?.heap) {
-                views.push(new View({
-                    instrumentName: NativeMetricsCounter.HEAP_MEMORY_TOTAL,
-                    aggregation: new DropAggregation(),
-                }));
-                views.push(new View({
-                    instrumentName: NativeMetricsCounter.HEAP_MEMORY_USAGE,
-                    aggregation: new DropAggregation(),
-                }));
-                views.push(new View({
-                    instrumentName: NativeMetricsCounter.MEMORY_USAGE_NON_HEAP,
-                    aggregation: new DropAggregation(),
-                }));
-            }
-            if (nativePerformanceConfig.disabledMetrics?.heap) {
-                views.push(new View({
-                    instrumentName: NativeMetricsCounter.EVENT_LOOP_CPU,
-                    aggregation: new DropAggregation(),
-                }));
-            }
+        if (!this._config.extendedMetrics?.gc) {
+            views.push(new View({
+                instrumentName: NativeMetricsCounter.GARBAGE_COLLECTION_INCREMENTAL_MARKING,
+                aggregation: new DropAggregation(),
+            }));
+            views.push(new View({
+                instrumentName: NativeMetricsCounter.GARBAGE_COLLECTION_SCAVENGE,
+                aggregation: new DropAggregation(),
+            }));
+            views.push(new View({
+                instrumentName: NativeMetricsCounter.GARBAGE_COLLECTION_SWEEP_COMPACT,
+                aggregation: new DropAggregation(),
+            }));
+        }
+        if (!this._config.extendedMetrics?.heap) {
+            views.push(new View({
+                instrumentName: NativeMetricsCounter.HEAP_MEMORY_TOTAL,
+                aggregation: new DropAggregation(),
+            }));
+            views.push(new View({
+                instrumentName: NativeMetricsCounter.HEAP_MEMORY_USAGE,
+                aggregation: new DropAggregation(),
+            }));
+            views.push(new View({
+                instrumentName: NativeMetricsCounter.MEMORY_USAGE_NON_HEAP,
+                aggregation: new DropAggregation(),
+            }));
+        }
+        if (!this._config.extendedMetrics?.loop) {
+            views.push(new View({
+                instrumentName: NativeMetricsCounter.EVENT_LOOP_CPU,
+                aggregation: new DropAggregation(),
+            }));
         }
         return views;
     }
diff --git a/src/library/client.ts b/src/library/client.ts
index 16925e2..abd3ba1 100644
--- a/src/library/client.ts
+++ b/src/library/client.ts
@@ -17,6 +17,9 @@ export class Client {
      */
     constructor(config?: Config) {
         this._config = config || new Config();
+        if (!this._config.instrumentationKey || this._config.instrumentationKey == "") {
+            throw new Error("Instrumentation key not found, please provide a connection string before starting Application Insights SDK.");
+        }
         if (!this._config.disableStatsbeat) {
             this._statsbeat = new Statsbeat(this._config);
             this._statsbeat.enable(true);
diff --git a/src/library/configuration/config.ts b/src/library/configuration/config.ts
index 40f8eb6..6dee671 100644
--- a/src/library/configuration/config.ts
+++ b/src/library/configuration/config.ts
@@ -5,7 +5,7 @@ import { ConnectionStringParser } from "./connectionStringParser";
 import { Logger } from "../logging";
 import * as Constants from "../../declarations/constants";
 import { JsonConfig } from "./jsonConfig";
-import { IConfig, IDisabledExtendedMetrics, iInstrumentation, InstrumentationType } from "./interfaces";
+import { ExtendedMetricType, IConfig, iInstrumentation, InstrumentationType } from "./interfaces";
 
 
 export class Config implements IConfig {
@@ -22,13 +22,11 @@ export class Config implements IConfig {
     public enableAutoCollectRequests: boolean;
     public enableAutoCollectDependencies: boolean;
     public enableSendLiveMetrics: boolean;
-    public enableAutoCollectExtendedMetrics: boolean | IDisabledExtendedMetrics;
-    public disableAllExtendedMetrics: boolean;
     public disableStatsbeat: boolean;
-    public extendedMetricDisablers: string;
     public quickPulseHost: string;
     public setupString: string;
     public instrumentations: { [type: string]: iInstrumentation };
+    public extendedMetrics: { [type: string]: boolean };
 
     private _connectionString: string;
     private _endpointBase: string = Constants.DEFAULT_BREEZE_ENDPOINT;
@@ -71,20 +69,15 @@ export class Config implements IConfig {
     }
 
     private _loadDefaultValues() {
-        this.disableAllExtendedMetrics = this.disableAllExtendedMetrics != undefined ? this.disableAllExtendedMetrics : false;
         this.disableStatsbeat = this.disableStatsbeat != undefined ? this.disableStatsbeat : false;
         this.enableAutoCollectConsole = this.enableAutoCollectConsole != undefined ? this.enableAutoCollectConsole : false;
-        this.enableAutoCollectConsole = this.enableAutoCollectExternalLoggers != undefined ? this.enableAutoCollectConsole : true;
-
+        this.enableAutoCollectExternalLoggers = this.enableAutoCollectExternalLoggers != undefined ? this.enableAutoCollectExternalLoggers : true;
         this.enableAutoCollectDependencies = this.enableAutoCollectDependencies != undefined ? this.enableAutoCollectDependencies : true;
         this.enableAutoCollectRequests = this.enableAutoCollectRequests != undefined ? this.enableAutoCollectRequests : true;
-        
         this.enableAutoCollectExceptions = this.enableAutoCollectExceptions != undefined ? this.enableAutoCollectExceptions : true;
-        this.enableAutoCollectExtendedMetrics = this.enableAutoCollectExtendedMetrics != undefined ? this.enableAutoCollectExtendedMetrics : true;
         this.enableAutoCollectHeartbeat = this.enableAutoCollectHeartbeat != undefined ? this.enableAutoCollectHeartbeat : true;
         this.enableAutoCollectPerformance = this.enableAutoCollectPerformance != undefined ? this.enableAutoCollectPerformance : true;
         this.enableAutoCollectPreAggregatedMetrics = this.enableAutoCollectPreAggregatedMetrics != undefined ? this.enableAutoCollectPreAggregatedMetrics : true;
-        
         this.enableSendLiveMetrics = this.enableSendLiveMetrics != undefined ? this.enableSendLiveMetrics : false;
         this.samplingPercentage = this.samplingPercentage != undefined ? this.samplingPercentage : 100;
         if (!this.instrumentations) {
@@ -96,6 +89,12 @@ export class Config implements IConfig {
             this.instrumentations[InstrumentationType.redis] = { enabled: false };
             this.instrumentations[InstrumentationType.redis4] = { enabled: false };
         }
+        if (!this.extendedMetrics) {
+            this.extendedMetrics = {};
+            this.extendedMetrics[ExtendedMetricType.gc] = false;
+            this.extendedMetrics[ExtendedMetricType.heap] = false;
+            this.extendedMetrics[ExtendedMetricType.loop] = false;
+        }
     }
 
     public set instrumentationKey(iKey: string) {
@@ -121,12 +120,10 @@ export class Config implements IConfig {
     private _mergeConfig() {
         let jsonConfig = JsonConfig.getInstance();
         this._connectionString = jsonConfig.connectionString;
-        this.disableAllExtendedMetrics = jsonConfig.disableAllExtendedMetrics;
         this.disableStatsbeat = jsonConfig.disableStatsbeat;
         this.enableAutoCollectConsole = jsonConfig.enableAutoCollectConsole;
         this.enableAutoCollectDependencies = jsonConfig.enableAutoCollectDependencies;
         this.enableAutoCollectExceptions = jsonConfig.enableAutoCollectExceptions;
-        this.enableAutoCollectExtendedMetrics = jsonConfig.enableAutoCollectExtendedMetrics;
         this.enableAutoCollectExternalLoggers = jsonConfig.enableAutoCollectExternalLoggers;
         this.enableAutoCollectHeartbeat = jsonConfig.enableAutoCollectHeartbeat;
         this.enableAutoCollectPerformance = jsonConfig.enableAutoCollectPerformance;
@@ -134,10 +131,10 @@ export class Config implements IConfig {
         this.enableAutoCollectRequests = jsonConfig.enableAutoCollectRequests;
         this.enableSendLiveMetrics = jsonConfig.enableSendLiveMetrics;
         this.endpointUrl = jsonConfig.endpointUrl;
-        this.extendedMetricDisablers = jsonConfig.extendedMetricDisablers;
         this.quickPulseHost = jsonConfig.quickPulseHost;
         this.samplingPercentage = jsonConfig.samplingPercentage;
         this.instrumentations = jsonConfig.instrumentations;
+        this.extendedMetrics = jsonConfig.extendedMetrics;
     }
 
     private _getInstrumentationKey(): string {
@@ -147,12 +144,6 @@ export class Config implements IConfig {
             process.env[Constants.ENV_AZURE_PREFIX + Constants.ENV_IKEY] ||
             process.env[Constants.LEGACY_ENV_IKEY] ||
             process.env[Constants.ENV_AZURE_PREFIX + Constants.LEGACY_ENV_IKEY];
-        if (!iKey || iKey == "") {
-            throw new Error(
-                "Instrumentation key not found, pass the key in the config to this method or set the key in the environment variable APPINSIGHTS_INSTRUMENTATIONKEY before starting the server"
-            );
-        }
-
         return iKey;
     }
 
diff --git a/src/library/configuration/interfaces.ts b/src/library/configuration/interfaces.ts
index adb3f5f..8aa9c7a 100644
--- a/src/library/configuration/interfaces.ts
+++ b/src/library/configuration/interfaces.ts
@@ -1,4 +1,5 @@
 import * as azureCore from "@azure/core-http";
+import { InstrumentationConfig } from "@opentelemetry/instrumentation";
 
 export interface IBaseConfig {
     /** The ingestion endpoint to send telemetry payloads to */
@@ -25,11 +26,6 @@ export interface IBaseConfig {
      * if true performance counters will be collected every second and sent to Application Insights
      */
     enableAutoCollectPerformance: boolean;
-    /**
-     * Sets the state of performance tracking (enabled by default)
-     * if true, extended metrics counters will be collected every minute and sent to Application Insights
-     */
-    enableAutoCollectExtendedMetrics: boolean | IDisabledExtendedMetrics;
     /**
      * Sets the state of pre aggregated metrics tracking (enabled by default)
      * if true pre aggregated metrics will be collected every minute and sent to Application Insights
@@ -55,14 +51,6 @@ export interface IBaseConfig {
      * if true, enables communication with the live metrics service
      */
     enableSendLiveMetrics: boolean;
-    /**
-     * Disable all environment variables set
-     */
-    disableAllExtendedMetrics: boolean;
-    /**
-     * Disable individual environment variables set. eg. "extendedMetricDisablers": "..."
-     */
-    extendedMetricDisablers: string;
     /**
      * Disable Statsbeat
      */
@@ -73,10 +61,15 @@ export interface IBaseConfig {
     quickPulseHost: string;
 
     instrumentations: { [type: string]: iInstrumentation };
+    /**
+    * Specific extended metrics
+    */
+    extendedMetrics: { [type: string]: boolean };
 }
 
 export interface iInstrumentation {
-    enabled: boolean
+    enabled: boolean;
+    configuration?: InstrumentationConfig;
 }
 
 export const enum InstrumentationType {
@@ -88,6 +81,12 @@ export const enum InstrumentationType {
     redis4 = "redis4"
 }
 
+export const enum ExtendedMetricType {
+    gc = "gc",
+    heap = "heap",
+    loop = "loop"
+}
+
 export interface IEnvironmentConfig {
     /** Connection String used to send telemetry payloads to */
     connectionString: string;
@@ -99,15 +98,3 @@ export interface IConfig extends IBaseConfig {
     /** AAD TokenCredential to use to authenticate the app */
     aadTokenCredential?: azureCore.TokenCredential;
 }
-
-/**
- * Interface which defines which specific extended metrics should be disabled
- *
- * @export
- * @interface IDisabledExtendedMetrics
- */
-export interface IDisabledExtendedMetrics {
-    gc?: boolean;
-    heap?: boolean;
-    loop?: boolean;
-}
\ No newline at end of file
diff --git a/src/library/configuration/jsonConfig.ts b/src/library/configuration/jsonConfig.ts
index d4173b8..fea0d12 100644
--- a/src/library/configuration/jsonConfig.ts
+++ b/src/library/configuration/jsonConfig.ts
@@ -1,14 +1,11 @@
 import * as fs from "fs";
 import * as path from "path";
 import { Logger } from "../logging";
-import { IDisabledExtendedMetrics, iInstrumentation, IJsonConfig } from "./interfaces";
+import { iInstrumentation, IJsonConfig } from "./interfaces";
 
 const ENV_CONFIGURATION_FILE = "APPLICATIONINSIGHTS_CONFIGURATION_FILE";
 // Azure Connection String
 const ENV_connectionString = "APPLICATIONINSIGHTS_CONNECTION_STRING";
-// Native Metrics Opt Outs
-const ENV_nativeMetricsDisablers = "APPLICATION_INSIGHTS_DISABLE_EXTENDED_METRIC";
-const ENV_nativeMetricsDisableAll = "APPLICATION_INSIGHTS_DISABLE_ALL_EXTENDED_METRICS";
 const ENV_noStatsbeat = "APPLICATION_INSIGHTS_NO_STATSBEAT";
 
 export class JsonConfig implements IJsonConfig {
@@ -22,17 +19,15 @@ export class JsonConfig implements IJsonConfig {
     public enableAutoCollectConsole: boolean;
     public enableAutoCollectExceptions: boolean;
     public enableAutoCollectPerformance: boolean;
-    public enableAutoCollectExtendedMetrics: boolean | IDisabledExtendedMetrics;
     public enableAutoCollectPreAggregatedMetrics: boolean;
     public enableAutoCollectHeartbeat: boolean;
     public enableAutoCollectRequests: boolean;
     public enableAutoCollectDependencies: boolean;
     public enableSendLiveMetrics: boolean;
-    public disableAllExtendedMetrics: boolean;
-    public extendedMetricDisablers: string;
     public disableStatsbeat: boolean;
     public quickPulseHost: string;
     public instrumentations: { [type: string]: iInstrumentation };
+    public extendedMetrics: { [type: string]: boolean };
 
     static getInstance() {
         if (!JsonConfig._instance) {
@@ -44,8 +39,6 @@ export class JsonConfig implements IJsonConfig {
     constructor() {
         // Load env variables first
         this.connectionString = process.env[ENV_connectionString];
-        this.disableAllExtendedMetrics = !!process.env[ENV_nativeMetricsDisableAll];
-        this.extendedMetricDisablers = process.env[ENV_nativeMetricsDisablers];
         this.disableStatsbeat = !!process.env[ENV_noStatsbeat];
         this._loadJsonFile();
     }
@@ -67,22 +60,15 @@ export class JsonConfig implements IJsonConfig {
             if (jsonConfig.disableStatsbeat != undefined) {
                 this.disableStatsbeat = jsonConfig.disableStatsbeat;
             }
-            if (jsonConfig.disableAllExtendedMetrics != undefined) {
-                this.disableAllExtendedMetrics = jsonConfig.disableStatsbeat;
-            }
             if (jsonConfig.connectionString != undefined) {
                 this.connectionString = jsonConfig.connectionString;
             }
-            if (jsonConfig.extendedMetricDisablers != undefined) {
-                this.extendedMetricDisablers = jsonConfig.extendedMetricDisablers;
-            }
             this.endpointUrl = jsonConfig.endpointUrl;
             this.samplingPercentage = jsonConfig.samplingPercentage;
             this.enableAutoCollectExternalLoggers = jsonConfig.enableAutoCollectExternalLoggers;
             this.enableAutoCollectConsole = jsonConfig.enableAutoCollectConsole;
             this.enableAutoCollectExceptions = jsonConfig.enableAutoCollectExceptions;
             this.enableAutoCollectPerformance = jsonConfig.enableAutoCollectPerformance;
-            this.enableAutoCollectExtendedMetrics = jsonConfig.enableAutoCollectExtendedMetrics;
             this.enableAutoCollectPreAggregatedMetrics =
                 jsonConfig.enableAutoCollectPreAggregatedMetrics;
             this.enableAutoCollectHeartbeat = jsonConfig.enableAutoCollectHeartbeat;
@@ -91,6 +77,7 @@ export class JsonConfig implements IJsonConfig {
             this.enableSendLiveMetrics = jsonConfig.enableSendLiveMetrics;
             this.quickPulseHost = jsonConfig.quickPulseHost;
             this.instrumentations = jsonConfig.instrumentations;
+            this.extendedMetrics = jsonConfig.extendedMetrics;
         } catch (err) {
             Logger.getInstance().info("Missing or invalid JSON config file: ", err);
         }
diff --git a/src/shim/applicationinsights.ts b/src/shim/applicationinsights.ts
index 5d893f2..8cc0a57 100644
--- a/src/shim/applicationinsights.ts
+++ b/src/shim/applicationinsights.ts
@@ -2,7 +2,7 @@ import { IncomingMessage } from "http";
 import { DiagLogLevel, SpanContext } from "@opentelemetry/api";
 
 import { Logger } from "../library/logging";
-import { IDisabledExtendedMetrics, InstrumentationType } from "../library/configuration/interfaces";
+import { InstrumentationType } from "../library/configuration/interfaces";
 import { QuickPulseStateManager } from "../library/quickPulse";
 import { ICorrelationContext } from "../declarations/interfaces";
 import { TelemetryClient } from "./telemetryClient";
@@ -150,7 +150,7 @@ export class Configuration {
      */
     public static setAutoCollectPerformance(
         value: boolean,
-        collectExtendedMetrics: boolean | IDisabledExtendedMetrics = true
+        collectExtendedMetrics: any
     ) {
         return Configuration;
     }


Test patch:
diff --git a/test/unitTests/autoCollection/nativePerformance.tests.ts b/test/unitTests/autoCollection/nativePerformance.tests.ts
index bc206d2..c4c5673 100644
--- a/test/unitTests/autoCollection/nativePerformance.tests.ts
+++ b/test/unitTests/autoCollection/nativePerformance.tests.ts
@@ -1,229 +1,61 @@
-// import { MetricData } from "@opentelemetry/sdk-metrics-base";
-// import * as assert from "assert";
-// import * as sinon from "sinon";
-
-// import { NativePerformanceMetrics, getNativeMetricsConfig } from "../../../src/autoCollection/metrics/nativePerformanceMetrics";
-// import { NativeMetricsCounter } from "../../../src/autoCollection/metrics/types";
-// import { Config, JsonConfig } from "../../../src/library/configuration";
-// import { MetricHandler } from "../../../src/library/handlers";
-
-// const ENV_nativeMetricsDisablers = "APPLICATION_INSIGHTS_DISABLE_EXTENDED_METRIC";
-// const ENV_nativeMetricsDisableAll = "APPLICATION_INSIGHTS_DISABLE_ALL_EXTENDED_METRICS";
-// describe("AutoCollection/NativePerformance", () => {
-//     var sandbox: sinon.SinonSandbox;
-
-//     before(() => {
-//         sandbox = sinon.createSandbox();
-//     })
-
-//     beforeEach(() => {
-//         JsonConfig["_instance"] = undefined;
-//     });
-
-//     afterEach(() => {
-//         sandbox.restore();
-//     });
-
-//     describe("#Metrics", () => {
-//         it("init should enable and dispose should stop auto collection interval", () => {
-//             let metricHandler = new MetricHandler(new Config("1aa11111-bbbb-1ccc-8ddd-eeeeffff3333"));
-//             sandbox.stub(metricHandler["_metricReader"]["_exporter"], "export");
-//             let nativePerformance = new NativePerformanceMetrics(metricHandler.getMeter());
-//             nativePerformance.enable(true);
-//             if (
-//                 nativePerformance["_metricsAvailable"]
-//             ) {
-//                 assert.ok(nativePerformance["_handle"]);
-//                 nativePerformance.enable(false);
-//                 assert.ok(!nativePerformance["_handle"]);
-//             } else {
-//                 assert.ok(!nativePerformance["_handle"]);
-//             }
-//         });
-
-//         it("should create instruments", () => {
-//             let metricHandler = new MetricHandler(new Config("1aa11111-bbbb-1ccc-8ddd-eeeeffff3333"));
-//             sandbox.stub(metricHandler["_metricReader"]["_exporter"], "export");
-//             let nativePerformance = new NativePerformanceMetrics(metricHandler.getMeter());
-//             assert.ok(nativePerformance["_eventLoopHistogram"], "_eventLoopHistogram not available");
-//             assert.ok(nativePerformance["_garbageCollectionScavenge"], "_garbageCollectionScavenge not available");
-//             assert.ok(nativePerformance["_garbageCollectionMarkSweepCompact"], "_garbageCollectionMarkSweepCompact not available");
-//             assert.ok(nativePerformance["_garbageCollectionIncrementalMarking"], "_garbageCollectionIncrementalMarking not available");
-//             assert.ok(nativePerformance["_heapMemoryTotalGauge"], "_heapMemoryTotalGauge not available");
-//             assert.ok(nativePerformance["_heapMemoryUsageGauge"], "_heapMemoryUsageGauge not available");
-//             assert.ok(nativePerformance["_memoryUsageNonHeapGauge"], "_memoryUsageNonHeapGauge not available");
-//         });
-
-//         it("should observe instruments during collection", (done) => {
-//             let metricHandler = new MetricHandler(new Config("1aa11111-bbbb-1ccc-8ddd-eeeeffff3333"));
-//             sandbox.stub(metricHandler["_metricReader"]["_exporter"], "export");
-//             let nativePerformance = new NativePerformanceMetrics(metricHandler.getMeter());
-//             nativePerformance.enable(true);
-//             metricHandler["_metricReader"].collect().then(({ resourceMetrics, errors }) => {
-//                 assert.equal(errors.length, 0, "Errors found during collection");
-//                 assert.equal(resourceMetrics.scopeMetrics.length, 1, "Wrong number of scopeMetrics");
-//                 let metricsWithDataPoints: MetricData[] = []; // Only Metrics with data points will be exported
-//                 resourceMetrics.scopeMetrics[0].metrics.forEach(metric => {
-//                     if (metric.dataPoints.length > 0) {
-//                         metricsWithDataPoints.push(metric);
-//                     }
-//                 });
-//                 if (nativePerformance["_metricsAvailable"]) {
-//                     assert.equal(metricsWithDataPoints.length, 3, "Wrong number of instruments");
-//                     assert.equal(metricsWithDataPoints[0].descriptor.name, NativeMetricsCounter.HEAP_MEMORY_TOTAL);
-//                     assert.equal(metricsWithDataPoints[1].descriptor.name, NativeMetricsCounter.HEAP_MEMORY_USAGE);
-//                     assert.equal(metricsWithDataPoints[2].descriptor.name, NativeMetricsCounter.MEMORY_USAGE_NON_HEAP);
-//                 }
-//                 else {
-//                     assert.equal(metricsWithDataPoints.length, 0, "Wrong number of instruments when metrics are not available");
-//                 }
-//                 done();
-//             }).catch((error) => done(error));
-//         });
-
-//         it("should collect histograms during collection", (done) => {
-//             let metricHandler = new MetricHandler(new Config("1aa11111-bbbb-1ccc-8ddd-eeeeffff3333"));
-//             sandbox.stub(metricHandler["_metricReader"]["_exporter"], "export");
-//             let nativePerformance = new NativePerformanceMetrics(metricHandler.getMeter());
-//             nativePerformance.enable(true);
-//             if (nativePerformance["_metricsAvailable"]) {
-//                 nativePerformance["_collectHistogramData"](); // Method called every 15 seconds
-//             }
-//             metricHandler["_metricReader"].collect().then(({ resourceMetrics, errors }) => {
-//                 assert.equal(errors.length, 0, "Errors found during collection");
-//                 assert.equal(resourceMetrics.scopeMetrics.length, 1, "Wrong number of scopeMetrics");
-//                 let metricsWithDataPoints: MetricData[] = []; // Only Metrics with data points will be exported
-//                 resourceMetrics.scopeMetrics[0].metrics.forEach(metric => {
-//                     if (metric.dataPoints.length > 0) {
-//                         metricsWithDataPoints.push(metric);
-//                     }
-//                 });
-//                 if (nativePerformance["_metricsAvailable"]) {
-//                     assert.equal(metricsWithDataPoints.length, 7, "Wrong number of instruments");
-//                     assert.equal(metricsWithDataPoints[0].descriptor.name, NativeMetricsCounter.EVENT_LOOP_CPU);
-//                     assert.equal(metricsWithDataPoints[1].descriptor.name, NativeMetricsCounter.GARBAGE_COLLECTION_SCAVENGE);
-//                     assert.equal(metricsWithDataPoints[2].descriptor.name, NativeMetricsCounter.GARBAGE_COLLECTION_SWEEP_COMPACT);
-//                     assert.equal(metricsWithDataPoints[3].descriptor.name, NativeMetricsCounter.GARBAGE_COLLECTION_INCREMENTAL_MARKING);
-//                     assert.equal(metricsWithDataPoints[4].descriptor.name, NativeMetricsCounter.HEAP_MEMORY_TOTAL);
-//                     assert.equal(metricsWithDataPoints[5].descriptor.name, NativeMetricsCounter.HEAP_MEMORY_USAGE);
-//                     assert.equal(metricsWithDataPoints[5].descriptor.name, NativeMetricsCounter.MEMORY_USAGE_NON_HEAP);
-//                 }
-//                 else {
-//                     assert.equal(metricsWithDataPoints.length, 0, "Wrong number of instruments");
-//                 }
-//                 done();
-//             }).catch((error) => done(error));
-//         });
-
-//         it("Calling enable when metrics are not available should fail gracefully", () => {
-//             let metricHandler = new MetricHandler(new Config("1aa11111-bbbb-1ccc-8ddd-eeeeffff3333"));
-//             sandbox.stub(metricHandler["_metricReader"]["_exporter"], "export");
-//             var native = new NativePerformanceMetrics(metricHandler.getMeter());
-//             native["_metricsAvailable"] = false;
-//             assert.ok(!(<any>native)["_emitter"]);
-
-//             assert.doesNotThrow(
-//                 () => native.enable(true),
-//                 "Does not throw when native metrics are not available and trying to enable"
-//             );
-//             assert.doesNotThrow(
-//                 () => native.enable(false),
-//                 "Does not throw when native metrics are not available and trying to disable"
-//             );
-//         });
-//     });
-
-//     describe("#getNativeMetricsConfig", () => {
-//         it("should return equal input arg if no env vars are set", () => {
-//             const _customConfig = JsonConfig.getInstance();
-//             assert.deepEqual(getNativeMetricsConfig(true, _customConfig), {
-//                 isEnabled: true,
-//                 disabledMetrics: {},
-//             });
-//             assert.deepEqual(getNativeMetricsConfig(false, _customConfig), {
-//                 isEnabled: false,
-//                 disabledMetrics: {},
-//             });
-
-//             const config = { gc: true, heap: true };
-//             assert.deepEqual(getNativeMetricsConfig(config, _customConfig), {
-//                 isEnabled: true,
-//                 disabledMetrics: config,
-//             });
-//         });
-
-//         it("should overwrite input arg if disable all extended metrics env var is set", () => {
-//             const env = <{ [id: string]: string }>{};
-//             const originalEnv = process.env;
-
-//             env[ENV_nativeMetricsDisableAll] = "set";
-//             process.env = env;
-
-//             const _customConfig = JsonConfig.getInstance();
-
-//             assert.deepEqual(getNativeMetricsConfig(true, _customConfig), {
-//                 isEnabled: false,
-//                 disabledMetrics: {},
-//             });
-//             assert.deepEqual(getNativeMetricsConfig({}, _customConfig), {
-//                 isEnabled: false,
-//                 disabledMetrics: {},
-//             });
-//             assert.deepEqual(getNativeMetricsConfig({ gc: true }, _customConfig), {
-//                 isEnabled: false,
-//                 disabledMetrics: {},
-//             });
-
-//             process.env = originalEnv;
-//         });
-
-//         it("should overwrite input arg if individual env vars are set", () => {
-//             const expectation = { gc: true, heap: true };
-//             const env = <{ [id: string]: string }>{};
-//             const originalEnv = process.env;
-
-//             env[ENV_nativeMetricsDisablers] = "gc,heap";
-//             process.env = env;
-
-//             const _customConfig = JsonConfig.getInstance();
-
-//             let inConfig;
-
-//             inConfig = false;
-//             assert.deepEqual(getNativeMetricsConfig(inConfig, _customConfig), {
-//                 isEnabled: false,
-//                 disabledMetrics: expectation,
-//             });
-
-//             inConfig = true;
-//             assert.deepEqual(getNativeMetricsConfig(inConfig, _customConfig), {
-//                 isEnabled: true,
-//                 disabledMetrics: expectation,
-//             });
-
-//             inConfig = {};
-//             assert.deepEqual(getNativeMetricsConfig(inConfig, _customConfig), {
-//                 isEnabled: true,
-//                 disabledMetrics: expectation,
-//             });
-//             inConfig = { gc: true };
-//             assert.deepEqual(getNativeMetricsConfig(inConfig, _customConfig), {
-//                 isEnabled: true,
-//                 disabledMetrics: expectation,
-//             });
-//             inConfig = { loop: true };
-
-//             assert.deepEqual(getNativeMetricsConfig(inConfig, _customConfig), {
-//                 isEnabled: true,
-//                 disabledMetrics: { ...inConfig, ...expectation },
-//             });
-//             inConfig = { gc: false, loop: true, heap: "abc", something: "else" };
-//             assert.deepEqual(getNativeMetricsConfig(<any>inConfig, _customConfig), {
-//                 isEnabled: true,
-//                 disabledMetrics: { ...inConfig, ...expectation },
-//             });
-
-//             process.env = originalEnv;
-//         });
-//     });
-// });
+import * as assert from "assert";
+import * as sinon from "sinon";
+import { Meter } from "@opentelemetry/api-metrics";
+import { MeterProvider } from "@opentelemetry/sdk-metrics";
+import { NativePerformanceMetrics } from "../../../src/autoCollection/metrics/collection/nativePerformanceMetrics";
+
+class TestEmitter {
+    enable() { }
+    disable() { }
+    getLoopData() { }
+    getGCData() { }
+}
+
+describe("AutoCollection/NativePerformance", () => {
+    var sandbox: sinon.SinonSandbox;
+    let testMeter: Meter;
+
+    before(() => {
+        sandbox = sinon.createSandbox();
+        let testProvider = new MeterProvider();
+        testMeter = testProvider.getMeter("test");
+    })
+
+    afterEach(() => {
+        sandbox.restore();
+    });
+
+    describe("#Metrics", () => {
+        it("init should enable and dispose should stop auto collection interval", () => {
+            var nativePerformance = new NativePerformanceMetrics(testMeter);
+            nativePerformance["_emitter"] = new TestEmitter();
+            nativePerformance["_metricsAvailable"] = true;
+
+            nativePerformance.enable(true);
+            if (
+                nativePerformance["_metricsAvailable"]
+            ) {
+                assert.ok(nativePerformance["_handle"]);
+                nativePerformance.enable(false);
+                assert.ok(!nativePerformance["_handle"]);
+            } else {
+                assert.ok(!nativePerformance["_handle"]);
+            }
+        });
+
+        it("Calling enable when metrics are not available should fail gracefully", () => {
+            var nativePerformance = new NativePerformanceMetrics(testMeter);
+            nativePerformance["_metricsAvailable"] = false;
+            assert.ok(!(<any>nativePerformance)["_emitter"]);
+
+            assert.doesNotThrow(
+                () => nativePerformance.enable(true),
+                "Does not throw when native metrics are not available and trying to enable"
+            );
+            assert.doesNotThrow(
+                () => nativePerformance.enable(false),
+                "Does not throw when native metrics are not available and trying to disable"
+            );
+        });
+    });
+});
diff --git a/test/unitTests/autoCollection/performance.tests.ts b/test/unitTests/autoCollection/performance.tests.ts
index 5511750..c34b41f 100644
--- a/test/unitTests/autoCollection/performance.tests.ts
+++ b/test/unitTests/autoCollection/performance.tests.ts
@@ -13,6 +13,9 @@ describe("PerformanceCounterMetricsHandler", () => {
     before(() => {
         sandbox = sinon.createSandbox();
         let config = new Config("1aa11111-bbbb-1ccc-8ddd-eeeeffff3333");
+        config.extendedMetrics.heap = true;
+        config.extendedMetrics.loop = true;
+        config.extendedMetrics.gc = true;
         autoCollect = new PerformanceCounterMetricsHandler(config, { collectionInterval: 100 });
         sandbox.stub(autoCollect["_metricReader"]["_exporter"], "export");
     })
@@ -82,5 +85,21 @@ describe("PerformanceCounterMetricsHandler", () => {
             await new Promise(resolve => setTimeout(resolve, 120));
             assert.ok(mockExport.notCalled);
         });
+
+
+        it("should add correct views", () => {
+            let config = new Config("1aa11111-bbbb-1ccc-8ddd-eeeeffff3333");
+            config.extendedMetrics.heap = false;
+            config.extendedMetrics.loop = false;
+            config.extendedMetrics.gc = false;
+            let autoCollect = new PerformanceCounterMetricsHandler(config);
+            let views = autoCollect["_getViews"]();
+            assert.equal(views.length, 18); // All Native metrics ignore views are added
+            config.extendedMetrics.heap = true;
+            config.extendedMetrics.loop = true;
+            config.extendedMetrics.gc = true;
+            views = autoCollect["_getViews"]();
+            assert.equal(views.length, 11);
+        });
     });
 });
diff --git a/test/unitTests/library/client.tests.ts b/test/unitTests/library/client.tests.ts
index ad66bd9..8129440 100644
--- a/test/unitTests/library/client.tests.ts
+++ b/test/unitTests/library/client.tests.ts
@@ -111,6 +111,12 @@
 //             };
 //             assert.ok(client.getAuthorizationHandler(client.config));
 //         });
+
+// it("should throw if no iKey is available", () => {
+//     var env = {};
+//     process.env = env;
+//     assert.throws(() => new Client());
+// });
 //     });
 
 //     describe("#trackEvent()", () => {
diff --git a/test/unitTests/library/config.json b/test/unitTests/library/config.json
index 0abb4a9..9d691b9 100644
--- a/test/unitTests/library/config.json
+++ b/test/unitTests/library/config.json
@@ -1,10 +1,9 @@
 {
     "connectionString": "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;IngestionEndpoint=https://centralus-0.in.applicationinsights.azure.com/",
     "endpointUrl": "testEndpointUrl",
-    "disableAllExtendedMetrics": false,
     "samplingPercentage": 30,
     "enableAutoCollectExternalLoggers": false,
-    "enableAutoCollectConsole": false,
+    "enableAutoCollectConsole": true,
     "enableAutoCollectExceptions": false,
     "enableAutoCollectPerformance": false,
     "enableAutoCollectExtendedMetrics": false,
@@ -14,6 +13,30 @@
     "enableAutoCollectDependencies": false,
     "disableStatsbeat": false,
     "enableSendLiveMetrics": false,
-    "extendedMetricDisablers": "gc,heap",
+    "extendedMetrics": {
+        "heap": true,
+        "gc": true,
+        "loop": true
+    },
+    "instrumentations": {
+        "azureSdk": {
+            "enabled": true
+        },
+        "mongoDb": {
+            "enabled": true
+        },
+        "mySql": {
+            "enabled": true
+        },
+        "postgreSql": {
+            "enabled": true
+        },
+        "redis": {
+            "enabled": true
+        },
+        "redis4": {
+            "enabled": true
+        }
+    },
     "quickPulseHost": "testquickpulsehost.com"
 }
\ No newline at end of file
diff --git a/test/unitTests/library/config.tests.ts b/test/unitTests/library/config.tests.ts
index fd44625..b9e57f1 100644
--- a/test/unitTests/library/config.tests.ts
+++ b/test/unitTests/library/config.tests.ts
@@ -93,22 +93,54 @@ describe("Library/Config", () => {
                     config["_connectionString"],
                     "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;IngestionEndpoint=https://centralus-0.in.applicationinsights.azure.com/"
                 );
-                assert.equal(config.endpointUrl, "testEndpointUrl/v2.1/track");
-                assert.equal(config.samplingPercentage, 30);
-                assert.equal(config.enableAutoCollectExternalLoggers, false);
-                assert.equal(config.enableAutoCollectConsole, false);
-                assert.equal(config.enableAutoCollectExceptions, false);
-                assert.equal(config.enableAutoCollectPerformance, false);
-                assert.equal(config.enableAutoCollectPreAggregatedMetrics, false);
-                assert.equal(config.enableAutoCollectHeartbeat, false);
-                assert.equal(config.enableAutoCollectRequests, false);
-                assert.equal(config.enableAutoCollectDependencies, false);
-                assert.equal(config.disableStatsbeat, false);
-                assert.equal(config.enableAutoCollectExtendedMetrics, false);
-                assert.equal(config.disableStatsbeat, false);
-                assert.equal(config.enableSendLiveMetrics, false);
-                assert.equal(config.extendedMetricDisablers, "gc,heap");
-                assert.equal(config.quickPulseHost, "testquickpulsehost.com");
+                assert.equal(config.endpointUrl, "testEndpointUrl/v2.1/track", "Wrong endpointUrl");
+                assert.equal(config.samplingPercentage, 30, "Wrong samplingPercentage");
+                assert.equal(config.enableAutoCollectExternalLoggers, false, "Wrong enableAutoCollectExternalLoggers");
+                assert.equal(config.enableAutoCollectConsole, true, "Wrong enableAutoCollectConsole");
+                assert.equal(config.enableAutoCollectExceptions, false, "Wrong enableAutoCollectExceptions");
+                assert.equal(config.enableAutoCollectPerformance, false, "Wrong enableAutoCollectPerformance");
+                assert.equal(config.enableAutoCollectPreAggregatedMetrics, false, "Wrong enableAutoCollectPreAggregatedMetrics");
+                assert.equal(config.enableAutoCollectHeartbeat, false, "Wrong enableAutoCollectHeartbeat");
+                assert.equal(config.enableAutoCollectRequests, false, "Wrong enableAutoCollectRequests");
+                assert.equal(config.enableAutoCollectDependencies, false, "Wrong enableAutoCollectDependencies");
+                assert.equal(config.disableStatsbeat, false, "Wrong disableStatsbeat");
+                assert.equal(config.enableSendLiveMetrics, false, "Wrong enableSendLiveMetrics");
+                assert.equal(config.extendedMetrics.loop, true, "Wrong loop");
+                assert.equal(config.extendedMetrics.gc, true, "Wrong gc");
+                assert.equal(config.extendedMetrics.heap, true, "Wrong heap");
+                assert.equal(config.quickPulseHost, "testquickpulsehost.com", "Wrong quickPulseHost");
+                assert.equal(config.instrumentations.azureSdk.enabled, true, "Wrong azureSdk");
+                assert.equal(config.instrumentations.mongoDb.enabled, true, "Wrong mongoDb");
+                assert.equal(config.instrumentations.mySql.enabled, true, "Wrong mySql");
+                assert.equal(config.instrumentations.postgreSql.enabled, true, "Wrong postgreSql");
+                assert.equal(config.instrumentations.redis.enabled, true, "Wrong redis");
+                assert.equal(config.instrumentations.redis4.enabled, true, "Wrong redis4");
+            });
+
+            it("Default config", () => {
+                const config = new Config();
+                assert.equal(config.endpointUrl, "https://dc.services.visualstudio.com/v2.1/track", "Wrong endpointUrl");
+                assert.equal(config.samplingPercentage, 100, "Wrong samplingPercentage");
+                assert.equal(config.enableAutoCollectExternalLoggers, true, "Wrong enableAutoCollectExternalLoggers");
+                assert.equal(config.enableAutoCollectConsole, false, "Wrong enableAutoCollectConsole");
+                assert.equal(config.enableAutoCollectExceptions, true, "Wrong enableAutoCollectExceptions");
+                assert.equal(config.enableAutoCollectPerformance, true, "Wrong enableAutoCollectPerformance");
+                assert.equal(config.enableAutoCollectPreAggregatedMetrics, true, "Wrong enableAutoCollectPreAggregatedMetrics");
+                assert.equal(config.enableAutoCollectHeartbeat, true, "Wrong enableAutoCollectHeartbeat");
+                assert.equal(config.enableAutoCollectRequests, true, "Wrong enableAutoCollectRequests");
+                assert.equal(config.enableAutoCollectDependencies, true, "Wrong enableAutoCollectDependencies");
+                assert.equal(config.disableStatsbeat, false, "Wrong disableStatsbeat");
+                assert.equal(config.enableSendLiveMetrics, false, "Wrong enableSendLiveMetrics");
+                assert.equal(config.extendedMetrics.loop, false, "Wrong loop");
+                assert.equal(config.extendedMetrics.gc, false, "Wrong gc");
+                assert.equal(config.extendedMetrics.heap, false, "Wrong heap");
+                assert.equal(config.quickPulseHost, "rt.services.visualstudio.com", "Wrong quickPulseHost");
+                assert.equal(config.instrumentations.azureSdk.enabled, false, "Wrong azureSdk");
+                assert.equal(config.instrumentations.mongoDb.enabled, false, "Wrong mongoDb");
+                assert.equal(config.instrumentations.mySql.enabled, false, "Wrong mySql");
+                assert.equal(config.instrumentations.postgreSql.enabled, false, "Wrong postgreSql");
+                assert.equal(config.instrumentations.redis.enabled, false, "Wrong redis");
+                assert.equal(config.instrumentations.redis4.enabled, false, "Wrong redis4");
             });
         });
 
@@ -118,12 +150,6 @@ describe("Library/Config", () => {
                 sandbox.stub(https, "request");
             });
 
-            it("should throw if no iKey is available", () => {
-                var env = {};
-                process.env = env;
-                assert.throws(() => new Config());
-            });
-
             it("should read iKey from environment", () => {
                 var env = <{ [id: string]: string }>{};
                 env[Constants.ENV_IKEY] = iKey;
diff --git a/test/unitTests/library/jsonConfig.tests.ts b/test/unitTests/library/jsonConfig.tests.ts
index 42972da..c1cce41 100644
--- a/test/unitTests/library/jsonConfig.tests.ts
+++ b/test/unitTests/library/jsonConfig.tests.ts
@@ -75,40 +75,37 @@ describe("Json Config", () => {
                 config.connectionString,
                 "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;IngestionEndpoint=https://centralus-0.in.applicationinsights.azure.com/"
             );
-            assert.equal(config.endpointUrl, "testEndpointUrl");
-            assert.equal(config.samplingPercentage, 30);
-            assert.equal(config.enableAutoCollectExternalLoggers, false);
-            assert.equal(config.enableAutoCollectConsole, false);
-            assert.equal(config.enableAutoCollectExceptions, false);
-            assert.equal(config.enableAutoCollectPerformance, false);
-            assert.equal(config.enableAutoCollectPreAggregatedMetrics, false);
-            assert.equal(config.enableAutoCollectHeartbeat, false);
-            assert.equal(config.enableAutoCollectRequests, false);
-            assert.equal(config.enableAutoCollectDependencies, false);
-            assert.equal(config.disableStatsbeat, false);
-            assert.equal(config.enableAutoCollectExtendedMetrics, false);
-            assert.equal(config.disableStatsbeat, false);
-            assert.equal(config.enableSendLiveMetrics, false);
-            assert.equal(config.extendedMetricDisablers, "gc,heap");
-            assert.equal(config.quickPulseHost, "testquickpulsehost.com");
+            assert.equal(config.endpointUrl, "testEndpointUrl", "Wrong endpointUrl");
+            assert.equal(config.samplingPercentage, 30, "Wrong samplingPercentage");
+            assert.equal(config.enableAutoCollectExternalLoggers, false, "Wrong enableAutoCollectExternalLoggers");
+            assert.equal(config.enableAutoCollectConsole, true, "Wrong enableAutoCollectConsole");
+            assert.equal(config.enableAutoCollectExceptions, false, "Wrong enableAutoCollectExceptions");
+            assert.equal(config.enableAutoCollectPerformance, false, "Wrong enableAutoCollectPerformance");
+            assert.equal(config.enableAutoCollectPreAggregatedMetrics, false, "Wrong enableAutoCollectPreAggregatedMetrics");
+            assert.equal(config.enableAutoCollectHeartbeat, false, "Wrong enableAutoCollectHeartbeat");
+            assert.equal(config.enableAutoCollectRequests, false, "Wrong enableAutoCollectRequests");
+            assert.equal(config.enableAutoCollectDependencies, false, "Wrong enableAutoCollectDependencies");
+            assert.equal(config.disableStatsbeat, false, "Wrong disableStatsbeat");
+            assert.equal(config.enableSendLiveMetrics, false, "Wrong enableSendLiveMetrics");
+            assert.equal(config.extendedMetrics.loop, true, "Wrong loop");
+            assert.equal(config.extendedMetrics.gc, true, "Wrong gc");
+            assert.equal(config.extendedMetrics.heap, true, "Wrong heap");
+            assert.equal(config.quickPulseHost, "testquickpulsehost.com", "Wrong quickPulseHost");
+            assert.equal(config.instrumentations.azureSdk.enabled, true, "Wrong azureSdk");
+            assert.equal(config.instrumentations.mongoDb.enabled, true, "Wrong mongoDb");
+            assert.equal(config.instrumentations.mySql.enabled, true, "Wrong mySql");
+            assert.equal(config.instrumentations.postgreSql.enabled, true, "Wrong postgreSql");
+            assert.equal(config.instrumentations.redis.enabled, true, "Wrong redis");
+            assert.equal(config.instrumentations.redis4.enabled, true, "Wrong redis4");
         });
 
         it("Should take configurations from environment variables", () => {
             const env = <{ [id: string]: string }>{};
             env["APPLICATIONINSIGHTS_CONNECTION_STRING"] = "TestConnectionString";
-            env["APPLICATION_INSIGHTS_DISABLE_EXTENDED_METRIC"] = "gc";
-            env["APPLICATION_INSIGHTS_NO_PATCH_MODULES"] = "azuresdk";
-            env["APPLICATION_INSIGHTS_DISABLE_ALL_EXTENDED_METRICS"] = "true";
-            env["APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL"] = "true";
             env["APPLICATION_INSIGHTS_NO_STATSBEAT"] = "true";
-            env["APPLICATION_INSIGHTS_NO_HTTP_AGENT_KEEP_ALIVE"] = "true";
-            env["http_proxy"] = "testProxyHttpUrl2";
-            env["https_proxy"] = "testProxyHttpsUrl2";
             process.env = env;
             const config = JsonConfig.getInstance();
             assert.equal(config.connectionString, "TestConnectionString");
-            assert.equal(config.extendedMetricDisablers, "gc");
-            assert.equal(config.disableAllExtendedMetrics, true);
             assert.equal(config.disableStatsbeat, true);
         });
 
@@ -120,22 +117,13 @@ describe("Json Config", () => {
             );
             env["APPLICATIONINSIGHTS_CONFIGURATION_FILE"] = customConfigJSONPath;
             env["APPLICATIONINSIGHTS_CONNECTION_STRING"] = "TestConnectionString";
-            env["APPLICATION_INSIGHTS_DISABLE_EXTENDED_METRIC"] = "gc";
-            env["APPLICATION_INSIGHTS_NO_PATCH_MODULES"] = "azuresdk";
-            env["APPLICATION_INSIGHTS_DISABLE_ALL_EXTENDED_METRICS"] = "true";
-            env["APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL"] = "true";
             env["APPLICATION_INSIGHTS_NO_STATSBEAT"] = "true";
-            env["APPLICATION_INSIGHTS_NO_HTTP_AGENT_KEEP_ALIVE"] = "true";
-            env["http_proxy"] = "testProxyHttpUrl2";
-            env["https_proxy"] = "testProxyHttpsUrl2";
             process.env = env;
             const config = JsonConfig.getInstance();
             assert.equal(
                 config.connectionString,
                 "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333;IngestionEndpoint=https://centralus-0.in.applicationinsights.azure.com/"
             );
-            assert.equal(config.extendedMetricDisablers, "gc,heap");
-            assert.equal(config.disableAllExtendedMetrics, false);
             assert.equal(config.disableStatsbeat, false);
         });
     });