diff --git a/packages/dnode/.babelrc b/packages/dnode/.babelrc
new file mode 100644
index 000000000..e24a5465f
--- /dev/null
+++ b/packages/dnode/.babelrc
@@ -0,0 +1,10 @@
+{
+  "presets": [
+    [
+      "@nrwl/web/babel",
+      {
+        "useBuiltIns": "usage"
+      }
+    ]
+  ]
+}
diff --git a/packages/dnode/.eslintrc.json b/packages/dnode/.eslintrc.json
new file mode 100644
index 000000000..b5a180969
--- /dev/null
+++ b/packages/dnode/.eslintrc.json
@@ -0,0 +1,18 @@
+{
+  "extends": ["../../.eslintrc.json"],
+  "ignorePatterns": ["!**/*", "node_modules"],
+  "overrides": [
+    {
+      "files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
+      "rules": {}
+    },
+    {
+      "files": ["*.ts", "*.tsx"],
+      "rules": {}
+    },
+    {
+      "files": ["*.js", "*.jsx"],
+      "rules": {}
+    }
+  ]
+}
diff --git a/packages/dnode/README.md b/packages/dnode/README.md
new file mode 100644
index 000000000..5854b16b0
--- /dev/null
+++ b/packages/dnode/README.md
@@ -0,0 +1,7 @@
+# dnode
+
+This library was generated with [Nx](https://nx.dev).
+
+## Building
+
+Run `nx build dnode` to build the library.
diff --git a/packages/dnode/package.json b/packages/dnode/package.json
new file mode 100644
index 000000000..f8b424971
--- /dev/null
+++ b/packages/dnode/package.json
@@ -0,0 +1,43 @@
+{
+  "name": "@pushprotocol/dnode",
+  "version": "0.0.6",
+  "type": "commonjs",
+  "publishConfig": {
+    "registry": "https://registry.npmjs.org/"
+  },
+  "peerDependencies": {
+    "ethers": "^5.0.0 || ^6.0.0"
+  },
+  "peerDependenciesMeta": {
+    "ethers": {
+      "optional": true
+    }
+  },
+  "dependencies": {
+    "@metamask/eth-sig-util": "^5.0.2",
+    "buffer": "^6.0.3",
+    "crypto-js": "^4.1.1",
+    "immer": "^10.0.2",
+    "joi": "^17.9.2",
+    "lru-cache": "^10.1.0",
+    "openpgp": "^5.5.0",
+    "socket.io-client": "^4.7.2",
+    "viem": "^2.13.1"
+  },
+  "scripts": {
+    "test": "TS_NODE_PROJECT='./tsconfig.mocha.json' NODE_OPTIONS='--loader ts-node/esm' DOTENV_CONFIG_PATH='./tests/.env' mocha -r ts-node/register -r dotenv/config 'tests/**/*.test.ts' --timeout 1200000 --require tests/root.ts --serial"
+  },
+  "devDependencies": {
+    "@types/chai": "^4.3.4",
+    "@types/chai-as-promised": "^7.1.5",
+    "@types/crypto-js": "^4.1.1",
+    "@types/mocha": "^10.0.1",
+    "chai": "^4.3.7",
+    "chai-as-promised": "^7.1.1",
+    "envfile": "^7.1.0",
+    "mocha": "^10.2.0",
+    "mocha-typescript": "^1.1.17",
+    "ts-node": "^10.9.1",
+    "typescript": "^5.0.2"
+  }
+}
diff --git a/packages/dnode/project.json b/packages/dnode/project.json
new file mode 100644
index 000000000..3febd644b
--- /dev/null
+++ b/packages/dnode/project.json
@@ -0,0 +1,57 @@
+{
+  "$schema": "../../node_modules/nx/schemas/project-schema.json",
+  "sourceRoot": "packages/dnode/src",
+  "projectType": "library",
+  "targets": {
+    "build": {
+      "executor": "@nrwl/js:tsc",
+      "outputs": ["{options.outputPath}"],
+      "options": {
+        "outputPath": "dist/packages/dnode",
+        "main": "packages/dnode/src/index.ts",
+        "tsConfig": "packages/dnode/tsconfig.lib.json",
+        "assets": ["packages/dnode/*.md"]
+      }
+    },
+    "lint": {
+      "executor": "@nrwl/linter:eslint",
+      "outputs": ["{options.outputFile}"],
+      "options": {
+        "lintFilePatterns": ["packages/dnode/**/*.ts"]
+      }
+    },
+    "test": {
+      "executor": "@nrwl/workspace:run-commands",
+      "outputs": ["coverage/packages/dnode"],
+      "options": {
+        "commands": ["cd packages/dnode && yarn run test"],
+        "passWithNoTests": true
+      }
+    },
+    "ci-version": {
+      "executor": "@jscutlery/semver:version",
+      "options": {
+        "preset": "angular",
+        "commitMessageFormat": "ci(${projectName}): 🎉 cut release to ${projectName}-v${version}",
+        "postTargets": ["dnode:build", "dnode:ci-publish"]
+      }
+    },
+    "ci-version-beta": {
+      "executor": "@jscutlery/semver:version",
+      "options": {
+        "preset": "angular",
+        "commitMessageFormat": "ci(${projectName}): 🎉 cut beta release to ${projectName}-v${version}",
+        "postTargets": ["dnode:build", "dnode:ci-publish"],
+        "version": "prerelease",
+        "preid": "alpha"
+      }
+    },
+    "ci-publish": {
+      "executor": "@nrwl/workspace:run-commands",
+      "options": {
+        "command": "node tools/scripts/publish.mjs dnode"
+      }
+    }
+  },
+  "tags": []
+}
diff --git a/packages/dnode/src/index.ts b/packages/dnode/src/index.ts
new file mode 100644
index 000000000..f41a696fd
--- /dev/null
+++ b/packages/dnode/src/index.ts
@@ -0,0 +1 @@
+export * from './lib';
diff --git a/packages/dnode/src/lib/abis/comm.ts b/packages/dnode/src/lib/abis/comm.ts
new file mode 100644
index 000000000..31b7c27d7
--- /dev/null
+++ b/packages/dnode/src/lib/abis/comm.ts
@@ -0,0 +1,520 @@
+export const commABI = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'address',
+        name: 'delegate',
+        type: 'address',
+      },
+    ],
+    name: 'AddDelegate',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: 'string',
+        name: '_chainName',
+        type: 'string',
+      },
+      {
+        indexed: true,
+        internalType: 'uint256',
+        name: '_chainID',
+        type: 'uint256',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: '_channelOwnerAddress',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'string',
+        name: '_ethereumChannelAddress',
+        type: 'string',
+      },
+    ],
+    name: 'ChannelAlias',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'owner',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'bytes',
+        name: 'publickey',
+        type: 'bytes',
+      },
+    ],
+    name: 'PublicKeyRegistered',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'address',
+        name: 'delegate',
+        type: 'address',
+      },
+    ],
+    name: 'RemoveDelegate',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'recipient',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'bytes',
+        name: 'identity',
+        type: 'bytes',
+      },
+    ],
+    name: 'SendNotification',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      { indexed: true, internalType: 'address', name: 'user', type: 'address' },
+    ],
+    name: 'Subscribe',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      { indexed: true, internalType: 'address', name: 'user', type: 'address' },
+    ],
+    name: 'Unsubscribe',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: 'address',
+        name: '_channel',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'address',
+        name: '_user',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: '_notifID',
+        type: 'uint256',
+      },
+      {
+        indexed: false,
+        internalType: 'string',
+        name: '_notifSettings',
+        type: 'string',
+      },
+    ],
+    name: 'UserNotifcationSettingsAdded',
+    type: 'event',
+  },
+  {
+    inputs: [],
+    name: 'DOMAIN_TYPEHASH',
+    outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'EPNSCoreAddress',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'NAME_HASH',
+    outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'SEND_NOTIFICATION_TYPEHASH',
+    outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'SUBSCRIBE_TYPEHASH',
+    outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'UNSUBSCRIBE_TYPEHASH',
+    outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '_delegate', type: 'address' }],
+    name: 'addDelegate',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address[]', name: '_channelList', type: 'address[]' },
+    ],
+    name: 'batchSubscribe',
+    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address[]', name: '_channelList', type: 'address[]' },
+    ],
+    name: 'batchUnsubscribe',
+    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'bytes', name: '_publicKey', type: 'bytes' }],
+    name: 'broadcastUserPublicKey',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'chainID',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'chainName',
+    outputs: [{ internalType: 'string', name: '', type: 'string' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_channel', type: 'address' },
+      { internalType: 'uint256', name: '_notifID', type: 'uint256' },
+      { internalType: 'string', name: '_notifSettings', type: 'string' },
+    ],
+    name: 'changeUserChannelSettings',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'completeMigration',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '', type: 'address' },
+      { internalType: 'address', name: '', type: 'address' },
+    ],
+    name: 'delegatedNotificationSenders',
+    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'bytes', name: '_publicKey', type: 'bytes' }],
+    name: 'getWalletFromPublicKey',
+    outputs: [{ internalType: 'address', name: 'wallet', type: 'address' }],
+    stateMutability: 'pure',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'governance',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_pushChannelAdmin', type: 'address' },
+      { internalType: 'string', name: '_chainName', type: 'string' },
+    ],
+    name: 'initialize',
+    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'isMigrationComplete',
+    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_channel', type: 'address' },
+      { internalType: 'address', name: '_user', type: 'address' },
+    ],
+    name: 'isUserSubscribed',
+    outputs: [{ internalType: 'bool', name: 'isSubscriber', type: 'bool' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    name: 'mapAddressUsers',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'uint256', name: '_startIndex', type: 'uint256' },
+      { internalType: 'uint256', name: '_endIndex', type: 'uint256' },
+      { internalType: 'address[]', name: '_channelList', type: 'address[]' },
+      { internalType: 'address[]', name: '_usersList', type: 'address[]' },
+    ],
+    name: 'migrateSubscribeData',
+    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'name',
+    outputs: [{ internalType: 'string', name: '', type: 'string' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '', type: 'address' }],
+    name: 'nonces',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'pushChannelAdmin',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '_delegate', type: 'address' }],
+    name: 'removeDelegate',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_channel', type: 'address' },
+      { internalType: 'address', name: '_recipient', type: 'address' },
+      { internalType: 'bytes', name: '_identity', type: 'bytes' },
+      { internalType: 'uint256', name: 'nonce', type: 'uint256' },
+      { internalType: 'uint256', name: 'expiry', type: 'uint256' },
+      { internalType: 'uint8', name: 'v', type: 'uint8' },
+      { internalType: 'bytes32', name: 'r', type: 'bytes32' },
+      { internalType: 'bytes32', name: 's', type: 'bytes32' },
+    ],
+    name: 'sendNotifBySig',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_channel', type: 'address' },
+      { internalType: 'address', name: '_recipient', type: 'address' },
+      { internalType: 'bytes', name: '_identity', type: 'bytes' },
+    ],
+    name: 'sendNotification',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_coreAddress', type: 'address' },
+    ],
+    name: 'setEPNSCoreAddress',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_governanceAddress', type: 'address' },
+    ],
+    name: 'setGovernanceAddress',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '_channel', type: 'address' }],
+    name: 'subscribe',
+    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: 'channel', type: 'address' },
+      { internalType: 'uint256', name: 'nonce', type: 'uint256' },
+      { internalType: 'uint256', name: 'expiry', type: 'uint256' },
+      { internalType: 'uint8', name: 'v', type: 'uint8' },
+      { internalType: 'bytes32', name: 'r', type: 'bytes32' },
+      { internalType: 'bytes32', name: 's', type: 'bytes32' },
+    ],
+    name: 'subscribeBySig',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_channel', type: 'address' },
+      { internalType: 'address', name: '_user', type: 'address' },
+    ],
+    name: 'subscribeViaCore',
+    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '_newAdmin', type: 'address' }],
+    name: 'transferPushChannelAdminControl',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '_channel', type: 'address' }],
+    name: 'unsubscribe',
+    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: 'channel', type: 'address' },
+      { internalType: 'uint256', name: 'nonce', type: 'uint256' },
+      { internalType: 'uint256', name: 'expiry', type: 'uint256' },
+      { internalType: 'uint8', name: 'v', type: 'uint8' },
+      { internalType: 'bytes32', name: 'r', type: 'bytes32' },
+      { internalType: 'bytes32', name: 's', type: 'bytes32' },
+    ],
+    name: 'unsubscribeBySig',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '', type: 'address' },
+      { internalType: 'address', name: '', type: 'address' },
+    ],
+    name: 'userToChannelNotifs',
+    outputs: [{ internalType: 'string', name: '', type: 'string' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '', type: 'address' }],
+    name: 'users',
+    outputs: [
+      { internalType: 'bool', name: 'userActivated', type: 'bool' },
+      { internalType: 'bool', name: 'publicKeyRegistered', type: 'bool' },
+      { internalType: 'uint256', name: 'userStartBlock', type: 'uint256' },
+      { internalType: 'uint256', name: 'subscribedCount', type: 'uint256' },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'usersCount',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'string', name: '_channelAddress', type: 'string' },
+    ],
+    name: 'verifyChannelAlias',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+] as const;
diff --git a/packages/dnode/src/lib/abis/core.ts b/packages/dnode/src/lib/abis/core.ts
new file mode 100644
index 000000000..6032a8b3d
--- /dev/null
+++ b/packages/dnode/src/lib/abis/core.ts
@@ -0,0 +1,957 @@
+export const coreABI = [
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'enum EPNSCoreStorageV1_5.ChannelType',
+        name: 'channelType',
+        type: 'uint8',
+      },
+      {
+        indexed: false,
+        internalType: 'bytes',
+        name: 'identity',
+        type: 'bytes',
+      },
+    ],
+    name: 'AddChannel',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'bytes',
+        name: '_subGraphData',
+        type: 'bytes',
+      },
+    ],
+    name: 'AddSubGraph',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+    ],
+    name: 'ChannelBlocked',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: 'address',
+        name: '_channel',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'totalNotifOptions',
+        type: 'uint256',
+      },
+      {
+        indexed: false,
+        internalType: 'string',
+        name: '_notifSettings',
+        type: 'string',
+      },
+      {
+        indexed: false,
+        internalType: 'string',
+        name: '_notifDescription',
+        type: 'string',
+      },
+    ],
+    name: 'ChannelNotifcationSettingsAdded',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'newOwner',
+        type: 'address',
+      },
+    ],
+    name: 'ChannelOwnershipTransfer',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'revoker',
+        type: 'address',
+      },
+    ],
+    name: 'ChannelVerificationRevoked',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'verifier',
+        type: 'address',
+      },
+    ],
+    name: 'ChannelVerified',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      { indexed: true, internalType: 'address', name: 'user', type: 'address' },
+      {
+        indexed: true,
+        internalType: 'uint256',
+        name: 'amountClaimed',
+        type: 'uint256',
+      },
+    ],
+    name: 'ChatIncentiveClaimed',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'uint256',
+        name: 'amountRefunded',
+        type: 'uint256',
+      },
+    ],
+    name: 'DeactivateChannel',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: 'address',
+        name: 'requestSender',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'address',
+        name: 'requestReceiver',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'amountForReqReceiver',
+        type: 'uint256',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'feePoolAmount',
+        type: 'uint256',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'timestamp',
+        type: 'uint256',
+      },
+    ],
+    name: 'IncentivizeChatReqReceived',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+    ],
+    name: 'Paused',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'uint256',
+        name: 'amountDeposited',
+        type: 'uint256',
+      },
+    ],
+    name: 'ReactivateChannel',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      { indexed: true, internalType: 'address', name: 'user', type: 'address' },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'rewardAmount',
+        type: 'uint256',
+      },
+    ],
+    name: 'RewardsClaimed',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      { indexed: true, internalType: 'address', name: 'user', type: 'address' },
+      {
+        indexed: true,
+        internalType: 'uint256',
+        name: 'rewardAmount',
+        type: 'uint256',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'fromEpoch',
+        type: 'uint256',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'tillEpoch',
+        type: 'uint256',
+      },
+    ],
+    name: 'RewardsHarvested',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      { indexed: true, internalType: 'address', name: 'user', type: 'address' },
+      {
+        indexed: true,
+        internalType: 'uint256',
+        name: 'amountStaked',
+        type: 'uint256',
+      },
+    ],
+    name: 'Staked',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'uint256',
+        name: 'amountRefunded',
+        type: 'uint256',
+      },
+    ],
+    name: 'TimeBoundChannelDestroyed',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+    ],
+    name: 'Unpaused',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      { indexed: true, internalType: 'address', name: 'user', type: 'address' },
+      {
+        indexed: true,
+        internalType: 'uint256',
+        name: 'amountUnstaked',
+        type: 'uint256',
+      },
+    ],
+    name: 'Unstaked',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'channel',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'bytes',
+        name: 'identity',
+        type: 'bytes',
+      },
+      {
+        indexed: true,
+        internalType: 'uint256',
+        name: 'amountDeposited',
+        type: 'uint256',
+      },
+    ],
+    name: 'UpdateChannel',
+    type: 'event',
+  },
+  {
+    inputs: [],
+    name: 'ADD_CHANNEL_MIN_FEES',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'CHANNEL_POOL_FUNDS',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'CREATE_CHANNEL_TYPEHASH',
+    outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'DOMAIN_TYPEHASH',
+    outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'FEE_AMOUNT',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'MIN_POOL_CONTRIBUTION',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'PROTOCOL_POOL_FEES',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'PUSH_TOKEN_ADDRESS',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'REFERRAL_CODE',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'UNISWAP_V2_ROUTER',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'WETH_ADDRESS',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'aDaiAddress',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'uint256', name: '_rewardAmount', type: 'uint256' },
+    ],
+    name: 'addPoolFees',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'bytes', name: '_subGraphData', type: 'bytes' }],
+    name: 'addSubGraph',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'uint256', name: '_startIndex', type: 'uint256' },
+      { internalType: 'uint256', name: '_endIndex', type: 'uint256' },
+      { internalType: 'address[]', name: '_channelList', type: 'address[]' },
+    ],
+    name: 'batchVerification',
+    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_channelAddress', type: 'address' },
+    ],
+    name: 'blockChannel',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_user', type: 'address' },
+      { internalType: 'uint256', name: '_epochId', type: 'uint256' },
+    ],
+    name: 'calculateEpochRewards',
+    outputs: [{ internalType: 'uint256', name: 'rewards', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '', type: 'address' }],
+    name: 'celebUserFunds',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    name: 'channelById',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '', type: 'address' }],
+    name: 'channelNotifSettings',
+    outputs: [{ internalType: 'string', name: '', type: 'string' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '', type: 'address' }],
+    name: 'channelUpdateCounter',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '', type: 'address' }],
+    name: 'channels',
+    outputs: [
+      {
+        internalType: 'enum EPNSCoreStorageV1_5.ChannelType',
+        name: 'channelType',
+        type: 'uint8',
+      },
+      { internalType: 'uint8', name: 'channelState', type: 'uint8' },
+      { internalType: 'address', name: 'verifiedBy', type: 'address' },
+      { internalType: 'uint256', name: 'poolContribution', type: 'uint256' },
+      { internalType: 'uint256', name: 'channelHistoricalZ', type: 'uint256' },
+      {
+        internalType: 'uint256',
+        name: 'channelFairShareCount',
+        type: 'uint256',
+      },
+      { internalType: 'uint256', name: 'channelLastUpdate', type: 'uint256' },
+      { internalType: 'uint256', name: 'channelStartBlock', type: 'uint256' },
+      { internalType: 'uint256', name: 'channelUpdateBlock', type: 'uint256' },
+      { internalType: 'uint256', name: 'channelWeight', type: 'uint256' },
+      { internalType: 'uint256', name: 'expiryTime', type: 'uint256' },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'channelsCount',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'uint256', name: '_amount', type: 'uint256' }],
+    name: 'claimChatIncentives',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'uint256', name: '_notifOptions', type: 'uint256' },
+      { internalType: 'string', name: '_notifSettings', type: 'string' },
+      { internalType: 'string', name: '_notifDescription', type: 'string' },
+      { internalType: 'uint256', name: '_amountDeposited', type: 'uint256' },
+    ],
+    name: 'createChannelSettings',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'enum EPNSCoreStorageV1_5.ChannelType',
+        name: '_channelType',
+        type: 'uint8',
+      },
+      { internalType: 'bytes', name: '_identity', type: 'bytes' },
+      { internalType: 'uint256', name: '_amount', type: 'uint256' },
+      { internalType: 'uint256', name: '_channelExpiryTime', type: 'uint256' },
+    ],
+    name: 'createChannelWithPUSH',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'daiAddress',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'uint256', name: '_tillEpoch', type: 'uint256' }],
+    name: 'daoHarvestPaginated',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'deactivateChannel',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_channelAddress', type: 'address' },
+    ],
+    name: 'destroyTimeBoundChannel',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'epnsCommunicator',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'epochDuration',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    name: 'epochRewards',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    name: 'epochToTotalStakedWeight',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'genesisEpoch',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '_channel', type: 'address' }],
+    name: 'getChannelVerfication',
+    outputs: [
+      { internalType: 'uint8', name: 'verificationStatus', type: 'uint8' },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'governance',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'groupFairShareCount',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'groupHistoricalZ',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'groupLastUpdate',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'groupNormalizedWeight',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: 'requestSender', type: 'address' },
+      { internalType: 'address', name: 'requestReceiver', type: 'address' },
+      { internalType: 'uint256', name: 'amount', type: 'uint256' },
+    ],
+    name: 'handleChatRequestData',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'harvestAll',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'uint256', name: '_tillEpoch', type: 'uint256' }],
+    name: 'harvestPaginated',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_pushChannelAdmin', type: 'address' },
+      { internalType: 'address', name: '_pushTokenAddress', type: 'address' },
+      { internalType: 'address', name: '_wethAddress', type: 'address' },
+      {
+        internalType: 'address',
+        name: '_uniswapRouterAddress',
+        type: 'address',
+      },
+      {
+        internalType: 'address',
+        name: '_lendingPoolProviderAddress',
+        type: 'address',
+      },
+      { internalType: 'address', name: '_daiAddress', type: 'address' },
+      { internalType: 'address', name: '_aDaiAddress', type: 'address' },
+      { internalType: 'uint256', name: '_referralCode', type: 'uint256' },
+    ],
+    name: 'initialize',
+    outputs: [{ internalType: 'bool', name: 'success', type: 'bool' }],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'initializeStake',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'isMigrationComplete',
+    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'uint256', name: '_from', type: 'uint256' },
+      { internalType: 'uint256', name: '_to', type: 'uint256' },
+    ],
+    name: 'lastEpochRelative',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'lendingPoolProviderAddress',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'name',
+    outputs: [{ internalType: 'string', name: '', type: 'string' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '', type: 'address' }],
+    name: 'nonces',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'pauseContract',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'paused',
+    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'previouslySetEpochRewards',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'pushChannelAdmin',
+    outputs: [{ internalType: 'address', name: '', type: 'address' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'uint256', name: '_amount', type: 'uint256' }],
+    name: 'reactivateChannel',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_commAddress', type: 'address' },
+    ],
+    name: 'setEpnsCommunicatorAddress',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'uint256', name: '_newFees', type: 'uint256' }],
+    name: 'setFeeAmount',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_governanceAddress', type: 'address' },
+    ],
+    name: 'setGovernanceAddress',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'uint256', name: '_newFees', type: 'uint256' }],
+    name: 'setMinChannelCreationFees',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'uint256', name: '_newAmount', type: 'uint256' }],
+    name: 'setMinPoolContribution',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'uint256', name: '_amount', type: 'uint256' }],
+    name: 'stake',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'totalStakedAmount',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '_newAdmin', type: 'address' }],
+    name: 'transferPushChannelAdminControl',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'unPauseContract',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'unstake',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '_channel', type: 'address' }],
+    name: 'unverifyChannel',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      { internalType: 'address', name: '_channel', type: 'address' },
+      { internalType: 'bytes', name: '_newIdentity', type: 'bytes' },
+      { internalType: 'uint256', name: '_amount', type: 'uint256' },
+    ],
+    name: 'updateChannelMeta',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '', type: 'address' }],
+    name: 'userFeesInfo',
+    outputs: [
+      { internalType: 'uint256', name: 'stakedAmount', type: 'uint256' },
+      { internalType: 'uint256', name: 'stakedWeight', type: 'uint256' },
+      { internalType: 'uint256', name: 'lastStakedBlock', type: 'uint256' },
+      { internalType: 'uint256', name: 'lastClaimedBlock', type: 'uint256' },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '', type: 'address' }],
+    name: 'usersRewardsClaimed',
+    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [{ internalType: 'address', name: '_channel', type: 'address' }],
+    name: 'verifyChannel',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+] as const;
diff --git a/packages/dnode/src/lib/abis/token.ts b/packages/dnode/src/lib/abis/token.ts
new file mode 100644
index 000000000..a68265ba9
--- /dev/null
+++ b/packages/dnode/src/lib/abis/token.ts
@@ -0,0 +1,709 @@
+export const tokenABI = [
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+    ],
+    stateMutability: 'nonpayable',
+    type: 'constructor',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'owner',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'spender',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'amount',
+        type: 'uint256',
+      },
+    ],
+    name: 'Approval',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'delegator',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'fromDelegate',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'toDelegate',
+        type: 'address',
+      },
+    ],
+    name: 'DelegateChanged',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'delegate',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'previousBalance',
+        type: 'uint256',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'newBalance',
+        type: 'uint256',
+      },
+    ],
+    name: 'DelegateVotesChanged',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'holder',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'amount',
+        type: 'uint256',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'weight',
+        type: 'uint256',
+      },
+    ],
+    name: 'HolderWeightChanged',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'from',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'to',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'amount',
+        type: 'uint256',
+      },
+    ],
+    name: 'Transfer',
+    type: 'event',
+  },
+  {
+    inputs: [],
+    name: 'DELEGATION_TYPEHASH',
+    outputs: [
+      {
+        internalType: 'bytes32',
+        name: '',
+        type: 'bytes32',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'DOMAIN_TYPEHASH',
+    outputs: [
+      {
+        internalType: 'bytes32',
+        name: '',
+        type: 'bytes32',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'PERMIT_TYPEHASH',
+    outputs: [
+      {
+        internalType: 'bytes32',
+        name: '',
+        type: 'bytes32',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+      {
+        internalType: 'address',
+        name: 'spender',
+        type: 'address',
+      },
+    ],
+    name: 'allowance',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'spender',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'rawAmount',
+        type: 'uint256',
+      },
+    ],
+    name: 'approve',
+    outputs: [
+      {
+        internalType: 'bool',
+        name: '',
+        type: 'bool',
+      },
+    ],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+    ],
+    name: 'balanceOf',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'born',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'uint256',
+        name: 'rawAmount',
+        type: 'uint256',
+      },
+    ],
+    name: 'burn',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+      {
+        internalType: 'uint32',
+        name: '',
+        type: 'uint32',
+      },
+    ],
+    name: 'checkpoints',
+    outputs: [
+      {
+        internalType: 'uint32',
+        name: 'fromBlock',
+        type: 'uint32',
+      },
+      {
+        internalType: 'uint96',
+        name: 'votes',
+        type: 'uint96',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'decimals',
+    outputs: [
+      {
+        internalType: 'uint8',
+        name: '',
+        type: 'uint8',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'delegatee',
+        type: 'address',
+      },
+    ],
+    name: 'delegate',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'delegatee',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'nonce',
+        type: 'uint256',
+      },
+      {
+        internalType: 'uint256',
+        name: 'expiry',
+        type: 'uint256',
+      },
+      {
+        internalType: 'uint8',
+        name: 'v',
+        type: 'uint8',
+      },
+      {
+        internalType: 'bytes32',
+        name: 'r',
+        type: 'bytes32',
+      },
+      {
+        internalType: 'bytes32',
+        name: 's',
+        type: 'bytes32',
+      },
+    ],
+    name: 'delegateBySig',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    name: 'delegates',
+    outputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+    ],
+    name: 'getCurrentVotes',
+    outputs: [
+      {
+        internalType: 'uint96',
+        name: '',
+        type: 'uint96',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'blockNumber',
+        type: 'uint256',
+      },
+    ],
+    name: 'getPriorVotes',
+    outputs: [
+      {
+        internalType: 'uint96',
+        name: '',
+        type: 'uint96',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    name: 'holderDelegation',
+    outputs: [
+      {
+        internalType: 'bool',
+        name: '',
+        type: 'bool',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    name: 'holderWeight',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'name',
+    outputs: [
+      {
+        internalType: 'string',
+        name: '',
+        type: 'string',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    name: 'nonces',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    name: 'numCheckpoints',
+    outputs: [
+      {
+        internalType: 'uint32',
+        name: '',
+        type: 'uint32',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'owner',
+        type: 'address',
+      },
+      {
+        internalType: 'address',
+        name: 'spender',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'rawAmount',
+        type: 'uint256',
+      },
+      {
+        internalType: 'uint256',
+        name: 'deadline',
+        type: 'uint256',
+      },
+      {
+        internalType: 'uint8',
+        name: 'v',
+        type: 'uint8',
+      },
+      {
+        internalType: 'bytes32',
+        name: 'r',
+        type: 'bytes32',
+      },
+      {
+        internalType: 'bytes32',
+        name: 's',
+        type: 'bytes32',
+      },
+    ],
+    name: 'permit',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'holder',
+        type: 'address',
+      },
+    ],
+    name: 'resetHolderWeight',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+      {
+        internalType: 'address',
+        name: 'delegate',
+        type: 'address',
+      },
+    ],
+    name: 'returnHolderDelegation',
+    outputs: [
+      {
+        internalType: 'bool',
+        name: '',
+        type: 'bool',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'returnHolderRatio',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'delegate',
+        type: 'address',
+      },
+      {
+        internalType: 'bool',
+        name: 'value',
+        type: 'bool',
+      },
+    ],
+    name: 'setHolderDelegation',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'symbol',
+    outputs: [
+      {
+        internalType: 'string',
+        name: '',
+        type: 'string',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'totalSupply',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'dst',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'rawAmount',
+        type: 'uint256',
+      },
+    ],
+    name: 'transfer',
+    outputs: [
+      {
+        internalType: 'bool',
+        name: '',
+        type: 'bool',
+      },
+    ],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'src',
+        type: 'address',
+      },
+      {
+        internalType: 'address',
+        name: 'dst',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'rawAmount',
+        type: 'uint256',
+      },
+    ],
+    name: 'transferFrom',
+    outputs: [
+      {
+        internalType: 'bool',
+        name: '',
+        type: 'bool',
+      },
+    ],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+] as const;
diff --git a/packages/dnode/src/lib/abis/validator.ts b/packages/dnode/src/lib/abis/validator.ts
new file mode 100644
index 000000000..7cb6d21ca
--- /dev/null
+++ b/packages/dnode/src/lib/abis/validator.ts
@@ -0,0 +1,1134 @@
+export const validatorABI = [
+  {
+    inputs: [],
+    stateMutability: 'nonpayable',
+    type: 'constructor',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: 'address',
+        name: 'previousAdmin',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'address',
+        name: 'newAdmin',
+        type: 'address',
+      },
+    ],
+    name: 'AdminChanged',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'beacon',
+        type: 'address',
+      },
+    ],
+    name: 'BeaconUpgraded',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: 'uint16',
+        name: 'valPerBlock',
+        type: 'uint16',
+      },
+      {
+        indexed: false,
+        internalType: 'uint16',
+        name: 'valPerBlockTarget',
+        type: 'uint16',
+      },
+    ],
+    name: 'BlockParamsUpdated',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: 'uint8',
+        name: 'version',
+        type: 'uint8',
+      },
+    ],
+    name: 'Initialized',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'ownerWallet',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'nodeWallet',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'enum ValidatorV1.NodeType',
+        name: 'nodeType',
+        type: 'uint8',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'nodeTokens',
+        type: 'uint256',
+      },
+      {
+        indexed: false,
+        internalType: 'string',
+        name: 'nodeApiBaseUrl',
+        type: 'string',
+      },
+    ],
+    name: 'NodeAdded',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: 'address',
+        name: 'nodeWallet',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'address',
+        name: 'reporterWallet',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'address[]',
+        name: 'voters',
+        type: 'address[]',
+      },
+      {
+        indexed: false,
+        internalType: 'enum ValidatorV1.VoteAction',
+        name: 'voteAction',
+        type: 'uint8',
+      },
+    ],
+    name: 'NodeReported',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'nodeWallet',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'enum ValidatorV1.NodeStatus',
+        name: 'nodeStatus',
+        type: 'uint8',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'nodeTokens',
+        type: 'uint256',
+      },
+    ],
+    name: 'NodeStatusChanged',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'previousOwner',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'newOwner',
+        type: 'address',
+      },
+    ],
+    name: 'OwnershipTransferStarted',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'previousOwner',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'newOwner',
+        type: 'address',
+      },
+    ],
+    name: 'OwnershipTransferred',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: false,
+        internalType: 'uint16',
+        name: 'nodeRandomMinCount',
+        type: 'uint16',
+      },
+      {
+        indexed: false,
+        internalType: 'uint16',
+        name: 'nodeRandomPingCount',
+        type: 'uint16',
+      },
+    ],
+    name: 'RandomParamsUpdated',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'implementation',
+        type: 'address',
+      },
+    ],
+    name: 'Upgraded',
+    type: 'event',
+  },
+  {
+    inputs: [],
+    name: 'BAN_PERCENT',
+    outputs: [
+      {
+        internalType: 'uint16',
+        name: '',
+        type: 'uint16',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'REPORTS_BEFORE_SLASH_S',
+    outputs: [
+      {
+        internalType: 'uint16',
+        name: '',
+        type: 'uint16',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'REPORTS_BEFORE_SLASH_V',
+    outputs: [
+      {
+        internalType: 'uint16',
+        name: '',
+        type: 'uint16',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'REPORT_THRESHOLD_PER_BLOCK',
+    outputs: [
+      {
+        internalType: 'uint16',
+        name: '',
+        type: 'uint16',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'SLASHES_BEFORE_BAN_S',
+    outputs: [
+      {
+        internalType: 'uint16',
+        name: '',
+        type: 'uint16',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'SLASHES_BEFORE_BAN_V',
+    outputs: [
+      {
+        internalType: 'uint16',
+        name: '',
+        type: 'uint16',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'SLASH_PERCENT',
+    outputs: [
+      {
+        internalType: 'uint16',
+        name: '',
+        type: 'uint16',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'VERSION',
+    outputs: [
+      {
+        internalType: 'string',
+        name: '',
+        type: 'string',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'acceptOwnership',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    name: 'dnodes',
+    outputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'getActiveVNodes',
+    outputs: [
+      {
+        components: [
+          {
+            internalType: 'address',
+            name: 'nodeWallet',
+            type: 'address',
+          },
+          {
+            internalType: 'string',
+            name: 'nodeApiBaseUrl',
+            type: 'string',
+          },
+        ],
+        internalType: 'struct ValidatorV1.ActiveValidator[]',
+        name: '',
+        type: 'tuple[]',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'getDNodes',
+    outputs: [
+      {
+        internalType: 'address[]',
+        name: '',
+        type: 'address[]',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'getDNodesLength',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '_nodeWallet',
+        type: 'address',
+      },
+    ],
+    name: 'getNodeInfo',
+    outputs: [
+      {
+        components: [
+          {
+            internalType: 'address',
+            name: 'ownerWallet',
+            type: 'address',
+          },
+          {
+            internalType: 'address',
+            name: 'nodeWallet',
+            type: 'address',
+          },
+          {
+            internalType: 'enum ValidatorV1.NodeType',
+            name: 'nodeType',
+            type: 'uint8',
+          },
+          {
+            internalType: 'uint256',
+            name: 'nodeTokens',
+            type: 'uint256',
+          },
+          {
+            internalType: 'string',
+            name: 'nodeApiBaseUrl',
+            type: 'string',
+          },
+          {
+            components: [
+              {
+                internalType: 'uint16',
+                name: 'reportCounter',
+                type: 'uint16',
+              },
+              {
+                internalType: 'uint16',
+                name: 'slashCounter',
+                type: 'uint16',
+              },
+              {
+                internalType: 'uint128[]',
+                name: 'reportedInBlocks',
+                type: 'uint128[]',
+              },
+              {
+                internalType: 'address[]',
+                name: 'reportedBy',
+                type: 'address[]',
+              },
+              {
+                internalType: 'uint128[]',
+                name: 'reportedKeys',
+                type: 'uint128[]',
+              },
+            ],
+            internalType: 'struct ValidatorV1.NodeCounters',
+            name: 'counters',
+            type: 'tuple',
+          },
+          {
+            internalType: 'enum ValidatorV1.NodeStatus',
+            name: 'status',
+            type: 'uint8',
+          },
+        ],
+        internalType: 'struct ValidatorV1.NodeInfo',
+        name: '',
+        type: 'tuple',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'getSNodes',
+    outputs: [
+      {
+        internalType: 'address[]',
+        name: '',
+        type: 'address[]',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'getSNodesLength',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'getVNodes',
+    outputs: [
+      {
+        internalType: 'address[]',
+        name: '',
+        type: 'address[]',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'getVNodesLength',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'uint16',
+        name: 'protocolVersion_',
+        type: 'uint16',
+      },
+      {
+        internalType: 'address',
+        name: 'pushToken_',
+        type: 'address',
+      },
+      {
+        internalType: 'uint16',
+        name: 'valPerBlockTarget_',
+        type: 'uint16',
+      },
+      {
+        internalType: 'uint16',
+        name: 'nodeRandomMinCount_',
+        type: 'uint16',
+      },
+      {
+        internalType: 'uint16',
+        name: 'nodeRandomPingCount_',
+        type: 'uint16',
+      },
+      {
+        internalType: 'uint16',
+        name: 'REPORTS_BEFORE_SLASH_V_',
+        type: 'uint16',
+      },
+      {
+        internalType: 'uint16',
+        name: 'REPORTS_BEFORE_SLASH_S_',
+        type: 'uint16',
+      },
+      {
+        internalType: 'uint16',
+        name: 'SLASHES_BEFORE_BAN_V_',
+        type: 'uint16',
+      },
+      {
+        internalType: 'uint16',
+        name: 'SLASHES_BEFORE_BAN_S_',
+        type: 'uint16',
+      },
+      {
+        internalType: 'uint16',
+        name: 'SLASH_PERCENT_',
+        type: 'uint16',
+      },
+      {
+        internalType: 'uint16',
+        name: 'BAN_PERCENT_',
+        type: 'uint16',
+      },
+    ],
+    name: 'initialize',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'minStakeD',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'minStakeS',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'minStakeV',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    name: 'nodeMap',
+    outputs: [
+      {
+        internalType: 'address',
+        name: 'ownerWallet',
+        type: 'address',
+      },
+      {
+        internalType: 'address',
+        name: 'nodeWallet',
+        type: 'address',
+      },
+      {
+        internalType: 'enum ValidatorV1.NodeType',
+        name: 'nodeType',
+        type: 'uint8',
+      },
+      {
+        internalType: 'uint256',
+        name: 'nodeTokens',
+        type: 'uint256',
+      },
+      {
+        internalType: 'string',
+        name: 'nodeApiBaseUrl',
+        type: 'string',
+      },
+      {
+        components: [
+          {
+            internalType: 'uint16',
+            name: 'reportCounter',
+            type: 'uint16',
+          },
+          {
+            internalType: 'uint16',
+            name: 'slashCounter',
+            type: 'uint16',
+          },
+          {
+            internalType: 'uint128[]',
+            name: 'reportedInBlocks',
+            type: 'uint128[]',
+          },
+          {
+            internalType: 'address[]',
+            name: 'reportedBy',
+            type: 'address[]',
+          },
+          {
+            internalType: 'uint128[]',
+            name: 'reportedKeys',
+            type: 'uint128[]',
+          },
+        ],
+        internalType: 'struct ValidatorV1.NodeCounters',
+        name: 'counters',
+        type: 'tuple',
+      },
+      {
+        internalType: 'enum ValidatorV1.NodeStatus',
+        name: 'status',
+        type: 'uint8',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'nodeRandomMinCount',
+    outputs: [
+      {
+        internalType: 'uint16',
+        name: '',
+        type: 'uint16',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'nodeRandomPingCount',
+    outputs: [
+      {
+        internalType: 'uint16',
+        name: '',
+        type: 'uint16',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'owner',
+    outputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'pendingOwner',
+    outputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'protocolVersion',
+    outputs: [
+      {
+        internalType: 'uint16',
+        name: '',
+        type: 'uint16',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'proxiableUUID',
+    outputs: [
+      {
+        internalType: 'bytes32',
+        name: '',
+        type: 'bytes32',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'from_',
+        type: 'address',
+      },
+      {
+        internalType: 'address',
+        name: 'to_',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'amount_',
+        type: 'uint256',
+      },
+    ],
+    name: 'redistributeStaked',
+    outputs: [
+      {
+        internalType: 'bool',
+        name: '',
+        type: 'bool',
+      },
+    ],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'uint256',
+        name: 'nodeTokens_',
+        type: 'uint256',
+      },
+      {
+        internalType: 'enum ValidatorV1.NodeType',
+        name: 'nodeType_',
+        type: 'uint8',
+      },
+      {
+        internalType: 'string',
+        name: 'nodeApiBaseUrl_',
+        type: 'string',
+      },
+      {
+        internalType: 'address',
+        name: 'nodeWallet_',
+        type: 'address',
+      },
+    ],
+    name: 'registerNodeAndStake',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'renounceOwnership',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'enum ValidatorV1.NodeType',
+        name: 'targetNodeType_',
+        type: 'uint8',
+      },
+      {
+        internalType: 'bytes',
+        name: 'voteBlob_',
+        type: 'bytes',
+      },
+      {
+        internalType: 'bytes[]',
+        name: 'signatures_',
+        type: 'bytes[]',
+      },
+    ],
+    name: 'reportNode',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'addr_',
+        type: 'address',
+      },
+    ],
+    name: 'setStorageContract',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    name: 'snodes',
+    outputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'storageContract',
+    outputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'totalFees',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'totalStaked',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'newOwner',
+        type: 'address',
+      },
+    ],
+    name: 'transferOwnership',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'to_',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'amount_',
+        type: 'uint256',
+      },
+    ],
+    name: 'unstakeFees',
+    outputs: [
+      {
+        internalType: 'bool',
+        name: '',
+        type: 'bool',
+      },
+    ],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'nodeWallet_',
+        type: 'address',
+      },
+    ],
+    name: 'unstakeNode',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'uint16',
+        name: 'valPerBlockTarget_',
+        type: 'uint16',
+      },
+    ],
+    name: 'updateBlockParams',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'uint16',
+        name: 'nodeRandomMinCount_',
+        type: 'uint16',
+      },
+      {
+        internalType: 'uint16',
+        name: 'nodeRandomPingCount_',
+        type: 'uint16',
+      },
+    ],
+    name: 'updateRandomParams',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'newImplementation',
+        type: 'address',
+      },
+    ],
+    name: 'upgradeTo',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'newImplementation',
+        type: 'address',
+      },
+      {
+        internalType: 'bytes',
+        name: 'data',
+        type: 'bytes',
+      },
+    ],
+    name: 'upgradeToAndCall',
+    outputs: [],
+    stateMutability: 'payable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'valPerBlock',
+    outputs: [
+      {
+        internalType: 'uint16',
+        name: '',
+        type: 'uint16',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'valPerBlockTarget',
+    outputs: [
+      {
+        internalType: 'uint16',
+        name: '',
+        type: 'uint16',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    name: 'vnodes',
+    outputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'vnodesActive',
+    outputs: [
+      {
+        internalType: 'uint16',
+        name: '',
+        type: 'uint16',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+];
diff --git a/packages/dnode/src/lib/alias/getAliasInfo.ts b/packages/dnode/src/lib/alias/getAliasInfo.ts
new file mode 100644
index 000000000..c98c8e37e
--- /dev/null
+++ b/packages/dnode/src/lib/alias/getAliasInfo.ts
@@ -0,0 +1,37 @@
+import { getAPIBaseUrls, getCAIPWithChainId } from '../helpers';
+import Constants, { ENV } from '../constants';
+import { ALIAS_CHAIN, ALIAS_CHAIN_ID } from '../config';
+import { axiosGet } from '../utils/axiosUtil';
+
+/**
+ *  GET /v1/alias/{aliasAddressinCAIP}/channel
+ */
+
+export type GetAliasInfoOptionsType = {
+  /** alias address of the ethereum channel */
+  alias: string;
+  /** name of the alias chain, can be Polygon or BSC or Optimism */
+  aliasChain: ALIAS_CHAIN;
+  env?: ENV;
+};
+
+/**
+ *  Returns the ethereum channel address of the provided alias address along with its verification status
+ */
+
+export const getAliasInfo = async (options: GetAliasInfoOptionsType) => {
+  const { alias, aliasChain, env = Constants.ENV.PROD } = options || {};
+
+  const aliasChainId: number = ALIAS_CHAIN_ID[aliasChain][env];
+
+  const _alias = getCAIPWithChainId(alias, aliasChainId, 'Alias');
+  const API_BASE_URL = await getAPIBaseUrls(env);
+  const apiEndpoint = `${API_BASE_URL}/v1/alias`;
+  const requestUrl = `${apiEndpoint}/${_alias}/channel`;
+
+  return await axiosGet(requestUrl)
+    .then((response) => response.data)
+    .catch((err) => {
+      console.error(`[EPNS-SDK] - API ${requestUrl}: `, err);
+    });
+};
diff --git a/packages/dnode/src/lib/alias/index.ts b/packages/dnode/src/lib/alias/index.ts
new file mode 100644
index 000000000..ae953d398
--- /dev/null
+++ b/packages/dnode/src/lib/alias/index.ts
@@ -0,0 +1 @@
+export * from './getAliasInfo';
diff --git a/packages/dnode/src/lib/channels/_getSubscribers.ts b/packages/dnode/src/lib/channels/_getSubscribers.ts
new file mode 100644
index 000000000..10cf311ba
--- /dev/null
+++ b/packages/dnode/src/lib/channels/_getSubscribers.ts
@@ -0,0 +1,49 @@
+import { getCAIPAddress, getAPIBaseUrls, getCAIPDetails } from '../helpers';
+import Constants, { ENV } from '../constants';
+import { axiosPost } from '../utils/axiosUtil';
+
+export type GetSubscribersOptionsType = {
+  channel: string; // plain ETH Format only
+  env?: ENV;
+};
+
+/**
+ * LEGACY SDK method, kept to support old functionality
+ * can be removed if not needed in future.
+ */
+
+const deprecationWarning = `
+ [Push SDK]: _getSubscribers() Deprecation Warning!
+ This method has been deprecated, please use the below alternatives
+ if you need to,
+  * to check if user is subscribed or not: user.getSubscriptions()
+  * get channels count: channels.getChannels()
+`;
+
+export const _getSubscribers = async (
+  options: GetSubscribersOptionsType
+): Promise<string[]> => {
+  console.warn(deprecationWarning);
+
+  const { channel, env = Constants.ENV.PROD } = options || {};
+
+  const _channelAddress = await getCAIPAddress(env, channel, 'Channel');
+
+  const channelCAIPDetails = getCAIPDetails(_channelAddress);
+  if (!channelCAIPDetails) throw Error('Invalid Channel CAIP!');
+
+  const chainId = channelCAIPDetails.networkId;
+
+  const API_BASE_URL = await getAPIBaseUrls(env);
+  const apiEndpoint = `${API_BASE_URL}/channels/_get_subscribers`;
+  const requestUrl = `${apiEndpoint}`;
+
+  const body = {
+    channel: channelCAIPDetails.address, // deprecated API expects ETH address format
+    blockchain: chainId,
+    op: 'read',
+  };
+
+  const response = await axiosPost<{ subscribers: string[] }>(requestUrl, body);
+  return response.data.subscribers;
+};
diff --git a/packages/dnode/src/lib/channels/getChannel.ts b/packages/dnode/src/lib/channels/getChannel.ts
new file mode 100644
index 000000000..976a10b86
--- /dev/null
+++ b/packages/dnode/src/lib/channels/getChannel.ts
@@ -0,0 +1,33 @@
+import { getCAIPAddress, getAPIBaseUrls } from '../helpers';
+import Constants, { ENV } from '../constants';
+import { axiosGet } from '../utils/axiosUtil';
+import { parseSettings } from '../utils/parseSettings';
+
+/**
+ *  GET /v1/channels/{addressinCAIP}
+ */
+
+export type GetChannelOptionsType = {
+  channel: string;
+  env?: ENV;
+  raw?: boolean;
+};
+
+export const getChannel = async (options: GetChannelOptionsType) => {
+  const { channel, env = Constants.ENV.PROD, raw = true } = options || {};
+
+  const _channel = await getCAIPAddress(env, channel, 'Channel');
+  const API_BASE_URL = await getAPIBaseUrls(env);
+  const apiEndpoint = `${API_BASE_URL}/v1/channels`;
+  const requestUrl = `${apiEndpoint}/${_channel}`;
+
+  return await axiosGet(requestUrl).then((response) => {
+    if (raw) return response.data;
+    else {
+      response.data.channel_settings = response.data.channel_settings
+        ? parseSettings(response.data.channel_settings)
+        : null;
+      return response.data;
+    }
+  });
+};
diff --git a/packages/dnode/src/lib/channels/getChannelNotifications.ts b/packages/dnode/src/lib/channels/getChannelNotifications.ts
new file mode 100644
index 000000000..9364ea824
--- /dev/null
+++ b/packages/dnode/src/lib/channels/getChannelNotifications.ts
@@ -0,0 +1,48 @@
+import { getCAIPAddress, getAPIBaseUrls, getQueryParams } from '../helpers';
+import Constants, { ENV } from '../constants';
+import { axiosGet } from '../utils/axiosUtil';
+import { NotifictaionType } from '../types';
+
+type GetChannelOptionsType = {
+  channel: string;
+  env?: ENV;
+  page?: number;
+  limit?: number;
+  filter?: NotifictaionType | null;
+  raw?: boolean;
+};
+
+export const getChannelNotifications = async (
+  options: GetChannelOptionsType
+) => {
+  const {
+    channel,
+    env = Constants.ENV.PROD,
+    page = Constants.PAGINATION.INITIAL_PAGE,
+    limit = Constants.PAGINATION.LIMIT,
+    filter = null,
+    raw = true,
+  } = options || {};
+
+  const _channel = await getCAIPAddress(env, channel, 'Channel');
+  const API_BASE_URL = await getAPIBaseUrls(env);
+  const apiEndpoint = `${API_BASE_URL}/v2/channels`;
+  const query = getQueryParams(
+    filter
+      ? {
+          page,
+          limit,
+          notificationType: filter,
+          raw,
+        }
+      : {
+          page,
+          limit,
+          raw,
+        }
+  );
+  const requestUrl = `${apiEndpoint}/${_channel}/notifications?${query}`;
+  return await axiosGet(requestUrl).then((response) => {
+    return response.data;
+  });
+};
diff --git a/packages/dnode/src/lib/channels/getChannels.ts b/packages/dnode/src/lib/channels/getChannels.ts
new file mode 100644
index 000000000..d9411ab64
--- /dev/null
+++ b/packages/dnode/src/lib/channels/getChannels.ts
@@ -0,0 +1,42 @@
+import { ENV } from '../constants';
+import CONSTANTS from '../constants';
+
+import { getAPIBaseUrls, getCAIPAddress } from '../helpers';
+import { axiosGet } from '../utils/axiosUtil';
+import { parseSettings } from '../utils/parseSettings';
+
+/**
+ *  GET /v1/channels/{addressinCAIP}
+ */
+
+type getChannelsOptionsType = {
+  env?: ENV;
+
+  page?: number;
+  limit?: number;
+  sort?: string;
+  order?: string;
+};
+
+export const getChannels = async (options: getChannelsOptionsType) => {
+  const {
+    env = CONSTANTS.ENV.PROD,
+    page = 1,
+    limit = 10,
+    sort = CONSTANTS.FILTER.CHANNEL_LIST.SORT.SUBSCRIBER,
+    order = CONSTANTS.FILTER.CHANNEL_LIST.ORDER.DESCENDING,
+  } = options || {};
+
+  const API_BASE_URL = await getAPIBaseUrls(env);
+  const apiEndpoint = `${API_BASE_URL}/v1/channels`;
+  const requestUrl = `${apiEndpoint}?page=${page}&limit=${limit}&sort=${sort}&order=${order}`;
+
+  return await axiosGet(requestUrl)
+    .then((response) => {
+      return response.data;
+    })
+    .catch((err) => {
+      console.error(`[Push SDK] - API ${requestUrl}: `, err);
+      throw Error(`[Push SDK] - API  - Error - API ${requestUrl} -: ${err}`);
+    });
+};
diff --git a/packages/dnode/src/lib/channels/getDelegates.ts b/packages/dnode/src/lib/channels/getDelegates.ts
new file mode 100644
index 000000000..1cf3233e7
--- /dev/null
+++ b/packages/dnode/src/lib/channels/getDelegates.ts
@@ -0,0 +1,32 @@
+import { getCAIPAddress, getAPIBaseUrls } from '../helpers';
+import Constants, { ENV } from '../constants';
+import { axiosGet } from '../utils/axiosUtil';
+
+/**
+ *  GET v1/channels/${channelAddressInCAIP}/delegates
+ */
+
+export type GetDelegatesOptionsType = {
+  /** address of the channel */
+  channel: string;
+  env?: ENV;
+};
+
+/**
+ *  Returns the list of addresses that the channel has delegated to
+ */
+
+export const getDelegates = async (options: GetDelegatesOptionsType) => {
+  const { channel, env = Constants.ENV.PROD } = options || {};
+
+  const _channel = await getCAIPAddress(env, channel, 'Channel');
+  const API_BASE_URL = await getAPIBaseUrls(env);
+  const apiEndpoint = `${API_BASE_URL}/v1/channels`;
+  const requestUrl = `${apiEndpoint}/${_channel}/delegates`;
+
+  return await axiosGet(requestUrl)
+    .then((response) => response.data?.delegates)
+    .catch((err) => {
+      console.error(`[EPNS-SDK] - API ${requestUrl}: `, err);
+    });
+};
diff --git a/packages/dnode/src/lib/channels/getSubscribers.ts b/packages/dnode/src/lib/channels/getSubscribers.ts
new file mode 100644
index 000000000..ed5f8161b
--- /dev/null
+++ b/packages/dnode/src/lib/channels/getSubscribers.ts
@@ -0,0 +1,73 @@
+import { getCAIPAddress, getAPIBaseUrls } from '../helpers';
+import Constants, { ENV } from '../constants';
+import { Subscribers } from '../types';
+import { axiosGet } from '../utils/axiosUtil';
+import { parseSubscrbersApiResponse } from '../utils/parseSubscribersAPI';
+
+/**
+ *  GET /v1/channels/:channelId/:subscribers
+ */
+
+export type GetChannelSubscribersOptionsType = {
+  channel: string; // plain ETH Format only
+  page?: number;
+  limit?: number;
+  category?: number;
+  setting?: boolean;
+  env?: ENV;
+  raw?: boolean;
+};
+
+export const getSubscribers = async (
+  options: GetChannelSubscribersOptionsType
+): Promise<Subscribers> => {
+  try {
+    const {
+      channel,
+      page = 1,
+      limit = 10,
+      category = null,
+      setting = false,
+      env = Constants.ENV.PROD,
+      raw = true,
+    } = options || {};
+
+    try {
+      if (channel == null || channel.length == 0) {
+        throw new Error(`channel cannot be null or empty`);
+      }
+
+      if (page <= 0) {
+        throw new Error('page must be greater than 0');
+      }
+
+      if (limit <= 0) {
+        throw new Error('limit must be greater than 0');
+      }
+
+      if (limit > 30) {
+        throw new Error('limit must be lesser than or equal to 30');
+      }
+      const _channel = await getCAIPAddress(env, channel, 'Channel');
+      const API_BASE_URL = await getAPIBaseUrls(env);
+      let apiEndpoint = `${API_BASE_URL}/v1/messaging/settings/${_channel}/ETH_TEST_SEPOLIA`;
+      if (category) {
+        apiEndpoint = apiEndpoint + `&category=${category}`;
+      }
+      return await axiosGet(apiEndpoint)
+        .then((response) => {
+          if (raw) return response.data;
+          else return parseSubscrbersApiResponse(response.data);
+        })
+        .catch((err) => {
+          console.error(`[Push SDK] - API ${apiEndpoint}: `, err);
+        });
+    } catch (err) {
+      console.error(`[Push SDK] - API  - Error - API send() -:  `, err);
+      throw Error(`[Push SDK] - API  - Error - API send() -: ${err}`);
+    }
+  } catch (err) {
+    console.error(`[Push SDK] - API  - Error - API send() -:  `, err);
+    throw Error(`[Push SDK] - API  - Error - API send() -: ${err}`);
+  }
+};
diff --git a/packages/dnode/src/lib/channels/index.ts b/packages/dnode/src/lib/channels/index.ts
new file mode 100644
index 000000000..74e5d3ea8
--- /dev/null
+++ b/packages/dnode/src/lib/channels/index.ts
@@ -0,0 +1,11 @@
+export * from './_getSubscribers';
+export * from './getChannel';
+export * from './getChannelNotifications';
+export * from './getChannels';
+export * from './getDelegates';
+export * from './getSubscribers';
+export * from './search';
+export * from './subscribe';
+export * from './subscribeV2';
+export * from './unsubscribe';
+export * from './unsubscribeV2';
diff --git a/packages/dnode/src/lib/channels/search.ts b/packages/dnode/src/lib/channels/search.ts
new file mode 100644
index 000000000..f001e15fb
--- /dev/null
+++ b/packages/dnode/src/lib/channels/search.ts
@@ -0,0 +1,40 @@
+import { getAPIBaseUrls, getQueryParams, getLimit } from '../helpers';
+import Constants, { ENV } from '../constants';
+import { axiosGet } from '../utils/axiosUtil';
+
+/**
+ *  GET /v1/channels/search/
+ *  optional params: page=(1)&limit=(20{min:1}{max:30})&query=(searchquery)
+ *
+ */
+
+export type SearchChannelOptionsType = {
+  query: string;
+  env?: ENV;
+  page?: number;
+  limit?: number;
+};
+
+export const search = async (options: SearchChannelOptionsType) => {
+  const {
+    query,
+    env = Constants.ENV.PROD,
+    page = Constants.PAGINATION.INITIAL_PAGE,
+    limit = Constants.PAGINATION.LIMIT,
+  } = options || {};
+
+  if (!query) throw Error('"query" not provided!');
+  const API_BASE_URL = await getAPIBaseUrls(env);
+  const apiEndpoint = `${API_BASE_URL}/v1/channels/search/`;
+  const queryObj = {
+    page,
+    limit: getLimit(limit),
+    query: query,
+  };
+  const requestUrl = `${apiEndpoint}?${getQueryParams(queryObj)}`;
+  return axiosGet(requestUrl)
+    .then((response) => response.data.channels)
+    .catch((err) => {
+      console.error(`[Push SDK] - API ${requestUrl}: `, err);
+    });
+};
diff --git a/packages/dnode/src/lib/channels/signature.helpers.ts b/packages/dnode/src/lib/channels/signature.helpers.ts
new file mode 100644
index 000000000..5cd6ad59d
--- /dev/null
+++ b/packages/dnode/src/lib/channels/signature.helpers.ts
@@ -0,0 +1,85 @@
+type channelActionType = 'Unsubscribe' | 'Subscribe';
+
+export const getDomainInformation = (
+  chainId: number,
+  verifyingContract: string
+) => {
+  return {
+    name: 'EPNS COMM V1',
+    chainId,
+    verifyingContract,
+  };
+};
+
+export const getSubscriptionMessage = (
+  channel: string,
+  userAddress: string,
+  action: channelActionType
+) => {
+  const actionTypeKey =
+    action === 'Unsubscribe' ? 'unsubscriber' : 'subscriber';
+
+  return {
+    channel,
+    [actionTypeKey]: userAddress,
+    action: action,
+  };
+};
+
+export const getSubscriptionMessageV2 = (
+  channel: string,
+  userAddress: string,
+  action: channelActionType,
+  userSetting?: string | null
+) => {
+  const actionTypeKey =
+    action === 'Unsubscribe' ? 'unsubscriber' : 'subscriber';
+  if (action == 'Subscribe') {
+    return JSON.stringify(
+      {
+        channel,
+        [actionTypeKey]: userAddress,
+        action: action,
+        userSetting: userSetting ?? '',
+      },
+      null,
+      4
+    );
+  } else {
+    return JSON.stringify(
+      {
+        channel,
+        [actionTypeKey]: userAddress,
+        action: action,
+      },
+      null,
+      4
+    );
+  }
+};
+
+export const getTypeInformation = (action: string) => {
+  if (action === 'Subscribe') {
+    return {
+      Subscribe: [
+        { name: 'channel', type: 'address' },
+        { name: 'subscriber', type: 'address' },
+        { name: 'action', type: 'string' },
+      ],
+    };
+  }
+
+  return {
+    Unsubscribe: [
+      { name: 'channel', type: 'address' },
+      { name: 'unsubscriber', type: 'address' },
+      { name: 'action', type: 'string' },
+    ],
+  };
+};
+
+export const getTypeInformationV2 = () => {
+  return {
+    Data: [{ name: 'data', type: 'string' }],
+  };
+};
diff --git a/packages/dnode/src/lib/channels/subscribe.ts b/packages/dnode/src/lib/channels/subscribe.ts
new file mode 100644
index 000000000..411c30889
--- /dev/null
+++ b/packages/dnode/src/lib/channels/subscribe.ts
@@ -0,0 +1,111 @@
+import {
+  getCAIPAddress,
+  getConfig,
+  getCAIPDetails,
+  Signer,
+  getAPIBaseUrls,
+} from '../helpers';
+import {
+  getTypeInformation,
+  getDomainInformation,
+  getSubscriptionMessage,
+} from './signature.helpers';
+import Constants, { ENV } from '../constants';
+import { SignerType } from '../types';
+import { axiosPost } from '../utils/axiosUtil';
+export type SubscribeOptionsType = {
+  signer: SignerType;
+  channelAddress: string;
+  userAddress: string;
+  verifyingContractAddress?: string;
+  origin?: string;
+  env?: ENV;
+  onSuccess?: () => void;
+  onError?: (err: Error) => void;
+};
+
+export const subscribe = async (options: SubscribeOptionsType) => {
+  const {
+    signer,
+    channelAddress,
+    userAddress,
+    verifyingContractAddress,
+    origin,
+    env = Constants.ENV.PROD,
+    onSuccess,
+    onError,
+  } = options || {};
+
+  try {
+    const _channelAddress = await getCAIPAddress(
+      env,
+      channelAddress,
+      'Channel'
+    );
+
+    const channelCAIPDetails = getCAIPDetails(_channelAddress);
+    if (!channelCAIPDetails) throw Error('Invalid Channel CAIP!');
+
+    const chainId = parseInt(channelCAIPDetails.networkId, 10);
+
+    const _userAddress = await getCAIPAddress(env, userAddress, 'User');
+
+    const userCAIPDetails = getCAIPDetails(_userAddress);
+    if (!userCAIPDetails) throw Error('Invalid User CAIP!');
+
+    const API_BASE_URL = await getAPIBaseUrls(env);
+    const { EPNS_COMMUNICATOR_CONTRACT } = getConfig(env, channelCAIPDetails);
+
+    const requestUrl = `${API_BASE_URL}/v1/channels/${_channelAddress}/subscribe`;
+
+    // get domain information
+    const domainInformation = getDomainInformation(
+      chainId,
+      verifyingContractAddress || EPNS_COMMUNICATOR_CONTRACT
+    );
+
+    // get type information
+    const typeInformation = getTypeInformation('Subscribe');
+
+    // get message
+    const messageInformation = getSubscriptionMessage(
+      channelCAIPDetails.address,
+      userCAIPDetails.address,
+      'Subscribe'
+    );
+
+    // sign a message using EIP712
+    const pushSigner = new Signer(signer);
+    const signature = await pushSigner.signTypedData(
+      domainInformation,
+      typeInformation as any,
+      messageInformation,
+      'Subscribe'
+    );
+
+    const verificationProof = signature; // might change
+
+    const body = {
+      verificationProof,
+      message: {
+        ...messageInformation,
+        channel: _channelAddress,
+        subscriber: _userAddress,
+      },
+      origin: origin,
+    };
+
+    await axiosPost(requestUrl, body);
+
+    if (typeof onSuccess === 'function') onSuccess();
+
+    return { status: 'success', message: 'successfully opted into channel' };
+  } catch (err) {
+    if (typeof onError === 'function') onError(err as Error);
+
+    return {
+      status: 'error',
+      message: err instanceof Error ? err.message : JSON.stringify(err),
+    };
+  }
+};
diff --git a/packages/dnode/src/lib/channels/subscribeV2.ts b/packages/dnode/src/lib/channels/subscribeV2.ts
new file mode 100644
index 000000000..d5bb6e039
--- /dev/null
+++ b/packages/dnode/src/lib/channels/subscribeV2.ts
@@ -0,0 +1,110 @@
+import {
+  getCAIPAddress,
+  getConfig,
+  getCAIPDetails,
+  Signer,
+  getAPIBaseUrls,
+} from '../helpers';
+import {
+  getDomainInformation,
+  getTypeInformationV2,
+  getSubscriptionMessageV2,
+} from './signature.helpers';
+import Constants, { ENV } from '../constants';
+import { SignerType } from '../types';
+import { axiosPost } from '../utils/axiosUtil';
+
+export type SubscribeOptionsV2Type = {
+  signer: SignerType;
+  channelAddress: string;
+  userAddress: string;
+  settings?: string | null;
+  verifyingContractAddress?: string;
+  env?: ENV;
+  origin?: string;
+  onSuccess?: () => void;
+  onError?: (err: Error) => void;
+};
+
+export const subscribeV2 = async (options: SubscribeOptionsV2Type) => {
+  const {
+    signer,
+    channelAddress,
+    userAddress,
+    settings = undefined,
+    verifyingContractAddress,
+    env = Constants.ENV.PROD,
+    origin,
+    onSuccess,
+    onError,
+  } = options || {};
+  try {
+    const _channelAddress = await getCAIPAddress(
+      env,
+      channelAddress,
+      'Channel'
+    );
+
+    const channelCAIPDetails = getCAIPDetails(_channelAddress);
+    if (!channelCAIPDetails) throw Error('Invalid Channel CAIP!');
+
+    const chainId = parseInt(channelCAIPDetails.networkId, 10);
+
+    const _userAddress = await getCAIPAddress(env, userAddress, 'User');
+
+    const userCAIPDetails = getCAIPDetails(_userAddress);
+    if (!userCAIPDetails) throw Error('Invalid User CAIP!');
+
+    const API_BASE_URL = await getAPIBaseUrls(env);
+    const { EPNS_COMMUNICATOR_CONTRACT } = getConfig(env, channelCAIPDetails);
+
+    const requestUrl = `${API_BASE_URL}/v1/channels/${_channelAddress}/subscribe`;
+    // get domain information
+    const domainInformation = getDomainInformation(
+      chainId,
+      verifyingContractAddress || EPNS_COMMUNICATOR_CONTRACT
+    );
+
+    // get type information
+    const typeInformation = getTypeInformationV2();
+
+    // get message
+    const messageInformation = {
+      data: getSubscriptionMessageV2(
+        channelCAIPDetails.address,
+        userCAIPDetails.address,
+        'Subscribe',
+        settings
+      ),
+    };
+    // sign a message using EIP712
+    const pushSigner = new Signer(signer);
+    const signature = await pushSigner.signTypedData(
+      domainInformation,
+      typeInformation,
+      messageInformation,
+      'Data'
+    );
+
+    const verificationProof = signature; // might change
+
+    const body = {
+      verificationProof: `eip712v2:${verificationProof}`,
+      message: messageInformation.data,
+      origin: origin,
+    };
+
+    const res = await axiosPost(requestUrl, body);
+
+    if (typeof onSuccess === 'function') onSuccess();
+
+    return { status: res.status, message: 'successfully opted into channel' };
+  } catch (err: any) {
+    if (typeof onError === 'function') onError(err as Error);
+
+    return {
+      status: err?.response?.status ?? '',
+      message: err instanceof Error ? err.message : JSON.stringify(err),
+    };
+  }
+};
diff --git a/packages/dnode/src/lib/channels/unsubscribe.ts b/packages/dnode/src/lib/channels/unsubscribe.ts
new file mode 100644
index 000000000..e9325aecc
--- /dev/null
+++ b/packages/dnode/src/lib/channels/unsubscribe.ts
@@ -0,0 +1,109 @@
+import {
+  getCAIPAddress,
+  getConfig,
+  getCAIPDetails,
+  Signer,
+  getAPIBaseUrls,
+} from '../helpers';
+import {
+  getTypeInformation,
+  getDomainInformation,
+  getSubscriptionMessage,
+} from './signature.helpers';
+import Constants, { ENV } from '../constants';
+import { SignerType } from '../types';
+import { axiosPost } from '../utils/axiosUtil';
+
+export type UnSubscribeOptionsType = {
+  signer: SignerType;
+  channelAddress: string;
+  userAddress: string;
+  verifyingContractAddress?: string;
+  env?: ENV;
+  onSuccess?: () => void;
+  onError?: (err: Error) => void;
+};
+
+export const unsubscribe = async (options: UnSubscribeOptionsType) => {
+  const {
+    signer,
+    channelAddress,
+    userAddress,
+    verifyingContractAddress,
+    env = Constants.ENV.PROD,
+    onSuccess,
+    onError,
+  } = options || {};
+
+  try {
+    const _channelAddress = await getCAIPAddress(
+      env,
+      channelAddress,
+      'Channel'
+    );
+
+    const channelCAIPDetails = getCAIPDetails(_channelAddress);
+    if (!channelCAIPDetails) throw Error('Invalid Channel CAIP!');
+
+    const chainId = parseInt(channelCAIPDetails.networkId, 10);
+
+    const _userAddress = await getCAIPAddress(env, userAddress, 'User');
+
+    const userCAIPDetails = getCAIPDetails(_userAddress);
+    if (!userCAIPDetails) throw Error('Invalid User CAIP!');
+
+    const API_BASE_URL = await getAPIBaseUrls(env);
+    const { EPNS_COMMUNICATOR_CONTRACT } = getConfig(env, channelCAIPDetails);
+
+    const requestUrl = `${API_BASE_URL}/v1/channels/${_channelAddress}/unsubscribe`;
+
+    // get domain information
+    const domainInformation = getDomainInformation(
+      chainId,
+      verifyingContractAddress || EPNS_COMMUNICATOR_CONTRACT
+    );
+
+    // get type information
+    const typeInformation = getTypeInformation('Unsubscribe');
+
+    // get message
+    const messageInformation = getSubscriptionMessage(
+      channelCAIPDetails.address,
+      userCAIPDetails.address,
+      'Unsubscribe'
+    );
+
+    // sign a message using EIP712
+    const pushSigner = new Signer(signer);
+    const signature = await pushSigner.signTypedData(
+      domainInformation,
+      typeInformation as any,
+      messageInformation,
+      'Unsubscribe'
+    );
+
+    const verificationProof = signature; // might change
+
+    const body = {
+      verificationProof,
+      message: {
+        ...messageInformation,
+        channel: _channelAddress,
+        unsubscriber: _userAddress,
+      },
+    };
+
+    await axiosPost(requestUrl, body);
+
+    if (typeof onSuccess === 'function') onSuccess();
+
+    return { status: 'success', message: 'successfully opted out channel' };
+  } catch (err) {
+    if (typeof onError === 'function') onError(err as Error);
+
+    return {
+      status: 'error',
+      message: err instanceof Error ? err.message : JSON.stringify(err),
+    };
+  }
+};
diff --git a/packages/dnode/src/lib/channels/unsubscribeV2.ts b/packages/dnode/src/lib/channels/unsubscribeV2.ts
new file mode 100644
index 000000000..5e8aba297
--- /dev/null
+++ b/packages/dnode/src/lib/channels/unsubscribeV2.ts
@@ -0,0 +1,107 @@
+import {
+  getCAIPAddress,
+  getConfig,
+  getCAIPDetails,
+  Signer,
+  getAPIBaseUrls,
+} from '../helpers';
+import {
+  getDomainInformation,
+  getTypeInformationV2,
+  getSubscriptionMessageV2,
+} from './signature.helpers';
+import Constants, { ENV } from '../constants';
+import { SignerType } from '../types';
+import { axiosPost } from '../utils/axiosUtil';
+
+export type UnSubscribeOptionsV2Type = {
+  signer: SignerType;
+  channelAddress: string;
+  userAddress: string;
+  verifyingContractAddress?: string;
+  env?: ENV;
+  onSuccess?: () => void;
+  onError?: (err: Error) => void;
+};
+
+export const unsubscribeV2 = async (options: UnSubscribeOptionsV2Type) => {
+  const {
+    signer,
+    channelAddress,
+    userAddress,
+    verifyingContractAddress,
+    env = Constants.ENV.PROD,
+    onSuccess,
+    onError,
+  } = options || {};
+
+  try {
+    const _channelAddress = await getCAIPAddress(
+      env,
+      channelAddress,
+      'Channel'
+    );
+
+    const channelCAIPDetails = getCAIPDetails(_channelAddress);
+    if (!channelCAIPDetails) throw Error('Invalid Channel CAIP!');
+
+    const chainId = parseInt(channelCAIPDetails.networkId, 10);
+
+    const _userAddress = await getCAIPAddress(env, userAddress, 'User');
+
+    const userCAIPDetails = getCAIPDetails(_userAddress);
+    if (!userCAIPDetails) throw Error('Invalid User CAIP!');
+
+    const API_BASE_URL = await getAPIBaseUrls(env);
+    const { EPNS_COMMUNICATOR_CONTRACT } = getConfig(env, channelCAIPDetails);
+
+    const requestUrl = `${API_BASE_URL}/v1/channels/${_channelAddress}/unsubscribe`;
+
+    // get domain information
+    const domainInformation = getDomainInformation(
+      chainId,
+      verifyingContractAddress || EPNS_COMMUNICATOR_CONTRACT
+    );
+
+    // get type information
+    const typeInformation = getTypeInformationV2();
+
+    // get message
+    const messageInformation = {
+      data: getSubscriptionMessageV2(
+        channelCAIPDetails.address,
+        userCAIPDetails.address,
+        'Unsubscribe'
+      ),
+    };
+
+    // sign a message using EIP712
+    const pushSigner = new Signer(signer);
+    const signature = await pushSigner.signTypedData(
+      domainInformation,
+      typeInformation,
+      messageInformation,
+      'Data'
+    );
+
+    const verificationProof = signature; // might change
+
+    const body = {
+      verificationProof: `eip712v2:${verificationProof}`,
+      message: messageInformation.data,
+    };
+
+    const res = await axiosPost(requestUrl, body);
+
+    if (typeof onSuccess === 'function') onSuccess();
+
+    return { status: res.status, message: 'successfully opted out channel' };
+  } catch (err: any) {
+    if (typeof onError === 'function') onError(err as Error);
+
+    return {
+      status: err?.response?.status ?? '',
+      message: err instanceof Error ? err.message : JSON.stringify(err),
+    };
+  }
+};
diff --git a/packages/dnode/src/lib/chat/helpers/aes.ts b/packages/dnode/src/lib/chat/helpers/aes.ts
new file mode 100644
index 000000000..98b3ca3b9
--- /dev/null
+++ b/packages/dnode/src/lib/chat/helpers/aes.ts
@@ -0,0 +1,34 @@
+import * as CryptoJS from 'crypto-js';
+
+export const aesEncrypt = ({
+  plainText,
+  secretKey,
+}: {
+  plainText: string;
+  secretKey: string;
+}): string => {
+  return CryptoJS.AES.encrypt(plainText, secretKey).toString();
+};
+
+export const aesDecrypt = ({
+  cipherText,
+  secretKey,
+}: {
+  cipherText: string;
+  secretKey: string;
+}): string => {
+  const bytes = CryptoJS.AES.decrypt(cipherText, secretKey);
+  return bytes.toString(CryptoJS.enc.Utf8);
+};
+
+export const generateRandomSecret = (length: number): string => {
+  let result = '';
+  const characters =
+    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+  const charactersLength = characters.length;
+  for (let i = 0; i < length; i++) {
+    result += characters.charAt(Math.floor(Math.random() * charactersLength));
+  }
+
+  return result;
+};
diff --git a/packages/dnode/src/lib/chat/helpers/crypto.ts b/packages/dnode/src/lib/chat/helpers/crypto.ts
new file mode 100644
index 000000000..ce6c3f3e5
--- /dev/null
+++ b/packages/dnode/src/lib/chat/helpers/crypto.ts
@@ -0,0 +1,197 @@
+import * as PGP from './pgp';
+import * as AES from './aes';
+import * as CryptoJS from 'crypto-js';
+import { walletType } from '../../types';
+import { get } from '../../user';
+import {
+  Signer,
+  decryptPGPKey,
+  decryptWithWalletRPCMethod,
+  isValidPushCAIP,
+} from '../../helpers';
+import { get as getUser } from '../../user';
+import { createUserService } from './service';
+import Constants, { ENV } from '../../constants';
+import { getDomainInformation, getTypeInformation } from './signature';
+import { IPGPHelper } from './pgp';
+
+const SIG_TYPE_V2 = 'eip712v2';
+
+export const encryptAndSign = async ({
+  plainText,
+  keys,
+  privateKeyArmored,
+  secretKey,
+}: {
+  plainText: string;
+  keys: Array<string>;
+  privateKeyArmored: string;
+  secretKey: string;
+}): Promise<{
+  cipherText: string;
+  encryptedSecret: string;
+  signature: string;
+  sigType: string;
+  encType: string;
+}> => {
+  return await encryptAndSignCore({
+    plainText,
+    keys,
+    privateKeyArmored,
+    secretKey,
+    pgpHelper: PGP.PGPHelper,
+  });
+};
+
+export const encryptAndSignCore = async ({
+  plainText,
+  keys,
+  privateKeyArmored,
+  secretKey,
+  pgpHelper,
+}: {
+  plainText: string;
+  keys: Array<string>;
+  privateKeyArmored: string;
+  secretKey: string;
+  pgpHelper: PGP.IPGPHelper;
+}): Promise<{
+  cipherText: string;
+  encryptedSecret: string;
+  signature: string;
+  sigType: string;
+  encType: string;
+}> => {
+  const cipherText: string = AES.aesEncrypt({ plainText, secretKey });
+  const encryptedSecret = await pgpHelper.pgpEncrypt({
+    plainText: secretKey,
+    keys: keys,
+  });
+  const signature: string = await pgpHelper.sign({
+    message: cipherText,
+    signingKey: privateKeyArmored,
+  });
+  return {
+    cipherText,
+    encryptedSecret,
+    signature,
+    sigType: 'pgp',
+    encType: 'pgp',
+  };
+};
+
+export const signMessageWithPGP = async ({
+  message,
+  privateKeyArmored,
+}: {
+  message: string;
+  privateKeyArmored: string;
+}): Promise<{
+  signature: string;
+  sigType: string;
+}> => {
+  return await signMessageWithPGPCore({
+    message,
+    privateKeyArmored,
+    pgpHelper: PGP.PGPHelper,
+  });
+};
+
+export const signMessageWithPGPCore = async ({
+  message,
+  privateKeyArmored,
+  pgpHelper,
+}: {
+  message: string;
+  privateKeyArmored: string;
+  pgpHelper: PGP.IPGPHelper;
+}): Promise<{
+  signature: string;
+  sigType: string;
+}> => {
+  const signature: string = await pgpHelper.sign({
+    message: message,
+    signingKey: privateKeyArmored,
+  });
+
+  return {
+    signature,
+    sigType: 'pgp',
+  };
+};
+
+export const getEip191Signature = async (
+  wallet: walletType,
+  message: string,
+  version: 'v1' | 'v2' = 'v1'
+) => {
+  if (!wallet?.signer) {
+    console.warn('This method is deprecated. Provide signer in the function');
+    // sending random signature for making it backward compatible
+    return { signature: 'xyz', sigType: 'a' };
+  }
+  const _signer = wallet?.signer;
+  // EIP191 signature
+
+  const pushSigner = new Signer(_signer);
+  const signature = await pushSigner.signMessage(message);
+  const sigType = version === 'v1' ? 'eip191' : 'eip191v2';
+  return { verificationProof: `${sigType}:${signature}` };
+};
+
+export const getEip712Signature = async (
+  wallet: walletType,
+  hash: string,
+  isDomainEmpty: boolean
+) => {
+  if (!wallet?.signer) {
+    console.warn('This method is deprecated. Provide signer in the function');
+    // sending random signature for making it backward compatible
+    return { signature: 'xyz', sigType: 'a' };
+  }
+
+  const typeInformation = getTypeInformation();
+  const _signer = wallet?.signer;
+  const pushSigner = new Signer(_signer);
+  let chainId: number;
+  try {
+    chainId = await pushSigner.getChainId();
+  } catch (err) {
+    chainId = 1;
+  }
+  const domain = getDomainInformation(chainId);
+
+  // sign a message using EIP712
+  const signedMessage = await pushSigner.signTypedData(
+    isDomainEmpty ? {} : domain,
+    typeInformation,
+    { data: hash },
+    'Data'
+  );
+  const verificationProof = isDomainEmpty
+    ? `${SIG_TYPE_V2}:${signedMessage}`
+    : `${SIG_TYPE_V2}:${chainId}:${signedMessage}`;
+  return { verificationProof };
+};
+
+export async function getDecryptedPrivateKey(
+  wallet: walletType,
+  user: any,
+  address: string,
+  env: ENV
+): Promise<string> {
+  let decryptedPrivateKey;
+  if (wallet.signer) {
+    decryptedPrivateKey = await decryptPGPKey({
+      signer: wallet.signer,
+      encryptedPGPPrivateKey: user.encryptedPrivateKey,
+      env,
+    });
+  } else {
+    decryptedPrivateKey = await decryptWithWalletRPCMethod(
+      user.encryptedPrivateKey,
+      address
+    );
+  }
+  return decryptedPrivateKey;
+}
diff --git a/packages/dnode/src/lib/chat/helpers/index.ts b/packages/dnode/src/lib/chat/helpers/index.ts
new file mode 100644
index 000000000..f69d0ed3a
--- /dev/null
+++ b/packages/dnode/src/lib/chat/helpers/index.ts
@@ -0,0 +1,6 @@
+export * from './aes';
+export * from './pgp';
+export * from './user';
+export * from './service';
+export * from './wallet';
+export * from './crypto';
diff --git a/packages/dnode/src/lib/chat/helpers/pgp.ts b/packages/dnode/src/lib/chat/helpers/pgp.ts
new file mode 100644
index 000000000..85d9992ac
--- /dev/null
+++ b/packages/dnode/src/lib/chat/helpers/pgp.ts
@@ -0,0 +1,247 @@
+import * as openpgp from 'openpgp';
+
+interface IPGPHelper {
+  generateKeyPair(): Promise<{
+    privateKeyArmored: string;
+    publicKeyArmored: string;
+  }>;
+  sign({
+    message,
+    signingKey,
+  }: {
+    message: string;
+    signingKey: string;
+  }): Promise<string>;
+  pgpEncrypt({
+    plainText,
+    keys,
+  }: {
+    plainText: string;
+    keys: Array<string>;
+  }): Promise<string>;
+  pgpDecrypt({
+    cipherText,
+    toPrivateKeyArmored,
+  }: {
+    cipherText: any;
+    toPrivateKeyArmored: string;
+  }): Promise<string>;
+  verifySignature({
+    messageContent,
+    signatureArmored,
+    publicKeyArmored,
+  }: {
+    messageContent: string;
+    signatureArmored: string;
+    publicKeyArmored: string;
+  }): Promise<void>;
+}
+
+const PGPHelper: IPGPHelper = {
+  async generateKeyPair() {
+    const keys = await openpgp.generateKey({
+      type: 'rsa',
+      rsaBits: 2048,
+      userIDs: [{ name: '', email: '' }],
+    });
+    return {
+      privateKeyArmored: keys.privateKey,
+      publicKeyArmored: keys.publicKey,
+    };
+  },
+
+  async sign({ message, signingKey }): Promise<string> {
+    const messageObject: openpgp.Message<string> = await openpgp.createMessage({
+      text: message,
+    });
+    const privateKey: openpgp.PrivateKey = await openpgp.readPrivateKey({
+      armoredKey: signingKey,
+    });
+    return <string>(
+      await openpgp.sign({
+        message: messageObject,
+        signingKeys: privateKey,
+        detached: true,
+      })
+    );
+  },
+
+  async pgpEncrypt({ plainText, keys }): Promise<string> {
+    const pgpKeys: openpgp.Key[] = [];
+
+    for (let i = 0; i < keys.length; i++) {
+      pgpKeys.push(await openpgp.readKey({ armoredKey: keys[i] }));
+    }
+    const message: openpgp.Message<string> = await openpgp.createMessage({
+      text: plainText,
+    });
+    const encrypted: string = <string>await openpgp.encrypt({
+      message: message,
+      encryptionKeys: pgpKeys,
+    });
+    return encrypted;
+  },
+
+  async pgpDecrypt({
+    cipherText,
+    toPrivateKeyArmored,
+  }: {
+    cipherText: any;
+    toPrivateKeyArmored: string;
+  }): Promise<string> {
+    const message = await openpgp.readMessage({ armoredMessage: cipherText });
+    const privateKey: openpgp.PrivateKey = await openpgp.readPrivateKey({
+      armoredKey: toPrivateKeyArmored,
+    });
+
+    const { data: decrypted } = await openpgp.decrypt({
+      message,
+      decryptionKeys: privateKey,
+    });
+
+    return decrypted as string;
+  },
+
+  async verifySignature({
+    messageContent,
+    signatureArmored,
+    publicKeyArmored,
+  }: {
+    messageContent: string;
+    signatureArmored: string;
+    publicKeyArmored: string;
+  }): Promise<void> {
+    const message: openpgp.Message<string> = await openpgp.createMessage({
+      text: messageContent,
+    });
+    const signature: openpgp.Signature = await openpgp.readSignature({
+      armoredSignature: signatureArmored,
+    });
+    const publicKey: openpgp.PublicKey = await openpgp.readKey({
+      armoredKey: publicKeyArmored,
+    });
+    const verificationResult = await openpgp.verify({
+      message,
+      signature,
+      verificationKeys: publicKey,
+    });
+    const { verified } = verificationResult.signatures[0];
+    try {
+      await verified;
+    } catch (e) {
+      throw new Error('Signature could not be verified: ' + e);
+    }
+  },
+};
+
+export { IPGPHelper, PGPHelper };
+
+export const generateKeyPair = async (): Promise<{
+  privateKeyArmored: string;
+  publicKeyArmored: string;
+}> => {
+  const keys = await openpgp.generateKey({
+    type: 'rsa',
+    rsaBits: 2048,
+    userIDs: [{ name: '', email: '' }],
+  });
+  return {
+    privateKeyArmored: keys.privateKey,
+    publicKeyArmored: keys.publicKey,
+  };
+};
+
+export const pgpEncrypt = async ({
+  plainText,
+  keys,
+}: {
+  plainText: string;
+  keys: Array<string>;
+}): Promise<string> => {
+  const pgpKeys: openpgp.Key[] = [];
+
+  for (let i = 0; i < keys.length; i++) {
+    pgpKeys.push(await openpgp.readKey({ armoredKey: keys[i] }));
+  }
+  const message: openpgp.Message<string> = await openpgp.createMessage({
+    text: plainText,
+  });
+  const encrypted: string = <string>await openpgp.encrypt({
+    message: message,
+    encryptionKeys: pgpKeys,
+  });
+  return encrypted;
+};
+
+export const sign = async ({
+  message,
+  signingKey,
+}: {
+  message: string;
+  signingKey: string;
+}): Promise<string> => {
+  const messageObject: openpgp.Message<string> = await openpgp.createMessage({
+    text: message,
+  });
+  const privateKey: openpgp.PrivateKey = await openpgp.readPrivateKey({
+    armoredKey: signingKey,
+  });
+  return <string>(
+    await openpgp.sign({
+      message: messageObject,
+      signingKeys: privateKey,
+      detached: true,
+    })
+  );
+};
+
+export const verifySignature = async ({
+  messageContent,
+  signatureArmored,
+  publicKeyArmored,
+}: {
+  messageContent: string;
+  signatureArmored: string;
+  publicKeyArmored: string;
+}): Promise<void> => {
+  const message: openpgp.Message<string> = await openpgp.createMessage({
+    text: messageContent,
+  });
+  const signature: openpgp.Signature = await openpgp.readSignature({
+    armoredSignature: signatureArmored,
+  });
+  const publicKey: openpgp.PublicKey = await openpgp.readKey({
+    armoredKey: publicKeyArmored,
+  });
+  const verificationResult = await openpgp.verify({
+    message,
+    signature,
+    verificationKeys: publicKey,
+  });
+  const { verified } = verificationResult.signatures[0];
+  try {
+    await verified;
+  } catch (e) {
+    throw new Error('Signature could not be verified: ' + e);
+  }
+};
+
+export const pgpDecrypt = async ({
+  cipherText,
+  toPrivateKeyArmored,
+}: {
+  cipherText: any;
+  toPrivateKeyArmored: string;
+}): Promise<string> => {
+  const message = await openpgp.readMessage({ armoredMessage: cipherText });
+  const privateKey: openpgp.PrivateKey = await openpgp.readPrivateKey({
+    armoredKey: toPrivateKeyArmored,
+  });
+
+  const { data: decrypted } = await openpgp.decrypt({
+    message,
+    decryptionKeys: privateKey,
+  });
+
+  return decrypted as string;
+};
diff --git a/packages/dnode/src/lib/chat/helpers/service.ts b/packages/dnode/src/lib/chat/helpers/service.ts
new file mode 100644
index 000000000..baae8fd3e
--- /dev/null
+++ b/packages/dnode/src/lib/chat/helpers/service.ts
@@ -0,0 +1,124 @@
+import Constants, { ENV } from '../../constants';
+import {
+  generateHash,
+  getAPIBaseUrls,
+  getQueryParams,
+  isValidNFTCAIP,
+  verifyProfileKeys,
+  walletToPCAIP10,
+} from '../../helpers';
+import {
+  AccountEnvOptionsType,
+  ConversationHashOptionsType,
+  walletType,
+} from '../../types';
+import { getEip191Signature } from './crypto';
+import { populateDeprecatedUser } from '../../utils/populateIUser';
+import { axiosGet, axiosPost, axiosPut } from '../../utils/axiosUtil';
+
+type CreateUserOptionsType = {
+  user: string;
+  wallet?: walletType;
+  publicKey?: string;
+  encryptedPrivateKey?: string;
+  env?: ENV;
+  origin?: string | null;
+};
+
+export const createUserService = async (options: CreateUserOptionsType) => {
+  const {
+    wallet,
+    publicKey = '',
+    encryptedPrivateKey = '',
+    env = Constants.ENV.PROD,
+    origin,
+  } = options || {};
+  let { user } = options || {};
+
+  const API_BASE_URL = await getAPIBaseUrls(env);
+
+  const requestUrl = `${API_BASE_URL}/v2/users/`;
+
+  if (isValidNFTCAIP(user)) {
+    const epoch = Math.floor(Date.now() / 1000);
+    if (user.split(':').length !== 6) {
+      user = `${user}:${epoch}`;
+    }
+  }
+  const data = {
+    caip10: walletToPCAIP10(user),
+    did: walletToPCAIP10(user),
+    publicKey,
+    encryptedPrivateKey,
+  };
+
+  const hash = generateHash(data);
+
+  const signatureObj = await getEip191Signature(wallet!, hash, 'v2');
+
+  const body = {
+    ...data,
+    origin: origin,
+    ...signatureObj,
+  };
+
+  return axiosPost(requestUrl, body)
+    .then(async (response) => {
+      if (response.data)
+        response.data.publicKey = await verifyProfileKeys(
+          response.data.encryptedPrivateKey,
+          response.data.publicKey,
+          response.data.did,
+          response.data.wallets,
+          response.data.verificationProof
+        );
+      return populateDeprecatedUser(response.data);
+    })
+    .catch((err) => {
+      throw Error(`[Push SDK] - API ${requestUrl}: ${err}`);
+    });
+};
+
+export const authUpdateUserService = async (options: CreateUserOptionsType) => {
+  const {
+    user,
+    wallet,
+    publicKey = '',
+    encryptedPrivateKey = '',
+    env = Constants.ENV.PROD,
+  } = options || {};
+
+  const API_BASE_URL = await getAPIBaseUrls(env);
+
+  const requestUrl = `${API_BASE_URL}/v2/users/${walletToPCAIP10(user)}/auth`;
+
+  const data = {
+    caip10: walletToPCAIP10(user),
+    did: walletToPCAIP10(user),
+    publicKey,
+    encryptedPrivateKey,
+  };
+
+  const hash = generateHash(data);
+
+  const signatureObj = await getEip191Signature(wallet!, hash, 'v2');
+
+  // Exclude the "did" property from the "body" object
+  const { did, ...body } = { ...data, ...signatureObj };
+
+  return axiosPut(requestUrl, body)
+    .then(async (response) => {
+      if (response.data)
+        response.data.publicKey = await verifyProfileKeys(
+          response.data.encryptedPrivateKey,
+          response.data.publicKey,
+          response.data.did,
+          response.data.wallets,
+          response.data.verificationProof
+        );
+      return populateDeprecatedUser(response.data);
+    })
+    .catch((err) => {
+      throw Error(`[Push SDK] - API ${requestUrl}: ${err}`);
+    });
+};
diff --git a/packages/dnode/src/lib/chat/helpers/signature.ts b/packages/dnode/src/lib/chat/helpers/signature.ts
new file mode 100644
index 000000000..96b22587c
--- /dev/null
+++ b/packages/dnode/src/lib/chat/helpers/signature.ts
@@ -0,0 +1,150 @@
+import {
+  recoverTypedSignature,
+  SignTypedDataVersion,
+} from '@metamask/eth-sig-util';
+import * as viem from 'viem';
+
+/**
+ *
+ * @param chainId
+ * @returns
+ */
+export const getDomainInformation = (chainId: number) => {
+  const chatVerifyingContract = '0x0000000000000000000000000000000000000000';
+  return {
+    name: 'PUSH CHAT ID',
+    chainId,
+    verifyingContract: chatVerifyingContract,
+  };
+};
+
+/**
+ *
+ * @param action
+ * @returns
+ */
+export const getTypeInformation = () => {
+  return {
+    Data: [{ name: 'data', type: 'string' }],
+  };
+};
+
+/**
+ *
+ * @param signedData
+ * @param chainId
+ * @param version
+ * @returns typedData for typedV4 EIP712 sig
+ */
+export const getTypedData = (
+  signedData: string,
+  chainId: number,
+  version: 'V1' | 'V2'
+) => {
+  const message = { data: signedData };
+  const typeInformation = getTypeInformation();
+  const domainInformation = getDomainInformation(chainId);
+  const primaryType = 'Data' as const;
+  let types: any;
+  let domain = {};
+
+  if (version === 'V1') {
+    types = {
+      EIP712Domain: [],
+      Data: typeInformation.Data,
+    };
+  } else {
+    types = {
+      EIP712Domain: [
+        { name: 'name', type: 'string' },
+        { name: 'chainId', type: 'uint256' },
+        { name: 'verifyingContract', type: 'address' },
+      ],
+      Data: typeInformation.Data,
+    };
+    domain = domainInformation;
+  }
+
+  return {
+    types,
+    primaryType,
+    domain,
+    message,
+  };
+};
+
+/**
+ *
+ * @param signature
+ * @param signedData
+ * @param address
+ * @param chainId
+ * @returns
+ */
+export const verifyProfileSignature = async (
+  verificationProof: string,
+  signedData: string,
+  address: string
+): Promise<boolean> => {
+  const SIG_TYPE_V2 = 'eip712v2';
+  const SIG_TYPE_V3 = 'eip191';
+  const SIG_TYPE_V4 = 'eip191v2';
+  let chainId: number | null = null;
+  let signature: string;
+  const sigType = verificationProof.split(':')[0];
+  if (
+    (sigType !== SIG_TYPE_V2 &&
+      sigType !== SIG_TYPE_V3 &&
+      sigType !== SIG_TYPE_V4) ||
+    verificationProof.split(':').length > 3
+  ) {
+    return false;
+  }
+  if (verificationProof.split(':').length === 2) {
+    signature = verificationProof.split(':')[1];
+  } else {
+    chainId = parseInt(verificationProof.split(':')[1]);
+    signature = verificationProof.split(':')[2];
+  }
+
+  if (sigType === SIG_TYPE_V2) {
+    try {
+      // EIP712 sig validation with empty domain
+      // V2 should be checked first rather than v1 otherwise validation will fail
+      const typedData = getTypedData(signedData, chainId as number, 'V2'); // For backward compatibility
+      const recoveredAddress = recoverTypedSignature({
+        data: typedData,
+        signature: signature,
+        version: SignTypedDataVersion.V4,
+      });
+      if (recoveredAddress.toLowerCase() === address.toLowerCase()) {
+        return true;
+      } else return false;
+    } catch (err) {
+      // EIP712 sig validation with domain details
+      const typedData = getTypedData(signedData, chainId as number, 'V1'); // For backward compatibility
+      const recoveredAddress = recoverTypedSignature({
+        data: typedData,
+        signature: signature,
+        version: SignTypedDataVersion.V4,
+      });
+      if (recoveredAddress.toLowerCase() === address.toLowerCase()) {
+        return true;
+      } else return false;
+    }
+  } else {
+    // EIP191 sig validation
+    try {
+      // EOA Wallet
+      const recoveredAddress = await viem.recoverAddress({
+        hash: viem.hashMessage(signedData),
+        signature: signature as `0x${string}`,
+      });
+      if (recoveredAddress.toLowerCase() === address.toLowerCase()) {
+        return true;
+      } else return false;
+    } catch (err) {
+      return false;
+    }
+  }
+};
diff --git a/packages/dnode/src/lib/chat/helpers/user.ts b/packages/dnode/src/lib/chat/helpers/user.ts
new file mode 100644
index 000000000..b9e672d15
--- /dev/null
+++ b/packages/dnode/src/lib/chat/helpers/user.ts
@@ -0,0 +1,63 @@
+import Constants, { ENV } from '../../constants';
+import { get, createUserCore } from '../../user';
+import { IConnectedUser, SignerType, walletType } from '../../types';
+import { getAccountAddress } from './wallet';
+import { IPGPHelper, PGPHelper, getDecryptedPrivateKey } from '.';
+
+export const getConnectedUserV2 = async (
+  wallet: walletType,
+  privateKey: string | null,
+  env: ENV
+): Promise<IConnectedUser> => {
+  return await getConnectedUserV2Core(wallet, privateKey, env, PGPHelper);
+};
+
+export const getConnectedUserV2Core = async (
+  wallet: walletType,
+  privateKey: string | null,
+  env: ENV,
+  pgpHelper: IPGPHelper
+): Promise<IConnectedUser> => {
+  const address = await getAccountAddress(wallet);
+  const user = await get({ account: address, env: env || Constants.ENV.PROD });
+  if (user?.encryptedPrivateKey) {
+    if (privateKey) {
+      return { ...user, privateKey };
+    } else {
+      console.warn(
+        "Please note that if you don't pass the pgpPrivateKey parameter, a wallet popup will appear every time the approveRequest endpoint is called. We strongly recommend passing this parameter, and it will become mandatory in future versions of the API."
+      );
+      const decryptedPrivateKey = await getDecryptedPrivateKey(
+        wallet,
+        user,
+        address,
+        env
+      );
+      return { ...user, privateKey: decryptedPrivateKey };
+    }
+  } else {
+    const createUserProps: {
+      account?: string;
+      signer?: SignerType;
+      env?: ENV;
+    } = {};
+    if (wallet.account) {
+      createUserProps.account = wallet.account;
+    }
+    if (user && user.did) {
+      createUserProps.account = user.did;
+    }
+    if (wallet.signer) {
+      createUserProps.signer = wallet.signer;
+    }
+    createUserProps.env = env;
+    const newUser = await createUserCore(createUserProps, pgpHelper);
+    const decryptedPrivateKey = await getDecryptedPrivateKey(
+      wallet,
+      newUser,
+      address,
+      env
+    );
+    return { ...newUser, privateKey: decryptedPrivateKey };
+  }
+};
diff --git a/packages/dnode/src/lib/chat/helpers/wallet.ts b/packages/dnode/src/lib/chat/helpers/wallet.ts
new file mode 100644
index 000000000..1935f188b
--- /dev/null
+++ b/packages/dnode/src/lib/chat/helpers/wallet.ts
@@ -0,0 +1,25 @@
+import { Signer, pCAIP10ToWallet } from '../../helpers';
+import { SignerType, walletType } from '../../types';
+
+export const getWallet = (
+  options: walletType
+): {
+  account: string | null;
+  signer: SignerType | null;
+} => {
+  const { account, signer } = options || {};
+
+  return {
+    account: account ? pCAIP10ToWallet(account) : account,
+    signer,
+  };
+};
+
+export const getAccountAddress = async (
+  options: walletType
+): Promise<string> => {
+  const { account, signer } = options || {};
+
+  const pushSigner = new Signer(signer as SignerType);
+  return account || (await pushSigner.getAddress()) || '';
+};
diff --git a/packages/dnode/src/lib/config.ts b/packages/dnode/src/lib/config.ts
new file mode 100644
index 000000000..9208a6ea7
--- /dev/null
+++ b/packages/dnode/src/lib/config.ts
@@ -0,0 +1,526 @@
+import { ENV } from './constants';
+import { coreABI } from './abis/core';
+import { commABI } from './abis/comm';
+import { tokenABI } from './abis/token';
+import { validatorABI } from './abis/validator';
+import {
+  mainnet,
+  polygon,
+  bsc,
+  bscTestnet,
+  optimism,
+  optimismSepolia,
+  polygonZkEvm,
+  sepolia,
+  arbitrum,
+  arbitrumSepolia,
+  fuse,
+  fuseSparknet,
+  berachainTestnet,
+  polygonAmoy,
+  polygonZkEvmCardona,
+  cyberTestnet,
+  cyber,
+  localhost,
+} from 'viem/chains';
+
+const BLOCKCHAIN_NETWORK = {
+  ETH_MAINNET: 'eip155:1',
+  ETH_SEPOLIA: 'eip155:11155111',
+  POLYGON_MAINNET: 'eip155:137',
+  POLYGON_AMOY: 'eip155:80002',
+  BSC_MAINNET: 'eip155:56',
+  BSC_TESTNET: 'eip155:97',
+  OPTIMISM_TESTNET: 'eip155:11155420',
+  OPTIMISM_MAINNET: 'eip155:10',
+  POLYGON_ZK_EVM_TESTNET: 'eip155:2442',
+  POLYGON_ZK_EVM_MAINNET: 'eip155:1101',
+  ARBITRUM_TESTNET: 'eip155:421614',
+  ARBITRUMONE_MAINNET: 'eip155:42161',
+  FUSE_TESTNET: 'eip155:123',
+  FUSE_MAINNET: 'eip155:122',
+  BERACHAIN_TESTNET: 'eip155:80085',
+  CYBER_CONNECT_TESTNET: 'eip155:111557560',
+  CYBER_CONNECT_MAINNET: 'eip155:7560',
+};
+
+export type ALIAS_CHAIN =
+  | 'POLYGON'
+  | 'BSC'
+  | 'OPTIMISM'
+  | 'POLYGONZKEVM'
+  | 'ARBITRUMONE'
+  | 'FUSE'
+  | 'BERACHAIN'
+  | 'CYBERCONNECT';
+
+export const ETH_CHAIN_ID = {
+  [ENV.PROD]: 1,
+  [ENV.STAGING]: 11155111,
+  [ENV.DEV]: 11155111,
+  [ENV.LOCAL]: 11155111,
+};
+
+export const ALIAS_CHAIN_ID: {
+  [key: string]: { [key in ENV]: number };
+} = {
+  POLYGON: {
+    [ENV.PROD]: 137,
+    [ENV.STAGING]: 80002,
+    [ENV.DEV]: 80002,
+    [ENV.LOCAL]: 80002,
+  },
+  BSC: {
+    [ENV.PROD]: 56,
+    [ENV.STAGING]: 97,
+    [ENV.DEV]: 97,
+    [ENV.LOCAL]: 97,
+  },
+  OPTIMISM: {
+    [ENV.PROD]: 10,
+    [ENV.STAGING]: 11155420,
+    [ENV.DEV]: 11155420,
+    [ENV.LOCAL]: 11155420,
+  },
+  POLYGONZKEVM: {
+    [ENV.PROD]: 1101,
+    [ENV.STAGING]: 2442,
+    [ENV.DEV]: 2442,
+    [ENV.LOCAL]: 2442,
+  },
+  ARBITRUMONE: {
+    [ENV.PROD]: 42161,
+    [ENV.STAGING]: 421614,
+    [ENV.DEV]: 421614,
+    [ENV.LOCAL]: 421614,
+  },
+  FUSE: {
+    [ENV.PROD]: 122,
+    [ENV.STAGING]: 123,
+    [ENV.DEV]: 123,
+    [ENV.LOCAL]: 123,
+  },
+  BERACHAIN: {
+    [ENV.PROD]: 0, // TODO: update this
+    [ENV.STAGING]: 80085,
+    [ENV.DEV]: 80085,
+    [ENV.LOCAL]: 80085,
+  },
+  CYBERCONNECT: {
+    [ENV.PROD]: 7560,
+    [ENV.STAGING]: 111557560,
+    [ENV.DEV]: 111557560,
+    [ENV.LOCAL]: 111557560,
+  },
+};
+
+export const CHAIN_ID = {
+  ETHEREUM: ETH_CHAIN_ID,
+  ...ALIAS_CHAIN_ID,
+};
+
+export const CHAIN_NAME: { [key: number]: string } = {
+  // eth
+  1: 'ETHEREUM',
+  11155111: 'ETHEREUM',
+  // polygon
+  137: 'POLYGON',
+  80002: 'POLYGON',
+  // bsc
+  56: 'BSC',
+  97: 'BSC',
+  // optimism
+  10: 'OPTIMISM',
+  11155420: 'OPTIMISM',
+  // plygonzkevm
+  1101: 'POLYGONZKEVM',
+  2442: 'POLYGONZKEVM',
+  // arbitrun
+  421614: 'ARBITRUN',
+  42161: 'ARBITRUM',
+  // fuse
+  122: 'FUSE',
+  123: 'FUSE',
+  // berachain
+  80085: 'BERACHAIN',
+  // cyberconnect
+  7560: 'CYBER_CONNECT_MAINNET',
+  111557560: 'CYBER_CONNECT_TESTNET',
+};
+export interface ConfigType {
+  EPNS_COMMUNICATOR_CONTRACT: string;
+}
+
+export const VIEM_CORE_CONFIG = {
+  [ENV.PROD]: {
+    NETWORK: mainnet,
+    EPNS_CORE_CONTRACT: '0x66329Fdd4042928BfCAB60b179e1538D56eeeeeE',
+  },
+  [ENV.STAGING]: {
+    NETWORK: sepolia,
+    EPNS_CORE_CONTRACT: '0x9d65129223451fbd58fc299c635cd919baf2564c',
+  },
+  [ENV.DEV]: {
+    NETWORK: sepolia,
+    EPNS_CORE_CONTRACT: '0x5ab1520e2bd519bdab2e1347eee81c00a77f4946',
+  },
+  [ENV.LOCAL]: {
+    NETWORK: sepolia,
+    EPNS_CORE_CONTRACT: '0x5ab1520e2bd519bdab2e1347eee81c00a77f4946',
+  },
+};
+
+export const CORE_CONFIG = {
+  [ENV.PROD]: {
+    EPNS_CORE_CONTRACT: '0x66329Fdd4042928BfCAB60b179e1538D56eeeeeE',
+  },
+  [ENV.STAGING]: {
+    EPNS_CORE_CONTRACT: '0x9d65129223451fbd58fc299c635cd919baf2564c',
+  },
+  [ENV.DEV]: {
+    EPNS_CORE_CONTRACT: '0x5ab1520e2bd519bdab2e1347eee81c00a77f4946',
+  },
+  [ENV.LOCAL]: {
+    EPNS_CORE_CONTRACT: '0x5ab1520e2bd519bdab2e1347eee81c00a77f4946',
+  },
+};
+
+const CONFIG = {
+  [ENV.PROD]: {
+    [BLOCKCHAIN_NETWORK.ETH_MAINNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_MAINNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.BSC_MAINNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.OPTIMISM_MAINNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_ZK_EVM_MAINNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.ARBITRUMONE_MAINNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.FUSE_MAINNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.CYBER_CONNECT_MAINNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0xbf895df410b7fcbe093973600950ba392f7e1d8e',
+    },
+  },
+  [ENV.STAGING]: {
+    [BLOCKCHAIN_NETWORK.ETH_SEPOLIA]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x0c34d54a09cfe75bccd878a469206ae77e0fe6e7',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_AMOY]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.BSC_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.OPTIMISM_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x9Dc25996ba72A2FD7E64e7a674232a683f406F1A',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_ZK_EVM_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x6e489b7af21ceb969f49a90e481274966ce9d74d',
+    },
+    [BLOCKCHAIN_NETWORK.ARBITRUM_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x9Dc25996ba72A2FD7E64e7a674232a683f406F1A',
+    },
+    [BLOCKCHAIN_NETWORK.FUSE_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.BERACHAIN_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x7b9C405e261ba671f008c20D0321f62d08C140EC',
+    },
+    [BLOCKCHAIN_NETWORK.CYBER_CONNECT_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x6e489B7af21cEb969f49A90E481274966ce9D74d',
+    },
+  },
+  [ENV.DEV]: {
+    [BLOCKCHAIN_NETWORK.ETH_SEPOLIA]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x9dDCD7ed7151afab43044E4D694FA064742C428c',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_AMOY]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x9cb3bd7550b5c92baa056fc0f08132f49508145f',
+    },
+    [BLOCKCHAIN_NETWORK.BSC_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x4132061E3349ff36cFfCadA460E10Bd4f31F7ea8',
+    },
+    [BLOCKCHAIN_NETWORK.OPTIMISM_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x754787358fac861ef904c92d54f7adb659779317',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_ZK_EVM_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x9cb3bd7550b5c92baa056fc0f08132f49508145f',
+    },
+    [BLOCKCHAIN_NETWORK.ARBITRUM_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x754787358fac861ef904c92d54f7adb659779317',
+    },
+    [BLOCKCHAIN_NETWORK.FUSE_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x7eBb54D86CF928115965DB596a3E600404dD8039',
+    },
+    [BLOCKCHAIN_NETWORK.BERACHAIN_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0xA1DF3E68D085aa6918bcc2506b24e499830Db0eB',
+    },
+    [BLOCKCHAIN_NETWORK.CYBER_CONNECT_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x9cb3bd7550B5c92baA056Fc0F08132f49508145F',
+    },
+  },
+  [ENV.LOCAL]: {
+    [BLOCKCHAIN_NETWORK.ETH_SEPOLIA]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x9dDCD7ed7151afab43044E4D694FA064742C428c',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_AMOY]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x9cb3bd7550b5c92baa056fc0f08132f49508145f',
+    },
+    [BLOCKCHAIN_NETWORK.BSC_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x4132061E3349ff36cFfCadA460E10Bd4f31F7ea8',
+    },
+    [BLOCKCHAIN_NETWORK.OPTIMISM_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x754787358fac861ef904c92d54f7adb659779317',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_ZK_EVM_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x9cb3bd7550b5c92baa056fc0f08132f49508145f',
+    },
+    [BLOCKCHAIN_NETWORK.ARBITRUM_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x754787358fac861ef904c92d54f7adb659779317',
+    },
+    [BLOCKCHAIN_NETWORK.FUSE_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x7eBb54D86CF928115965DB596a3E600404dD8039',
+    },
+    [BLOCKCHAIN_NETWORK.BERACHAIN_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0xA1DF3E68D085aa6918bcc2506b24e499830Db0eB',
+    },
+    [BLOCKCHAIN_NETWORK.CYBER_CONNECT_TESTNET]: {
+      EPNS_COMMUNICATOR_CONTRACT: '0x9cb3bd7550B5c92baA056Fc0F08132f49508145F',
+    },
+  },
+};
+
+export default CONFIG;
+
+export const TOKEN = {
+  [ENV.PROD]: '0xf418588522d5dd018b425E472991E52EBBeEEEEE',
+  [ENV.STAGING]: '0x37c779a1564DCc0e3914aB130e0e787d93e21804',
+  [ENV.DEV]: '0x37c779a1564DCc0e3914aB130e0e787d93e21804',
+  [ENV.LOCAL]: '0x37c779a1564DCc0e3914aB130e0e787d93e21804',
+};
+
+export const TOKEN_VIEM_NETWORK_MAP = {
+  [ENV.PROD]: mainnet,
+  [ENV.STAGING]: sepolia,
+  [ENV.DEV]: sepolia,
+  [ENV.LOCAL]: sepolia,
+};
+
+export const MIN_TOKEN_BALANCE = {
+  [ENV.PROD]: 50,
+  [ENV.STAGING]: 50,
+  [ENV.DEV]: 50,
+  [ENV.LOCAL]: 50,
+};
+
+export const ABIS = {
+  CORE: coreABI,
+  COMM: commABI,
+  TOKEN: tokenABI,
+  VALIDATOR: validatorABI,
+};
+
+export const CHANNEL_TYPE = {
+  TIMEBOUND: 4,
+  GENERAL: 2,
+};
+
+export const VIEM_CONFIG = {
+  [ENV.PROD]: {
+    [BLOCKCHAIN_NETWORK.ETH_MAINNET]: {
+      NETWORK: mainnet,
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_MAINNET]: {
+      NETWORK: polygon,
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.BSC_MAINNET]: {
+      NETWORK: bsc,
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.OPTIMISM_MAINNET]: {
+      NETWORK: optimism,
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_ZK_EVM_MAINNET]: {
+      NETWORK: polygonZkEvm,
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.ARBITRUMONE_MAINNET]: {
+      NETWORK: arbitrum,
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.FUSE_MAINNET]: {
+      NETWORK: fuse,
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.CYBER_CONNECT_MAINNET]: {
+      NETWORK: cyber,
+      EPNS_COMMUNICATOR_CONTRACT: '0xbf895df410b7fcbe093973600950ba392f7e1d8e',
+    },
+  },
+  [ENV.STAGING]: {
+    [BLOCKCHAIN_NETWORK.ETH_SEPOLIA]: {
+      NETWORK: sepolia,
+
+      EPNS_COMMUNICATOR_CONTRACT: '0x0c34d54a09cfe75bccd878a469206ae77e0fe6e7',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_AMOY]: {
+      NETWORK: polygonAmoy,
+
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.BSC_TESTNET]: {
+      NETWORK: bscTestnet,
+
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.OPTIMISM_TESTNET]: {
+      NETWORK: optimismSepolia,
+
+      EPNS_COMMUNICATOR_CONTRACT: '0x9Dc25996ba72A2FD7E64e7a674232a683f406F1A',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_ZK_EVM_TESTNET]: {
+      NETWORK: polygonZkEvmCardona,
+
+      EPNS_COMMUNICATOR_CONTRACT: '0x6e489b7af21ceb969f49a90e481274966ce9d74d',
+    },
+    [BLOCKCHAIN_NETWORK.ARBITRUM_TESTNET]: {
+      NETWORK: arbitrumSepolia,
+
+      EPNS_COMMUNICATOR_CONTRACT: '0x9Dc25996ba72A2FD7E64e7a674232a683f406F1A',
+    },
+    [BLOCKCHAIN_NETWORK.FUSE_TESTNET]: {
+      NETWORK: fuseSparknet,
+
+      EPNS_COMMUNICATOR_CONTRACT: '0xb3971BCef2D791bc4027BbfedFb47319A4AAaaAa',
+    },
+    [BLOCKCHAIN_NETWORK.BERACHAIN_TESTNET]: {
+      NETWORK: berachainTestnet,
+
+      EPNS_COMMUNICATOR_CONTRACT: '0x7b9C405e261ba671f008c20D0321f62d08C140EC',
+    },
+    [BLOCKCHAIN_NETWORK.CYBER_CONNECT_TESTNET]: {
+      NETWORK: cyberTestnet,
+
+      EPNS_COMMUNICATOR_CONTRACT: '0x6e489B7af21cEb969f49A90E481274966ce9D74d',
+    },
+  },
+  [ENV.DEV]: {
+    [BLOCKCHAIN_NETWORK.ETH_SEPOLIA]: {
+      NETWORK: sepolia,
+      EPNS_COMMUNICATOR_CONTRACT: '0x9dDCD7ed7151afab43044E4D694FA064742C428c',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_AMOY]: {
+      NETWORK: polygonAmoy,
+      EPNS_COMMUNICATOR_CONTRACT: '0x9cb3bd7550b5c92baa056fc0f08132f49508145f',
+    },
+    [BLOCKCHAIN_NETWORK.BSC_TESTNET]: {
+      NETWORK: bscTestnet,
+      EPNS_COMMUNICATOR_CONTRACT: '0x4132061E3349ff36cFfCadA460E10Bd4f31F7ea8',
+    },
+    [BLOCKCHAIN_NETWORK.OPTIMISM_TESTNET]: {
+      NETWORK: optimismSepolia,
+      EPNS_COMMUNICATOR_CONTRACT: '0x754787358fac861ef904c92d54f7adb659779317',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_ZK_EVM_TESTNET]: {
+      NETWORK: polygonZkEvmCardona,
+      EPNS_COMMUNICATOR_CONTRACT: '0x9cb3bd7550b5c92baa056fc0f08132f49508145f',
+    },
+    [BLOCKCHAIN_NETWORK.ARBITRUM_TESTNET]: {
+      NETWORK: arbitrumSepolia,
+      EPNS_COMMUNICATOR_CONTRACT: '0x754787358fac861ef904c92d54f7adb659779317',
+    },
+    [BLOCKCHAIN_NETWORK.FUSE_TESTNET]: {
+      NETWORK: fuseSparknet,
+      EPNS_COMMUNICATOR_CONTRACT: '0x7eBb54D86CF928115965DB596a3E600404dD8039',
+    },
+    [BLOCKCHAIN_NETWORK.BERACHAIN_TESTNET]: {
+      NETWORK: berachainTestnet,
+      EPNS_COMMUNICATOR_CONTRACT: '0xA1DF3E68D085aa6918bcc2506b24e499830Db0eB',
+    },
+    [BLOCKCHAIN_NETWORK.CYBER_CONNECT_TESTNET]: {
+      NETWORK: cyberTestnet,
+
+      EPNS_COMMUNICATOR_CONTRACT: '0x9cb3bd7550B5c92baA056Fc0F08132f49508145F',
+    },
+  },
+  [ENV.LOCAL]: {
+    [BLOCKCHAIN_NETWORK.ETH_SEPOLIA]: {
+      NETWORK: sepolia,
+      EPNS_COMMUNICATOR_CONTRACT: '0x9dDCD7ed7151afab43044E4D694FA064742C428c',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_AMOY]: {
+      NETWORK: polygonAmoy,
+      EPNS_COMMUNICATOR_CONTRACT: '0x9cb3bd7550b5c92baa056fc0f08132f49508145f',
+    },
+    [BLOCKCHAIN_NETWORK.BSC_TESTNET]: {
+      NETWORK: bscTestnet,
+      EPNS_COMMUNICATOR_CONTRACT: '0x4132061E3349ff36cFfCadA460E10Bd4f31F7ea8',
+    },
+    [BLOCKCHAIN_NETWORK.OPTIMISM_TESTNET]: {
+      NETWORK: optimismSepolia,
+      EPNS_COMMUNICATOR_CONTRACT: '0x754787358fac861ef904c92d54f7adb659779317',
+    },
+    [BLOCKCHAIN_NETWORK.POLYGON_ZK_EVM_TESTNET]: {
+      NETWORK: polygonZkEvmCardona,
+      EPNS_COMMUNICATOR_CONTRACT: '0x9cb3bd7550b5c92baa056fc0f08132f49508145f',
+    },
+    [BLOCKCHAIN_NETWORK.ARBITRUM_TESTNET]: {
+      NETWORK: arbitrumSepolia,
+      EPNS_COMMUNICATOR_CONTRACT: '0x754787358fac861ef904c92d54f7adb659779317',
+    },
+    [BLOCKCHAIN_NETWORK.FUSE_TESTNET]: {
+      NETWORK: fuseSparknet,
+      EPNS_COMMUNICATOR_CONTRACT: '0x7eBb54D86CF928115965DB596a3E600404dD8039',
+    },
+    [BLOCKCHAIN_NETWORK.BERACHAIN_TESTNET]: {
+      NETWORK: berachainTestnet,
+      EPNS_COMMUNICATOR_CONTRACT: '0xA1DF3E68D085aa6918bcc2506b24e499830Db0eB',
+    },
+    [BLOCKCHAIN_NETWORK.CYBER_CONNECT_TESTNET]: {
+      NETWORK: cyberTestnet,
+      EPNS_COMMUNICATOR_CONTRACT: '0x9cb3bd7550B5c92baA056Fc0F08132f49508145F',
+    },
+  },
+};
+
+export const ALPHA_FEATURE_CONFIG = {
+  STABLE: {
+    feature: [] as string[],
+  },
+  ALPHA: {
+    feature: [] as string[],
+  },
+};
+
+export const VALIDATOR_CONFIG = {
+  [ENV.PROD]: {
+    NETWORK: mainnet,
+    VALIDATOR_CONTRACT: 'TODO',
+  },
+  [ENV.STAGING]: {
+    NETWORK: sepolia,
+    VALIDATOR_CONTRACT: 'TODO',
+  },
+  [ENV.DEV]: {
+    NETWORK: sepolia,
+    VALIDATOR_CONTRACT: '0xb08d2cA537F6183138955eD4fCb012f94f681954',
+  },
+  [ENV.LOCAL]: {
+    NETWORK: localhost,
+    VALIDATOR_CONTRACT: '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9',
+  },
+};
diff --git a/packages/dnode/src/lib/constants.ts b/packages/dnode/src/lib/constants.ts
new file mode 100644
index 000000000..8441695ef
--- /dev/null
+++ b/packages/dnode/src/lib/constants.ts
@@ -0,0 +1,71 @@
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const packageJson = require('../../package.json');
+
+import {
+  ChannelListOrderType,
+  ChannelListSortType,
+  ChannelListType,
+} from './pushNotification/PushNotificationTypes';
+import { STREAM } from './pushstream/pushStreamTypes';
+import { NotifictaionType } from './types';
+
+/**
+ * SUPPORTED ENVIRONEMENTS
+ */
+export enum ENV {
+  PROD = 'prod',
+  STAGING = 'staging',
+  DEV = 'dev',
+  /**
+   * **This is for local development only**
+   */
+  LOCAL = 'local',
+}
+
+/**
+ * SUPPORTED ENCRYPTIONS FOR PUSH PROFILE
+ */
+export enum ENCRYPTION_TYPE {
+  PGP_V1 = 'x25519-xsalsa20-poly1305',
+  PGP_V2 = 'aes256GcmHkdfSha256',
+  PGP_V3 = 'eip191-aes256-gcm-hkdf-sha256',
+  NFTPGP_V1 = 'pgpv1:nft',
+}
+
+export const ALPHA_FEATURES = {};
+
+export const PACKAGE_BUILD = packageJson.version.includes('alpha')
+  ? 'ALPHA'
+  : 'STABLE';
+
+const CONSTANTS = {
+  ENV: ENV,
+  STREAM: STREAM,
+  ALPHA_FEATURES: ALPHA_FEATURES,
+  USER: { ENCRYPTION_TYPE: ENCRYPTION_TYPE },
+  NOTIFICATION: {
+    TYPE: NotifictaionType,
+    CHANNEL: {
+      LIST_TYPE: ChannelListType,
+    },
+  },
+  FILTER: {
+    CHANNEL_LIST: {
+      SORT: ChannelListSortType,
+      ORDER: ChannelListOrderType,
+    },
+    NOTIFICATION_TYPE: NotifictaionType,
+  },
+  PAGINATION: {
+    INITIAL_PAGE: 1,
+    LIMIT: 10,
+    LIMIT_MIN: 1,
+    LIMIT_MAX: 50,
+  },
+  ENC_TYPE_V1: 'x25519-xsalsa20-poly1305',
+  ENC_TYPE_V2: 'aes256GcmHkdfSha256',
+  ENC_TYPE_V3: 'eip191-aes256-gcm-hkdf-sha256',
+  ENC_TYPE_V4: 'pgpv1:nft',
+};
+
+export default CONSTANTS;
diff --git a/packages/dnode/src/lib/errors/httpStatus.ts b/packages/dnode/src/lib/errors/httpStatus.ts
new file mode 100644
index 000000000..62fcc6739
--- /dev/null
+++ b/packages/dnode/src/lib/errors/httpStatus.ts
@@ -0,0 +1,6 @@
+export enum HttpStatus {
+  BadRequest = 400,
+  NotFound = 404,
+  Forbidden = 403,
+  InternalError = 500,
+}
diff --git a/packages/dnode/src/lib/errors/validationError.ts b/packages/dnode/src/lib/errors/validationError.ts
new file mode 100644
index 000000000..2e3ffcd13
--- /dev/null
+++ b/packages/dnode/src/lib/errors/validationError.ts
@@ -0,0 +1,124 @@
+import { HttpStatus } from './httpStatus';
+
+export class ValidationError extends Error {
+  status: HttpStatus;
+  errorCode: string;
+  details: string;
+
+  constructor(
+    status: HttpStatus,
+    errorCode: string,
+    message: string,
+    details: string
+  ) {
+    super(message);
+    this.name = 'ValidationError';
+    this.status = status;
+    this.errorCode = errorCode;
+    this.details = details;
+  }
+
+  format(): object {
+    return {
+      status: this.status,
+      errorCode: this.errorCode,
+      message: this.message,
+      details: this.details,
+      timestamp: new Date().toISOString(),
+    };
+  }
+}
+
+export function isErrorWithResponse(error: unknown): error is {
+  response: {
+    status: number;
+    data: {
+      status: number;
+      errorCode: string;
+      message: string;
+      details: string;
+      timestamp: string;
+    };
+  };
+} {
+  return (
+    typeof error === 'object' &&
+    error !== null &&
+    'response' in error &&
+    typeof (error as { response: any }).response === 'object' &&
+    (error as { response: { status: number } }).response !== null &&
+    'status' in (error as { response: any }).response &&
+    'data' in (error as { response: any }).response &&
+    typeof (error as { response: { data: any } }).response.data === 'object' &&
+    'status' in (error as { response: { data: any } }).response.data &&
+    'errorCode' in (error as { response: { data: any } }).response.data &&
+    'message' in (error as { response: { data: any } }).response.data &&
+    'details' in (error as { response: { data: any } }).response.data &&
+    'timestamp' in (error as { response: { data: any } }).response.data
+  );
+}
+
+export function isErrorWithResponseV2(error: unknown): error is {
+  response: {
+    status: number;
+    data: {
+      error: string;
+      message: string;
+      validation: string;
+    };
+  };
+} {
+  return (
+    typeof error === 'object' &&
+    error !== null &&
+    'response' in error &&
+    typeof (error as { response: any }).response === 'object' &&
+    (error as { response: { status: number } }).response !== null &&
+    'status' in (error as { response: any }).response &&
+    'data' in (error as { response: any }).response &&
+    typeof (error as { response: { data: any } }).response.data === 'object' &&
+    'error' in (error as { response: { data: any } }).response.data &&
+    'message' in (error as { response: { data: any } }).response.data &&
+    'validation' in (error as { response: { data: any } }).response.data
+  );
+}
+
+export function handleError(error: unknown, context: string): ValidationError {
+  let status = HttpStatus.InternalError;
+  let errorCode = '00000000000';
+  let message =
+    'An unexpected error occurred. Please contact support or try again later.';
+  let details = '';
+
+  if (isErrorWithResponse(error)) {
+    status = error.response?.status || HttpStatus.InternalError;
+    if (error.response?.data) {
+      const errData = error.response.data;
+      errorCode = errData.errorCode || errorCode;
+      message = errData.message || message;
+      details = errData.details || JSON.stringify(errData);
+    }
+  } else if (isErrorWithResponseV2(error)) {
+    status = error.response?.status || HttpStatus.InternalError;
+    const errData = error.response.data;
+    message = errData.message || message;
+    details = errData.validation || JSON.stringify(errData);
+  } else if (error instanceof Error) {
+    message = error.message;
+    details = error.stack || '';
+  }
+
+  const validationError = new ValidationError(
+    status,
+    errorCode,
+    message,
+    details
+  );
+
+  const logPrefix = `[Error - API ${context}]`;
+  console.error(
+    `${logPrefix} ${JSON.stringify(validationError.format(), null, 2)}`
+  );
+
+  return validationError;
+}
diff --git a/packages/dnode/src/lib/helpers/address.ts b/packages/dnode/src/lib/helpers/address.ts
new file mode 100644
index 000000000..f50796aa5
--- /dev/null
+++ b/packages/dnode/src/lib/helpers/address.ts
@@ -0,0 +1,258 @@
+import * as viem from 'viem';
+import Constants, { ENV } from '../constants';
+import { get } from '../user';
+
+export interface AddressValidatorsType {
+  [key: string]: ({ address }: { address: string }) => boolean;
+}
+
+/**
+ * CHECK IF THE WALLET IS A VALID PUSH CAIP SCW DID
+ * @param wallet scw:eip155:chainId:address
+ * @returns boolean
+ */
+export const isValidSCWCAIP = (wallet: string) => {
+  try {
+    const walletComponent = wallet.split(':');
+    return (
+      walletComponent.length === 4 &&
+      walletComponent[0] === 'scw' &&
+      walletComponent[1] === 'eip155' &&
+      !isNaN(Number(walletComponent[2])) &&
+      Number(walletComponent[2]) > 0 &&
+      viem.isAddress(walletComponent[3])
+    );
+  } catch (err) {
+    return false;
+  }
+};
+
+/**
+ * CHECK IF THE WALLET IS A VALID PUSH CAIP NFT DID
+ * @param wallet nft:eip155:nftChainId:nftContractAddress:nftTokenId
+ * @returns boolean
+ */
+export const isValidNFTCAIP = (wallet: string): boolean => {
+  try {
+    const walletComponent = wallet.split(':');
+    return (
+      (walletComponent.length === 5 || walletComponent.length === 6) &&
+      walletComponent[0].toLowerCase() === 'nft' &&
+      !isNaN(Number(walletComponent[4])) &&
+      Number(walletComponent[4]) > 0 &&
+      !isNaN(Number(walletComponent[2])) &&
+      Number(walletComponent[2]) > 0 &&
+      viem.isAddress(walletComponent[3]) &&
+      walletComponent[1] === 'eip155'
+    );
+  } catch (err) {
+    return false;
+  }
+};
+
+/**
+ * CHECK IF THE WALLET IS A VALID PUSH CAIP EOA DID
+ * @param wallet eip155:chainId:address | eip155:address
+ * @returns
+ */
+export const isValidEOACAIP = (wallet: string): boolean => {
+  try {
+    const walletComponent = wallet.split(':');
+    if (walletComponent.length === 3) {
+      return (
+        walletComponent[0] === 'eip155' &&
+        !isNaN(Number(walletComponent[1])) &&
+        Number(walletComponent[1]) > 0 &&
+        viem.isAddress(walletComponent[2])
+      );
+    }
+    if (walletComponent.length === 2) {
+      return (
+        walletComponent[0] === 'eip155' && viem.isAddress(walletComponent[1])
+      );
+    }
+    return false;
+  } catch (err) {
+    return false;
+  }
+};
+
+/**
+ * CHECK IF THE WALLET IS A VALID PUSH CAIP
+ * @param wallet
+ * @returns boolean
+ */
+export const isValidPushCAIP = (wallet: string): boolean => {
+  return (
+    isValidEOACAIP(wallet) ||
+    isValidSCWCAIP(wallet) ||
+    isValidNFTCAIP(wallet) ||
+    viem.isAddress(wallet)
+  );
+};
+
+/**
+ * CONVERT A VALID PUSH CAIP TO A VALID PUSH DID
+ * @param wallet valid wallet CAIP
+ * @param env optional env
+ * @param chainId optional chainId
+ * @param provider optional provider
+ * @returns valid Push DID
+ */
+export const convertToValidDID = async (
+  wallet: string,
+  env: ENV = ENV.STAGING,
+  chainId?: number,
+  provider?: any
+) => {
+  /** @dev Why Not throw error? - Used by Group ChatID also */
+  if (!isValidPushCAIP(wallet)) return wallet;
+  if (
+    isValidEOACAIP(wallet) ||
+    isValidSCWCAIP(wallet) ||
+    (isValidNFTCAIP(wallet) && wallet.split(':').length === 6)
+  )
+    return wallet;
+
+  if (isValidNFTCAIP(wallet)) {
+    const user = await get({ account: wallet, env: env });
+    if (user && user.did) return user.did;
+    const epoch = Math.floor(Date.now() / 1000);
+    return `${wallet}:${epoch}`;
+  }
+
+  // TODO: Implement SCW DID CHECK
+  if (provider) {
+    try {
+      // check if onChain code exists
+    } catch (err) {
+      // Ignore if it fails
+    }
+  }
+
+  return chainId ? `eip155:${chainId}:${wallet}` : `eip155:${wallet}`;
+};
+
+/**
+ * CHECK IF THE WALLET IS A VALID FULL CAIP10
+ * @param wallet eip155:chainId:address
+ * @returns boolean
+ */
+export const isValidFullCAIP10 = (wallet: string) => {
+  const walletComponent = wallet.split(':');
+  if (isNaN(Number(walletComponent[1]))) return false;
+  return (
+    walletComponent[0] === 'eip155' &&
+    !isNaN(Number(walletComponent[1])) &&
+    Number(walletComponent[1]) > 0 &&
+    viem.isAddress(walletComponent[2])
+  );
+};
+
+const AddressValidators: AddressValidatorsType = {
+  // Ethereum
+  eip155: ({ address }: { address: string }) => {
+    return isValidPushCAIP(address);
+  },
+  // Add other chains here
+};
+
+export function validateCAIP(addressInCAIP: string) {
+  const [blockchain, networkId, address] = addressInCAIP.split(':');
+
+  if (!blockchain) return false;
+  if (!networkId) return false;
+  if (!address) return false;
+
+  if (isValidNFTCAIP(addressInCAIP)) return true;
+
+  const validatorFn = AddressValidators[blockchain];
+
+  return validatorFn({ address });
+}
+
+export type CAIPDetailsType = {
+  blockchain: string;
+  networkId: string;
+  address: string;
+};
+
+export function getCAIPDetails(addressInCAIP: string): CAIPDetailsType | null {
+  if (validateCAIP(addressInCAIP)) {
+    const [blockchain, networkId, address] = addressInCAIP.split(':');
+
+    return {
+      blockchain,
+      networkId,
+      address,
+    };
+  }
+
+  return null;
+}
+
+export function getFallbackETHCAIPAddress(env: ENV, address: string) {
+  let chainId = 1; // by default PROD
+
+  if (
+    env === Constants.ENV.DEV ||
+    env === Constants.ENV.STAGING ||
+    env === Constants.ENV.LOCAL
+  ) {
+    chainId = 11155111;
+  }
+
+  return `eip155:${chainId}:${address}`;
+}
+
+/**
+ * This helper
+ *  checks if a VALID CAIP
+ *    return the CAIP
+ *  else
+ *    check if valid ETH
+ *      return a CAIP representation of that address (EIP155 + env)
+ *    else
+ *      throw error!
+ */
+export async function getCAIPAddress(env: ENV, address: string, msg?: string) {
+  if (isValidNFTCAIP(address)) {
+    return await convertToValidDID(address, env);
+  }
+  if (validateCAIP(address)) {
+    return address;
+  } else {
+    if (isValidPushCAIP(address)) {
+      return getFallbackETHCAIPAddress(env, address);
+    } else {
+      throw Error(`Invalid Address! ${msg} \n Address: ${address}`);
+    }
+  }
+}
+
+export const getCAIPWithChainId = (
+  address: string,
+  chainId: number,
+  msg?: string
+) => {
+  if (isValidPushCAIP(address)) {
+    if (!address.includes('eip155:')) return `eip155:${chainId}:${address}`;
+    else return address;
+  } else {
+    throw Error(`Invalid Address! ${msg} \n Address: ${address}`);
+  }
+};
+
+// P = Partial CAIP
+export const walletToPCAIP10 = (account: string): string => {
+  if (isValidNFTCAIP(account) || account.includes('eip155:')) {
+    return account;
+  }
+  return 'eip155:' + account;
+};
+
+export const pCAIP10ToWallet = (wallet: string): string => {
+  if (isValidNFTCAIP(wallet)) return wallet;
+  wallet = wallet.replace('eip155:', '');
+  return wallet;
+};
diff --git a/packages/dnode/src/lib/helpers/api.ts b/packages/dnode/src/lib/helpers/api.ts
new file mode 100644
index 000000000..e465f54b5
--- /dev/null
+++ b/packages/dnode/src/lib/helpers/api.ts
@@ -0,0 +1,19 @@
+import Constants from '../constants';
+
+export function getQueryParams(obj: any) {
+  return Object.keys(obj)
+    .map((key) => {
+      return `${key}=${encodeURIComponent(obj[key])}`;
+    })
+    .join('&');
+}
+
+export function getLimit(passedLimit?: number) {
+  if (!passedLimit) return Constants.PAGINATION.LIMIT;
+
+  // if (passedLimit > Constants.PAGINATION.LIMIT_MAX) {
+  //   return Constants.PAGINATION.LIMIT_MAX;
+  // }
+
+  return passedLimit;
+}
diff --git a/packages/dnode/src/lib/helpers/cache.ts b/packages/dnode/src/lib/helpers/cache.ts
new file mode 100644
index 000000000..8f0b73c8c
--- /dev/null
+++ b/packages/dnode/src/lib/helpers/cache.ts
@@ -0,0 +1,13 @@
+import { LRUCache } from 'lru-cache';
+
+export const cache = new LRUCache<string, any>({
+  max: 200,
+  maxSize: 500 * 1024, // 500KB
+  sizeCalculation: (value, key) => {
+    return typeof value === 'string'
+      ? value.length
+      : new TextEncoder().encode(JSON.stringify(value)).length;
+  },
+  ttl: 1000 * 60 * 5, // 5 minutes
+  allowStale: false,
+});
diff --git a/packages/dnode/src/lib/helpers/config.ts b/packages/dnode/src/lib/helpers/config.ts
new file mode 100644
index 000000000..15894df17
--- /dev/null
+++ b/packages/dnode/src/lib/helpers/config.ts
@@ -0,0 +1,40 @@
+import CONFIG, { ConfigType } from '../config';
+import { ENV } from '../constants';
+import { PushValidator } from '../pushValidator/pushValidator';
+
+/**
+ * This config helper returns the EPNS communicator contract method address
+ */
+export const getConfig = (
+  env: ENV,
+  {
+    blockchain,
+    networkId,
+  }: {
+    blockchain: string;
+    networkId: string;
+  }
+): ConfigType => {
+  const blockchainSelector = `${blockchain}:${networkId}`;
+  const configuration = CONFIG[env][blockchainSelector];
+
+  if (!configuration) {
+    throw Error(`
+      [Push SDK] - cannot determine config for 
+        env: ${env},
+        blockchain: ${blockchain},
+        networkId: ${networkId}
+    `);
+  }
+
+  return configuration;
+};
+
+/**
+ * This config helper returns only the API urls
+ */
+export async function getAPIBaseUrls(env: ENV) {
+  if (!env) throw Error('ENV not provided!');
+  const pushValidator = await PushValidator.initalize({ env });
+  return `${pushValidator.activeValidatorURL}/apis`;
+}
diff --git a/packages/dnode/src/lib/helpers/crypto.ts b/packages/dnode/src/lib/helpers/crypto.ts
new file mode 100644
index 000000000..d21be8ddb
--- /dev/null
+++ b/packages/dnode/src/lib/helpers/crypto.ts
@@ -0,0 +1,593 @@
+import * as metamaskSigUtil from '@metamask/eth-sig-util';
+import {
+  decrypt as metamaskDecrypt,
+  getEncryptionPublicKey,
+} from '@metamask/eth-sig-util';
+import * as CryptoJS from 'crypto-js';
+import {
+  getAccountAddress,
+  getWallet,
+  getEip712Signature,
+  getEip191Signature,
+} from '../chat/helpers';
+import Constants, { ENV } from '../constants';
+import {
+  SignerType,
+  walletType,
+  encryptedPrivateKeyType,
+  encryptedPrivateKeyTypeV2,
+  ProgressHookType,
+  ProgressHookTypeFunction,
+} from '../types';
+import { isValidNFTCAIP, isValidPushCAIP, pCAIP10ToWallet } from './address';
+import { verifyProfileSignature } from '../chat/helpers/signature';
+import { upgrade } from '../user/upgradeUser';
+import PROGRESSHOOK from '../progressHook';
+import { Signer } from './signer';
+import * as viem from 'viem';
+import { mainnet } from 'viem/chains';
+
+const KDFSaltSize = 32; // bytes
+const AESGCMNonceSize = 12; // property iv
+
+let crypto: Crypto;
+if (typeof window !== 'undefined' && window.crypto) {
+  crypto = window.crypto;
+} else if (typeof require !== 'undefined') {
+  try {
+    // eslint-disable-next-line @typescript-eslint/no-var-requires
+    crypto = require('crypto').webcrypto;
+  } catch (e) {
+    throw new Error('Unable To load crypto');
+  }
+}
+
+/**
+ * @deprecated
+ */
+export const getPublicKey = async (options: walletType): Promise<string> => {
+  const { account, signer } = options || {};
+  const pushSigner = signer ? new Signer(signer) : undefined;
+  const address: string = account || (await pushSigner?.getAddress()) || '';
+  const metamaskProvider = viem.createWalletClient({
+    chain: mainnet,
+    transport: viem.custom((window as any).ethereum),
+  });
+  const web3Provider: any = signer?.provider?.provider || metamaskProvider;
+  const keyB64 = await web3Provider.request({
+    method: 'eth_getEncryptionPublicKey',
+    params: [address],
+  });
+  return keyB64;
+};
+
+/**
+ * @deprecated
+ * x25519-xsalsa20-poly1305 enryption
+ */
+export const encryptV1 = (
+  text: string,
+  encryptionPublicKey: string,
+  version: string
+) => {
+  const encryptedSecret = metamaskSigUtil.encrypt({
+    publicKey: encryptionPublicKey,
+    data: text,
+    version: version,
+  });
+
+  return encryptedSecret;
+};
+
+/** @deprecated */
+export const decryptWithWalletRPCMethod = async (
+  encryptedPGPPrivateKey: string,
+  account: string
+) => {
+  console.warn(
+    'decryptWithWalletRPCMethod method is DEPRECATED. Use decryptPGPKey method with signer!'
+  );
+  return await decryptPGPKey({
+    encryptedPGPPrivateKey,
+    account,
+  });
+};
+
+type decryptPgpKeyProps = {
+  encryptedPGPPrivateKey: string;
+  account?: string;
+  signer?: SignerType | null;
+  env?: ENV;
+  toUpgrade?: boolean;
+  additionalMeta?: {
+    NFTPGP_V1?: {
+      password: string;
+    };
+  };
+  progressHook?: (progress: ProgressHookType) => void;
+};
+
+export const decryptPGPKey = async (options: decryptPgpKeyProps) => {
+  const {
+    encryptedPGPPrivateKey,
+    account = null,
+    signer = null,
+    env = Constants.ENV.PROD,
+    toUpgrade = true,
+    additionalMeta = null,
+    progressHook,
+  } = options || {};
+  try {
+    if (account == null && signer == null) {
+      throw new Error(`At least one from account or signer is necessary!`);
+    }
+
+    const wallet = getWallet({ account, signer });
+    const address = await getAccountAddress(wallet);
+
+    if (!isValidPushCAIP(address)) {
+      throw new Error(`Invalid address!`);
+    }
+
+    const { version: encryptionType } = JSON.parse(encryptedPGPPrivateKey);
+    let privateKey;
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-DECRYPT-01'] as ProgressHookType);
+
+    switch (encryptionType) {
+      case Constants.ENC_TYPE_V1: {
+        if (wallet?.signer?.privateKey) {
+          privateKey = metamaskDecrypt({
+            encryptedData: JSON.parse(encryptedPGPPrivateKey),
+            privateKey: wallet?.signer?.privateKey.substring(2),
+          });
+        } else {
+          const metamaskProvider = viem.createWalletClient({
+            chain: mainnet,
+            transport: viem.custom((window as any).ethereum),
+          });
+          const web3Provider = signer?.provider?.provider || metamaskProvider;
+          privateKey = await web3Provider.request({
+            method: 'eth_decrypt',
+            params: [encryptedPGPPrivateKey, address],
+          });
+        }
+        break;
+      }
+      case Constants.ENC_TYPE_V2: {
+        if (!wallet?.signer) {
+          throw new Error(
+            'Cannot Decrypt this encryption version without signer!'
+          );
+        }
+        const { preKey: input } = JSON.parse(encryptedPGPPrivateKey);
+        const enableProfileMessage = 'Enable Push Chat Profile \n' + input;
+        let encodedPrivateKey: Uint8Array;
+        try {
+          const { verificationProof: secret } = await getEip712Signature(
+            wallet,
+            enableProfileMessage,
+            true
+          );
+          encodedPrivateKey = await decryptV2(
+            JSON.parse(encryptedPGPPrivateKey),
+            hexToBytes(secret || '')
+          );
+        } catch (err) {
+          const { verificationProof: secret } = await getEip712Signature(
+            wallet,
+            enableProfileMessage,
+            false
+          );
+          encodedPrivateKey = await decryptV2(
+            JSON.parse(encryptedPGPPrivateKey),
+            hexToBytes(secret || '')
+          );
+        }
+        const dec = new TextDecoder();
+        privateKey = dec.decode(encodedPrivateKey);
+        break;
+      }
+      case Constants.ENC_TYPE_V3: {
+        if (!wallet?.signer) {
+          throw new Error(
+            'Cannot Decrypt this encryption version without signer!'
+          );
+        }
+        const { preKey: input } = JSON.parse(encryptedPGPPrivateKey);
+        const enableProfileMessage = 'Enable Push Profile \n' + input;
+        const { verificationProof: secret } = await getEip191Signature(
+          wallet,
+          enableProfileMessage
+        );
+        const encodedPrivateKey = await decryptV2(
+          JSON.parse(encryptedPGPPrivateKey),
+          hexToBytes(secret || '')
+        );
+        const dec = new TextDecoder();
+        privateKey = dec.decode(encodedPrivateKey);
+        break;
+      }
+      case Constants.ENC_TYPE_V4: {
+        let password: string | null = null;
+        if (additionalMeta?.NFTPGP_V1) {
+          password = additionalMeta.NFTPGP_V1.password;
+        } else {
+          if (!wallet?.signer) {
+            throw new Error(
+              'Cannot Decrypt this encryption version without signer!'
+            );
+          }
+          const { encryptedPassword } = JSON.parse(encryptedPGPPrivateKey);
+          password = await decryptPGPKey({
+            encryptedPGPPrivateKey: JSON.stringify(encryptedPassword),
+            signer,
+            env,
+          });
+        }
+        const encodedPrivateKey = await decryptV2(
+          JSON.parse(encryptedPGPPrivateKey),
+          hexToBytes(stringToHex(password as string))
+        );
+        const dec = new TextDecoder();
+        privateKey = dec.decode(encodedPrivateKey);
+        break;
+      }
+      default:
+        throw new Error('Invalid Encryption Type');
+    }
+
+    // try key upgradation
+    if (signer && toUpgrade && encryptionType !== Constants.ENC_TYPE_V4) {
+      try {
+        await upgrade({ env, account: address, signer, progressHook });
+      } catch (err) {
+        // Report Progress
+        const errorProgressHook = PROGRESSHOOK[
+          'PUSH-ERROR-01'
+        ] as ProgressHookTypeFunction;
+        progressHook?.(errorProgressHook(err));
+      }
+    }
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-DECRYPT-02'] as ProgressHookType);
+    return privateKey;
+  } catch (err) {
+    // TODO: Remove Later
+    console.log(err);
+    // Report Progress
+    const errorProgressHook = PROGRESSHOOK[
+      'PUSH-ERROR-00'
+    ] as ProgressHookTypeFunction;
+    progressHook?.(errorProgressHook(decryptPGPKey.name, err));
+    throw Error(
+      `[Push SDK] - API - Error - API ${decryptPGPKey.name} -: ${JSON.stringify(
+        err
+      )}`
+    );
+  }
+};
+
+export const generateHash = (message: any): string => {
+  const hash = CryptoJS.SHA256(JSON.stringify(message)).toString(
+    CryptoJS.enc.Hex
+  );
+  return hash;
+};
+
+const getRandomValues = async (array: Uint8Array) => {
+  return crypto.getRandomValues(array);
+};
+
+const bytesToHex = (bytes: Uint8Array): string => {
+  return bytes.reduce(
+    (str, byte) => str + byte.toString(16).padStart(2, '0'),
+    ''
+  );
+};
+
+export const hexToBytes = (hex: string): Uint8Array => {
+  const bytes = new Uint8Array(hex.length / 2);
+  for (let i = 0; i < hex.length; i += 2) {
+    bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);
+  }
+  return bytes;
+};
+
+export const stringToHex = (str: string): string => {
+  let hex = '';
+  for (let i = 0; i < str.length; i++) {
+    hex += str.charCodeAt(i).toString(16).padStart(2, '0');
+  }
+  return hex;
+};
+
+// Derive AES-256-GCM key from a shared secret and salt
+const hkdf = async (
+  secret: Uint8Array,
+  salt: Uint8Array
+): Promise<CryptoKey> => {
+  const key = await crypto.subtle.importKey('raw', secret, 'HKDF', false, [
+    'deriveKey',
+  ]);
+  return crypto.subtle.deriveKey(
+    { name: 'HKDF', hash: 'SHA-256', salt, info: new ArrayBuffer(0) },
+    key,
+    { name: 'AES-GCM', length: 256 },
+    true,
+    ['encrypt', 'decrypt']
+  );
+};
+
+/** AES-GCM Encryption */
+export const encryptV2 = async (
+  data: Uint8Array,
+  secret: Uint8Array,
+  additionalData?: Uint8Array
+): Promise<encryptedPrivateKeyTypeV2> => {
+  const salt = crypto.getRandomValues(new Uint8Array(KDFSaltSize));
+  const nonce = crypto.getRandomValues(new Uint8Array(AESGCMNonceSize));
+  const key = await hkdf(secret, salt);
+
+  const aesGcmParams: AesGcmParams = {
+    name: 'AES-GCM',
+    iv: nonce,
+  };
+  if (additionalData) {
+    aesGcmParams.additionalData = additionalData;
+  }
+  const encrypted: ArrayBuffer = await crypto.subtle.encrypt(
+    aesGcmParams,
+    key,
+    data
+  );
+  return {
+    ciphertext: bytesToHex(new Uint8Array(encrypted)),
+    salt: bytesToHex(salt),
+    nonce: bytesToHex(nonce),
+  };
+};
+
+/** AES-GCM Decryption */
+export const decryptV2 = async (
+  encryptedData: encryptedPrivateKeyTypeV2,
+  secret: Uint8Array,
+  additionalData?: Uint8Array
+): Promise<Uint8Array> => {
+  const key = await hkdf(secret, hexToBytes(encryptedData.salt as string));
+  const aesGcmParams: AesGcmParams = {
+    name: 'AES-GCM',
+    iv: hexToBytes(encryptedData.nonce),
+  };
+  if (additionalData) {
+    aesGcmParams.additionalData = additionalData;
+  }
+  const decrypted: ArrayBuffer = await crypto.subtle.decrypt(
+    aesGcmParams,
+    key,
+    hexToBytes(encryptedData.ciphertext)
+  );
+  return new Uint8Array(decrypted);
+};
+
+export const encryptPGPKey = async (
+  encryptionType: string,
+  privateKey: string,
+  wallet: walletType,
+  additionalMeta?: {
+    NFTPGP_V1?: {
+      password: string;
+    };
+    SCWPGP_V1?: {
+      password: string;
+    };
+  },
+  env: ENV = ENV.STAGING
+): Promise<encryptedPrivateKeyType> => {
+  let encryptedPrivateKey: encryptedPrivateKeyType;
+  switch (encryptionType) {
+    case Constants.ENC_TYPE_V1: {
+      let walletPublicKey: string;
+      if (wallet?.signer?.privateKey) {
+        // get metamask specific encryption public key
+        walletPublicKey = getEncryptionPublicKey(
+          wallet?.signer?.privateKey.substring(2)
+        );
+      } else {
+        // wallet popup will happen to get encryption public key
+        walletPublicKey = await getPublicKey(wallet);
+      }
+      encryptedPrivateKey = encryptV1(
+        privateKey,
+        walletPublicKey,
+        encryptionType
+      );
+      break;
+    }
+    case Constants.ENC_TYPE_V2: {
+      const input = bytesToHex(await getRandomValues(new Uint8Array(32)));
+      const enableProfileMessage = 'Enable Push Chat Profile \n' + input;
+      const { verificationProof: secret } = await getEip712Signature(
+        wallet,
+        enableProfileMessage,
+        true
+      );
+      const enc = new TextEncoder();
+      const encodedPrivateKey = enc.encode(privateKey);
+      encryptedPrivateKey = await encryptV2(
+        encodedPrivateKey,
+        hexToBytes(secret || '')
+      );
+      encryptedPrivateKey.version = Constants.ENC_TYPE_V2;
+      encryptedPrivateKey.preKey = input;
+      break;
+    }
+    case Constants.ENC_TYPE_V3: {
+      const input = bytesToHex(await getRandomValues(new Uint8Array(32)));
+      const enableProfileMessage = 'Enable Push Profile \n' + input;
+      const { verificationProof: secret } = await getEip191Signature(
+        wallet,
+        enableProfileMessage
+      );
+      const enc = new TextEncoder();
+      const encodedPrivateKey = enc.encode(privateKey);
+      encryptedPrivateKey = await encryptV2(
+        encodedPrivateKey,
+        hexToBytes(secret || '')
+      );
+      encryptedPrivateKey.version = Constants.ENC_TYPE_V3;
+      encryptedPrivateKey.preKey = input;
+      break;
+    }
+    case Constants.ENC_TYPE_V4: {
+      if (!additionalMeta?.NFTPGP_V1?.password) {
+        throw new Error('Password is required!');
+      }
+      const enc = new TextEncoder();
+      const encodedPrivateKey = enc.encode(privateKey);
+      encryptedPrivateKey = await encryptV2(
+        encodedPrivateKey,
+        hexToBytes(stringToHex(additionalMeta.NFTPGP_V1.password))
+      );
+      encryptedPrivateKey.version = Constants.ENC_TYPE_V4;
+      encryptedPrivateKey.preKey = '';
+      encryptedPrivateKey.encryptedPassword = await encryptPGPKey(
+        Constants.ENC_TYPE_V3,
+        additionalMeta.NFTPGP_V1.password,
+        wallet
+      );
+      break;
+    }
+    default:
+      throw new Error('Invalid Encryption Type');
+  }
+  return encryptedPrivateKey;
+};
+
+export const preparePGPPublicKey = async (
+  encryptionType: string,
+  publicKey: string,
+  wallet: walletType
+): Promise<string> => {
+  let chatPublicKey: string;
+  switch (encryptionType) {
+    case Constants.ENC_TYPE_V1: {
+      chatPublicKey = publicKey;
+      break;
+    }
+    case Constants.ENC_TYPE_V2:
+    case Constants.ENC_TYPE_V3:
+    case Constants.ENC_TYPE_V4: {
+      const verificationProof = 'DEPRECATED';
+      // TODO - Change JSON Structure to string ie equivalent to ENC_TYPE_V1 ( would be done after PUSH Node changes )
+      chatPublicKey = JSON.stringify({
+        key: publicKey,
+        signature: verificationProof,
+      });
+      break;
+    }
+    default:
+      throw new Error('Invalid Encryption Type');
+  }
+  return chatPublicKey;
+};
+
+/**
+ * Checks the Push Profile keys using verificationProof
+ * @param encryptedPrivateKey
+ * @param publicKey
+ * @param did
+ * @param caip10
+ * @param verificationProof
+ * @returns PGP Public Key
+ */
+export const verifyProfileKeys = async (
+  encryptedPrivateKey: string,
+  publicKey: string,
+  did: string,
+  caip10: string,
+  verificationProof: string
+): Promise<string> => {
+  let parsedPublicKey: string;
+  try {
+    parsedPublicKey = JSON.parse(publicKey).key;
+    if (parsedPublicKey === undefined) {
+      throw new Error('Invalid Public Key');
+    }
+  } catch (err) {
+    parsedPublicKey = publicKey;
+  }
+
+  try {
+    if (
+      publicKey &&
+      publicKey.length > 0 &&
+      verificationProof &&
+      // Allow pgp sig validation after eip191v2 only
+      verificationProof.split(':')[0] === 'eip191v2'
+    ) {
+      const data = {
+        caip10,
+        did,
+        publicKey,
+        encryptedPrivateKey,
+      };
+
+      if (isValidNFTCAIP(did)) {
+        const keyToRemove = 'owner';
+        const parsedEncryptedPrivateKey = JSON.parse(encryptedPrivateKey);
+        if (keyToRemove in parsedEncryptedPrivateKey) {
+          delete parsedEncryptedPrivateKey[keyToRemove];
+        }
+        data.encryptedPrivateKey = JSON.stringify(parsedEncryptedPrivateKey);
+      }
+
+      const signedData = generateHash(data);
+
+      const isValidSig: boolean = await verifyProfileSignature(
+        verificationProof,
+        signedData,
+        isValidNFTCAIP(did)
+          ? pCAIP10ToWallet(JSON.parse(encryptedPrivateKey).owner)
+          : pCAIP10ToWallet(did)
+      );
+      if (isValidSig) {
+        return parsedPublicKey;
+      } else {
+        throw new Error('Invalid Signature');
+      }
+    }
+    return parsedPublicKey;
+  } catch (err) {
+    console.warn(`Cannot Verify keys for DID : ${did} !!!`);
+    return parsedPublicKey;
+  }
+};
+
+export const validatePssword = (password: string) => {
+  if (password.length < 8) {
+    throw new Error('Password must be at least 8 characters long!');
+  }
+  if (!/[A-Z]/.test(password)) {
+    throw new Error('Password must contain at least one uppercase letter!');
+  }
+  if (!/[a-z]/.test(password)) {
+    throw new Error('Password must contain at least one lowercase letter!');
+  }
+  if (!/\d/.test(password)) {
+    throw new Error('Password must contain at least one digit!');
+  }
+  if (!/[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/.test(password)) {
+    throw new Error('Password must contain at least one special character!');
+  }
+};
+
+export const getRandomElement = <T>(array: T[]): T => {
+  if (array.length === 0) {
+    throw new Error('Array is empty');
+  }
+  const randomIndex = Math.floor(Math.random() * array.length);
+  return array[randomIndex];
+};
diff --git a/packages/dnode/src/lib/helpers/index.ts b/packages/dnode/src/lib/helpers/index.ts
new file mode 100644
index 000000000..182450d34
--- /dev/null
+++ b/packages/dnode/src/lib/helpers/index.ts
@@ -0,0 +1,5 @@
+export * from './config';
+export * from './address';
+export * from './api';
+export * from './crypto';
+export * from './signer';
diff --git a/packages/dnode/src/lib/helpers/signer.ts b/packages/dnode/src/lib/helpers/signer.ts
new file mode 100644
index 000000000..e75f6b201
--- /dev/null
+++ b/packages/dnode/src/lib/helpers/signer.ts
@@ -0,0 +1,89 @@
+import { SignerType, viemSignerType } from '../types';
+import { TypedDataField, TypedDataDomain } from '../types';
+
+export class Signer {
+  private signer: SignerType;
+
+  constructor(signer: SignerType) {
+    this.signer = signer;
+  }
+
+  /**
+   * Determine if the signer is a Viem signer
+   */
+  isViemSigner(signer: SignerType): signer is viemSignerType {
+    return (
+      typeof (signer as any).signTypedData === 'function' &&
+      typeof (signer as any).getChainId === 'function' &&
+      signer.signMessage.length === 1 && // Checking if the function takes one argument
+      (signer as any).signTypedData.length === 1 // Checking if the function takes one argument
+    );
+  }
+
+  async signMessage(message: string | Uint8Array): Promise<string> {
+    if (
+      'signMessage' in this.signer &&
+      typeof this.signer.signMessage === 'function'
+    ) {
+      if (this.isViemSigner(this.signer)) {
+        // Viem signer requires additional arguments
+        return this.signer.signMessage({
+          message,
+          account: this.signer.account,
+        });
+      } else {
+        // EthersV5 and EthersV6
+        return this.signer.signMessage(message);
+      }
+    } else {
+      throw new Error('Signer does not support signMessage');
+    }
+  }
+
+  async signTypedData(
+    domain: TypedDataDomain,
+    types: Record<string, TypedDataField[]>,
+    value: Record<string, any>,
+    primaryType?: string
+  ): Promise<string> {
+    if (this.isViemSigner(this.signer)) {
+      // Call Viem's signTypedData with its specific structure
+      return this.signer.signTypedData({
+        domain: domain,
+        types: types,
+        primaryType: primaryType,
+        message: value,
+        account: this.signer.account,
+      });
+    } else if ('_signTypedData' in this.signer) {
+      // ethersV5 signer uses _signTypedData
+      return this.signer._signTypedData(domain, types, value);
+    } else if ('signTypedData' in this.signer) {
+      // ethersV6 signer uses signTypedData
+      return this.signer.signTypedData(domain, types, value);
+    } else {
+      throw new Error('Signer does not support signTypedData');
+    }
+  }
+
+  async getAddress(): Promise<string> {
+    if (this.isViemSigner(this.signer)) {
+      return this.signer.account['address'] ?? '';
+    } else {
+      return await this.signer.getAddress();
+    }
+  }
+
+  async getChainId(): Promise<number> {
+    if (this.isViemSigner(this.signer)) {
+      // Viem signer has a direct method for getChainId
+      return this.signer.getChainId();
+    } else if ('provider' in this.signer && this.signer.provider) {
+      // EthersV5 and EthersV6
+      const network = await this.signer.provider.getNetwork();
+      return Number(network.chainId);
+    } else {
+      return 1; // Return default chainId
+    }
+  }
+}
diff --git a/packages/dnode/src/lib/index.ts b/packages/dnode/src/lib/index.ts
new file mode 100644
index 000000000..5deef1403
--- /dev/null
+++ b/packages/dnode/src/lib/index.ts
@@ -0,0 +1,4 @@
+import CONSTANTS from './constants';
+
+export { CONSTANTS };
+export { PushAPI } from './pushAPI/PushAPI';
diff --git a/packages/dnode/src/lib/payloads/constants.ts b/packages/dnode/src/lib/payloads/constants.ts
new file mode 100644
index 000000000..1656878ed
--- /dev/null
+++ b/packages/dnode/src/lib/payloads/constants.ts
@@ -0,0 +1,112 @@
+export interface ChainIdToSourceType {
+  [key: number]: string;
+}
+
+export const CHAIN_ID_TO_SOURCE: ChainIdToSourceType = {
+  1: 'ETH_MAINNET',
+  11155111: 'ETH_TEST_SEPOLIA',
+  137: 'POLYGON_MAINNET',
+  80002: 'POLYGON_TEST_AMOY',
+  56: 'BSC_MAINNET',
+  97: 'BSC_TESTNET',
+  10: 'OPTIMISM_MAINNET',
+  11155420: 'OPTIMISM_TESTNET',
+  2442: 'POLYGON_ZK_EVM_TESTNET',
+  1101: 'POLYGON_ZK_EVM_MAINNET',
+  421614: 'ARBITRUM_TESTNET',
+  42161: 'ARBITRUMONE_MAINNET',
+  122: 'FUSE_MAINNET',
+  123: 'FUSE_TESTNET',
+  80085: 'BERACHAIN_TESTNET',
+  7560: 'CYBER_CONNECT_MAINNET',
+  111557560: 'CYBER_CONNECT_TESTNET',
+};
+
+export const SOURCE_TYPES = {
+  ETH_MAINNET: 'ETH_MAINNET',
+  ETH_TEST_SEPOLIA: 'ETH_TEST_SEPOLIA',
+  POLYGON_MAINNET: 'POLYGON_MAINNET',
+  POLYGON_TEST_AMOY: 'POLYGON_TEST_AMOY',
+  BSC_MAINNET: 'BSC_MAINNET',
+  BSC_TESTNET: 'BSC_TESTNET',
+  OPTIMISM_MAINNET: 'OPTIMISM_MAINNET',
+  OPTIMISM_TESTNET: 'OPTIMISM_TESTNET',
+  POLYGON_ZK_EVM_TESTNET: 'POLYGON_ZK_EVM_TESTNET',
+  POLYGON_ZK_EVM_MAINNET: 'POLYGON_ZK_EVM_MAINNET',
+  ARBITRUM_TESTNET: 'ARBITRUM_TESTNET',
+  ARBITRUMONE_MAINNET: 'ARBITRUMONE_MAINNET',
+  FUSE_TESTNET: 'FUSE_TESTNET',
+  FUSE_MAINNET: 'FUSE_MAINNET',
+  BERACHAIN_TESTNET: 'BERACHAIN_TESTNET',
+  THE_GRAPH: 'THE_GRAPH',
+  PUSH_VIDEO: 'PUSH_VIDEO',
+  SIMULATE: 'SIMULATE',
+  CYBER_CONNECT_TESTNET: 'CYBER_CONNECT_TESTNET',
+  CYBER_CONNECT_MAINNET: 'CYBER_CONNECT_MAINNET',
+};
+
+export const SUPPORTED_CHAINS = [
+  1, 11155111, 42, 137, 80002, 56, 97, 10, 11155420, 2442, 1101, 421614, 42161,
+  122, 123, 80085, 111557560, 7560,
+];
+
+export enum IDENTITY_TYPE {
+  MINIMAL = 0,
+  IPFS = 1,
+  DIRECT_PAYLOAD = 2,
+  SUBGRAPH = 3,
+}
+
+export enum NOTIFICATION_TYPE {
+  BROADCAST = 1,
+  TARGETTED = 3,
+  SUBSET = 4,
+}
+
+export enum ADDITIONAL_META_TYPE {
+  CUSTOM = 0,
+  PUSH_VIDEO = 1,
+  PUSH_SPACE = 2,
+}
+
+// Subset of ADDITIONAL_META_TYPE, to be used exclusively for Push Video, Spaces
+export enum VIDEO_CALL_TYPE {
+  PUSH_VIDEO = 1,
+  PUSH_SPACE = 2,
+}
+
+export enum SPACE_REQUEST_TYPE {
+  JOIN_SPEAKER, // space has started, join as a speaker
+  ESTABLISH_MESH, // request to establish mesh connection
+  INVITE_TO_PROMOTE, // host invites someone to be promoted as the speaker
+  REQUEST_TO_PROMOTE, // someone requests the host to be promoted to a spaeker
+}
+
+export enum SPACE_ACCEPT_REQUEST_TYPE {
+  ACCEPT_JOIN_SPEAKER,
+  ACCEPT_INVITE,
+  ACCEPT_PROMOTION,
+}
+
+export enum SPACE_DISCONNECT_TYPE {
+  STOP, // space is stopped/ended
+  LEAVE, // speaker leaves a space
+}
+
+export enum SPACE_INVITE_ROLES {
+  CO_HOST,
+  SPEAKER,
+}
+
+export enum SPACE_ROLES {
+  HOST,
+  CO_HOST,
+  SPEAKER,
+  LISTENER,
+}
+
+export const DEFAULT_DOMAIN = 'push.org';
+
+export enum VIDEO_NOTIFICATION_ACCESS_TYPE {
+  PUSH_CHAT = 'PUSH_CHAT',
+}
diff --git a/packages/dnode/src/lib/payloads/helpers.ts b/packages/dnode/src/lib/payloads/helpers.ts
new file mode 100644
index 000000000..6b58987bd
--- /dev/null
+++ b/packages/dnode/src/lib/payloads/helpers.ts
@@ -0,0 +1,337 @@
+import { v4 as uuidv4 } from 'uuid';
+import { ENV } from '../constants';
+import { Signer, getCAIPAddress } from '../helpers';
+import * as CryptoJS from 'crypto-js';
+
+import {
+  ISendNotificationInputOptions,
+  INotificationPayload,
+  walletType,
+  VideoNotificationRules,
+} from '../types';
+import {
+  IDENTITY_TYPE,
+  NOTIFICATION_TYPE,
+  CHAIN_ID_TO_SOURCE,
+  SOURCE_TYPES,
+  SUPPORTED_CHAINS,
+} from './constants';
+import { sign } from '../chat/helpers';
+
+export function getUUID() {
+  return uuidv4();
+}
+
+/**
+ * This function will map the Input options passed to the SDK to the "payload" structure
+ * needed by the API input
+ *
+ * We need notificationPayload only for identityType
+ *  - DIRECT_PAYLOAD
+ *  - MINIMAL
+ */
+export function getPayloadForAPIInput(
+  inputOptions: ISendNotificationInputOptions,
+  recipients: any
+): INotificationPayload | null {
+  if (inputOptions?.notification && inputOptions?.payload) {
+    return {
+      notification: {
+        title: inputOptions?.notification?.title,
+        body: inputOptions?.notification?.body,
+      },
+      data: {
+        acta: inputOptions?.payload?.cta || '',
+        aimg: inputOptions?.payload?.img || '',
+        amsg: inputOptions?.payload?.body || '',
+        asub: inputOptions?.payload?.title || '',
+        type: inputOptions?.type?.toString() || '',
+        //deprecated
+        ...(inputOptions?.expiry && { etime: inputOptions?.expiry }),
+        ...(inputOptions?.payload?.etime && {
+          etime: inputOptions?.payload?.etime,
+        }),
+        //deprecated
+        ...(inputOptions?.hidden && { hidden: inputOptions?.hidden }),
+        ...(inputOptions?.payload?.hidden && {
+          hidden: inputOptions?.payload?.hidden,
+        }),
+        ...(inputOptions?.payload?.silent && {
+          silent: inputOptions?.payload?.silent,
+        }),
+        ...(inputOptions?.payload?.sectype && {
+          sectype: inputOptions?.payload?.sectype,
+        }),
+        //deprecated
+        ...(inputOptions?.payload?.metadata && {
+          metadata: inputOptions?.payload?.metadata,
+        }),
+        ...(inputOptions?.payload?.additionalMeta && {
+          additionalMeta: inputOptions?.payload?.additionalMeta,
+        }),
+        ...(inputOptions?.payload?.index && {
+          index: inputOptions?.payload?.index,
+        }),
+      },
+      recipients: recipients,
+    };
+  }
+
+  return null;
+}
+
+/**
+ * This function returns the recipient format accepted by the API for different notification types
+ */
+export async function getRecipients({
+  env,
+  notificationType,
+  channel,
+  recipients,
+  secretType,
+}: {
+  env: ENV;
+  notificationType: NOTIFICATION_TYPE;
+  channel: string;
+  recipients?: string | string[];
+  secretType?: string;
+}) {
+  let addressInCAIP = '';
+
+  if (secretType) {
+    let secret = '';
+    // return '';
+    /**
+     * Currently SECRET FLOW is yet to be finalized on the backend, so will revisit this later.
+     * But in secret flow we basically generate secret for the address
+     * and send it in { 0xtarget: secret_generated_for_0xtarget } format for all
+     */
+    if (notificationType === NOTIFICATION_TYPE.TARGETTED) {
+      if (typeof recipients === 'string') {
+        addressInCAIP = await getCAIPAddress(env, recipients, 'Recipient');
+        secret = ''; // do secret stuff // TODO
+
+        return {
+          [addressInCAIP]: secret,
+        };
+      }
+    } else if (notificationType === NOTIFICATION_TYPE.SUBSET) {
+      if (Array.isArray(recipients)) {
+        const recipientObject = recipients.reduce(
+          async (_recipients, _rAddress) => {
+            addressInCAIP = await getCAIPAddress(env, _rAddress, 'Recipient');
+            secret = ''; // do secret stuff // TODO
+
+            return {
+              ..._recipients,
+              [addressInCAIP]: secret,
+            };
+          },
+          {}
+        );
+
+        return recipientObject;
+      }
+    }
+  } else {
+    /**
+     * NON-SECRET FLOW
+     */
+
+    if (notificationType === NOTIFICATION_TYPE.BROADCAST) {
+      return await getCAIPAddress(env, channel, 'Recipient');
+    } else if (notificationType === NOTIFICATION_TYPE.TARGETTED) {
+      if (typeof recipients === 'string') {
+        return await getCAIPAddress(env, recipients, 'Recipient');
+      }
+    } else if (notificationType === NOTIFICATION_TYPE.SUBSET) {
+      if (Array.isArray(recipients)) {
+        if (Array.isArray(recipients)) {
+          const recipientObject: any = {};
+          recipients.map(async (_rAddress: string) => {
+            addressInCAIP = await getCAIPAddress(env, _rAddress, 'Recipient');
+            recipientObject[addressInCAIP] = null;
+          });
+          return recipientObject;
+        }
+      }
+    }
+  }
+  return recipients;
+}
+
+export async function getRecipientFieldForAPIPayload({
+  env,
+  notificationType,
+  recipients,
+  channel,
+}: {
+  env: ENV;
+  notificationType: NOTIFICATION_TYPE;
+  recipients: string | string[];
+  channel: string;
+}) {
+  if (
+    notificationType === NOTIFICATION_TYPE.TARGETTED &&
+    typeof recipients === 'string'
+  ) {
+    return await getCAIPAddress(env, recipients, 'Recipient');
+  }
+
+  return await getCAIPAddress(env, channel, 'Recipient');
+}
+
+export async function getVerificationProof({
+  senderType,
+  signer,
+  chainId,
+  notificationType,
+  identityType,
+  verifyingContract,
+  payload,
+  ipfsHash,
+  graph = {},
+  uuid,
+  chatId,
+  wallet,
+  pgpPrivateKey,
+  env,
+  rules,
+}: {
+  senderType: 0 | 1;
+  signer: any;
+  chainId: number;
+  notificationType: NOTIFICATION_TYPE;
+  identityType: IDENTITY_TYPE;
+  verifyingContract: string;
+  payload: any;
+  ipfsHash?: string;
+  graph?: any;
+  uuid: string;
+  // for notifications which have additionalMeta in payload
+  chatId?: string;
+  wallet?: walletType;
+  pgpPrivateKey?: string;
+  env?: ENV;
+  rules?: VideoNotificationRules;
+}) {
+  let message = null;
+  let verificationProof = null;
+
+  switch (identityType) {
+    case IDENTITY_TYPE.MINIMAL: {
+      message = {
+        data: `${identityType}+${notificationType}+${payload.notification.title}+${payload.notification.body}`,
+      };
+      break;
+    }
+    case IDENTITY_TYPE.IPFS: {
+      message = {
+        data: `1+${ipfsHash}`,
+      };
+      break;
+    }
+    case IDENTITY_TYPE.DIRECT_PAYLOAD: {
+      const payloadJSON = JSON.stringify(payload);
+      message = {
+        data: `2+${payloadJSON}`,
+      };
+      break;
+    }
+    case IDENTITY_TYPE.SUBGRAPH: {
+      message = {
+        data: `3+graph:${graph?.id}+${graph?.counter}`,
+      };
+      break;
+    }
+    default: {
+      throw new Error('Invalid IdentityType');
+    }
+  }
+
+  switch (senderType) {
+    case 0: {
+      const type = {
+        Data: [{ name: 'data', type: 'string' }],
+      };
+      const domain = {
+        name: 'EPNS COMM V1',
+        chainId: chainId,
+        verifyingContract: verifyingContract,
+      };
+      const pushSigner = new Signer(signer);
+      const signature = await pushSigner.signTypedData(
+        domain,
+        type,
+        message,
+        'Data'
+      );
+      verificationProof = `eip712v2:${signature}::uid::${uuid}`;
+      break;
+    }
+    case 1: {
+      const hash = CryptoJS.SHA256(JSON.stringify(message)).toString();
+      const signature = await sign({
+        message: hash,
+        signingKey: pgpPrivateKey!,
+      });
+      verificationProof = `pgpv2:${signature}:meta:${chatId}::uid::${uuid}`;
+      break;
+    }
+    default: {
+      throw new Error('Invalid SenderType');
+    }
+  }
+  return verificationProof;
+}
+
+export function getPayloadIdentity({
+  identityType,
+  payload,
+  notificationType,
+  ipfsHash,
+  graph = {},
+}: {
+  identityType: IDENTITY_TYPE;
+  payload: any;
+  notificationType?: NOTIFICATION_TYPE;
+  ipfsHash?: string;
+  graph?: any;
+}) {
+  if (identityType === IDENTITY_TYPE.MINIMAL) {
+    return `0+${notificationType}+${payload.notification.title}+${payload.notification.body}`;
+  } else if (identityType === IDENTITY_TYPE.IPFS) {
+    return `1+${ipfsHash}`;
+  } else if (identityType === IDENTITY_TYPE.DIRECT_PAYLOAD) {
+    const payloadJSON = JSON.stringify(payload);
+    return `2+${payloadJSON}`;
+  } else if (identityType === IDENTITY_TYPE.SUBGRAPH) {
+    return `3+graph:${graph?.id}+${graph?.counter}`;
+  }
+
+  return null;
+}
+
+export function getSource(
+  chainId: number,
+  identityType: IDENTITY_TYPE,
+  senderType: 0 | 1
+) {
+  if (senderType === 1) {
+    return SOURCE_TYPES.PUSH_VIDEO;
+  }
+  if (identityType === IDENTITY_TYPE.SUBGRAPH) {
+    return SOURCE_TYPES.THE_GRAPH;
+  }
+  return CHAIN_ID_TO_SOURCE[chainId];
+}
+
+export function getCAIPFormat(chainId: number, address: string) {
+  // EVM based chains
+  if (SUPPORTED_CHAINS.includes(chainId)) {
+    return `eip155:${chainId}:${address}`;
+  }
+
+  return address;
+  // TODO: add support for other non-EVM based chains
+}
diff --git a/packages/dnode/src/lib/payloads/index.ts b/packages/dnode/src/lib/payloads/index.ts
new file mode 100644
index 000000000..a9984ab12
--- /dev/null
+++ b/packages/dnode/src/lib/payloads/index.ts
@@ -0,0 +1,9 @@
+export * from './sendNotifications';
+export {
+  NOTIFICATION_TYPE,
+  IDENTITY_TYPE,
+  ADDITIONAL_META_TYPE,
+  SPACE_REQUEST_TYPE,
+  SPACE_ACCEPT_REQUEST_TYPE,
+  SPACE_DISCONNECT_TYPE,
+} from './constants';
diff --git a/packages/dnode/src/lib/payloads/sendNotifications.ts b/packages/dnode/src/lib/payloads/sendNotifications.ts
new file mode 100644
index 000000000..276b0fc03
--- /dev/null
+++ b/packages/dnode/src/lib/payloads/sendNotifications.ts
@@ -0,0 +1,261 @@
+import { ISendNotificationInputOptions } from '../types';
+import {
+  getPayloadForAPIInput,
+  getPayloadIdentity,
+  getRecipients,
+  getRecipientFieldForAPIPayload,
+  getVerificationProof,
+  getSource,
+  getUUID,
+} from './helpers';
+import {
+  getAPIBaseUrls,
+  getCAIPAddress,
+  getCAIPDetails,
+  getConfig,
+  isValidNFTCAIP,
+  isValidPushCAIP,
+} from '../helpers';
+import {
+  IDENTITY_TYPE,
+  DEFAULT_DOMAIN,
+  NOTIFICATION_TYPE,
+  SOURCE_TYPES,
+  VIDEO_CALL_TYPE,
+  VIDEO_NOTIFICATION_ACCESS_TYPE,
+} from './constants';
+import { ENV } from '../constants';
+import { axiosPost } from '../utils/axiosUtil';
+import { PushValidator } from '../pushValidator/pushValidator';
+/**
+ * Validate options for some scenarios
+ */
+function validateOptions(options: ISendNotificationInputOptions) {
+  if (!options?.channel) {
+    throw '[Push SDK] - Error - sendNotification() - "channel" is mandatory!';
+  }
+  if (!isValidPushCAIP(options.channel)) {
+    throw '[Push SDK] - Error - sendNotification() - "channel" is invalid!';
+  }
+  if (options.senderType === 0 && options.signer === undefined) {
+    throw '[Push SDK] - Error - sendNotification() - "signer" is mandatory!';
+  }
+  if (options.senderType === 1 && options.pgpPrivateKey === undefined) {
+    throw '[Push SDK] - Error - sendNotification() - "pgpPrivateKey" is mandatory!';
+  }
+
+  /**
+   * Apart from IPFS, GRAPH use cases "notification", "payload" is mandatory
+   */
+  if (
+    options?.identityType === IDENTITY_TYPE.DIRECT_PAYLOAD ||
+    options?.identityType === IDENTITY_TYPE.MINIMAL
+  ) {
+    if (!options.notification) {
+      throw '[Push SDK] - Error - sendNotification() - "notification" mandatory for Identity Type: Direct Payload, Minimal!';
+    }
+    if (!options.payload) {
+      throw '[Push SDK] - Error - sendNotification() - "payload" mandatory for Identity Type: Direct Payload, Minimal!';
+    }
+  }
+
+  const isAdditionalMetaPayload = options.payload?.additionalMeta;
+
+  const isVideoOrSpaceType =
+    typeof options.payload?.additionalMeta === 'object' &&
+    (options.payload.additionalMeta.type ===
+      `${VIDEO_CALL_TYPE.PUSH_VIDEO}+1` ||
+      options.payload.additionalMeta.type ===
+        `${VIDEO_CALL_TYPE.PUSH_SPACE}+1`);
+
+  if (
+    isAdditionalMetaPayload &&
+    isVideoOrSpaceType &&
+    !options.chatId &&
+    !options.rules
+  ) {
+    throw new Error(
+      '[Push SDK] - Error - sendNotification() - Either chatId or rules object is required to send a additional meta notification for video or spaces'
+    );
+  }
+}
+
+/**
+ *
+ * @param payloadOptions channel, recipient and type tp verify whether it is a simulate type
+ * @returns boolean
+ */
+async function checkSimulateNotification(payloadOptions: {
+  channelFound: boolean;
+  channelorAlias: string;
+  recipient: string | string[] | undefined;
+  type: NOTIFICATION_TYPE;
+  env: ENV | undefined;
+  senderType: 0 | 1;
+}): Promise<boolean> {
+  try {
+    const { channelFound, channelorAlias, recipient, type, env, senderType } =
+      payloadOptions || {};
+
+    // Video call notifications are not simulated
+    // If channel is found, then it is not a simulate type
+    if (senderType === 1 || channelFound) return false;
+
+    // if no channel info found, check if channel address = recipient and notification type is targeted
+    const convertedRecipient =
+      typeof recipient == 'string' && recipient?.split(':').length == 3
+        ? recipient.split(':')[2]
+        : recipient;
+    return (
+      channelorAlias == convertedRecipient &&
+      type == NOTIFICATION_TYPE.TARGETTED
+    );
+  } catch (e) {
+    return true;
+  }
+}
+
+export async function sendNotification(options: ISendNotificationInputOptions) {
+  try {
+    const {
+      /* 
+        senderType = 0 for channel notification (default)
+        senderType = 1 for chat notification
+      */
+      senderType = 0,
+      signer,
+      type,
+      identityType,
+      payload,
+      recipients,
+      channel,
+      graph,
+      ipfsHash,
+      env = ENV.PROD,
+      chatId,
+      rules,
+      pgpPrivateKey,
+      channelFound = true,
+    } = options || {};
+
+    validateOptions(options);
+
+    if (
+      payload &&
+      payload.additionalMeta &&
+      typeof payload.additionalMeta === 'object' &&
+      !payload.additionalMeta.domain
+    ) {
+      payload.additionalMeta.domain = DEFAULT_DOMAIN;
+    }
+    const _channelAddress = await getCAIPAddress(env, channel, 'Channel');
+    const channelCAIPDetails = getCAIPDetails(_channelAddress);
+
+    if (!channelCAIPDetails) throw Error('Invalid Channel CAIP!');
+
+    const uuid = getUUID();
+    const chainId = parseInt(channelCAIPDetails.networkId, 10);
+
+    let COMMUNICATOR_CONTRACT = '';
+    if (senderType === 0) {
+      const { EPNS_COMMUNICATOR_CONTRACT } = getConfig(env, channelCAIPDetails);
+      COMMUNICATOR_CONTRACT = EPNS_COMMUNICATOR_CONTRACT;
+    }
+
+    const _recipients = await getRecipients({
+      env,
+      notificationType: type,
+      channel: _channelAddress,
+      recipients,
+      secretType: payload?.sectype,
+    });
+
+    const notificationPayload = getPayloadForAPIInput(options, _recipients);
+
+    const verificationProof = await getVerificationProof({
+      senderType,
+      signer,
+      chainId,
+      identityType,
+      notificationType: type,
+      verifyingContract: COMMUNICATOR_CONTRACT,
+      payload: notificationPayload,
+      graph,
+      ipfsHash,
+      uuid,
+      // for the pgpv2 verfication proof
+      chatId:
+        rules?.access.data.chatId ?? // for backwards compatibilty with 'chatId' param
+        chatId,
+      pgpPrivateKey,
+    });
+
+    const identity = getPayloadIdentity({
+      identityType,
+      payload: notificationPayload,
+      notificationType: type,
+      graph,
+      ipfsHash,
+    });
+
+    const source = (await checkSimulateNotification({
+      channelFound: channelFound,
+      channelorAlias: options.channel,
+      recipient: options.recipients,
+      type: options.type,
+      env: options.env,
+      senderType: options.senderType as 0 | 1,
+    }))
+      ? SOURCE_TYPES.SIMULATE
+      : getSource(chainId, identityType, senderType);
+
+    const pushValidator = await PushValidator.initalize({ env });
+    const token = await pushValidator.getToken();
+
+    const apiPayload = {
+      verificationProof,
+      identity,
+      sender:
+        senderType === 1 && !isValidNFTCAIP(_channelAddress)
+          ? `${channelCAIPDetails?.blockchain}:${channelCAIPDetails?.address}`
+          : _channelAddress,
+      source,
+      validatorToken: token?.validatorToken,
+      /** note this recipient key has a different expectation from the BE API, see the funciton for more */
+      recipient: await getRecipientFieldForAPIPayload({
+        env,
+        notificationType: type,
+        recipients: recipients || '',
+        channel: _channelAddress,
+      }),
+      /* 
+        - If 'rules' is not provided, check if 'chatId' is available.
+        - If 'chatId' is available, create a new 'rules' object for backwards compatibility.
+        - If neither 'rules' nor 'chatId' is available, do not include 'rules' in the payload.
+      */
+      ...(rules || chatId
+        ? {
+            rules: rules ?? {
+              access: {
+                data: { chatId },
+                type: VIDEO_NOTIFICATION_ACCESS_TYPE.PUSH_CHAT,
+              },
+            },
+          }
+        : {}),
+    };
+
+    const requestURL = `${token?.validatorUrl}/apis/v1/messaging/addBlocking/`;
+    return await axiosPost(requestURL, apiPayload, {
+      headers: {
+        'Content-Type': 'application/json',
+      },
+    });
+  } catch (err) {
+    console.error(
+      '[Push SDK] - Error - sendNotification() - ',
+      JSON.stringify(err)
+    );
+    throw err;
+  }
+}
diff --git a/packages/dnode/src/lib/progressHook.ts b/packages/dnode/src/lib/progressHook.ts
new file mode 100644
index 000000000..675106177
--- /dev/null
+++ b/packages/dnode/src/lib/progressHook.ts
@@ -0,0 +1,264 @@
+import { ProgressHookType } from './types';
+type ProgressHookTypeFunction = (...args: any[]) => ProgressHookType;
+
+const PROGRESSHOOK: Record<
+  string,
+  ProgressHookType | ProgressHookTypeFunction
+> = {
+  /**
+   * PUSH-CREATE PROGRESSHOOKS
+   */
+  'PUSH-CREATE-01': {
+    progressId: 'PUSH-CREATE-01',
+    progressTitle: 'Generating Secure Profile Signature',
+    progressInfo:
+      'This step is only done for first time users and might take a few seconds. PGP keys are getting generated to provide you with secure yet seamless web3 communication',
+    level: 'INFO',
+  },
+  /**
+   * @deprecated
+   */
+  'PUSH-CREATE-02': {
+    progressId: 'PUSH-CREATE-02',
+    progressTitle: 'Signing Generated Profile',
+    progressInfo:
+      'This step is only done for first time users. Please sign the message to continue.',
+    level: 'INFO',
+  },
+  'PUSH-CREATE-03': {
+    progressId: 'PUSH-CREATE-03',
+    progressTitle: 'Encrypting Generated Profile',
+    progressInfo: 'Encrypting your keys. Please sign the message to continue.',
+    level: 'INFO',
+  },
+  'PUSH-CREATE-04': {
+    progressId: 'PUSH-CREATE-04',
+    progressTitle: 'Syncing Generated Profile',
+    progressInfo:
+      'Please sign the message to continue. Great job! You are almost fully onboarded to Push Protocol!',
+    level: 'INFO',
+  },
+  'PUSH-CREATE-05': {
+    progressId: 'PUSH-CREATE-05',
+    progressTitle: 'Setup Complete',
+    progressInfo: '',
+    level: 'SUCCESS',
+  },
+  /**
+   * PUSH-UPGRADE PROGRESSHOOKS
+   */
+  /**
+   * @deprecated
+   */
+  'PUSH-UPGRADE-01': {
+    progressId: 'PUSH-UPGRADE-01',
+    progressTitle: 'Generating New Profile Signature',
+    progressInfo:
+      'Trying to Upgrade Push Keys to latest version. Please sign the message to continue.',
+    level: 'INFO',
+  },
+  'PUSH-UPGRADE-02': {
+    progressId: 'PUSH-UPGRADE-02',
+    progressTitle: 'Decrypting Old Profile',
+    progressInfo:
+      'Trying to Upgrade Push Keys to latest version. Please sign the message to continue.',
+    level: 'INFO',
+  },
+  /**
+   * @deprecated
+   */
+  'PUSH-UPGRADE-03': {
+    progressId: 'PUSH-UPGRADE-03',
+    progressTitle: 'Generating Encrypted New Profile',
+    progressInfo:
+      'Trying to Upgrade Push Keys to latest version. Encrypting Push Keys with latest version. Please sign the message to continue.',
+    level: 'INFO',
+  },
+  /**
+   * @deprecated
+   */
+  'PUSH-UPGRADE-04': {
+    progressId: 'PUSH-UPGRADE-04',
+    progressTitle: 'Syncing New Profile',
+    progressInfo:
+      'Please sign the message to continue. Upgraded keys are almost ready!',
+    level: 'INFO',
+  },
+  'PUSH-UPGRADE-05': {
+    progressId: 'PUSH-UPGRADE-05',
+    progressTitle: 'Upgrade Completed, Welcome to Push Protocol',
+    progressInfo: '',
+    level: 'SUCCESS',
+  },
+  /**
+   * PUSH-DECRYPT PROGRESSHOOKS
+   */
+  'PUSH-DECRYPT-01': {
+    progressId: 'PUSH-DECRYPT-01',
+    progressTitle: 'Decrypting Profile',
+    progressInfo: 'Please sign the transaction to decrypt profile',
+    level: 'INFO',
+  },
+  'PUSH-DECRYPT-02': {
+    progressId: 'PUSH-DECRYPT-02',
+    progressTitle: 'Push Profile Unlocked',
+    progressInfo: 'Unlocking push profile',
+    level: 'SUCCESS',
+  },
+  /**
+   * PUSH-AUTH-UPDATE PROGRESSHOOKS
+   */
+  'PUSH-AUTH-UPDATE-01': (pgpEncryptionVersion: string) => {
+    return {
+      progressId: 'PUSH-AUTH-UPDATE-01',
+      progressTitle: 'Generating New Profile Signature',
+      progressInfo: `Trying to Update Push Keys to ${pgpEncryptionVersion} version. Please sign the message to continue.`,
+      level: 'INFO',
+    };
+  },
+  'PUSH-AUTH-UPDATE-02': (pgpEncryptionVersion: string) => {
+    return {
+      progressId: 'PUSH-AUTH-UPDATE-02',
+      progressTitle: 'Generating New Encrypted Profile',
+      progressInfo: `Encrypting Push Keys with ${pgpEncryptionVersion} version. Please sign the message to continue.`,
+      level: 'INFO',
+    };
+  },
+  'PUSH-AUTH-UPDATE-03': {
+    progressId: 'PUSH-AUTH-UPDATE-03',
+    progressTitle: 'Syncing Updated Profile',
+    progressInfo:
+      'Please sign the message to continue. Updated keys are almost ready!',
+    level: 'INFO',
+  },
+  'PUSH-AUTH-UPDATE-04': {
+    progressId: 'PUSH-AUTH-UPDATE-04',
+    progressTitle: 'Update Completed, Welcome to Push Protocol',
+    progressInfo: '',
+    level: 'SUCCESS',
+  },
+  'PUSH-AUTH-UPDATE-05': {
+    progressId: 'PUSH-AUTH-UPDATE-05',
+    progressTitle: 'Generating New Profile Signature',
+    progressInfo: `Trying to Update Push Profile creds. Please sign the message to continue.`,
+    level: 'INFO',
+  },
+  'PUSH-AUTH-UPDATE-06': {
+    progressId: 'PUSH-AUTH-UPDATE-06',
+    progressTitle: 'Generating New Profile Signature',
+    progressInfo: `Encrypting Push Keys with new creds. Please sign the message to continue.`,
+    level: 'INFO',
+  },
+  /**
+   * PUSH-DECRYPT-AUTH PROGRESSHOOKS
+   */
+  'PUSH-DECRYPT-AUTH-01': {
+    progressId: 'PUSH-DECRYPT-AUTH-01',
+    progressTitle: 'Decrypting Profile Creds',
+    progressInfo: 'Please sign the transaction to decrypt profile creds',
+    level: 'INFO',
+  },
+  'PUSH-DECRYPT-AUTH-02': {
+    progressId: 'PUSH-DECRYPT-AUTH-02',
+    progressTitle: 'Push Profile Creds Unlocked',
+    progressInfo: 'Unlocking push profile creds',
+    level: 'SUCCESS',
+  },
+  /**
+   * PUSH-PROFILE-UPDATE PROGRESSHOOKS
+   */
+  'PUSH-PROFILE-UPDATE-01': {
+    progressId: 'PUSH-PROFILE-UPDATE-01',
+    progressTitle: 'Syncing Updated Profile',
+    progressInfo: 'Steady lads, your profile is getting a new look!',
+    level: 'INFO',
+  },
+  'PUSH-PROFILE-UPDATE-02': {
+    progressId: 'PUSH-PROFILE-UPDATE-02',
+    progressTitle: 'Profile Update Completed, Welcome to Push Protocol',
+    progressInfo: '',
+    level: 'SUCCESS',
+  },
+  /**
+   * PUSH_CHANNEL_CREATE PROGRESSHOOKS
+   */
+  'PUSH-CHANNEL-CREATE-01': {
+    progressId: 'PUSH-CHANNEL-CREATE-01',
+    progressTitle: 'Uploading data to IPFS',
+    progressInfo: 'The channel’s data is getting uploaded to IPFS',
+    level: 'INFO',
+  },
+  'PUSH-CHANNEL-CREATE-02': {
+    progressId: 'PUSH-CHANNEL-CREATE-02',
+    progressTitle: 'Approving PUSH tokens',
+    progressInfo: 'Gives approval to Push Core contract to spend 50 DAI',
+    level: 'INFO',
+  },
+  'PUSH-CHANNEL-CREATE-03': {
+    progressId: 'PUSH-CHANNEL-CREATE-03',
+    progressTitle: 'Channel is getting created',
+    progressInfo: 'Calls Push Core contract to create your channel',
+    level: 'INFO',
+  },
+  'PUSH-CHANNEL-CREATE-04': {
+    progressId: 'PUSH-CHANNEL-CREATE-04',
+    progressTitle: 'Channel creation is done, Welcome to Push Ecosystem',
+    progressInfo: 'Channel creation is completed',
+    level: 'SUCCESS',
+  },
+  /**
+   * PUSH_CHANNEL_UPDATE PROGRESSHOOKS
+   */
+  'PUSH-CHANNEL-UPDATE-01': {
+    progressId: 'PUSH-CHANNEL-UPDATE-01',
+    progressTitle: 'Uploading new data to IPFS',
+    progressInfo: 'The channel’s new data is getting uploaded to IPFS',
+    level: 'INFO',
+  },
+  'PUSH-CHANNEL-UPDATE-02': {
+    progressId: 'PUSH-CHANNEL-UPDATE-02',
+    progressTitle: 'Approving PUSH tokens',
+    progressInfo: 'Gives approval to Push Core contract to spend 50 DAI',
+    level: 'INFO',
+  },
+  'PUSH-CHANNEL-UPDATE-03': {
+    progressId: 'PUSH-CHANNEL-UPDATE-03',
+    progressTitle: 'Channel is getting updated',
+    progressInfo: 'Calls Push Core contract to update your channel details',
+    level: 'INFO',
+  },
+  'PUSH-CHANNEL-UPDATE-04': {
+    progressId: 'PUSH-CHANNEL-UPDATE-04',
+    progressTitle: 'Channel is updated with new data',
+    progressInfo: 'Channel is successfully updated',
+    level: 'SUCCESS',
+  },
+  /**
+   * PUSH-ERROR PROGRESSHOOKS
+   */
+  'PUSH-ERROR-00': (functionName: string, err: string) => {
+    return {
+      progressId: 'PUSH-ERROR-00',
+      progressTitle: 'Non Specific Error',
+      progressInfo: `[Push SDK] - API  - Error - API ${functionName}() -: ${err}`,
+      level: 'ERROR',
+    };
+  },
+  'PUSH-ERROR-01': (err: string) => {
+    return {
+      progressId: 'PUSH-ERROR-01',
+      progressTitle: 'Upgrade Profile Failed',
+      progressInfo: `[Push SDK] - API  - Error - API decryptPgpKey() -: ${err}`,
+      level: 'WARN',
+    };
+  },
+  'PUSH-ERROR-02': (name: string, err: string) => {
+    return {
+      progressId: 'PUSH-ERROR-02',
+      progressTitle: 'Transaction failed',
+      progressInfo: `[Push SDK] - Contract  - Error - ${name} -: ${err}`,
+      level: 'ERROR',
+    };
+  },
+};
+export default PROGRESSHOOK;
diff --git a/packages/dnode/src/lib/pushAPI/PushAPI.ts b/packages/dnode/src/lib/pushAPI/PushAPI.ts
new file mode 100644
index 000000000..ca75ad959
--- /dev/null
+++ b/packages/dnode/src/lib/pushAPI/PushAPI.ts
@@ -0,0 +1,282 @@
+import Constants, { ENV, PACKAGE_BUILD } from '../constants';
+import { SignerType, ProgressHookType } from '../types';
+import { InfoOptions, PushAPIInitializeProps } from './pushAPITypes';
+import * as PUSH_USER from '../user';
+import { getAccountAddress, getWallet } from '../chat/helpers';
+import { PushStream, StreamType } from '../pushstream/PushStream';
+import { Channel } from '../pushNotification/channel';
+import { Notification } from '../pushNotification/notification';
+import {
+  PushStreamInitializeProps,
+  STREAM,
+} from '../pushstream/pushStreamTypes';
+import { ALPHA_FEATURE_CONFIG } from '../config';
+import { decryptPGPKey, isValidNFTCAIP, walletToPCAIP10 } from '../helpers';
+import { LRUCache } from 'lru-cache';
+import { cache } from '../helpers/cache';
+import { v4 as uuidv4 } from 'uuid';
+
+export class PushAPI {
+  public signer?: SignerType;
+  private readMode: boolean;
+  private alpha: { feature: string[] };
+  public account: string;
+  public chainWiseAccount: string;
+  public decryptedPgpPvtKey?: string;
+  public pgpPublicKey?: string;
+  public env: ENV;
+  private progressHook?: (progress: ProgressHookType) => void;
+  private cache: LRUCache<string, any>;
+
+  public stream!: PushStream;
+  // Notification
+  public channel!: Channel;
+  public notification!: Notification;
+  public uid: string;
+  // error object to maintain errors and warnings
+  public errors: { type: 'WARN' | 'ERROR'; message: string }[];
+
+  private constructor(
+    env: ENV,
+    account: string,
+    readMode: boolean,
+    alpha: { feature: string[] },
+    decryptedPgpPvtKey?: string,
+    pgpPublicKey?: string,
+    signer?: SignerType,
+    progressHook?: (progress: ProgressHookType) => void,
+    initializationErrors?: { type: 'WARN' | 'ERROR'; message: string }[]
+  ) {
+    this.signer = signer;
+    this.readMode = readMode;
+    this.alpha = alpha;
+    this.env = env;
+    this.account = account;
+    this.chainWiseAccount = walletToPCAIP10(account);
+    this.decryptedPgpPvtKey = decryptedPgpPvtKey;
+    this.pgpPublicKey = pgpPublicKey;
+    this.progressHook = progressHook;
+    // Instantiate the notification classes
+    this.channel = new Channel(this.signer, this.env, this.account);
+    this.notification = new Notification(this.signer, this.env, this.account);
+    this.uid = uuidv4();
+    this.cache = cache;
+
+    this.errors = initializationErrors || [];
+  }
+  // Overloaded initialize method signatures
+  static async initialize(
+    signer?: SignerType | null,
+    options?: PushAPIInitializeProps
+  ): Promise<PushAPI>;
+  static async initialize(options?: PushAPIInitializeProps): Promise<PushAPI>;
+
+  static async initialize(...args: any[]): Promise<PushAPI> {
+    try {
+      let signer: SignerType | undefined;
+      let options: PushAPIInitializeProps | undefined;
+      let decryptedPGPPrivateKey: string | undefined;
+
+      if (args.length === 1 && typeof args[0] === 'object') {
+        // This branch handles both the single options object and the single signer scenario.
+        if ('account' in args[0] && typeof args[0].account === 'string') {
+          // Single options object provided.
+          options = args[0];
+        } else {
+          // Only signer provided.
+          [signer] = args;
+        }
+      } else if (args.length === 2) {
+        // Separate signer and options arguments provided.
+        [signer, options] = args;
+      } else {
+        // Handle other cases or throw an error.
+        throw new Error('Invalid arguments provided to initialize method.');
+      }
+
+      // Check for decryptedPGPPrivateKey in options, regardless of how options was assigned.
+      if (
+        options &&
+        'decryptedPGPPrivateKey' in options &&
+        typeof options.decryptedPGPPrivateKey === 'string'
+      ) {
+        decryptedPGPPrivateKey = options.decryptedPGPPrivateKey;
+      }
+
+      if (!signer && !options?.account) {
+        throw new Error("Either 'signer' or 'account' must be provided.");
+      }
+
+      // Determine readMode based on the presence of signer and decryptedPGPPrivateKey
+      const readMode = !signer && !decryptedPGPPrivateKey;
+
+      // Default options
+      const defaultOptions: PushAPIInitializeProps = {
+        env: ENV.STAGING,
+        version: Constants.ENC_TYPE_V3,
+        autoUpgrade: true,
+        account: null,
+      };
+
+      // Settings object
+      // Default options are overwritten by the options passed in the initialize method
+      const settings = {
+        ...defaultOptions,
+        ...options,
+        version: options?.version || defaultOptions.version,
+        versionMeta: options?.versionMeta || defaultOptions.versionMeta,
+        autoUpgrade:
+          options?.autoUpgrade !== undefined
+            ? options?.autoUpgrade
+            : defaultOptions.autoUpgrade,
+        alpha:
+          options?.alpha && options.alpha.feature
+            ? options.alpha
+            : ALPHA_FEATURE_CONFIG[PACKAGE_BUILD],
+      };
+
+      const initializationErrors: {
+        type: 'WARN' | 'ERROR';
+        message: string;
+      }[] = [];
+
+      // Get account
+      // Derives account from signer if not provided
+
+      let derivedAccount;
+      if (signer) {
+        derivedAccount = await getAccountAddress(
+          getWallet({
+            account: settings.account as string | null,
+            signer: signer,
+          })
+        );
+      } else {
+        derivedAccount = options?.account;
+      }
+
+      if (!derivedAccount) {
+        throw new Error('Account could not be derived.');
+      }
+
+      let pgpPublicKey: string | undefined;
+
+      /**
+       * Decrypt PGP private key
+       * If user exists, decrypts the PGP private key
+       * If user does not exist, creates a new user and returns the decrypted PGP private key
+       */
+      // TODO: Uncomment this block after this is handled by validator nodes
+      // const user = await PUSH_USER.get({
+      //   account: derivedAccount,
+      //   env: settings.env,
+      // });
+
+      // if (user && user.publicKey) {
+      //   pgpPublicKey = user.publicKey;
+      // }
+
+      // if (!readMode) {
+      //   try {
+      //     if (user && user.encryptedPrivateKey) {
+      //       if (!decryptedPGPPrivateKey) {
+      //         decryptedPGPPrivateKey = await decryptPGPKey({
+      //           encryptedPGPPrivateKey: user.encryptedPrivateKey,
+      //           signer: signer,
+      //           toUpgrade: settings.autoUpgrade,
+      //           additionalMeta: settings.versionMeta,
+      //           progressHook: settings.progressHook,
+      //           env: settings.env,
+      //         });
+      //       }
+      //     } else {
+      //       const newUser = await PUSH_USER.create({
+      //         env: settings.env,
+      //         account: derivedAccount,
+      //         signer,
+      //         version: settings.version,
+      //         additionalMeta: settings.versionMeta,
+      //         origin: settings.origin,
+      //         progressHook: settings.progressHook,
+      //       });
+      //       decryptedPGPPrivateKey = newUser.decryptedPrivateKey as string;
+      //       pgpPublicKey = newUser.publicKey;
+      //     }
+      //   } catch (error) {
+      //     const decryptionError =
+      //       'Error decrypting PGP private key ...swiching to Guest mode';
+      //     initializationErrors.push({
+      //       type: 'ERROR',
+      //       message: decryptionError,
+      //     });
+      //     console.error(decryptionError);
+      //     if (isValidNFTCAIP(derivedAccount)) {
+      //       const nftDecryptionError =
+      //         'NFT Account Detected. If this NFT was recently transferred to you, please ensure you have received the correct password from the previous owner. Alternatively, you can reinitialize for a fresh start. Please be aware that reinitialization will result in the loss of all previous account data.';
+
+      //       initializationErrors.push({
+      //         type: 'WARN',
+      //         message: nftDecryptionError,
+      //       });
+      //       console.warn(nftDecryptionError);
+      //     }
+      //     readMode = true;
+      //   }
+      // }
+      // Initialize PushAPI instance
+      const api = new PushAPI(
+        settings.env as ENV,
+        derivedAccount,
+        readMode,
+        settings.alpha,
+        decryptedPGPPrivateKey,
+        pgpPublicKey,
+        signer,
+        settings.progressHook,
+        initializationErrors
+      );
+
+      return api;
+    } catch (error) {
+      console.error('Error initializing PushAPI:', error);
+      throw error; // or handle it more gracefully if desired
+    }
+  }
+
+  async initStream(
+    listen: StreamType[],
+    options?: PushStreamInitializeProps
+  ): Promise<PushStream> {
+    if (this.stream) {
+      throw new Error('Stream is already initialized.');
+    }
+
+    this.stream = await PushStream.initialize(
+      this.account,
+      listen,
+      this.env,
+      this.decryptedPgpPvtKey,
+      this.progressHook,
+      this.signer,
+      options
+    );
+
+    return this.stream;
+  }
+
+  async info(options?: InfoOptions) {
+    const accountToUse = options?.overrideAccount || this.account;
+    return await PUSH_USER.get({
+      account: accountToUse,
+      env: this.env,
+    });
+  }
+
+  readmode(): boolean {
+    return this.readMode;
+  }
+
+  static ensureSignerMessage(): string {
+    return 'Operation not allowed in read-only mode. Signer is required.';
+  }
+}
diff --git a/packages/dnode/src/lib/pushAPI/pushAPITypes.ts b/packages/dnode/src/lib/pushAPI/pushAPITypes.ts
new file mode 100644
index 000000000..b0df550b1
--- /dev/null
+++ b/packages/dnode/src/lib/pushAPI/pushAPITypes.ts
@@ -0,0 +1,20 @@
+import Constants, { ENV } from '../constants';
+import { ProgressHookType } from '../types';
+
+export interface PushAPIInitializeProps {
+  env?: ENV;
+  progressHook?: (progress: ProgressHookType) => void;
+  account?: string | null;
+  version?: typeof Constants.ENC_TYPE_V1 | typeof Constants.ENC_TYPE_V3;
+  versionMeta?: { NFTPGP_V1?: { password: string } };
+  autoUpgrade?: boolean;
+  origin?: string;
+  alpha?: {
+    feature: string[];
+  };
+  decryptedPGPPrivateKey?: string | null;
+}
+
+export interface InfoOptions {
+  overrideAccount?: string;
+}
diff --git a/packages/dnode/src/lib/pushNotification/PushNotificationTypes.ts b/packages/dnode/src/lib/pushNotification/PushNotificationTypes.ts
new file mode 100644
index 000000000..93dbca953
--- /dev/null
+++ b/packages/dnode/src/lib/pushNotification/PushNotificationTypes.ts
@@ -0,0 +1,163 @@
+import { ADDITIONAL_META_TYPE } from '../../lib/payloads/constants';
+import { GetAliasInfoOptionsType } from '../alias';
+import { NotifictaionType, ProgressHookType } from '../types';
+
+export type SubscriptionOptions = {
+  account?: string;
+  page?: number;
+  limit?: number;
+  channel?: string;
+  raw?: boolean;
+};
+export type ChannelInfoOptions = {
+  channel?: string;
+  // page?: number;
+  // limit?: number;
+  // category?: number;
+  // setting?: boolean;
+  raw?: boolean;
+};
+
+export type SubscribeUnsubscribeOptions = {
+  onSuccess?: () => void;
+  onError?: (err: Error) => void;
+  settings?: UserSetting[];
+};
+
+export type UserSetting = {
+  enabled: boolean;
+  value?: number | { lower: number; upper: number };
+};
+
+export type AliasOptions = Omit<GetAliasInfoOptionsType, 'env'>;
+
+export type AliasInfoOptions = {
+  raw?: boolean;
+  version?: number;
+};
+
+export enum FeedType {
+  INBOX = 'INBOX',
+  SPAM = 'SPAM',
+}
+
+export type FeedsOptions = {
+  account?: string;
+  //TODO: change it to string[] once we start supporting multiple channel
+  // channels?: string[];
+  // page?: number;
+  // limit?: number;
+  raw?: boolean;
+  /**
+   * @desc - Format YYYYMM
+   */
+  yearMonth?: string;
+  /**
+   * @desc - Get feeds after a specific epoch
+   */
+  afterEpoch?: number;
+};
+
+export type ChannelSearchOptions = {
+  page?: number;
+  limit?: number;
+};
+
+// Types related to notification
+export type INotification = {
+  title: string;
+  body: string;
+};
+
+export type IPayload = {
+  title?: string;
+  body?: string;
+  cta?: string;
+  embed?: string;
+  category?: number;
+  meta?: {
+    domain?: string;
+    type: `${ADDITIONAL_META_TYPE}+${number}`;
+    data: string;
+  };
+};
+
+export type IConfig = {
+  expiry?: number;
+  silent?: boolean;
+  hidden?: boolean;
+};
+
+export type IAdvance = {
+  graph?: {
+    id: string;
+    counter: number;
+  };
+  ipfs?: string;
+  minimal?: string;
+  chatid?: string;
+  pgpPrivateKey?: string;
+};
+
+export type NotificationOptions = {
+  notification: INotification;
+  payload?: IPayload;
+  config?: IConfig;
+  advanced?: IAdvance;
+  channel?: string;
+};
+
+export type CreateChannelOptions = {
+  name: string;
+  description: string;
+  icon: string;
+  url: string;
+  alias?: string;
+  progressHook?: (progress: ProgressHookType) => void;
+};
+
+export type NotificationSetting = {
+  type: number;
+  default: number | { upper: number; lower: number };
+  description: string;
+  data?: {
+    upper: number;
+    lower: number;
+    enabled?: boolean;
+    ticker?: number;
+  };
+};
+
+export type NotificationSettings = NotificationSetting[];
+
+export type ChannelFeedsOptions = {
+  page?: number;
+  limit?: number;
+  raw?: boolean;
+  filter?: NotifictaionType;
+};
+export type ChannelOptions = {
+  raw: boolean;
+};
+
+export enum ChannelListType {
+  ALL = 'all',
+  VERIFIED = 'verified',
+  UNVERIFIED = 'unverified',
+}
+
+export enum ChannelListSortType {
+  SUBSCRIBER = 'subscribers',
+}
+
+export type ChannelListOptions = {
+  page?: number;
+  limit?: number;
+  sort?: ChannelListSortType;
+  order?: ChannelListOrderType;
+};
+
+export enum ChannelListOrderType {
+  ASCENDING = 'asc',
+  DESCENDING = 'desc',
+}
diff --git a/packages/dnode/src/lib/pushNotification/alias.ts b/packages/dnode/src/lib/pushNotification/alias.ts
new file mode 100644
index 000000000..b9a197054
--- /dev/null
+++ b/packages/dnode/src/lib/pushNotification/alias.ts
@@ -0,0 +1,109 @@
+import { ENV } from '../constants';
+import { AliasInfoOptions, AliasOptions } from './PushNotificationTypes';
+import { SignerType } from '../types';
+import { validateCAIP } from '../helpers';
+import CONFIG, * as config from '../config';
+import * as PUSH_ALIAS from '../alias';
+import { PushNotificationBaseClass } from './pushNotificationBase';
+
+export class Alias extends PushNotificationBaseClass {
+  constructor(signer?: SignerType, env?: ENV, account?: string) {
+    super(signer, env, account);
+  }
+
+  /**
+   * @description - fetches alias information
+   * @param {AliasOptions} options - options related to alias
+   * @returns Alias details
+   */
+  info = async (options: AliasOptions) => {
+    try {
+      return await PUSH_ALIAS.getAliasInfo({ ...options, env: this.env });
+    } catch (error) {
+      throw new Error(`Push SDK Error: API : alias::info : ${error}`);
+    }
+  };
+
+  /**
+   * @description adds an alias to the channel
+   * @param {string} alias - alias address in caip to be added
+   * @param {AliasInfoOptions} options - options related to alias
+   * @returns the transaction hash if the transaction is successfull
+   */
+  initiate = async (
+    alias: string,
+    options?: AliasInfoOptions
+  ): Promise<any> => {
+    try {
+      this.checkSignerObjectExists();
+      const networkDetails = await this.getChainId(this.signer!);
+      const caip = `eip155:${networkDetails}`;
+      if (!CONFIG[this.env!][caip] || !config.VIEM_CONFIG[this.env!][caip]) {
+        throw new Error('Unsupported Chainid');
+      }
+      const commAddress = CONFIG[this.env!][caip].EPNS_COMMUNICATOR_CONTRACT;
+
+      const commContract = this.createContractInstance(
+        commAddress,
+        config.ABIS.COMM,
+        config.VIEM_CONFIG[this.env!][caip].NETWORK
+      );
+
+      const addAliasRes = await this.initiateAddAlias(commContract, alias);
+      let resp: { [key: string]: any } = { tx: addAliasRes };
+      if (options?.raw) {
+        resp = {
+          ...resp,
+          raw: {
+            initiateVerificationProof: addAliasRes,
+          },
+        };
+      }
+      return resp;
+    } catch (error) {
+      throw new Error(`Push SDK Error: Contract : alias::add : ${error}`);
+    }
+  };
+
+  /**
+   * @description verifies an alias address of a channel
+   * @param {string} channelAddress - channelAddress to be verified
+   * @param {AliasInfoOptions} options - options related to alias
+   * @returns the transaction hash if the transaction is successfull
+   */
+  verify = async (channelAddress: string, options?: AliasInfoOptions) => {
+    try {
+      this.checkSignerObjectExists();
+      const networkDetails = await this.getChainId(this.signer!);
+      const caip = `eip155:${networkDetails}`;
+
+      if (!CONFIG[this.env!][caip] || !config.VIEM_CONFIG[this.env!][caip]) {
+        throw new Error('Unsupported Chainid');
+      }
+      const commAddress = CONFIG[this.env!][caip].EPNS_COMMUNICATOR_CONTRACT;
+
+      const commContract = this.createContractInstance(
+        commAddress,
+        config.ABIS.COMM,
+        config.VIEM_CONFIG[this.env!][caip].NETWORK
+      );
+      const { verifyAliasRes, channelInfo } = await this.verifyAlias(
+        commContract,
+        channelAddress
+      );
+      let resp: { [key: string]: any } = { tx: verifyAliasRes };
+      if (options?.raw) {
+        resp = {
+          ...resp,
+          raw: {
+            initiateVerificationProof: channelInfo.initiate_verification_proof,
+            verifyVerificationProof: verifyAliasRes,
+          },
+        };
+      }
+      return resp;
+    } catch (error) {
+      throw new Error(`Push SDK Error: Contract : alias::verify : ${error}`);
+    }
+  };
+}
diff --git a/packages/dnode/src/lib/pushNotification/channel.ts b/packages/dnode/src/lib/pushNotification/channel.ts
new file mode 100644
index 000000000..32cb35898
--- /dev/null
+++ b/packages/dnode/src/lib/pushNotification/channel.ts
@@ -0,0 +1,451 @@
+import Constants, { ENV } from '../constants';
+
+import * as viem from 'viem';
+import * as PUSH_CHANNEL from '../channels';
+import * as config from '../config';
+import {
+  getCAIPDetails,
+  getFallbackETHCAIPAddress,
+  validateCAIP,
+} from '../helpers';
+import * as PUSH_PAYLOAD from '../payloads';
+import PROGRESSHOOK from '../progressHook';
+import {
+  ProgressHookType,
+  ProgressHookTypeFunction,
+  SignerType,
+} from '../types';
+import {
+  ChannelFeedsOptions,
+  ChannelInfoOptions,
+  ChannelListOptions,
+  ChannelListOrderType,
+  ChannelListSortType,
+  ChannelOptions,
+  ChannelSearchOptions,
+  CreateChannelOptions,
+  NotificationOptions,
+  NotificationSettings,
+} from './PushNotificationTypes';
+
+import { Alias } from './alias';
+import { Delegate } from './delegate';
+import { PushNotificationBaseClass } from './pushNotificationBase';
+
+export class Channel extends PushNotificationBaseClass {
+  public delegate!: Delegate;
+  public alias!: Alias;
+  constructor(signer?: SignerType, env?: ENV, account?: string) {
+    super(signer, env, account);
+    this.delegate = new Delegate(signer, env, account);
+    this.alias = new Alias(signer, env, account);
+  }
+
+  /**
+   * @description - returns information about a channel
+   * @param {string} [options.channel] - channel address in caip, defaults to eth caip address
+   * @returns information about the channel if it exists
+   */
+  info = async (channel?: string, options?: ChannelOptions) => {
+    try {
+      const { raw = true } = options || {};
+      this.checkUserAddressExists(channel);
+      channel = channel ?? getFallbackETHCAIPAddress(this.env!, this.account!);
+      return await PUSH_CHANNEL.getChannel({
+        channel: channel as string,
+        env: this.env,
+        raw: raw,
+      });
+    } catch (error) {
+      throw new Error(`Push SDK Error: API : channel::info : ${error}`);
+    }
+  };
+
+  /**
+   * @description - returns relevant information as per the query that was passed
+   * @param {string} query - search query
+   * @param {number} [options.page] -  page number. default is set to Constants.PAGINATION.INITIAL_PAGE
+   * @param {number} [options.limit] - number of feeds per page. default is set to Constants.PAGINATION.LIMIT
+   * @returns Array of results relevant to the serach query
+   */
+  search = async (query: string, options?: ChannelSearchOptions) => {
+    try {
+      const {
+        page = Constants.PAGINATION.INITIAL_PAGE,
+        limit = Constants.PAGINATION.LIMIT,
+      } = options || {};
+      return await PUSH_CHANNEL.search({
+        query: query,
+        page: page,
+        limit: limit,
+        env: this.env,
+      });
+    } catch (error) {
+      throw new Error(`Push SDK Error: API : channel::search : ${error}`);
+    }
+  };
+  /**
+   * @description - Get subscribers of a channell
+   * @param {string} [options.channel] - channel in caip. defaults to account from signer with eth caip
+   * @returns array of subscribers
+   */
+  subscribers = async (options?: ChannelInfoOptions) => {
+    try {
+      let channel = options?.channel
+        ? options.channel
+        : this.account
+        ? getFallbackETHCAIPAddress(this.env!, this.account!)
+        : null;
+      this.checkUserAddressExists(channel!);
+      channel = validateCAIP(channel!)
+        ? channel
+        : getFallbackETHCAIPAddress(this.env!, channel!);
+      return await PUSH_CHANNEL.getSubscribers({
+        channel: channel!,
+        env: this.env,
+        // page: options.page,
+        // limit: options.limit ?? 10,
+        // setting: options.setting ?? false,
+        // category: options.category,
+        raw: options?.raw ?? true,
+      });
+    } catch (error) {
+      throw new Error(`Push SDK Error: API : channel::subscribers : ${error}`);
+    }
+  };
+  /**
+   *
+   * @param {string[]} recipients - Array of recipients. `['0x1'] -> TARGET`, `['0x1, 0x2'] -> SUBSET`, `['*'] -> BROADCAST`
+   * @param {object} options - Notification options
+   * @returns
+   */
+  send = async (recipients: string[], options: NotificationOptions) => {
+    try {
+      this.checkSignerObjectExists();
+      const channelInfo = await this.getChannelOrAliasInfo(
+        options.channel! ?? this.account
+      );
+
+      const lowLevelPayload = this.generateNotificationLowLevelPayload({
+        signer: this.signer!,
+        env: this.env!,
+        recipients: recipients,
+        options: options,
+        channel: options.channel ?? this.account,
+        channelInfo: channelInfo,
+      });
+      return await PUSH_PAYLOAD.sendNotification(lowLevelPayload);
+    } catch (error) {
+      throw new Error(`Push SDK Error: API : channel::send : ${error}`);
+    }
+  };
+
+  create = async (options: CreateChannelOptions) => {
+    const {
+      name,
+      description,
+      url,
+      icon,
+      alias = null,
+      progressHook,
+    } = options || {};
+    try {
+      // create push token instance
+      let aliasInfo;
+      // validate all the parameters and length
+      this.validateChannelParameters(options);
+      // check for PUSH balance
+      const pushTokenContract = await this.createContractInstance(
+        config.TOKEN[this.env!],
+        config.ABIS.TOKEN,
+        config.TOKEN_VIEM_NETWORK_MAP[this.env!]
+      );
+      const balance = await this.fetchBalance(pushTokenContract, this.account!);
+      const fees = viem.parseUnits(
+        config.MIN_TOKEN_BALANCE[this.env!].toString(),
+        18
+      );
+      if (fees > balance) {
+        throw new Error('Insufficient PUSH balance');
+      }
+      // if alias is passed, check for the caip
+      if (alias) {
+        if (!validateCAIP(alias)) {
+          throw new Error('Invalid alias CAIP');
+        }
+        const aliasDetails = getCAIPDetails(alias);
+        aliasInfo = {
+          [`${aliasDetails?.blockchain}:${aliasDetails?.networkId}`]:
+            aliasDetails?.address,
+        };
+      }
+      // construct channel identity
+      progressHook?.(PROGRESSHOOK['PUSH-CREATE-01'] as ProgressHookType);
+      const input = {
+        name: name,
+        info: description,
+        url: url,
+        icon: icon,
+        aliasDetails: aliasInfo ?? {},
+      };
+      const cid = await this.uploadToIPFSViaPushNode(JSON.stringify(input));
+      const allowanceAmount = await this.fetchAllownace(
+        pushTokenContract,
+        this.account!,
+        config.CORE_CONFIG[this.env!].EPNS_CORE_CONTRACT
+      );
+      if (!(allowanceAmount >= fees)) {
+        progressHook?.(PROGRESSHOOK['PUSH-CREATE-02'] as ProgressHookType);
+        const approvalRes = await this.approveToken(
+          pushTokenContract,
+          config.CORE_CONFIG[this.env!].EPNS_CORE_CONTRACT,
+          fees
+        );
+        if (!approvalRes) {
+          throw new Error('Something went wrong while approving the token');
+        }
+      }
+      // generate the contract parameters
+      const channelType = config.CHANNEL_TYPE['GENERAL'];
+      const identity = '1+' + cid;
+      const identityBytes = viem.stringToBytes(identity);
+      // call contract
+      progressHook?.(PROGRESSHOOK['PUSH-CREATE-03'] as ProgressHookType);
+      const createChannelRes = await this.createChannel(
+        this.coreContract,
+        channelType,
+        identityBytes,
+        fees
+      );
+      progressHook?.(PROGRESSHOOK['PUSH-CREATE-04'] as ProgressHookType);
+      return { transactionHash: createChannelRes };
+    } catch (error) {
+      const errorProgressHook = PROGRESSHOOK[
+        'PUSH-ERROR-02'
+      ] as ProgressHookTypeFunction;
+      progressHook?.(errorProgressHook('Create Channel', error));
+      throw new Error(
+        `Push SDK Error: Contract : createChannelWithPUSH : ${error}`
+      );
+    }
+  };
+
+  update = async (options: CreateChannelOptions) => {
+    const {
+      name,
+      description,
+      url,
+      icon,
+      alias = null,
+      progressHook,
+    } = options || {};
+    try {
+      // create push token instance
+      let aliasInfo;
+      // validate all the parameters and length
+      this.validateChannelParameters(options);
+      // check for PUSH balance
+      const pushTokenContract = await this.createContractInstance(
+        config.TOKEN[this.env!],
+        config.ABIS.TOKEN,
+        config.TOKEN_VIEM_NETWORK_MAP[this.env!]
+      );
+      const balance = await this.fetchBalance(pushTokenContract, this.account!);
+      // get counter
+      const counter = await this.fetchUpdateCounter(
+        this.coreContract,
+        this.account!
+      );
+      const fees = viem.parseUnits(
+        config.MIN_TOKEN_BALANCE[this.env!].toString(),
+        18
+      );
+      const totalFees = fees * counter;
+      if (totalFees > balance) {
+        throw new Error('Insufficient PUSH balance');
+      }
+      // if alias is passed, check for the caip
+      if (alias) {
+        if (!validateCAIP(alias)) {
+          throw new Error('Invalid alias CAIP');
+        }
+        const aliasDetails = getCAIPDetails(alias);
+        aliasInfo = {
+          [`${aliasDetails?.blockchain}:${aliasDetails?.networkId}`]:
+            aliasDetails?.address,
+        };
+      }
+      // construct channel identity
+      progressHook?.(PROGRESSHOOK['PUSH-UPDATE-01'] as ProgressHookType);
+      const input = {
+        name: name,
+        info: description,
+        url: url,
+        icon: icon,
+        aliasDetails: aliasInfo ?? {},
+      };
+      const cid = await this.uploadToIPFSViaPushNode(JSON.stringify(input));
+      // approve the tokens to core contract
+      const allowanceAmount = await this.fetchAllownace(
+        pushTokenContract,
+        this.account!,
+        config.CORE_CONFIG[this.env!].EPNS_CORE_CONTRACT
+      );
+      // if allowance is not greater than the fees, dont call approval again
+      if (!(allowanceAmount >= totalFees)) {
+        progressHook?.(PROGRESSHOOK['PUSH-UPDATE-02'] as ProgressHookType);
+        const approvalRes = await this.approveToken(
+          pushTokenContract,
+          config.CORE_CONFIG[this.env!].EPNS_CORE_CONTRACT,
+          totalFees
+        );
+        if (!approvalRes) {
+          throw new Error('Something went wrong while approving the token');
+        }
+      }
+      // generate the contract parameters
+      const identity = '1+' + cid;
+      const identityBytes = viem.stringToBytes(identity);
+      // call contract
+      progressHook?.(PROGRESSHOOK['PUSH-UPDATE-03'] as ProgressHookType);
+      const updateChannelRes = await this.updateChannel(
+        this.coreContract,
+        this.account!,
+        identityBytes,
+        totalFees
+      );
+      progressHook?.(PROGRESSHOOK['PUSH-UPDATE-04'] as ProgressHookType);
+      return { transactionHash: updateChannelRes };
+    } catch (error) {
+      const errorProgressHook = PROGRESSHOOK[
+        'PUSH-ERROR-02'
+      ] as ProgressHookTypeFunction;
+      progressHook?.(errorProgressHook('Update Channel', error));
+      throw new Error(`Push SDK Error: Contract channel::update : ${error}`);
+    }
+  };
+  /**
+   * @description verifies a channel
+   * @param {string} channelToBeVerified - address of the channel to be verified
+   * @returns the transaction hash if the transaction is successful
+   */
+  verify = async (channelToBeVerified: string) => {
+    try {
+      this.checkSignerObjectExists();
+      if (validateCAIP(channelToBeVerified)) {
+        channelToBeVerified = channelToBeVerified.split(':')[2];
+      }
+      // checks if it is a valid address
+      if (!viem.isAddress(channelToBeVerified)) {
+        throw new Error('Invalid channel address');
+      }
+      const channelDetails = await this.info(this.account);
+      if (channelDetails?.verified_status == 0) {
+        throw new Error('Only verified channel can verify other channel');
+      }
+      // if valid, continue with it
+      const res = await this.verifyChannel(
+        this.coreContract,
+        channelToBeVerified
+      );
+      if (!res) {
+        throw new Error('Something went wrong while verifying the channel');
+      }
+      return { transactionHash: res };
+    } catch (error) {
+      throw new Error(`Push SDK Error: Contract channel::verify : ${error}`);
+    }
+  };
+
+  setting = async (configuration: NotificationSettings) => {
+    try {
+      this.checkSignerObjectExists();
+      // check for PUSH balance
+      const pushTokenContract = await this.createContractInstance(
+        config.TOKEN[this.env!],
+        config.ABIS.TOKEN,
+        config.TOKEN_VIEM_NETWORK_MAP[this.env!]
+      );
+      const balance = await this.fetchBalance(pushTokenContract, this.account!);
+      const fees = viem.parseUnits(
+        config.MIN_TOKEN_BALANCE[this.env!].toString(),
+        18
+      );
+      // get counter
+      const counter = await this.fetchUpdateCounter(
+        this.coreContract,
+        this.account!
+      );
+      const totalFees = fees * counter;
+      if (totalFees > balance) {
+        throw new Error('Insufficient PUSH balance');
+      }
+      const allowanceAmount = await this.fetchAllownace(
+        pushTokenContract,
+        this.account!,
+        config.CORE_CONFIG[this.env!].EPNS_CORE_CONTRACT
+      );
+      // if allowance is not greater than the fees, dont call approval again
+      if (!(allowanceAmount >= totalFees)) {
+        const approveRes = await this.approveToken(
+          pushTokenContract,
+          config.CORE_CONFIG[this.env!].EPNS_CORE_CONTRACT,
+          totalFees
+        );
+        if (!approveRes) {
+          throw new Error('Something went wrong while approving your token');
+        }
+      }
+      const { setting, description } = this.getMinimalSetting(configuration);
+      const createSettingsRes = await this.createChanelSettings(
+        this.coreContract,
+        configuration.length,
+        setting,
+        description,
+        fees
+      );
+      return { transactionHash: createSettingsRes };
+    } catch (error) {
+      throw new Error(`Push SDK Error: Contract : channel::setting : ${error}`);
+    }
+  };
+
+  notifications = async (account: string, options?: ChannelFeedsOptions) => {
+    try {
+      const { page, limit, filter = null, raw = true } = options || {};
+      return await PUSH_CHANNEL.getChannelNotifications({
+        channel: account as string,
+        env: this.env,
+        filter,
+        raw,
+        page,
+        limit,
+      });
+    } catch (error) {
+      throw new Error(
+        `Push SDK Error: Contract : channel::notifications : ${error}`
+      );
+    }
+  };
+
+  list = async (options?: ChannelListOptions) => {
+    try {
+      const {
+        page,
+        limit,
+        sort = ChannelListSortType.SUBSCRIBER,
+        order = ChannelListOrderType.DESCENDING,
+      } = options || {};
+
+      return await PUSH_CHANNEL.getChannels({
+        env: this.env,
+        page,
+        limit,
+        sort,
+        order,
+      });
+    } catch (error) {
+      throw new Error(`Push SDK Error: Contract : channel::list : ${error}`);
+    }
+  };
+}
diff --git a/packages/dnode/src/lib/pushNotification/delegate.ts b/packages/dnode/src/lib/pushNotification/delegate.ts
new file mode 100644
index 000000000..95fbb3abd
--- /dev/null
+++ b/packages/dnode/src/lib/pushNotification/delegate.ts
@@ -0,0 +1,106 @@
+import { ENV } from '../constants';
+import { SignerType } from '../types';
+import { ChannelInfoOptions } from './PushNotificationTypes';
+import CONFIG, * as config from '../config';
+import * as PUSH_CHANNEL from '../channels';
+import { validateCAIP, getFallbackETHCAIPAddress } from '../helpers';
+import { PushNotificationBaseClass } from './pushNotificationBase';
+
+export class Delegate extends PushNotificationBaseClass {
+  constructor(signer?: SignerType, env?: ENV, account?: string) {
+    super(signer, env, account);
+  }
+
+  /**
+   * @description - Get delegates of a channell
+   * @param {string} [options.channel] - channel in caip. defaults to account from signer with eth caip
+   * @returns array of delegates
+   */
+  get = async (options?: ChannelInfoOptions) => {
+    try {
+      // const {
+      //   channel = this.account
+      //     ? getFallbackETHCAIPAddress(this.env!, this.account!)
+      //     : null,
+      // } = options || {};
+      let channel = options?.channel
+        ? options.channel
+        : this.account
+        ? getFallbackETHCAIPAddress(this.env!, this.account!)
+        : null;
+      this.checkUserAddressExists(channel!);
+      channel = validateCAIP(channel!)
+        ? channel
+        : getFallbackETHCAIPAddress(this.env!, channel!);
+      this.checkUserAddressExists(channel!);
+      return await PUSH_CHANNEL.getDelegates({
+        channel: channel!,
+        env: this.env,
+      });
+    } catch (error) {
+      throw new Error(`Push SDK Error: API : delegate::get : ${error}`);
+    }
+  };
+
+  /**
+   * @description adds a delegate
+   * @param {string} delegate - delegate address in caip to be added
+   * @returns the transaction hash if the transaction is successfull
+   */
+  add = async (delegate: string) => {
+    try {
+      this.checkSignerObjectExists();
+      if (validateCAIP(delegate)) {
+        delegate = this.getAddressFromCaip(delegate);
+      }
+      const networkDetails = await this.getChainId(this.signer!);
+      const caip = `eip155:${networkDetails}`;
+      if (!CONFIG[this.env!][caip] || !config.VIEM_CONFIG[this.env!][caip]) {
+        throw new Error('Unsupported Chainid');
+      }
+      const commAddress = CONFIG[this.env!][caip].EPNS_COMMUNICATOR_CONTRACT;
+
+      const commContract = this.createContractInstance(
+        commAddress,
+        config.ABIS.COMM,
+        config.VIEM_CONFIG[this.env!][caip].NETWORK
+      );
+      const addDelegateRes = await this.addDelegator(commContract, delegate);
+      return { transactionHash: addDelegateRes };
+    } catch (error) {
+      throw new Error(`Push SDK Error: Contract : delegate::add : ${error}`);
+    }
+  };
+
+  /**
+   * @description removes a delegate
+   * @param {string} delegate - caip address of the delegate to be removed
+   * @returns the transaction hash if the transaction is successfull
+   */
+  remove = async (delegate: string) => {
+    try {
+      this.checkSignerObjectExists();
+      if (validateCAIP(delegate)) {
+        delegate = this.getAddressFromCaip(delegate);
+      }
+      const networkDetails = await this.getChainId(this.signer!);
+      const caip = `eip155:${networkDetails}`;
+      if (!CONFIG[this.env!][caip] || !config.VIEM_CONFIG[this.env!][caip]) {
+        throw new Error('Unsupported Chainid');
+      }
+      const commAddress = CONFIG[this.env!][caip].EPNS_COMMUNICATOR_CONTRACT;
+      const commContract = this.createContractInstance(
+        commAddress,
+        config.ABIS.COMM,
+        config.VIEM_CONFIG[this.env!][caip].NETWORK
+      );
+      const removeDelegateRes = await this.removeDelegator(
+        commContract,
+        delegate
+      );
+      return { transactionHash: removeDelegateRes };
+    } catch (error) {
+      throw new Error(`Push SDK Error: Contract : delegate::remove : ${error}`);
+    }
+  };
+}
diff --git a/packages/dnode/src/lib/pushNotification/notification.ts b/packages/dnode/src/lib/pushNotification/notification.ts
new file mode 100644
index 000000000..3c0225be7
--- /dev/null
+++ b/packages/dnode/src/lib/pushNotification/notification.ts
@@ -0,0 +1,220 @@
+import Constants, { ENV } from '../constants';
+import { SignerType } from '../types';
+import {
+  SubscribeUnsubscribeOptions,
+  SubscriptionOptions,
+  FeedType,
+  FeedsOptions,
+} from './PushNotificationTypes';
+import * as PUSH_USER from '../user';
+import * as PUSH_CHANNEL from '../channels';
+
+import {
+  getCAIPDetails,
+  getCAIPWithChainId,
+  validateCAIP,
+  getFallbackETHCAIPAddress,
+  pCAIP10ToWallet,
+} from '../helpers';
+
+import { PushNotificationBaseClass } from './pushNotificationBase';
+// ERROR CONSTANTS
+const ERROR_CHANNEL_NEEDED = 'Channel is needed';
+const ERROR_INVALID_CAIP = 'Invalid CAIP format';
+
+export const FEED_MAP = {
+  INBOX: false,
+  SPAM: true,
+};
+export class Notification extends PushNotificationBaseClass {
+  constructor(signer?: SignerType, env?: ENV, account?: string) {
+    super(signer, env, account);
+  }
+
+  /**
+   * @description - Fetches feeds and spam feeds for a specific user
+   * @param {enums} spam - indicates if its a spam or not. `INBOX` for non-spam and `SPAM` for spam. default `INBOX`
+   * @param {string} [options.user] - user address, defaults to address from signer
+   * @param {number} [options.page] -  page number. default is set to Constants.PAGINATION.INITIAL_PAGE
+   * @param {number} [options.limit] - number of feeds per page. default is set to Constants.PAGINATION.LIMIT
+   * @param {boolean} [options.raw] - indicates if the response should be raw or formatted. defaults is set to false
+   * @returns feeds for a specific address
+   */
+  list = async (
+    spam: `${FeedType}` = FeedType.INBOX,
+    options?: FeedsOptions
+  ) => {
+    const now = new Date();
+    const year = now.getFullYear();
+    // Extract the current month and format it as two digits
+    const month = String(now.getMonth() + 1).padStart(2, '0');
+    const {
+      raw = false,
+      yearMonth = `${year}${month}`,
+      afterEpoch = '',
+    } = options || {};
+    try {
+      let account: string | null;
+      if (options?.account) {
+        if (this.isValidPCaip(options.account)) {
+          account = pCAIP10ToWallet(options.account);
+        } else {
+          account = options.account;
+        }
+      } else if (this.account) {
+        account = getFallbackETHCAIPAddress(this.env!, this.account!);
+      }
+      // guest mode and valid address check
+      this.checkUserAddressExists(account!);
+      const nonCaipAccount = this.getAddressFromCaip(account!);
+
+      return await PUSH_USER.getFeeds({
+        user: nonCaipAccount!,
+        spam: FEED_MAP[spam],
+        raw: raw,
+        env: this.env,
+        yearMonth,
+        afterEpoch,
+      });
+    } catch (error) {
+      throw new Error(`Push SDK Error: API : notifcaiton::list : ${error}`);
+    }
+  };
+
+  subscriptions = async (options?: SubscriptionOptions) => {
+    try {
+      const {
+        // TODO: to be used once pagination is implemeted at API level
+        page = Constants.PAGINATION.INITIAL_PAGE,
+        limit = Constants.PAGINATION.LIMIT,
+        channel = null,
+        raw,
+      } = options || {};
+      let account: string | null;
+      if (options?.account) {
+        if (this.isValidPCaip(options.account)) {
+          account = pCAIP10ToWallet(options.account);
+        } else {
+          account = options.account;
+        }
+      } else if (this.account) {
+        account = getFallbackETHCAIPAddress(this.env!, this.account!);
+      }
+      this.checkUserAddressExists(account!);
+      return await PUSH_USER.getSubscriptions({
+        user: account!,
+        env: this.env,
+        channel: channel,
+        raw,
+      });
+    } catch (error) {
+      throw new Error(
+        `Push SDK Error: API : notifcaiton::subscriptions : ${error}`
+      );
+    }
+  };
+  /**
+   * Subscribes a user to a channel
+   * @param {string} channel - channel address in caip format
+   * @param {function} [options.onSuccess] - callback function when a user successfully subscribes to a channel
+   * @param {function} [options.onError] - callback function incase a user was not able to subscribe to a channel
+   * @returns Subscribe status object
+   */
+  subscribe = async (
+    channel: string,
+    options?: SubscribeUnsubscribeOptions
+  ) => {
+    try {
+      const { onSuccess, onError, settings } = options || {};
+      // Vaidatiions
+      // validates if signer object is present
+      this.checkSignerObjectExists();
+      // validates if the user address exists
+      this.checkUserAddressExists();
+      // validates if channel exists
+      if (!channel && channel != '') {
+        throw new Error(ERROR_CHANNEL_NEEDED);
+      }
+      // convert normal partial caip to wallet
+      if (this.isValidPCaip(channel)) {
+        channel = pCAIP10ToWallet(channel);
+      }
+      // validates if caip is correct
+      if (!validateCAIP(channel)) {
+        channel = getFallbackETHCAIPAddress(this.env!, channel);
+      }
+      // get channel caip
+      const caipDetail = getCAIPDetails(channel);
+      // based on the caip, construct the user caip
+      const userAddressInCaip = getCAIPWithChainId(
+        this.account!,
+        parseInt(caipDetail?.networkId as string)
+      );
+      // convert the setting to minimal version
+      const minimalSetting = this.getMinimalUserSetting(settings!);
+      return await PUSH_CHANNEL.subscribeV2({
+        signer: this.signer!,
+        channelAddress: channel,
+        userAddress: userAddressInCaip,
+        env: this.env,
+        settings: minimalSetting ?? '',
+        onSuccess: onSuccess,
+        onError: onError,
+      });
+    } catch (error) {
+      throw new Error(
+        `Push SDK Error: API : notifcaiton::subscribe : ${error}`
+      );
+    }
+  };
+
+  /**
+   * Unsubscribes a user to a channel
+   * @param {string} channel - channel address in caip format
+   * @param {function} [options.onSuccess] - callback function when a user successfully unsubscribes to a channel
+   * @param {function} [options.onError] - callback function incase a user was not able to unsubscribe to a channel
+   * @returns Unsubscribe status object
+   */
+  unsubscribe = async (
+    channel: string,
+    options?: SubscribeUnsubscribeOptions
+  ) => {
+    try {
+      const { onSuccess, onError } = options || {};
+      // Vaidatiions
+      // validates if the user address exists
+      this.checkUserAddressExists();
+      // validates if signer object is present
+      this.checkSignerObjectExists();
+      // validates if channel exists
+      if (!channel && channel != '') {
+        return new Error(ERROR_CHANNEL_NEEDED);
+      }
+      // covert partial caip to normal wallet
+      if (this.isValidPCaip(channel)) {
+        channel = pCAIP10ToWallet(channel);
+      }
+      // validates if caip is correct
+      if (!validateCAIP(channel)) {
+        channel = getFallbackETHCAIPAddress(this.env!, channel);
+      }
+      const caipDetail = getCAIPDetails(channel);
+      const userAddressInCaip = getCAIPWithChainId(
+        this.account!,
+        parseInt(caipDetail?.networkId as string)
+      );
+      return await PUSH_CHANNEL.unsubscribeV2({
+        signer: this.signer!,
+        channelAddress: channel,
+        userAddress: userAddressInCaip,
+        env: this.env,
+        onSuccess: onSuccess,
+        onError: onError,
+      });
+    } catch (error) {
+      throw new Error(
+        `Push SDK Error: API : notifcaiton::unsubscribe : ${error}`
+      );
+    }
+  };
+}
diff --git a/packages/dnode/src/lib/pushNotification/pushNotificationBase.ts b/packages/dnode/src/lib/pushNotification/pushNotificationBase.ts
new file mode 100644
index 000000000..722ed38ba
--- /dev/null
+++ b/packages/dnode/src/lib/pushNotification/pushNotificationBase.ts
@@ -0,0 +1,944 @@
+import { ENV } from '../constants';
+import { SignerType, ISendNotificationInputOptions } from '../types';
+import {
+  NotificationOptions,
+  CreateChannelOptions,
+  NotificationSettings,
+  UserSetting,
+  AliasInfoOptions,
+} from './PushNotificationTypes';
+import * as config from '../config';
+import { getAccountAddress } from '../chat/helpers';
+import { IDENTITY_TYPE, NOTIFICATION_TYPE } from '../payloads/constants';
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore
+import { ethers, Signer as EthersSigner } from 'ethers';
+import {
+  createPublicClient,
+  http,
+  getContract,
+  WalletClient,
+  Chain,
+  toHex,
+} from 'viem';
+import * as PUSH_CHANNEL from '../channels';
+import {
+  CAIPDetailsType,
+  Signer,
+  getAPIBaseUrls,
+  getCAIPDetails,
+  getFallbackETHCAIPAddress,
+  validateCAIP,
+} from '../helpers';
+import { axiosGet, axiosPost } from '../utils/axiosUtil';
+import { PushAPI } from '../pushAPI/PushAPI';
+import { channel } from 'diagnostics_channel';
+import * as viem from 'viem';
+
+// ERROR CONSTANTS
+const ERROR_ACCOUNT_NEEDED = 'Account is required';
+const ERROR_SIGNER_NEEDED = 'Signer object is required';
+
+const BROADCAST_TYPE = '*';
+const LENGTH_UPPER_LIMIT = 125;
+const LENGTH_LOWER_LIMTI = 1;
+const SETTING_DELIMITER = '-';
+const SETTING_SEPARATOR = '+';
+const RANGE_TYPE = 3;
+const SLIDER_TYPE = 2;
+const BOOLEAN_TYPE = 1;
+const DEFAULT_ENABLE_VALUE = '1';
+const DEFAULT_TICKER_VALUE = '1';
+
+export const FEED_MAP = {
+  INBOX: false,
+  SPAM: true,
+};
+export class PushNotificationBaseClass {
+  protected signer: SignerType | undefined;
+  protected account: string | undefined;
+  protected env: ENV | undefined;
+  protected guestMode: boolean;
+  protected coreContract: any;
+
+  constructor(signer?: SignerType, env?: ENV, account?: string) {
+    this.signer = signer;
+    this.env = env;
+    this.guestMode = !!(account && signer);
+    this.account = account;
+    this.initializeCoreContract({ signer: this.signer, env: this.env });
+  }
+
+  private async initializeCoreContract(options?: {
+    signer?: SignerType;
+    env?: ENV;
+  }) {
+    const { env = ENV.STAGING, signer = null } = options || {};
+    // Derives account from signer if not provided
+    let derivedAccount;
+    let coreContract;
+    if (signer) {
+      derivedAccount = await getAccountAddress({
+        account: null,
+        signer: signer,
+      });
+      const pushSigner = new Signer(signer);
+      if (pushSigner.isViemSigner(signer)) {
+        const client = createPublicClient({
+          chain: config.TOKEN_VIEM_NETWORK_MAP[env],
+          transport: http(),
+        });
+        coreContract = getContract({
+          abi: config.ABIS.CORE,
+          address: config.CORE_CONFIG[env].EPNS_CORE_CONTRACT as `0x${string}`,
+          client: {
+            public: client,
+            wallet: signer as unknown as WalletClient,
+          },
+        });
+      } else {
+        coreContract = new ethers.Contract(
+          config.CORE_CONFIG[env].EPNS_CORE_CONTRACT,
+          config.ABIS.CORE,
+          signer as unknown as EthersSigner
+        );
+      }
+    }
+
+    // Initialize PushNotifications instance
+    this.coreContract = coreContract;
+  }
+
+  // check if addresses is supplied either by user or derived from signer object or if its guest mode
+  protected checkUserAddressExists(user?: string) {
+    if (!user && !this.account && !this.guestMode)
+      throw new Error(ERROR_ACCOUNT_NEEDED);
+    return true;
+  }
+
+  // checks if the signer object is supplied
+  protected checkSignerObjectExists() {
+    if (!this.signer) throw new Error(PushAPI.ensureSignerMessage());
+    return true;
+  }
+
+  // get type of notification from recipient
+  protected getNotificationType(
+    recipient: string[],
+    channel: string
+  ): { recipient: string[] | string; type: number } {
+    if (recipient.length == 1) {
+      if (recipient[0] == BROADCAST_TYPE) {
+        return { recipient: channel, type: NOTIFICATION_TYPE['BROADCAST'] };
+      } else {
+        return {
+          recipient: recipient[0],
+          type: NOTIFICATION_TYPE['TARGETTED'],
+        };
+      }
+    }
+    return { recipient, type: NOTIFICATION_TYPE['SUBSET'] };
+  }
+
+  // get identity type for lowlevel call
+  protected generateNotificationLowLevelPayload({
+    signer,
+    env,
+    recipients,
+    options,
+    channel,
+    channelInfo,
+  }: {
+    signer: SignerType;
+    env: ENV;
+    recipients: string[];
+    options: NotificationOptions;
+    channel?: string;
+    channelInfo: any | null;
+  }): ISendNotificationInputOptions {
+    if (!channel) {
+      channel = `${this.account}`;
+    }
+    const notificationType = this.getNotificationType(recipients, channel);
+    const identityType = IDENTITY_TYPE.DIRECT_PAYLOAD;
+    // fetch the minimal version based on conifg that was passed
+    let index = '';
+
+    const settings =
+      channelInfo && channelInfo.channel_settings
+        ? JSON.parse(channelInfo.channel_settings)
+        : null;
+
+    const channelFound = channelInfo ? true : false;
+
+    if (options.payload?.category && settings) {
+      if (settings[options.payload.category - 1].type == SLIDER_TYPE) {
+        index =
+          options.payload.category +
+          SETTING_DELIMITER +
+          SLIDER_TYPE +
+          SETTING_DELIMITER +
+          settings[options.payload.category - 1].default;
+      }
+      if (settings[options.payload.category - 1].type == BOOLEAN_TYPE) {
+        index = options.payload.category + SETTING_DELIMITER + BOOLEAN_TYPE;
+      }
+      if (settings[options.payload.category - 1].type == RANGE_TYPE) {
+        index =
+          options.payload.category +
+          SETTING_DELIMITER +
+          RANGE_TYPE +
+          SETTING_DELIMITER +
+          settings[options.payload.category - 1].default.lower;
+      }
+    }
+    const notificationPayload: ISendNotificationInputOptions = {
+      signer: signer,
+      channel: channel,
+      type: notificationType.type,
+      identityType: identityType,
+      notification: options.notification,
+      payload: {
+        title: options.payload?.title ?? options.notification.title,
+        body: options.payload?.body ?? options.notification.body,
+        cta: options.payload?.cta ?? '',
+        img: options.payload?.embed ?? '',
+        hidden: options.config?.hidden,
+        etime: options.config?.expiry,
+        silent: options.config?.silent,
+        additionalMeta: options.payload?.meta,
+        index: options.payload?.category ? index : '',
+      },
+      recipients: notificationType.recipient,
+      graph: options.advanced?.graph,
+      ipfsHash: options.advanced?.ipfs,
+      env: env,
+      chatId: options.advanced?.chatid,
+      pgpPrivateKey: options.advanced?.pgpPrivateKey,
+      channelFound: channelFound,
+    };
+
+    return notificationPayload;
+  }
+
+  // check if the fields are empty
+  protected isEmpty(field: string) {
+    if (field.trim().length == 0) {
+      return true;
+    }
+
+    return false;
+  }
+
+  // check if the length is valid
+  protected isValidLength(
+    data: string,
+    upperLen: number = LENGTH_UPPER_LIMIT,
+    lowerLen: number = LENGTH_LOWER_LIMTI
+  ): boolean {
+    return data.length >= lowerLen && data.length <= upperLen!;
+  }
+
+  // check if url is valid
+  protected isValidUrl(urlString: string): boolean {
+    const urlPattern = new RegExp(
+      '^((?:https|http):\\/\\/)' + // validate protocol
+        '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // validate domain name
+        '((\\d{1,3}\\.){3}\\d{1,3}))' + // validate OR ip (v4) address
+        '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // validate port and path
+        '(\\?[;&a-z\\d%_.~+=-]*)?' + // validate query string
+        '(\\#[-a-z\\d_]*)?$',
+      'i'
+    ); // validate fragment locator
+    return !!urlPattern.test(urlString);
+  }
+
+  // check all the fields of channel
+  protected verifyEmptyChannelParameters(
+    options: CreateChannelOptions
+  ): boolean {
+    if (this.isEmpty(options.name)) {
+      throw new Error('Channel name cannot be empty');
+    } else if (this.isEmpty(options.description)) {
+      throw new Error('Channel description cannot be empty');
+    } else if (this.isEmpty(options.icon)) {
+      throw new Error('Channel icon cannot be empty');
+    } else if (this.isEmpty(options.url)) {
+      throw new Error('Channel url cannot ne empty');
+    } else {
+      return true;
+    }
+  }
+
+  // check for valid length and url
+  protected validateParameterLength(options: CreateChannelOptions): boolean {
+    if (!this.isValidLength(options.name)) {
+      throw new Error(
+        `Channel name should not exceed ${LENGTH_UPPER_LIMIT} characters`
+      );
+    } else if (!this.isValidLength(options.description)) {
+      throw new Error(
+        `Channel description should not exceed ${LENGTH_UPPER_LIMIT} characters`
+      );
+    } else if (
+      !this.isValidLength(options.url) ||
+      !this.isValidUrl(options.url)
+    ) {
+      throw new Error(
+        `Channel url either excees ${LENGTH_UPPER_LIMIT} characters or is not a valid url`
+      );
+    } else {
+      return true;
+    }
+  }
+
+  protected validateChannelParameters(options: CreateChannelOptions): boolean {
+    return (
+      this.verifyEmptyChannelParameters(options) &&
+      this.validateParameterLength(options)
+    );
+  }
+
+  // create contract instance
+  protected createContractInstance(
+    contractAddress: string | `0x${string}`,
+    contractABI: any,
+    network: Chain
+  ) {
+    if (!this.signer) {
+      throw new Error('Signer is not provided');
+    }
+    let contract: any;
+    const pushSigner = this.signer ? new Signer(this.signer) : null;
+    if (pushSigner?.isViemSigner(this.signer)) {
+      const client = createPublicClient({
+        chain: network,
+        transport: http(),
+      });
+      contract = getContract({
+        abi: contractABI,
+        address: contractAddress as `0x${string}`,
+        client: {
+          public: client,
+          wallet: this.signer as unknown as WalletClient,
+        },
+      });
+    } else {
+      contract = new ethers.Contract(
+        contractAddress,
+        contractABI,
+        this.signer as unknown as EthersSigner
+      );
+    }
+    return contract;
+  }
+
+  protected async fetchBalance(contract: any, userAddress: string) {
+    if (!this.signer) {
+      throw new Error('Signer is not provided');
+    }
+    let balance: bigint;
+    const pushSigner = new Signer(this.signer);
+    try {
+      if (pushSigner.isViemSigner(this.signer)) {
+        balance = BigInt(
+          await contract.read.balanceOf({
+            args: [userAddress],
+          })
+        );
+      } else {
+        balance = BigInt(await contract.balanceOf(userAddress));
+      }
+      return balance;
+    } catch (err) {
+      throw new Error(JSON.stringify(err));
+    }
+  }
+
+  protected async fetchAllownace(
+    contract: any,
+    userAddress: string,
+    spenderAddress: string
+  ) {
+    if (!this.signer) {
+      throw new Error('Signer is not provided');
+    }
+
+    const pushSigner = new Signer(this.signer);
+    let allowance: bigint;
+    try {
+      if (!pushSigner.isViemSigner(this.signer)) {
+        allowance = BigInt(
+          await contract!['allowance'](userAddress, spenderAddress)
+        );
+      } else {
+        allowance = BigInt(
+          await contract.read.allowance({
+            args: [userAddress, spenderAddress],
+          })
+        );
+      }
+      return allowance;
+    } catch (error) {
+      throw new Error(JSON.stringify(error));
+    }
+  }
+
+  protected async fetchUpdateCounter(contract: any, userAddress: string) {
+    if (!this.signer) {
+      throw new Error('Signer is not provided');
+    }
+    let count: bigint;
+    const pushSigner = new Signer(this.signer);
+    try {
+      if (!pushSigner.isViemSigner(this.signer)) {
+        count = BigInt(await contract!['channelUpdateCounter'](userAddress));
+      } else {
+        count = BigInt(
+          await contract.read.channelUpdateCounter({
+            args: [userAddress],
+          })
+        );
+      }
+      // add one and return the count
+      return count + BigInt(1);
+    } catch (error) {
+      throw new Error(JSON.stringify(error));
+    }
+  }
+
+  protected async approveToken(
+    contract: any,
+    spenderAddress: string,
+    amount: string | bigint
+  ) {
+    try {
+      if (!this.signer) {
+        throw new Error('Signer is not provided');
+      }
+      const pushSigner = new Signer(this.signer);
+
+      if (!pushSigner.isViemSigner(this.signer)) {
+        if (!this.signer || !this.signer.provider) {
+          throw new Error('ethers provider/signer is not provided');
+        }
+        const approvalTrxPromise = contract!['approve'](spenderAddress, amount);
+        const approvalTrx = await approvalTrxPromise;
+        await this.signer?.provider?.waitForTransaction(approvalTrx.hash);
+      } else {
+        if (!contract.write) {
+          throw new Error('viem signer is not provided');
+        }
+        const approvalTrxPromise = contract.write.approve({
+          args: [spenderAddress, amount],
+        });
+        const approvalTrxRes = await approvalTrxPromise;
+      }
+      return true;
+    } catch (error) {
+      console.error(error);
+      return false;
+    }
+  }
+
+  protected async createChannel(
+    contract: any,
+    channelType: number,
+    identityBytes: Uint8Array,
+    fees: bigint
+  ) {
+    let createChannelRes;
+    try {
+      if (!this.signer) {
+        throw new Error('Signer is not provided');
+      }
+      const pushSigner = new Signer(this.signer);
+      if (!pushSigner.isViemSigner(this.signer)) {
+        const createChannelPromise = contract!['createChannelWithPUSH'](
+          channelType,
+          identityBytes,
+          fees,
+          this.getTimeBound(),
+          {
+            gasLimit: 1000000,
+          }
+        );
+        const createChannelTrx = await createChannelPromise;
+        const createChannelTrxStatus =
+          await this.signer?.provider?.waitForTransaction(
+            createChannelTrx.hash
+          );
+        if (createChannelTrxStatus?.status == 0) {
+          throw new Error('Something Went wrong while creating your channel');
+        }
+        createChannelRes = createChannelTrx.hash;
+      } else {
+        if (!contract.write) {
+          throw new Error('viem signer is not provided');
+        }
+        const createChannelPromise = contract.write.createChannelWithPUSH({
+          args: [
+            channelType,
+            toHex(new Uint8Array(identityBytes)),
+            fees,
+            this.getTimeBound(),
+          ],
+        });
+        createChannelRes = await createChannelPromise;
+      }
+      return createChannelRes;
+    } catch (error: any) {
+      throw new Error(error?.message);
+    }
+  }
+
+  protected async updateChannel(
+    contract: any,
+    account: string,
+    identityBytes: Uint8Array,
+    fees: bigint
+  ) {
+    let updateChannelRes;
+    try {
+      if (!this.signer) {
+        throw new Error('Signer is not provided');
+      }
+      const pushSigner = new Signer(this.signer);
+      if (!pushSigner.isViemSigner(this.signer)) {
+        const updateChannelPromise = contract!['updateChannelMeta'](
+          account,
+          identityBytes,
+          fees,
+          {
+            gasLimit: 1000000,
+          }
+        );
+        const updateChannelTrx = await updateChannelPromise;
+        const updateChannelTrxStatus =
+          await this.signer?.provider?.waitForTransaction(
+            updateChannelTrx.hash
+          );
+        if (updateChannelTrxStatus?.status == 0) {
+          throw new Error('Something Went wrong while updating your channel');
+        }
+        updateChannelRes = updateChannelTrx.hash;
+      } else {
+        if (!contract.write) {
+          throw new Error('viem signer is not provided');
+        }
+        const updateChannelPromise = contract.write.updateChannelMeta({
+          args: [account, toHex(new Uint8Array(identityBytes)), fees],
+        });
+        updateChannelRes = await updateChannelPromise;
+      }
+
+      return updateChannelRes;
+    } catch (error: any) {
+      throw new Error(error?.message);
+    }
+  }
+
+  protected async verifyChannel(contract: any, channelToBeVerified: string) {
+    try {
+      if (!this.signer) {
+        throw new Error('Signer is not provided');
+      }
+      const pushSigner = new Signer(this.signer);
+      let verifyTrxRes;
+      if (!pushSigner.isViemSigner(this.signer)) {
+        if (!this.signer.provider) {
+          throw new Error('ethers provider is not provided');
+        }
+        const verifyTrxPromise = contract!['verify'](channelToBeVerified);
+        const verifyTrx = await verifyTrxPromise;
+        await this.signer?.provider?.waitForTransaction(verifyTrx.hash);
+        verifyTrxRes = verifyTrx.hash;
+      } else {
+        if (!contract.write) {
+          throw new Error('viem signer is not provided');
+        }
+        const verifyTrxPromise = contract.write.verify({
+          args: [channelToBeVerified],
+        });
+        verifyTrxRes = await verifyTrxPromise;
+      }
+      return verifyTrxRes;
+    } catch (error: any) {
+      throw new Error(error.message);
+    }
+  }
+
+  protected async createChanelSettings(
+    contract: any,
+    numberOfSettings: number,
+    settings: string,
+    description: string,
+    fees: bigint
+  ) {
+    try {
+      if (!this.signer) {
+        throw new Error('Signer is not provided');
+      }
+      const pushSigner = new Signer(this.signer);
+      let createSettingsRes;
+      if (!pushSigner.isViemSigner(this.signer)) {
+        if (!this.signer.provider) {
+          throw new Error('ethers provider is not provided');
+        }
+        const createSettingsPromise = contract!['createChannelSettings'](
+          numberOfSettings,
+          settings,
+          description,
+          fees
+        );
+        const createSettings = await createSettingsPromise;
+        await this.signer?.provider?.waitForTransaction(createSettings.hash);
+        createSettingsRes = createSettings.hash;
+      } else {
+        if (!contract.write) {
+          throw new Error('viem signer is not provided');
+        }
+        const createSettingsTrxPromise = contract.write.createChannelSettings({
+          args: [numberOfSettings, settings, description, fees],
+        });
+        createSettingsRes = await createSettingsTrxPromise;
+      }
+      return createSettingsRes;
+    } catch (error: any) {
+      throw new Error(error.message);
+    }
+  }
+
+  protected async addDelegator(contract: any, delegatee: string) {
+    try {
+      if (!this.signer) {
+        throw new Error('Signer is not provided');
+      }
+      const pushSigner = new Signer(this.signer);
+      let addDelegateRes;
+      if (!pushSigner.isViemSigner(this.signer)) {
+        if (!this.signer.provider) {
+          throw new Error('ethers provider is not provided');
+        }
+        const addDelegateTrxPromise = contract!['addDelegate'](delegatee);
+        const addDelegateTrx = await addDelegateTrxPromise;
+        await this.signer?.provider?.waitForTransaction(addDelegateTrx.hash);
+        addDelegateRes = addDelegateTrx.hash;
+      } else {
+        if (!contract.write) {
+          throw new Error('viem signer is not provided');
+        }
+        const addDelegateTrxPromise = contract.write.addDelegate({
+          args: [delegatee],
+        });
+        addDelegateRes = await addDelegateTrxPromise;
+      }
+      return addDelegateRes;
+    } catch (error: any) {
+      throw new Error(error.message);
+    }
+  }
+
+  protected async removeDelegator(contract: any, delegatee: string) {
+    try {
+      if (!this.signer) {
+        throw new Error('Signer is not provided');
+      }
+      const pushSigner = new Signer(this.signer);
+      let removeDelegateRes;
+      if (!pushSigner.isViemSigner(this.signer)) {
+        if (!this.signer.provider) {
+          throw new Error('ethers provider is not provided');
+        }
+        const removeDelegateTrxPromise = contract!['removeDelegate'](delegatee);
+        const removeDelegateTrx = await removeDelegateTrxPromise;
+        await this.signer?.provider?.waitForTransaction(removeDelegateTrx.hash);
+        removeDelegateRes = removeDelegateTrx.hash;
+      } else {
+        if (!contract.write) {
+          throw new Error('viem signer is not provided');
+        }
+        const removeDelegateTrxPromise = contract.write.removeDelegate({
+          args: [delegatee],
+        });
+        removeDelegateRes = await removeDelegateTrxPromise;
+      }
+      return removeDelegateRes;
+    } catch (error: any) {
+      throw new Error(error.message);
+    }
+  }
+
+  protected async getChainId(signer: SignerType) {
+    if (!this.signer) {
+      throw new Error('Signer is not provided');
+    }
+    const pushSigner = new Signer(this.signer);
+    return pushSigner.getChainId();
+  }
+
+  protected async uploadToIPFSViaPushNode(data: string): Promise<string> {
+    try {
+      const API_BASE_URL = await getAPIBaseUrls(this.env!);
+      const response = await axiosPost(`${API_BASE_URL}/v1/ipfs/upload`, {
+        data,
+      });
+      return response.data.cid as string;
+    } catch (error) {
+      throw new Error('Something went wrong while uploading data to IPFS');
+    }
+  }
+
+  protected getTimeBound(timeStamp?: number) {
+    // for now returns 0 for non-time bound. Later it can be modified to handle time bound channels
+    return 0;
+  }
+
+  protected getMinimalSetting(configuration: NotificationSettings): {
+    setting: string;
+    description: string;
+  } {
+    let notificationSetting = '';
+    let notificationSettingDescription = '';
+    for (let i = 0; i < configuration.length; i++) {
+      const ele = configuration[i];
+      if (ele.type == BOOLEAN_TYPE) {
+        notificationSetting =
+          notificationSetting +
+          SETTING_SEPARATOR +
+          BOOLEAN_TYPE +
+          SETTING_DELIMITER +
+          ele.default;
+      }
+      if (ele.type == SLIDER_TYPE) {
+        if (ele.data) {
+          const enabled =
+            ele.data && ele.data.enabled != undefined
+              ? Number(ele.data.enabled).toString()
+              : DEFAULT_ENABLE_VALUE;
+          const ticker = ele.data.ticker ?? DEFAULT_TICKER_VALUE;
+          notificationSetting =
+            notificationSetting +
+            SETTING_SEPARATOR +
+            SLIDER_TYPE +
+            SETTING_DELIMITER +
+            enabled +
+            SETTING_DELIMITER +
+            ele.default +
+            SETTING_DELIMITER +
+            ele.data.lower +
+            SETTING_DELIMITER +
+            ele.data.upper +
+            SETTING_DELIMITER +
+            ticker;
+        }
+      }
+      if (ele.type == RANGE_TYPE) {
+        if (ele.default && typeof ele.default == 'object' && ele.data) {
+          const enabled =
+            ele.data && ele.data.enabled != undefined
+              ? Number(ele.data.enabled).toString()
+              : DEFAULT_ENABLE_VALUE;
+          const ticker = ele.data.ticker ?? DEFAULT_TICKER_VALUE;
+          notificationSetting =
+            notificationSetting +
+            SETTING_SEPARATOR +
+            RANGE_TYPE +
+            SETTING_DELIMITER +
+            enabled +
+            SETTING_DELIMITER +
+            ele.default.lower +
+            SETTING_DELIMITER +
+            ele.default.upper +
+            SETTING_DELIMITER +
+            ele.data.lower +
+            SETTING_DELIMITER +
+            ele.data.upper +
+            SETTING_DELIMITER +
+            ticker;
+        }
+      }
+
+      notificationSettingDescription =
+        notificationSettingDescription + SETTING_SEPARATOR + ele.description;
+    }
+    return {
+      setting: notificationSetting.replace(/^\+/, ''),
+      description: notificationSettingDescription.replace(/^\+/, ''),
+    };
+  }
+
+  protected getMinimalUserSetting(setting: UserSetting[]) {
+    if (!setting) {
+      return null;
+    }
+    let userSetting = '';
+    let numberOfSettings = 0;
+    for (let i = 0; i < setting.length; i++) {
+      const ele = setting[i];
+      const enabled = ele.enabled ? 1 : 0;
+      if (ele.enabled) numberOfSettings++;
+
+      if (Object.keys(ele).includes('value')) {
+        // slider type
+        if (typeof ele.value == 'number')
+          userSetting =
+            userSetting +
+            SLIDER_TYPE +
+            SETTING_DELIMITER +
+            enabled +
+            SETTING_DELIMITER +
+            ele.value;
+        else {
+          userSetting =
+            userSetting +
+            RANGE_TYPE +
+            SETTING_DELIMITER +
+            enabled +
+            SETTING_DELIMITER +
+            ele.value?.lower +
+            SETTING_DELIMITER +
+            ele.value?.upper;
+        }
+      } else {
+        // boolean type
+        userSetting = userSetting + BOOLEAN_TYPE + SETTING_DELIMITER + enabled;
+      }
+      if (i != setting.length - 1)
+        userSetting = userSetting + SETTING_SEPARATOR;
+    }
+    return numberOfSettings + SETTING_SEPARATOR + userSetting;
+  }
+
+  /**
+   * @param address Address of the channel or alias
+   * @returns Channel info for the address
+   */
+  protected async getChannelOrAliasInfo(address: string) {
+    try {
+      const channelOrAliasCaip = validateCAIP(address)
+        ? address
+        : getFallbackETHCAIPAddress(this.env!, this.account!);
+
+      const { networkId } = getCAIPDetails(
+        channelOrAliasCaip
+      ) as CAIPDetailsType;
+
+      let channelInCaip = channelOrAliasCaip;
+      if (networkId !== '1' && networkId !== '11155111') {
+        // Alias
+        const aliasInfo = await this.getAliasInfo(address);
+        channelInCaip = aliasInfo?.channel || channelInCaip;
+      }
+
+      const channelInfo = await PUSH_CHANNEL.getChannel({
+        channel: channelInCaip,
+        env: this.env,
+      });
+
+      return channelInfo || null;
+    } catch (error) {
+      return null;
+    }
+  }
+
+  protected async initiateAddAlias(contract: any, alias: string) {
+    try {
+      if (!this.signer) {
+        throw new Error('Signer is not provided');
+      }
+      const pushSigner = new Signer(this.signer);
+      let addAliasRes;
+      if (!pushSigner.isViemSigner(this.signer)) {
+        if (!this.signer.provider) {
+          throw new Error('ethers provider is not provided');
+        }
+
+        const addAliasTrxPromise = contract!['verifyChannelAlias'](alias);
+        const addAliasTrx = await addAliasTrxPromise;
+        await this.signer?.provider?.waitForTransaction(addAliasTrx.hash);
+        addAliasRes = addAliasTrx.hash;
+      } else {
+        if (!contract.write) {
+          throw new Error('viem signer is not provided');
+        }
+
+        const addAliasTrxPromise = contract.write.verifyChannelAlias({
+          args: [alias],
+        });
+        addAliasRes = await addAliasTrxPromise;
+      }
+      return addAliasRes;
+    } catch (error: any) {
+      throw new Error(error.message);
+    }
+  }
+
+  protected async verifyAlias(contract: any, channelAddress: string) {
+    try {
+      if (!this.signer) {
+        throw new Error('Signer is not provided');
+      }
+      const pushSigner = new Signer(this.signer);
+      let verifyAliasRes;
+      if (!pushSigner.isViemSigner(this.signer)) {
+        if (!this.signer.provider) {
+          throw new Error('ethers provider is not provided');
+        }
+        const addAliasTrxPromise =
+          contract!['verifyChannelAlias'](channelAddress);
+        const addAliasTrx = await addAliasTrxPromise;
+        await this.signer?.provider?.waitForTransaction(addAliasTrx.hash);
+        verifyAliasRes = addAliasTrx.hash;
+      } else {
+        if (!contract.write) {
+          throw new Error('viem signer is not provided');
+        }
+        const addAliasTrxPromise = contract.write.verifyChannelAlias({
+          args: [channelAddress],
+        });
+        verifyAliasRes = await addAliasTrxPromise;
+      }
+
+      const networkDetails = await pushSigner.getChainId();
+      const aliasAddress = await pushSigner.getAddress();
+
+      const aliasIncaip = `eip155:${networkDetails}:${aliasAddress}`;
+      const channelInfo = await this.getChannelOrAliasInfo(aliasIncaip);
+
+      return { verifyAliasRes, channelInfo };
+    } catch (error: any) {
+      throw new Error(error.message);
+    }
+  }
+
+  /**
+   * @param aliasInCaip Alias address in CAIP format
+   * @returns Channel info for the alias
+   */
+  private async getAliasInfo(aliasInCaip: string) {
+    const API_BASE_URL = await getAPIBaseUrls(this.env!);
+    const apiEndpoint = `${API_BASE_URL}/v1/alias`;
+    const requestUrl = `${apiEndpoint}/${aliasInCaip}/channel`;
+
+    try {
+      const response = await axiosGet(requestUrl);
+      return response.data;
+    } catch (error) {
+      return null;
+    }
+  }
+
+  protected getAddressFromCaip(caipAddress: string): string {
+    return caipAddress?.split(':')[caipAddress?.split(':').length - 1];
+  }
+
+  protected isValidPCaip(address: string): boolean {
+    const addressComponents = address.split(':');
+    return (
+      addressComponents.length == 2 &&
+      addressComponents[0] == 'eip155' &&
+      viem.isAddress(addressComponents[1])
+    );
+  }
+}
diff --git a/packages/dnode/src/lib/pushValidator/pushValidator.ts b/packages/dnode/src/lib/pushValidator/pushValidator.ts
new file mode 100644
index 000000000..4bdff4f11
--- /dev/null
+++ b/packages/dnode/src/lib/pushValidator/pushValidator.ts
@@ -0,0 +1,143 @@
+import { getRandomElement } from '../helpers';
+import {
+  ActiveValidator,
+  PingReply,
+  TokenReply,
+  ValidatorContract,
+} from './pushValidatorTypes';
+import { axiosGet } from '../utils/axiosUtil';
+import { createPublicClient, getContract, http } from 'viem';
+import * as config from '../config';
+import { ENV } from '../constants';
+
+/**
+ * @description Push validator class is used for the following:
+ * - Interact with validator.sol ( Only Read calls )
+ * - Get token to interact with a random validator node
+ * - Ping a random validator node to check if it is alive
+ */
+export class PushValidator {
+  private static instance: PushValidator;
+  private validatorContractClient: ValidatorContract;
+  /**
+   * @dev - active validator URL ( Used for Get calls to a validator node )
+   */
+  public activeValidatorURL: string;
+  public env: ENV;
+
+  private constructor(
+    activeValidatorURL: string,
+    env: ENV,
+    validatorContractClient: ValidatorContract
+  ) {
+    this.activeValidatorURL = activeValidatorURL;
+    this.env = env;
+    this.validatorContractClient = validatorContractClient;
+  }
+
+  static initalize = async (options?: { env: ENV }): Promise<PushValidator> => {
+    const settings = options || { env: ENV.STAGING };
+
+    /**
+     * @dev - If instance is not created or env is different, create a new instance
+     */
+    if (
+      !PushValidator.instance ||
+      PushValidator.instance.env !== settings.env
+    ) {
+      const validatorContractClient =
+        PushValidator.createValidatorContractClient(settings.env);
+      const activeValidator = await PushValidator.getActiveValidator(
+        validatorContractClient
+      );
+      PushValidator.instance = new PushValidator(
+        activeValidator.nodeApiBaseUrl,
+        settings.env,
+        validatorContractClient
+      );
+    }
+    return PushValidator.instance;
+  };
+
+  /**
+   * @description Get validator node token
+   * @returns Token reply object with API token and validator URL
+   */
+  getToken = async (): Promise<TokenReply | null> => {
+    const activeValidator = await PushValidator.getActiveValidator(
+      this.validatorContractClient
+    );
+    const requestUrl = `${activeValidator.nodeApiBaseUrl}/apis/v1/messaging/validatorToken`;
+    return await axiosGet(requestUrl)
+      .then((response) => {
+        if (response.status != 200) {
+          throw new Error(
+            `error status: ${response.status} data: ${response.data}`
+          );
+        }
+        return response.data;
+      })
+      .catch((err) => {
+        console.error(`[Push SDK] - API ${requestUrl}: `, err);
+        return null;
+      });
+  };
+
+  /**
+   * @description Ping validator
+   * @param validatorUrl - Validator URL to ping (default is active validator URL)
+   * @returns Ping reply object
+   */
+  ping = async (
+    validatorUrl: string = this.activeValidatorURL
+  ): Promise<PingReply | null> => {
+    const requestUrl = `${validatorUrl}/apis/v1/messaging/ping`;
+    return await axiosGet(requestUrl)
+      .then((response) => {
+        if (response.status != 200) {
+          throw new Error(
+            `error status: ${response.status} data: ${response.data}`
+          );
+        }
+        return response.data;
+      })
+      .catch((err) => {
+        console.error(`[Push SDK] - API ${requestUrl}: `, err);
+        return null;
+      });
+  };
+
+  /**
+   * @description Get active validator
+   * @returns Active validator object
+   */
+  private static getActiveValidator = async (
+    validatorContractClient: ValidatorContract
+  ): Promise<ActiveValidator> => {
+    const activeValidators =
+      await validatorContractClient.read.getActiveVNodes();
+    return getRandomElement(activeValidators);
+  };
+
+  /**
+   * @description Create validator contract client
+   * @param env - Environment
+   * @dev - Currently only supports public client
+   * @returns Validator contract client
+   */
+  private static createValidatorContractClient = (
+    env: ENV
+  ): ValidatorContract => {
+    const client = createPublicClient({
+      chain: config.VALIDATOR_CONFIG[env].NETWORK,
+      transport: http(),
+    });
+    return getContract({
+      abi: config.ABIS.VALIDATOR,
+      address: config.VALIDATOR_CONFIG[env].VALIDATOR_CONTRACT as `0x${string}`,
+      client: {
+        public: client,
+      },
+    }) as any;
+  };
+}
diff --git a/packages/dnode/src/lib/pushValidator/pushValidatorTypes.ts b/packages/dnode/src/lib/pushValidator/pushValidatorTypes.ts
new file mode 100644
index 000000000..3cf10ebe8
--- /dev/null
+++ b/packages/dnode/src/lib/pushValidator/pushValidatorTypes.ts
@@ -0,0 +1,44 @@
+export type TokenReply = { validatorToken: string; validatorUrl: string };
+
+export type PingReply = {
+  nodeId: string;
+  tsMillis: number;
+  status: string;
+};
+
+export type ActiveValidator = {
+  nodeWallet: string;
+  nodeApiBaseUrl: string;
+};
+
+/**
+ * @description Validator contract interface ( VIEM CLIENT )
+ */
+export type ValidatorContract = {
+  read: {
+    getActiveVNodes(): Promise<ActiveValidator[]>;
+    nodeMap(address: string): Promise<NodeInfo>;
+  };
+};
+
+type NodeInfo = {
+  ownerWallet: string;
+  nodeWallet: string;
+  nodeType: NodeType;
+  nodeApiBaseUrl: string;
+  status: NodeStatus;
+};
+
+enum NodeType {
+  VNode = 0, // validator 0
+  SNode = 1, // storage 1
+  DNode = 2, // delivery 2
+}
+
+enum NodeStatus {
+  OK,
+  Reported,
+  Slashed,
+  BannedAndUnstaked,
+  Unstaked,
+}
diff --git a/packages/dnode/src/lib/pushstream/DataModifier.ts b/packages/dnode/src/lib/pushstream/DataModifier.ts
new file mode 100644
index 000000000..c2f155349
--- /dev/null
+++ b/packages/dnode/src/lib/pushstream/DataModifier.ts
@@ -0,0 +1,78 @@
+import {
+  NotificationEvent,
+  NotificationEventType,
+  NotificationType,
+  NOTIFICATION,
+} from './pushStreamTypes';
+
+export class DataModifier {
+  public static mapToNotificationEvent(
+    data: any,
+    notificationEventType: NotificationEventType,
+    origin: 'other' | 'self',
+    includeRaw = false
+  ): NotificationEvent {
+    const notificationType =
+      (Object.keys(NOTIFICATION.TYPE) as NotificationType[]).find(
+        (key) => NOTIFICATION.TYPE[key] === data.payload.data.type
+      ) || 'BROADCAST'; // Assuming 'BROADCAST' as the default
+
+    let recipients: string[];
+
+    if (Array.isArray(data.payload.recipients)) {
+      recipients = data.payload.recipients;
+    } else if (typeof data.payload.recipients === 'string') {
+      recipients = [data.payload.recipients];
+    } else {
+      recipients = Object.keys(data.payload.recipients);
+    }
+
+    const notificationEvent: NotificationEvent = {
+      event: notificationEventType,
+      origin: origin,
+      timestamp: data.epoch,
+      from: data.sender,
+      to: recipients,
+      notifID: data.payload_id.toString(),
+      channel: {
+        name: data.payload.data.app,
+        icon: data.payload.data.icon,
+        url: data.payload.data.url,
+      },
+      meta: {
+        type: 'NOTIFICATION.' + notificationType,
+      },
+      message: {
+        notification: {
+          title: data.payload.notification.title,
+          body: data.payload.notification.body,
+        },
+        payload: {
+          title: data.payload.data.asub,
+          body: data.payload.data.amsg,
+          cta: data.payload.data.acta,
+          embed: data.payload.data.aimg,
+          meta: {
+            domain: data.payload.data.additionalMeta?.domain || 'push.org',
+            type: data.payload.data.additionalMeta?.type,
+            data: data.payload.data.additionalMeta?.data,
+          },
+        },
+      },
+      config: {
+        expiry: data.payload.data.etime,
+        silent: data.payload.data.silent === '1',
+        hidden: data.payload.data.hidden === '1',
+      },
+      source: data.source,
+    };
+
+    if (includeRaw) {
+      notificationEvent.raw = {
+        verificationProof: data.payload.verificationProof,
+      };
+    }
+
+    return notificationEvent;
+  }
+}
diff --git a/packages/dnode/src/lib/pushstream/PushStream.ts b/packages/dnode/src/lib/pushstream/PushStream.ts
new file mode 100644
index 000000000..7052897ff
--- /dev/null
+++ b/packages/dnode/src/lib/pushstream/PushStream.ts
@@ -0,0 +1,315 @@
+import { EventEmitter } from 'events';
+import { createSocketConnection } from './socketClient';
+import { ENV } from '../constants';
+import {
+  NotificationEventType,
+  PushStreamInitializeProps,
+  STREAM,
+  EVENTS,
+} from './pushStreamTypes';
+import { DataModifier } from './DataModifier';
+import { pCAIP10ToWallet } from '../helpers';
+import { ProgressHookType, SignerType } from '../types';
+import { ALPHA_FEATURE_CONFIG } from '../config';
+import { ADDITIONAL_META_TYPE } from '../payloads';
+import { v4 as uuidv4 } from 'uuid';
+
+export type StreamType = STREAM | '*';
+export class PushStream extends EventEmitter {
+  private pushNotificationSocket: any;
+
+  private account: string;
+  private raw: boolean;
+  private options: PushStreamInitializeProps;
+  private listen: StreamType[];
+  private disconnected: boolean;
+  public uid: string;
+  public notifSocketCount: number;
+  public notifSocketConnected: boolean;
+  constructor(
+    account: string,
+    private _listen: StreamType[],
+    options: PushStreamInitializeProps,
+    private decryptedPgpPvtKey?: string,
+    private progressHook?: (progress: ProgressHookType) => void,
+    private signer?: SignerType
+  ) {
+    super();
+
+    this.account = account;
+
+    this.raw = options.raw ?? false;
+    this.options = options;
+    this.listen = _listen;
+    this.disconnected = false;
+    this.uid = uuidv4();
+    this.notifSocketCount = 0;
+    this.notifSocketConnected = false;
+  }
+
+  static async initialize(
+    account: string,
+    listen: StreamType[],
+    env: ENV,
+    decryptedPgpPvtKey?: string,
+    progressHook?: (progress: ProgressHookType) => void,
+    signer?: SignerType,
+    options?: PushStreamInitializeProps
+  ): Promise<PushStream> {
+    const defaultOptions: PushStreamInitializeProps = {
+      raw: false,
+      connection: {
+        auto: true,
+        retries: 3,
+      },
+      env: env,
+    };
+
+    if (!listen || listen.length === 0) {
+      throw new Error(
+        'The listen property must have at least one STREAM type.'
+      );
+    }
+
+    const settings = {
+      ...defaultOptions,
+      ...options,
+    };
+
+    const accountToUse = settings.overrideAccount || account;
+
+    if (listen.includes('*')) {
+      listen = Object.values(STREAM);
+    }
+
+    const stream = new PushStream(
+      accountToUse,
+      listen,
+      settings,
+      decryptedPgpPvtKey,
+      progressHook,
+      signer
+    );
+    return stream;
+  }
+
+  public async reinit(
+    listen: STREAM[],
+    newOptions: PushStreamInitializeProps
+  ): Promise<void> {
+    this.uid = uuidv4();
+    this.listen = listen;
+    this.options = { ...this.options, ...newOptions };
+    await this.disconnect();
+    await this.connect();
+  }
+
+  public async connect(): Promise<void> {
+    return new Promise<void>((resolve, reject) => {
+      (async () => {
+        const shouldInitializeNotifSocket =
+          !this.listen ||
+          this.listen.length === 0 ||
+          this.listen.includes(STREAM.NOTIF) ||
+          this.listen.includes(STREAM.NOTIF_OPS);
+
+        let isNotifSocketConnected = false;
+        // Function to check and emit the STREAM.CONNECT event
+        const checkAndEmitConnectEvent = () => {
+          if (
+            (shouldInitializeNotifSocket && isNotifSocketConnected) ||
+            !shouldInitializeNotifSocket
+          ) {
+            this.emit(STREAM.CONNECT);
+            console.log(
+              'RestAPI::PushStream::connect - Emitted STREAM.CONNECT'
+            );
+            resolve();
+          }
+        };
+
+        const TIMEOUT_DURATION = 5000; // Timeout duration in milliseconds
+        setTimeout(() => {
+          if (!this.notifSocketConnected) {
+            reject(new Error('Connection timeout')); // Reject the promise if connect event is not emitted within the timeout
+          }
+        }, TIMEOUT_DURATION);
+
+        const handleSocketDisconnection = async (socketType: 'notif') => {
+          if (socketType === 'notif') {
+            isNotifSocketConnected = false;
+            this.notifSocketConnected = false;
+            this.notifSocketCount--;
+            this.emit(STREAM.DISCONNECT);
+            console.log(
+              'RestAPI::PushStream::handleSocketDisconnection - Emitted STREAM.DISCONNECT for notification.'
+            );
+          }
+        };
+
+        if (shouldInitializeNotifSocket) {
+          if (!this.pushNotificationSocket) {
+            // If pushNotificationSocket does not exist, create a new socket connection
+            console.log(
+              'RestAPI::PushStream::NotifSocket::Create - pushNotificationSocket does not exist, creating new socket connection...'
+            );
+            this.pushNotificationSocket = await createSocketConnection({
+              user: pCAIP10ToWallet(this.account),
+              env: this.options?.env as ENV,
+              socketOptions: {
+                autoConnect: this.options?.connection?.auto ?? true,
+                reconnectionAttempts: this.options?.connection?.retries ?? 3,
+              },
+            });
+
+            if (!this.pushNotificationSocket) {
+              reject(
+                new Error(
+                  'RestAPI::PushStream::NotifSocket::Error - Push notification socket not connected'
+                )
+              );
+            }
+          } else if (
+            this.pushNotificationSocket &&
+            !this.notifSocketConnected
+          ) {
+            // If pushNotificationSocket exists but is not connected, attempt to reconnect
+            console.log(
+              'RestAPI::PushStream::NotifSocket::Reconnect - Attempting to reconnect push notification socket...'
+            );
+            this.notifSocketCount++;
+            this.pushNotificationSocket.connect(); // Assuming connect() is the method to re-establish connection
+          } else {
+            // If pushNotificationSocket is already connected
+            console.log(
+              'RestAPI::PushStream::NotifSocket::Status - Push notification socket already connected'
+            );
+          }
+        }
+
+        const shouldEmit = (eventType: STREAM): boolean => {
+          if (!this.listen || this.listen.length === 0) {
+            return true;
+          }
+          return this.listen.includes(eventType);
+        };
+
+        if (this.pushNotificationSocket) {
+          this.pushNotificationSocket.on(EVENTS.CONNECT, async () => {
+            console.log(
+              `RestAPI::PushStream::NotifSocket::Connect - Notification Socket Connected (ID: ${this.pushNotificationSocket.id})`
+            );
+            isNotifSocketConnected = true;
+            this.notifSocketCount++;
+            this.notifSocketConnected = true;
+            checkAndEmitConnectEvent();
+          });
+
+          this.pushNotificationSocket.on(EVENTS.DISCONNECT, async () => {
+            console.log(
+              'RestAPI::PushStream::NotifSocket::Disconnect - Notification socket disconnected.'
+            );
+            await handleSocketDisconnection('notif');
+          });
+
+          this.pushNotificationSocket.on(EVENTS.USER_FEEDS, (data: any) => {
+            try {
+              if (
+                data.payload.data.additionalMeta?.type ===
+                `${ADDITIONAL_META_TYPE.PUSH_VIDEO}+1`
+              ) {
+                // VIDEO NOTIF NOT IMPLEMENTED
+              } else {
+                // Channel Notification
+                const modifiedData = DataModifier.mapToNotificationEvent(
+                  data,
+                  NotificationEventType.INBOX,
+                  this.account === data.sender ? 'self' : 'other',
+                  this.raw
+                );
+
+                if (this.shouldEmitChannel(modifiedData.from)) {
+                  if (shouldEmit(STREAM.NOTIF)) {
+                    this.emit(STREAM.NOTIF, modifiedData);
+                  }
+                }
+              }
+            } catch (error) {
+              console.error(
+                `RestAPI::PushStream::NotifSocket::UserFeeds::Error - Error handling event: ${error}, Data: ${JSON.stringify(
+                  data
+                )}`
+              );
+            }
+          });
+
+          this.pushNotificationSocket.on(
+            EVENTS.USER_SPAM_FEEDS,
+            (data: any) => {
+              try {
+                const modifiedData = DataModifier.mapToNotificationEvent(
+                  data,
+                  NotificationEventType.SPAM,
+                  this.account === data.sender ? 'self' : 'other',
+                  this.raw
+                );
+                modifiedData.origin =
+                  this.account === modifiedData.from ? 'self' : 'other';
+                if (this.shouldEmitChannel(modifiedData.from)) {
+                  if (shouldEmit(STREAM.NOTIF)) {
+                    this.emit(STREAM.NOTIF, modifiedData);
+                  }
+                }
+              } catch (error) {
+                console.error(
+                  'Error handling USER_SPAM_FEEDS event:',
+                  error,
+                  'Data:',
+                  data
+                );
+              }
+            }
+          );
+        }
+
+        this.disconnected = false;
+      })();
+    });
+  }
+
+  public connected(): boolean {
+    // Log the connection status of both sockets with detailed prefix
+    console.log(
+      `RestAPI::PushStream::connected::Notification Socket Connected: ${this.notifSocketConnected}`
+    );
+    return this.notifSocketConnected;
+  }
+
+  public async disconnect(): Promise<void> {
+    // Disconnect push notification socket if connected
+    if (this.pushNotificationSocket && this.notifSocketConnected) {
+      this.pushNotificationSocket.disconnect();
+      console.log(
+        'RestAPI::PushStream::disconnect::Push notification socket disconnected.'
+      );
+    }
+  }
+
+  public info() {
+    return {
+      options: this.options,
+      listen: this.listen,
+    };
+  }
+
+  private shouldEmitChannel(dataChannelId: string): boolean {
+    if (
+      !this.options.filter?.channels ||
+      this.options.filter.channels.length === 0 ||
+      this.options.filter.channels.includes('*')
+    ) {
+      return true;
+    }
+    return this.options.filter.channels.includes(dataChannelId);
+  }
+}
diff --git a/packages/dnode/src/lib/pushstream/pushStreamTypes.ts b/packages/dnode/src/lib/pushstream/pushStreamTypes.ts
new file mode 100644
index 000000000..aba5f30dd
--- /dev/null
+++ b/packages/dnode/src/lib/pushstream/pushStreamTypes.ts
@@ -0,0 +1,114 @@
+import { ENV } from '../constants';
+
+export type PushStreamInitializeProps = {
+  filter?: {
+    channels?: string[];
+  };
+  connection?: {
+    auto?: boolean;
+    retries?: number;
+  };
+  raw?: boolean;
+  env?: ENV;
+  overrideAccount?: string;
+};
+
+export enum STREAM {
+  PROFILE = 'STREAM.PROFILE',
+  ENCRYPTION = 'STREAM.ENCRYPTION',
+  NOTIF = 'STREAM.NOTIF',
+  NOTIF_OPS = 'STREAM.NOTIF_OPS',
+  CONNECT = 'STREAM.CONNECT',
+  DISCONNECT = 'STREAM.DISCONNECT',
+}
+
+export enum NotificationEventType {
+  INBOX = 'notification.inbox',
+  SPAM = 'notification.spam',
+}
+
+export interface Profile {
+  image: string;
+  publicKey: string;
+}
+
+export const NOTIFICATION = {
+  TYPE: {
+    BROADCAST: 1,
+    TARGETTED: 3,
+    SUBSET: 4,
+  },
+} as const;
+
+export type NotificationType = keyof typeof NOTIFICATION.TYPE;
+
+export interface NotificationEvent {
+  event: NotificationEventType;
+  origin: 'other' | 'self';
+  timestamp: string;
+  from: string;
+  to: string[];
+  notifID: string;
+  channel: {
+    name: string;
+    icon: string;
+    url: string;
+  };
+  meta: {
+    type: string;
+  };
+  message: {
+    notification: {
+      title: string;
+      body: string;
+    };
+    payload?: {
+      title?: string;
+      body?: string;
+      cta?: string;
+      embed?: string;
+      meta?: {
+        domain?: string;
+        type: string;
+        data: string;
+      };
+    };
+  };
+  config?: {
+    expiry?: number;
+    silent?: boolean;
+    hidden?: boolean;
+  };
+  advanced?: {
+    chatid?: string;
+  };
+  source: string;
+  streamUid?: string;
+  raw?: {
+    verificationProof: string;
+  };
+}
+
+export enum EVENTS {
+  // Websocket
+  CONNECT = 'connect',
+  DISCONNECT = 'disconnect',
+
+  // Notification
+  USER_FEEDS = 'userFeeds',
+  USER_SPAM_FEEDS = 'userSpamFeeds',
+}
+
+export type SocketInputOptions = {
+  user: string;
+  env: ENV;
+  apiKey?: string;
+  socketOptions?: SocketOptions;
+};
+
+type SocketOptions = {
+  autoConnect: boolean;
+  reconnectionAttempts?: number;
+  reconnectionDelayMax?: number;
+  reconnectionDelay?: number;
+};
diff --git a/packages/dnode/src/lib/pushstream/socketClient.ts b/packages/dnode/src/lib/pushstream/socketClient.ts
new file mode 100644
index 000000000..9cd042db4
--- /dev/null
+++ b/packages/dnode/src/lib/pushstream/socketClient.ts
@@ -0,0 +1,44 @@
+import { io } from 'socket.io-client';
+import { getCAIPAddress } from '../helpers';
+import { SocketInputOptions } from './pushStreamTypes';
+import { getAPIBaseUrls } from '../helpers';
+
+export async function createSocketConnection({
+  user,
+  env,
+  socketOptions,
+}: SocketInputOptions) {
+  const {
+    autoConnect = true,
+    reconnectionAttempts = 5,
+    reconnectionDelay,
+    reconnectionDelayMax,
+  } = socketOptions || {};
+
+  let pushWSUrl = await getAPIBaseUrls(env);
+
+  if (pushWSUrl.endsWith('/apis')) {
+    pushWSUrl = pushWSUrl.substring(0, pushWSUrl.length - 5);
+  }
+  const transports = ['websocket'];
+
+  let pushSocket = null;
+
+  try {
+    const userAddressInCAIP = await getCAIPAddress(env, user, 'User');
+    const query = { address: userAddressInCAIP };
+
+    pushSocket = io(pushWSUrl, {
+      transports,
+      query,
+      autoConnect,
+      reconnectionAttempts,
+      ...(reconnectionDelay !== undefined && { reconnectionDelay }),
+      ...(reconnectionDelayMax !== undefined && { reconnectionDelayMax }),
+    });
+  } catch (e) {
+    console.error('[PUSH-SDK] - Socket connection error: ', e);
+  }
+
+  return pushSocket;
+}
diff --git a/packages/dnode/src/lib/types/index.ts b/packages/dnode/src/lib/types/index.ts
new file mode 100644
index 000000000..0ff5d65a0
--- /dev/null
+++ b/packages/dnode/src/lib/types/index.ts
@@ -0,0 +1,419 @@
+// for namespace TYPES
+/* eslint-disable @typescript-eslint/no-namespace */
+import {
+  ADDITIONAL_META_TYPE,
+  IDENTITY_TYPE,
+  NOTIFICATION_TYPE,
+  VIDEO_NOTIFICATION_ACCESS_TYPE,
+} from '../../lib/payloads/constants';
+import { ENV } from '../constants';
+import { EthEncryptedData } from '@metamask/eth-sig-util';
+
+export type Env = (typeof ENV)[keyof typeof ENV];
+
+// the type for the the response of the input data to be parsed
+export type ApiNotificationType = {
+  payload_id: number;
+  channel: string;
+  epoch: string;
+  payload: {
+    apns: {
+      payload: {
+        aps: {
+          category: string;
+          'mutable-content': number;
+          'content-available': number;
+        };
+      };
+      fcm_options: {
+        image: string;
+      };
+    };
+    data: {
+      app: string;
+      sid: string;
+      url: string;
+      acta: string;
+      aimg: string;
+      amsg: string;
+      asub: string;
+      icon: string;
+      type: string;
+      epoch: string;
+      appbot: string;
+      hidden: string;
+      secret: string;
+    };
+    android: {
+      notification: {
+        icon: string;
+        color: string;
+        image: string;
+        default_vibrate_timings: boolean;
+      };
+    };
+    notification: {
+      body: string;
+      title: string;
+    };
+  };
+  source: string;
+};
+
+// The output response from parsing a notification object
+export type ParsedResponseType = {
+  cta: string;
+  title: string;
+  message: string;
+  icon: string;
+  url: string;
+  sid: string;
+  app: string;
+  image: string;
+  blockchain: string;
+  secret: string;
+  notification: {
+    title: string;
+    body: string;
+  };
+};
+
+export type ApiSubscriptionType = {
+  channel: string;
+  user_settings: string | null;
+};
+
+export type NotificationSettingType = {
+  type: number;
+  default?: number | { upper: number; lower: number };
+  description: string;
+  data?: {
+    upper: number;
+    lower: number;
+    ticker?: number;
+  };
+  userPreferance?: {
+    value: number | { upper: number; lower: number };
+    enabled: boolean;
+  };
+};
+
+export type ApiSubscribersType = {
+  itemcount: number;
+  subscribers: {
+    subscriber: string;
+    settings: string | null;
+  }[];
+};
+
+export interface VideoNotificationRules {
+  access: {
+    type: VIDEO_NOTIFICATION_ACCESS_TYPE;
+    data: {
+      chatId?: string;
+    };
+  };
+}
+
+// SendNotificationRules can be extended in the future for other use cases
+export type SendNotificationRules = VideoNotificationRules;
+
+export interface ISendNotificationInputOptions {
+  senderType?: 0 | 1;
+  signer: any;
+  type: NOTIFICATION_TYPE;
+  identityType: IDENTITY_TYPE;
+  notification?: {
+    title: string;
+    body: string;
+  };
+  payload?: {
+    sectype?: string;
+    title: string;
+    body: string;
+    cta: string;
+    img: string;
+    hidden?: boolean;
+    etime?: number;
+    silent?: boolean;
+    additionalMeta?:
+      | {
+          /**
+           * type = ADDITIONAL_META_TYPE+VERSION
+           * VERSION > 0
+           */
+          type: `${ADDITIONAL_META_TYPE}+${number}`;
+          data: string;
+          domain?: string;
+        }
+      | string;
+    /**
+     * @deprecated
+     * use additionalMeta instead
+     */
+    metadata?: any;
+    index?: string;
+  };
+  recipients?: string | string[]; // CAIP or plain ETH
+  channel: string; // CAIP or plain ETH
+  /**
+   * @deprecated
+   * use payload.etime instead
+   */
+  expiry?: number;
+  /**
+   * @deprecated
+   * use payload.hidden instead
+   */
+  hidden?: boolean;
+  graph?: {
+    id: string;
+    counter: number;
+  };
+  ipfsHash?: string;
+  env?: ENV;
+  /** @deprecated - Use `rules` object instead */
+  chatId?: string;
+  rules?: SendNotificationRules;
+  pgpPrivateKey?: string;
+  channelFound?: boolean;
+}
+
+export interface INotificationPayload {
+  notification: {
+    title: string;
+    body: string;
+  };
+  data: {
+    acta: string;
+    aimg: string;
+    amsg: string;
+    asub: string;
+    type: string;
+    etime?: number;
+    hidden?: boolean;
+    sectype?: string;
+  };
+  recipients: any;
+}
+
+export interface UserProfile {
+  name: string | null;
+  desc: string | null;
+  picture: string | null;
+  blockedUsersList: Array<string> | null;
+  profileVerificationProof: string | null;
+}
+
+export interface UserV2 {
+  msgSent: number;
+  maxMsgPersisted: number;
+  did: string;
+  wallets: string;
+  profile: UserProfile;
+  encryptedPrivateKey: string | null;
+  publicKey: string | null;
+  verificationProof: string | null;
+  origin?: string | null;
+}
+
+export interface Subscribers {
+  itemcount: number;
+  subscribers: Array<string>;
+}
+
+export interface IUser {
+  msgSent: number;
+  maxMsgPersisted: number;
+  did: string;
+  wallets: string;
+  profile: {
+    name: string | null;
+    desc: string | null;
+    picture: string | null;
+    profileVerificationProof: string | null;
+    blockedUsersList: Array<string> | null;
+  };
+  encryptedPrivateKey: string;
+  publicKey: string;
+  verificationProof: string;
+  origin?: string | null;
+
+  /**
+   * @deprecated Use `profile.name` instead.
+   */
+  name: string | null;
+  /**
+   * @deprecated Use `profile.desc` instead.
+   */
+  about: string | null;
+  /**
+   * @deprecated Use `profile.picture` instead.
+   */
+  profilePicture: string | null;
+  /**
+   * @deprecated Use `msgSent` instead.
+   */
+  numMsg: number;
+  /**
+   * @deprecated Use `maxMsgPersisted` instead.
+   */
+  allowedNumMsg: number;
+  /**
+   * @deprecated Use `encryptedPrivateKey.version` instead.
+   */
+  encryptionType: string;
+  /**
+   * @deprecated Use `verificationProof` instead.
+   */
+  signature: string;
+  /**
+   * @deprecated Use `verificationProof` instead.
+   */
+  sigType: string;
+  /**
+   * @deprecated Use `encryptedPrivateKey.encryptedPassword` instead.
+   */
+  encryptedPassword: string | null;
+  /**
+   * @deprecated
+   */
+  nftOwner: string | null;
+  /**
+   * @deprecated Not recommended to be used anywhere
+   */
+  linkedListHash?: string | null;
+  /**
+   * @deprecated Not recommended to be used anywhere
+   */
+  nfts?: [] | null;
+}
+
+export interface IConnectedUser extends IUser {
+  privateKey: string | null;
+}
+
+export interface AccountEnvOptionsType extends EnvOptionsType {
+  /**
+   * Environment variable
+   */
+  account: string;
+}
+
+export interface ConversationHashOptionsType extends AccountEnvOptionsType {
+  conversationId: string;
+}
+
+export interface UserInfo {
+  wallets: string;
+  publicKey: string;
+  name: string;
+  image: string;
+  isAdmin: boolean;
+}
+
+export type TypedDataField = {
+  name: string;
+  type: string;
+};
+
+export type TypedDataDomain = {
+  chainId?: number | undefined;
+  name?: string | undefined;
+  salt?: string | undefined;
+  verifyingContract?: string | undefined;
+  version?: string | undefined;
+};
+
+export type ethersV5SignerType = {
+  _signTypedData: (
+    domain: TypedDataDomain,
+    types: Record<string, Array<TypedDataField>>,
+    value: Record<string, any>
+  ) => Promise<string>;
+  getAddress: () => Promise<string>;
+  signMessage: (message: Uint8Array | string) => Promise<string>;
+  privateKey?: string;
+  provider?: any;
+};
+
+export type ethersV6SignerType = {
+  signTypedData: (
+    domain: TypedDataDomain,
+    types: Record<string, Array<TypedDataField>>,
+    value: Record<string, any>
+  ) => Promise<string>;
+  getAddress: () => Promise<string>;
+  signMessage: (message: Uint8Array | string) => Promise<string>;
+  privateKey?: string;
+  provider?: any;
+};
+
+export type viemSignerType = {
+  signTypedData: (args: {
+    account: any;
+    domain: any;
+    types: any;
+    primaryType: any;
+    message: any;
+  }) => Promise<`0x${string}`>;
+  getChainId: () => Promise<number>;
+  signMessage: (args: {
+    message: any;
+    account: any;
+    [key: string]: any;
+  }) => Promise<`0x${string}`>;
+  account: { [key: string]: any };
+  privateKey?: string;
+  provider?: any;
+};
+
+export type SignerType =
+  | ethersV5SignerType
+  | ethersV6SignerType
+  | viemSignerType;
+
+export type EnvOptionsType = {
+  env?: ENV;
+};
+
+export type walletType = {
+  account: string | null;
+  signer: SignerType | null;
+};
+
+export type encryptedPrivateKeyTypeV1 = EthEncryptedData;
+
+export type encryptedPrivateKeyTypeV2 = {
+  ciphertext: string;
+  version?: string;
+  salt?: string;
+  nonce: string;
+  preKey?: string;
+  encryptedPassword?: encryptedPrivateKeyTypeV2;
+};
+
+export type encryptedPrivateKeyType = {
+  version?: string;
+  nonce: string;
+  ephemPublicKey?: string;
+  ciphertext: string;
+  salt?: string;
+  preKey?: string;
+  encryptedPassword?: encryptedPrivateKeyTypeV2;
+};
+
+export type ProgressHookType = {
+  progressId: string;
+  progressTitle: string;
+  progressInfo: string;
+  level: 'INFO' | 'SUCCESS' | 'WARN' | 'ERROR';
+};
+
+export type ProgressHookTypeFunction = (...args: any[]) => ProgressHookType;
+
+export enum NotifictaionType {
+  BROADCAT = 1,
+  TARGETTED = 3,
+  SUBSET = 4,
+}
diff --git a/packages/dnode/src/lib/user/auth.updateUser.ts b/packages/dnode/src/lib/user/auth.updateUser.ts
new file mode 100644
index 000000000..252839a70
--- /dev/null
+++ b/packages/dnode/src/lib/user/auth.updateUser.ts
@@ -0,0 +1,142 @@
+import {
+  authUpdateUserService,
+  getAccountAddress,
+  getWallet,
+} from '../chat/helpers';
+import Constants, { ENV, ENCRYPTION_TYPE } from '../constants';
+import {
+  encryptPGPKey,
+  isValidPushCAIP,
+  preparePGPPublicKey,
+  walletToPCAIP10,
+} from '../helpers';
+import PROGRESSHOOK from '../progressHook';
+import {
+  SignerType,
+  IUser,
+  ProgressHookType,
+  encryptedPrivateKeyType,
+  encryptedPrivateKeyTypeV2,
+  ProgressHookTypeFunction,
+} from '../types';
+import { get } from './getUser';
+
+//used only in progressHook to abstract encryption algotrithms
+enum ENCRYPTION_TYPE_VERSION {
+  'x25519-xsalsa20-poly1305' = 'PGP_V1',
+  'aes256GcmHkdfSha256' = 'PGP_V2',
+  'eip191-aes256-gcm-hkdf-sha256' = 'PGP_V3',
+  'pgpv1:nft' = 'NFTPGP_V1',
+}
+
+export type AuthUpdateProps = {
+  pgpPrivateKey: string; // decrypted pgp priv key
+  pgpEncryptionVersion: ENCRYPTION_TYPE;
+  signer: SignerType;
+  pgpPublicKey: string;
+  account?: string;
+  env?: ENV;
+  additionalMeta?: {
+    NFTPGP_V1?: {
+      password: string; //new nft profile password
+    };
+  };
+  progressHook?: (progress: ProgressHookType) => void;
+};
+
+/**
+ * Updation of encryption keys of a Push Profile to a specific version
+ */
+export const authUpdate = async (options: AuthUpdateProps): Promise<IUser> => {
+  const {
+    pgpPrivateKey,
+    pgpEncryptionVersion,
+    signer,
+    pgpPublicKey,
+    account = null,
+    env = Constants.ENV.PROD,
+    additionalMeta,
+    progressHook,
+  } = options || {};
+
+  try {
+    const wallet = getWallet({ account, signer });
+    const address = await getAccountAddress(wallet);
+
+    const updatingCreds =
+      pgpEncryptionVersion === Constants.USER.ENCRYPTION_TYPE.NFTPGP_V1
+        ? true
+        : false;
+
+    if (!isValidPushCAIP(address)) {
+      throw new Error(`Invalid address!`);
+    }
+
+    const caip10 = walletToPCAIP10(address);
+    const user = await get({ account: caip10, env: env });
+
+    if (!user || !user.encryptedPrivateKey) {
+      throw new Error('User not Found!');
+    }
+
+    // Report Progress
+    updatingCreds
+      ? progressHook?.(PROGRESSHOOK['PUSH-AUTH-UPDATE-05'] as ProgressHookType)
+      : progressHook?.(
+          (PROGRESSHOOK['PUSH-AUTH-UPDATE-01'] as ProgressHookTypeFunction)(
+            ENCRYPTION_TYPE_VERSION[pgpEncryptionVersion]
+          )
+        );
+    const signedPublicKey = await preparePGPPublicKey(
+      pgpEncryptionVersion,
+      pgpPublicKey,
+      wallet
+    );
+
+    // Report Progress
+    updatingCreds
+      ? progressHook?.(PROGRESSHOOK['PUSH-AUTH-UPDATE-06'] as ProgressHookType)
+      : progressHook?.(
+          (PROGRESSHOOK['PUSH-AUTH-UPDATE-02'] as ProgressHookTypeFunction)(
+            ENCRYPTION_TYPE_VERSION[pgpEncryptionVersion]
+          )
+        );
+    const encryptedPgpPrivateKey: encryptedPrivateKeyType = await encryptPGPKey(
+      pgpEncryptionVersion,
+      pgpPrivateKey,
+      wallet,
+      additionalMeta
+    );
+    if (pgpEncryptionVersion === ENCRYPTION_TYPE.NFTPGP_V1) {
+      const encryptedPassword: encryptedPrivateKeyTypeV2 = await encryptPGPKey(
+        ENCRYPTION_TYPE.PGP_V3,
+        additionalMeta?.NFTPGP_V1?.password as string,
+        wallet,
+        additionalMeta
+      );
+      encryptedPgpPrivateKey.encryptedPassword = encryptedPassword;
+    }
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-AUTH-UPDATE-03'] as ProgressHookType);
+    const body = {
+      user: user.did,
+      wallet,
+      publicKey: signedPublicKey,
+      encryptedPrivateKey: JSON.stringify(encryptedPgpPrivateKey),
+      env,
+    };
+    const updatedUser = await authUpdateUserService(body);
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-AUTH-UPDATE-04'] as ProgressHookType);
+    return updatedUser;
+  } catch (err) {
+    // Report Progress
+    const errorProgressHook = PROGRESSHOOK[
+      'PUSH-ERROR-00'
+    ] as ProgressHookTypeFunction;
+    progressHook?.(errorProgressHook(authUpdate.name, err));
+    throw Error(`[Push SDK] - API - Error - API ${authUpdate.name} -: ${err}`);
+  }
+};
diff --git a/packages/dnode/src/lib/user/createUser.ts b/packages/dnode/src/lib/user/createUser.ts
new file mode 100644
index 000000000..c14822009
--- /dev/null
+++ b/packages/dnode/src/lib/user/createUser.ts
@@ -0,0 +1,151 @@
+import {
+  IPGPHelper,
+  PGPHelper,
+  createUserService,
+  generateRandomSecret,
+  getAccountAddress,
+  getWallet,
+} from '../chat/helpers';
+import Constants, { ENV } from '../constants';
+import {
+  isValidPushCAIP,
+  walletToPCAIP10,
+  encryptPGPKey,
+  preparePGPPublicKey,
+  isValidNFTCAIP,
+  validatePssword,
+} from '../helpers';
+import {
+  SignerType,
+  encryptedPrivateKeyType,
+  ProgressHookType,
+  IUser,
+  encryptedPrivateKeyTypeV2,
+  ProgressHookTypeFunction,
+} from '../types';
+import PROGRESSHOOK from '../progressHook';
+
+export type CreateUserProps = {
+  env?: ENV;
+  account?: string;
+  signer?: SignerType;
+  version?: typeof Constants.ENC_TYPE_V1 | typeof Constants.ENC_TYPE_V3;
+  additionalMeta?: {
+    NFTPGP_V1?: {
+      password: string;
+    };
+  };
+  progressHook?: (progress: ProgressHookType) => void;
+  origin?: string | null;
+};
+
+interface ICreateUser extends IUser {
+  decryptedPrivateKey?: string;
+}
+
+export const create = async (
+  options: CreateUserProps
+): Promise<ICreateUser> => {
+  return await createUserCore(options, PGPHelper);
+};
+
+export const createUserCore = async (
+  options: CreateUserProps,
+  pgpHelper: IPGPHelper
+): Promise<ICreateUser> => {
+  const passPrefix = '$0Pc'; //password prefix to ensure password validation
+  const {
+    env = Constants.ENV.PROD,
+    account = null,
+    signer = null,
+    version = Constants.ENC_TYPE_V3,
+    additionalMeta = {
+      NFTPGP_V1: {
+        password: passPrefix + generateRandomSecret(10),
+      },
+    },
+    progressHook,
+    origin,
+  } = options || {};
+
+  try {
+    if (account == null && signer == null) {
+      throw new Error(`At least one from account or signer is necessary!`);
+    }
+
+    const wallet = getWallet({ account, signer });
+    const address = await getAccountAddress(wallet);
+
+    if (!isValidPushCAIP(address)) {
+      throw new Error(`Invalid address!`);
+    }
+    if (additionalMeta?.NFTPGP_V1?.password) {
+      validatePssword(additionalMeta.NFTPGP_V1.password);
+    }
+
+    const caip10: string = walletToPCAIP10(address);
+    let encryptionType = version;
+
+    if (isValidNFTCAIP(caip10)) {
+      // upgrade to v4 (nft encryption)
+      encryptionType = Constants.ENC_TYPE_V4;
+    } else {
+      // downgrade to v1
+      if (!signer) encryptionType = Constants.ENC_TYPE_V1;
+    }
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-CREATE-01'] as ProgressHookType);
+    const keyPairs = await pgpHelper.generateKeyPair();
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-CREATE-02'] as ProgressHookType);
+    const publicKey: string = await preparePGPPublicKey(
+      encryptionType,
+      keyPairs.publicKeyArmored,
+      wallet
+    );
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-CREATE-03'] as ProgressHookType);
+    const encryptedPrivateKey: encryptedPrivateKeyType = await encryptPGPKey(
+      encryptionType,
+      keyPairs.privateKeyArmored,
+      wallet,
+      additionalMeta
+    );
+    if (encryptionType === Constants.ENC_TYPE_V4) {
+      const encryptedPassword: encryptedPrivateKeyTypeV2 = await encryptPGPKey(
+        Constants.ENC_TYPE_V3,
+        additionalMeta.NFTPGP_V1?.password as string,
+        wallet,
+        additionalMeta
+      );
+      encryptedPrivateKey.encryptedPassword = encryptedPassword;
+    }
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-CREATE-04'] as ProgressHookType);
+    const body = {
+      user: caip10,
+      wallet,
+      publicKey: publicKey,
+      encryptedPrivateKey: JSON.stringify(encryptedPrivateKey),
+      env,
+      origin: origin,
+    };
+    const createdUser: ICreateUser = await createUserService(body);
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-CREATE-05'] as ProgressHookType);
+    createdUser.decryptedPrivateKey = keyPairs.privateKeyArmored;
+    return createdUser;
+  } catch (err) {
+    // Report Progress
+    const errorProgressHook = PROGRESSHOOK[
+      'PUSH-ERROR-00'
+    ] as ProgressHookTypeFunction;
+    progressHook?.(errorProgressHook(create.name, err));
+    throw Error(`[Push SDK] - API - Error - API ${create.name} -: ${err}`);
+  }
+};
diff --git a/packages/dnode/src/lib/user/createUserWithProfile.ts b/packages/dnode/src/lib/user/createUserWithProfile.ts
new file mode 100644
index 000000000..d9a99a342
--- /dev/null
+++ b/packages/dnode/src/lib/user/createUserWithProfile.ts
@@ -0,0 +1,51 @@
+import { create } from './createUser';
+import { IUser, ProgressHookType, SignerType } from '../types';
+import { profileUpdate } from './profile.updateUser';
+import { decryptPGPKey } from '../../../src/lib/helpers';
+import Constants, { ENV } from '../constants';
+
+export type CreateUserPropsWithProfile = {
+  env?: ENV;
+  account?: string;
+  signer?: SignerType;
+  version?: typeof Constants.ENC_TYPE_V1 | typeof Constants.ENC_TYPE_V3;
+  additionalMeta?: {
+    NFTPGP_V1?: {
+      password: string;
+    };
+  };
+  profile?: {
+    name?: string;
+    desc?: string;
+    picture?: string;
+    blockedUsersList?: Array<string>;
+  };
+  progressHook?: (progress: ProgressHookType) => void;
+};
+
+export const createUserWithProfile = async (
+  userOptions: CreateUserPropsWithProfile
+): Promise<IUser> => {
+  try {
+    let user = await create(userOptions);
+
+    if (userOptions.profile) {
+      const pk = await decryptPGPKey({
+        account: user.did,
+        encryptedPGPPrivateKey: user.encryptedPrivateKey,
+        env: userOptions.env,
+        signer: userOptions.signer,
+      });
+
+      user = await profileUpdate({
+        account: user.did,
+        env: userOptions.env,
+        pgpPrivateKey: pk,
+        profile: userOptions.profile,
+      });
+    }
+    return user;
+  } catch (err) {
+    throw new Error(`[Push SDK] - Error in createUserWithProfile -: ${err}`);
+  }
+};
diff --git a/packages/dnode/src/lib/user/decryptAuth.ts b/packages/dnode/src/lib/user/decryptAuth.ts
new file mode 100644
index 000000000..47f6c42c5
--- /dev/null
+++ b/packages/dnode/src/lib/user/decryptAuth.ts
@@ -0,0 +1,68 @@
+import Constants, { ENV } from '../constants';
+import { decryptPGPKey, isValidNFTCAIP } from '../helpers';
+import PROGRESSHOOK from '../progressHook';
+import {
+  ProgressHookType,
+  ProgressHookTypeFunction,
+  SignerType,
+} from '../types';
+
+type decryptAuthProps = {
+  signer: SignerType;
+  account?: string;
+  env?: ENV;
+  additionalMeta?: {
+    NFTPGP_V1?: {
+      encryptedPassword: string;
+    };
+  };
+  /**
+   * To get Progress Related to fn
+   */
+  progressHook?: (progress: ProgressHookType) => void;
+};
+
+/**
+ *
+ * @returns Decrypted Push Profile Password
+ */
+export const decryptAuth = async (
+  options: decryptAuthProps
+): Promise<string | null> => {
+  const {
+    account,
+    signer,
+    env = Constants.ENV.PROD,
+    additionalMeta,
+    progressHook,
+  } = options || {};
+  try {
+    if (!isValidNFTCAIP(account as string)) {
+      return null;
+    }
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-DECRYPT-AUTH-01'] as ProgressHookType);
+    const password = await decryptPGPKey({
+      encryptedPGPPrivateKey: additionalMeta?.NFTPGP_V1
+        ?.encryptedPassword as string,
+      signer,
+      account,
+      env,
+    });
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-DECRYPT-AUTH-02'] as ProgressHookType);
+    return password;
+  } catch (err) {
+    // Report Progress
+    progressHook?.(
+      (PROGRESSHOOK['PUSH-ERROR-00'] as ProgressHookTypeFunction)(
+        decryptAuth.name,
+        err
+      )
+    );
+    throw Error(
+      `[Push SDK] - API  - Error - API ${decryptAuth.name} -: ${err}`
+    );
+  }
+};
diff --git a/packages/dnode/src/lib/user/getDelegations.ts b/packages/dnode/src/lib/user/getDelegations.ts
new file mode 100644
index 000000000..3497cc10a
--- /dev/null
+++ b/packages/dnode/src/lib/user/getDelegations.ts
@@ -0,0 +1,32 @@
+import { getCAIPAddress, getAPIBaseUrls } from '../helpers';
+import Constants, { ENV } from '../constants';
+import { axiosGet } from '../utils/axiosUtil';
+
+/**
+ *  GET /users/:userAddressInCAIP/delegations
+ */
+
+export type UserDelegationsOptionsType = {
+  /** wallet address of user */
+  user: string;
+  env?: ENV;
+};
+
+/**
+ *  Returns the list of channels that the user has been delegated to
+ */
+
+export const getDelegations = async (options: UserDelegationsOptionsType) => {
+  const { user, env = Constants.ENV.PROD } = options || {};
+
+  const _user = await getCAIPAddress(env, user, 'User');
+  const API_BASE_URL = await getAPIBaseUrls(env);
+  const apiEndpoint = `${API_BASE_URL}/v1/users/${_user}/delegations`;
+  const requestUrl = `${apiEndpoint}`;
+
+  return axiosGet(requestUrl)
+    .then((response) => response.data?.delegations || [])
+    .catch((err) => {
+      console.error(`[EPNS-SDK] - API ${requestUrl}: `, err);
+    });
+};
diff --git a/packages/dnode/src/lib/user/getFeeds.ts b/packages/dnode/src/lib/user/getFeeds.ts
new file mode 100644
index 000000000..b1340a2ec
--- /dev/null
+++ b/packages/dnode/src/lib/user/getFeeds.ts
@@ -0,0 +1,52 @@
+import {
+  getCAIPAddress,
+  getAPIBaseUrls,
+  getQueryParams,
+  getLimit,
+  walletToPCAIP10,
+} from '../helpers';
+import Constants, { ENV } from '../constants';
+import { parseApiResponse } from '../utils';
+import { axiosGet } from '../utils/axiosUtil';
+
+export type FeedsOptionsType = {
+  user: string;
+  yearMonth: string;
+  afterEpoch: number | '';
+  env?: ENV;
+  page?: number;
+  limit?: number;
+  spam?: boolean;
+  raw?: boolean;
+};
+
+export const getFeeds = async (options: FeedsOptionsType) => {
+  const {
+    user,
+    yearMonth,
+    afterEpoch,
+    env = Constants.ENV.PROD,
+    page = Constants.PAGINATION.INITIAL_PAGE,
+    limit = Constants.PAGINATION.LIMIT,
+    spam = false,
+    raw = false,
+  } = options || {};
+
+  const _user = await walletToPCAIP10(user);
+  const API_BASE_URL = await getAPIBaseUrls(env);
+  const nsName = spam ? 'spam' : 'inbox';
+  let requestUrl = `${API_BASE_URL}/v1/messaging/ns/${nsName}/nsidx/${_user}/month/${yearMonth}/list`;
+  if (afterEpoch !== '') {
+    requestUrl = `${requestUrl}?fristTs=${afterEpoch}`;
+  }
+  return axiosGet(requestUrl)
+    .then((response) => {
+      // if (raw) {
+      return response.data;
+      // }
+      // return parseApiResponse(response?.data?.feeds) || [];
+    })
+    .catch((err) => {
+      console.error(`[Push SDK] - API ${requestUrl}: `, err);
+    });
+};
diff --git a/packages/dnode/src/lib/user/getFeedsPerChannel.ts b/packages/dnode/src/lib/user/getFeedsPerChannel.ts
new file mode 100644
index 000000000..e0c0a3bb1
--- /dev/null
+++ b/packages/dnode/src/lib/user/getFeedsPerChannel.ts
@@ -0,0 +1,58 @@
+import {
+  getCAIPAddress,
+  getAPIBaseUrls,
+  getQueryParams,
+  getLimit,
+} from '../helpers';
+import Constants, { ENV } from '../constants';
+import { parseApiResponse } from '../utils';
+import { axiosGet } from '../utils/axiosUtil';
+
+export type FeedsPerChannelOptionsType = {
+  user: string;
+  env?: ENV;
+  channels?: string[];
+  page?: number;
+  limit?: number;
+  spam?: boolean;
+  raw?: boolean;
+};
+
+export const getFeedsPerChannel = async (
+  options: FeedsPerChannelOptionsType
+) => {
+  const {
+    user,
+    env = Constants.ENV.PROD,
+    page = Constants.PAGINATION.INITIAL_PAGE,
+    limit = Constants.PAGINATION.LIMIT,
+    spam = false,
+    raw = false,
+    channels = [],
+  } = options || {};
+
+  const _user = await getCAIPAddress(env, user, 'User');
+  const API_BASE_URL = await getAPIBaseUrls(env);
+  if (channels.length == 0) {
+    throw new Error('channels cannot be empty');
+  }
+  const _channel = await getCAIPAddress(env, channels[0], 'Channel');
+  const apiEndpoint = `${API_BASE_URL}/v1/users/${_user}/channels/${_channel}/feeds`;
+  const queryObj = {
+    page,
+    limit: getLimit(limit),
+    spam,
+  };
+
+  const requestUrl = `${apiEndpoint}?${getQueryParams(queryObj)}`;
+  return axiosGet(requestUrl)
+    .then((response) => {
+      if (raw) {
+        return response?.data?.feeds || [];
+      }
+      return parseApiResponse(response?.data?.feeds) || [];
+    })
+    .catch((err) => {
+      console.error(`[Push SDK] - API ${requestUrl}: `, err);
+    });
+};
diff --git a/packages/dnode/src/lib/user/getSubscriptions.ts b/packages/dnode/src/lib/user/getSubscriptions.ts
new file mode 100644
index 000000000..ed88d38c2
--- /dev/null
+++ b/packages/dnode/src/lib/user/getSubscriptions.ts
@@ -0,0 +1,46 @@
+import { getCAIPAddress, getAPIBaseUrls, getQueryParams } from '../helpers';
+import Constants, { ENV } from '../constants';
+import { axiosGet } from '../utils/axiosUtil';
+import { parseSubscriptionsApiResponse } from '../utils/pasreSubscriptionAPI';
+
+export type UserSubscriptionsOptionsType = {
+  user: string;
+  env?: ENV;
+  channel?: string | null;
+  raw?: boolean;
+};
+
+export const getSubscriptions = async (
+  options: UserSubscriptionsOptionsType
+) => {
+  const {
+    user,
+    env = Constants.ENV.PROD,
+    channel = null,
+    raw = true,
+  } = options || {};
+
+  const _user = await getCAIPAddress(env, user, 'User');
+  const API_BASE_URL = await getAPIBaseUrls(env);
+  const apiEndpoint = `${API_BASE_URL}/v1/users/${_user}/subscriptions`;
+  const query = channel
+    ? getQueryParams({
+        channel: channel,
+      })
+    : '';
+  const requestUrl = `${apiEndpoint}?${query}`;
+
+  return axiosGet(requestUrl)
+    .then((response) => {
+      if (raw) {
+        return response.data?.subscriptions || [];
+      } else {
+        return parseSubscriptionsApiResponse(
+          response.data?.subscriptions || []
+        );
+      }
+    })
+    .catch((err) => {
+      console.error(`[Push SDK] - API ${requestUrl}: `, err);
+    });
+};
diff --git a/packages/dnode/src/lib/user/getUser.ts b/packages/dnode/src/lib/user/getUser.ts
new file mode 100644
index 000000000..aefb69cfe
--- /dev/null
+++ b/packages/dnode/src/lib/user/getUser.ts
@@ -0,0 +1,33 @@
+import { AccountEnvOptionsType, IUser } from '../types';
+import { isValidPushCAIP, walletToPCAIP10 } from '../helpers/address';
+import { getAPIBaseUrls, verifyProfileKeys } from '../helpers';
+import Constants from '../constants';
+import { populateDeprecatedUser } from '../utils/populateIUser';
+import { axiosGet } from '../utils/axiosUtil';
+
+export const get = async (options: AccountEnvOptionsType): Promise<IUser> => {
+  const { account, env = Constants.ENV.PROD } = options || {};
+  if (!isValidPushCAIP(account)) {
+    throw new Error(`Invalid address!`);
+  }
+  const caip10 = walletToPCAIP10(account);
+  const API_BASE_URL = await getAPIBaseUrls(env);
+  const requestUrl = `${API_BASE_URL}/v2/users/?caip10=${caip10}`;
+  return axiosGet(requestUrl)
+    .then(async (response) => {
+      if (response.data) {
+        response.data.publicKey = await verifyProfileKeys(
+          response.data.encryptedPrivateKey,
+          response.data.publicKey,
+          response.data.did,
+          response.data.wallets,
+          response.data.verificationProof
+        );
+      }
+      return populateDeprecatedUser(response.data);
+    })
+    .catch((err) => {
+      console.error(`[Push SDK] - API ${requestUrl}: `, err);
+      throw Error(`[Push SDK] - API ${requestUrl}: ${err}`);
+    });
+};
diff --git a/packages/dnode/src/lib/user/getUsersBatch.ts b/packages/dnode/src/lib/user/getUsersBatch.ts
new file mode 100644
index 000000000..74e7845d0
--- /dev/null
+++ b/packages/dnode/src/lib/user/getUsersBatch.ts
@@ -0,0 +1,56 @@
+import { IUser } from '../types';
+import { isValidPushCAIP, walletToPCAIP10 } from '../helpers/address';
+import { getAPIBaseUrls, verifyProfileKeys } from '../helpers';
+import Constants, { ENV } from '../constants';
+import { populateDeprecatedUser } from '../utils/populateIUser';
+import { axiosPost } from '../utils/axiosUtil';
+
+export interface GetBatchType {
+  userIds: string[];
+  env?: ENV;
+}
+
+export const getBatch = async (options: GetBatchType): Promise<IUser> => {
+  const { env = Constants.ENV.PROD, userIds } = options || {};
+
+  const API_BASE_URL = await getAPIBaseUrls(env);
+  const requestUrl = `${API_BASE_URL}/v2/users/batch`;
+
+  const MAX_USER_IDS_LENGTH = 100;
+  if (userIds.length > MAX_USER_IDS_LENGTH) {
+    throw new Error(
+      `Too many user IDs. Maximum allowed: ${MAX_USER_IDS_LENGTH}`
+    );
+  }
+
+  for (let i = 0; i < userIds.length; i++) {
+    if (!isValidPushCAIP(userIds[i])) {
+      throw new Error(`Invalid user address!`);
+    }
+  }
+
+  const pcaipUserIds = userIds.map(walletToPCAIP10);
+  const requestBody = { userIds: pcaipUserIds };
+
+  return axiosPost(requestUrl, requestBody)
+    .then((response) => {
+      response.data.users.forEach(async (user: any, index: number) => {
+        response.data.users[index].publicKey = await verifyProfileKeys(
+          user.encryptedPrivateKey,
+          user.publicKey,
+          user.did,
+          user.caip10,
+          user.verificationProof
+        );
+
+        response.data.users[index] = populateDeprecatedUser(
+          response.data.users[index]
+        );
+      });
+      return response.data;
+    })
+    .catch((err) => {
+      console.error(`[Push SDK] - API ${requestUrl}: `, err);
+      throw Error(`[Push SDK] - API ${requestUrl}: ${err}`);
+    });
+};
diff --git a/packages/dnode/src/lib/user/index.ts b/packages/dnode/src/lib/user/index.ts
new file mode 100644
index 000000000..edcd89cb0
--- /dev/null
+++ b/packages/dnode/src/lib/user/index.ts
@@ -0,0 +1,21 @@
+import { authUpdate } from './auth.updateUser';
+import { profileUpdate, profileUpdateCore } from './profile.updateUser';
+export type { ProfileUpdateProps } from './profile.updateUser';
+export * from './createUser';
+export * from './getFeeds';
+export * from './getSubscriptions';
+export * from './getUser';
+export * from './getDelegations';
+export * from './getUsersBatch';
+export * from './upgradeUser';
+export * from './decryptAuth';
+export * from './createUserWithProfile';
+export * from './getFeedsPerChannel';
+
+export const auth = {
+  update: authUpdate,
+};
+export const profile = {
+  update: profileUpdate,
+  updateCore: profileUpdateCore,
+};
diff --git a/packages/dnode/src/lib/user/profile.updateUser.ts b/packages/dnode/src/lib/user/profile.updateUser.ts
new file mode 100644
index 000000000..31d1fdbf3
--- /dev/null
+++ b/packages/dnode/src/lib/user/profile.updateUser.ts
@@ -0,0 +1,133 @@
+import * as CryptoJS from 'crypto-js';
+import { IPGPHelper, PGPHelper } from '../chat/helpers';
+import Constants, { ENV } from '../constants';
+import {
+  convertToValidDID,
+  getAPIBaseUrls,
+  isValidPushCAIP,
+  verifyProfileKeys,
+} from '../helpers';
+import { IUser, ProgressHookType, ProgressHookTypeFunction } from '../types';
+import { get } from './getUser';
+import { populateDeprecatedUser } from '../utils/populateIUser';
+import PROGRESSHOOK from '../progressHook';
+import { axiosPut } from '../utils/axiosUtil';
+
+export type ProfileUpdateProps = {
+  /**
+   * PGP Private Key
+   */
+  pgpPrivateKey: string;
+  /**
+   * DID
+   */
+  account: string;
+  /**
+   *  Profile properties that can be changed
+   */
+  profile: {
+    name?: string;
+    desc?: string;
+    picture?: string;
+    blockedUsersList?: Array<string>;
+  };
+  env?: ENV;
+  progressHook?: (progress: ProgressHookType) => void;
+};
+
+/**
+ * Updation of profile
+ */
+export const profileUpdate = async (
+  options: ProfileUpdateProps
+): Promise<IUser> => {
+  return profileUpdateCore(options, PGPHelper);
+};
+
+export const profileUpdateCore = async (
+  options: ProfileUpdateProps,
+  pgpHelper: IPGPHelper
+): Promise<IUser> => {
+  const {
+    pgpPrivateKey,
+    account,
+    profile,
+    env = Constants.ENV.PROD,
+    progressHook,
+  } = options || {};
+  try {
+    if (!isValidPushCAIP(account)) {
+      throw new Error(`Invalid account!`);
+    }
+
+    const user = await get({ account, env });
+    if (!user || !user.did) {
+      throw new Error('User not Found!');
+    }
+    let blockedUsersList = null;
+    if (profile.blockedUsersList) {
+      for (const element of profile.blockedUsersList) {
+        // Check if the element is a valid CAIP-10 address
+        if (!isValidPushCAIP(element)) {
+          throw new Error(
+            'Invalid address in the blockedUsersList: ' + element
+          );
+        }
+      }
+
+      const convertedBlockedListUsersPromise = profile.blockedUsersList.map(
+        async (each) => {
+          return convertToValidDID(each, env);
+        }
+      );
+      blockedUsersList = await Promise.all(convertedBlockedListUsersPromise);
+
+      blockedUsersList = Array.from(new Set(blockedUsersList));
+    }
+
+    const updatedProfile = {
+      name: profile.name ? profile.name : user.profile.name,
+      desc: profile.desc ? profile.desc : user.profile.desc,
+      picture: profile.picture ? profile.picture : user.profile.picture,
+      // If profile.blockedUsersList is empty no users in block list
+      blockedUsersList: profile.blockedUsersList ? blockedUsersList : [],
+    };
+    const hash = CryptoJS.SHA256(JSON.stringify(updatedProfile)).toString();
+    const signature = await pgpHelper.sign({
+      message: hash,
+      signingKey: pgpPrivateKey,
+    });
+    const sigType = 'pgpv2';
+    const verificationProof = `${sigType}:${signature}`;
+
+    const body = { ...updatedProfile, verificationProof };
+
+    const API_BASE_URL = await getAPIBaseUrls(env);
+    const apiEndpoint = `${API_BASE_URL}/v2/users/${user.did}/profile`;
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-PROFILE-UPDATE-01'] as ProgressHookType);
+    const response = await axiosPut(apiEndpoint, body);
+    if (response.data)
+      response.data.publicKey = await verifyProfileKeys(
+        response.data.encryptedPrivateKey,
+        response.data.publicKey,
+        response.data.did,
+        response.data.wallets,
+        response.data.verificationProof
+      );
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-PROFILE-UPDATE-02'] as ProgressHookType);
+    return populateDeprecatedUser(response.data);
+  } catch (err) {
+    // Report Progress
+    const errorProgressHook = PROGRESSHOOK[
+      'PUSH-ERROR-00'
+    ] as ProgressHookTypeFunction;
+    progressHook?.(errorProgressHook(profileUpdate.name, err));
+    throw Error(
+      `[Push SDK] - API - Error - API ${profileUpdate.name} -: ${err}`
+    );
+  }
+};
diff --git a/packages/dnode/src/lib/user/upgradeUser.ts b/packages/dnode/src/lib/user/upgradeUser.ts
new file mode 100644
index 000000000..9df50d84a
--- /dev/null
+++ b/packages/dnode/src/lib/user/upgradeUser.ts
@@ -0,0 +1,97 @@
+import { getAccountAddress, getWallet } from '../chat/helpers';
+import Constants, { ENV } from '../constants';
+import { isValidPushCAIP, decryptPGPKey } from '../helpers';
+import {
+  SignerType,
+  IUser,
+  ProgressHookType,
+  ProgressHookTypeFunction,
+} from '../types';
+import { authUpdate } from './auth.updateUser';
+import { get } from './getUser';
+import PROGRESSHOOK from '../progressHook';
+
+export type UpgradeUserProps = {
+  env?: ENV;
+  account?: string;
+  signer: SignerType;
+  additionalMeta?: {
+    NFTPGP_V1?: {
+      password: string;
+    };
+  };
+  progressHook?: (progress: ProgressHookType) => void;
+};
+
+/**
+ * Upgrades the Push Profile keys from current version to recommended version
+ * @param options
+ * @returns
+ */
+export const upgrade = async (options: UpgradeUserProps): Promise<IUser> => {
+  const {
+    env = Constants.ENV.PROD,
+    account = null,
+    signer,
+    additionalMeta,
+    progressHook,
+  } = options || {};
+
+  try {
+    const wallet = getWallet({ account, signer });
+    const address = await getAccountAddress(wallet);
+
+    if (!isValidPushCAIP(address)) {
+      throw new Error(`Invalid address!`);
+    }
+
+    const user: IUser = await get({ account: address, env: env });
+
+    if (!user || !user.encryptedPrivateKey) {
+      throw new Error('User Not Found!');
+    }
+
+    const recommendedPgpEncryptionVersion =
+      Constants.USER.ENCRYPTION_TYPE.PGP_V3;
+    const { version } = JSON.parse(user.encryptedPrivateKey);
+
+    if (
+      version === recommendedPgpEncryptionVersion ||
+      version === Constants.USER.ENCRYPTION_TYPE.NFTPGP_V1
+    ) {
+      return user;
+    }
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-UPGRADE-02'] as ProgressHookType);
+    const pgpPrivateKey = await decryptPGPKey({
+      encryptedPGPPrivateKey: user.encryptedPrivateKey,
+      signer: signer,
+      env,
+      toUpgrade: false,
+      additionalMeta,
+    });
+
+    const upgradedUser = await authUpdate({
+      pgpPrivateKey, // decrypted pgp priv key
+      pgpEncryptionVersion: recommendedPgpEncryptionVersion,
+      signer,
+      pgpPublicKey: user.publicKey,
+      account: user.did,
+      env,
+      additionalMeta: additionalMeta,
+      progressHook: progressHook,
+    });
+
+    // Report Progress
+    progressHook?.(PROGRESSHOOK['PUSH-UPGRADE-05'] as ProgressHookType);
+    return upgradedUser;
+  } catch (err) {
+    // Report Progress
+    const errorProgressHook = PROGRESSHOOK[
+      'PUSH-ERROR-00'
+    ] as ProgressHookTypeFunction;
+    progressHook?.(errorProgressHook(upgrade.name, err));
+    throw Error(`[Push SDK] - API - Error - API ${upgrade.name} -: ${err}`);
+  }
+};
diff --git a/packages/dnode/src/lib/utils/axiosUtil.ts b/packages/dnode/src/lib/utils/axiosUtil.ts
new file mode 100644
index 000000000..9caac4989
--- /dev/null
+++ b/packages/dnode/src/lib/utils/axiosUtil.ts
@@ -0,0 +1,67 @@
+import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const packageJson = require('../../../package.json');
+const version = packageJson.version;
+
+const addSdkVersionHeader = (
+  config?: AxiosRequestConfig
+): AxiosRequestConfig => {
+  const headers = { ...config?.headers, 'X-JS-SDK-VERSION': version };
+  return { ...config, headers };
+};
+
+const checkForDeprecationHeader = <T = any>(
+  response: AxiosResponse<T>
+): AxiosResponse<T> => {
+  const deprecationNotice = response.headers['x-deprecation-notice'];
+  if (deprecationNotice) {
+    const method = response.config.method?.toUpperCase();
+    const path = response.config.url;
+    console.warn(
+      `%cDeprecation Notice%c Method: ${method}, Path: ${path}, Notice: ${deprecationNotice}`,
+      'color: white; background-color: red; font-weight: bold; padding: 2px 4px;',
+      'color: red; font-weight: bold;'
+    );
+  }
+  return response;
+};
+
+const axiosGet = async <T = any>(
+  url: string,
+  config?: AxiosRequestConfig
+): Promise<AxiosResponse<T>> => {
+  return axios
+    .get<T>(url, addSdkVersionHeader(config))
+    .then((response) => checkForDeprecationHeader(response));
+};
+
+const axiosPost = async <T = any>(
+  url: string,
+  data: any,
+  config?: AxiosRequestConfig
+): Promise<AxiosResponse<T>> => {
+  return axios
+    .post<T>(url, data, addSdkVersionHeader(config))
+    .then((response) => checkForDeprecationHeader(response));
+};
+
+const axiosPut = async <T = any>(
+  url: string,
+  data: any,
+  config?: AxiosRequestConfig
+): Promise<AxiosResponse<T>> => {
+  return axios
+    .put<T>(url, data, addSdkVersionHeader(config))
+    .then((response) => checkForDeprecationHeader(response));
+};
+
+const axiosDelete = async <T = any>(
+  url: string,
+  config?: AxiosRequestConfig
+): Promise<AxiosResponse<T>> => {
+  return axios
+    .delete<T>(url, addSdkVersionHeader(config))
+    .then((response) => checkForDeprecationHeader(response));
+};
+
+export { axiosGet, axiosPost, axiosPut, axiosDelete };
diff --git a/packages/dnode/src/lib/utils/index.ts b/packages/dnode/src/lib/utils/index.ts
new file mode 100644
index 000000000..2abb73f55
--- /dev/null
+++ b/packages/dnode/src/lib/utils/index.ts
@@ -0,0 +1,4 @@
+/**
+ * Only externally used Helpers
+ */
+export * from './parseAPI';
diff --git a/packages/dnode/src/lib/utils/parseAPI.ts b/packages/dnode/src/lib/utils/parseAPI.ts
new file mode 100644
index 000000000..0f4d00d43
--- /dev/null
+++ b/packages/dnode/src/lib/utils/parseAPI.ts
@@ -0,0 +1,44 @@
+import { ApiNotificationType, ParsedResponseType } from '../types';
+
+/**
+ * @description parse the response gotten from the API
+ * @param {ApiNotificationType[]} response
+ * @returns {ParsedResponseType[]}
+ */
+export function parseApiResponse(
+  response: ApiNotificationType[]
+): ParsedResponseType[] {
+  return response.map((apiNotification: ApiNotificationType) => {
+    const {
+      payload: {
+        data: {
+          acta: cta = '',
+          amsg: bigMessage = '',
+          asub = '',
+          icon = '',
+          url = '',
+          sid = '',
+          app = '',
+          aimg = '',
+          secret = '',
+        },
+        notification,
+      },
+      source,
+    } = apiNotification;
+
+    return {
+      cta,
+      title: asub || '',
+      message: bigMessage || notification.body || '',
+      icon,
+      url,
+      sid,
+      app,
+      image: aimg,
+      blockchain: source,
+      notification,
+      secret,
+    };
+  });
+}
diff --git a/packages/dnode/src/lib/utils/parseSettings.ts b/packages/dnode/src/lib/utils/parseSettings.ts
new file mode 100644
index 000000000..3152a4363
--- /dev/null
+++ b/packages/dnode/src/lib/utils/parseSettings.ts
@@ -0,0 +1,66 @@
+import { NotificationSettingType } from '../types/index';
+
+export const parseSettings = (settings: any): NotificationSettingType[] => {
+  let settingsObj;
+  try {
+    settingsObj = JSON.parse(settings);
+  } catch (error) {
+    settingsObj = settings;
+  }
+  const parsedSettings: NotificationSettingType[] = [];
+  for (let i = 0; i < settingsObj.length; i++) {
+    const setting = settingsObj[i];
+    if (setting.type == 1) {
+      parsedSettings.push({
+        type: setting.type,
+        description: setting.description,
+        ...(setting.user
+          ? {
+              userPreferance: {
+                value: setting.user,
+                enabled: setting.user,
+              },
+            }
+          : { default: setting.default }),
+      });
+    } else if (setting.type == 2) {
+      parsedSettings.push({
+        type: setting.type,
+        description: setting.description,
+        data: {
+          upper: setting.upperLimit,
+          lower: setting.lowerLimit,
+          ticker: setting.ticker ?? 1,
+        },
+        ...(setting.user
+          ? {
+              userPreferance: {
+                value: setting.user,
+                enabled: setting.enabled,
+              },
+            }
+          : { default: setting.default }),
+      });
+    } else if (setting.type == 3) {
+      parsedSettings.push({
+        type: setting.type,
+        description: setting.description,
+        data: {
+          upper: setting.upperLimit,
+          lower: setting.lowerLimit,
+          ticker: setting.ticker ?? 1,
+        },
+        ...(setting.user
+          ? {
+              userPreferance: {
+                value: setting.user,
+                enabled: setting.enabled,
+              },
+            }
+          : { default: setting.default }),
+      });
+    }
+  }
+
+  return parsedSettings;
+};
diff --git a/packages/dnode/src/lib/utils/parseSubscribersAPI.ts b/packages/dnode/src/lib/utils/parseSubscribersAPI.ts
new file mode 100644
index 000000000..5bb30682c
--- /dev/null
+++ b/packages/dnode/src/lib/utils/parseSubscribersAPI.ts
@@ -0,0 +1,33 @@
+import { ApiSubscribersType, NotificationSettingType } from '../types';
+import { parseSettings } from './parseSettings';
+/**
+ * @description parse the response gotten from the API
+ * @param {ApiSubscribersType[]} response
+ * @returns {NotificationSettingType[]}
+ */
+
+export type SubscriberResponse = {
+  itemcount: number;
+  subscribers: {
+    subscriber: string;
+    settings: NotificationSettingType[] | null;
+  }[];
+};
+export function parseSubscrbersApiResponse(
+  response: ApiSubscribersType
+): SubscriberResponse {
+  const parsedSubscribers = response.subscribers.map(
+    (apisubscribers: { subscriber: string; settings: string | null }) => {
+      return {
+        subscriber: apisubscribers.subscriber,
+        settings: apisubscribers.settings
+          ? parseSettings(apisubscribers.settings)
+          : null,
+      };
+    }
+  );
+  return {
+    itemcount: response.itemcount,
+    subscribers: [...parsedSubscribers],
+  };
+}
diff --git a/packages/dnode/src/lib/utils/pasreSubscriptionAPI.ts b/packages/dnode/src/lib/utils/pasreSubscriptionAPI.ts
new file mode 100644
index 000000000..b4686094a
--- /dev/null
+++ b/packages/dnode/src/lib/utils/pasreSubscriptionAPI.ts
@@ -0,0 +1,24 @@
+import { ApiSubscriptionType, NotificationSettingType } from '../types';
+import { parseSettings } from './parseSettings';
+/**
+ * @description parse the response gotten from the API
+ * @param {ApiSubscriptionType[]} response
+ * @returns {SubscriptionResponse[]}
+ */
+
+export type SubscriptionResponse = {
+  channel: string;
+  user_settings: NotificationSettingType[] | null;
+};
+export function parseSubscriptionsApiResponse(
+  response: ApiSubscriptionType[]
+): SubscriptionResponse[] {
+  return response.map((apisubscription: ApiSubscriptionType) => {
+    return {
+      channel: apisubscription.channel,
+      user_settings: apisubscription.user_settings
+        ? parseSettings(apisubscription.user_settings)
+        : null,
+    };
+  });
+}
diff --git a/packages/dnode/src/lib/utils/populateIUser.ts b/packages/dnode/src/lib/utils/populateIUser.ts
new file mode 100644
index 000000000..e8cfe6886
--- /dev/null
+++ b/packages/dnode/src/lib/utils/populateIUser.ts
@@ -0,0 +1,39 @@
+import { IUser } from '../types';
+
+/**
+ *  To be removed in v2 verisons of sdk
+ * @param user
+ * @returns User with deprecated params
+ */
+export const populateDeprecatedUser = (user: IUser): IUser => {
+  if (!user) return user;
+  user.name = user.profile.name;
+  user.about = user.profile.desc;
+  user.profilePicture = user.profile.picture;
+  user.numMsg = user.msgSent;
+  user.allowedNumMsg = user.maxMsgPersisted;
+  let encryptionType = '';
+  let sigType = '';
+  let signature = '';
+  try {
+    const { version } = JSON.parse(user.encryptedPrivateKey);
+    encryptionType = version;
+  } catch (err) {
+    //ignore since no encryption found
+  }
+  user.encryptionType = encryptionType;
+  try {
+    sigType = user.verificationProof.split(':')[0];
+    signature = user.verificationProof.split(':')[1];
+  } catch (err) {
+    //ignore since no verification proof found
+  }
+  user.signature = signature;
+  user.sigType = sigType;
+  user.encryptedPassword = null;
+  //TODO FOR NFT PROFILE
+  user.nftOwner = null;
+  user.linkedListHash = null;
+  user.nfts = null;
+  return user;
+};
diff --git a/packages/dnode/tests/.env.sample b/packages/dnode/tests/.env.sample
new file mode 100644
index 000000000..5beb47713
--- /dev/null
+++ b/packages/dnode/tests/.env.sample
@@ -0,0 +1,14 @@
+# MAKE A COPY OF THIS AND FILL WITH YOUR CREDENTIALS AND NAME IT .env (Remove .sample Part)
+
+# ENVIRONMENT | 'STAGING' or 'PROD' or 'DEV' or 'LOCAL'
+ENV=env_name
+
+## CHANNEL WITH ALIAS
+BERACHAIN_CHANNEL_PRIVATE_KEY=your_berachain_channel_private_key
+ARBITRUM_CHANNEL_PRIVATE_KEY=your_arbitrum_channel_private_key
+OPTIMISM_CHANNEL_PRIVATE_KEY=your_optimism_channel_private_key
+POLYGON_CHANNEL_PRIVATE_KEY=your_polygon_channel_private_key
+POLYGON_ZKEVM_CHANNEL_PRIVATE_KEY=your_polygon_zkevm_channel_private_key
+
+WALLET_PRIVATE_KEY=your_wallet_private_key
+
diff --git a/packages/dnode/tests/lib/initialize/initialize.test.ts b/packages/dnode/tests/lib/initialize/initialize.test.ts
new file mode 100644
index 000000000..fe4692317
--- /dev/null
+++ b/packages/dnode/tests/lib/initialize/initialize.test.ts
@@ -0,0 +1,22 @@
+import { PushAPI } from '../../../src/lib/pushAPI/PushAPI';
+import { expect } from 'chai';
+import { ethers } from 'ethers';
+import { ENV } from '../../../src/lib/constants';
+
+describe('PushAPI.channel functionality', () => {
+  // accessing env dynamically using process.env
+  const envMode = process.env.ENV as keyof typeof ENV;
+  const env = ENV[envMode];
+
+  let signer: ethers.Wallet;
+
+  beforeEach(async () => {
+    signer = ethers.Wallet.createRandom();
+  });
+
+  it('Initialize user', async () => {
+    await PushAPI.initialize(signer, {
+      env,
+    });
+  });
+});
diff --git a/packages/dnode/tests/lib/notification/alias.test.ts b/packages/dnode/tests/lib/notification/alias.test.ts
new file mode 100644
index 000000000..8608409eb
--- /dev/null
+++ b/packages/dnode/tests/lib/notification/alias.test.ts
@@ -0,0 +1,169 @@
+import { PushAPI } from '../../../src/lib/pushAPI/PushAPI';
+import { expect } from 'chai';
+import { ethers } from 'ethers';
+import { bsc, bscTestnet, sepolia } from 'viem/chains';
+import { ENV } from '../../../src/lib/constants';
+import { createWalletClient, http } from 'viem';
+import { privateKeyToAccount } from 'viem/accounts';
+
+describe.skip('PushAPI.alias functionality', () => {
+  let userAlice: PushAPI;
+  let userBob: PushAPI;
+  let userKate: PushAPI;
+  let userSam: PushAPI;
+  let signer1: any;
+  let account1: string;
+  let signer2: any;
+  let viemUser: any;
+  let viemUser1: any;
+  let account2: string;
+
+  // accessing env dynamically using process.env
+  type EnvStrings = keyof typeof ENV;
+  const envMode = process.env.ENV as EnvStrings;
+  const _env = ENV[envMode];
+
+  beforeEach(async () => {
+    signer1 = new ethers.Wallet(`0x${process.env['WALLET_PRIVATE_KEY']}`);
+    account1 = await signer1.getAddress();
+
+    const provider = (ethers as any).providers
+      ? new (ethers as any).providers.JsonRpcProvider('https://rpc.sepolia.org')
+      : new (ethers as any).JsonRpcProvider('https://rpc.sepolia.org');
+
+    const provider1 = (ethers as any).providers
+      ? new (ethers as any).providers.JsonRpcProvider(
+          'https://bsc-testnet-rpc.publicnode.com'
+        )
+      : new (ethers as any).JsonRpcProvider(
+          'https://bsc-testnet-rpc.publicnode.com'
+        );
+
+    signer2 = new ethers.Wallet(
+      `0x${process.env['WALLET_PRIVATE_KEY']}`,
+      provider
+    );
+
+    const signer3 = createWalletClient({
+      account: privateKeyToAccount(`0x${process.env['WALLET_PRIVATE_KEY']}`),
+      chain: sepolia,
+      transport: http(),
+    });
+
+    const signer4 = new ethers.Wallet(
+      `0x${process.env['NFT_HOLDER_WALLET_PRIVATE_KEY_1']}`,
+      provider1
+    );
+
+    const signer5 = createWalletClient({
+      account: privateKeyToAccount(
+        `0x${process.env['NFT_HOLDER_WALLET_PRIVATE_KEY_1']}`
+      ),
+      chain: bscTestnet,
+      transport: http(),
+    });
+
+    account2 = await signer2.getAddress();
+
+    // initialization with signer
+    userAlice = await PushAPI.initialize(signer1, { env: _env });
+
+    // initialization with signer and provider
+    userKate = await PushAPI.initialize(signer2, { env: _env });
+
+    //initialisation without signer
+    userBob = await PushAPI.initialize(signer1, { env: _env });
+
+    // initalisation with viem
+    viemUser = await PushAPI.initialize(signer3, { env: _env });
+
+    // initalisation the verification account
+    userSam = await PushAPI.initialize(signer4, { env: _env });
+    viemUser1 = await PushAPI.initialize(signer5, { env: _env });
+  });
+
+  describe('alias :: info', () => {
+    it('Should return response', async () => {
+      const res = await userBob.channel.alias.info({
+        alias: '0x93A829d16DE51745Db0530A0F8E8A9B8CA5370E5',
+        aliasChain: 'POLYGON',
+      });
+      expect(res).not.null;
+    });
+  });
+
+  describe('alias :: add', () => {
+    // TODO: remove skip after signer becomes optional
+    it('Without signer and account :: should throw error', async () => {
+      await expect(() =>
+        userBob.channel.alias.initiate(
+          'eip155:11155111:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+        )
+      ).to.Throw;
+    });
+
+    it('With signer and without provider :: should throw error', async () => {
+      await expect(() =>
+        userAlice.channel.alias.initiate(
+          'eip155:11155111:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+        )
+      ).to.Throw;
+    });
+
+    it('With signer and provider :: should add alias', async () => {
+      const res = await userKate.channel.alias.initiate(
+        'eip155:97:0x2dFc6E90B9Cd0Fc1E0A2da82e3b094e9369caCdB'
+      );
+      expect(res).not.null;
+    }, 100000000);
+
+    it('With signer and provider :: should add alias', async () => {
+      const res = await userKate.channel.alias.initiate(
+        'eip155:97:0x2dFc6E90B9Cd0Fc1E0A2da82e3b094e9369caCdB',
+        { raw: true }
+      );
+      expect(res).not.null;
+    }, 100000000);
+
+    it('With viem signer and provider :: should add alias', async () => {
+      const res = await viemUser.channel.alias.initiate(
+        'eip155:97:0x2dFc6E90B9Cd0Fc1E0A2da82e3b094e9369caCdB'
+      );
+      expect(res).not.null;
+    }, 100000000);
+
+    it('With signer and provider :: should throw error and provider doesnt match', async () => {
+      await expect(() =>
+        userAlice.channel.alias.initiate(
+          'eip155:97:0x2dFc6E90B9Cd0Fc1E0A2da82e3b094e9369caCdB'
+        )
+      ).to.Throw;
+    });
+  });
+
+  describe('alias :: verify', () => {
+    it('Without signer and account :: should throw error', async () => {
+      await expect(() =>
+        userBob.channel.alias.verify(
+          'eip155:11155111:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+        )
+      ).to.Throw;
+    });
+
+    it('With signer and without provider :: should throw error', async () => {
+      await expect(() =>
+        userAlice.channel.alias.verify(
+          'eip155:11155111:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+        )
+      ).to.Throw;
+    });
+
+    it('With signer and provider :: should verify alias', async () => {
+      const res = await userSam.channel.alias.verify(
+        '0x6eF394b8dcc840d3d65a835E371066244187B1C6',
+        { raw: true }
+      );
+      expect(res).not.null;
+    }, 100000000);
+  });
+});
diff --git a/packages/dnode/tests/lib/notification/channel.test.ts b/packages/dnode/tests/lib/notification/channel.test.ts
new file mode 100644
index 000000000..951ca83ef
--- /dev/null
+++ b/packages/dnode/tests/lib/notification/channel.test.ts
@@ -0,0 +1,422 @@
+import { PushAPI } from '../../../src/lib/pushAPI/PushAPI';
+import { expect } from 'chai';
+import { ethers } from 'ethers';
+import { sepolia } from 'viem/chains';
+import {
+  createWalletClient,
+  http,
+  getContract,
+  createPublicClient,
+} from 'viem';
+import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
+import CONSTANTS from '../../../src/lib/constants';
+import { inspect } from 'util';
+import { ENV } from '../../../src/lib/constants';
+
+describe('PushAPI.channel functionality', () => {
+  let userAlice: PushAPI;
+  let userBob: PushAPI;
+  let userKate: PushAPI;
+  let signer1: any;
+  let account1: string;
+  let signer2: any;
+  let account2: string;
+  let userNoChannel: PushAPI;
+  let noChannelSigner: any;
+  let noChannelAddress: string;
+  let viemUser: any;
+  let viemSigner: any;
+
+  beforeEach(async () => {
+    signer1 = new ethers.Wallet(`0x${process.env['WALLET_PRIVATE_KEY']}`);
+    account1 = await signer1.getAddress();
+
+    const provider = (ethers as any).providers
+      ? new (ethers as any).providers.JsonRpcProvider('https://rpc.sepolia.org')
+      : new (ethers as any).JsonRpcProvider('https://rpc.sepolia.org');
+
+    signer2 = new ethers.Wallet(
+      `0x${process.env['WALLET_PRIVATE_KEY']}`,
+      provider
+    );
+    account2 = await signer2.getAddress();
+
+    const WALLET = ethers.Wallet.createRandom();
+    noChannelSigner = new ethers.Wallet(WALLET.privateKey);
+    noChannelAddress = await noChannelSigner.getAddress();
+    viemSigner = createWalletClient({
+      account: privateKeyToAccount(`0x${process.env['WALLET_PRIVATE_KEY']}`),
+      chain: sepolia,
+      transport: http(),
+    });
+
+    // accessing env dynamically using process.env
+    type EnvStrings = keyof typeof ENV;
+    const envMode = process.env.ENV as EnvStrings;
+    const _env = ENV[envMode];
+
+    // initialisation with signer and provider
+    userKate = await PushAPI.initialize(signer2, { env: _env });
+    // initialisation with signer
+    userAlice = await PushAPI.initialize(signer2, { env: _env });
+    // TODO: remove signer1 after chat makes signer as optional
+    //initialisation without signer
+    userBob = await PushAPI.initialize(signer1, { env: _env });
+    // initialisation with a signer that has no channel
+    userNoChannel = await PushAPI.initialize(noChannelSigner, { env: _env });
+    // viem signer
+    viemUser = await PushAPI.initialize(viemSigner, { env: _env });
+  });
+
+  describe('channel :: info', () => {
+    // TODO: remove skip after signer becomes optional
+    it.skip('Without signer and account: Should throw error', async () => {
+      await expect(() => userBob.channel.info()).to.Throw;
+    });
+
+    it('Without signer but with non-caip account: Should return response', async () => {
+      const res = await userBob.channel.info(
+        '0xD8634C39BBFd4033c0d3289C4515275102423681'
+      );
+      expect(res).not.null;
+    });
+
+    it('Without signer and with valid caip account: Should return response', async () => {
+      const res = await userBob.channel.info(
+        'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681',
+        {
+          raw: false,
+        }
+      );
+      expect(res).not.null;
+    });
+  });
+
+  describe.skip('channel :: search', () => {
+    it('Without signer and account : Should return response', async () => {
+      const res = await userBob.channel.search(' ');
+      // console.log(res);
+      expect(res).not.null;
+    });
+
+    it('With signer: Should return response', async () => {
+      const res = await userBob.channel.search(' ');
+      // console.log(res);
+      expect(res).not.null;
+    });
+
+    it('Should throw error for empty query', async () => {
+      // const res = await userBob.channel.search('')
+      await expect(() => userBob.channel.search('')).to.Throw;
+    });
+  });
+
+  describe('channel :: subscribers', () => {
+    it('Without signer and account : Should return response as address is passed', async () => {
+      const res = await userBob.channel.subscribers({
+        channel: 'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681',
+      });
+      console.log(res);
+      expect(res).not.null;
+    });
+
+    it('Without signer and account : Should return response as address is passed', async () => {
+      const res = await userBob.channel.subscribers({
+        channel: '0x93A829d16DE51745Db0530A0F8E8A9B8CA5370E5',
+      });
+      console.log(res);
+      expect(res).not.null;
+    });
+  });
+
+  describe('channel :: send', () => {
+    it('With signer : broadcast  : Should send notification with title and body', async () => {
+      const res = await userAlice.channel.send(['*'], {
+        notification: {
+          title: 'Testing new notif',
+          body: 'test new notif',
+        },
+      });
+      console.log(res);
+      expect(res.status).to.equal(200);
+    });
+
+    it('With signer : targeted  : Should send notification with title and body', async () => {
+      const res = await userAlice.channel.send(
+        ['eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681'],
+        {
+          notification: {
+            title: 'hi',
+            body: 'test-targeted',
+          },
+        }
+      );
+      expect(res.status).to.equal(200);
+    });
+
+    it('With signer : targeted  : Should send notification with title and body', async () => {
+      const res = await userAlice.channel.send(
+        ['eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681'],
+        {
+          notification: {
+            title: 'hi',
+            body: 'test-targeted',
+          },
+        }
+      );
+      expect(res.status).to.equal(200);
+    });
+
+    it('With signer : subset  : Should send notification with title and body', async () => {
+      const res = await userAlice.channel.send(
+        [
+          'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681',
+          'eip155:11155111:0x93A829d16DE51745Db0530A0F8E8A9B8CA5370E5',
+        ],
+        {
+          notification: {
+            title: 'hi',
+            body: 'test-targeted',
+          },
+        }
+      );
+      expect(res.status).to.equal(200);
+    });
+
+    it('With signer : subset  : Should send notification with title and body along with additional options', async () => {
+      const res = await userAlice.channel.send(
+        [
+          'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681',
+          'eip155:11155111:0x93A829d16DE51745Db0530A0F8E8A9B8CA5370E5',
+        ],
+        {
+          notification: {
+            title: 'hi',
+            body: 'test-targeted',
+          },
+          payload: {
+            title: 'testing first notification',
+            body: 'testing with random body',
+            cta: 'https://google.com/',
+            embed: 'https://avatars.githubusercontent.com/u/64157541?s=200&v=4',
+            category: 2,
+          },
+        }
+      );
+      expect(res.status).to.equal(200);
+    });
+
+    it('With signer : subset  : Should send notification with title and body along with additional options', async () => {
+      const res = await userAlice.channel.send(
+        [
+          'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681',
+          'eip155:11155111:0x93A829d16DE51745Db0530A0F8E8A9B8CA5370E5',
+        ],
+        {
+          notification: {
+            title: 'hi',
+            body: 'test-targeted',
+          },
+          payload: {
+            title: 'testing first notification',
+            body: 'testing with random body',
+            cta: 'https://google.com/',
+            embed: 'https://avatars.githubusercontent.com/u/64157541?s=200&v=4',
+            category: 3,
+          },
+        }
+      );
+      expect(res.status).to.equal(200);
+    });
+
+    it('With signer : subset  : Should send notification with title and body along with additional options', async () => {
+      const res = await userAlice.channel.send(
+        [
+          'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681',
+          'eip155:11155111:0x93A829d16DE51745Db0530A0F8E8A9B8CA5370E5',
+        ],
+        {
+          notification: {
+            title: 'hi',
+            body: 'test-subset',
+          },
+          payload: {
+            title: 'testing first subset notification',
+            body: 'testing with random body',
+            cta: 'https://google.com/',
+            embed: 'https://avatars.githubusercontent.com/u/64157541?s=200&v=4',
+          },
+        }
+      );
+      expect(res.status).to.equal(200);
+    });
+  });
+
+  describe.skip('channel :: update', () => {
+    it('Should update channel meta', async () => {
+      const res = await userKate.channel.update({
+        name: 'Updated Name',
+        description: 'Testing new description',
+        url: 'https://google.com',
+        icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAz0lEQVR4AcXBsU0EQQyG0e+saWJ7oACiKYDMEZVs6GgSpC2BIhzRwAS0sgk9HKn3gpFOAv3v3V4/3+4U4Z1q5KTy42Ql940qvFONnFSGmCFmiN2+fj7uCBlihpgh1ngwcvKfwjuVIWaIGWKNB+GdauSk8uNkJfeNKryzYogZYoZY40m5b/wlQ8wQM8TayMlKeKcaOVkJ71QjJyuGmCFmiDUe+HFy4VyEd57hx0mV+0ZliBlihlgL71w4FyMnVXhnZeSkiu93qheuDDFDzBD7BcCyMAOfy204AAAAAElFTkSuQmCC',
+      });
+      //   console.log(res)
+      expect(res).not.null;
+    }, 10000000000);
+
+    it('Should update channel meta', async () => {
+      const res = await viemUser.channel.update({
+        name: 'Updated Name',
+        description: 'Testing new description',
+        url: 'https://google.com',
+        icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAz0lEQVR4AcXBsU0EQQyG0e+saWJ7oACiKYDMEZVs6GgSpC2BIhzRwAS0sgk9HKn3gpFOAv3v3V4/3+4U4Z1q5KTy42Ql940qvFONnFSGmCFmiN2+fj7uCBlihpgh1ngwcvKfwjuVIWaIGWKNB+GdauSk8uNkJfeNKryzYogZYoZY40m5b/wlQ8wQM8TayMlKeKcaOVkJ71QjJyuGmCFmiDUe+HFy4VyEd57hx0mV+0ZliBlihlgL71w4FyMnVXhnZeSkiu93qheuDDFDzBD7BcCyMAOfy204AAAAAElFTkSuQmCC',
+      });
+      //   console.log(res)
+      expect(res).not.null;
+    }, 10000000000);
+  });
+
+  describe.skip('channel :: create', () => {
+    it('Should create channel', async () => {
+      const channelInfo = await userKate.channel.info();
+      if (channelInfo) return; // skip if already exists
+      const res = await userKate.channel.create({
+        name: 'SDK Test',
+        description: 'Testing new description',
+        url: 'https://google.com',
+        icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAz0lEQVR4AcXBsU0EQQyG0e+saWJ7oACiKYDMEZVs6GgSpC2BIhzRwAS0sgk9HKn3gpFOAv3v3V4/3+4U4Z1q5KTy42Ql940qvFONnFSGmCFmiN2+fj7uCBlihpgh1ngwcvKfwjuVIWaIGWKNB+GdauSk8uNkJfeNKryzYogZYoZY40m5b/wlQ8wQM8TayMlKeKcaOVkJ71QjJyuGmCFmiDUe+HFy4VyEd57hx0mV+0ZliBlihlgL71w4FyMnVXhnZeSkiu93qheuDDFDzBD7BcCyMAOfy204AAAAAElFTkSuQmCC',
+      });
+      //   console.log(res)
+      expect(res).not.null;
+    }, 10000000000);
+  });
+
+  describe.skip('channel :: settings', () => {
+    it('Should create channel settings', async () => {
+      const res = await userKate.channel.setting([
+        {
+          type: 1,
+          default: 1,
+          description: 'test1',
+        },
+        {
+          type: 2,
+          default: 10,
+          description: 'test2',
+          data: {
+            upper: 100,
+            lower: 1,
+          },
+        },
+        {
+          type: 3,
+          default: {
+            lower: 10,
+            upper: 50,
+          },
+          description: 'test3',
+          data: {
+            upper: 100,
+            lower: 1,
+            enabled: true,
+            ticker: 2,
+          },
+        },
+        {
+          type: 3,
+          default: {
+            lower: 3,
+            upper: 5,
+          },
+          description: 'test4',
+          data: {
+            upper: 100,
+            lower: 1,
+            enabled: false,
+            ticker: 2,
+          },
+        },
+      ]);
+      //   console.log(res)
+      expect(res).not.null;
+    }, 10000000000);
+
+    it('Should create channel setting viem signer', async () => {
+      const res = await viemUser.channel.setting([
+        {
+          type: 1,
+          default: 1,
+          description: 'test1',
+        },
+        {
+          type: 2,
+          default: 10,
+          description: 'test2',
+          data: {
+            upper: 100,
+            lower: 1,
+          },
+        },
+        {
+          type: 3,
+          default: {
+            lower: 10,
+            upper: 50,
+          },
+          description: 'test3',
+          data: {
+            upper: 100,
+            lower: 1,
+            enabled: true,
+            ticker: 2,
+          },
+        },
+        {
+          type: 3,
+          default: {
+            lower: 3,
+            upper: 5,
+          },
+          description: 'test4',
+          data: {
+            upper: 100,
+            lower: 1,
+            enabled: false,
+            ticker: 2,
+          },
+        },
+      ]);
+      // console.log(res)
+      expect(res).not.null;
+    }, 10000000000);
+  });
+
+  describe.skip('notifications', async () => {
+    it('Should fetch channel specific feeds', async () => {
+      const res = await userAlice.channel.notifications(
+        'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681',
+        { raw: false }
+      );
+      console.log(inspect(res, { depth: null }));
+      expect(res).not.null;
+    });
+
+    it('Should fetch channel specific feeds in raw format', async () => {
+      const res = await userAlice.channel.notifications(
+        'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681',
+        { raw: true }
+      );
+      console.log(inspect(res, { depth: null }));
+      expect(res).not.null;
+    });
+
+    it('Should fetch channel specific feeds broadcast type', async () => {
+      const res = await userAlice.channel.notifications(
+        '0xD8634C39BBFd4033c0d3289C4515275102423681',
+        { raw: false, filter: CONSTANTS.NOTIFICATION.TYPE.TARGETTED }
+      );
+      console.log(inspect(res, { depth: null }));
+      expect(res).not.null;
+    });
+  });
+});
diff --git a/packages/dnode/tests/lib/notification/delegate.test.ts b/packages/dnode/tests/lib/notification/delegate.test.ts
new file mode 100644
index 000000000..50cfa1493
--- /dev/null
+++ b/packages/dnode/tests/lib/notification/delegate.test.ts
@@ -0,0 +1,199 @@
+import { PushAPI } from '../../../src/lib'; // Ensure correct import path
+import { expect } from 'chai';
+import { ethers } from 'ethers';
+import { sepolia } from 'viem/chains';
+import { createWalletClient, http } from 'viem';
+import { privateKeyToAccount } from 'viem/accounts';
+// import tokenABI from './tokenABI';
+import { ENV } from '../../../src/lib/constants';
+
+describe.skip('PushAPI.delegate functionality', () => {
+  let userAlice: PushAPI;
+  let userBob: PushAPI;
+  let userKate: PushAPI;
+  let signer1: any;
+  let account1: string;
+  let signer2: any;
+  let viemUser: any;
+  let account2: string;
+
+  // accessing env dynamically using process.env
+  type EnvStrings = keyof typeof ENV;
+  const envMode = process.env.ENV as EnvStrings;
+  const _env = ENV[envMode];
+
+  beforeEach(async () => {
+    signer1 = new ethers.Wallet(`0x${process.env['WALLET_PRIVATE_KEY']}`);
+    account1 = await signer1.getAddress();
+
+    const provider = (ethers as any).providers
+      ? new (ethers as any).providers.JsonRpcProvider('https://rpc.sepolia.org')
+      : new (ethers as any).JsonRpcProvider('https://rpc.sepolia.org');
+
+    signer2 = new ethers.Wallet(
+      `0x${process.env['WALLET_PRIVATE_KEY']}`,
+      provider
+    );
+    const signer3 = createWalletClient({
+      account: privateKeyToAccount(`0x${process.env['WALLET_PRIVATE_KEY']}`),
+      chain: sepolia,
+      transport: http(),
+    });
+
+    account2 = await signer2.getAddress();
+
+    // initialisation with signer and provider
+    userKate = await PushAPI.initialize(signer2, { env: _env });
+    // initialisation with signer
+    userAlice = await PushAPI.initialize(signer1, { env: _env });
+    // initialisation without signer
+    userBob = await PushAPI.initialize(signer1, { env: _env });
+    // initalisation with viem
+    viemUser = await PushAPI.initialize(signer3, { env: _env });
+  });
+
+  describe('delegate :: add', () => {
+    // TODO: remove skip after signer becomes optional
+    it.skip('Without signer and account :: should throw error', async () => {
+      await expect(() =>
+        userBob.channel.delegate.add(
+          'eip155:11155111:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+        )
+      ).to.Throw;
+    });
+
+    it('With signer and without provider :: should throw error', async () => {
+      await expect(() =>
+        userAlice.channel.delegate.add(
+          'eip155:11155111:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+        )
+      ).to.Throw;
+    });
+
+    it('With signer and provider :: should add delegate', async () => {
+      const res = await userKate.channel.delegate.add(
+        'eip155:11155111:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+      );
+      //   console.log(res);
+      expect(res).not.null;
+    }, 100000000);
+
+    it('With viem signer and provider :: should add delegate', async () => {
+      const res = await viemUser.channel.delegate.add(
+        'eip155:11155111:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+      );
+      console.log(res);
+      expect(res).not.null;
+    }, 100000000);
+
+    it('With signer and provider :: should add delegate', async () => {
+      const res = await userKate.channel.delegate.add(
+        '0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+      );
+      console.log(res);
+      expect(res).not.null;
+    }, 100000000);
+
+    it('With signer and provider :: should throw error as delegate caip and provider doesnt match', async () => {
+      await expect(() =>
+        userKate.channel.delegate.add(
+          'eip155:80001:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+        )
+      ).to.Throw;
+    });
+
+    it('With viem signer: Should add delegate', async () => {
+      const res = await viemUser.channel.delegate.add(
+        '0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+      );
+      console.log(res);
+      expect(res).not.null;
+    }, 10000000);
+
+    it('With viem signer: Should add delegate', async () => {
+      const res = await viemUser.channel.delegate.add(
+        'eip155:11155111:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+      );
+      // console.log(res);
+      expect(res).not.null;
+    }, 10000000);
+  });
+
+  describe('delegate :: remove', () => {
+    // TODO: remove skip after signer becomes optional
+    it.skip('Without signer and account :: should throw error', async () => {
+      await expect(() =>
+        userBob.channel.delegate.remove(
+          'eip155:11155111:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+        )
+      ).to.Throw;
+    });
+
+    it('With signer and without provider :: should throw error', async () => {
+      await expect(() =>
+        userAlice.channel.delegate.remove(
+          'eip155:11155111:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+        )
+      ).to.Throw;
+    });
+
+    it('With signer and provider :: should add delegate', async () => {
+      const res = await userKate.channel.delegate.remove(
+        'eip155:11155111:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+      );
+      console.log(res);
+      expect(res).not.null;
+    }, 100000000);
+
+    it('With signer and provider :: should throw error as delegate caip and provider doesnt match', async () => {
+      await expect(() =>
+        userKate.channel.delegate.remove(
+          'eip155:80001:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+        )
+      ).to.Throw;
+    });
+
+    it('With viem signer: Should remove delegate', async () => {
+      const res = await viemUser.channel.delegate.remove(
+        'eip155:11155111:0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924'
+      );
+      // console.log(res);
+      expect(res).not.null;
+    }, 10000000);
+  });
+
+  describe('delegate :: get', () => {
+    it.skip('Without signer and account : Should throw error', async () => {
+      await expect(() => userBob.channel.delegate.get()).to.Throw;
+    });
+    it('Without signer : Should get delegates', async () => {
+      const res = await userBob.channel.delegate.get({
+        channel: '0xD8634C39BBFd4033c0d3289C4515275102423681',
+      });
+      // console.log(res)
+      expect(res).not.null;
+    });
+
+    it('Without signer : Should fetch delegates', async () => {
+      const res = await userBob.channel.delegate.get({
+        channel: 'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681',
+      });
+      // console.log(res);
+      expect(res).not.null;
+    });
+
+    it('Without signer : Should fetch delegates for alias', async () => {
+      const res = await userBob.channel.delegate.get({
+        channel: 'eip155:80001:0xD8634C39BBFd4033c0d3289C4515275102423681',
+      });
+      //   console.log(res)
+      expect(res).not.null;
+    });
+
+    it('With signer : Should fetch delegates for channel', async () => {
+      const res = await userKate.channel.delegate.get();
+      //   console.log(res);
+      expect(res).not.null;
+    });
+  });
+});
diff --git a/packages/dnode/tests/lib/notification/notification.test.ts b/packages/dnode/tests/lib/notification/notification.test.ts
new file mode 100644
index 000000000..4e1a06303
--- /dev/null
+++ b/packages/dnode/tests/lib/notification/notification.test.ts
@@ -0,0 +1,256 @@
+import { PushAPI } from '../../../src/lib'; // Ensure correct import path
+import { expect } from 'chai';
+import { ethers } from 'ethers';
+import { createWalletClient, http } from 'viem';
+import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
+import { sepolia } from 'viem/chains';
+import { ENV } from '../../../src/lib/constants';
+describe('PushAPI.notification functionality', () => {
+  let userAlice: PushAPI;
+  let userKate: PushAPI;
+  let userBob: PushAPI;
+  let signer1: any;
+  let account1: string;
+  let signer2: any;
+  let account2: string;
+  let viemSigner: any;
+  let userViem: PushAPI;
+  beforeEach(async () => {
+    signer1 = new ethers.Wallet(`0x${process.env['WALLET_PRIVATE_KEY']}`);
+    account1 = await signer1.getAddress();
+
+    const provider = (ethers as any).providers
+      ? new (ethers as any).providers.JsonRpcProvider('https://rpc.sepolia.org')
+      : new (ethers as any).JsonRpcProvider('https://rpc.sepolia.org');
+
+    signer2 = new ethers.Wallet(
+      `0x${process.env['WALLET_PRIVATE_KEY']}`,
+      provider
+    );
+    account2 = await signer2.getAddress();
+    viemSigner = createWalletClient({
+      account: privateKeyToAccount(`0x${process.env['WALLET_PRIVATE_KEY']}`),
+      chain: sepolia,
+      transport: http(),
+    });
+
+    // accessing env dynamically using process.env
+    type EnvStrings = keyof typeof ENV;
+    const envMode = process.env.ENV as EnvStrings;
+    const _env = ENV[envMode];
+
+    // initialisation with no signer
+    userBob = await PushAPI.initialize(null, { env: _env, account: account1 });
+    // initialisation with signer
+    userAlice = await PushAPI.initialize(signer1, { env: _env });
+    // initialisation with signer and provider
+    userKate = await PushAPI.initialize(signer2, { env: _env });
+    // initialisation with viem
+    userViem = await PushAPI.initialize(viemSigner, { env: _env });
+  });
+
+  describe('PushAPI.notification functionality', () => {
+    it('Should return feeds with signer object', async () => {
+      const response = await userAlice.notification.list('INBOX', {
+        account: '0x1af9C19A1513B9D05a7E5CaAd9F9239EF54fE2b1',
+      });
+      console.log(response);
+      expect(response).not.null;
+    });
+  });
+
+  describe('notification :: subscribe', () => {
+    it('Without signer object: should throw error', async () => {
+      await expect(() =>
+        userBob.notification.subscribe(
+          'eip155:11155111:0x35B84d6848D16415177c64D64504663b998A6ab4'
+        )
+      ).to.Throw;
+    });
+
+    it('With signer object: should convert to eth caip for normal address', async () => {
+      const res = await userAlice.notification.subscribe(
+        '0x35B84d6848D16415177c64D64504663b998A6ab4'
+      );
+      expect(res.status).to.equal(204);
+    });
+
+    it('With signer object and provider: should convert to eth caip for normal address', async () => {
+      const res = await userAlice.notification.subscribe(
+        '0x35B84d6848D16415177c64D64504663b998A6ab4'
+      );
+      expect(res.status).to.equal(204);
+    });
+
+    it('With signer object nad provider: should optin with partial caip', async () => {
+      const res = await userKate.notification.subscribe(
+        'eip155:0x35B84d6848D16415177c64D64504663b998A6ab4'
+      );
+      expect(res.status).to.equal(204);
+    });
+
+    it('With signer object: should optin with partial caip', async () => {
+      const res = await userKate.notification.subscribe(
+        'eip155:0x35B84d6848D16415177c64D64504663b998A6ab4'
+      );
+      expect(res.status).to.equal(204);
+    });
+
+    it('With signer object and settings : Should subscribe', async () => {
+      const res = await userAlice.notification.subscribe(
+        'eip155:11155111:0x35B84d6848D16415177c64D64504663b998A6ab4',
+        {
+          settings: [
+            {
+              enabled: false,
+            },
+            {
+              enabled: false,
+              value: 0,
+            },
+          ],
+        }
+      );
+      expect(res.status).to.equal(204);
+    });
+
+    it('With signer and provider and settings : Should subscribe', async () => {
+      const res = await userKate.notification.subscribe(
+        'eip155:11155111:0xC8c243a4fd7F34c49901fe441958953402b7C024',
+        {
+          settings: [
+            {
+              enabled: false,
+            },
+            {
+              enabled: true,
+              value: 15,
+            },
+            {
+              enabled: true,
+              value: {
+                lower: 5,
+                upper: 10,
+              },
+            },
+            {
+              enabled: true,
+              value: {
+                lower: 5,
+                upper: 10,
+              },
+            },
+          ],
+        }
+      );
+      expect(res.status).to.equal(204);
+    });
+
+    it('With viem signer and provider: Should subscribe', async () => {
+      const res = await userViem.notification.subscribe(
+        'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681'
+      );
+      expect(res.status).to.equal(204);
+      expect(res.message).to.equal('successfully opted into channel');
+    });
+  });
+
+  describe('notification :: unsubscribe', () => {
+    it('Without signer object: should throw error', async () => {
+      await expect(() =>
+        userBob.notification.unsubscribe(
+          'eip155:11155111:0x35B84d6848D16415177c64D64504663b998A6ab4'
+        )
+      ).to.Throw;
+    });
+
+    it('With signer object: should convert to eth caip for normal address', async () => {
+      const res = await userAlice.notification.unsubscribe(
+        '0x35B84d6848D16415177c64D64504663b998A6ab4'
+      );
+      expect((res as { status: string }).status).to.equal(204);
+    });
+
+    it('With signer object and provider: should convert to eth caip for normal address', async () => {
+      const res = await userAlice.notification.unsubscribe(
+        '0x35B84d6848D16415177c64D64504663b998A6ab4'
+      );
+      expect((res as { status: string }).status).to.equal(204);
+    });
+
+    it('With signer object nad provider: should optout with partial caip', async () => {
+      const res = await userKate.notification.unsubscribe(
+        'eip155:0x35B84d6848D16415177c64D64504663b998A6ab4'
+      );
+      expect((res as { status: string }).status).to.equal(204);
+    });
+
+    it('With signer object: should optout with partial caip', async () => {
+      const res = await userKate.notification.unsubscribe(
+        'eip155:0x35B84d6848D16415177c64D64504663b998A6ab4'
+      );
+      expect((res as { status: string }).status).to.equal(204);
+    });
+
+    it('With viem signer and provider: Should unsubscribe', async () => {
+      const res = await userViem.notification.unsubscribe(
+        'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681'
+      );
+      expect((res as { status: string }).status).to.equal(204);
+      expect(res.message).to.equal('successfully opted into channel');
+    });
+  });
+
+  describe.skip('notification :: subscriptions', () => {
+    it.skip('No signer or account: Should throw error', async () => {
+      await expect(() => userBob.notification.subscriptions()).to.Throw;
+    });
+
+    it('Signer with no account: Should return response', async () => {
+      const response = await userAlice.notification.subscriptions();
+      expect(response).not.null;
+    });
+
+    it('Signer with account: Should return response', async () => {
+      const response = await userAlice.notification.subscriptions({
+        account: 'eip155:80001:0xD8634C39BBFd4033c0d3289C4515275102423681',
+      });
+      expect(response).not.null;
+      expect(response.length).not.equal(0);
+    });
+
+    it('Signer with account: Should return response', async () => {
+      const response = await userKate.notification.subscriptions({
+        account: '0xD8634C39BBFd4033c0d3289C4515275102423681',
+      });
+      console.log(response);
+      expect(response).not.null;
+      expect(response.length).not.equal(0);
+    });
+
+    it('Signer with account: Should return response', async () => {
+      const response = await userKate.notification.subscriptions({
+        account: 'eip155:0xD8634C39BBFd4033c0d3289C4515275102423681',
+      });
+      expect(response).not.null;
+      expect(response.length).not.equal(0);
+    });
+
+    it('Signer with account: Should return response', async () => {
+      const response = await userKate.notification.subscriptions({
+        account: '0xD8634C39BBFd4033c0d3289C4515275102423681',
+      });
+      expect(response).not.null;
+      expect(response.length).not.equal(0);
+    });
+
+    it('Signer with account: Should return response', async () => {
+      const response = await userKate.notification.subscriptions({
+        account: '0xD8634C39BBFd4033c0d3289C4515275102423681',
+        raw: false,
+        channel: '0xD8634C39BBFd4033c0d3289C4515275102423681',
+      });
+      expect(response).not.null;
+    });
+  });
+});
diff --git a/packages/dnode/tests/lib/notification/tokenABI.ts b/packages/dnode/tests/lib/notification/tokenABI.ts
new file mode 100644
index 000000000..c46216138
--- /dev/null
+++ b/packages/dnode/tests/lib/notification/tokenABI.ts
@@ -0,0 +1,709 @@
+export const abi = [
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+    ],
+    stateMutability: 'nonpayable',
+    type: 'constructor',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'owner',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'spender',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'amount',
+        type: 'uint256',
+      },
+    ],
+    name: 'Approval',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'delegator',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'fromDelegate',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'toDelegate',
+        type: 'address',
+      },
+    ],
+    name: 'DelegateChanged',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'delegate',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'previousBalance',
+        type: 'uint256',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'newBalance',
+        type: 'uint256',
+      },
+    ],
+    name: 'DelegateVotesChanged',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'holder',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'amount',
+        type: 'uint256',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'weight',
+        type: 'uint256',
+      },
+    ],
+    name: 'HolderWeightChanged',
+    type: 'event',
+  },
+  {
+    anonymous: false,
+    inputs: [
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'from',
+        type: 'address',
+      },
+      {
+        indexed: true,
+        internalType: 'address',
+        name: 'to',
+        type: 'address',
+      },
+      {
+        indexed: false,
+        internalType: 'uint256',
+        name: 'amount',
+        type: 'uint256',
+      },
+    ],
+    name: 'Transfer',
+    type: 'event',
+  },
+  {
+    inputs: [],
+    name: 'DELEGATION_TYPEHASH',
+    outputs: [
+      {
+        internalType: 'bytes32',
+        name: '',
+        type: 'bytes32',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'DOMAIN_TYPEHASH',
+    outputs: [
+      {
+        internalType: 'bytes32',
+        name: '',
+        type: 'bytes32',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'PERMIT_TYPEHASH',
+    outputs: [
+      {
+        internalType: 'bytes32',
+        name: '',
+        type: 'bytes32',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+      {
+        internalType: 'address',
+        name: 'spender',
+        type: 'address',
+      },
+    ],
+    name: 'allowance',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'spender',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'rawAmount',
+        type: 'uint256',
+      },
+    ],
+    name: 'approve',
+    outputs: [
+      {
+        internalType: 'bool',
+        name: '',
+        type: 'bool',
+      },
+    ],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+    ],
+    name: 'balanceOf',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'born',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'uint256',
+        name: 'rawAmount',
+        type: 'uint256',
+      },
+    ],
+    name: 'burn',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+      {
+        internalType: 'uint32',
+        name: '',
+        type: 'uint32',
+      },
+    ],
+    name: 'checkpoints',
+    outputs: [
+      {
+        internalType: 'uint32',
+        name: 'fromBlock',
+        type: 'uint32',
+      },
+      {
+        internalType: 'uint96',
+        name: 'votes',
+        type: 'uint96',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'decimals',
+    outputs: [
+      {
+        internalType: 'uint8',
+        name: '',
+        type: 'uint8',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'delegatee',
+        type: 'address',
+      },
+    ],
+    name: 'delegate',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'delegatee',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'nonce',
+        type: 'uint256',
+      },
+      {
+        internalType: 'uint256',
+        name: 'expiry',
+        type: 'uint256',
+      },
+      {
+        internalType: 'uint8',
+        name: 'v',
+        type: 'uint8',
+      },
+      {
+        internalType: 'bytes32',
+        name: 'r',
+        type: 'bytes32',
+      },
+      {
+        internalType: 'bytes32',
+        name: 's',
+        type: 'bytes32',
+      },
+    ],
+    name: 'delegateBySig',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    name: 'delegates',
+    outputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+    ],
+    name: 'getCurrentVotes',
+    outputs: [
+      {
+        internalType: 'uint96',
+        name: '',
+        type: 'uint96',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'blockNumber',
+        type: 'uint256',
+      },
+    ],
+    name: 'getPriorVotes',
+    outputs: [
+      {
+        internalType: 'uint96',
+        name: '',
+        type: 'uint96',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    name: 'holderDelegation',
+    outputs: [
+      {
+        internalType: 'bool',
+        name: '',
+        type: 'bool',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    name: 'holderWeight',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'name',
+    outputs: [
+      {
+        internalType: 'string',
+        name: '',
+        type: 'string',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    name: 'nonces',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: '',
+        type: 'address',
+      },
+    ],
+    name: 'numCheckpoints',
+    outputs: [
+      {
+        internalType: 'uint32',
+        name: '',
+        type: 'uint32',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'owner',
+        type: 'address',
+      },
+      {
+        internalType: 'address',
+        name: 'spender',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'rawAmount',
+        type: 'uint256',
+      },
+      {
+        internalType: 'uint256',
+        name: 'deadline',
+        type: 'uint256',
+      },
+      {
+        internalType: 'uint8',
+        name: 'v',
+        type: 'uint8',
+      },
+      {
+        internalType: 'bytes32',
+        name: 'r',
+        type: 'bytes32',
+      },
+      {
+        internalType: 'bytes32',
+        name: 's',
+        type: 'bytes32',
+      },
+    ],
+    name: 'permit',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'holder',
+        type: 'address',
+      },
+    ],
+    name: 'resetHolderWeight',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'account',
+        type: 'address',
+      },
+      {
+        internalType: 'address',
+        name: 'delegate',
+        type: 'address',
+      },
+    ],
+    name: 'returnHolderDelegation',
+    outputs: [
+      {
+        internalType: 'bool',
+        name: '',
+        type: 'bool',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'returnHolderRatio',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'delegate',
+        type: 'address',
+      },
+      {
+        internalType: 'bool',
+        name: 'value',
+        type: 'bool',
+      },
+    ],
+    name: 'setHolderDelegation',
+    outputs: [],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'symbol',
+    outputs: [
+      {
+        internalType: 'string',
+        name: '',
+        type: 'string',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [],
+    name: 'totalSupply',
+    outputs: [
+      {
+        internalType: 'uint256',
+        name: '',
+        type: 'uint256',
+      },
+    ],
+    stateMutability: 'view',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'dst',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'rawAmount',
+        type: 'uint256',
+      },
+    ],
+    name: 'transfer',
+    outputs: [
+      {
+        internalType: 'bool',
+        name: '',
+        type: 'bool',
+      },
+    ],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'src',
+        type: 'address',
+      },
+      {
+        internalType: 'address',
+        name: 'dst',
+        type: 'address',
+      },
+      {
+        internalType: 'uint256',
+        name: 'rawAmount',
+        type: 'uint256',
+      },
+    ],
+    name: 'transferFrom',
+    outputs: [
+      {
+        internalType: 'bool',
+        name: '',
+        type: 'bool',
+      },
+    ],
+    stateMutability: 'nonpayable',
+    type: 'function',
+  },
+] as const;
diff --git a/packages/dnode/tests/lib/pushValidator/pushValidator.test.ts b/packages/dnode/tests/lib/pushValidator/pushValidator.test.ts
new file mode 100644
index 000000000..ad0353b62
--- /dev/null
+++ b/packages/dnode/tests/lib/pushValidator/pushValidator.test.ts
@@ -0,0 +1,57 @@
+import { PushValidator } from '../../../src/lib/pushValidator/pushValidator';
+import { expect } from 'chai';
+import { ethers } from 'ethers';
+import { ENV } from '../../../src/lib/constants';
+import { ActiveValidator } from '../../../src/lib/pushValidator/pushValidatorTypes';
+
+describe('PushValidator Class', () => {
+  // accessing env dynamically using process.env
+  const envMode = process.env.ENV as keyof typeof ENV;
+  const env = ENV[envMode];
+
+  it('Initialize PushValidator', async () => {
+    const validatorInstance = await PushValidator.initalize({ env });
+    expect(validatorInstance.env).to.equal(env);
+
+    /**
+     * @dev - TS is a funny language, add `any` and access private properties
+     */
+    const activeValidators = (
+      (await (
+        validatorInstance as any
+      ).validatorContractClient.read.getActiveVNodes()) as []
+    ).map((each) => {
+      return (each as any).nodeApiBaseUrl;
+    });
+
+    expect(validatorInstance.activeValidatorURL).to.be.oneOf(activeValidators);
+  });
+  it('Ping every active validator node', async () => {
+    const validatorInstance = await PushValidator.initalize({ env });
+
+    const activeValidators: ActiveValidator[] = await (
+      validatorInstance as any
+    ).validatorContractClient.read.getActiveVNodes();
+
+    for (const each of activeValidators) {
+      const pingReply = await validatorInstance.ping(each.nodeApiBaseUrl);
+      expect(pingReply).to.not.be.null;
+      expect(pingReply?.nodeId).to.equal(each.nodeWallet);
+      expect(pingReply?.status).to.equal(1);
+    }
+  });
+  it('Ping active read validator node', async () => {
+    const validatorInstance = await PushValidator.initalize({ env });
+    // default active read validator
+    const pingReply = await validatorInstance.ping();
+    expect(pingReply).to.not.be.null;
+    expect(pingReply?.status).to.equal(1);
+  });
+  it('Get token from random active validator node', async () => {
+    const validatorInstance = await PushValidator.initalize({ env });
+    const token = await validatorInstance.getToken();
+    expect(token).to.not.be.null;
+    expect(token?.validatorToken).to.be.string;
+    expect(token?.validatorUrl).to.be.string;
+  });
+});
diff --git a/packages/dnode/tests/lib/utils/parseSettings.test.ts b/packages/dnode/tests/lib/utils/parseSettings.test.ts
new file mode 100644
index 000000000..a169d9489
--- /dev/null
+++ b/packages/dnode/tests/lib/utils/parseSettings.test.ts
@@ -0,0 +1,51 @@
+import { parseSettings } from '../../../src/lib/utils/parseSettings';
+import { expect } from 'chai';
+
+const userSettingsTestData =
+  '[{"type": 1, "user": true, "index": 1, "default": true, "description": "test1"}, {"type": 2, "user": 10, "index": 2, "ticker": 1, "default": 10, "enabled": true, "lowerLimit": 1, "upperLimit": 100, "description": "test2"}, {"type": 3, "user": {"lower": 10, "upper": 50}, "index": 3, "ticker": 2, "default": {"lower": 10, "upper": 50}, "enabled": true, "lowerLimit": 1, "upperLimit": 100, "description": "test3"}, {"type": 3, "user": {"lower": 3, "upper": 5}, "index": 4, "ticker": 2, "default": {"lower": 3, "upper": 5}, "enabled": false, "lowerLimit": 1, "upperLimit": 100, "description": "test4"}]';
+const channelSettinsgTestData = [
+  { type: 1, index: 1, default: true, description: 'test1' },
+  {
+    type: 2,
+    index: 2,
+    ticker: 1,
+    default: 10,
+    enabled: true,
+    lowerLimit: 1,
+    upperLimit: 100,
+    description: 'test2',
+  },
+  {
+    type: 3,
+    index: 3,
+    ticker: 2,
+    default: { lower: 10, upper: 50 },
+    enabled: true,
+    lowerLimit: 1,
+    upperLimit: 100,
+    description: 'test3',
+  },
+  {
+    type: 3,
+    index: 4,
+    ticker: 2,
+    default: { lower: 3, upper: 5 },
+    enabled: false,
+    lowerLimit: 1,
+    upperLimit: 100,
+    description: 'test4',
+  },
+];
+describe('Test parseSettings', () => {
+  it('Should succesfully parse the settings', () => {
+    const res = parseSettings(userSettingsTestData);
+    console.log(res);
+    expect(res.length).to.be.equal(4);
+  });
+
+  it('Should succesfully parse the channel settings', () => {
+    const res = parseSettings(channelSettinsgTestData);
+    console.log(res);
+    expect(res.length).to.be.equal(4);
+  });
+});
diff --git a/packages/dnode/tests/lib/utils/parseSubscriptionAPI.test.ts b/packages/dnode/tests/lib/utils/parseSubscriptionAPI.test.ts
new file mode 100644
index 000000000..85206e726
--- /dev/null
+++ b/packages/dnode/tests/lib/utils/parseSubscriptionAPI.test.ts
@@ -0,0 +1,25 @@
+import { parseSubscriptionsApiResponse } from '../../../src/lib/utils/pasreSubscriptionAPI';
+import { expect } from 'chai';
+
+const testData = [
+  {
+    channel: '0xD8634C39BBFd4033c0d3289C4515275102423681',
+    user_settings:
+      '[{"type": 1, "user": true, "index": 1, "default": true, "description": "test1"}, {"type": 2, "user": 10, "index": 2, "ticker": 1, "default": 10, "enabled": true, "lowerLimit": 1, "upperLimit": 100, "description": "test2"}, {"type": 3, "user": {"lower": 10, "upper": 50}, "index": 3, "ticker": 2, "default": {"lower": 10, "upper": 50}, "enabled": true, "lowerLimit": 1, "upperLimit": 100, "description": "test3"}, {"type": 3, "user": {"lower": 3, "upper": 5}, "index": 4, "ticker": 2, "default": {"lower": 3, "upper": 5}, "enabled": false, "lowerLimit": 1, "upperLimit": 100, "description": "test4"}]',
+  },
+  {
+    channel: '0x74415Bc4C4Bf4Baecc2DD372426F0a1D016Fa924',
+    user_settings: null,
+  },
+  {
+    channel: '0xC8c243a4fd7F34c49901fe441958953402b7C024',
+    user_settings:
+      '[{"type": 1, "user": false, "index": 1, "default": true, "description": "test1"}, {"type": 2, "user": 15, "index": 2, "ticker": 1, "default": 10, "enabled": true, "lowerLimit": 1, "upperLimit": 100, "description": "test2"}, {"type": 3, "user": {"lower": 5, "upper": 10}, "index": 3, "ticker": 2, "default": {"lower": 10, "upper": 50}, "enabled": true, "lowerLimit": 1, "upperLimit": 100, "description": "test3"}, {"type": 3, "user": {"lower": 5, "upper": 10}, "index": 4, "ticker": 2, "default": {"lower": 3, "upper": 5}, "enabled": true, "lowerLimit": 1, "upperLimit": 100, "description": "test4"}]',
+  },
+];
+describe('Test parseSubscriptionsApiResponse', () => {
+  it('Should succesfully parse the subscriptions', () => {
+    const res = parseSubscriptionsApiResponse(testData);
+    console.log(JSON.stringify(res));
+  });
+});
diff --git a/packages/restapi/tests/loaders/envVerifier.ts b/packages/dnode/tests/loaders/envVerifier.ts
similarity index 97%
rename from packages/restapi/tests/loaders/envVerifier.ts
rename to packages/dnode/tests/loaders/envVerifier.ts
index cddde942b..c21eae75f 100644
--- a/packages/restapi/tests/loaders/envVerifier.ts
+++ b/packages/dnode/tests/loaders/envVerifier.ts
@@ -1,9 +1,9 @@
 // Load FS and Other dependency
-import * as fs from 'fs'
-import * as readline from 'readline'
+import * as fs from 'fs';
+import * as readline from 'readline';
 
 export default async () => {
- /* try {
+  /* try {
     // Load environment files
     const envpath = `${__dirname}/../.env`
     const envsamplepath = `${__dirname}/../.env.sample`
@@ -77,4 +77,4 @@ export default async () => {
     console.log('     Error on env verifier loader: %o     ', e)
     throw e
   }*/
-}
\ No newline at end of file
+};
diff --git a/packages/dnode/tests/process-env.d.ts b/packages/dnode/tests/process-env.d.ts
new file mode 100644
index 000000000..afbff16dd
--- /dev/null
+++ b/packages/dnode/tests/process-env.d.ts
@@ -0,0 +1,5 @@
+declare namespace NodeJS {
+  interface ProcessEnv {
+    readonly ENV: string;
+  }
+}
diff --git a/packages/dnode/tests/root.ts b/packages/dnode/tests/root.ts
new file mode 100644
index 000000000..699fe6a89
--- /dev/null
+++ b/packages/dnode/tests/root.ts
@@ -0,0 +1,32 @@
+import * as dotenv from 'dotenv';
+import * as path from 'path';
+
+export const mochaHooks = {
+  // This file is needed to end the test suite.
+  beforeAll: [
+    async function () {
+      // Load .env file
+      const envFound = dotenv.config({
+        path: path.resolve(__dirname, './.env'),
+      });
+      // check if .env exists
+      if (!envFound) {
+        console.log('     .env NOT FOUND     ');
+        process.exit(1);
+      } else {
+        // Check environment setup first
+        console.log('     Verifying ENV     ');
+        const EnvVerifierLoader = (await require('./loaders/envVerifier'))
+          .default;
+        await EnvVerifierLoader();
+        console.log('     ENV Verified / Generated and Loaded!     ');
+      }
+    },
+  ],
+
+  afterAll(done: () => void) {
+    done();
+    console.log('     ALL TEST CASES EXECUTED     ');
+    process.exit(0);
+  },
+};
diff --git a/packages/dnode/tsconfig.json b/packages/dnode/tsconfig.json
new file mode 100644
index 000000000..db7b56666
--- /dev/null
+++ b/packages/dnode/tsconfig.json
@@ -0,0 +1,19 @@
+{
+  "extends": "../../tsconfig.base.json",
+  "compilerOptions": {
+    "module": "commonjs",
+    "forceConsistentCasingInFileNames": true,
+    "strict": true,
+    "noImplicitOverride": true,
+    "noPropertyAccessFromIndexSignature": true,
+    "noImplicitReturns": true,
+    "noFallthroughCasesInSwitch": true
+  },
+  "files": [],
+  "include": [],
+  "references": [
+    {
+      "path": "./tsconfig.lib.json"
+    }
+  ]
+}
diff --git a/packages/dnode/tsconfig.lib.json b/packages/dnode/tsconfig.lib.json
new file mode 100644
index 000000000..63b23f097
--- /dev/null
+++ b/packages/dnode/tsconfig.lib.json
@@ -0,0 +1,10 @@
+{
+  "extends": "./tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../../dist/out-tsc",
+    "declaration": true,
+    "types": []
+  },
+  "include": ["**/*.ts"],
+  "exclude": ["jest.config.ts", "**/*.spec.ts", "**/*.test.ts" , "tests"]
+}
diff --git a/packages/dnode/tsconfig.mocha.json b/packages/dnode/tsconfig.mocha.json
new file mode 100644
index 000000000..bced2229d
--- /dev/null
+++ b/packages/dnode/tsconfig.mocha.json
@@ -0,0 +1,13 @@
+{
+  "extends": "./tsconfig.json",
+  "ts-node": {
+    "transpileOnly": true,
+    "esm": true
+  },
+
+  "compilerOptions": {
+    "module": "commonjs",
+    "esModuleInterop": false
+  },
+  "exclude": ["node_modules" , "tests"]
+}
diff --git a/packages/examples/dnode-dapp/.eslintrc.json b/packages/examples/dnode-dapp/.eslintrc.json
new file mode 100644
index 000000000..bffb357a7
--- /dev/null
+++ b/packages/examples/dnode-dapp/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+  "extends": "next/core-web-vitals"
+}
diff --git a/packages/examples/dnode-dapp/.gitignore b/packages/examples/dnode-dapp/.gitignore
new file mode 100644
index 000000000..7d093c39f
--- /dev/null
+++ b/packages/examples/dnode-dapp/.gitignore
@@ -0,0 +1,38 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# local env files
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
diff --git a/packages/examples/dnode-dapp/.npmrc b/packages/examples/dnode-dapp/.npmrc
new file mode 100644
index 000000000..aff8a3283
--- /dev/null
+++ b/packages/examples/dnode-dapp/.npmrc
@@ -0,0 +1 @@
+strict-peer-dependencies = false
diff --git a/packages/examples/dnode-dapp/README.md b/packages/examples/dnode-dapp/README.md
new file mode 100644
index 000000000..45a29ce9a
--- /dev/null
+++ b/packages/examples/dnode-dapp/README.md
@@ -0,0 +1,29 @@
+This is a [RainbowKit](https://rainbowkit.com) + [wagmi](https://wagmi.sh) + [Next.js](https://nextjs.org/) project bootstrapped with [`create-rainbowkit`](/packages/create-rainbowkit).
+
+## Getting Started
+
+First, run the development server:
+
+```bash
+npm run dev
+```
+
+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
+
+You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file.
+
+## Learn More
+
+To learn more about this stack, take a look at the following resources:
+
+- [RainbowKit Documentation](https://rainbowkit.com) - Learn how to customize your wallet connection flow.
+- [wagmi Documentation](https://wagmi.sh) - Learn how to interact with Ethereum.
+- [Next.js Documentation](https://nextjs.org/docs) - Learn how to build a Next.js application.
+
+You can check out [the RainbowKit GitHub repository](https://github.com/rainbow-me/rainbowkit) - your feedback and contributions are welcome!
+
+## Deploy on Vercel
+
+The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
+
+Check out the [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
diff --git a/packages/examples/dnode-dapp/next-env.d.ts b/packages/examples/dnode-dapp/next-env.d.ts
new file mode 100644
index 000000000..4f11a03dc
--- /dev/null
+++ b/packages/examples/dnode-dapp/next-env.d.ts
@@ -0,0 +1,5 @@
+/// <reference types="next" />
+/// <reference types="next/image-types/global" />
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/packages/examples/dnode-dapp/next.config.js b/packages/examples/dnode-dapp/next.config.js
new file mode 100644
index 000000000..91ef62f0d
--- /dev/null
+++ b/packages/examples/dnode-dapp/next.config.js
@@ -0,0 +1,6 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+  reactStrictMode: true,
+};
+
+module.exports = nextConfig;
diff --git a/packages/examples/dnode-dapp/package-lock.json b/packages/examples/dnode-dapp/package-lock.json
new file mode 100644
index 000000000..e939a0798
--- /dev/null
+++ b/packages/examples/dnode-dapp/package-lock.json
@@ -0,0 +1,16077 @@
+{
+  "name": "dnode-dapp",
+  "version": "0.1.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "dnode-dapp",
+      "version": "0.1.0",
+      "dependencies": {
+        "@headlessui/react": "^2.1.1",
+        "@heroicons/react": "^2.1.4",
+        "@pushprotocol/dnode": "^0.0.6",
+        "@rainbow-me/rainbowkit": "^2.1.3",
+        "@tailwindcss/forms": "^0.5.7",
+        "@tanstack/react-query": "^5.28.4",
+        "ethers": "^6.13.1",
+        "ldrs": "^1.0.2",
+        "next": "^14.2.3",
+        "react": "^18.3.0",
+        "react-dom": "^18.3.0",
+        "viem": "2.9.31",
+        "wagmi": "^2.9.2"
+      },
+      "devDependencies": {
+        "@types/node": "^18.19.3",
+        "@types/react": "^18.3.0",
+        "autoprefixer": "^10.4.19",
+        "daisyui": "^4.12.10",
+        "eslint": "8.57.0",
+        "eslint-config-next": "^14.2.4",
+        "postcss": "^8.4.39",
+        "tailwindcss": "^3.4.4",
+        "typescript": "5.4.2"
+      }
+    },
+    "node_modules/@adraffy/ens-normalize": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz",
+      "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q=="
+    },
+    "node_modules/@alloc/quick-lru": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+      "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@ampproject/remapping": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+      "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+      "peer": true,
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+      "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/highlight": "^7.24.7",
+        "picocolors": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/compat-data": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz",
+      "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==",
+      "peer": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz",
+      "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==",
+      "peer": true,
+      "dependencies": {
+        "@ampproject/remapping": "^2.2.0",
+        "@babel/code-frame": "^7.24.7",
+        "@babel/generator": "^7.24.7",
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helpers": "^7.24.7",
+        "@babel/parser": "^7.24.7",
+        "@babel/template": "^7.24.7",
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7",
+        "convert-source-map": "^2.0.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.2.3",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
+      }
+    },
+    "node_modules/@babel/core/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "peer": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz",
+      "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/types": "^7.24.7",
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25",
+        "jsesc": "^2.5.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-annotate-as-pure": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
+      "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz",
+      "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz",
+      "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/compat-data": "^7.24.7",
+        "@babel/helper-validator-option": "^7.24.7",
+        "browserslist": "^4.22.2",
+        "lru-cache": "^5.1.1",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "peer": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/helper-create-class-features-plugin": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz",
+      "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/helper-member-expression-to-functions": "^7.24.7",
+        "@babel/helper-optimise-call-expression": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/helper-split-export-declaration": "^7.24.7",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "peer": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/helper-create-regexp-features-plugin": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz",
+      "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "regexpu-core": "^5.3.1",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "peer": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/helper-define-polyfill-provider": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
+      "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-compilation-targets": "^7.22.6",
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "debug": "^4.1.1",
+        "lodash.debounce": "^4.0.8",
+        "resolve": "^1.14.2"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/@babel/helper-environment-visitor": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz",
+      "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-function-name": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz",
+      "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/template": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-hoist-variables": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz",
+      "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-member-expression-to-functions": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz",
+      "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==",
+      "peer": true,
+      "dependencies": {
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-imports": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
+      "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-transforms": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz",
+      "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-simple-access": "^7.24.7",
+        "@babel/helper-split-export-declaration": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-optimise-call-expression": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
+      "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==",
+      "peer": true,
+      "dependencies": {
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-plugin-utils": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz",
+      "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==",
+      "peer": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-remap-async-to-generator": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz",
+      "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-wrap-function": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-replace-supers": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz",
+      "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-member-expression-to-functions": "^7.24.7",
+        "@babel/helper-optimise-call-expression": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-simple-access": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
+      "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz",
+      "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-split-export-declaration": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
+      "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz",
+      "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==",
+      "peer": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+      "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
+      "peer": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-option": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz",
+      "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==",
+      "peer": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-wrap-function": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz",
+      "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/template": "^7.24.7",
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz",
+      "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/template": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/highlight": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+      "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "chalk": "^2.4.2",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/highlight/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==",
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/highlight/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==",
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/highlight/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==",
+      "peer": true,
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/@babel/highlight/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==",
+      "peer": true
+    },
+    "node_modules/@babel/highlight/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==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/@babel/highlight/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==",
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/highlight/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==",
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz",
+      "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==",
+      "peer": true,
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz",
+      "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz",
+      "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
+      "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/plugin-transform-optional-chaining": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.13.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz",
+      "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-async-generator-functions": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz",
+      "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==",
+      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.18.9",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-remap-async-to-generator": "^7.18.9",
+        "@babel/plugin-syntax-async-generators": "^7.8.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-class-properties": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
+      "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
+      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-export-default-from": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz",
+      "integrity": "sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-export-default-from": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz",
+      "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==",
+      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
+      "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
+      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.6",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-numeric-separator": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
+      "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
+      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.6",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-object-rest-spread": {
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz",
+      "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==",
+      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.",
+      "peer": true,
+      "dependencies": {
+        "@babel/compat-data": "^7.20.5",
+        "@babel/helper-compilation-targets": "^7.20.7",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-transform-parameters": "^7.20.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-optional-catch-binding": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz",
+      "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==",
+      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.18.6",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-optional-chaining": {
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
+      "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
+      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-private-property-in-object": {
+      "version": "7.21.0-placeholder-for-preset-env.2",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+      "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+      "peer": true,
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-async-generators": {
+      "version": "7.8.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-class-properties": {
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-class-static-block": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+      "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-dynamic-import": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-export-default-from": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz",
+      "integrity": "sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-export-namespace-from": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-flow": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz",
+      "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-assertions": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz",
+      "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-attributes": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz",
+      "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-meta": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-json-strings": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-jsx": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz",
+      "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-private-property-in-object": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+      "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-top-level-await": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+      "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-typescript": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz",
+      "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+      "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-arrow-functions": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
+      "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-async-generator-functions": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz",
+      "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-remap-async-to-generator": "^7.24.7",
+        "@babel/plugin-syntax-async-generators": "^7.8.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-async-to-generator": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
+      "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-remap-async-to-generator": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
+      "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-block-scoping": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz",
+      "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-class-properties": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz",
+      "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-class-static-block": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
+      "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-class-static-block": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.12.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-classes": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz",
+      "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.24.7",
+        "@babel/helper-split-export-declaration": "^7.24.7",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-computed-properties": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
+      "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/template": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-destructuring": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz",
+      "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-dotall-regex": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
+      "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-duplicate-keys": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
+      "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-dynamic-import": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
+      "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
+      "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-export-namespace-from": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
+      "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-flow-strip-types": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.7.tgz",
+      "integrity": "sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-flow": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-for-of": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
+      "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-function-name": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz",
+      "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-json-strings": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
+      "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-json-strings": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-literals": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz",
+      "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
+      "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-member-expression-literals": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
+      "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-amd": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
+      "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-commonjs": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz",
+      "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-simple-access": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-systemjs": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz",
+      "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-hoist-variables": "^7.24.7",
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-umd": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
+      "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz",
+      "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-new-target": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
+      "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
+      "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-numeric-separator": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
+      "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-object-rest-spread": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
+      "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-transform-parameters": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-object-super": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
+      "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-optional-catch-binding": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
+      "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-optional-chaining": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz",
+      "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-parameters": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz",
+      "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-private-methods": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz",
+      "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-private-property-in-object": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
+      "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-property-literals": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
+      "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-display-name": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz",
+      "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-jsx": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz",
+      "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-jsx": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-jsx-self": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz",
+      "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-jsx-source": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz",
+      "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-regenerator": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
+      "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "regenerator-transform": "^0.15.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-reserved-words": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
+      "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-runtime": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz",
+      "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "babel-plugin-polyfill-corejs2": "^0.4.10",
+        "babel-plugin-polyfill-corejs3": "^0.10.1",
+        "babel-plugin-polyfill-regenerator": "^0.6.1",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "peer": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/plugin-transform-shorthand-properties": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
+      "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-spread": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
+      "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-sticky-regex": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
+      "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-template-literals": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
+      "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-typeof-symbol": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz",
+      "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-typescript": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz",
+      "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-typescript": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-escapes": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
+      "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-property-regex": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
+      "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-regex": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
+      "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz",
+      "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/preset-env": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz",
+      "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/compat-data": "^7.24.7",
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-validator-option": "^7.24.7",
+        "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
+        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7",
+        "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-class-properties": "^7.12.13",
+        "@babel/plugin-syntax-class-static-block": "^7.14.5",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+        "@babel/plugin-syntax-import-assertions": "^7.24.7",
+        "@babel/plugin-syntax-import-attributes": "^7.24.7",
+        "@babel/plugin-syntax-import-meta": "^7.10.4",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+        "@babel/plugin-syntax-top-level-await": "^7.14.5",
+        "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+        "@babel/plugin-transform-arrow-functions": "^7.24.7",
+        "@babel/plugin-transform-async-generator-functions": "^7.24.7",
+        "@babel/plugin-transform-async-to-generator": "^7.24.7",
+        "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
+        "@babel/plugin-transform-block-scoping": "^7.24.7",
+        "@babel/plugin-transform-class-properties": "^7.24.7",
+        "@babel/plugin-transform-class-static-block": "^7.24.7",
+        "@babel/plugin-transform-classes": "^7.24.7",
+        "@babel/plugin-transform-computed-properties": "^7.24.7",
+        "@babel/plugin-transform-destructuring": "^7.24.7",
+        "@babel/plugin-transform-dotall-regex": "^7.24.7",
+        "@babel/plugin-transform-duplicate-keys": "^7.24.7",
+        "@babel/plugin-transform-dynamic-import": "^7.24.7",
+        "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
+        "@babel/plugin-transform-export-namespace-from": "^7.24.7",
+        "@babel/plugin-transform-for-of": "^7.24.7",
+        "@babel/plugin-transform-function-name": "^7.24.7",
+        "@babel/plugin-transform-json-strings": "^7.24.7",
+        "@babel/plugin-transform-literals": "^7.24.7",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
+        "@babel/plugin-transform-member-expression-literals": "^7.24.7",
+        "@babel/plugin-transform-modules-amd": "^7.24.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.24.7",
+        "@babel/plugin-transform-modules-systemjs": "^7.24.7",
+        "@babel/plugin-transform-modules-umd": "^7.24.7",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+        "@babel/plugin-transform-new-target": "^7.24.7",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+        "@babel/plugin-transform-numeric-separator": "^7.24.7",
+        "@babel/plugin-transform-object-rest-spread": "^7.24.7",
+        "@babel/plugin-transform-object-super": "^7.24.7",
+        "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+        "@babel/plugin-transform-optional-chaining": "^7.24.7",
+        "@babel/plugin-transform-parameters": "^7.24.7",
+        "@babel/plugin-transform-private-methods": "^7.24.7",
+        "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+        "@babel/plugin-transform-property-literals": "^7.24.7",
+        "@babel/plugin-transform-regenerator": "^7.24.7",
+        "@babel/plugin-transform-reserved-words": "^7.24.7",
+        "@babel/plugin-transform-shorthand-properties": "^7.24.7",
+        "@babel/plugin-transform-spread": "^7.24.7",
+        "@babel/plugin-transform-sticky-regex": "^7.24.7",
+        "@babel/plugin-transform-template-literals": "^7.24.7",
+        "@babel/plugin-transform-typeof-symbol": "^7.24.7",
+        "@babel/plugin-transform-unicode-escapes": "^7.24.7",
+        "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
+        "@babel/plugin-transform-unicode-regex": "^7.24.7",
+        "@babel/plugin-transform-unicode-sets-regex": "^7.24.7",
+        "@babel/preset-modules": "0.1.6-no-external-plugins",
+        "babel-plugin-polyfill-corejs2": "^0.4.10",
+        "babel-plugin-polyfill-corejs3": "^0.10.4",
+        "babel-plugin-polyfill-regenerator": "^0.6.1",
+        "core-js-compat": "^3.31.0",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/preset-env/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "peer": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/preset-flow": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.7.tgz",
+      "integrity": "sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-validator-option": "^7.24.7",
+        "@babel/plugin-transform-flow-strip-types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/preset-modules": {
+      "version": "0.1.6-no-external-plugins",
+      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+      "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/types": "^7.4.4",
+        "esutils": "^2.0.2"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/@babel/preset-typescript": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz",
+      "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-validator-option": "^7.24.7",
+        "@babel/plugin-syntax-jsx": "^7.24.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.24.7",
+        "@babel/plugin-transform-typescript": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/register": {
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz",
+      "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==",
+      "peer": true,
+      "dependencies": {
+        "clone-deep": "^4.0.1",
+        "find-cache-dir": "^2.0.0",
+        "make-dir": "^2.1.0",
+        "pirates": "^4.0.6",
+        "source-map-support": "^0.5.16"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/regjsgen": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+      "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
+      "peer": true
+    },
+    "node_modules/@babel/runtime": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz",
+      "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==",
+      "dependencies": {
+        "regenerator-runtime": "^0.14.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/template": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz",
+      "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==",
+      "peer": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.24.7",
+        "@babel/parser": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz",
+      "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.24.7",
+        "@babel/generator": "^7.24.7",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/helper-hoist-variables": "^7.24.7",
+        "@babel/helper-split-export-declaration": "^7.24.7",
+        "@babel/parser": "^7.24.7",
+        "@babel/types": "^7.24.7",
+        "debug": "^4.3.1",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz",
+      "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "to-fast-properties": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@coinbase/wallet-sdk": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.0.4.tgz",
+      "integrity": "sha512-74c040CRnGhfRjr3ArnkAgud86erIqdkPHNt5HR1k9u97uTIZCJww9eGYT67Qf7gHPpGS/xW8Be1D4dvRm63FA==",
+      "dependencies": {
+        "buffer": "^6.0.3",
+        "clsx": "^1.2.1",
+        "eventemitter3": "^5.0.1",
+        "keccak": "^3.0.3",
+        "preact": "^10.16.0",
+        "sha.js": "^2.4.11"
+      }
+    },
+    "node_modules/@emotion/hash": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
+      "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
+    },
+    "node_modules/@eslint-community/eslint-utils": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+      "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+      }
+    },
+    "node_modules/@eslint-community/regexpp": {
+      "version": "4.11.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz",
+      "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+      }
+    },
+    "node_modules/@eslint/eslintrc": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+      "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^9.6.0",
+        "globals": "^13.19.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
+        "strip-json-comments": "^3.1.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@eslint/eslintrc/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,
+      "license": "Python-2.0"
+    },
+    "node_modules/@eslint/eslintrc/node_modules/globals": {
+      "version": "13.24.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+      "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "type-fest": "^0.20.2"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+      "dev": true,
+      "license": "(MIT OR CC0-1.0)",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@eslint/js": {
+      "version": "8.57.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+      "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
+    },
+    "node_modules/@ethereumjs/common": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-3.2.0.tgz",
+      "integrity": "sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==",
+      "dependencies": {
+        "@ethereumjs/util": "^8.1.0",
+        "crc-32": "^1.2.0"
+      }
+    },
+    "node_modules/@ethereumjs/rlp": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz",
+      "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==",
+      "bin": {
+        "rlp": "bin/rlp"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@ethereumjs/tx": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-4.2.0.tgz",
+      "integrity": "sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==",
+      "dependencies": {
+        "@ethereumjs/common": "^3.2.0",
+        "@ethereumjs/rlp": "^4.0.1",
+        "@ethereumjs/util": "^8.1.0",
+        "ethereum-cryptography": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@ethereumjs/util": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz",
+      "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==",
+      "dependencies": {
+        "@ethereumjs/rlp": "^4.0.1",
+        "ethereum-cryptography": "^2.0.0",
+        "micro-ftch": "^0.3.1"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@floating-ui/core": {
+      "version": "1.6.4",
+      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.4.tgz",
+      "integrity": "sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/utils": "^0.2.4"
+      }
+    },
+    "node_modules/@floating-ui/dom": {
+      "version": "1.6.7",
+      "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.7.tgz",
+      "integrity": "sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/core": "^1.6.0",
+        "@floating-ui/utils": "^0.2.4"
+      }
+    },
+    "node_modules/@floating-ui/react": {
+      "version": "0.26.19",
+      "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.19.tgz",
+      "integrity": "sha512-Jk6zITdjjIvjO/VdQFvpRaD3qPwOHH6AoDHxjhpy+oK4KFgaSP871HYWUAPdnLmx1gQ+w/pB312co3tVml+BXA==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/react-dom": "^2.1.1",
+        "@floating-ui/utils": "^0.2.4",
+        "tabbable": "^6.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@floating-ui/react-dom": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz",
+      "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/dom": "^1.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
+    "node_modules/@floating-ui/utils": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.4.tgz",
+      "integrity": "sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==",
+      "license": "MIT"
+    },
+    "node_modules/@hapi/hoek": {
+      "version": "9.3.0",
+      "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
+      "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="
+    },
+    "node_modules/@hapi/topo": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
+      "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
+      "dependencies": {
+        "@hapi/hoek": "^9.0.0"
+      }
+    },
+    "node_modules/@headlessui/react": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.1.1.tgz",
+      "integrity": "sha512-808gVNUbRDbDR3GMNPHy+ON0uvR8b9H7IA+Q2UbhOsNCIjgwuwb2Iuv8VPT/1AW0UzLX8g10tN6LhF15GaUJCQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/react": "^0.26.16",
+        "@react-aria/focus": "^3.17.1",
+        "@react-aria/interactions": "^3.21.3",
+        "@tanstack/react-virtual": "3.5.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "react": "^18",
+        "react-dom": "^18"
+      }
+    },
+    "node_modules/@heroicons/react": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.4.tgz",
+      "integrity": "sha512-ju0wj0wwrUTMQ2Yceyrma7TKuI3BpSjp+qKqV81K9KGcUHdvTMdiwfRc2cwXBp3uXtKuDZkh0v03nWOQnJFv2Q==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": ">= 16"
+      }
+    },
+    "node_modules/@humanwhocodes/config-array": {
+      "version": "0.11.14",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+      "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+      "deprecated": "Use @eslint/config-array instead",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@humanwhocodes/object-schema": "^2.0.2",
+        "debug": "^4.3.1",
+        "minimatch": "^3.0.5"
+      },
+      "engines": {
+        "node": ">=10.10.0"
+      }
+    },
+    "node_modules/@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=12.22"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@humanwhocodes/object-schema": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+      "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+      "deprecated": "Use @eslint/object-schema instead",
+      "dev": true,
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@isaacs/cliui": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+      "license": "ISC",
+      "dependencies": {
+        "string-width": "^5.1.2",
+        "string-width-cjs": "npm:string-width@^4.2.0",
+        "strip-ansi": "^7.0.1",
+        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+        "wrap-ansi": "^8.1.0",
+        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "license": "MIT"
+    },
+    "node_modules/@isaacs/cliui/node_modules/string-width": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+      "license": "MIT",
+      "dependencies": {
+        "eastasianwidth": "^0.2.0",
+        "emoji-regex": "^9.2.2",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^6.1.0",
+        "string-width": "^5.0.1",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/ttlcache": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz",
+      "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==",
+      "peer": true,
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@jest/create-cache-key-function": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz",
+      "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==",
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^29.6.3"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@jest/environment": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
+      "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+      "peer": true,
+      "dependencies": {
+        "@jest/fake-timers": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "jest-mock": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@jest/fake-timers": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
+      "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^29.6.3",
+        "@sinonjs/fake-timers": "^10.0.2",
+        "@types/node": "*",
+        "jest-message-util": "^29.7.0",
+        "jest-mock": "^29.7.0",
+        "jest-util": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@jest/schemas": {
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+      "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+      "peer": true,
+      "dependencies": {
+        "@sinclair/typebox": "^0.27.8"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@jest/types": {
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+      "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+      "peer": true,
+      "dependencies": {
+        "@jest/schemas": "^29.6.3",
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "@types/istanbul-reports": "^3.0.0",
+        "@types/node": "*",
+        "@types/yargs": "^17.0.8",
+        "chalk": "^4.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+      "dependencies": {
+        "@jridgewell/set-array": "^1.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/source-map": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+      "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+      "peer": true,
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.4.15",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@lit-labs/ssr-dom-shim": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz",
+      "integrity": "sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g=="
+    },
+    "node_modules/@lit/reactive-element": {
+      "version": "1.6.3",
+      "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz",
+      "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==",
+      "dependencies": {
+        "@lit-labs/ssr-dom-shim": "^1.0.0"
+      }
+    },
+    "node_modules/@metamask/eth-json-rpc-provider": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-1.0.1.tgz",
+      "integrity": "sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==",
+      "dependencies": {
+        "@metamask/json-rpc-engine": "^7.0.0",
+        "@metamask/safe-event-emitter": "^3.0.0",
+        "@metamask/utils": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@metamask/eth-json-rpc-provider/node_modules/@metamask/utils": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-5.0.2.tgz",
+      "integrity": "sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==",
+      "dependencies": {
+        "@ethereumjs/tx": "^4.1.2",
+        "@types/debug": "^4.1.7",
+        "debug": "^4.3.4",
+        "semver": "^7.3.8",
+        "superstruct": "^1.0.3"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@metamask/eth-sig-util": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-5.1.0.tgz",
+      "integrity": "sha512-mlgziIHYlA9pi/XZerChqg4NocdOgBPB9NmxgXWQO2U2hH8RGOJQrz6j/AIKkYxgCMIE2PY000+joOwXfzeTDQ==",
+      "license": "ISC",
+      "dependencies": {
+        "@ethereumjs/util": "^8.0.6",
+        "bn.js": "^4.12.0",
+        "ethereum-cryptography": "^2.0.0",
+        "ethjs-util": "^0.1.6",
+        "tweetnacl": "^1.0.3",
+        "tweetnacl-util": "^0.15.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@metamask/eth-sig-util/node_modules/bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "license": "MIT"
+    },
+    "node_modules/@metamask/json-rpc-engine": {
+      "version": "7.3.3",
+      "resolved": "https://registry.npmjs.org/@metamask/json-rpc-engine/-/json-rpc-engine-7.3.3.tgz",
+      "integrity": "sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==",
+      "dependencies": {
+        "@metamask/rpc-errors": "^6.2.1",
+        "@metamask/safe-event-emitter": "^3.0.0",
+        "@metamask/utils": "^8.3.0"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@metamask/json-rpc-middleware-stream": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/@metamask/json-rpc-middleware-stream/-/json-rpc-middleware-stream-6.0.2.tgz",
+      "integrity": "sha512-jtyx3PRfc1kqoLpYveIVQNwsxYKefc64/LCl9h9Da1m3nUKEvypbYuXSIwi237qvOjKmNHQKsDOZg6f4uBf62Q==",
+      "dependencies": {
+        "@metamask/json-rpc-engine": "^7.3.2",
+        "@metamask/safe-event-emitter": "^3.0.0",
+        "@metamask/utils": "^8.3.0",
+        "readable-stream": "^3.6.2"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@metamask/object-multiplex": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@metamask/object-multiplex/-/object-multiplex-2.0.0.tgz",
+      "integrity": "sha512-+ItrieVZie3j2LfYE0QkdW3dsEMfMEp419IGx1zyeLqjRZ14iQUPRO0H6CGgfAAoC0x6k2PfCAGRwJUA9BMrqA==",
+      "dependencies": {
+        "once": "^1.4.0",
+        "readable-stream": "^3.6.2"
+      },
+      "engines": {
+        "node": "^16.20 || ^18.16 || >=20"
+      }
+    },
+    "node_modules/@metamask/onboarding": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@metamask/onboarding/-/onboarding-1.0.1.tgz",
+      "integrity": "sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==",
+      "dependencies": {
+        "bowser": "^2.9.0"
+      }
+    },
+    "node_modules/@metamask/providers": {
+      "version": "15.0.0",
+      "resolved": "https://registry.npmjs.org/@metamask/providers/-/providers-15.0.0.tgz",
+      "integrity": "sha512-FXvL1NQNl6I7fMOJTfQYcBlBZ33vSlm6w80cMpmn8sJh0Lb7wcBpe02UwBsNlARnI+Qsr26XeDs6WHUHQh8CuA==",
+      "dependencies": {
+        "@metamask/json-rpc-engine": "^7.3.2",
+        "@metamask/json-rpc-middleware-stream": "^6.0.2",
+        "@metamask/object-multiplex": "^2.0.0",
+        "@metamask/rpc-errors": "^6.2.1",
+        "@metamask/safe-event-emitter": "^3.0.0",
+        "@metamask/utils": "^8.3.0",
+        "detect-browser": "^5.2.0",
+        "extension-port-stream": "^3.0.0",
+        "fast-deep-equal": "^3.1.3",
+        "is-stream": "^2.0.0",
+        "readable-stream": "^3.6.2",
+        "webextension-polyfill": "^0.10.0"
+      },
+      "engines": {
+        "node": "^18.18 || >=20"
+      }
+    },
+    "node_modules/@metamask/rpc-errors": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/@metamask/rpc-errors/-/rpc-errors-6.3.0.tgz",
+      "integrity": "sha512-B1UIG/0xWkaDs/d6xrxsRf7kmFLdk8YE0HUToaFumjwQM36AjBsqEzVyemPTQv0SIrAPFnSmkLt053JOWcu5iw==",
+      "dependencies": {
+        "@metamask/utils": "^8.3.0",
+        "fast-safe-stringify": "^2.0.6"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@metamask/safe-event-emitter": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.1.tgz",
+      "integrity": "sha512-ihb3B0T/wJm1eUuArYP4lCTSEoZsClHhuWyfo/kMX3m/odpqNcPfsz5O2A3NT7dXCAgWPGDQGPqygCpgeniKMw==",
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/@metamask/sdk": {
+      "version": "0.26.4",
+      "resolved": "https://registry.npmjs.org/@metamask/sdk/-/sdk-0.26.4.tgz",
+      "integrity": "sha512-9Yh41KJkD9RhW0lRijnQzPV0ptblLorLdTsf5GnAl3yE72QIfaPBtsDxzLtX+0QLppiFfj7o8vRBYvBApG9k+Q==",
+      "dependencies": {
+        "@metamask/onboarding": "^1.0.1",
+        "@metamask/providers": "^15.0.0",
+        "@metamask/sdk-communication-layer": "0.26.4",
+        "@metamask/sdk-install-modal-web": "0.26.4",
+        "@types/dom-screen-wake-lock": "^1.0.0",
+        "bowser": "^2.9.0",
+        "cross-fetch": "^4.0.0",
+        "debug": "^4.3.4",
+        "eciesjs": "^0.3.15",
+        "eth-rpc-errors": "^4.0.3",
+        "eventemitter2": "^6.4.7",
+        "i18next": "23.11.5",
+        "i18next-browser-languagedetector": "7.1.0",
+        "obj-multiplex": "^1.0.0",
+        "pump": "^3.0.0",
+        "qrcode-terminal-nooctal": "^0.12.1",
+        "react-native-webview": "^11.26.0",
+        "readable-stream": "^3.6.2",
+        "rollup-plugin-visualizer": "^5.9.2",
+        "socket.io-client": "^4.5.1",
+        "util": "^0.12.4",
+        "uuid": "^8.3.2"
+      },
+      "peerDependencies": {
+        "react": "^18.2.0",
+        "react-dom": "^18.2.0"
+      },
+      "peerDependenciesMeta": {
+        "react": {
+          "optional": true
+        },
+        "react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@metamask/sdk-communication-layer": {
+      "version": "0.26.4",
+      "resolved": "https://registry.npmjs.org/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.26.4.tgz",
+      "integrity": "sha512-+X4GEc5mV1gWK4moSswVlKsUh+RsA48qPlkxBLTUxQODSnyBe0TRMxE6mH+bSrfponnTzvBkGUXyEjvDwDjDHw==",
+      "dependencies": {
+        "bufferutil": "^4.0.8",
+        "date-fns": "^2.29.3",
+        "debug": "^4.3.4",
+        "utf-8-validate": "^5.0.2",
+        "uuid": "^8.3.2"
+      },
+      "peerDependencies": {
+        "cross-fetch": "^4.0.0",
+        "eciesjs": "^0.3.16",
+        "eventemitter2": "^6.4.7",
+        "readable-stream": "^3.6.2",
+        "socket.io-client": "^4.5.1"
+      }
+    },
+    "node_modules/@metamask/sdk-communication-layer/node_modules/uuid": {
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+      "license": "MIT",
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
+    "node_modules/@metamask/sdk-install-modal-web": {
+      "version": "0.26.4",
+      "resolved": "https://registry.npmjs.org/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.26.4.tgz",
+      "integrity": "sha512-7Cx7ZsaExbMwghlRrUWWI0Ksg0m7K60LtMjfuDpjvjWqoZa9MoPxitGDEXNbLaqvKn39ebPvNcPzQ6czA4ilTw==",
+      "dependencies": {
+        "qr-code-styling": "^1.6.0-rc.1"
+      },
+      "peerDependencies": {
+        "i18next": "23.2.3",
+        "react": "^18.2.0",
+        "react-dom": "^18.2.0",
+        "react-native": "*"
+      },
+      "peerDependenciesMeta": {
+        "react": {
+          "optional": true
+        },
+        "react-dom": {
+          "optional": true
+        },
+        "react-native": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@metamask/sdk/node_modules/cliui": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+      "peer": true,
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.1",
+        "wrap-ansi": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@metamask/sdk/node_modules/escape-string-regexp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@metamask/sdk/node_modules/i18next": {
+      "version": "23.11.5",
+      "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.5.tgz",
+      "integrity": "sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://locize.com"
+        },
+        {
+          "type": "individual",
+          "url": "https://locize.com/i18next.html"
+        },
+        {
+          "type": "individual",
+          "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+        }
+      ],
+      "dependencies": {
+        "@babel/runtime": "^7.23.2"
+      }
+    },
+    "node_modules/@metamask/sdk/node_modules/react-native": {
+      "version": "0.74.3",
+      "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.74.3.tgz",
+      "integrity": "sha512-UFutCC6WEw6HkxlcpQ2BemKqi0JkwrgDchYB5Svi8Sp4Xwt4HA6LGEjNQgZ+3KM44bjyFRpofQym0uh0jACGng==",
+      "peer": true,
+      "dependencies": {
+        "@jest/create-cache-key-function": "^29.6.3",
+        "@react-native-community/cli": "13.6.9",
+        "@react-native-community/cli-platform-android": "13.6.9",
+        "@react-native-community/cli-platform-ios": "13.6.9",
+        "@react-native/assets-registry": "0.74.85",
+        "@react-native/codegen": "0.74.85",
+        "@react-native/community-cli-plugin": "0.74.85",
+        "@react-native/gradle-plugin": "0.74.85",
+        "@react-native/js-polyfills": "0.74.85",
+        "@react-native/normalize-colors": "0.74.85",
+        "@react-native/virtualized-lists": "0.74.85",
+        "abort-controller": "^3.0.0",
+        "anser": "^1.4.9",
+        "ansi-regex": "^5.0.0",
+        "base64-js": "^1.5.1",
+        "chalk": "^4.0.0",
+        "event-target-shim": "^5.0.1",
+        "flow-enums-runtime": "^0.0.6",
+        "invariant": "^2.2.4",
+        "jest-environment-node": "^29.6.3",
+        "jsc-android": "^250231.0.0",
+        "memoize-one": "^5.0.0",
+        "metro-runtime": "^0.80.3",
+        "metro-source-map": "^0.80.3",
+        "mkdirp": "^0.5.1",
+        "nullthrows": "^1.1.1",
+        "pretty-format": "^26.5.2",
+        "promise": "^8.3.0",
+        "react-devtools-core": "^5.0.0",
+        "react-refresh": "^0.14.0",
+        "react-shallow-renderer": "^16.15.0",
+        "regenerator-runtime": "^0.13.2",
+        "scheduler": "0.24.0-canary-efb381bbf-20230505",
+        "stacktrace-parser": "^0.1.10",
+        "whatwg-fetch": "^3.0.0",
+        "ws": "^6.2.2",
+        "yargs": "^17.6.2"
+      },
+      "bin": {
+        "react-native": "cli.js"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@types/react": "^18.2.6",
+        "react": "18.2.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@metamask/sdk/node_modules/react-native-webview": {
+      "version": "11.26.1",
+      "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.26.1.tgz",
+      "integrity": "sha512-hC7BkxOpf+z0UKhxFSFTPAM4shQzYmZHoELa6/8a/MspcjEP7ukYKpuSUTLDywQditT8yI9idfcKvfZDKQExGw==",
+      "dependencies": {
+        "escape-string-regexp": "2.0.0",
+        "invariant": "2.2.4"
+      },
+      "peerDependencies": {
+        "react": "*",
+        "react-native": "*"
+      }
+    },
+    "node_modules/@metamask/sdk/node_modules/react-native/node_modules/@react-native/virtualized-lists": {
+      "version": "0.74.85",
+      "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.74.85.tgz",
+      "integrity": "sha512-jx2Zw0qlZteoQ+0KxRc7s4drsljLBEP534FaNZ950e9+CN9nVkLsV6rigcTjDR8wjKMSBWhKf0C0C3egYz7Ehg==",
+      "peer": true,
+      "dependencies": {
+        "invariant": "^2.2.4",
+        "nullthrows": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@types/react": "^18.2.6",
+        "react": "*",
+        "react-native": "*"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@metamask/sdk/node_modules/regenerator-runtime": {
+      "version": "0.13.11",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+      "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+      "peer": true
+    },
+    "node_modules/@metamask/sdk/node_modules/scheduler": {
+      "version": "0.24.0-canary-efb381bbf-20230505",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz",
+      "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==",
+      "peer": true,
+      "dependencies": {
+        "loose-envify": "^1.1.0"
+      }
+    },
+    "node_modules/@metamask/sdk/node_modules/uuid": {
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+      "license": "MIT",
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
+    "node_modules/@metamask/sdk/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==",
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/@metamask/sdk/node_modules/ws": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
+      "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
+      "peer": true,
+      "dependencies": {
+        "async-limiter": "~1.0.0"
+      }
+    },
+    "node_modules/@metamask/sdk/node_modules/y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@metamask/sdk/node_modules/yargs": {
+      "version": "17.7.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+      "peer": true,
+      "dependencies": {
+        "cliui": "^8.0.1",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.3",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^21.1.1"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@metamask/sdk/node_modules/yargs-parser": {
+      "version": "21.1.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+      "peer": true,
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@metamask/superstruct": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@metamask/superstruct/-/superstruct-3.1.0.tgz",
+      "integrity": "sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA==",
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@metamask/utils": {
+      "version": "8.5.0",
+      "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz",
+      "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==",
+      "dependencies": {
+        "@ethereumjs/tx": "^4.2.0",
+        "@metamask/superstruct": "^3.0.0",
+        "@noble/hashes": "^1.3.1",
+        "@scure/base": "^1.1.3",
+        "@types/debug": "^4.1.7",
+        "debug": "^4.3.4",
+        "pony-cause": "^2.1.10",
+        "semver": "^7.5.4",
+        "uuid": "^9.0.1"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/@motionone/animation": {
+      "version": "10.18.0",
+      "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz",
+      "integrity": "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==",
+      "dependencies": {
+        "@motionone/easing": "^10.18.0",
+        "@motionone/types": "^10.17.1",
+        "@motionone/utils": "^10.18.0",
+        "tslib": "^2.3.1"
+      }
+    },
+    "node_modules/@motionone/dom": {
+      "version": "10.18.0",
+      "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.18.0.tgz",
+      "integrity": "sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==",
+      "dependencies": {
+        "@motionone/animation": "^10.18.0",
+        "@motionone/generators": "^10.18.0",
+        "@motionone/types": "^10.17.1",
+        "@motionone/utils": "^10.18.0",
+        "hey-listen": "^1.0.8",
+        "tslib": "^2.3.1"
+      }
+    },
+    "node_modules/@motionone/easing": {
+      "version": "10.18.0",
+      "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz",
+      "integrity": "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==",
+      "dependencies": {
+        "@motionone/utils": "^10.18.0",
+        "tslib": "^2.3.1"
+      }
+    },
+    "node_modules/@motionone/generators": {
+      "version": "10.18.0",
+      "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz",
+      "integrity": "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==",
+      "dependencies": {
+        "@motionone/types": "^10.17.1",
+        "@motionone/utils": "^10.18.0",
+        "tslib": "^2.3.1"
+      }
+    },
+    "node_modules/@motionone/svelte": {
+      "version": "10.16.4",
+      "resolved": "https://registry.npmjs.org/@motionone/svelte/-/svelte-10.16.4.tgz",
+      "integrity": "sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==",
+      "dependencies": {
+        "@motionone/dom": "^10.16.4",
+        "tslib": "^2.3.1"
+      }
+    },
+    "node_modules/@motionone/types": {
+      "version": "10.17.1",
+      "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz",
+      "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A=="
+    },
+    "node_modules/@motionone/utils": {
+      "version": "10.18.0",
+      "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz",
+      "integrity": "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==",
+      "dependencies": {
+        "@motionone/types": "^10.17.1",
+        "hey-listen": "^1.0.8",
+        "tslib": "^2.3.1"
+      }
+    },
+    "node_modules/@motionone/vue": {
+      "version": "10.16.4",
+      "resolved": "https://registry.npmjs.org/@motionone/vue/-/vue-10.16.4.tgz",
+      "integrity": "sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==",
+      "deprecated": "Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion",
+      "dependencies": {
+        "@motionone/dom": "^10.16.4",
+        "tslib": "^2.3.1"
+      }
+    },
+    "node_modules/@next/env": {
+      "version": "14.2.4",
+      "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.4.tgz",
+      "integrity": "sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg=="
+    },
+    "node_modules/@next/eslint-plugin-next": {
+      "version": "14.2.4",
+      "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.4.tgz",
+      "integrity": "sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "glob": "10.3.10"
+      }
+    },
+    "node_modules/@next/eslint-plugin-next/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,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/@next/eslint-plugin-next/node_modules/glob": {
+      "version": "10.3.10",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+      "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^2.3.5",
+        "minimatch": "^9.0.1",
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+        "path-scurry": "^1.10.1"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@next/eslint-plugin-next/node_modules/jackspeak": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+      "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
+    "node_modules/@next/eslint-plugin-next/node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@next/swc-darwin-arm64": {
+      "version": "14.2.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz",
+      "integrity": "sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-darwin-x64": {
+      "version": "14.2.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz",
+      "integrity": "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm64-gnu": {
+      "version": "14.2.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz",
+      "integrity": "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm64-musl": {
+      "version": "14.2.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz",
+      "integrity": "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-x64-gnu": {
+      "version": "14.2.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz",
+      "integrity": "sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-x64-musl": {
+      "version": "14.2.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz",
+      "integrity": "sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-arm64-msvc": {
+      "version": "14.2.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz",
+      "integrity": "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-ia32-msvc": {
+      "version": "14.2.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz",
+      "integrity": "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-x64-msvc": {
+      "version": "14.2.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz",
+      "integrity": "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@noble/curves": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
+      "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
+      "dependencies": {
+        "@noble/hashes": "1.3.2"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/@noble/hashes": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz",
+      "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==",
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@parcel/watcher": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz",
+      "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==",
+      "dependencies": {
+        "detect-libc": "^1.0.3",
+        "is-glob": "^4.0.3",
+        "micromatch": "^4.0.5",
+        "node-addon-api": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      },
+      "optionalDependencies": {
+        "@parcel/watcher-android-arm64": "2.4.1",
+        "@parcel/watcher-darwin-arm64": "2.4.1",
+        "@parcel/watcher-darwin-x64": "2.4.1",
+        "@parcel/watcher-freebsd-x64": "2.4.1",
+        "@parcel/watcher-linux-arm-glibc": "2.4.1",
+        "@parcel/watcher-linux-arm64-glibc": "2.4.1",
+        "@parcel/watcher-linux-arm64-musl": "2.4.1",
+        "@parcel/watcher-linux-x64-glibc": "2.4.1",
+        "@parcel/watcher-linux-x64-musl": "2.4.1",
+        "@parcel/watcher-win32-arm64": "2.4.1",
+        "@parcel/watcher-win32-ia32": "2.4.1",
+        "@parcel/watcher-win32-x64": "2.4.1"
+      }
+    },
+    "node_modules/@parcel/watcher-android-arm64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz",
+      "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-darwin-arm64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz",
+      "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-darwin-x64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz",
+      "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-freebsd-x64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz",
+      "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm-glibc": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz",
+      "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm64-glibc": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz",
+      "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm64-musl": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz",
+      "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-x64-glibc": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz",
+      "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-x64-musl": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz",
+      "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-wasm": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.4.1.tgz",
+      "integrity": "sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==",
+      "bundleDependencies": [
+        "napi-wasm"
+      ],
+      "dependencies": {
+        "is-glob": "^4.0.3",
+        "micromatch": "^4.0.5",
+        "napi-wasm": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-wasm/node_modules/napi-wasm": {
+      "version": "1.1.0",
+      "inBundle": true,
+      "license": "MIT"
+    },
+    "node_modules/@parcel/watcher-win32-arm64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz",
+      "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-ia32": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz",
+      "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-x64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz",
+      "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher/node_modules/node-addon-api": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz",
+      "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==",
+      "engines": {
+        "node": "^16 || ^18 || >= 20"
+      }
+    },
+    "node_modules/@pkgjs/parseargs": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@pushprotocol/dnode": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/@pushprotocol/dnode/-/dnode-0.0.6.tgz",
+      "integrity": "sha512-7jPWkO6Es2TkLA3zKhODvusqtoWSwV8215jkXVf5h2FoMxkjXh66rUOMEAgXYL+x67jYAJvILI65xI+YS8OBIA==",
+      "dependencies": {
+        "@metamask/eth-sig-util": "^5.0.2",
+        "buffer": "^6.0.3",
+        "crypto-js": "^4.1.1",
+        "immer": "^10.0.2",
+        "joi": "^17.9.2",
+        "lru-cache": "^10.1.0",
+        "openpgp": "^5.5.0",
+        "socket.io-client": "^4.7.2",
+        "viem": "^2.13.1"
+      },
+      "peerDependencies": {
+        "axios": "^0.27.2",
+        "ethers": "^5.0.0 || ^6.0.0",
+        "tslib": "^2.3.0",
+        "uuid": "^9.0.0"
+      },
+      "peerDependenciesMeta": {
+        "ethers": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@pushprotocol/dnode/node_modules/@noble/curves": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz",
+      "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==",
+      "license": "MIT",
+      "dependencies": {
+        "@noble/hashes": "1.4.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/@pushprotocol/dnode/node_modules/@noble/hashes": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
+      "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/@pushprotocol/dnode/node_modules/@scure/bip32": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz",
+      "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==",
+      "license": "MIT",
+      "dependencies": {
+        "@noble/curves": "~1.4.0",
+        "@noble/hashes": "~1.4.0",
+        "@scure/base": "~1.1.6"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/@pushprotocol/dnode/node_modules/@scure/bip39": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz",
+      "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@noble/hashes": "~1.4.0",
+        "@scure/base": "~1.1.6"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/@pushprotocol/dnode/node_modules/abitype": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.5.tgz",
+      "integrity": "sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/wevm"
+      },
+      "peerDependencies": {
+        "typescript": ">=5.0.4",
+        "zod": "^3 >=3.22.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        },
+        "zod": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@pushprotocol/dnode/node_modules/isows": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.4.tgz",
+      "integrity": "sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/wagmi-dev"
+        }
+      ],
+      "license": "MIT",
+      "peerDependencies": {
+        "ws": "*"
+      }
+    },
+    "node_modules/@pushprotocol/dnode/node_modules/lru-cache": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz",
+      "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==",
+      "license": "ISC",
+      "engines": {
+        "node": "14 || >=16.14"
+      }
+    },
+    "node_modules/@pushprotocol/dnode/node_modules/viem": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/viem/-/viem-2.17.0.tgz",
+      "integrity": "sha512-+gaVlsfDsHL1oYdjpatdRxW1WK/slLYVvpOws3fEdLfQFUToezKI6YLC9l1g2uKm4Hg3OdGX1KQy/G7/58tTKQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/wevm"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "@adraffy/ens-normalize": "1.10.0",
+        "@noble/curves": "1.4.0",
+        "@noble/hashes": "1.4.0",
+        "@scure/bip32": "1.4.0",
+        "@scure/bip39": "1.3.0",
+        "abitype": "1.0.5",
+        "isows": "1.0.4",
+        "ws": "8.17.1"
+      },
+      "peerDependencies": {
+        "typescript": ">=5.0.4"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@pushprotocol/dnode/node_modules/ws": {
+      "version": "8.17.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+      "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rainbow-me/rainbowkit": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/@rainbow-me/rainbowkit/-/rainbowkit-2.1.3.tgz",
+      "integrity": "sha512-teeB0HVQR75xSOUqMWCI0m6JJ/TvYXmbDSMr252/oElkV2UF0m/FFKGW04MBtQOg6wo9WK3nD5HVNEola4p7yA==",
+      "dependencies": {
+        "@vanilla-extract/css": "1.14.0",
+        "@vanilla-extract/dynamic": "2.1.0",
+        "@vanilla-extract/sprinkles": "1.6.1",
+        "clsx": "2.1.0",
+        "qrcode": "1.5.3",
+        "react-remove-scroll": "2.5.7",
+        "ua-parser-js": "^1.0.37"
+      },
+      "engines": {
+        "node": ">=12.4"
+      },
+      "peerDependencies": {
+        "@tanstack/react-query": ">=5.0.0",
+        "react": ">=18",
+        "react-dom": ">=18",
+        "viem": "2.x",
+        "wagmi": "^2.9.0"
+      }
+    },
+    "node_modules/@rainbow-me/rainbowkit/node_modules/clsx": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz",
+      "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@react-aria/focus": {
+      "version": "3.17.1",
+      "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.17.1.tgz",
+      "integrity": "sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@react-aria/interactions": "^3.21.3",
+        "@react-aria/utils": "^3.24.1",
+        "@react-types/shared": "^3.23.1",
+        "@swc/helpers": "^0.5.0",
+        "clsx": "^2.0.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+      }
+    },
+    "node_modules/@react-aria/focus/node_modules/clsx": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+      "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@react-aria/interactions": {
+      "version": "3.21.3",
+      "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.21.3.tgz",
+      "integrity": "sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@react-aria/ssr": "^3.9.4",
+        "@react-aria/utils": "^3.24.1",
+        "@react-types/shared": "^3.23.1",
+        "@swc/helpers": "^0.5.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+      }
+    },
+    "node_modules/@react-aria/ssr": {
+      "version": "3.9.4",
+      "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.4.tgz",
+      "integrity": "sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@swc/helpers": "^0.5.0"
+      },
+      "engines": {
+        "node": ">= 12"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+      }
+    },
+    "node_modules/@react-aria/utils": {
+      "version": "3.24.1",
+      "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.24.1.tgz",
+      "integrity": "sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@react-aria/ssr": "^3.9.4",
+        "@react-stately/utils": "^3.10.1",
+        "@react-types/shared": "^3.23.1",
+        "@swc/helpers": "^0.5.0",
+        "clsx": "^2.0.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+      }
+    },
+    "node_modules/@react-aria/utils/node_modules/clsx": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+      "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@react-native-community/cli": {
+      "version": "13.6.9",
+      "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-13.6.9.tgz",
+      "integrity": "sha512-hFJL4cgLPxncJJd/epQ4dHnMg5Jy/7Q56jFvA3MHViuKpzzfTCJCB+pGY54maZbtym53UJON9WTGpM3S81UfjQ==",
+      "peer": true,
+      "dependencies": {
+        "@react-native-community/cli-clean": "13.6.9",
+        "@react-native-community/cli-config": "13.6.9",
+        "@react-native-community/cli-debugger-ui": "13.6.9",
+        "@react-native-community/cli-doctor": "13.6.9",
+        "@react-native-community/cli-hermes": "13.6.9",
+        "@react-native-community/cli-server-api": "13.6.9",
+        "@react-native-community/cli-tools": "13.6.9",
+        "@react-native-community/cli-types": "13.6.9",
+        "chalk": "^4.1.2",
+        "commander": "^9.4.1",
+        "deepmerge": "^4.3.0",
+        "execa": "^5.0.0",
+        "find-up": "^4.1.0",
+        "fs-extra": "^8.1.0",
+        "graceful-fs": "^4.1.3",
+        "prompts": "^2.4.2",
+        "semver": "^7.5.2"
+      },
+      "bin": {
+        "rnc-cli": "build/bin.js"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@react-native-community/cli-clean": {
+      "version": "13.6.9",
+      "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-13.6.9.tgz",
+      "integrity": "sha512-7Dj5+4p9JggxuVNOjPbduZBAP1SUgNhLKVw5noBUzT/3ZpUZkDM+RCSwyoyg8xKWoE4OrdUAXwAFlMcFDPKykA==",
+      "peer": true,
+      "dependencies": {
+        "@react-native-community/cli-tools": "13.6.9",
+        "chalk": "^4.1.2",
+        "execa": "^5.0.0",
+        "fast-glob": "^3.3.2"
+      }
+    },
+    "node_modules/@react-native-community/cli-config": {
+      "version": "13.6.9",
+      "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-13.6.9.tgz",
+      "integrity": "sha512-rFfVBcNojcMm+KKHE/xqpqXg8HoKl4EC7bFHUrahMJ+y/tZll55+oX/PGG37rzB8QzP2UbMQ19DYQKC1G7kXeg==",
+      "peer": true,
+      "dependencies": {
+        "@react-native-community/cli-tools": "13.6.9",
+        "chalk": "^4.1.2",
+        "cosmiconfig": "^5.1.0",
+        "deepmerge": "^4.3.0",
+        "fast-glob": "^3.3.2",
+        "joi": "^17.2.1"
+      }
+    },
+    "node_modules/@react-native-community/cli-debugger-ui": {
+      "version": "13.6.9",
+      "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.9.tgz",
+      "integrity": "sha512-TkN7IdFmGPPvTpAo3nCAH9uwGCPxWBEAwpqEZDrq0NWllI7Tdie8vDpGdrcuCcKalmhq6OYnkXzeBah7O1Ztpw==",
+      "peer": true,
+      "dependencies": {
+        "serve-static": "^1.13.1"
+      }
+    },
+    "node_modules/@react-native-community/cli-doctor": {
+      "version": "13.6.9",
+      "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-13.6.9.tgz",
+      "integrity": "sha512-5quFaLdWFQB+677GXh5dGU9I5eg2z6Vg4jOX9vKnc9IffwyIFAyJfCZHrxLSRPDGNXD7biDQUdoezXYGwb6P/A==",
+      "peer": true,
+      "dependencies": {
+        "@react-native-community/cli-config": "13.6.9",
+        "@react-native-community/cli-platform-android": "13.6.9",
+        "@react-native-community/cli-platform-apple": "13.6.9",
+        "@react-native-community/cli-platform-ios": "13.6.9",
+        "@react-native-community/cli-tools": "13.6.9",
+        "chalk": "^4.1.2",
+        "command-exists": "^1.2.8",
+        "deepmerge": "^4.3.0",
+        "envinfo": "^7.10.0",
+        "execa": "^5.0.0",
+        "hermes-profile-transformer": "^0.0.6",
+        "node-stream-zip": "^1.9.1",
+        "ora": "^5.4.1",
+        "semver": "^7.5.2",
+        "strip-ansi": "^5.2.0",
+        "wcwidth": "^1.0.1",
+        "yaml": "^2.2.1"
+      }
+    },
+    "node_modules/@react-native-community/cli-doctor/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==",
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@react-native-community/cli-doctor/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==",
+      "peer": true,
+      "dependencies": {
+        "ansi-regex": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@react-native-community/cli-hermes": {
+      "version": "13.6.9",
+      "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-13.6.9.tgz",
+      "integrity": "sha512-GvwiwgvFw4Ws+krg2+gYj8sR3g05evmNjAHkKIKMkDTJjZ8EdyxbkifRUs1ZCq3TMZy2oeblZBXCJVOH4W7ZbA==",
+      "peer": true,
+      "dependencies": {
+        "@react-native-community/cli-platform-android": "13.6.9",
+        "@react-native-community/cli-tools": "13.6.9",
+        "chalk": "^4.1.2",
+        "hermes-profile-transformer": "^0.0.6"
+      }
+    },
+    "node_modules/@react-native-community/cli-platform-android": {
+      "version": "13.6.9",
+      "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.9.tgz",
+      "integrity": "sha512-9KsYGdr08QhdvT3Ht7e8phQB3gDX9Fs427NJe0xnoBh+PDPTI2BD5ks5ttsH8CzEw8/P6H8tJCHq6hf2nxd9cw==",
+      "peer": true,
+      "dependencies": {
+        "@react-native-community/cli-tools": "13.6.9",
+        "chalk": "^4.1.2",
+        "execa": "^5.0.0",
+        "fast-glob": "^3.3.2",
+        "fast-xml-parser": "^4.2.4",
+        "logkitty": "^0.7.1"
+      }
+    },
+    "node_modules/@react-native-community/cli-platform-apple": {
+      "version": "13.6.9",
+      "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.9.tgz",
+      "integrity": "sha512-KoeIHfhxMhKXZPXmhQdl6EE+jGKWwoO9jUVWgBvibpVmsNjo7woaG/tfJMEWfWF3najX1EkQAoJWpCDBMYWtlA==",
+      "peer": true,
+      "dependencies": {
+        "@react-native-community/cli-tools": "13.6.9",
+        "chalk": "^4.1.2",
+        "execa": "^5.0.0",
+        "fast-glob": "^3.3.2",
+        "fast-xml-parser": "^4.0.12",
+        "ora": "^5.4.1"
+      }
+    },
+    "node_modules/@react-native-community/cli-platform-ios": {
+      "version": "13.6.9",
+      "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.9.tgz",
+      "integrity": "sha512-CiUcHlGs8vE0CAB4oi1f+dzniqfGuhWPNrDvae2nm8dewlahTBwIcK5CawyGezjcJoeQhjBflh9vloska+nlnw==",
+      "peer": true,
+      "dependencies": {
+        "@react-native-community/cli-platform-apple": "13.6.9"
+      }
+    },
+    "node_modules/@react-native-community/cli-server-api": {
+      "version": "13.6.9",
+      "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-13.6.9.tgz",
+      "integrity": "sha512-W8FSlCPWymO+tlQfM3E0JmM8Oei5HZsIk5S0COOl0MRi8h0NmHI4WSTF2GCfbFZkcr2VI/fRsocoN8Au4EZAug==",
+      "peer": true,
+      "dependencies": {
+        "@react-native-community/cli-debugger-ui": "13.6.9",
+        "@react-native-community/cli-tools": "13.6.9",
+        "compression": "^1.7.1",
+        "connect": "^3.6.5",
+        "errorhandler": "^1.5.1",
+        "nocache": "^3.0.1",
+        "pretty-format": "^26.6.2",
+        "serve-static": "^1.13.1",
+        "ws": "^6.2.2"
+      }
+    },
+    "node_modules/@react-native-community/cli-server-api/node_modules/ws": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
+      "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
+      "peer": true,
+      "dependencies": {
+        "async-limiter": "~1.0.0"
+      }
+    },
+    "node_modules/@react-native-community/cli-tools": {
+      "version": "13.6.9",
+      "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-13.6.9.tgz",
+      "integrity": "sha512-OXaSjoN0mZVw3nrAwcY1PC0uMfyTd9fz7Cy06dh+EJc+h0wikABsVRzV8cIOPrVV+PPEEXE0DBrH20T2puZzgQ==",
+      "peer": true,
+      "dependencies": {
+        "appdirsjs": "^1.2.4",
+        "chalk": "^4.1.2",
+        "execa": "^5.0.0",
+        "find-up": "^5.0.0",
+        "mime": "^2.4.1",
+        "node-fetch": "^2.6.0",
+        "open": "^6.2.0",
+        "ora": "^5.4.1",
+        "semver": "^7.5.2",
+        "shell-quote": "^1.7.3",
+        "sudo-prompt": "^9.0.0"
+      }
+    },
+    "node_modules/@react-native-community/cli-tools/node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "peer": true,
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@react-native-community/cli-tools/node_modules/is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@react-native-community/cli-tools/node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "peer": true,
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@react-native-community/cli-tools/node_modules/open": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz",
+      "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
+      "peer": true,
+      "dependencies": {
+        "is-wsl": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@react-native-community/cli-tools/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==",
+      "peer": true,
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@react-native-community/cli-tools/node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "peer": true,
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@react-native-community/cli-types": {
+      "version": "13.6.9",
+      "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-13.6.9.tgz",
+      "integrity": "sha512-RLxDppvRxXfs3hxceW/mShi+6o5yS+kFPnPqZTaMKKR5aSg7LwDpLQW4K2D22irEG8e6RKDkZUeH9aL3vO2O0w==",
+      "peer": true,
+      "dependencies": {
+        "joi": "^17.2.1"
+      }
+    },
+    "node_modules/@react-native/assets-registry": {
+      "version": "0.74.85",
+      "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.74.85.tgz",
+      "integrity": "sha512-59YmIQxfGDw4aP9S/nAM+sjSFdW8fUP6fsqczCcXgL2YVEjyER9XCaUT0J1K+PdHep8pi05KUgIKUds8P3jbmA==",
+      "peer": true,
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@react-native/babel-plugin-codegen": {
+      "version": "0.74.85",
+      "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.85.tgz",
+      "integrity": "sha512-48TSDclRB5OMXiImiJkLxyCfRyLsqkCgI8buugCZzvXcYslfV7gCvcyFyQldtcOmerV+CK4RAj7QS4hmB5Mr8Q==",
+      "peer": true,
+      "dependencies": {
+        "@react-native/codegen": "0.74.85"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@react-native/babel-preset": {
+      "version": "0.74.85",
+      "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.74.85.tgz",
+      "integrity": "sha512-yMHUlN8INbK5BBwiBuQMftdWkpm1IgCsoJTKcGD2OpSgZhwwm8RUSvGhdRMzB2w7bsqqBmaEMleGtW6aCR7B9w==",
+      "peer": true,
+      "dependencies": {
+        "@babel/core": "^7.20.0",
+        "@babel/plugin-proposal-async-generator-functions": "^7.0.0",
+        "@babel/plugin-proposal-class-properties": "^7.18.0",
+        "@babel/plugin-proposal-export-default-from": "^7.0.0",
+        "@babel/plugin-proposal-logical-assignment-operators": "^7.18.0",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0",
+        "@babel/plugin-proposal-numeric-separator": "^7.0.0",
+        "@babel/plugin-proposal-object-rest-spread": "^7.20.0",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.0.0",
+        "@babel/plugin-proposal-optional-chaining": "^7.20.0",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.0",
+        "@babel/plugin-syntax-export-default-from": "^7.0.0",
+        "@babel/plugin-syntax-flow": "^7.18.0",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0",
+        "@babel/plugin-syntax-optional-chaining": "^7.0.0",
+        "@babel/plugin-transform-arrow-functions": "^7.0.0",
+        "@babel/plugin-transform-async-to-generator": "^7.20.0",
+        "@babel/plugin-transform-block-scoping": "^7.0.0",
+        "@babel/plugin-transform-classes": "^7.0.0",
+        "@babel/plugin-transform-computed-properties": "^7.0.0",
+        "@babel/plugin-transform-destructuring": "^7.20.0",
+        "@babel/plugin-transform-flow-strip-types": "^7.20.0",
+        "@babel/plugin-transform-function-name": "^7.0.0",
+        "@babel/plugin-transform-literals": "^7.0.0",
+        "@babel/plugin-transform-modules-commonjs": "^7.0.0",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0",
+        "@babel/plugin-transform-parameters": "^7.0.0",
+        "@babel/plugin-transform-private-methods": "^7.22.5",
+        "@babel/plugin-transform-private-property-in-object": "^7.22.11",
+        "@babel/plugin-transform-react-display-name": "^7.0.0",
+        "@babel/plugin-transform-react-jsx": "^7.0.0",
+        "@babel/plugin-transform-react-jsx-self": "^7.0.0",
+        "@babel/plugin-transform-react-jsx-source": "^7.0.0",
+        "@babel/plugin-transform-runtime": "^7.0.0",
+        "@babel/plugin-transform-shorthand-properties": "^7.0.0",
+        "@babel/plugin-transform-spread": "^7.0.0",
+        "@babel/plugin-transform-sticky-regex": "^7.0.0",
+        "@babel/plugin-transform-typescript": "^7.5.0",
+        "@babel/plugin-transform-unicode-regex": "^7.0.0",
+        "@babel/template": "^7.0.0",
+        "@react-native/babel-plugin-codegen": "0.74.85",
+        "babel-plugin-transform-flow-enums": "^0.0.2",
+        "react-refresh": "^0.14.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@babel/core": "*"
+      }
+    },
+    "node_modules/@react-native/codegen": {
+      "version": "0.74.85",
+      "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.74.85.tgz",
+      "integrity": "sha512-N7QwoS4Hq/uQmoH83Ewedy6D0M7xbQsOU3OMcQf0eY3ltQ7S2hd9/R4UTalQWRn1OUJfXR6OG12QJ4FStKgV6Q==",
+      "peer": true,
+      "dependencies": {
+        "@babel/parser": "^7.20.0",
+        "glob": "^7.1.1",
+        "hermes-parser": "0.19.1",
+        "invariant": "^2.2.4",
+        "jscodeshift": "^0.14.0",
+        "mkdirp": "^0.5.1",
+        "nullthrows": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@babel/preset-env": "^7.1.6"
+      }
+    },
+    "node_modules/@react-native/community-cli-plugin": {
+      "version": "0.74.85",
+      "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.85.tgz",
+      "integrity": "sha512-ODzND33eA2owAY3g9jgCdqB+BjAh8qJ7dvmSotXgrgDYr3MJMpd8gvHTIPe2fg4Kab+wk8uipRhrE0i0RYMwtQ==",
+      "peer": true,
+      "dependencies": {
+        "@react-native-community/cli-server-api": "13.6.9",
+        "@react-native-community/cli-tools": "13.6.9",
+        "@react-native/dev-middleware": "0.74.85",
+        "@react-native/metro-babel-transformer": "0.74.85",
+        "chalk": "^4.0.0",
+        "execa": "^5.1.1",
+        "metro": "^0.80.3",
+        "metro-config": "^0.80.3",
+        "metro-core": "^0.80.3",
+        "node-fetch": "^2.2.0",
+        "querystring": "^0.2.1",
+        "readline": "^1.3.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@react-native/debugger-frontend": {
+      "version": "0.74.85",
+      "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.85.tgz",
+      "integrity": "sha512-gUIhhpsYLUTYWlWw4vGztyHaX/kNlgVspSvKe2XaPA7o3jYKUoNLc3Ov7u70u/MBWfKdcEffWq44eSe3j3s5JQ==",
+      "peer": true,
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@react-native/dev-middleware": {
+      "version": "0.74.85",
+      "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.85.tgz",
+      "integrity": "sha512-BRmgCK5vnMmHaKRO+h8PKJmHHH3E6JFuerrcfE3wG2eZ1bcSr+QTu8DAlpxsDWvJvHpCi8tRJGauxd+Ssj/c7w==",
+      "peer": true,
+      "dependencies": {
+        "@isaacs/ttlcache": "^1.4.1",
+        "@react-native/debugger-frontend": "0.74.85",
+        "@rnx-kit/chromium-edge-launcher": "^1.0.0",
+        "chrome-launcher": "^0.15.2",
+        "connect": "^3.6.5",
+        "debug": "^2.2.0",
+        "node-fetch": "^2.2.0",
+        "nullthrows": "^1.1.1",
+        "open": "^7.0.3",
+        "selfsigned": "^2.4.1",
+        "serve-static": "^1.13.1",
+        "temp-dir": "^2.0.0",
+        "ws": "^6.2.2"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@react-native/dev-middleware/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "peer": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/@react-native/dev-middleware/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "peer": true
+    },
+    "node_modules/@react-native/dev-middleware/node_modules/open": {
+      "version": "7.4.2",
+      "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
+      "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+      "peer": true,
+      "dependencies": {
+        "is-docker": "^2.0.0",
+        "is-wsl": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@react-native/dev-middleware/node_modules/ws": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
+      "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
+      "peer": true,
+      "dependencies": {
+        "async-limiter": "~1.0.0"
+      }
+    },
+    "node_modules/@react-native/gradle-plugin": {
+      "version": "0.74.85",
+      "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.74.85.tgz",
+      "integrity": "sha512-1VQSLukJzaVMn1MYcs8Weo1nUW8xCas2XU1KuoV7OJPk6xPnEBFJmapmEGP5mWeEy7kcTXJmddEgy1wwW0tcig==",
+      "peer": true,
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@react-native/js-polyfills": {
+      "version": "0.74.85",
+      "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.74.85.tgz",
+      "integrity": "sha512-gp4Rg9le3lVZeW7Cie6qLfekvRKZuhJ3LKgi1SFB4N154z1wIclypAJXVXgWBsy8JKJfTwRI+sffC4qZDlvzrg==",
+      "peer": true,
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@react-native/metro-babel-transformer": {
+      "version": "0.74.85",
+      "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.85.tgz",
+      "integrity": "sha512-JIrXqEwhTvWPtGArgMptIPGstMdXQIkwSjKVYt+7VC4a9Pw1GurIWanIJheEW6ZuCVvTc0VZkwglFz9JVjzDjA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/core": "^7.20.0",
+        "@react-native/babel-preset": "0.74.85",
+        "hermes-parser": "0.19.1",
+        "nullthrows": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@babel/core": "*"
+      }
+    },
+    "node_modules/@react-native/normalize-colors": {
+      "version": "0.74.85",
+      "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.85.tgz",
+      "integrity": "sha512-pcE4i0X7y3hsAE0SpIl7t6dUc0B0NZLd1yv7ssm4FrLhWG+CGyIq4eFDXpmPU1XHmL5PPySxTAjEMiwv6tAmOw==",
+      "peer": true
+    },
+    "node_modules/@react-stately/utils": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.1.tgz",
+      "integrity": "sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@swc/helpers": "^0.5.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+      }
+    },
+    "node_modules/@react-types/shared": {
+      "version": "3.23.1",
+      "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.23.1.tgz",
+      "integrity": "sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==",
+      "license": "Apache-2.0",
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+      }
+    },
+    "node_modules/@rnx-kit/chromium-edge-launcher": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@rnx-kit/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz",
+      "integrity": "sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==",
+      "peer": true,
+      "dependencies": {
+        "@types/node": "^18.0.0",
+        "escape-string-regexp": "^4.0.0",
+        "is-wsl": "^2.2.0",
+        "lighthouse-logger": "^1.0.0",
+        "mkdirp": "^1.0.4",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=14.15"
+      }
+    },
+    "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "peer": true,
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@rushstack/eslint-patch": {
+      "version": "1.10.3",
+      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz",
+      "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@safe-global/safe-apps-provider": {
+      "version": "0.18.1",
+      "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.1.tgz",
+      "integrity": "sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg==",
+      "dependencies": {
+        "@safe-global/safe-apps-sdk": "^8.1.0",
+        "events": "^3.3.0"
+      }
+    },
+    "node_modules/@safe-global/safe-apps-sdk": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-sdk/-/safe-apps-sdk-8.1.0.tgz",
+      "integrity": "sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==",
+      "dependencies": {
+        "@safe-global/safe-gateway-typescript-sdk": "^3.5.3",
+        "viem": "^1.0.0"
+      }
+    },
+    "node_modules/@safe-global/safe-apps-sdk/node_modules/abitype": {
+      "version": "0.9.8",
+      "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.8.tgz",
+      "integrity": "sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/wagmi-dev"
+        }
+      ],
+      "peerDependencies": {
+        "typescript": ">=5.0.4",
+        "zod": "^3 >=3.19.1"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        },
+        "zod": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@safe-global/safe-apps-sdk/node_modules/viem": {
+      "version": "1.21.4",
+      "resolved": "https://registry.npmjs.org/viem/-/viem-1.21.4.tgz",
+      "integrity": "sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/wevm"
+        }
+      ],
+      "dependencies": {
+        "@adraffy/ens-normalize": "1.10.0",
+        "@noble/curves": "1.2.0",
+        "@noble/hashes": "1.3.2",
+        "@scure/bip32": "1.3.2",
+        "@scure/bip39": "1.2.1",
+        "abitype": "0.9.8",
+        "isows": "1.0.3",
+        "ws": "8.13.0"
+      },
+      "peerDependencies": {
+        "typescript": ">=5.0.4"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@safe-global/safe-gateway-typescript-sdk": {
+      "version": "3.21.8",
+      "resolved": "https://registry.npmjs.org/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.21.8.tgz",
+      "integrity": "sha512-n/fYgiqbuzAQuK0bgny6GBYvb585ETxKURa5Kb9hBV3fa47SvJo/dpGq275fJUn0e3Hh1YqETiLGj4HVJjHiTA==",
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/@scure/base": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.7.tgz",
+      "integrity": "sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==",
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/@scure/bip32": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz",
+      "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==",
+      "dependencies": {
+        "@noble/curves": "~1.2.0",
+        "@noble/hashes": "~1.3.2",
+        "@scure/base": "~1.1.2"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/@scure/bip39": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
+      "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==",
+      "dependencies": {
+        "@noble/hashes": "~1.3.0",
+        "@scure/base": "~1.1.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/@sideway/address": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
+      "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
+      "dependencies": {
+        "@hapi/hoek": "^9.0.0"
+      }
+    },
+    "node_modules/@sideway/formula": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
+      "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg=="
+    },
+    "node_modules/@sideway/pinpoint": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+      "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="
+    },
+    "node_modules/@sinclair/typebox": {
+      "version": "0.27.8",
+      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+      "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+      "peer": true
+    },
+    "node_modules/@sinonjs/commons": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+      "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+      "peer": true,
+      "dependencies": {
+        "type-detect": "4.0.8"
+      }
+    },
+    "node_modules/@sinonjs/fake-timers": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+      "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+      "peer": true,
+      "dependencies": {
+        "@sinonjs/commons": "^3.0.0"
+      }
+    },
+    "node_modules/@socket.io/component-emitter": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+      "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="
+    },
+    "node_modules/@stablelib/aead": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/aead/-/aead-1.0.1.tgz",
+      "integrity": "sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg=="
+    },
+    "node_modules/@stablelib/binary": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz",
+      "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==",
+      "dependencies": {
+        "@stablelib/int": "^1.0.1"
+      }
+    },
+    "node_modules/@stablelib/bytes": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/bytes/-/bytes-1.0.1.tgz",
+      "integrity": "sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ=="
+    },
+    "node_modules/@stablelib/chacha": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/chacha/-/chacha-1.0.1.tgz",
+      "integrity": "sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==",
+      "dependencies": {
+        "@stablelib/binary": "^1.0.1",
+        "@stablelib/wipe": "^1.0.1"
+      }
+    },
+    "node_modules/@stablelib/chacha20poly1305": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz",
+      "integrity": "sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==",
+      "dependencies": {
+        "@stablelib/aead": "^1.0.1",
+        "@stablelib/binary": "^1.0.1",
+        "@stablelib/chacha": "^1.0.1",
+        "@stablelib/constant-time": "^1.0.1",
+        "@stablelib/poly1305": "^1.0.1",
+        "@stablelib/wipe": "^1.0.1"
+      }
+    },
+    "node_modules/@stablelib/constant-time": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/constant-time/-/constant-time-1.0.1.tgz",
+      "integrity": "sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg=="
+    },
+    "node_modules/@stablelib/ed25519": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@stablelib/ed25519/-/ed25519-1.0.3.tgz",
+      "integrity": "sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==",
+      "dependencies": {
+        "@stablelib/random": "^1.0.2",
+        "@stablelib/sha512": "^1.0.1",
+        "@stablelib/wipe": "^1.0.1"
+      }
+    },
+    "node_modules/@stablelib/hash": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz",
+      "integrity": "sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg=="
+    },
+    "node_modules/@stablelib/hkdf": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/hkdf/-/hkdf-1.0.1.tgz",
+      "integrity": "sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==",
+      "dependencies": {
+        "@stablelib/hash": "^1.0.1",
+        "@stablelib/hmac": "^1.0.1",
+        "@stablelib/wipe": "^1.0.1"
+      }
+    },
+    "node_modules/@stablelib/hmac": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/hmac/-/hmac-1.0.1.tgz",
+      "integrity": "sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==",
+      "dependencies": {
+        "@stablelib/constant-time": "^1.0.1",
+        "@stablelib/hash": "^1.0.1",
+        "@stablelib/wipe": "^1.0.1"
+      }
+    },
+    "node_modules/@stablelib/int": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz",
+      "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w=="
+    },
+    "node_modules/@stablelib/keyagreement": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz",
+      "integrity": "sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==",
+      "dependencies": {
+        "@stablelib/bytes": "^1.0.1"
+      }
+    },
+    "node_modules/@stablelib/poly1305": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/poly1305/-/poly1305-1.0.1.tgz",
+      "integrity": "sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==",
+      "dependencies": {
+        "@stablelib/constant-time": "^1.0.1",
+        "@stablelib/wipe": "^1.0.1"
+      }
+    },
+    "node_modules/@stablelib/random": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.2.tgz",
+      "integrity": "sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==",
+      "dependencies": {
+        "@stablelib/binary": "^1.0.1",
+        "@stablelib/wipe": "^1.0.1"
+      }
+    },
+    "node_modules/@stablelib/sha256": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/sha256/-/sha256-1.0.1.tgz",
+      "integrity": "sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==",
+      "dependencies": {
+        "@stablelib/binary": "^1.0.1",
+        "@stablelib/hash": "^1.0.1",
+        "@stablelib/wipe": "^1.0.1"
+      }
+    },
+    "node_modules/@stablelib/sha512": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/sha512/-/sha512-1.0.1.tgz",
+      "integrity": "sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==",
+      "dependencies": {
+        "@stablelib/binary": "^1.0.1",
+        "@stablelib/hash": "^1.0.1",
+        "@stablelib/wipe": "^1.0.1"
+      }
+    },
+    "node_modules/@stablelib/wipe": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz",
+      "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg=="
+    },
+    "node_modules/@stablelib/x25519": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@stablelib/x25519/-/x25519-1.0.3.tgz",
+      "integrity": "sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==",
+      "dependencies": {
+        "@stablelib/keyagreement": "^1.0.1",
+        "@stablelib/random": "^1.0.2",
+        "@stablelib/wipe": "^1.0.1"
+      }
+    },
+    "node_modules/@swc/counter": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+      "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="
+    },
+    "node_modules/@swc/helpers": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz",
+      "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==",
+      "dependencies": {
+        "@swc/counter": "^0.1.3",
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@tailwindcss/forms": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz",
+      "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==",
+      "license": "MIT",
+      "dependencies": {
+        "mini-svg-data-uri": "^1.2.3"
+      },
+      "peerDependencies": {
+        "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1"
+      }
+    },
+    "node_modules/@tanstack/query-core": {
+      "version": "5.49.1",
+      "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.49.1.tgz",
+      "integrity": "sha512-JnC9ndmD1KKS01Rt/ovRUB1tmwO7zkyXAyIxN9mznuJrcNtOrkmOnQqdJF2ib9oHzc2VxHomnEG7xyfo54Npkw==",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/tannerlinsley"
+      }
+    },
+    "node_modules/@tanstack/react-query": {
+      "version": "5.49.2",
+      "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.49.2.tgz",
+      "integrity": "sha512-6rfwXDK9BvmHISbNFuGd+wY3P44lyW7lWiA9vIFGT/T0P9aHD1VkjTvcM4SDAIbAQ9ygEZZoLt7dlU1o3NjMVA==",
+      "dependencies": {
+        "@tanstack/query-core": "5.49.1"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/tannerlinsley"
+      },
+      "peerDependencies": {
+        "react": "^18.0.0"
+      }
+    },
+    "node_modules/@tanstack/react-virtual": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.5.0.tgz",
+      "integrity": "sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==",
+      "license": "MIT",
+      "dependencies": {
+        "@tanstack/virtual-core": "3.5.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/tannerlinsley"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/@tanstack/virtual-core": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.5.0.tgz",
+      "integrity": "sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/tannerlinsley"
+      }
+    },
+    "node_modules/@types/debug": {
+      "version": "4.1.12",
+      "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+      "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+      "dependencies": {
+        "@types/ms": "*"
+      }
+    },
+    "node_modules/@types/dom-screen-wake-lock": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@types/dom-screen-wake-lock/-/dom-screen-wake-lock-1.0.3.tgz",
+      "integrity": "sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw=="
+    },
+    "node_modules/@types/istanbul-lib-coverage": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+      "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+      "peer": true
+    },
+    "node_modules/@types/istanbul-lib-report": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+      "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+      "peer": true,
+      "dependencies": {
+        "@types/istanbul-lib-coverage": "*"
+      }
+    },
+    "node_modules/@types/istanbul-reports": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+      "peer": true,
+      "dependencies": {
+        "@types/istanbul-lib-report": "*"
+      }
+    },
+    "node_modules/@types/json5": {
+      "version": "0.0.29",
+      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/ms": {
+      "version": "0.7.34",
+      "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
+      "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
+    },
+    "node_modules/@types/node": {
+      "version": "18.19.39",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz",
+      "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==",
+      "dependencies": {
+        "undici-types": "~5.26.4"
+      }
+    },
+    "node_modules/@types/node-forge": {
+      "version": "1.3.11",
+      "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
+      "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
+      "peer": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/prop-types": {
+      "version": "15.7.12",
+      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
+      "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==",
+      "devOptional": true
+    },
+    "node_modules/@types/react": {
+      "version": "18.3.3",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz",
+      "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
+      "devOptional": true,
+      "dependencies": {
+        "@types/prop-types": "*",
+        "csstype": "^3.0.2"
+      }
+    },
+    "node_modules/@types/secp256k1": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz",
+      "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/stack-utils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+      "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+      "peer": true
+    },
+    "node_modules/@types/trusted-types": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+      "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="
+    },
+    "node_modules/@types/yargs": {
+      "version": "17.0.32",
+      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
+      "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==",
+      "peer": true,
+      "dependencies": {
+        "@types/yargs-parser": "*"
+      }
+    },
+    "node_modules/@types/yargs-parser": {
+      "version": "21.0.3",
+      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+      "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+      "peer": true
+    },
+    "node_modules/@typescript-eslint/parser": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz",
+      "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "@typescript-eslint/scope-manager": "7.2.0",
+        "@typescript-eslint/types": "7.2.0",
+        "@typescript-eslint/typescript-estree": "7.2.0",
+        "@typescript-eslint/visitor-keys": "7.2.0",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": "^16.0.0 || >=18.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.56.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@typescript-eslint/scope-manager": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz",
+      "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "7.2.0",
+        "@typescript-eslint/visitor-keys": "7.2.0"
+      },
+      "engines": {
+        "node": "^16.0.0 || >=18.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/types": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz",
+      "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^16.0.0 || >=18.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz",
+      "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "@typescript-eslint/types": "7.2.0",
+        "@typescript-eslint/visitor-keys": "7.2.0",
+        "debug": "^4.3.4",
+        "globby": "^11.1.0",
+        "is-glob": "^4.0.3",
+        "minimatch": "9.0.3",
+        "semver": "^7.5.4",
+        "ts-api-utils": "^1.0.1"
+      },
+      "engines": {
+        "node": "^16.0.0 || >=18.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree/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,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+      "version": "9.0.3",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+      "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@typescript-eslint/visitor-keys": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz",
+      "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "7.2.0",
+        "eslint-visitor-keys": "^3.4.1"
+      },
+      "engines": {
+        "node": "^16.0.0 || >=18.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@ungap/structured-clone": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+      "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/@vanilla-extract/css": {
+      "version": "1.14.0",
+      "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.14.0.tgz",
+      "integrity": "sha512-rYfm7JciWZ8PFzBM/HDiE2GLnKI3xJ6/vdmVJ5BSgcCZ5CxRlM9Cjqclni9lGzF3eMOijnUhCd/KV8TOzyzbMA==",
+      "dependencies": {
+        "@emotion/hash": "^0.9.0",
+        "@vanilla-extract/private": "^1.0.3",
+        "chalk": "^4.1.1",
+        "css-what": "^6.1.0",
+        "cssesc": "^3.0.0",
+        "csstype": "^3.0.7",
+        "deep-object-diff": "^1.1.9",
+        "deepmerge": "^4.2.2",
+        "media-query-parser": "^2.0.2",
+        "modern-ahocorasick": "^1.0.0",
+        "outdent": "^0.8.0"
+      }
+    },
+    "node_modules/@vanilla-extract/dynamic": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@vanilla-extract/dynamic/-/dynamic-2.1.0.tgz",
+      "integrity": "sha512-8zl0IgBYRtgD1h+56Zu13wHTiMTJSVEa4F7RWX9vTB/5Xe2KtjoiqApy/szHPVFA56c+ex6A4GpCQjT1bKXbYw==",
+      "dependencies": {
+        "@vanilla-extract/private": "^1.0.3"
+      }
+    },
+    "node_modules/@vanilla-extract/private": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.5.tgz",
+      "integrity": "sha512-6YXeOEKYTA3UV+RC8DeAjFk+/okoNz/h88R+McnzA2zpaVqTR/Ep+vszkWYlGBcMNO7vEkqbq5nT/JMMvhi+tw=="
+    },
+    "node_modules/@vanilla-extract/sprinkles": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/@vanilla-extract/sprinkles/-/sprinkles-1.6.1.tgz",
+      "integrity": "sha512-N/RGKwGAAidBupZ436RpuweRQHEFGU+mvAqBo8PRMAjJEmHoPDttV8RObaMLrJHWLqvX+XUMinHUnD0hFRQISw==",
+      "peerDependencies": {
+        "@vanilla-extract/css": "^1.0.0"
+      }
+    },
+    "node_modules/@wagmi/connectors": {
+      "version": "5.0.21",
+      "resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-5.0.21.tgz",
+      "integrity": "sha512-lbjXEv6HhOa9nXZ5r6NGFJdaadCt2Yj9hSWHjKuiTobrE6dEGQqG16mCQS17yXcvXpI62Q/sW6SL347JrBju/Q==",
+      "dependencies": {
+        "@coinbase/wallet-sdk": "4.0.4",
+        "@metamask/sdk": "0.26.4",
+        "@safe-global/safe-apps-provider": "0.18.1",
+        "@safe-global/safe-apps-sdk": "8.1.0",
+        "@walletconnect/ethereum-provider": "2.13.0",
+        "@walletconnect/modal": "2.6.2",
+        "cbw-sdk": "npm:@coinbase/wallet-sdk@3.9.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/wevm"
+      },
+      "peerDependencies": {
+        "@wagmi/core": "2.11.6",
+        "typescript": ">=5.0.4",
+        "viem": "2.x"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@wagmi/core": {
+      "version": "2.11.6",
+      "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.11.6.tgz",
+      "integrity": "sha512-Ohk7Bh+Q8kjzxEHImIq98CnPduz8n1a5bdwJi6F7zU3h62crhlVq7fZBYoBhoDgmX0ROVOMr8WW3XU3XhRwUOw==",
+      "dependencies": {
+        "eventemitter3": "5.0.1",
+        "mipd": "0.0.5",
+        "zustand": "4.4.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/wevm"
+      },
+      "peerDependencies": {
+        "@tanstack/query-core": ">=5.0.0",
+        "typescript": ">=5.0.4",
+        "viem": "2.x"
+      },
+      "peerDependenciesMeta": {
+        "@tanstack/query-core": {
+          "optional": true
+        },
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@walletconnect/core": {
+      "version": "2.13.0",
+      "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.13.0.tgz",
+      "integrity": "sha512-blDuZxQenjeXcVJvHxPznTNl6c/2DO4VNrFnus+qHmO6OtT5lZRowdMtlCaCNb1q0OxzgrmBDcTOCbFcCpio/g==",
+      "dependencies": {
+        "@walletconnect/heartbeat": "1.2.2",
+        "@walletconnect/jsonrpc-provider": "1.0.14",
+        "@walletconnect/jsonrpc-types": "1.0.4",
+        "@walletconnect/jsonrpc-utils": "1.0.8",
+        "@walletconnect/jsonrpc-ws-connection": "1.0.14",
+        "@walletconnect/keyvaluestorage": "1.1.1",
+        "@walletconnect/logger": "2.1.2",
+        "@walletconnect/relay-api": "1.0.10",
+        "@walletconnect/relay-auth": "1.0.4",
+        "@walletconnect/safe-json": "1.0.2",
+        "@walletconnect/time": "1.0.2",
+        "@walletconnect/types": "2.13.0",
+        "@walletconnect/utils": "2.13.0",
+        "events": "3.3.0",
+        "isomorphic-unfetch": "3.1.0",
+        "lodash.isequal": "4.5.0",
+        "uint8arrays": "3.1.0"
+      }
+    },
+    "node_modules/@walletconnect/core/node_modules/@walletconnect/keyvaluestorage": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz",
+      "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==",
+      "dependencies": {
+        "@walletconnect/safe-json": "^1.0.1",
+        "idb-keyval": "^6.2.1",
+        "unstorage": "^1.9.0"
+      },
+      "peerDependencies": {
+        "@react-native-async-storage/async-storage": "1.x"
+      },
+      "peerDependenciesMeta": {
+        "@react-native-async-storage/async-storage": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@walletconnect/environment": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz",
+      "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==",
+      "dependencies": {
+        "tslib": "1.14.1"
+      }
+    },
+    "node_modules/@walletconnect/environment/node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+    },
+    "node_modules/@walletconnect/ethereum-provider": {
+      "version": "2.13.0",
+      "resolved": "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.13.0.tgz",
+      "integrity": "sha512-dnpW8mmLpWl1AZUYGYZpaAfGw1HFkL0WSlhk5xekx3IJJKn4pLacX2QeIOo0iNkzNQxZfux1AK4Grl1DvtzZEA==",
+      "dependencies": {
+        "@walletconnect/jsonrpc-http-connection": "1.0.8",
+        "@walletconnect/jsonrpc-provider": "1.0.14",
+        "@walletconnect/jsonrpc-types": "1.0.4",
+        "@walletconnect/jsonrpc-utils": "1.0.8",
+        "@walletconnect/modal": "2.6.2",
+        "@walletconnect/sign-client": "2.13.0",
+        "@walletconnect/types": "2.13.0",
+        "@walletconnect/universal-provider": "2.13.0",
+        "@walletconnect/utils": "2.13.0",
+        "events": "3.3.0"
+      }
+    },
+    "node_modules/@walletconnect/events": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz",
+      "integrity": "sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==",
+      "dependencies": {
+        "keyvaluestorage-interface": "^1.0.0",
+        "tslib": "1.14.1"
+      }
+    },
+    "node_modules/@walletconnect/events/node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+    },
+    "node_modules/@walletconnect/heartbeat": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz",
+      "integrity": "sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==",
+      "dependencies": {
+        "@walletconnect/events": "^1.0.1",
+        "@walletconnect/time": "^1.0.2",
+        "events": "^3.3.0"
+      }
+    },
+    "node_modules/@walletconnect/jsonrpc-http-connection": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.8.tgz",
+      "integrity": "sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==",
+      "dependencies": {
+        "@walletconnect/jsonrpc-utils": "^1.0.6",
+        "@walletconnect/safe-json": "^1.0.1",
+        "cross-fetch": "^3.1.4",
+        "events": "^3.3.0"
+      }
+    },
+    "node_modules/@walletconnect/jsonrpc-http-connection/node_modules/cross-fetch": {
+      "version": "3.1.8",
+      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz",
+      "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==",
+      "dependencies": {
+        "node-fetch": "^2.6.12"
+      }
+    },
+    "node_modules/@walletconnect/jsonrpc-provider": {
+      "version": "1.0.14",
+      "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz",
+      "integrity": "sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==",
+      "dependencies": {
+        "@walletconnect/jsonrpc-utils": "^1.0.8",
+        "@walletconnect/safe-json": "^1.0.2",
+        "events": "^3.3.0"
+      }
+    },
+    "node_modules/@walletconnect/jsonrpc-types": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz",
+      "integrity": "sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==",
+      "dependencies": {
+        "events": "^3.3.0",
+        "keyvaluestorage-interface": "^1.0.0"
+      }
+    },
+    "node_modules/@walletconnect/jsonrpc-utils": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz",
+      "integrity": "sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==",
+      "dependencies": {
+        "@walletconnect/environment": "^1.0.1",
+        "@walletconnect/jsonrpc-types": "^1.0.3",
+        "tslib": "1.14.1"
+      }
+    },
+    "node_modules/@walletconnect/jsonrpc-utils/node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+    },
+    "node_modules/@walletconnect/jsonrpc-ws-connection": {
+      "version": "1.0.14",
+      "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.14.tgz",
+      "integrity": "sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA==",
+      "dependencies": {
+        "@walletconnect/jsonrpc-utils": "^1.0.6",
+        "@walletconnect/safe-json": "^1.0.2",
+        "events": "^3.3.0",
+        "ws": "^7.5.1"
+      }
+    },
+    "node_modules/@walletconnect/jsonrpc-ws-connection/node_modules/ws": {
+      "version": "7.5.10",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+      "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+      "engines": {
+        "node": ">=8.3.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": "^5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@walletconnect/logger": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.1.2.tgz",
+      "integrity": "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==",
+      "dependencies": {
+        "@walletconnect/safe-json": "^1.0.2",
+        "pino": "7.11.0"
+      }
+    },
+    "node_modules/@walletconnect/modal": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.6.2.tgz",
+      "integrity": "sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==",
+      "dependencies": {
+        "@walletconnect/modal-core": "2.6.2",
+        "@walletconnect/modal-ui": "2.6.2"
+      }
+    },
+    "node_modules/@walletconnect/modal-core": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@walletconnect/modal-core/-/modal-core-2.6.2.tgz",
+      "integrity": "sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==",
+      "dependencies": {
+        "valtio": "1.11.2"
+      }
+    },
+    "node_modules/@walletconnect/modal-ui": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.6.2.tgz",
+      "integrity": "sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==",
+      "dependencies": {
+        "@walletconnect/modal-core": "2.6.2",
+        "lit": "2.8.0",
+        "motion": "10.16.2",
+        "qrcode": "1.5.3"
+      }
+    },
+    "node_modules/@walletconnect/relay-api": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.10.tgz",
+      "integrity": "sha512-tqrdd4zU9VBNqUaXXQASaexklv6A54yEyQQEXYOCr+Jz8Ket0dmPBDyg19LVSNUN2cipAghQc45/KVmfFJ0cYw==",
+      "dependencies": {
+        "@walletconnect/jsonrpc-types": "^1.0.2"
+      }
+    },
+    "node_modules/@walletconnect/relay-auth": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz",
+      "integrity": "sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==",
+      "dependencies": {
+        "@stablelib/ed25519": "^1.0.2",
+        "@stablelib/random": "^1.0.1",
+        "@walletconnect/safe-json": "^1.0.1",
+        "@walletconnect/time": "^1.0.2",
+        "tslib": "1.14.1",
+        "uint8arrays": "^3.0.0"
+      }
+    },
+    "node_modules/@walletconnect/relay-auth/node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+    },
+    "node_modules/@walletconnect/safe-json": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz",
+      "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==",
+      "dependencies": {
+        "tslib": "1.14.1"
+      }
+    },
+    "node_modules/@walletconnect/safe-json/node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+    },
+    "node_modules/@walletconnect/sign-client": {
+      "version": "2.13.0",
+      "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.13.0.tgz",
+      "integrity": "sha512-En7KSvNUlQFx20IsYGsFgkNJ2lpvDvRsSFOT5PTdGskwCkUfOpB33SQJ6nCrN19gyoKPNvWg80Cy6MJI0TjNYA==",
+      "dependencies": {
+        "@walletconnect/core": "2.13.0",
+        "@walletconnect/events": "1.0.1",
+        "@walletconnect/heartbeat": "1.2.2",
+        "@walletconnect/jsonrpc-utils": "1.0.8",
+        "@walletconnect/logger": "2.1.2",
+        "@walletconnect/time": "1.0.2",
+        "@walletconnect/types": "2.13.0",
+        "@walletconnect/utils": "2.13.0",
+        "events": "3.3.0"
+      }
+    },
+    "node_modules/@walletconnect/time": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz",
+      "integrity": "sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==",
+      "dependencies": {
+        "tslib": "1.14.1"
+      }
+    },
+    "node_modules/@walletconnect/time/node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+    },
+    "node_modules/@walletconnect/types": {
+      "version": "2.13.0",
+      "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.13.0.tgz",
+      "integrity": "sha512-MWaVT0FkZwzYbD3tvk8F+2qpPlz1LUSWHuqbINUtMXnSzJtXN49Y99fR7FuBhNFtDalfuWsEK17GrNA+KnAsPQ==",
+      "dependencies": {
+        "@walletconnect/events": "1.0.1",
+        "@walletconnect/heartbeat": "1.2.2",
+        "@walletconnect/jsonrpc-types": "1.0.4",
+        "@walletconnect/keyvaluestorage": "1.1.1",
+        "@walletconnect/logger": "2.1.2",
+        "events": "3.3.0"
+      }
+    },
+    "node_modules/@walletconnect/types/node_modules/@walletconnect/keyvaluestorage": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz",
+      "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==",
+      "dependencies": {
+        "@walletconnect/safe-json": "^1.0.1",
+        "idb-keyval": "^6.2.1",
+        "unstorage": "^1.9.0"
+      },
+      "peerDependencies": {
+        "@react-native-async-storage/async-storage": "1.x"
+      },
+      "peerDependenciesMeta": {
+        "@react-native-async-storage/async-storage": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@walletconnect/universal-provider": {
+      "version": "2.13.0",
+      "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.13.0.tgz",
+      "integrity": "sha512-B5QvO8pnk5Bqn4aIt0OukGEQn2Auk9VbHfhQb9cGwgmSCd1GlprX/Qblu4gyT5+TjHMb1Gz5UssUaZWTWbDhBg==",
+      "dependencies": {
+        "@walletconnect/jsonrpc-http-connection": "1.0.8",
+        "@walletconnect/jsonrpc-provider": "1.0.14",
+        "@walletconnect/jsonrpc-types": "1.0.4",
+        "@walletconnect/jsonrpc-utils": "1.0.8",
+        "@walletconnect/logger": "2.1.2",
+        "@walletconnect/sign-client": "2.13.0",
+        "@walletconnect/types": "2.13.0",
+        "@walletconnect/utils": "2.13.0",
+        "events": "3.3.0"
+      }
+    },
+    "node_modules/@walletconnect/utils": {
+      "version": "2.13.0",
+      "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.13.0.tgz",
+      "integrity": "sha512-q1eDCsRHj5iLe7fF8RroGoPZpdo2CYMZzQSrw1iqL+2+GOeqapxxuJ1vaJkmDUkwgklfB22ufqG6KQnz78sD4w==",
+      "dependencies": {
+        "@stablelib/chacha20poly1305": "1.0.1",
+        "@stablelib/hkdf": "1.0.1",
+        "@stablelib/random": "1.0.2",
+        "@stablelib/sha256": "1.0.1",
+        "@stablelib/x25519": "1.0.3",
+        "@walletconnect/relay-api": "1.0.10",
+        "@walletconnect/safe-json": "1.0.2",
+        "@walletconnect/time": "1.0.2",
+        "@walletconnect/types": "2.13.0",
+        "@walletconnect/window-getters": "1.0.1",
+        "@walletconnect/window-metadata": "1.0.1",
+        "detect-browser": "5.3.0",
+        "query-string": "7.1.3",
+        "uint8arrays": "3.1.0"
+      }
+    },
+    "node_modules/@walletconnect/window-getters": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz",
+      "integrity": "sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==",
+      "dependencies": {
+        "tslib": "1.14.1"
+      }
+    },
+    "node_modules/@walletconnect/window-getters/node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+    },
+    "node_modules/@walletconnect/window-metadata": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz",
+      "integrity": "sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==",
+      "dependencies": {
+        "@walletconnect/window-getters": "^1.0.1",
+        "tslib": "1.14.1"
+      }
+    },
+    "node_modules/@walletconnect/window-metadata/node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+    },
+    "node_modules/abitype": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz",
+      "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==",
+      "funding": {
+        "url": "https://github.com/sponsors/wevm"
+      },
+      "peerDependencies": {
+        "typescript": ">=5.0.4",
+        "zod": "^3 >=3.22.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        },
+        "zod": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/abort-controller": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+      "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+      "peer": true,
+      "dependencies": {
+        "event-target-shim": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=6.5"
+      }
+    },
+    "node_modules/accepts": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+      "peer": true,
+      "dependencies": {
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/acorn": {
+      "version": "8.12.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
+      "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      }
+    },
+    "node_modules/aes-js": {
+      "version": "4.0.0-beta.5",
+      "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz",
+      "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==",
+      "license": "MIT"
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/anser": {
+      "version": "1.4.10",
+      "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz",
+      "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==",
+      "peer": true
+    },
+    "node_modules/ansi-fragments": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz",
+      "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==",
+      "peer": true,
+      "dependencies": {
+        "colorette": "^1.0.7",
+        "slice-ansi": "^2.0.0",
+        "strip-ansi": "^5.0.0"
+      }
+    },
+    "node_modules/ansi-fragments/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==",
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/ansi-fragments/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==",
+      "peer": true,
+      "dependencies": {
+        "ansi-regex": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/any-promise": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+      "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+      "license": "MIT"
+    },
+    "node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/appdirsjs": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz",
+      "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==",
+      "peer": true
+    },
+    "node_modules/arg": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+      "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+      "license": "MIT"
+    },
+    "node_modules/argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "peer": true,
+      "dependencies": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "node_modules/aria-query": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
+      "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "deep-equal": "^2.0.5"
+      }
+    },
+    "node_modules/array-buffer-byte-length": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+      "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.5",
+        "is-array-buffer": "^3.0.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array-includes": {
+      "version": "3.1.8",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+      "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "is-string": "^1.0.7"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array-union": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/array.prototype.findlast": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+      "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-shim-unscopables": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array.prototype.findlastindex": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
+      "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-shim-unscopables": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array.prototype.flat": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+      "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1",
+        "es-shim-unscopables": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array.prototype.flatmap": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
+      "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1",
+        "es-shim-unscopables": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array.prototype.toreversed": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz",
+      "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1",
+        "es-shim-unscopables": "^1.0.0"
+      }
+    },
+    "node_modules/array.prototype.tosorted": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+      "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.3",
+        "es-errors": "^1.3.0",
+        "es-shim-unscopables": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/arraybuffer.prototype.slice": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+      "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "array-buffer-byte-length": "^1.0.1",
+        "call-bind": "^1.0.5",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.22.3",
+        "es-errors": "^1.2.1",
+        "get-intrinsic": "^1.2.3",
+        "is-array-buffer": "^3.0.4",
+        "is-shared-array-buffer": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+      "peer": true
+    },
+    "node_modules/asn1.js": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+      "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+      "license": "MIT",
+      "dependencies": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "node_modules/asn1.js/node_modules/bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "license": "MIT"
+    },
+    "node_modules/ast-types": {
+      "version": "0.15.2",
+      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz",
+      "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==",
+      "peer": true,
+      "dependencies": {
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/ast-types-flow": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+      "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/astral-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/async-limiter": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+      "peer": true
+    },
+    "node_modules/async-mutex": {
+      "version": "0.2.6",
+      "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz",
+      "integrity": "sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==",
+      "dependencies": {
+        "tslib": "^2.0.0"
+      }
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "license": "MIT",
+      "peer": true
+    },
+    "node_modules/atomic-sleep": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
+      "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==",
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/autoprefixer": {
+      "version": "10.4.19",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz",
+      "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.23.0",
+        "caniuse-lite": "^1.0.30001599",
+        "fraction.js": "^4.3.7",
+        "normalize-range": "^0.1.2",
+        "picocolors": "^1.0.0",
+        "postcss-value-parser": "^4.2.0"
+      },
+      "bin": {
+        "autoprefixer": "bin/autoprefixer"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/available-typed-arrays": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+      "dependencies": {
+        "possible-typed-array-names": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/axe-core": {
+      "version": "4.9.1",
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz",
+      "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/axios": {
+      "version": "0.27.2",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
+      "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "follow-redirects": "^1.14.9",
+        "form-data": "^4.0.0"
+      }
+    },
+    "node_modules/axobject-query": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz",
+      "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "deep-equal": "^2.0.5"
+      }
+    },
+    "node_modules/babel-core": {
+      "version": "7.0.0-bridge.0",
+      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz",
+      "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==",
+      "peer": true,
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-corejs2": {
+      "version": "0.4.11",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
+      "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==",
+      "peer": true,
+      "dependencies": {
+        "@babel/compat-data": "^7.22.6",
+        "@babel/helper-define-polyfill-provider": "^0.6.2",
+        "semver": "^6.3.1"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "peer": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-corejs3": {
+      "version": "0.10.4",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz",
+      "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-define-polyfill-provider": "^0.6.1",
+        "core-js-compat": "^3.36.1"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-regenerator": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz",
+      "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-define-polyfill-provider": "^0.6.2"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/babel-plugin-transform-flow-enums": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz",
+      "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/plugin-syntax-flow": "^7.12.1"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+    },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/binary-extensions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/bl": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+      "peer": true,
+      "dependencies": {
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
+      }
+    },
+    "node_modules/bl/node_modules/buffer": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "peer": true,
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.1.13"
+      }
+    },
+    "node_modules/bn.js": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+      "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
+    },
+    "node_modules/bowser": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+      "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA=="
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="
+    },
+    "node_modules/browserslist": {
+      "version": "4.23.1",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz",
+      "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001629",
+        "electron-to-chromium": "^1.4.796",
+        "node-releases": "^2.0.14",
+        "update-browserslist-db": "^1.0.16"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
+    "node_modules/bser": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+      "peer": true,
+      "dependencies": {
+        "node-int64": "^0.4.0"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+      "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.2.1"
+      }
+    },
+    "node_modules/buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+      "peer": true
+    },
+    "node_modules/bufferutil": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz",
+      "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "node-gyp-build": "^4.3.0"
+      },
+      "engines": {
+        "node": ">=6.14.2"
+      }
+    },
+    "node_modules/busboy": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+      "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+      "dependencies": {
+        "streamsearch": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=10.16.0"
+      }
+    },
+    "node_modules/bytes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+      "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/caller-callsite": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
+      "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==",
+      "peer": true,
+      "dependencies": {
+        "callsites": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/caller-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
+      "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==",
+      "peer": true,
+      "dependencies": {
+        "caller-callsite": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/callsites": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
+      "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==",
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/camelcase-css": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+      "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001640",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz",
+      "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ]
+    },
+    "node_modules/cbw-sdk": {
+      "name": "@coinbase/wallet-sdk",
+      "version": "3.9.3",
+      "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-3.9.3.tgz",
+      "integrity": "sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==",
+      "dependencies": {
+        "bn.js": "^5.2.1",
+        "buffer": "^6.0.3",
+        "clsx": "^1.2.1",
+        "eth-block-tracker": "^7.1.0",
+        "eth-json-rpc-filters": "^6.0.0",
+        "eventemitter3": "^5.0.1",
+        "keccak": "^3.0.3",
+        "preact": "^10.16.0",
+        "sha.js": "^2.4.11"
+      }
+    },
+    "node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/chrome-launcher": {
+      "version": "0.15.2",
+      "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz",
+      "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==",
+      "peer": true,
+      "dependencies": {
+        "@types/node": "*",
+        "escape-string-regexp": "^4.0.0",
+        "is-wsl": "^2.2.0",
+        "lighthouse-logger": "^1.0.0"
+      },
+      "bin": {
+        "print-chrome-path": "bin/print-chrome-path.js"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      }
+    },
+    "node_modules/ci-info": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+      "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/sibiraj-s"
+        }
+      ],
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/citty": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
+      "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
+      "dependencies": {
+        "consola": "^3.2.3"
+      }
+    },
+    "node_modules/cli-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+      "peer": true,
+      "dependencies": {
+        "restore-cursor": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cli-spinners": {
+      "version": "2.9.2",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+      "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/client-only": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+      "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
+    },
+    "node_modules/clipboardy": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz",
+      "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==",
+      "dependencies": {
+        "execa": "^8.0.1",
+        "is-wsl": "^3.1.0",
+        "is64bit": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/clipboardy/node_modules/execa": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+      "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+      "dependencies": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^8.0.1",
+        "human-signals": "^5.0.0",
+        "is-stream": "^3.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^5.1.0",
+        "onetime": "^6.0.0",
+        "signal-exit": "^4.1.0",
+        "strip-final-newline": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=16.17"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+      }
+    },
+    "node_modules/clipboardy/node_modules/get-stream": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+      "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+      "engines": {
+        "node": ">=16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/clipboardy/node_modules/human-signals": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+      "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+      "engines": {
+        "node": ">=16.17.0"
+      }
+    },
+    "node_modules/clipboardy/node_modules/is-stream": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+      "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/clipboardy/node_modules/is-wsl": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
+      "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
+      "dependencies": {
+        "is-inside-container": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/clipboardy/node_modules/mimic-fn": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+      "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/clipboardy/node_modules/npm-run-path": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+      "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+      "dependencies": {
+        "path-key": "^4.0.0"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/clipboardy/node_modules/onetime": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+      "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+      "dependencies": {
+        "mimic-fn": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/clipboardy/node_modules/path-key": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+      "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/clipboardy/node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/clipboardy/node_modules/strip-final-newline": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+      "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/cliui": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^6.2.0"
+      }
+    },
+    "node_modules/clone": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+      "peer": true,
+      "dependencies": {
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/clsx": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+      "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "node_modules/colorette": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
+      "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
+      "peer": true
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/command-exists": {
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
+      "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==",
+      "peer": true
+    },
+    "node_modules/commander": {
+      "version": "9.5.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+      "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
+      "peer": true,
+      "engines": {
+        "node": "^12.20.0 || >=14"
+      }
+    },
+    "node_modules/commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+      "peer": true
+    },
+    "node_modules/compressible": {
+      "version": "2.0.18",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+      "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+      "peer": true,
+      "dependencies": {
+        "mime-db": ">= 1.43.0 < 2"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/compression": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+      "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+      "peer": true,
+      "dependencies": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.16",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.2",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/compression/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "peer": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/compression/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "peer": true
+    },
+    "node_modules/compression/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "peer": true
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+    },
+    "node_modules/confbox": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz",
+      "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA=="
+    },
+    "node_modules/connect": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+      "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+      "peer": true,
+      "dependencies": {
+        "debug": "2.6.9",
+        "finalhandler": "1.1.2",
+        "parseurl": "~1.3.3",
+        "utils-merge": "1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.10.0"
+      }
+    },
+    "node_modules/connect/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "peer": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/connect/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "peer": true
+    },
+    "node_modules/consola": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
+      "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
+      "engines": {
+        "node": "^14.18.0 || >=16.10.0"
+      }
+    },
+    "node_modules/convert-source-map": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+      "peer": true
+    },
+    "node_modules/cookie-es": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.1.0.tgz",
+      "integrity": "sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw=="
+    },
+    "node_modules/core-js-compat": {
+      "version": "3.37.1",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
+      "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+      "peer": true,
+      "dependencies": {
+        "browserslist": "^4.23.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/core-js"
+      }
+    },
+    "node_modules/core-util-is": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+    },
+    "node_modules/cosmiconfig": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+      "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+      "peer": true,
+      "dependencies": {
+        "import-fresh": "^2.0.0",
+        "is-directory": "^0.3.1",
+        "js-yaml": "^3.13.1",
+        "parse-json": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+      "bin": {
+        "crc32": "bin/crc32.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/cross-fetch": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
+      "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
+      "dependencies": {
+        "node-fetch": "^2.6.12"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/crossws": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.2.4.tgz",
+      "integrity": "sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==",
+      "peerDependencies": {
+        "uWebSockets.js": "*"
+      },
+      "peerDependenciesMeta": {
+        "uWebSockets.js": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/crypto-js": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
+      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
+      "license": "MIT"
+    },
+    "node_modules/css-selector-tokenizer": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz",
+      "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "fastparse": "^1.1.2"
+      }
+    },
+    "node_modules/css-what": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+      "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+      "engines": {
+        "node": ">= 6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+    },
+    "node_modules/culori": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz",
+      "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      }
+    },
+    "node_modules/daisyui": {
+      "version": "4.12.10",
+      "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.10.tgz",
+      "integrity": "sha512-jp1RAuzbHhGdXmn957Z2XsTZStXGHzFfF0FgIOZj3Wv9sH7OZgLfXTRZNfKVYxltGUOBsG1kbWAdF5SrqjebvA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "css-selector-tokenizer": "^0.8",
+        "culori": "^3",
+        "picocolors": "^1",
+        "postcss-js": "^4"
+      },
+      "engines": {
+        "node": ">=16.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/daisyui"
+      }
+    },
+    "node_modules/damerau-levenshtein": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+      "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+      "dev": true,
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/data-view-buffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+      "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/data-view-byte-length": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+      "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/data-view-byte-offset": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+      "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/date-fns": {
+      "version": "2.30.0",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
+      "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
+      "dependencies": {
+        "@babel/runtime": "^7.21.0"
+      },
+      "engines": {
+        "node": ">=0.11"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/date-fns"
+      }
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.11",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz",
+      "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==",
+      "peer": true
+    },
+    "node_modules/debug": {
+      "version": "4.3.5",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+      "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/decode-uri-component": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+      "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/deep-equal": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz",
+      "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "array-buffer-byte-length": "^1.0.0",
+        "call-bind": "^1.0.5",
+        "es-get-iterator": "^1.1.3",
+        "get-intrinsic": "^1.2.2",
+        "is-arguments": "^1.1.1",
+        "is-array-buffer": "^3.0.2",
+        "is-date-object": "^1.0.5",
+        "is-regex": "^1.1.4",
+        "is-shared-array-buffer": "^1.0.2",
+        "isarray": "^2.0.5",
+        "object-is": "^1.1.5",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.4",
+        "regexp.prototype.flags": "^1.5.1",
+        "side-channel": "^1.0.4",
+        "which-boxed-primitive": "^1.0.2",
+        "which-collection": "^1.0.1",
+        "which-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/deep-equal/node_modules/isarray": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/deep-object-diff": {
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz",
+      "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA=="
+    },
+    "node_modules/deepmerge": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/defaults": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+      "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+      "peer": true,
+      "dependencies": {
+        "clone": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/define-lazy-prop": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+      "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/define-properties": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-data-property": "^1.0.1",
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/defu": {
+      "version": "6.1.4",
+      "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
+      "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "license": "MIT",
+      "peer": true,
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/denodeify": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz",
+      "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==",
+      "peer": true
+    },
+    "node_modules/depd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/destr": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz",
+      "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ=="
+    },
+    "node_modules/destroy": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
+      }
+    },
+    "node_modules/detect-browser": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz",
+      "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w=="
+    },
+    "node_modules/detect-libc": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+      "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+      "bin": {
+        "detect-libc": "bin/detect-libc.js"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/detect-node-es": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+      "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
+    },
+    "node_modules/didyoumean": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+      "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+      "license": "Apache-2.0"
+    },
+    "node_modules/dijkstrajs": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
+      "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
+    },
+    "node_modules/dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "path-type": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/dlv": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+      "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+      "license": "MIT"
+    },
+    "node_modules/doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/duplexify": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
+      "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
+      "dependencies": {
+        "end-of-stream": "^1.4.1",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1",
+        "stream-shift": "^1.0.2"
+      }
+    },
+    "node_modules/eastasianwidth": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+      "license": "MIT"
+    },
+    "node_modules/eciesjs": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.3.19.tgz",
+      "integrity": "sha512-b+PkRDZ3ym7HEcnbxc22CMVCpgsnr8+gGgST3U5PtgeX1luvINgfXW7efOyUtmn/jFtA/lg5ywBi/Uazf4oeaA==",
+      "dependencies": {
+        "@types/secp256k1": "^4.0.6",
+        "futoin-hkdf": "^1.5.3",
+        "secp256k1": "^5.0.0"
+      }
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+      "peer": true
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.4.816",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz",
+      "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw=="
+    },
+    "node_modules/elliptic": {
+      "version": "6.5.5",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz",
+      "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==",
+      "dependencies": {
+        "bn.js": "^4.11.9",
+        "brorand": "^1.1.0",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.1",
+        "inherits": "^2.0.4",
+        "minimalistic-assert": "^1.0.1",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "node_modules/elliptic/node_modules/bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+    },
+    "node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+    },
+    "node_modules/encode-utf8": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
+      "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
+    },
+    "node_modules/encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dependencies": {
+        "once": "^1.4.0"
+      }
+    },
+    "node_modules/engine.io-client": {
+      "version": "6.5.4",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz",
+      "integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==",
+      "dependencies": {
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.1",
+        "engine.io-parser": "~5.2.1",
+        "ws": "~8.17.1",
+        "xmlhttprequest-ssl": "~2.0.0"
+      }
+    },
+    "node_modules/engine.io-client/node_modules/ws": {
+      "version": "8.17.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+      "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/engine.io-parser": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz",
+      "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==",
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/enhanced-resolve": {
+      "version": "5.17.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz",
+      "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.2.4",
+        "tapable": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/envinfo": {
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz",
+      "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==",
+      "peer": true,
+      "bin": {
+        "envinfo": "dist/cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "peer": true,
+      "dependencies": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "node_modules/error-stack-parser": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+      "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+      "peer": true,
+      "dependencies": {
+        "stackframe": "^1.3.4"
+      }
+    },
+    "node_modules/errorhandler": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz",
+      "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==",
+      "peer": true,
+      "dependencies": {
+        "accepts": "~1.3.7",
+        "escape-html": "~1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/es-abstract": {
+      "version": "1.23.3",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
+      "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "array-buffer-byte-length": "^1.0.1",
+        "arraybuffer.prototype.slice": "^1.0.3",
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
+        "data-view-buffer": "^1.0.1",
+        "data-view-byte-length": "^1.0.1",
+        "data-view-byte-offset": "^1.0.0",
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-set-tostringtag": "^2.0.3",
+        "es-to-primitive": "^1.2.1",
+        "function.prototype.name": "^1.1.6",
+        "get-intrinsic": "^1.2.4",
+        "get-symbol-description": "^1.0.2",
+        "globalthis": "^1.0.3",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2",
+        "has-proto": "^1.0.3",
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.2",
+        "internal-slot": "^1.0.7",
+        "is-array-buffer": "^3.0.4",
+        "is-callable": "^1.2.7",
+        "is-data-view": "^1.0.1",
+        "is-negative-zero": "^2.0.3",
+        "is-regex": "^1.1.4",
+        "is-shared-array-buffer": "^1.0.3",
+        "is-string": "^1.0.7",
+        "is-typed-array": "^1.1.13",
+        "is-weakref": "^1.0.2",
+        "object-inspect": "^1.13.1",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.5",
+        "regexp.prototype.flags": "^1.5.2",
+        "safe-array-concat": "^1.1.2",
+        "safe-regex-test": "^1.0.3",
+        "string.prototype.trim": "^1.2.9",
+        "string.prototype.trimend": "^1.0.8",
+        "string.prototype.trimstart": "^1.0.8",
+        "typed-array-buffer": "^1.0.2",
+        "typed-array-byte-length": "^1.0.1",
+        "typed-array-byte-offset": "^1.0.2",
+        "typed-array-length": "^1.0.6",
+        "unbox-primitive": "^1.0.2",
+        "which-typed-array": "^1.1.15"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+      "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+      "dependencies": {
+        "get-intrinsic": "^1.2.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-get-iterator": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
+      "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.1.3",
+        "has-symbols": "^1.0.3",
+        "is-arguments": "^1.1.1",
+        "is-map": "^2.0.2",
+        "is-set": "^2.0.2",
+        "is-string": "^1.0.7",
+        "isarray": "^2.0.5",
+        "stop-iteration-iterator": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/es-get-iterator/node_modules/isarray": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/es-iterator-helpers": {
+      "version": "1.0.19",
+      "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz",
+      "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.3",
+        "es-errors": "^1.3.0",
+        "es-set-tostringtag": "^2.0.3",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "globalthis": "^1.0.3",
+        "has-property-descriptors": "^1.0.2",
+        "has-proto": "^1.0.3",
+        "has-symbols": "^1.0.3",
+        "internal-slot": "^1.0.7",
+        "iterator.prototype": "^1.1.2",
+        "safe-array-concat": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+      "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-set-tostringtag": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+      "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "get-intrinsic": "^1.2.4",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-shim-unscopables": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+      "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "hasown": "^2.0.0"
+      }
+    },
+    "node_modules/es-to-primitive": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+      "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+      "peer": true
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint": {
+      "version": "8.57.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+      "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.2.0",
+        "@eslint-community/regexpp": "^4.6.1",
+        "@eslint/eslintrc": "^2.1.4",
+        "@eslint/js": "8.57.0",
+        "@humanwhocodes/config-array": "^0.11.14",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "@nodelib/fs.walk": "^1.2.8",
+        "@ungap/structured-clone": "^1.2.0",
+        "ajv": "^6.12.4",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.3.2",
+        "doctrine": "^3.0.0",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^7.2.2",
+        "eslint-visitor-keys": "^3.4.3",
+        "espree": "^9.6.1",
+        "esquery": "^1.4.2",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^6.0.1",
+        "find-up": "^5.0.0",
+        "glob-parent": "^6.0.2",
+        "globals": "^13.19.0",
+        "graphemer": "^1.4.0",
+        "ignore": "^5.2.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "is-path-inside": "^3.0.3",
+        "js-yaml": "^4.1.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.1.2",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.3",
+        "strip-ansi": "^6.0.1",
+        "text-table": "^0.2.0"
+      },
+      "bin": {
+        "eslint": "bin/eslint.js"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-config-next": {
+      "version": "14.2.4",
+      "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.4.tgz",
+      "integrity": "sha512-Qr0wMgG9m6m4uYy2jrYJmyuNlYZzPRQq5Kvb9IDlYwn+7yq6W6sfMNFgb+9guM1KYwuIo6TIaiFhZJ6SnQ/Efw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@next/eslint-plugin-next": "14.2.4",
+        "@rushstack/eslint-patch": "^1.3.3",
+        "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0",
+        "eslint-import-resolver-node": "^0.3.6",
+        "eslint-import-resolver-typescript": "^3.5.2",
+        "eslint-plugin-import": "^2.28.1",
+        "eslint-plugin-jsx-a11y": "^6.7.1",
+        "eslint-plugin-react": "^7.33.2",
+        "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705"
+      },
+      "peerDependencies": {
+        "eslint": "^7.23.0 || ^8.0.0",
+        "typescript": ">=3.3.1"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/eslint-import-resolver-node": {
+      "version": "0.3.9",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+      "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^3.2.7",
+        "is-core-module": "^2.13.0",
+        "resolve": "^1.22.4"
+      }
+    },
+    "node_modules/eslint-import-resolver-node/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/eslint-import-resolver-typescript": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz",
+      "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "debug": "^4.3.4",
+        "enhanced-resolve": "^5.12.0",
+        "eslint-module-utils": "^2.7.4",
+        "fast-glob": "^3.3.1",
+        "get-tsconfig": "^4.5.0",
+        "is-core-module": "^2.11.0",
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts"
+      },
+      "peerDependencies": {
+        "eslint": "*",
+        "eslint-plugin-import": "*"
+      }
+    },
+    "node_modules/eslint-module-utils": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz",
+      "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^3.2.7"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependenciesMeta": {
+        "eslint": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/eslint-module-utils/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/eslint-plugin-import": {
+      "version": "2.29.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
+      "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "array-includes": "^3.1.7",
+        "array.prototype.findlastindex": "^1.2.3",
+        "array.prototype.flat": "^1.3.2",
+        "array.prototype.flatmap": "^1.3.2",
+        "debug": "^3.2.7",
+        "doctrine": "^2.1.0",
+        "eslint-import-resolver-node": "^0.3.9",
+        "eslint-module-utils": "^2.8.0",
+        "hasown": "^2.0.0",
+        "is-core-module": "^2.13.1",
+        "is-glob": "^4.0.3",
+        "minimatch": "^3.1.2",
+        "object.fromentries": "^2.0.7",
+        "object.groupby": "^1.0.1",
+        "object.values": "^1.1.7",
+        "semver": "^6.3.1",
+        "tsconfig-paths": "^3.15.0"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependencies": {
+        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+      }
+    },
+    "node_modules/eslint-plugin-import/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/eslint-plugin-import/node_modules/doctrine": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/eslint-plugin-import/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/eslint-plugin-jsx-a11y": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz",
+      "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "aria-query": "~5.1.3",
+        "array-includes": "^3.1.8",
+        "array.prototype.flatmap": "^1.3.2",
+        "ast-types-flow": "^0.0.8",
+        "axe-core": "^4.9.1",
+        "axobject-query": "~3.1.1",
+        "damerau-levenshtein": "^1.0.8",
+        "emoji-regex": "^9.2.2",
+        "es-iterator-helpers": "^1.0.19",
+        "hasown": "^2.0.2",
+        "jsx-ast-utils": "^3.3.5",
+        "language-tags": "^1.0.9",
+        "minimatch": "^3.1.2",
+        "object.fromentries": "^2.0.8",
+        "safe-regex-test": "^1.0.3",
+        "string.prototype.includes": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependencies": {
+        "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+      }
+    },
+    "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/eslint-plugin-react": {
+      "version": "7.34.3",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz",
+      "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "array-includes": "^3.1.8",
+        "array.prototype.findlast": "^1.2.5",
+        "array.prototype.flatmap": "^1.3.2",
+        "array.prototype.toreversed": "^1.1.2",
+        "array.prototype.tosorted": "^1.1.4",
+        "doctrine": "^2.1.0",
+        "es-iterator-helpers": "^1.0.19",
+        "estraverse": "^5.3.0",
+        "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+        "minimatch": "^3.1.2",
+        "object.entries": "^1.1.8",
+        "object.fromentries": "^2.0.8",
+        "object.hasown": "^1.1.4",
+        "object.values": "^1.2.0",
+        "prop-types": "^15.8.1",
+        "resolve": "^2.0.0-next.5",
+        "semver": "^6.3.1",
+        "string.prototype.matchall": "^4.0.11"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependencies": {
+        "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+      }
+    },
+    "node_modules/eslint-plugin-react-hooks": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+      "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+      }
+    },
+    "node_modules/eslint-plugin-react/node_modules/doctrine": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/eslint-plugin-react/node_modules/resolve": {
+      "version": "2.0.0-next.5",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+      "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-core-module": "^2.13.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/eslint-plugin-react/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "7.2.2",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+      "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-visitor-keys": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint/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,
+      "license": "Python-2.0"
+    },
+    "node_modules/eslint/node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/eslint/node_modules/globals": {
+      "version": "13.24.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+      "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "type-fest": "^0.20.2"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/eslint/node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+      "dev": true,
+      "license": "(MIT OR CC0-1.0)",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/espree": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+      "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "acorn": "^8.9.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.4.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "peer": true,
+      "bin": {
+        "esparse": "bin/esparse.js",
+        "esvalidate": "bin/esvalidate.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/esquery": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+      "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "estraverse": "^5.1.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/eth-block-tracker": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-7.1.0.tgz",
+      "integrity": "sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==",
+      "dependencies": {
+        "@metamask/eth-json-rpc-provider": "^1.0.0",
+        "@metamask/safe-event-emitter": "^3.0.0",
+        "@metamask/utils": "^5.0.1",
+        "json-rpc-random-id": "^1.0.1",
+        "pify": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/eth-block-tracker/node_modules/@metamask/utils": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-5.0.2.tgz",
+      "integrity": "sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==",
+      "dependencies": {
+        "@ethereumjs/tx": "^4.1.2",
+        "@types/debug": "^4.1.7",
+        "debug": "^4.3.4",
+        "semver": "^7.3.8",
+        "superstruct": "^1.0.3"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/eth-json-rpc-filters": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-6.0.1.tgz",
+      "integrity": "sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==",
+      "dependencies": {
+        "@metamask/safe-event-emitter": "^3.0.0",
+        "async-mutex": "^0.2.6",
+        "eth-query": "^2.1.2",
+        "json-rpc-engine": "^6.1.0",
+        "pify": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/eth-json-rpc-filters/node_modules/pify": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
+      "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eth-query": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz",
+      "integrity": "sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==",
+      "dependencies": {
+        "json-rpc-random-id": "^1.0.0",
+        "xtend": "^4.0.1"
+      }
+    },
+    "node_modules/eth-rpc-errors": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz",
+      "integrity": "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==",
+      "dependencies": {
+        "fast-safe-stringify": "^2.0.6"
+      }
+    },
+    "node_modules/ethereum-cryptography": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz",
+      "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==",
+      "dependencies": {
+        "@noble/curves": "1.4.2",
+        "@noble/hashes": "1.4.0",
+        "@scure/bip32": "1.4.0",
+        "@scure/bip39": "1.3.0"
+      }
+    },
+    "node_modules/ethereum-cryptography/node_modules/@noble/curves": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz",
+      "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==",
+      "dependencies": {
+        "@noble/hashes": "1.4.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/ethereum-cryptography/node_modules/@noble/hashes": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
+      "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/ethereum-cryptography/node_modules/@scure/bip32": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz",
+      "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==",
+      "dependencies": {
+        "@noble/curves": "~1.4.0",
+        "@noble/hashes": "~1.4.0",
+        "@scure/base": "~1.1.6"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/ethereum-cryptography/node_modules/@scure/bip39": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz",
+      "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==",
+      "dependencies": {
+        "@noble/hashes": "~1.4.0",
+        "@scure/base": "~1.1.6"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/ethers": {
+      "version": "6.13.1",
+      "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.1.tgz",
+      "integrity": "sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/ethers-io/"
+        },
+        {
+          "type": "individual",
+          "url": "https://www.buymeacoffee.com/ricmoo"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "@adraffy/ens-normalize": "1.10.1",
+        "@noble/curves": "1.2.0",
+        "@noble/hashes": "1.3.2",
+        "@types/node": "18.15.13",
+        "aes-js": "4.0.0-beta.5",
+        "tslib": "2.4.0",
+        "ws": "8.17.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/ethers/node_modules/@adraffy/ens-normalize": {
+      "version": "1.10.1",
+      "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz",
+      "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==",
+      "license": "MIT"
+    },
+    "node_modules/ethers/node_modules/@types/node": {
+      "version": "18.15.13",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz",
+      "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==",
+      "license": "MIT"
+    },
+    "node_modules/ethers/node_modules/tslib": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+      "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
+      "license": "0BSD"
+    },
+    "node_modules/ethers/node_modules/ws": {
+      "version": "8.17.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+      "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/ethjs-util": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz",
+      "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==",
+      "license": "MIT",
+      "dependencies": {
+        "is-hex-prefixed": "1.0.0",
+        "strip-hex-prefix": "1.0.0"
+      },
+      "engines": {
+        "node": ">=6.5.0",
+        "npm": ">=3"
+      }
+    },
+    "node_modules/event-target-shim": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+      "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/eventemitter2": {
+      "version": "6.4.9",
+      "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz",
+      "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg=="
+    },
+    "node_modules/eventemitter3": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+      "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
+    },
+    "node_modules/events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "engines": {
+        "node": ">=0.8.x"
+      }
+    },
+    "node_modules/execa": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+      "peer": true,
+      "dependencies": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+      }
+    },
+    "node_modules/extension-port-stream": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/extension-port-stream/-/extension-port-stream-3.0.0.tgz",
+      "integrity": "sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==",
+      "dependencies": {
+        "readable-stream": "^3.6.2 || ^4.4.2",
+        "webextension-polyfill": ">=0.10.0 <1.0"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+    },
+    "node_modules/fast-glob": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+      "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.4"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-redact": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz",
+      "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/fast-safe-stringify": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+      "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
+    },
+    "node_modules/fast-xml-parser": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz",
+      "integrity": "sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/NaturalIntelligence"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/naturalintelligence"
+        }
+      ],
+      "peer": true,
+      "dependencies": {
+        "strnum": "^1.0.5"
+      },
+      "bin": {
+        "fxparser": "src/cli/cli.js"
+      }
+    },
+    "node_modules/fastparse": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
+      "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fastq": {
+      "version": "1.17.1",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+      "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/fb-watchman": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+      "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+      "peer": true,
+      "dependencies": {
+        "bser": "2.1.1"
+      }
+    },
+    "node_modules/file-entry-cache": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flat-cache": "^3.0.4"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/filter-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
+      "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/finalhandler": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+      "peer": true,
+      "dependencies": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "statuses": "~1.5.0",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/finalhandler/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "peer": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/finalhandler/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "peer": true
+    },
+    "node_modules/find-cache-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+      "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+      "peer": true,
+      "dependencies": {
+        "commondir": "^1.0.1",
+        "make-dir": "^2.0.0",
+        "pkg-dir": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "dependencies": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/flat-cache": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+      "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flatted": "^3.2.9",
+        "keyv": "^4.5.3",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/flatted": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+      "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/flow-enums-runtime": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz",
+      "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==",
+      "peer": true
+    },
+    "node_modules/flow-parser": {
+      "version": "0.238.3",
+      "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.238.3.tgz",
+      "integrity": "sha512-hNUhucq8V6KWSX1skXUS3vnDmrRNuKWzDvEVK5b+n97uMF32zj2y8pmcLDQEqlY5u926B0GYGWT/3XhwDJfLOQ==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.6",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+      "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "license": "MIT",
+      "peer": true,
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/for-each": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+      "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+      "dependencies": {
+        "is-callable": "^1.1.3"
+      }
+    },
+    "node_modules/foreground-child": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
+      "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
+      "license": "ISC",
+      "dependencies": {
+        "cross-spawn": "^7.0.0",
+        "signal-exit": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/foreground-child/node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fraction.js": {
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+      "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "type": "patreon",
+        "url": "https://github.com/sponsors/rawify"
+      }
+    },
+    "node_modules/fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fs-extra": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+      "peer": true,
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=6 <7 || >=8"
+      }
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/function.prototype.name": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+      "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1",
+        "functions-have-names": "^1.2.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/functions-have-names": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/futoin-hkdf": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.3.tgz",
+      "integrity": "sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "peer": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+      "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-nonce": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+      "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/get-port-please": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz",
+      "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ=="
+    },
+    "node_modules/get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/get-symbol-description": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+      "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.5",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-tsconfig": {
+      "version": "4.7.5",
+      "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
+      "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "resolve-pkg-maps": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+      }
+    },
+    "node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/globalthis": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+      "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-properties": "^1.2.1",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/globby": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.2.9",
+        "ignore": "^5.2.0",
+        "merge2": "^1.4.1",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+      "dependencies": {
+        "get-intrinsic": "^1.1.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+    },
+    "node_modules/graphemer": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/h3": {
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/h3/-/h3-1.12.0.tgz",
+      "integrity": "sha512-Zi/CcNeWBXDrFNlV0hUBJQR9F7a96RjMeAZweW/ZWkR9fuXrMcvKnSA63f/zZ9l0GgQOZDVHGvXivNN9PWOwhA==",
+      "dependencies": {
+        "cookie-es": "^1.1.0",
+        "crossws": "^0.2.4",
+        "defu": "^6.1.4",
+        "destr": "^2.0.3",
+        "iron-webcrypto": "^1.1.1",
+        "ohash": "^1.1.3",
+        "radix3": "^1.1.2",
+        "ufo": "^1.5.3",
+        "uncrypto": "^0.1.3",
+        "unenv": "^1.9.0"
+      }
+    },
+    "node_modules/has-bigints": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+      "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "dependencies": {
+        "es-define-property": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-proto": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "dependencies": {
+        "has-symbols": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/hermes-estree": {
+      "version": "0.19.1",
+      "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.19.1.tgz",
+      "integrity": "sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==",
+      "peer": true
+    },
+    "node_modules/hermes-parser": {
+      "version": "0.19.1",
+      "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.19.1.tgz",
+      "integrity": "sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==",
+      "peer": true,
+      "dependencies": {
+        "hermes-estree": "0.19.1"
+      }
+    },
+    "node_modules/hermes-profile-transformer": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz",
+      "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==",
+      "peer": true,
+      "dependencies": {
+        "source-map": "^0.7.3"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/hey-listen": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz",
+      "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q=="
+    },
+    "node_modules/hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+      "dependencies": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "node_modules/http-errors": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+      "peer": true,
+      "dependencies": {
+        "depd": "2.0.0",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "toidentifier": "1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/http-errors/node_modules/statuses": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/http-shutdown": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz",
+      "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==",
+      "engines": {
+        "iojs": ">= 1.0.0",
+        "node": ">= 0.12.0"
+      }
+    },
+    "node_modules/human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+      "peer": true,
+      "engines": {
+        "node": ">=10.17.0"
+      }
+    },
+    "node_modules/i18next": {
+      "version": "23.2.3",
+      "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.2.3.tgz",
+      "integrity": "sha512-5spO7L0rNmW0jFuNhz+gfirlFt1anle4mTy4+gFkgsH0+T3R5++4oncBrzeKa7v8pweRyGBoGmOpboqlxovg6A==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://locize.com"
+        },
+        {
+          "type": "individual",
+          "url": "https://locize.com/i18next.html"
+        },
+        {
+          "type": "individual",
+          "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+        }
+      ],
+      "peer": true,
+      "dependencies": {
+        "@babel/runtime": "^7.22.5"
+      }
+    },
+    "node_modules/i18next-browser-languagedetector": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.1.0.tgz",
+      "integrity": "sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==",
+      "dependencies": {
+        "@babel/runtime": "^7.19.4"
+      }
+    },
+    "node_modules/idb-keyval": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz",
+      "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg=="
+    },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/ignore": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
+      "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/image-size": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz",
+      "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==",
+      "peer": true,
+      "dependencies": {
+        "queue": "6.0.2"
+      },
+      "bin": {
+        "image-size": "bin/image-size.js"
+      },
+      "engines": {
+        "node": ">=16.x"
+      }
+    },
+    "node_modules/immer": {
+      "version": "10.1.1",
+      "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz",
+      "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/immer"
+      }
+    },
+    "node_modules/import-fresh": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
+      "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
+      "peer": true,
+      "dependencies": {
+        "caller-path": "^2.0.0",
+        "resolve-from": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "engines": {
+        "node": ">=0.8.19"
+      }
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "node_modules/internal-slot": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+      "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "hasown": "^2.0.0",
+        "side-channel": "^1.0.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/invariant": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+      "dependencies": {
+        "loose-envify": "^1.0.0"
+      }
+    },
+    "node_modules/iron-webcrypto": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz",
+      "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==",
+      "funding": {
+        "url": "https://github.com/sponsors/brc-dd"
+      }
+    },
+    "node_modules/is-arguments": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
+      "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-array-buffer": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+      "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+      "peer": true
+    },
+    "node_modules/is-async-function": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
+      "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-bigint": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-bigints": "^1.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-boolean-object": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-callable": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.14.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz",
+      "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==",
+      "dependencies": {
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-data-view": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+      "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-date-object": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+      "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-docker": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+      "bin": {
+        "is-docker": "cli.js"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-finalizationregistry": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
+      "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-generator-function": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+      "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+      "dependencies": {
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-hex-prefixed": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz",
+      "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.5.0",
+        "npm": ">=3"
+      }
+    },
+    "node_modules/is-inside-container": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+      "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+      "dependencies": {
+        "is-docker": "^3.0.0"
+      },
+      "bin": {
+        "is-inside-container": "cli.js"
+      },
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-inside-container/node_modules/is-docker": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+      "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+      "bin": {
+        "is-docker": "cli.js"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-interactive": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-map": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+      "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-negative-zero": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+      "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-number-object": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+      "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-path-inside": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "peer": true,
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-regex": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-set": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+      "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-shared-array-buffer": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+      "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-string": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-symbol": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-symbols": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-typed-array": {
+      "version": "1.1.13",
+      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+      "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+      "dependencies": {
+        "which-typed-array": "^1.1.14"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "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==",
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-weakmap": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+      "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-weakref": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+      "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-weakset": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
+      "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "get-intrinsic": "^1.2.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "dependencies": {
+        "is-docker": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is64bit": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz",
+      "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==",
+      "dependencies": {
+        "system-architecture": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+    },
+    "node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/isomorphic-unfetch": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz",
+      "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==",
+      "dependencies": {
+        "node-fetch": "^2.6.1",
+        "unfetch": "^4.2.0"
+      }
+    },
+    "node_modules/isows": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz",
+      "integrity": "sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/wagmi-dev"
+        }
+      ],
+      "peerDependencies": {
+        "ws": "*"
+      }
+    },
+    "node_modules/iterator.prototype": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
+      "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-properties": "^1.2.1",
+        "get-intrinsic": "^1.2.1",
+        "has-symbols": "^1.0.3",
+        "reflect.getprototypeof": "^1.0.4",
+        "set-function-name": "^2.0.1"
+      }
+    },
+    "node_modules/jackspeak": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz",
+      "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==",
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
+    "node_modules/jest-environment-node": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
+      "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
+      "peer": true,
+      "dependencies": {
+        "@jest/environment": "^29.7.0",
+        "@jest/fake-timers": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "jest-mock": "^29.7.0",
+        "jest-util": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/jest-get-type": {
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+      "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+      "peer": true,
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/jest-message-util": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
+      "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+      "peer": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.12.13",
+        "@jest/types": "^29.6.3",
+        "@types/stack-utils": "^2.0.0",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.9",
+        "micromatch": "^4.0.4",
+        "pretty-format": "^29.7.0",
+        "slash": "^3.0.0",
+        "stack-utils": "^2.0.3"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/jest-message-util/node_modules/ansi-styles": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/jest-message-util/node_modules/pretty-format": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+      "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+      "peer": true,
+      "dependencies": {
+        "@jest/schemas": "^29.6.3",
+        "ansi-styles": "^5.0.0",
+        "react-is": "^18.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/jest-message-util/node_modules/react-is": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+      "peer": true
+    },
+    "node_modules/jest-mock": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+      "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "jest-util": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/jest-util": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+      "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "ci-info": "^3.2.0",
+        "graceful-fs": "^4.2.9",
+        "picomatch": "^2.2.3"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/jest-validate": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
+      "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^29.6.3",
+        "camelcase": "^6.2.0",
+        "chalk": "^4.0.0",
+        "jest-get-type": "^29.6.3",
+        "leven": "^3.1.0",
+        "pretty-format": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/jest-validate/node_modules/ansi-styles": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/jest-validate/node_modules/camelcase": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/jest-validate/node_modules/pretty-format": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+      "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+      "peer": true,
+      "dependencies": {
+        "@jest/schemas": "^29.6.3",
+        "ansi-styles": "^5.0.0",
+        "react-is": "^18.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/jest-validate/node_modules/react-is": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+      "peer": true
+    },
+    "node_modules/jest-worker": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+      "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+      "peer": true,
+      "dependencies": {
+        "@types/node": "*",
+        "jest-util": "^29.7.0",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^8.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/jest-worker/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==",
+      "peer": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
+      }
+    },
+    "node_modules/jiti": {
+      "version": "1.21.6",
+      "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
+      "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
+      "bin": {
+        "jiti": "bin/jiti.js"
+      }
+    },
+    "node_modules/joi": {
+      "version": "17.13.3",
+      "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
+      "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
+      "dependencies": {
+        "@hapi/hoek": "^9.3.0",
+        "@hapi/topo": "^5.1.0",
+        "@sideway/address": "^4.1.5",
+        "@sideway/formula": "^3.0.1",
+        "@sideway/pinpoint": "^2.0.0"
+      }
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "node_modules/js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "peer": true,
+      "dependencies": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/jsc-android": {
+      "version": "250231.0.0",
+      "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz",
+      "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==",
+      "peer": true
+    },
+    "node_modules/jsc-safe-url": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz",
+      "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==",
+      "peer": true
+    },
+    "node_modules/jscodeshift": {
+      "version": "0.14.0",
+      "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz",
+      "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==",
+      "peer": true,
+      "dependencies": {
+        "@babel/core": "^7.13.16",
+        "@babel/parser": "^7.13.16",
+        "@babel/plugin-proposal-class-properties": "^7.13.0",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8",
+        "@babel/plugin-proposal-optional-chaining": "^7.13.12",
+        "@babel/plugin-transform-modules-commonjs": "^7.13.8",
+        "@babel/preset-flow": "^7.13.13",
+        "@babel/preset-typescript": "^7.13.0",
+        "@babel/register": "^7.13.16",
+        "babel-core": "^7.0.0-bridge.0",
+        "chalk": "^4.1.2",
+        "flow-parser": "0.*",
+        "graceful-fs": "^4.2.4",
+        "micromatch": "^4.0.4",
+        "neo-async": "^2.5.0",
+        "node-dir": "^0.1.17",
+        "recast": "^0.21.0",
+        "temp": "^0.8.4",
+        "write-file-atomic": "^2.3.0"
+      },
+      "bin": {
+        "jscodeshift": "bin/jscodeshift.js"
+      },
+      "peerDependencies": {
+        "@babel/preset-env": "^7.1.6"
+      }
+    },
+    "node_modules/jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "peer": true,
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/json-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "peer": true
+    },
+    "node_modules/json-rpc-engine": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz",
+      "integrity": "sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==",
+      "dependencies": {
+        "@metamask/safe-event-emitter": "^2.0.0",
+        "eth-rpc-errors": "^4.0.2"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/json-rpc-engine/node_modules/@metamask/safe-event-emitter": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz",
+      "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q=="
+    },
+    "node_modules/json-rpc-random-id": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz",
+      "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA=="
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "peer": true,
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+      "peer": true,
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "node_modules/jsx-ast-utils": {
+      "version": "3.3.5",
+      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+      "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "array-includes": "^3.1.6",
+        "array.prototype.flat": "^1.3.1",
+        "object.assign": "^4.1.4",
+        "object.values": "^1.1.6"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/keccak": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz",
+      "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "node-addon-api": "^2.0.0",
+        "node-gyp-build": "^4.2.0",
+        "readable-stream": "^3.6.0"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/keyv": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "json-buffer": "3.0.1"
+      }
+    },
+    "node_modules/keyvaluestorage-interface": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz",
+      "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g=="
+    },
+    "node_modules/kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/kleur": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/language-subtag-registry": {
+      "version": "0.3.23",
+      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+      "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+      "dev": true,
+      "license": "CC0-1.0"
+    },
+    "node_modules/language-tags": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+      "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "language-subtag-registry": "^0.3.20"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/ldrs": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/ldrs/-/ldrs-1.0.2.tgz",
+      "integrity": "sha512-sYJmivdkIiHrUEqTrEWccBoLdaENpzbzkABI5rk8rRxTXrg9i2xVuDvUUuhOhJY3RmQyaoxs046pM1DCRdcIpg=="
+    },
+    "node_modules/leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/lighthouse-logger": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz",
+      "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==",
+      "peer": true,
+      "dependencies": {
+        "debug": "^2.6.9",
+        "marky": "^1.2.2"
+      }
+    },
+    "node_modules/lighthouse-logger/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "peer": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/lighthouse-logger/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "peer": true
+    },
+    "node_modules/lilconfig": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+      "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+      "license": "MIT"
+    },
+    "node_modules/listhen": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.7.2.tgz",
+      "integrity": "sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==",
+      "dependencies": {
+        "@parcel/watcher": "^2.4.1",
+        "@parcel/watcher-wasm": "^2.4.1",
+        "citty": "^0.1.6",
+        "clipboardy": "^4.0.0",
+        "consola": "^3.2.3",
+        "crossws": "^0.2.0",
+        "defu": "^6.1.4",
+        "get-port-please": "^3.1.2",
+        "h3": "^1.10.2",
+        "http-shutdown": "^1.2.2",
+        "jiti": "^1.21.0",
+        "mlly": "^1.6.1",
+        "node-forge": "^1.3.1",
+        "pathe": "^1.1.2",
+        "std-env": "^3.7.0",
+        "ufo": "^1.4.0",
+        "untun": "^0.1.3",
+        "uqr": "^0.1.2"
+      },
+      "bin": {
+        "listen": "bin/listhen.mjs",
+        "listhen": "bin/listhen.mjs"
+      }
+    },
+    "node_modules/lit": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz",
+      "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==",
+      "dependencies": {
+        "@lit/reactive-element": "^1.6.0",
+        "lit-element": "^3.3.0",
+        "lit-html": "^2.8.0"
+      }
+    },
+    "node_modules/lit-element": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz",
+      "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==",
+      "dependencies": {
+        "@lit-labs/ssr-dom-shim": "^1.1.0",
+        "@lit/reactive-element": "^1.3.0",
+        "lit-html": "^2.8.0"
+      }
+    },
+    "node_modules/lit-html": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz",
+      "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==",
+      "dependencies": {
+        "@types/trusted-types": "^2.0.2"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "dependencies": {
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+      "peer": true
+    },
+    "node_modules/lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+    },
+    "node_modules/lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/lodash.throttle": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
+      "peer": true
+    },
+    "node_modules/log-symbols": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+      "peer": true,
+      "dependencies": {
+        "chalk": "^4.1.0",
+        "is-unicode-supported": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/logkitty": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz",
+      "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==",
+      "peer": true,
+      "dependencies": {
+        "ansi-fragments": "^0.2.1",
+        "dayjs": "^1.8.15",
+        "yargs": "^15.1.0"
+      },
+      "bin": {
+        "logkitty": "bin/logkitty.js"
+      }
+    },
+    "node_modules/loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "dependencies": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      },
+      "bin": {
+        "loose-envify": "cli.js"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "peer": true,
+      "dependencies": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "node_modules/make-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+      "peer": true,
+      "dependencies": {
+        "pify": "^4.0.1",
+        "semver": "^5.6.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/make-dir/node_modules/pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/make-dir/node_modules/semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "peer": true,
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/makeerror": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+      "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+      "peer": true,
+      "dependencies": {
+        "tmpl": "1.0.5"
+      }
+    },
+    "node_modules/marky": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz",
+      "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==",
+      "peer": true
+    },
+    "node_modules/media-query-parser": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz",
+      "integrity": "sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==",
+      "dependencies": {
+        "@babel/runtime": "^7.12.5"
+      }
+    },
+    "node_modules/memoize-one": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
+      "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==",
+      "peer": true
+    },
+    "node_modules/merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/metro": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.9.tgz",
+      "integrity": "sha512-Bc57Xf3GO2Xe4UWQsBj/oW6YfLPABEu8jfDVDiNmJvoQW4CO34oDPuYKe4KlXzXhcuNsqOtSxpbjCRRVjhhREg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.0.0",
+        "@babel/core": "^7.20.0",
+        "@babel/generator": "^7.20.0",
+        "@babel/parser": "^7.20.0",
+        "@babel/template": "^7.0.0",
+        "@babel/traverse": "^7.20.0",
+        "@babel/types": "^7.20.0",
+        "accepts": "^1.3.7",
+        "chalk": "^4.0.0",
+        "ci-info": "^2.0.0",
+        "connect": "^3.6.5",
+        "debug": "^2.2.0",
+        "denodeify": "^1.2.1",
+        "error-stack-parser": "^2.0.6",
+        "graceful-fs": "^4.2.4",
+        "hermes-parser": "0.20.1",
+        "image-size": "^1.0.2",
+        "invariant": "^2.2.4",
+        "jest-worker": "^29.6.3",
+        "jsc-safe-url": "^0.2.2",
+        "lodash.throttle": "^4.1.1",
+        "metro-babel-transformer": "0.80.9",
+        "metro-cache": "0.80.9",
+        "metro-cache-key": "0.80.9",
+        "metro-config": "0.80.9",
+        "metro-core": "0.80.9",
+        "metro-file-map": "0.80.9",
+        "metro-resolver": "0.80.9",
+        "metro-runtime": "0.80.9",
+        "metro-source-map": "0.80.9",
+        "metro-symbolicate": "0.80.9",
+        "metro-transform-plugins": "0.80.9",
+        "metro-transform-worker": "0.80.9",
+        "mime-types": "^2.1.27",
+        "node-fetch": "^2.2.0",
+        "nullthrows": "^1.1.1",
+        "rimraf": "^3.0.2",
+        "serialize-error": "^2.1.0",
+        "source-map": "^0.5.6",
+        "strip-ansi": "^6.0.0",
+        "throat": "^5.0.0",
+        "ws": "^7.5.1",
+        "yargs": "^17.6.2"
+      },
+      "bin": {
+        "metro": "src/cli.js"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/metro-babel-transformer": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.9.tgz",
+      "integrity": "sha512-d76BSm64KZam1nifRZlNJmtwIgAeZhZG3fi3K+EmPOlrR8rDtBxQHDSN3fSGeNB9CirdTyabTMQCkCup6BXFSQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/core": "^7.20.0",
+        "hermes-parser": "0.20.1",
+        "nullthrows": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/metro-babel-transformer/node_modules/hermes-estree": {
+      "version": "0.20.1",
+      "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.20.1.tgz",
+      "integrity": "sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==",
+      "peer": true
+    },
+    "node_modules/metro-babel-transformer/node_modules/hermes-parser": {
+      "version": "0.20.1",
+      "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.20.1.tgz",
+      "integrity": "sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==",
+      "peer": true,
+      "dependencies": {
+        "hermes-estree": "0.20.1"
+      }
+    },
+    "node_modules/metro-cache": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.9.tgz",
+      "integrity": "sha512-ujEdSI43QwI+Dj2xuNax8LMo8UgKuXJEdxJkzGPU6iIx42nYa1byQ+aADv/iPh5sh5a//h5FopraW5voXSgm2w==",
+      "peer": true,
+      "dependencies": {
+        "metro-core": "0.80.9",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/metro-cache-key": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.9.tgz",
+      "integrity": "sha512-hRcYGhEiWIdM87hU0fBlcGr+tHDEAT+7LYNCW89p5JhErFt/QaAkVx4fb5bW3YtXGv5BTV7AspWPERoIb99CXg==",
+      "peer": true,
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/metro-config": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.9.tgz",
+      "integrity": "sha512-28wW7CqS3eJrunRGnsibWldqgwRP9ywBEf7kg+uzUHkSFJNKPM1K3UNSngHmH0EZjomizqQA2Zi6/y6VdZMolg==",
+      "peer": true,
+      "dependencies": {
+        "connect": "^3.6.5",
+        "cosmiconfig": "^5.0.5",
+        "jest-validate": "^29.6.3",
+        "metro": "0.80.9",
+        "metro-cache": "0.80.9",
+        "metro-core": "0.80.9",
+        "metro-runtime": "0.80.9"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/metro-core": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.9.tgz",
+      "integrity": "sha512-tbltWQn+XTdULkGdzHIxlxk4SdnKxttvQQV3wpqqFbHDteR4gwCyTR2RyYJvxgU7HELfHtrVbqgqAdlPByUSbg==",
+      "peer": true,
+      "dependencies": {
+        "lodash.throttle": "^4.1.1",
+        "metro-resolver": "0.80.9"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/metro-file-map": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.9.tgz",
+      "integrity": "sha512-sBUjVtQMHagItJH/wGU9sn3k2u0nrCl0CdR4SFMO1tksXLKbkigyQx4cbpcyPVOAmGTVuy3jyvBlELaGCAhplQ==",
+      "peer": true,
+      "dependencies": {
+        "anymatch": "^3.0.3",
+        "debug": "^2.2.0",
+        "fb-watchman": "^2.0.0",
+        "graceful-fs": "^4.2.4",
+        "invariant": "^2.2.4",
+        "jest-worker": "^29.6.3",
+        "micromatch": "^4.0.4",
+        "node-abort-controller": "^3.1.1",
+        "nullthrows": "^1.1.1",
+        "walker": "^1.0.7"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "fsevents": "^2.3.2"
+      }
+    },
+    "node_modules/metro-file-map/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "peer": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/metro-file-map/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "peer": true
+    },
+    "node_modules/metro-minify-terser": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.9.tgz",
+      "integrity": "sha512-FEeCeFbkvvPuhjixZ1FYrXtO0araTpV6UbcnGgDUpH7s7eR5FG/PiJz3TsuuPP/HwCK19cZtQydcA2QrCw446A==",
+      "peer": true,
+      "dependencies": {
+        "terser": "^5.15.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/metro-resolver": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.9.tgz",
+      "integrity": "sha512-wAPIjkN59BQN6gocVsAvvpZ1+LQkkqUaswlT++cJafE/e54GoVkMNCmrR4BsgQHr9DknZ5Um/nKueeN7kaEz9w==",
+      "peer": true,
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/metro-runtime": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.9.tgz",
+      "integrity": "sha512-8PTVIgrVcyU+X/rVCy/9yxNlvXsBCk5JwwkbAm/Dm+Abo6NBGtNjWF0M1Xo/NWCb4phamNWcD7cHdR91HhbJvg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/runtime": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/metro-source-map": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.9.tgz",
+      "integrity": "sha512-RMn+XS4VTJIwMPOUSj61xlxgBvPeY4G6s5uIn6kt6HB6A/k9ekhr65UkkDD7WzHYs3a9o869qU8tvOZvqeQzgw==",
+      "peer": true,
+      "dependencies": {
+        "@babel/traverse": "^7.20.0",
+        "@babel/types": "^7.20.0",
+        "invariant": "^2.2.4",
+        "metro-symbolicate": "0.80.9",
+        "nullthrows": "^1.1.1",
+        "ob1": "0.80.9",
+        "source-map": "^0.5.6",
+        "vlq": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/metro-source-map/node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/metro-symbolicate": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.9.tgz",
+      "integrity": "sha512-Ykae12rdqSs98hg41RKEToojuIW85wNdmSe/eHUgMkzbvCFNVgcC0w3dKZEhSsqQOXapXRlLtHkaHLil0UD/EA==",
+      "peer": true,
+      "dependencies": {
+        "invariant": "^2.2.4",
+        "metro-source-map": "0.80.9",
+        "nullthrows": "^1.1.1",
+        "source-map": "^0.5.6",
+        "through2": "^2.0.1",
+        "vlq": "^1.0.0"
+      },
+      "bin": {
+        "metro-symbolicate": "src/index.js"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/metro-symbolicate/node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/metro-transform-plugins": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.9.tgz",
+      "integrity": "sha512-UlDk/uc8UdfLNJhPbF3tvwajyuuygBcyp+yBuS/q0z3QSuN/EbLllY3rK8OTD9n4h00qZ/qgxGv/lMFJkwP4vg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/core": "^7.20.0",
+        "@babel/generator": "^7.20.0",
+        "@babel/template": "^7.0.0",
+        "@babel/traverse": "^7.20.0",
+        "nullthrows": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/metro-transform-worker": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.9.tgz",
+      "integrity": "sha512-c/IrzMUVnI0hSVVit4TXzt3A1GiUltGVlzCmLJWxNrBGHGrJhvgePj38+GXl1Xf4Fd4vx6qLUkKMQ3ux73bFLQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/core": "^7.20.0",
+        "@babel/generator": "^7.20.0",
+        "@babel/parser": "^7.20.0",
+        "@babel/types": "^7.20.0",
+        "metro": "0.80.9",
+        "metro-babel-transformer": "0.80.9",
+        "metro-cache": "0.80.9",
+        "metro-cache-key": "0.80.9",
+        "metro-minify-terser": "0.80.9",
+        "metro-source-map": "0.80.9",
+        "metro-transform-plugins": "0.80.9",
+        "nullthrows": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/metro/node_modules/ci-info": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+      "peer": true
+    },
+    "node_modules/metro/node_modules/cliui": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+      "peer": true,
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.1",
+        "wrap-ansi": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/metro/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "peer": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/metro/node_modules/hermes-estree": {
+      "version": "0.20.1",
+      "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.20.1.tgz",
+      "integrity": "sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==",
+      "peer": true
+    },
+    "node_modules/metro/node_modules/hermes-parser": {
+      "version": "0.20.1",
+      "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.20.1.tgz",
+      "integrity": "sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==",
+      "peer": true,
+      "dependencies": {
+        "hermes-estree": "0.20.1"
+      }
+    },
+    "node_modules/metro/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "peer": true
+    },
+    "node_modules/metro/node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/metro/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==",
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/metro/node_modules/ws": {
+      "version": "7.5.10",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+      "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+      "peer": true,
+      "engines": {
+        "node": ">=8.3.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": "^5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/metro/node_modules/y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/metro/node_modules/yargs": {
+      "version": "17.7.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+      "peer": true,
+      "dependencies": {
+        "cliui": "^8.0.1",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.3",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^21.1.1"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/metro/node_modules/yargs-parser": {
+      "version": "21.1.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+      "peer": true,
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/micro-ftch": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz",
+      "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg=="
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
+      "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
+      "dependencies": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/mime": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+      "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+      "peer": true,
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "peer": true,
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/mini-svg-data-uri": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
+      "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
+      "license": "MIT",
+      "bin": {
+        "mini-svg-data-uri": "cli.js"
+      }
+    },
+    "node_modules/minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+    },
+    "node_modules/minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/minipass": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/mipd": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/mipd/-/mipd-0.0.5.tgz",
+      "integrity": "sha512-gbKA784D2WKb5H/GtqEv+Ofd1S9Zj+Z/PGDIl1u1QAbswkxD28BQ5bSXQxkeBzPBABg1iDSbiwGG1XqlOxRspA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/wagmi-dev"
+        }
+      ],
+      "dependencies": {
+        "viem": "^1.1.4"
+      },
+      "peerDependencies": {
+        "typescript": ">=5.0.4"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/mipd/node_modules/abitype": {
+      "version": "0.9.8",
+      "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.8.tgz",
+      "integrity": "sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/wagmi-dev"
+        }
+      ],
+      "peerDependencies": {
+        "typescript": ">=5.0.4",
+        "zod": "^3 >=3.19.1"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        },
+        "zod": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/mipd/node_modules/viem": {
+      "version": "1.21.4",
+      "resolved": "https://registry.npmjs.org/viem/-/viem-1.21.4.tgz",
+      "integrity": "sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/wevm"
+        }
+      ],
+      "dependencies": {
+        "@adraffy/ens-normalize": "1.10.0",
+        "@noble/curves": "1.2.0",
+        "@noble/hashes": "1.3.2",
+        "@scure/bip32": "1.3.2",
+        "@scure/bip39": "1.2.1",
+        "abitype": "0.9.8",
+        "isows": "1.0.3",
+        "ws": "8.13.0"
+      },
+      "peerDependencies": {
+        "typescript": ">=5.0.4"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/mkdirp": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+      "peer": true,
+      "dependencies": {
+        "minimist": "^1.2.6"
+      },
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      }
+    },
+    "node_modules/mlly": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz",
+      "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==",
+      "dependencies": {
+        "acorn": "^8.11.3",
+        "pathe": "^1.1.2",
+        "pkg-types": "^1.1.1",
+        "ufo": "^1.5.3"
+      }
+    },
+    "node_modules/modern-ahocorasick": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/modern-ahocorasick/-/modern-ahocorasick-1.0.1.tgz",
+      "integrity": "sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA=="
+    },
+    "node_modules/motion": {
+      "version": "10.16.2",
+      "resolved": "https://registry.npmjs.org/motion/-/motion-10.16.2.tgz",
+      "integrity": "sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==",
+      "dependencies": {
+        "@motionone/animation": "^10.15.1",
+        "@motionone/dom": "^10.16.2",
+        "@motionone/svelte": "^10.16.2",
+        "@motionone/types": "^10.15.1",
+        "@motionone/utils": "^10.15.1",
+        "@motionone/vue": "^10.16.2"
+      }
+    },
+    "node_modules/mri": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+      "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "node_modules/multiformats": {
+      "version": "9.9.0",
+      "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
+      "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
+    },
+    "node_modules/mz": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+      "license": "MIT",
+      "dependencies": {
+        "any-promise": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "thenify-all": "^1.0.0"
+      }
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "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",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "peer": true
+    },
+    "node_modules/next": {
+      "version": "14.2.4",
+      "resolved": "https://registry.npmjs.org/next/-/next-14.2.4.tgz",
+      "integrity": "sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ==",
+      "dependencies": {
+        "@next/env": "14.2.4",
+        "@swc/helpers": "0.5.5",
+        "busboy": "1.6.0",
+        "caniuse-lite": "^1.0.30001579",
+        "graceful-fs": "^4.2.11",
+        "postcss": "8.4.31",
+        "styled-jsx": "5.1.1"
+      },
+      "bin": {
+        "next": "dist/bin/next"
+      },
+      "engines": {
+        "node": ">=18.17.0"
+      },
+      "optionalDependencies": {
+        "@next/swc-darwin-arm64": "14.2.4",
+        "@next/swc-darwin-x64": "14.2.4",
+        "@next/swc-linux-arm64-gnu": "14.2.4",
+        "@next/swc-linux-arm64-musl": "14.2.4",
+        "@next/swc-linux-x64-gnu": "14.2.4",
+        "@next/swc-linux-x64-musl": "14.2.4",
+        "@next/swc-win32-arm64-msvc": "14.2.4",
+        "@next/swc-win32-ia32-msvc": "14.2.4",
+        "@next/swc-win32-x64-msvc": "14.2.4"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.1.0",
+        "@playwright/test": "^1.41.2",
+        "react": "^18.2.0",
+        "react-dom": "^18.2.0",
+        "sass": "^1.3.0"
+      },
+      "peerDependenciesMeta": {
+        "@opentelemetry/api": {
+          "optional": true
+        },
+        "@playwright/test": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/next/node_modules/postcss": {
+      "version": "8.4.31",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+      "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.6",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/nocache": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz",
+      "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==",
+      "peer": true,
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/node-abort-controller": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
+      "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==",
+      "peer": true
+    },
+    "node_modules/node-addon-api": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
+      "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA=="
+    },
+    "node_modules/node-dir": {
+      "version": "0.1.17",
+      "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz",
+      "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==",
+      "peer": true,
+      "dependencies": {
+        "minimatch": "^3.0.2"
+      },
+      "engines": {
+        "node": ">= 0.10.5"
+      }
+    },
+    "node_modules/node-fetch": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+      "dependencies": {
+        "whatwg-url": "^5.0.0"
+      },
+      "engines": {
+        "node": "4.x || >=6.0.0"
+      },
+      "peerDependencies": {
+        "encoding": "^0.1.0"
+      },
+      "peerDependenciesMeta": {
+        "encoding": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/node-fetch-native": {
+      "version": "1.6.4",
+      "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz",
+      "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ=="
+    },
+    "node_modules/node-forge": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
+      "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
+      "engines": {
+        "node": ">= 6.13.0"
+      }
+    },
+    "node_modules/node-gyp-build": {
+      "version": "4.8.1",
+      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz",
+      "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==",
+      "bin": {
+        "node-gyp-build": "bin.js",
+        "node-gyp-build-optional": "optional.js",
+        "node-gyp-build-test": "build-test.js"
+      }
+    },
+    "node_modules/node-int64": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+      "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+      "peer": true
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.14",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+      "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
+    },
+    "node_modules/node-stream-zip": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz",
+      "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.12.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/antelle"
+      }
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "peer": true,
+      "dependencies": {
+        "path-key": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/nullthrows": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
+      "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==",
+      "peer": true
+    },
+    "node_modules/ob1": {
+      "version": "0.80.9",
+      "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.9.tgz",
+      "integrity": "sha512-v9yOxowkZbxWhKOaaTyLjIm1aLy4ebMNcSn4NYJKOAI/Qv+SkfEfszpLr2GIxsccmb2Y2HA9qtsqiIJ80ucpVA==",
+      "peer": true,
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/obj-multiplex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/obj-multiplex/-/obj-multiplex-1.0.0.tgz",
+      "integrity": "sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==",
+      "dependencies": {
+        "end-of-stream": "^1.4.0",
+        "once": "^1.4.0",
+        "readable-stream": "^2.3.3"
+      }
+    },
+    "node_modules/obj-multiplex/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/obj-multiplex/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/obj-multiplex/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-hash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+      "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
+      "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object-is": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
+      "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object.assign": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+      "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.5",
+        "define-properties": "^1.2.1",
+        "has-symbols": "^1.0.3",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object.entries": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
+      "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object.fromentries": {
+      "version": "2.0.8",
+      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+      "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object.groupby": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+      "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object.hasown": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz",
+      "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object.values": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
+      "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/ofetch": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.3.4.tgz",
+      "integrity": "sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==",
+      "dependencies": {
+        "destr": "^2.0.3",
+        "node-fetch-native": "^1.6.3",
+        "ufo": "^1.5.3"
+      }
+    },
+    "node_modules/ohash": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz",
+      "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw=="
+    },
+    "node_modules/on-exit-leak-free": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz",
+      "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg=="
+    },
+    "node_modules/on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+      "peer": true,
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "peer": true,
+      "dependencies": {
+        "mimic-fn": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/open": {
+      "version": "8.4.2",
+      "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+      "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+      "dependencies": {
+        "define-lazy-prop": "^2.0.0",
+        "is-docker": "^2.1.1",
+        "is-wsl": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/openpgp": {
+      "version": "5.11.2",
+      "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-5.11.2.tgz",
+      "integrity": "sha512-f8dJFVLwdkvPvW3VPFs6q9Vs2+HNhdvwls7a/MIFcQUB+XiQzRe7alfa3RtwfGJU7oUDDMAWPZ0nYsHa23Az+A==",
+      "license": "LGPL-3.0+",
+      "dependencies": {
+        "asn1.js": "^5.0.0"
+      },
+      "engines": {
+        "node": ">= 8.0.0"
+      }
+    },
+    "node_modules/optionator": {
+      "version": "0.9.4",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.5"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/ora": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+      "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+      "peer": true,
+      "dependencies": {
+        "bl": "^4.1.0",
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-spinners": "^2.5.0",
+        "is-interactive": "^1.0.0",
+        "is-unicode-supported": "^0.1.0",
+        "log-symbols": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "wcwidth": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/outdent": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz",
+      "integrity": "sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A=="
+    },
+    "node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/package-json-from-dist": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
+      "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
+      "license": "BlueOak-1.0.0"
+    },
+    "node_modules/parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "callsites": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/parent-module/node_modules/callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+      "peer": true,
+      "dependencies": {
+        "error-ex": "^1.3.1",
+        "json-parse-better-errors": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "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==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+    },
+    "node_modules/path-scurry": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+      "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+      "license": "BlueOak-1.0.0",
+      "dependencies": {
+        "lru-cache": "^10.2.0",
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/path-scurry/node_modules/lru-cache": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz",
+      "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==",
+      "license": "ISC",
+      "engines": {
+        "node": "14 || >=16.14"
+      }
+    },
+    "node_modules/path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pathe": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
+    },
+    "node_modules/picocolors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pify": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+      "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/pino": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz",
+      "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==",
+      "dependencies": {
+        "atomic-sleep": "^1.0.0",
+        "fast-redact": "^3.0.0",
+        "on-exit-leak-free": "^0.2.0",
+        "pino-abstract-transport": "v0.5.0",
+        "pino-std-serializers": "^4.0.0",
+        "process-warning": "^1.0.0",
+        "quick-format-unescaped": "^4.0.3",
+        "real-require": "^0.1.0",
+        "safe-stable-stringify": "^2.1.0",
+        "sonic-boom": "^2.2.1",
+        "thread-stream": "^0.15.1"
+      },
+      "bin": {
+        "pino": "bin.js"
+      }
+    },
+    "node_modules/pino-abstract-transport": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz",
+      "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==",
+      "dependencies": {
+        "duplexify": "^4.1.2",
+        "split2": "^4.0.0"
+      }
+    },
+    "node_modules/pino-std-serializers": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz",
+      "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q=="
+    },
+    "node_modules/pirates": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+      "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/pkg-dir": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+      "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+      "peer": true,
+      "dependencies": {
+        "find-up": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/pkg-dir/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==",
+      "peer": true,
+      "dependencies": {
+        "locate-path": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/pkg-dir/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==",
+      "peer": true,
+      "dependencies": {
+        "p-locate": "^3.0.0",
+        "path-exists": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/pkg-dir/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==",
+      "peer": true,
+      "dependencies": {
+        "p-limit": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/pkg-dir/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==",
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/pkg-types": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz",
+      "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==",
+      "dependencies": {
+        "confbox": "^0.1.7",
+        "mlly": "^1.7.1",
+        "pathe": "^1.1.2"
+      }
+    },
+    "node_modules/pngjs": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
+      "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/pony-cause": {
+      "version": "2.1.11",
+      "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz",
+      "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==",
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/possible-typed-array-names": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+      "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.4.39",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
+      "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.0.1",
+        "source-map-js": "^1.2.0"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/postcss-import": {
+      "version": "15.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+      "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss-value-parser": "^4.0.0",
+        "read-cache": "^1.0.0",
+        "resolve": "^1.1.7"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "postcss": "^8.0.0"
+      }
+    },
+    "node_modules/postcss-js": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+      "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+      "license": "MIT",
+      "dependencies": {
+        "camelcase-css": "^2.0.1"
+      },
+      "engines": {
+        "node": "^12 || ^14 || >= 16"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/postcss/"
+      },
+      "peerDependencies": {
+        "postcss": "^8.4.21"
+      }
+    },
+    "node_modules/postcss-load-config": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+      "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "lilconfig": "^3.0.0",
+        "yaml": "^2.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      },
+      "peerDependencies": {
+        "postcss": ">=8.0.9",
+        "ts-node": ">=9.0.0"
+      },
+      "peerDependenciesMeta": {
+        "postcss": {
+          "optional": true
+        },
+        "ts-node": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/postcss-load-config/node_modules/lilconfig": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
+      "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antonk52"
+      }
+    },
+    "node_modules/postcss-nested": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+      "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss-selector-parser": "^6.0.11"
+      },
+      "engines": {
+        "node": ">=12.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/postcss/"
+      },
+      "peerDependencies": {
+        "postcss": "^8.2.14"
+      }
+    },
+    "node_modules/postcss-selector-parser": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz",
+      "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+      "license": "MIT"
+    },
+    "node_modules/preact": {
+      "version": "10.22.1",
+      "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.1.tgz",
+      "integrity": "sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/preact"
+      }
+    },
+    "node_modules/prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/pretty-format": {
+      "version": "26.6.2",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
+      "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
+      "peer": true,
+      "dependencies": {
+        "@jest/types": "^26.6.2",
+        "ansi-regex": "^5.0.0",
+        "ansi-styles": "^4.0.0",
+        "react-is": "^17.0.1"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/pretty-format/node_modules/@jest/types": {
+      "version": "26.6.2",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
+      "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+      "peer": true,
+      "dependencies": {
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "@types/istanbul-reports": "^3.0.0",
+        "@types/node": "*",
+        "@types/yargs": "^15.0.0",
+        "chalk": "^4.0.0"
+      },
+      "engines": {
+        "node": ">= 10.14.2"
+      }
+    },
+    "node_modules/pretty-format/node_modules/@types/yargs": {
+      "version": "15.0.19",
+      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz",
+      "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==",
+      "peer": true,
+      "dependencies": {
+        "@types/yargs-parser": "*"
+      }
+    },
+    "node_modules/process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+    },
+    "node_modules/process-warning": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz",
+      "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q=="
+    },
+    "node_modules/promise": {
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+      "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+      "peer": true,
+      "dependencies": {
+        "asap": "~2.0.6"
+      }
+    },
+    "node_modules/prompts": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+      "peer": true,
+      "dependencies": {
+        "kleur": "^3.0.3",
+        "sisteransi": "^1.0.5"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/prop-types": {
+      "version": "15.8.1",
+      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+      "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.4.0",
+        "object-assign": "^4.1.1",
+        "react-is": "^16.13.1"
+      }
+    },
+    "node_modules/prop-types/node_modules/react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/proxy-compare": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.5.1.tgz",
+      "integrity": "sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA=="
+    },
+    "node_modules/pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/qr-code-styling": {
+      "version": "1.6.0-rc.1",
+      "resolved": "https://registry.npmjs.org/qr-code-styling/-/qr-code-styling-1.6.0-rc.1.tgz",
+      "integrity": "sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q==",
+      "dependencies": {
+        "qrcode-generator": "^1.4.3"
+      }
+    },
+    "node_modules/qrcode": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz",
+      "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==",
+      "dependencies": {
+        "dijkstrajs": "^1.0.1",
+        "encode-utf8": "^1.0.3",
+        "pngjs": "^5.0.0",
+        "yargs": "^15.3.1"
+      },
+      "bin": {
+        "qrcode": "bin/qrcode"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/qrcode-generator": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.4.4.tgz",
+      "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw=="
+    },
+    "node_modules/qrcode-terminal-nooctal": {
+      "version": "0.12.1",
+      "resolved": "https://registry.npmjs.org/qrcode-terminal-nooctal/-/qrcode-terminal-nooctal-0.12.1.tgz",
+      "integrity": "sha512-jy/kkD0iIMDjTucB+5T6KBsnirlhegDH47vHgrj5MejchSQmi/EAMM0xMFeePgV9CJkkAapNakpVUWYgHvtdKg==",
+      "bin": {
+        "qrcode-terminal": "bin/qrcode-terminal.js"
+      }
+    },
+    "node_modules/query-string": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz",
+      "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==",
+      "dependencies": {
+        "decode-uri-component": "^0.2.2",
+        "filter-obj": "^1.1.0",
+        "split-on-first": "^1.0.0",
+        "strict-uri-encode": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/querystring": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
+      "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==",
+      "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
+      "peer": true,
+      "engines": {
+        "node": ">=0.4.x"
+      }
+    },
+    "node_modules/queue": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
+      "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
+      "peer": true,
+      "dependencies": {
+        "inherits": "~2.0.3"
+      }
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/quick-format-unescaped": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
+      "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="
+    },
+    "node_modules/radix3": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz",
+      "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="
+    },
+    "node_modules/range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/react": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+      "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+      "dependencies": {
+        "loose-envify": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-devtools-core": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.3.0.tgz",
+      "integrity": "sha512-IG3T+azv48Oc5VLdHR4XdBNKNZIUOKRtx0sJMRvb++Zom/uqtx73j6u37JCsIBNIaq6vA7RPH5Bbcf/Wj53KXA==",
+      "peer": true,
+      "dependencies": {
+        "shell-quote": "^1.6.1",
+        "ws": "^7"
+      }
+    },
+    "node_modules/react-devtools-core/node_modules/ws": {
+      "version": "7.5.10",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+      "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+      "peer": true,
+      "engines": {
+        "node": ">=8.3.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": "^5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/react-dom": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+      "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "scheduler": "^0.23.2"
+      },
+      "peerDependencies": {
+        "react": "^18.3.1"
+      }
+    },
+    "node_modules/react-is": {
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+      "peer": true
+    },
+    "node_modules/react-refresh": {
+      "version": "0.14.2",
+      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
+      "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-remove-scroll": {
+      "version": "2.5.7",
+      "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz",
+      "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==",
+      "dependencies": {
+        "react-remove-scroll-bar": "^2.3.4",
+        "react-style-singleton": "^2.2.1",
+        "tslib": "^2.1.0",
+        "use-callback-ref": "^1.3.0",
+        "use-sidecar": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/react-remove-scroll-bar": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz",
+      "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==",
+      "dependencies": {
+        "react-style-singleton": "^2.2.1",
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/react-shallow-renderer": {
+      "version": "16.15.0",
+      "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz",
+      "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==",
+      "peer": true,
+      "dependencies": {
+        "object-assign": "^4.1.1",
+        "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0"
+      },
+      "peerDependencies": {
+        "react": "^16.0.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/react-style-singleton": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
+      "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
+      "dependencies": {
+        "get-nonce": "^1.0.0",
+        "invariant": "^2.2.4",
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+      "license": "MIT",
+      "dependencies": {
+        "pify": "^2.3.0"
+      }
+    },
+    "node_modules/read-cache/node_modules/pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/readline": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz",
+      "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==",
+      "peer": true
+    },
+    "node_modules/real-require": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz",
+      "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==",
+      "engines": {
+        "node": ">= 12.13.0"
+      }
+    },
+    "node_modules/recast": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz",
+      "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==",
+      "peer": true,
+      "dependencies": {
+        "ast-types": "0.15.2",
+        "esprima": "~4.0.0",
+        "source-map": "~0.6.1",
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/recast/node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/reflect.getprototypeof": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
+      "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.1",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "globalthis": "^1.0.3",
+        "which-builtin-type": "^1.1.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/regenerate": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+      "peer": true
+    },
+    "node_modules/regenerate-unicode-properties": {
+      "version": "10.1.1",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz",
+      "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==",
+      "peer": true,
+      "dependencies": {
+        "regenerate": "^1.4.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/regenerator-runtime": {
+      "version": "0.14.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+    },
+    "node_modules/regenerator-transform": {
+      "version": "0.15.2",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+      "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+      "peer": true,
+      "dependencies": {
+        "@babel/runtime": "^7.8.4"
+      }
+    },
+    "node_modules/regexp.prototype.flags": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
+      "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.6",
+        "define-properties": "^1.2.1",
+        "es-errors": "^1.3.0",
+        "set-function-name": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/regexpu-core": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
+      "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
+      "peer": true,
+      "dependencies": {
+        "@babel/regjsgen": "^0.8.0",
+        "regenerate": "^1.4.2",
+        "regenerate-unicode-properties": "^10.1.0",
+        "regjsparser": "^0.9.1",
+        "unicode-match-property-ecmascript": "^2.0.0",
+        "unicode-match-property-value-ecmascript": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/regjsparser": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+      "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+      "peer": true,
+      "dependencies": {
+        "jsesc": "~0.5.0"
+      },
+      "bin": {
+        "regjsparser": "bin/parser"
+      }
+    },
+    "node_modules/regjsparser/node_modules/jsesc": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+      "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+      "peer": true,
+      "bin": {
+        "jsesc": "bin/jsesc"
+      }
+    },
+    "node_modules/require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+    },
+    "node_modules/resolve": {
+      "version": "1.22.8",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+      "dependencies": {
+        "is-core-module": "^2.13.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+      "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/resolve-pkg-maps": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+      "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+      }
+    },
+    "node_modules/restore-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+      "peer": true,
+      "dependencies": {
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rollup-plugin-visualizer": {
+      "version": "5.12.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz",
+      "integrity": "sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==",
+      "dependencies": {
+        "open": "^8.4.0",
+        "picomatch": "^2.3.1",
+        "source-map": "^0.7.4",
+        "yargs": "^17.5.1"
+      },
+      "bin": {
+        "rollup-plugin-visualizer": "dist/bin/cli.js"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "rollup": "2.x || 3.x || 4.x"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/rollup-plugin-visualizer/node_modules/cliui": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.1",
+        "wrap-ansi": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/rollup-plugin-visualizer/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==",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/rollup-plugin-visualizer/node_modules/y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/rollup-plugin-visualizer/node_modules/yargs": {
+      "version": "17.7.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+      "dependencies": {
+        "cliui": "^8.0.1",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.3",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^21.1.1"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/rollup-plugin-visualizer/node_modules/yargs-parser": {
+      "version": "21.1.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/safe-array-concat": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+      "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "get-intrinsic": "^1.2.4",
+        "has-symbols": "^1.0.3",
+        "isarray": "^2.0.5"
+      },
+      "engines": {
+        "node": ">=0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/safe-array-concat/node_modules/isarray": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/safe-regex-test": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+      "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-regex": "^1.1.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/safe-stable-stringify": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
+      "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "license": "MIT"
+    },
+    "node_modules/scheduler": {
+      "version": "0.23.2",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+      "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+      "dependencies": {
+        "loose-envify": "^1.1.0"
+      }
+    },
+    "node_modules/secp256k1": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.0.tgz",
+      "integrity": "sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "elliptic": "^6.5.4",
+        "node-addon-api": "^5.0.0",
+        "node-gyp-build": "^4.2.0"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/secp256k1/node_modules/node-addon-api": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
+      "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA=="
+    },
+    "node_modules/selfsigned": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
+      "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
+      "peer": true,
+      "dependencies": {
+        "@types/node-forge": "^1.3.0",
+        "node-forge": "^1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/semver": {
+      "version": "7.6.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+      "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/send": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+      "peer": true,
+      "dependencies": {
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "mime": "1.6.0",
+        "ms": "2.1.3",
+        "on-finished": "2.4.1",
+        "range-parser": "~1.2.1",
+        "statuses": "2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/send/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "peer": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/send/node_modules/debug/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "peer": true
+    },
+    "node_modules/send/node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "peer": true,
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/send/node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "peer": true
+    },
+    "node_modules/send/node_modules/on-finished": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+      "peer": true,
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/send/node_modules/statuses": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/serialize-error": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz",
+      "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/serve-static": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+      "peer": true,
+      "dependencies": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.18.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+    },
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/set-function-name": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "functions-have-names": "^1.2.3",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+      "peer": true
+    },
+    "node_modules/sha.js": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      },
+      "bin": {
+        "sha.js": "bin.js"
+      }
+    },
+    "node_modules/shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "peer": true,
+      "dependencies": {
+        "kind-of": "^6.0.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shell-quote": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
+      "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+      "peer": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "object-inspect": "^1.13.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "peer": true
+    },
+    "node_modules/sisteransi": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+      "peer": true
+    },
+    "node_modules/slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/slice-ansi": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+      "peer": true,
+      "dependencies": {
+        "ansi-styles": "^3.2.0",
+        "astral-regex": "^1.0.0",
+        "is-fullwidth-code-point": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/slice-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==",
+      "peer": true,
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/slice-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==",
+      "peer": true,
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/slice-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==",
+      "peer": true
+    },
+    "node_modules/slice-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==",
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/socket.io-client": {
+      "version": "4.7.5",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz",
+      "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==",
+      "dependencies": {
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.2",
+        "engine.io-client": "~6.5.2",
+        "socket.io-parser": "~4.2.4"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/socket.io-parser": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
+      "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
+      "dependencies": {
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.1"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/sonic-boom": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz",
+      "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==",
+      "dependencies": {
+        "atomic-sleep": "^1.0.0"
+      }
+    },
+    "node_modules/source-map": {
+      "version": "0.7.4",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+      "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+      "peer": true,
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "node_modules/source-map-support/node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/split-on-first": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
+      "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/split2": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+      "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+      "engines": {
+        "node": ">= 10.x"
+      }
+    },
+    "node_modules/sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+      "peer": true
+    },
+    "node_modules/stack-utils": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+      "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+      "peer": true,
+      "dependencies": {
+        "escape-string-regexp": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/stack-utils/node_modules/escape-string-regexp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/stackframe": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+      "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
+      "peer": true
+    },
+    "node_modules/stacktrace-parser": {
+      "version": "0.1.10",
+      "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz",
+      "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==",
+      "peer": true,
+      "dependencies": {
+        "type-fest": "^0.7.1"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/statuses": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+      "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/std-env": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz",
+      "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg=="
+    },
+    "node_modules/stop-iteration-iterator": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz",
+      "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "internal-slot": "^1.0.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/stream-shift": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz",
+      "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ=="
+    },
+    "node_modules/streamsearch": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+      "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/strict-uri-encode": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
+      "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/string-width-cjs": {
+      "name": "string-width",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/string.prototype.includes": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz",
+      "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      }
+    },
+    "node_modules/string.prototype.matchall": {
+      "version": "4.0.11",
+      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
+      "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-symbols": "^1.0.3",
+        "internal-slot": "^1.0.7",
+        "regexp.prototype.flags": "^1.5.2",
+        "set-function-name": "^2.0.2",
+        "side-channel": "^1.0.6"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.trim": {
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+      "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.0",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.trimend": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+      "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.trimstart": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+      "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-ansi-cjs": {
+      "name": "strip-ansi",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "peer": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/strip-hex-prefix": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz",
+      "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==",
+      "license": "MIT",
+      "dependencies": {
+        "is-hex-prefixed": "1.0.0"
+      },
+      "engines": {
+        "node": ">=6.5.0",
+        "npm": ">=3"
+      }
+    },
+    "node_modules/strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/strnum": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+      "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
+      "peer": true
+    },
+    "node_modules/styled-jsx": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
+      "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
+      "dependencies": {
+        "client-only": "0.0.1"
+      },
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "peerDependencies": {
+        "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "@babel/core": {
+          "optional": true
+        },
+        "babel-plugin-macros": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/sucrase": {
+      "version": "3.35.0",
+      "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+      "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.2",
+        "commander": "^4.0.0",
+        "glob": "^10.3.10",
+        "lines-and-columns": "^1.1.6",
+        "mz": "^2.7.0",
+        "pirates": "^4.0.1",
+        "ts-interface-checker": "^0.1.9"
+      },
+      "bin": {
+        "sucrase": "bin/sucrase",
+        "sucrase-node": "bin/sucrase-node"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/sucrase/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/sucrase/node_modules/commander": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+      "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/sucrase/node_modules/glob": {
+      "version": "10.4.2",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz",
+      "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==",
+      "license": "ISC",
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^3.1.2",
+        "minimatch": "^9.0.4",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^1.11.1"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/sucrase/node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/sudo-prompt": {
+      "version": "9.2.1",
+      "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz",
+      "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==",
+      "peer": true
+    },
+    "node_modules/superstruct": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz",
+      "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==",
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/system-architecture": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz",
+      "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/tabbable": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+      "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
+      "license": "MIT"
+    },
+    "node_modules/tailwindcss": {
+      "version": "3.4.4",
+      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz",
+      "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==",
+      "license": "MIT",
+      "dependencies": {
+        "@alloc/quick-lru": "^5.2.0",
+        "arg": "^5.0.2",
+        "chokidar": "^3.5.3",
+        "didyoumean": "^1.2.2",
+        "dlv": "^1.1.3",
+        "fast-glob": "^3.3.0",
+        "glob-parent": "^6.0.2",
+        "is-glob": "^4.0.3",
+        "jiti": "^1.21.0",
+        "lilconfig": "^2.1.0",
+        "micromatch": "^4.0.5",
+        "normalize-path": "^3.0.0",
+        "object-hash": "^3.0.0",
+        "picocolors": "^1.0.0",
+        "postcss": "^8.4.23",
+        "postcss-import": "^15.1.0",
+        "postcss-js": "^4.0.1",
+        "postcss-load-config": "^4.0.1",
+        "postcss-nested": "^6.0.1",
+        "postcss-selector-parser": "^6.0.11",
+        "resolve": "^1.22.2",
+        "sucrase": "^3.32.0"
+      },
+      "bin": {
+        "tailwind": "lib/cli.js",
+        "tailwindcss": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/tailwindcss/node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/tapable": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/temp": {
+      "version": "0.8.4",
+      "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz",
+      "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==",
+      "peer": true,
+      "dependencies": {
+        "rimraf": "~2.6.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/temp-dir": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
+      "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/temp/node_modules/rimraf": {
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "peer": true,
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      }
+    },
+    "node_modules/terser": {
+      "version": "5.31.1",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz",
+      "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==",
+      "peer": true,
+      "dependencies": {
+        "@jridgewell/source-map": "^0.3.3",
+        "acorn": "^8.8.2",
+        "commander": "^2.20.0",
+        "source-map-support": "~0.5.20"
+      },
+      "bin": {
+        "terser": "bin/terser"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/terser/node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "peer": true
+    },
+    "node_modules/text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/thenify": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+      "license": "MIT",
+      "dependencies": {
+        "any-promise": "^1.0.0"
+      }
+    },
+    "node_modules/thenify-all": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+      "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+      "license": "MIT",
+      "dependencies": {
+        "thenify": ">= 3.1.0 < 4"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/thread-stream": {
+      "version": "0.15.2",
+      "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz",
+      "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==",
+      "dependencies": {
+        "real-require": "^0.1.0"
+      }
+    },
+    "node_modules/throat": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
+      "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
+      "peer": true
+    },
+    "node_modules/through2": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+      "peer": true,
+      "dependencies": {
+        "readable-stream": "~2.3.6",
+        "xtend": "~4.0.1"
+      }
+    },
+    "node_modules/through2/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "peer": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/through2/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "peer": true
+    },
+    "node_modules/through2/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "peer": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/tmpl": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+      "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+      "peer": true
+    },
+    "node_modules/to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/toidentifier": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
+    "node_modules/ts-api-utils": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+      "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.2.0"
+      }
+    },
+    "node_modules/ts-interface-checker": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+      "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+      "license": "Apache-2.0"
+    },
+    "node_modules/tsconfig-paths": {
+      "version": "3.15.0",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+      "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/json5": "^0.0.29",
+        "json5": "^1.0.2",
+        "minimist": "^1.2.6",
+        "strip-bom": "^3.0.0"
+      }
+    },
+    "node_modules/tsconfig-paths/node_modules/json5": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+      "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
+      "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="
+    },
+    "node_modules/tweetnacl": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
+      "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
+      "license": "Unlicense"
+    },
+    "node_modules/tweetnacl-util": {
+      "version": "0.15.1",
+      "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz",
+      "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==",
+      "license": "Unlicense"
+    },
+    "node_modules/type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "prelude-ls": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/type-detect": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/type-fest": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
+      "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==",
+      "peer": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/typed-array-buffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+      "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/typed-array-byte-length": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+      "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/typed-array-byte-offset": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+      "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/typed-array-length": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
+      "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13",
+        "possible-typed-array-names": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/typescript": {
+      "version": "5.4.2",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz",
+      "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==",
+      "devOptional": true,
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=14.17"
+      }
+    },
+    "node_modules/ua-parser-js": {
+      "version": "1.0.38",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz",
+      "integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/ua-parser-js"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/faisalman"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/faisalman"
+        }
+      ],
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/ufo": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz",
+      "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw=="
+    },
+    "node_modules/uint8arrays": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz",
+      "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==",
+      "dependencies": {
+        "multiformats": "^9.4.2"
+      }
+    },
+    "node_modules/unbox-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+      "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "has-bigints": "^1.0.2",
+        "has-symbols": "^1.0.3",
+        "which-boxed-primitive": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/uncrypto": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz",
+      "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="
+    },
+    "node_modules/undici-types": {
+      "version": "5.26.5",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+    },
+    "node_modules/unenv": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.9.0.tgz",
+      "integrity": "sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==",
+      "dependencies": {
+        "consola": "^3.2.3",
+        "defu": "^6.1.3",
+        "mime": "^3.0.0",
+        "node-fetch-native": "^1.6.1",
+        "pathe": "^1.1.1"
+      }
+    },
+    "node_modules/unenv/node_modules/mime": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
+      "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/unfetch": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz",
+      "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA=="
+    },
+    "node_modules/unicode-canonical-property-names-ecmascript": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+      "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-match-property-ecmascript": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+      "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+      "peer": true,
+      "dependencies": {
+        "unicode-canonical-property-names-ecmascript": "^2.0.0",
+        "unicode-property-aliases-ecmascript": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-match-property-value-ecmascript": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+      "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-property-aliases-ecmascript": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+      "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+      "peer": true,
+      "engines": {
+        "node": ">= 4.0.0"
+      }
+    },
+    "node_modules/unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/unstorage": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.10.2.tgz",
+      "integrity": "sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ==",
+      "dependencies": {
+        "anymatch": "^3.1.3",
+        "chokidar": "^3.6.0",
+        "destr": "^2.0.3",
+        "h3": "^1.11.1",
+        "listhen": "^1.7.2",
+        "lru-cache": "^10.2.0",
+        "mri": "^1.2.0",
+        "node-fetch-native": "^1.6.2",
+        "ofetch": "^1.3.3",
+        "ufo": "^1.4.0"
+      },
+      "peerDependencies": {
+        "@azure/app-configuration": "^1.5.0",
+        "@azure/cosmos": "^4.0.0",
+        "@azure/data-tables": "^13.2.2",
+        "@azure/identity": "^4.0.1",
+        "@azure/keyvault-secrets": "^4.8.0",
+        "@azure/storage-blob": "^12.17.0",
+        "@capacitor/preferences": "^5.0.7",
+        "@netlify/blobs": "^6.5.0 || ^7.0.0",
+        "@planetscale/database": "^1.16.0",
+        "@upstash/redis": "^1.28.4",
+        "@vercel/kv": "^1.0.1",
+        "idb-keyval": "^6.2.1",
+        "ioredis": "^5.3.2"
+      },
+      "peerDependenciesMeta": {
+        "@azure/app-configuration": {
+          "optional": true
+        },
+        "@azure/cosmos": {
+          "optional": true
+        },
+        "@azure/data-tables": {
+          "optional": true
+        },
+        "@azure/identity": {
+          "optional": true
+        },
+        "@azure/keyvault-secrets": {
+          "optional": true
+        },
+        "@azure/storage-blob": {
+          "optional": true
+        },
+        "@capacitor/preferences": {
+          "optional": true
+        },
+        "@netlify/blobs": {
+          "optional": true
+        },
+        "@planetscale/database": {
+          "optional": true
+        },
+        "@upstash/redis": {
+          "optional": true
+        },
+        "@vercel/kv": {
+          "optional": true
+        },
+        "idb-keyval": {
+          "optional": true
+        },
+        "ioredis": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/unstorage/node_modules/lru-cache": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz",
+      "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==",
+      "engines": {
+        "node": "14 || >=16.14"
+      }
+    },
+    "node_modules/untun": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz",
+      "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==",
+      "dependencies": {
+        "citty": "^0.1.5",
+        "consola": "^3.2.3",
+        "pathe": "^1.1.1"
+      },
+      "bin": {
+        "untun": "bin/untun.mjs"
+      }
+    },
+    "node_modules/update-browserslist-db": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+      "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "escalade": "^3.1.2",
+        "picocolors": "^1.0.1"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
+    },
+    "node_modules/uqr": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz",
+      "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA=="
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/use-callback-ref": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz",
+      "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==",
+      "dependencies": {
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/use-sidecar": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
+      "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
+      "dependencies": {
+        "detect-node-es": "^1.1.0",
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/use-sync-external-store": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+      "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/utf-8-validate": {
+      "version": "5.0.10",
+      "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
+      "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "node-gyp-build": "^4.3.0"
+      },
+      "engines": {
+        "node": ">=6.14.2"
+      }
+    },
+    "node_modules/util": {
+      "version": "0.12.5",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+      "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "is-arguments": "^1.0.4",
+        "is-generator-function": "^1.0.7",
+        "is-typed-array": "^1.1.3",
+        "which-typed-array": "^1.1.2"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+    },
+    "node_modules/utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/uuid": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+      "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
+      "license": "MIT",
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
+    "node_modules/valtio": {
+      "version": "1.11.2",
+      "resolved": "https://registry.npmjs.org/valtio/-/valtio-1.11.2.tgz",
+      "integrity": "sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==",
+      "dependencies": {
+        "proxy-compare": "2.5.1",
+        "use-sync-external-store": "1.2.0"
+      },
+      "engines": {
+        "node": ">=12.20.0"
+      },
+      "peerDependencies": {
+        "@types/react": ">=16.8",
+        "react": ">=16.8"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+      "peer": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/viem": {
+      "version": "2.9.31",
+      "resolved": "https://registry.npmjs.org/viem/-/viem-2.9.31.tgz",
+      "integrity": "sha512-8aJ8Dm/591Czwb/nRayo0z8Ls5KxqC4QYE33fmHwhx2tDUWC/hHcPZqjLRSTWFtAfi0aZKvP7BeB6UZ3ZkTRhQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/wevm"
+        }
+      ],
+      "dependencies": {
+        "@adraffy/ens-normalize": "1.10.0",
+        "@noble/curves": "1.2.0",
+        "@noble/hashes": "1.3.2",
+        "@scure/bip32": "1.3.2",
+        "@scure/bip39": "1.2.1",
+        "abitype": "1.0.0",
+        "isows": "1.0.3",
+        "ws": "8.13.0"
+      },
+      "peerDependencies": {
+        "typescript": ">=5.0.4"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vlq": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz",
+      "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==",
+      "peer": true
+    },
+    "node_modules/wagmi": {
+      "version": "2.10.9",
+      "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.10.9.tgz",
+      "integrity": "sha512-pYGTLmVIAC4q/a90i+vlrkJL86n5Kf/gwhhi65XtQklpsUQWrKDmn4dsY1/yFeAmZ/1yx1mpxYpX3LI97eTuWA==",
+      "dependencies": {
+        "@wagmi/connectors": "5.0.21",
+        "@wagmi/core": "2.11.6",
+        "use-sync-external-store": "1.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/wevm"
+      },
+      "peerDependencies": {
+        "@tanstack/react-query": ">=5.0.0",
+        "react": ">=18",
+        "typescript": ">=5.0.4",
+        "viem": "2.x"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/walker": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+      "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+      "peer": true,
+      "dependencies": {
+        "makeerror": "1.0.12"
+      }
+    },
+    "node_modules/wcwidth": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+      "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+      "peer": true,
+      "dependencies": {
+        "defaults": "^1.0.3"
+      }
+    },
+    "node_modules/webextension-polyfill": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz",
+      "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g=="
+    },
+    "node_modules/webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+    },
+    "node_modules/whatwg-fetch": {
+      "version": "3.6.20",
+      "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
+      "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
+      "peer": true
+    },
+    "node_modules/whatwg-url": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "dependencies": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/which-boxed-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-bigint": "^1.0.1",
+        "is-boolean-object": "^1.1.0",
+        "is-number-object": "^1.0.4",
+        "is-string": "^1.0.5",
+        "is-symbol": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/which-builtin-type": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
+      "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "function.prototype.name": "^1.1.5",
+        "has-tostringtag": "^1.0.0",
+        "is-async-function": "^2.0.0",
+        "is-date-object": "^1.0.5",
+        "is-finalizationregistry": "^1.0.2",
+        "is-generator-function": "^1.0.10",
+        "is-regex": "^1.1.4",
+        "is-weakref": "^1.0.2",
+        "isarray": "^2.0.5",
+        "which-boxed-primitive": "^1.0.2",
+        "which-collection": "^1.0.1",
+        "which-typed-array": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/which-builtin-type/node_modules/isarray": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/which-collection": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+      "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-map": "^2.0.3",
+        "is-set": "^2.0.3",
+        "is-weakmap": "^2.0.2",
+        "is-weakset": "^2.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/which-module": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
+      "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="
+    },
+    "node_modules/which-typed-array": {
+      "version": "1.1.15",
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+      "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+      "dependencies": {
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/word-wrap": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/wrap-ansi": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrap-ansi-cjs": {
+      "name": "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==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+    },
+    "node_modules/write-file-atomic": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+      "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+      "peer": true,
+      "dependencies": {
+        "graceful-fs": "^4.1.11",
+        "imurmurhash": "^0.1.4",
+        "signal-exit": "^3.0.2"
+      }
+    },
+    "node_modules/ws": {
+      "version": "8.13.0",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
+      "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/xmlhttprequest-ssl": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
+      "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "engines": {
+        "node": ">=0.4"
+      }
+    },
+    "node_modules/y18n": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+    },
+    "node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "peer": true
+    },
+    "node_modules/yaml": {
+      "version": "2.4.5",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz",
+      "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==",
+      "bin": {
+        "yaml": "bin.mjs"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/yargs": {
+      "version": "15.4.1",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+      "dependencies": {
+        "cliui": "^6.0.0",
+        "decamelize": "^1.2.0",
+        "find-up": "^4.1.0",
+        "get-caller-file": "^2.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^2.0.0",
+        "set-blocking": "^2.0.0",
+        "string-width": "^4.2.0",
+        "which-module": "^2.0.0",
+        "y18n": "^4.0.0",
+        "yargs-parser": "^18.1.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/yargs-parser": {
+      "version": "18.1.3",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+      "dependencies": {
+        "camelcase": "^5.0.0",
+        "decamelize": "^1.2.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "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==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/zustand": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.1.tgz",
+      "integrity": "sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==",
+      "dependencies": {
+        "use-sync-external-store": "1.2.0"
+      },
+      "engines": {
+        "node": ">=12.7.0"
+      },
+      "peerDependencies": {
+        "@types/react": ">=16.8",
+        "immer": ">=9.0",
+        "react": ">=16.8"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "immer": {
+          "optional": true
+        },
+        "react": {
+          "optional": true
+        }
+      }
+    }
+  }
+}
diff --git a/packages/examples/dnode-dapp/package.json b/packages/examples/dnode-dapp/package.json
new file mode 100644
index 000000000..4803ed975
--- /dev/null
+++ b/packages/examples/dnode-dapp/package.json
@@ -0,0 +1,36 @@
+{
+  "name": "dnode-dapp",
+  "private": true,
+  "version": "0.1.0",
+  "scripts": {
+    "dev": "next dev",
+    "build": "next build",
+    "start": "next start"
+  },
+  "dependencies": {
+    "@headlessui/react": "^2.1.1",
+    "@heroicons/react": "^2.1.4",
+    "@pushprotocol/dnode": "^0.0.6",
+    "@rainbow-me/rainbowkit": "^2.1.3",
+    "@tailwindcss/forms": "^0.5.7",
+    "@tanstack/react-query": "^5.28.4",
+    "ethers": "^6.13.1",
+    "ldrs": "^1.0.2",
+    "next": "^14.2.3",
+    "react": "^18.3.0",
+    "react-dom": "^18.3.0",
+    "viem": "2.9.31",
+    "wagmi": "^2.9.2"
+  },
+  "devDependencies": {
+    "@types/node": "^18.19.3",
+    "@types/react": "^18.3.0",
+    "autoprefixer": "^10.4.19",
+    "daisyui": "^4.12.10",
+    "eslint": "8.57.0",
+    "eslint-config-next": "^14.2.4",
+    "postcss": "^8.4.39",
+    "tailwindcss": "^3.4.4",
+    "typescript": "5.4.2"
+  }
+}
diff --git a/packages/examples/dnode-dapp/postcss.config.js b/packages/examples/dnode-dapp/postcss.config.js
new file mode 100644
index 000000000..33ad091d2
--- /dev/null
+++ b/packages/examples/dnode-dapp/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+  plugins: {
+    tailwindcss: {},
+    autoprefixer: {},
+  },
+}
diff --git a/packages/examples/dnode-dapp/public/favicon.ico b/packages/examples/dnode-dapp/public/favicon.ico
new file mode 100644
index 000000000..4e7aa0203
Binary files /dev/null and b/packages/examples/dnode-dapp/public/favicon.ico differ
diff --git a/packages/examples/dnode-dapp/public/logo.svg b/packages/examples/dnode-dapp/public/logo.svg
new file mode 100644
index 000000000..050103632
--- /dev/null
+++ b/packages/examples/dnode-dapp/public/logo.svg
@@ -0,0 +1,40 @@
+<svg width="18" height="19" viewBox="0 0 18 19" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M9.00077 18.4078C9.5206 18.4075 10.0292 18.2615 10.4646 17.9876C10.9 17.7136 11.2436 17.3235 11.4535 16.8647C11.4777 16.8138 11.4882 16.7578 11.4839 16.7019C11.4796 16.646 11.4606 16.5921 11.4288 16.5453C11.397 16.4984 11.3534 16.46 11.3021 16.4339C11.2507 16.4077 11.1934 16.3945 11.1353 16.3956H6.86624C6.80825 16.3947 6.75097 16.4079 6.69974 16.4342C6.64852 16.4604 6.60503 16.4988 6.57334 16.5456C6.54164 16.5925 6.52278 16.6463 6.51851 16.7021C6.51424 16.7579 6.52471 16.8139 6.54893 16.8647C6.75876 17.3234 7.10218 17.7134 7.53745 17.9873C7.97271 18.2613 8.48108 18.4073 9.00077 18.4078Z" fill="url(#paint0_linear_6840_10729)"/>
+<path d="M15.5524 13.9049C15.219 13.9049 14.8992 13.7771 14.6635 13.5496C14.4277 13.3221 14.2952 13.0136 14.2952 12.6919V8.2853C14.295 7.14898 13.9022 6.04516 13.1789 5.14834C12.4556 4.25153 11.4431 3.6129 10.3014 3.33342C10.2596 3.02449 10.1024 2.74089 9.85938 2.53571C9.61637 2.33053 9.30416 2.21784 8.98123 2.21876C8.6583 2.21967 8.34678 2.33412 8.10502 2.54067C7.86325 2.74722 7.70781 3.03171 7.6678 3.34087C6.64965 3.59763 5.73378 4.14101 5.03688 4.90177C4.33998 5.66253 3.89361 6.60624 3.75464 7.61264C3.75464 7.64325 3.74606 7.67304 3.74263 7.70365C3.7392 7.73427 3.7332 7.78639 3.72977 7.82776C3.72634 7.86913 3.72291 7.9105 3.71948 7.95104C3.71605 7.99158 3.71519 8.01971 3.71348 8.05446C3.71348 8.12479 3.70833 8.19429 3.70747 8.26545V12.6911C3.70748 13.0112 3.57632 13.3184 3.34258 13.5456C3.10884 13.7728 2.79148 13.9016 2.45969 13.9041C2.38175 13.9032 2.3044 13.9171 2.23205 13.9451C2.15971 13.9731 2.09378 14.0145 2.03803 14.0671C1.98229 14.1196 1.93782 14.1822 1.90716 14.2514C1.87651 14.3205 1.86027 14.3948 1.85938 14.47V14.4749C1.85937 14.6264 1.92172 14.7716 2.03269 14.8786C2.14366 14.9857 2.29417 15.0458 2.45111 15.0458H15.5524C15.7054 15.0402 15.8501 14.9777 15.9562 14.8713C16.0624 14.7649 16.1217 14.623 16.1217 14.4754C16.1217 14.3277 16.0624 14.1858 15.9562 14.0794C15.8501 13.9731 15.7054 13.9105 15.5524 13.9049Z" fill="url(#paint1_linear_6840_10729)"/>
+<path d="M12.7921 2.46811C13.5155 2.62298 14.1697 2.99437 14.6613 3.52928C15.1529 4.06418 15.4568 4.73525 15.5296 5.44668C15.533 5.48507 15.5443 5.52241 15.5628 5.55655C15.5813 5.59069 15.6066 5.62094 15.6374 5.64557C15.6681 5.67019 15.7035 5.6887 15.7417 5.7C15.7799 5.71131 15.82 5.7152 15.8597 5.71145C15.9399 5.70407 16.0138 5.66663 16.0656 5.6072C16.0911 5.5776 16.1103 5.54343 16.122 5.50666C16.1338 5.46988 16.1379 5.43122 16.1342 5.39291C16.0548 4.55467 15.7002 3.76276 15.1219 3.13251C14.5436 2.50227 13.7719 2.06659 12.9191 1.88894C12.8982 1.88474 12.8769 1.88253 12.8556 1.88232C12.7807 1.88249 12.7086 1.90935 12.653 1.95772C12.5974 2.0061 12.5623 2.07259 12.5544 2.14442C12.5465 2.21625 12.5665 2.28836 12.6103 2.34688C12.6542 2.4054 12.719 2.44622 12.7921 2.46149V2.46811Z" fill="url(#paint2_linear_6840_10729)"/>
+<path d="M13.1339 0.579127C14.2599 0.819179 15.2783 1.39659 16.0435 2.22879C16.8087 3.06098 17.2816 4.10533 17.3944 5.21247C17.398 5.25081 17.4094 5.28809 17.4279 5.32218C17.4464 5.35626 17.4718 5.38648 17.5025 5.41108C17.5331 5.43569 17.5686 5.4542 17.6067 5.46555C17.6448 5.4769 17.6849 5.48087 17.7246 5.47723C17.8047 5.46985 17.8786 5.43241 17.9304 5.37298C17.9559 5.34338 17.9751 5.30921 17.9869 5.27244C17.9987 5.23566 18.0028 5.197 17.999 5.15868C17.8786 3.92618 17.3546 2.76268 16.5029 1.83679C15.6511 0.910903 14.5159 0.270735 13.2617 0.00905938C13.2408 0.00486004 13.2196 0.00264422 13.1983 0.00244144C13.1233 0.00240732 13.051 0.0291158 12.9953 0.077428C12.9395 0.12574 12.9042 0.192242 12.8963 0.264132C12.8883 0.336022 12.9081 0.40822 12.952 0.466831C12.9959 0.525443 13.0607 0.566325 13.1339 0.581609V0.579127Z" fill="url(#paint3_linear_6840_10729)"/>
+<path d="M5.20664 2.46833C5.27982 2.45306 5.34457 2.41224 5.38845 2.35372C5.43233 2.2952 5.45225 2.22309 5.44438 2.15126C5.4365 2.07943 5.4014 2.01294 5.34581 1.96456C5.29021 1.91618 5.21805 1.88933 5.14318 1.88916C5.12185 1.88936 5.1006 1.89158 5.07972 1.89578C4.22835 2.07294 3.45765 2.50727 2.87951 3.13572C2.30137 3.76417 1.94588 4.55403 1.86463 5.39064C1.86087 5.42896 1.86499 5.46762 1.87676 5.50439C1.88854 5.54117 1.90773 5.57534 1.93324 5.60493C1.95857 5.63471 1.98984 5.65928 2.02519 5.67719C2.06055 5.69509 2.09927 5.70598 2.13906 5.70918C2.1788 5.71294 2.21892 5.70905 2.25709 5.69774C2.29526 5.68643 2.33073 5.66793 2.36144 5.64331C2.39215 5.61868 2.41749 5.58842 2.43599 5.55428C2.45449 5.52014 2.46579 5.4828 2.46923 5.44442C2.54251 4.73343 2.84662 4.06292 3.33817 3.5285C3.82973 2.99408 4.48364 2.62306 5.20664 2.46833Z" fill="url(#paint4_linear_6840_10729)"/>
+<path d="M4.86558 0.579167C4.93875 0.563899 5.0035 0.52308 5.04738 0.464557C5.09126 0.406033 5.11118 0.33393 5.10331 0.262099C5.09544 0.190269 5.06033 0.123779 5.00474 0.0754006C4.94915 0.0270222 4.87698 0.000169082 4.80212 0C4.78079 0.000153939 4.75953 0.00237028 4.73865 0.00661794C3.48449 0.268293 2.34928 0.908462 1.49752 1.83435C0.64577 2.76024 0.121731 3.92374 0.00135058 5.15624C-0.0024137 5.19456 0.00170965 5.23322 0.0134837 5.27C0.0252577 5.30677 0.0444504 5.34094 0.0699577 5.37053C0.0952914 5.40031 0.12656 5.42488 0.161914 5.44279C0.197267 5.4607 0.235987 5.47158 0.275778 5.47479C0.315497 5.47843 0.355572 5.47446 0.393696 5.46311C0.43182 5.45176 0.467243 5.43325 0.497926 5.40864C0.52861 5.38404 0.553949 5.35382 0.572487 5.31973C0.591026 5.28565 0.602398 5.24836 0.605949 5.21002C0.719394 4.10349 1.1924 3.05984 1.9574 2.22817C2.7224 1.3965 3.74026 0.819353 4.86558 0.579167Z" fill="url(#paint5_linear_6840_10729)"/>
+<defs>
+<linearGradient id="paint0_linear_6840_10729" x1="11.8702" y1="12.0411" x2="8.55849" y2="17.8761" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FF94A6"/>
+<stop offset="0.32" stop-color="#E03DC1"/>
+<stop offset="1" stop-color="#8247E5"/>
+</linearGradient>
+<linearGradient id="paint1_linear_6840_10729" x1="13.5431" y1="5.69808" x2="6.5205" y2="16.0424" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FF94A6"/>
+<stop offset="0.32" stop-color="#E03DC1"/>
+<stop offset="1" stop-color="#8247E5"/>
+</linearGradient>
+<linearGradient id="paint2_linear_6840_10729" x1="19.4796" y1="0.506388" x2="1.97804" y2="12.5482" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FF94A6"/>
+<stop offset="0.32" stop-color="#E03DC1"/>
+<stop offset="1" stop-color="#8247E5"/>
+</linearGradient>
+<linearGradient id="paint3_linear_6840_10729" x1="19.3128" y1="0.263067" x2="1.81125" y2="12.304" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FF94A6"/>
+<stop offset="0.32" stop-color="#E03DC1"/>
+<stop offset="1" stop-color="#8247E5"/>
+</linearGradient>
+<linearGradient id="paint4_linear_6840_10729" x1="16.1383" y1="-4.35096" x2="-1.36245" y2="7.68997" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FF94A6"/>
+<stop offset="0.32" stop-color="#E03DC1"/>
+<stop offset="1" stop-color="#8247E5"/>
+</linearGradient>
+<linearGradient id="paint5_linear_6840_10729" x1="15.2587" y1="-5.62868" x2="-2.23539" y2="6.40705" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FF94A6"/>
+<stop offset="0.32" stop-color="#E03DC1"/>
+<stop offset="1" stop-color="#8247E5"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/packages/examples/dnode-dapp/public/node.webp b/packages/examples/dnode-dapp/public/node.webp
new file mode 100644
index 000000000..52d1f94af
Binary files /dev/null and b/packages/examples/dnode-dapp/public/node.webp differ
diff --git a/packages/examples/dnode-dapp/public/user.png b/packages/examples/dnode-dapp/public/user.png
new file mode 100644
index 000000000..ee78302d0
Binary files /dev/null and b/packages/examples/dnode-dapp/public/user.png differ
diff --git a/packages/examples/dnode-dapp/src/components/LatestBlock.tsx b/packages/examples/dnode-dapp/src/components/LatestBlock.tsx
new file mode 100644
index 000000000..bd93fe0a9
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/components/LatestBlock.tsx
@@ -0,0 +1,42 @@
+// components/LatestBlocksComponent.tsx
+
+import React from 'react';
+
+interface Block {
+  blockNumber: number;
+  timestamp: string;
+  // Add more block details as needed
+}
+
+interface LatestBlocksProps {
+  blocks: Block[];
+}
+
+const LatestBlocksComponent: React.FC<LatestBlocksProps> = ({ blocks }) => {
+  return (
+    <div>
+      <h2 className="text-xl font-semibold mb-2">Latest Blocks</h2>
+      <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
+        {blocks.map((block) => (
+          <BlockCard key={block.blockNumber} block={block} />
+        ))}
+      </div>
+    </div>
+  );
+};
+
+interface BlockCardProps {
+  block: Block;
+}
+
+const BlockCard: React.FC<BlockCardProps> = ({ block }) => {
+  return (
+    <div className="bg-white shadow-md p-4 rounded-md">
+      <h3 className="text-lg font-semibold">Block #{block.blockNumber}</h3>
+      <p className="text-gray-500">Timestamp: {block.timestamp}</p>
+      {/* Display other block details */}
+    </div>
+  );
+};
+
+export default LatestBlocksComponent;
diff --git a/packages/examples/dnode-dapp/src/components/Layout.tsx b/packages/examples/dnode-dapp/src/components/Layout.tsx
new file mode 100644
index 000000000..13898c068
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/components/Layout.tsx
@@ -0,0 +1,11 @@
+import React, { PropsWithChildren } from 'react';
+import Navbar from './Navbar';
+const Layout = ({ children }: PropsWithChildren) => {
+  return (
+    <>
+      <Navbar />
+      {children}
+    </>
+  );
+};
+export default Layout;
diff --git a/packages/examples/dnode-dapp/src/components/Loader.tsx b/packages/examples/dnode-dapp/src/components/Loader.tsx
new file mode 100644
index 000000000..6b9d32fea
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/components/Loader.tsx
@@ -0,0 +1,20 @@
+import { useEffect } from 'react';
+import { grid } from 'ldrs';
+
+const GridLoader = () => {
+  useEffect(() => {
+    if (typeof window !== 'undefined') {
+      grid.register();
+    }
+  }, []);
+
+  return (
+    <div className="grid min-h-full place-items-center justify-center px-6 py-24 sm:py-32 lg:px-12">
+      <div className="text-center">
+        <l-grid size={130} color={'#4f46e5'}></l-grid>
+      </div>
+    </div>
+  );
+};
+
+export default GridLoader;
diff --git a/packages/examples/dnode-dapp/src/components/Navbar.tsx b/packages/examples/dnode-dapp/src/components/Navbar.tsx
new file mode 100644
index 000000000..fce397813
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/components/Navbar.tsx
@@ -0,0 +1,121 @@
+import { useEffect, useState } from 'react';
+import { Dialog } from '@headlessui/react';
+import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline';
+import { ConnectButton } from '@rainbow-me/rainbowkit';
+import Link from 'next/link';
+
+const Navbar = () => {
+  const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
+  const [isScrolled, setIsScrolled] = useState(false);
+
+  const navigation = [
+    { name: 'Dashboard', link: '/dashboard' },
+    { name: 'Push Scan', link: `/pushscan` },
+  ];
+
+  // Handle scroll event
+  const handleScroll = () => {
+    if (window.scrollY > 0) {
+      setIsScrolled(true);
+    } else {
+      setIsScrolled(false);
+    }
+  };
+
+  // Set up event listener for scroll
+  useEffect(() => {
+    window.addEventListener('scroll', handleScroll);
+
+    // Clean up
+    return () => {
+      window.removeEventListener('scroll', handleScroll);
+    };
+  }, []);
+
+  return (
+    <header
+      className={`sticky top-0 z-50 ${
+        isScrolled ? 'bg-white/80 backdrop-blur shadow-sm' : 'bg-transparent'
+      }`}
+    >
+      <nav
+        className="flex items-center justify-between p-4 lg:px-8"
+        aria-label="Global"
+      >
+        <div className="flex lg:flex-1">
+          <Link href={'/'}>
+            <span className="font-semibold text-gray-900 brand-name">
+              <img src="logo.svg" alt="pushLogo" className="h-8 w-8" />
+            </span>
+          </Link>
+        </div>
+        <div className="hidden lg:flex lg:gap-x-12">
+          {navigation.map((item) => (
+            <Link
+              key={item.name}
+              href={item.link}
+              className="text-sm font-semibold leading-6 text-gray-900"
+            >
+              {item.name}
+            </Link>
+          ))}
+        </div>
+        <div className="flex flex-1 justify-end px-3">
+          <ConnectButton chainStatus={'icon'} />
+        </div>
+        <div className="flex lg:hidden">
+          <button
+            type="button"
+            className="-m-2.5 inline-flex items-center justify-center rounded-md p-2.5 text-gray-700"
+            onClick={() => setMobileMenuOpen(true)}
+          >
+            <span className="sr-only">Open main menu</span>
+            <Bars3Icon className="h-6 w-6" aria-hidden="true" />
+          </button>
+        </div>
+      </nav>
+      <Dialog
+        as="div"
+        className="lg:hidden"
+        open={mobileMenuOpen}
+        onClose={setMobileMenuOpen}
+      >
+        <div className="fixed inset-0 z-50" />
+        <Dialog.Panel className="fixed inset-y-0 right-0 z-50 w-full overflow-y-auto bg-white/80 backdrop-blur px-6 py-6 sm:max-w-sm sm:ring-1 sm:ring-gray-900/10">
+          <div className="flex items-center justify-between">
+            <Link href={'/'}>
+              <span className="font-semibold text-gray-900 brand-name">
+                <img src="logo.svg" alt="pushLogo" className="h-8 w-8" />
+              </span>
+            </Link>
+            <button
+              type="button"
+              className="-m-2.5 rounded-md p-2.5 text-gray-700"
+              onClick={() => setMobileMenuOpen(false)}
+            >
+              <span className="sr-only">Close menu</span>
+              <XMarkIcon className="h-6 w-6" aria-hidden="true" />
+            </button>
+          </div>
+          <div className="mt-6 flow-root">
+            <div className="-my-6 divide-y divide-gray-500/10">
+              <div className="space-y-2 py-6">
+                {navigation.map((item) => (
+                  <a
+                    key={item.name}
+                    href={item.link}
+                    className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
+                  >
+                    {item.name}
+                  </a>
+                ))}
+              </div>
+            </div>
+          </div>
+        </Dialog.Panel>
+      </Dialog>
+    </header>
+  );
+};
+
+export default Navbar;
diff --git a/packages/examples/dnode-dapp/src/components/Notification.tsx b/packages/examples/dnode-dapp/src/components/Notification.tsx
new file mode 100644
index 000000000..7b4386c20
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/components/Notification.tsx
@@ -0,0 +1,244 @@
+import React, { useEffect, useState } from 'react';
+import { getChannelInfo, sendNotification } from '../utils/push';
+import { useAccount, useWalletClient } from 'wagmi';
+
+const SendNotification: React.FC = () => {
+  const [title, setTitle] = useState<string>('');
+  const [body, setBody] = useState<string>('');
+  const [channel, setChannel] = useState<string>('');
+  const [notificationType, setNotificationType] = useState<string>('broadcast');
+  const [recipient, setRecipient] = useState<string[]>(['*']); // State for recipients
+  const [allowNotification, setAllowNotification] = useState<boolean>(false);
+  const [errorMessage, setErrorMessage] = useState<string>(''); // State for error message
+  const [sending, setSending] = useState<boolean>(false);
+
+  const { isConnected } = useAccount();
+  const walletClient = useWalletClient();
+
+  useEffect(() => {
+    const checkNotificationPermission = async () => {
+      if (isConnected && walletClient.data && channel === '') {
+        try {
+          const channelInfo = await getChannelInfo(walletClient.data);
+          if (channelInfo !== null && channelInfo.processed == 1) {
+            setAllowNotification(true);
+            setChannel(channelInfo.channel);
+            setErrorMessage(''); // Clear error message if the channel is found
+          } else {
+            setAllowNotification(false);
+            setErrorMessage('Channel not found. Please check your settings.'); // Set error message
+          }
+        } catch (error) {
+          setAllowNotification(false);
+          setErrorMessage('Error fetching channel info.'); // Set error message
+        }
+      }
+    };
+    checkNotificationPermission();
+  }, [walletClient]);
+
+  const handleTitleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
+    setTitle(event.target.value);
+  };
+
+  const handleBodyChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {
+    setBody(event.target.value);
+  };
+
+  // const handleChannelChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
+  //   setChannel(event.target.value);
+  // };
+
+  const handleNotificationTypeChange = (
+    event: React.ChangeEvent<HTMLSelectElement>
+  ) => {
+    const value = event.target.value;
+    setNotificationType(value);
+    // Reset recipient field when changing notification type
+    setRecipient(value === 'broadcast' ? ['*'] : []);
+  };
+
+  const handleRecipientChange = (
+    event: React.ChangeEvent<HTMLInputElement>
+  ) => {
+    const value = event.target.value;
+    // If subset, convert to array of recipients split by comma
+    setRecipient(value.split(',').map((email) => email.trim()));
+  };
+
+  const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {
+    event.preventDefault();
+    // Add your notification sending logic here
+    console.log(
+      'Notification sent:',
+      title,
+      body,
+      channel,
+      notificationType,
+      recipient
+    );
+
+    setAllowNotification(false);
+    setSending(true);
+    try {
+      const res = await sendNotification(
+        title,
+        body,
+        recipient,
+        walletClient.data
+      );
+      setAllowNotification(false);
+      console.log(res);
+    } catch (error) {
+      console.error(error);
+    }
+    // Reset form fields if needed
+    setTitle('');
+    setBody('');
+    setChannel('');
+    setNotificationType('broadcast');
+    setRecipient(['*']);
+    setSending(false);
+    setAllowNotification(true);
+  };
+
+  return (
+    <form
+      onSubmit={handleSubmit}
+      className="flex flex-col items-center justify-center h-full"
+    >
+      <div className="w-full max-w-lg p-6 bg-white rounded-lg shadow-md">
+        <div className="text-center">
+          <h2 className="text-xl font-semibold text-gray-900 mb-4">
+            Send Notification
+          </h2>
+          <p className="text-sm text-gray-600 mb-8">
+            Push (EPNS) makes it extremely easy to open and maintain a genuine
+            channel of communication with your users.
+          </p>
+        </div>
+
+        {errorMessage && (
+          <div className="mb-4 text-center">
+            <p className="text-sm text-red-600">{errorMessage}</p>
+          </div>
+        )}
+
+        <div className="grid grid-cols-1 gap-y-6">
+          <div>
+            <label
+              htmlFor="channel"
+              className="block text-sm font-medium text-gray-900 mb-1"
+            >
+              Channel
+            </label>
+            <input
+              id="channel"
+              name="channel"
+              value={channel}
+              disabled={true}
+              className="w-full px-3 py-2 border rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
+            ></input>
+          </div>
+          <div>
+            <label
+              htmlFor="title"
+              className="block text-sm font-medium text-gray-900 mb-1"
+            >
+              Title
+            </label>
+            <input
+              type="text"
+              id="title"
+              name="title"
+              autoComplete="title"
+              value={title}
+              onChange={handleTitleChange}
+              className="w-full px-3 py-2 border rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
+              placeholder="Your Notification Title"
+            />
+          </div>
+
+          <div>
+            <label
+              htmlFor="body"
+              className="block text-sm font-medium text-gray-900 mb-1"
+            >
+              Body
+            </label>
+            <textarea
+              id="body"
+              name="body"
+              rows={3}
+              value={body}
+              onChange={handleBodyChange}
+              className="w-full px-3 py-2 border rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
+              placeholder="Your Notification Body"
+            />
+          </div>
+          <div>
+            <label
+              htmlFor="notificationType"
+              className="block text-sm font-medium text-gray-900 mb-1"
+            >
+              Notification Type
+            </label>
+            <select
+              id="notificationType"
+              name="notificationType"
+              value={notificationType}
+              onChange={handleNotificationTypeChange}
+              className="w-full px-3 py-2 border rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
+            >
+              <option value="broadcast">Broadcast</option>
+              <option value="targeted">Targeted</option>
+              {/* <option value="subset">Subset</option> */}
+            </select>
+          </div>
+
+          {notificationType !== 'broadcast' && (
+            <div>
+              <label
+                htmlFor="recipient"
+                className="block text-sm font-medium text-gray-900 mb-1"
+              >
+                Recipient(s)
+              </label>
+              <input
+                type="text"
+                id="recipient"
+                name="recipient"
+                value={
+                  Array.isArray(recipient) ? recipient.join(', ') : recipient
+                }
+                onChange={handleRecipientChange}
+                className="w-full px-3 py-2 border rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
+                placeholder={
+                  notificationType === 'targeted'
+                    ? 'Enter recipient address'
+                    : 'Enter comma-separated recipient addresses'
+                }
+              />
+            </div>
+          )}
+        </div>
+
+        <div className="mt-6 flex justify-center">
+          <button
+            type="submit"
+            disabled={!allowNotification}
+            className={`px-4 py-2 font-semibold rounded-md shadow-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-100 ${
+              allowNotification
+                ? 'bg-indigo-600 text-white hover:bg-indigo-500 focus:ring-indigo-500'
+                : 'bg-gray-300 text-gray-600 cursor-not-allowed'
+            }`}
+          >
+            {sending ? 'Sending...' : 'Send'}
+          </button>
+        </div>
+      </div>
+    </form>
+  );
+};
+
+export default SendNotification;
diff --git a/packages/examples/dnode-dapp/src/components/SearchBar.tsx b/packages/examples/dnode-dapp/src/components/SearchBar.tsx
new file mode 100644
index 000000000..59122e9ef
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/components/SearchBar.tsx
@@ -0,0 +1,45 @@
+import React, { useState } from 'react';
+import { MagnifyingGlassIcon } from '@heroicons/react/24/outline';
+import { useRouter } from 'next/router';
+import { getCheckSumAddress } from '../utils';
+
+const SearchBar: React.FC = () => {
+  const [searchTerm, setSearchTerm] = useState('');
+  const router = useRouter();
+
+  const handleSearch = () => {
+    if (searchTerm.trim()) {
+      // Navigate to the search results page
+      router.push(
+        `/pushscan/${encodeURIComponent(getCheckSumAddress(searchTerm.trim()))}`
+      );
+    }
+  };
+
+  const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
+    if (event.key === 'Enter') {
+      handleSearch();
+    }
+  };
+
+  return (
+    <div className="relative w-full max-w-lg mx-auto">
+      <input
+        type="text"
+        placeholder="Search by Address"
+        className="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:border-blue-500"
+        value={searchTerm}
+        onChange={(e) => setSearchTerm(e.target.value)}
+        onKeyDown={handleKeyDown}
+      />
+      <button
+        className="absolute right-2 top-1/2 transform -translate-y-1/2 px-3 py-2 rounded-md hover:bg-blue-600 focus:outline-none"
+        onClick={handleSearch}
+      >
+        <MagnifyingGlassIcon className="h-5 w-5" />
+      </button>
+    </div>
+  );
+};
+
+export default SearchBar;
diff --git a/packages/examples/dnode-dapp/src/components/Stats.tsx b/packages/examples/dnode-dapp/src/components/Stats.tsx
new file mode 100644
index 000000000..aa9f5c20b
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/components/Stats.tsx
@@ -0,0 +1,34 @@
+interface StatsProps {
+  totalBlocks: number;
+  tps: number;
+  // Add more stats as needed
+}
+
+const StatsComponent: React.FC<StatsProps> = ({ totalBlocks, tps }) => {
+  return (
+    <div className="mb-8">
+      <h2 className="text-xl font-semibold mb-2">Statistics</h2>
+      <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
+        <StatCard title="Total Blocks" value={totalBlocks} />
+        <StatCard title="TPS" value={tps} />
+        {/* Add more stats as needed */}
+      </div>
+    </div>
+  );
+};
+
+interface StatCardProps {
+  title: string;
+  value: number;
+}
+
+const StatCard: React.FC<StatCardProps> = ({ title, value }) => {
+  return (
+    <div className="bg-white shadow-md p-4 rounded-md">
+      <h3 className="text-lg font-semibold">{title}</h3>
+      <p className="text-xl">{value}</p>
+    </div>
+  );
+};
+
+export default StatsComponent;
diff --git a/packages/examples/dnode-dapp/src/pages/_app.tsx b/packages/examples/dnode-dapp/src/pages/_app.tsx
new file mode 100644
index 000000000..77712a263
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/pages/_app.tsx
@@ -0,0 +1,28 @@
+import '../styles/globals.css';
+import '@rainbow-me/rainbowkit/styles.css';
+import type { AppProps } from 'next/app';
+
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import { WagmiProvider } from 'wagmi';
+import { RainbowKitProvider } from '@rainbow-me/rainbowkit';
+
+import { config } from '../wagmi';
+import Layout from '../components/Layout';
+
+const client = new QueryClient();
+
+function MyApp({ Component, pageProps }: AppProps) {
+  return (
+    <WagmiProvider config={config}>
+      <QueryClientProvider client={client}>
+        <RainbowKitProvider>
+          <Layout>
+            <Component {...pageProps} />
+          </Layout>
+        </RainbowKitProvider>
+      </QueryClientProvider>
+    </WagmiProvider>
+  );
+}
+
+export default MyApp;
diff --git a/packages/examples/dnode-dapp/src/pages/dashboard/index.tsx b/packages/examples/dnode-dapp/src/pages/dashboard/index.tsx
new file mode 100644
index 000000000..9df5ce538
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/pages/dashboard/index.tsx
@@ -0,0 +1,13 @@
+import Head from 'next/head';
+import React from 'react';
+import SendNotification from '../../components/Notification';
+
+const Dashboard: React.FC = () => {
+  return (
+    <div className="p-5 md:p-10 lg:p-20">
+      <SendNotification />
+    </div>
+  );
+};
+
+export default Dashboard;
diff --git a/packages/examples/dnode-dapp/src/pages/index.tsx b/packages/examples/dnode-dapp/src/pages/index.tsx
new file mode 100644
index 000000000..088966272
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/pages/index.tsx
@@ -0,0 +1,73 @@
+import Head from 'next/head';
+import Link from 'next/link';
+
+const Home: React.FC = () => {
+  return (
+    <div>
+      <Head>
+        <title>DNode</title>
+        <link rel="icon" href="/favicon.ico" />
+      </Head>
+      <main>
+        <div className="bg-white">
+          <div className="relative isolate px-6 pt-14 lg:px-8">
+            <div
+              className="absolute inset-x-0 -top-40 -z-10 transform-gpu overflow-hidden blur-3xl sm:-top-80"
+              aria-hidden="true"
+            >
+              <div
+                className="relative left-[calc(50%-11rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 rotate-[30deg] bg-gradient-to-tr from-[#ff80b5] to-[#9089fc] opacity-30 sm:left-[calc(50%-30rem)] sm:w-[72.1875rem]"
+                style={{
+                  clipPath:
+                    'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)',
+                }}
+              />
+            </div>
+            <div className="mx-auto max-w-2xl py-0 sm:py-3 lg:py-3">
+              <div className="mb-8 flex justify-center">
+                <img
+                  src="node.webp"
+                  alt="Hero Banner"
+                  width="800"
+                  className="rounded-3xl"
+                />
+              </div>
+            </div>
+            <div
+              className="absolute inset-x-0 top-[calc(100%-13rem)] -z-10 transform-gpu overflow-hidden blur-3xl sm:top-[calc(100%-30rem)]"
+              aria-hidden="true"
+            >
+              <div
+                className="relative left-[calc(50%+3rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 bg-gradient-to-tr from-[#ff80b5] to-[#9089fc] opacity-30 sm:left-[calc(50%+36rem)] sm:w-[72.1875rem]"
+                style={{
+                  clipPath:
+                    'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)',
+                }}
+              />
+            </div>
+          </div>
+          <div className="text-center">
+            <div className="mt-10 flex items-center justify-center gap-x-6">
+              <Link
+                href="/dashboard"
+                className="rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 z-50"
+              >
+                Go to Dashboard
+              </Link>
+              <a
+                href="https://push.org/blog/explaining-push-nodes/"
+                className="text-sm font-semibold leading-6 text-gray-900 z-50"
+                target="_blank"
+                rel="noopener noreferrer"
+              >
+                Learn more <span aria-hidden="true">→</span>
+              </a>
+            </div>
+          </div>
+        </div>
+      </main>
+    </div>
+  );
+};
+
+export default Home;
diff --git a/packages/examples/dnode-dapp/src/pages/pushscan/[address].tsx b/packages/examples/dnode-dapp/src/pages/pushscan/[address].tsx
new file mode 100644
index 000000000..44fcdece7
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/pages/pushscan/[address].tsx
@@ -0,0 +1,91 @@
+import { useRouter } from 'next/router';
+import React, { useEffect, useState } from 'react';
+import { getAddressTrx } from '../../utils/push';
+import SearchBar from '../../components/SearchBar';
+import dynamic from 'next/dynamic';
+
+const GridLoader = dynamic(() => import('../../components/Loader'), {
+  ssr: false,
+});
+
+// Component to display the result data
+const NodeResult: React.FC<{ result: any }> = ({ result }) => (
+  <div className="border p-4 mb-4">
+    <h2 className="text-xl font-semibold mb-2">Node Result</h2>
+    <p>Transaction Count: {result.itemCount}</p>
+    <p>Node Quorum Result: {result.quorumResult}</p>
+    <p>Last Timestamp: {result.lastTs}</p>
+    <p>Transactions Without Quorum Count: {result.keysWithoutQuorumCount}</p>
+  </div>
+);
+
+// Component to display individual items (transactions)
+const ParsedTransactionData: React.FC<{ item: any }> = ({ item }) => (
+  <div className="border p-4 mb-4 bg-gray-100">
+    <pre className="bg-gray-800 text-white p-4 rounded whitespace-pre-wrap break-words overflow-x-auto">
+      {JSON.stringify(item, null, 2)}
+    </pre>
+  </div>
+);
+
+const PushScan: React.FC = () => {
+  const router = useRouter();
+  const { address } = router.query; // Extract the dynamic address from the URL
+  const [afterEpoch, setAfterEpoch] = useState<number | undefined>(undefined);
+  const [data, setData] = useState<any>(null); // State to store fetched data or results
+  const [loading, setLoading] = useState(true);
+  useEffect(() => {
+    if (address) {
+      // Fetch data or perform actions based on the dynamic address
+      const fetchData = async () => {
+        setLoading(true);
+        try {
+          const response = await getAddressTrx(address as string, afterEpoch);
+          setData(response);
+        } catch (error) {
+          console.error('Error fetching data:', error);
+        }
+        setLoading(false);
+      };
+
+      fetchData();
+    }
+  }, [address, afterEpoch]);
+
+  return (
+    <div className="p-4 mx-5 md:mx-10 lg:mx-20 mb-10">
+      {/* Header with Search Bar */}
+      <header className="flex justify-center items-center text-center mb-4">
+        <SearchBar />
+      </header>
+      <h1 className="text-lg mb-4 pt-10 pb-5 break-words overflow-x-auto">
+        PushScan Results for: <span className="font-bold">{address}</span>
+      </h1>
+      {data && (
+        <div>
+          <NodeResult result={data.result} />
+          {data.items.length > 0 ? (
+            <h3 className="text-lg mb-4 pt-10 pb-0">Parsed Transaction Data</h3>
+          ) : null}
+          {data.items.map((item: any, index: number) => (
+            <ParsedTransactionData key={index} item={item} />
+          ))}
+        </div>
+      )}
+      {loading && <GridLoader />}
+      <button
+        disabled={!data || data?.result.itemCount < 20}
+        onClick={() => setAfterEpoch(parseFloat(data?.result.lastTs))}
+        className={`px-4 py-2 font-semibold rounded-md shadow-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-100 ${
+          !data || data?.result.itemCount < 20
+            ? 'bg-gray-300 text-gray-600 cursor-not-allowed'
+            : 'bg-indigo-600 text-white hover:bg-indigo-500 focus:ring-indigo-500'
+        }`}
+      >
+        Next Transactions
+      </button>
+    </div>
+  );
+};
+
+export default PushScan;
diff --git a/packages/examples/dnode-dapp/src/pages/pushscan/index.tsx b/packages/examples/dnode-dapp/src/pages/pushscan/index.tsx
new file mode 100644
index 000000000..c90b8b21d
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/pages/pushscan/index.tsx
@@ -0,0 +1,112 @@
+// pages/explorer.tsx
+
+import { useState, useEffect } from 'react';
+import SearchBar from '../../components/SearchBar';
+import { useRouter } from 'next/router';
+import Link from 'next/link';
+import { getRecentTransactionAccounts } from '../../utils/push';
+import { formatDate, getCheckSumAddress } from '../../utils';
+
+import dynamic from 'next/dynamic';
+
+const GridLoader = dynamic(() => import('../../components/Loader'), {
+  ssr: false,
+});
+
+export default function Explorer() {
+  const [page, setPage] = useState(1);
+  const [latestNotifications, setLatestNotifications] = useState<
+    { nsId: string; last_usage: string }[]
+  >([]);
+  const [total, setTotal] = useState(20);
+  const size = 10; // Hardcoded in api
+
+  const handleNextPage = () => {
+    setPage((prevPage) => prevPage + 1);
+  };
+
+  const router = useRouter();
+
+  const handleClick = (address: string) => {
+    router.push(`/pushscan/${getCheckSumAddress(address)}`);
+  };
+
+  useEffect(() => {
+    // Fetch initial stats and latest blocks
+    const fetchData = async () => {
+      const recipients = await getRecentTransactionAccounts();
+      setLatestNotifications(recipients);
+    };
+
+    // Polling function
+    const intervalId = setInterval(fetchData, 30000); // 30000 ms = 30 seconds
+
+    // Fetch data immediately on component mount
+    fetchData();
+
+    // Clear interval on component unmount
+    return () => clearInterval(intervalId);
+  }, []);
+
+  return (
+    <div className="p-4 mx-5 md:mx-10 lg:mx-20 mb-10">
+      {/* Header with Search Bar */}
+      <header className="flex justify-center items-center text-center mb-4">
+        <SearchBar />
+      </header>
+
+      <h3 className="text-lg font-semibold text-gray-900 my-10">
+        Latest Transaction Recipients
+      </h3>
+
+      {latestNotifications.length > 0 ? (
+        <ul role="list" className="divide-y divide-gray-100">
+          {latestNotifications.map((notification, index) => (
+            <Link href={`/pushscan/${notification.nsId}`} key={index}>
+              <li className="flex justify-between gap-x-6 py-5 px-4 border border-gray-200 rounded-lg hover:scale-105 transition-transform duration-150 hover:cursor-pointer">
+                <div className="flex min-w-0 gap-x-4">
+                  <img
+                    className="h-12 w-12 flex-none rounded-md bg-gray-50"
+                    src="/user.png"
+                    alt={`${notification.nsId} img`}
+                  />
+                  <div className="min-w-0 flex-auto">
+                    <p className="text-sm font-semibold leading-6 text-gray-900 break-words overflow-x-auto">
+                      {notification.nsId}
+                    </p>
+                  </div>
+                </div>
+                <div className="hidden shrink-0 sm:flex sm:flex-col sm:items-end">
+                  <p className="text-sm leading-6 text-gray-900">
+                    {formatDate(notification.last_usage)}
+                  </p>
+                </div>
+              </li>
+            </Link>
+          ))}
+        </ul>
+      ) : (
+        <GridLoader />
+      )}
+
+      <div className="mt-6 flex justify-end space-x-4">
+        {/* {page > 1 && (
+          <button
+            onClick={() => setPage(page - 1)}
+            className="rounded-md bg-gray-200 px-4 py-2 text-sm font-semibold text-gray-900 hover:bg-gray-300"
+          >
+            Previous Page
+          </button>
+        )} */}
+        {/* {page * size < total && (
+          <button
+            onClick={handleNextPage}
+            className="rounded-md bg-indigo-600 px-4 py-2 text-sm font-semibold text-white hover:bg-indigo-500"
+          >
+            Next Page
+          </button>
+        )} */}
+      </div>
+    </div>
+  );
+}
diff --git a/packages/examples/dnode-dapp/src/styles/globals.css b/packages/examples/dnode-dapp/src/styles/globals.css
new file mode 100644
index 000000000..e6cfb714e
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/styles/globals.css
@@ -0,0 +1,8 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+
+html, body, #root {
+  background-color: #fff;
+}
\ No newline at end of file
diff --git a/packages/examples/dnode-dapp/src/types/index.ts b/packages/examples/dnode-dapp/src/types/index.ts
new file mode 100644
index 000000000..addf581ef
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/types/index.ts
@@ -0,0 +1,19 @@
+export type NetworkStats = {
+  totalUsers: number;
+  totalTransactions: number;
+  totalBlocks: number;
+  tps: number;
+};
+
+export type Block = {
+  blockNumber: number;
+  timestamp: string;
+  transactions: Transaction[];
+};
+
+export type Transaction = {
+  txHash: string;
+  from: string;
+  to: string;
+  value: string;
+};
diff --git a/packages/examples/dnode-dapp/src/utils/index.ts b/packages/examples/dnode-dapp/src/utils/index.ts
new file mode 100644
index 000000000..69d837812
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/utils/index.ts
@@ -0,0 +1,70 @@
+// TODO: Implement All the Fns
+
+import { getAddress } from 'viem';
+import { Block, NetworkStats, Transaction } from '../types';
+
+export const fetchNetworkStats = async (): Promise<NetworkStats> => {
+  return {
+    totalUsers: 100,
+    totalTransactions: 1000,
+    totalBlocks: 1000,
+    tps: 10,
+  };
+};
+
+export const fetchLatestBlocks = async (limit: number): Promise<Block[]> => {
+  return [
+    {
+      blockNumber: 1000,
+      timestamp: new Date().toISOString(),
+      transactions: [],
+    },
+    {
+      blockNumber: 999,
+      timestamp: new Date().toISOString(),
+      transactions: [],
+    },
+  ];
+};
+
+export const fetchBlock = async (blockNumber: number): Promise<Block> => {
+  return {
+    blockNumber,
+    timestamp: new Date().toISOString(),
+    transactions: [],
+  };
+};
+
+export const fetchTransaction = async (
+  txHash: string
+): Promise<Transaction> => {
+  return {
+    txHash,
+    from: '0x1234567890',
+    to: '0x0987654321',
+    value: '1000',
+  };
+};
+
+export const getCheckSumAddress = (address: string): string => {
+  const addr = address.toLowerCase();
+  try {
+    return getAddress(addr);
+  } catch (e) {
+    return addr;
+  }
+};
+
+export const formatDate = (dateString: string): string => {
+  const date = new Date(dateString);
+  if (isNaN(date.getTime())) {
+    return 'Invalid date';
+  }
+  return date.toLocaleDateString('en-US', {
+    year: 'numeric',
+    month: 'long',
+    day: 'numeric',
+    hour: '2-digit',
+    minute: '2-digit',
+  });
+};
diff --git a/packages/examples/dnode-dapp/src/utils/push.ts b/packages/examples/dnode-dapp/src/utils/push.ts
new file mode 100644
index 000000000..ec5ad93b7
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/utils/push.ts
@@ -0,0 +1,47 @@
+import { PushAPI } from '@pushprotocol/dnode';
+import { ENV } from '@pushprotocol/dnode/src/lib/constants';
+import axios from 'axios';
+import { getCheckSumAddress } from '.';
+
+const env = ENV.DEV;
+
+export const sendNotification = async (
+  title: string,
+  body: string,
+  recipient: string[],
+  signer: any
+) => {
+  const userAlice = await PushAPI.initialize(signer, { env });
+  const parsedRecipients = recipient.map((r) => getCheckSumAddress(r));
+  return await userAlice.channel.send(parsedRecipients, {
+    notification: {
+      title,
+      body,
+    },
+  });
+};
+
+export const getChannelInfo = async (signer: any) => {
+  const userAlice = await PushAPI.initialize(signer, { env });
+  return await userAlice.channel.info();
+};
+
+export const getAddressTrx = async (address: string, afterEpoch?: number) => {
+  const userAlice = await PushAPI.initialize(null, { env, account: address });
+  return await userAlice.notification.list('INBOX', {
+    afterEpoch,
+  });
+};
+
+export const getRecentTransactionAccounts = async () => {
+  // Example with no additional data or headers
+  return await axios
+    .post('https://s1.dev.push.org/api/v1/kv/ns/all')
+    .then((response) => {
+      return response.data;
+    })
+    .catch((error) => {
+      console.error('Error:', error);
+      return [];
+    });
+};
diff --git a/packages/examples/dnode-dapp/src/wagmi.ts b/packages/examples/dnode-dapp/src/wagmi.ts
new file mode 100644
index 000000000..15c321856
--- /dev/null
+++ b/packages/examples/dnode-dapp/src/wagmi.ts
@@ -0,0 +1,9 @@
+import { getDefaultConfig } from '@rainbow-me/rainbowkit';
+import { sepolia } from 'wagmi/chains';
+
+export const config = getDefaultConfig({
+  appName: 'dnode dapp',
+  projectId: 'f97bbdd5b40fc16dea40ffe3dee7590d',
+  chains: [sepolia],
+  ssr: true,
+});
diff --git a/packages/examples/dnode-dapp/tailwind.config.js b/packages/examples/dnode-dapp/tailwind.config.js
new file mode 100644
index 000000000..df63bdaa6
--- /dev/null
+++ b/packages/examples/dnode-dapp/tailwind.config.js
@@ -0,0 +1,8 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+  content: ['./src/**/*.{js,ts,jsx,tsx,mdx}'],
+  theme: {
+    extend: {},
+  },
+  plugins: [require('@tailwindcss/forms')],
+};
diff --git a/packages/examples/dnode-dapp/tsconfig.json b/packages/examples/dnode-dapp/tsconfig.json
new file mode 100644
index 000000000..99710e857
--- /dev/null
+++ b/packages/examples/dnode-dapp/tsconfig.json
@@ -0,0 +1,20 @@
+{
+  "compilerOptions": {
+    "target": "es5",
+    "lib": ["dom", "dom.iterable", "esnext"],
+    "allowJs": true,
+    "skipLibCheck": true,
+    "strict": true,
+    "forceConsistentCasingInFileNames": true,
+    "noEmit": true,
+    "esModuleInterop": true,
+    "module": "esnext",
+    "moduleResolution": "node",
+    "resolveJsonModule": true,
+    "isolatedModules": true,
+    "jsx": "preserve",
+    "incremental": true
+  },
+  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+  "exclude": ["node_modules"]
+}
diff --git a/packages/restapi/src/lib/channels/getAllTags.ts b/packages/restapi/src/lib/channels/getAllTags.ts
new file mode 100644
index 000000000..8ab2f46c8
--- /dev/null
+++ b/packages/restapi/src/lib/channels/getAllTags.ts
@@ -0,0 +1,43 @@
+import { getCAIPAddress, getAPIBaseUrls, getQueryParams } from '../helpers';
+import Constants, { ENV } from '../constants';
+import { axiosGet } from '../utils/axiosUtil';
+import CONSTANTS from '../constantsV2';
+
+/**
+ *  GET v1/channels/tags/all
+ */
+export type GetAllTagsOptionsType = {
+  page?: number;
+  limit?: number;
+  order?: string;
+  filter?:string;
+  env?: ENV;
+};
+
+/**
+ *  Returns the tags available based on the filter provided
+ */
+export const getAllTags = async (options: GetAllTagsOptionsType) => {
+  const {
+    page=1,
+    limit=10,
+    order=CONSTANTS.FILTER.CHANNEL_LIST.ORDER.DESCENDING,
+    filter=CONSTANTS.FILTER.TAGS.PUSH,
+    env = Constants.ENV.PROD,
+  } = options || {};
+
+  const API_BASE_URL = getAPIBaseUrls(env);
+  const apiEndpoint = `${API_BASE_URL}/v1/channels`;
+  const queryObj = {
+    page,
+    limit,
+    order,
+    filter,
+  }
+  const requestUrl = `${apiEndpoint}/tags/all?${getQueryParams(queryObj)}`;
+  return await axiosGet(requestUrl)
+    .then((response) => response.data?.tags)
+    .catch((err) => {
+      console.error(`[EPNS-SDK] - API ${requestUrl}: `, err);
+    });
+};
diff --git a/packages/restapi/src/lib/channels/getChannels.ts b/packages/restapi/src/lib/channels/getChannels.ts
index 9ea71d88b..5fe63d54d 100644
--- a/packages/restapi/src/lib/channels/getChannels.ts
+++ b/packages/restapi/src/lib/channels/getChannels.ts
@@ -1,10 +1,8 @@
 import { ENV } from '../constants';
 import CONSTANTS from '../constantsV2';
-
 import { getAPIBaseUrls, getCAIPAddress } from '../helpers';
 import { axiosGet } from '../utils/axiosUtil';
 import { parseSettings } from '../utils/parseSettings';
-
 /**
  *  GET /v1/channels/{addressinCAIP}
  */
@@ -16,21 +14,26 @@ type getChannelsOptionsType = {
   limit?: number;
   sort?: string;
   order?: string;
-}
+  filter?: number;
+  tag?: string;
+};
 
 export const getChannels = async (options: getChannelsOptionsType) => {
-  const { 
-    env = CONSTANTS.ENV.PROD, 
-    page = 1, 
-    limit = 10, 
+  const {
+    env = CONSTANTS.ENV.PROD,
+    page = 1,
+    limit = 10,
     sort = CONSTANTS.FILTER.CHANNEL_LIST.SORT.SUBSCRIBER,
     order = CONSTANTS.FILTER.CHANNEL_LIST.ORDER.DESCENDING,
+    filter,
+    tag,
   } = options || {};
 
   const API_BASE_URL = getAPIBaseUrls(env);
   const apiEndpoint = `${API_BASE_URL}/v1/channels`;
-  const requestUrl = `${apiEndpoint}?page=${page}&limit=${limit}&sort=${sort}&order=${order}`;
-
+  const requestUrl = `${apiEndpoint}?page=${page}&limit=${limit}&sort=${sort}&order=${order}${
+    filter ? '&filter=' + filter : ''
+  }${tag ? '&tag=' + tag : ''}`;
   return await axiosGet(requestUrl)
     .then((response) => {
       return response.data;
diff --git a/packages/restapi/src/lib/channels/getTags.ts b/packages/restapi/src/lib/channels/getTags.ts
new file mode 100644
index 000000000..5d2ede7e8
--- /dev/null
+++ b/packages/restapi/src/lib/channels/getTags.ts
@@ -0,0 +1,38 @@
+import {
+    getCAIPAddress,
+    getAPIBaseUrls
+  } from '../helpers';
+  import Constants, { ENV } from '../constants';
+  import { axiosGet } from '../utils/axiosUtil';
+
+  /**
+   *  GET v1/channels/${channelAddressInCAIP}/tags
+   */
+  export type GetTagsOptionsType = {
+    /** address of the channel */
+    channel: string;
+    env?: ENV;
+  }
+
+  /**
+   *  Returns the list of tags associated with the channel
+   */
+  export const getTags = async (
+    options : GetTagsOptionsType
+  ) => {
+    const {
+      channel,
+      env = Constants.ENV.PROD,
+    } = options || {};
+
+    const _channel = await getCAIPAddress(env, channel, 'Channel');
+    const API_BASE_URL = getAPIBaseUrls(env);
+    const apiEndpoint = `${API_BASE_URL}/v1/channels`;
+    const requestUrl = `${apiEndpoint}/${_channel}/tags`;
+
+    return await axiosGet(requestUrl)
+      .then((response) => response.data?.tags)
+      .catch((err) => {
+        console.error(`[EPNS-SDK] - API ${requestUrl}: `, err);
+      });
+  }
diff --git a/packages/restapi/src/lib/channels/index.ts b/packages/restapi/src/lib/channels/index.ts
index 8728fc02a..a2a20849c 100644
--- a/packages/restapi/src/lib/channels/index.ts
+++ b/packages/restapi/src/lib/channels/index.ts
@@ -5,8 +5,10 @@ export * from './getChannels';
 export * from './getDelegates';
 export * from './getSubscribers';
 export * from './search';
+export * from './getTags';
+export * from './searchTags';
 export * from './subscribe';
 export * from './subscribeV2';
 export * from './unsubscribe';
 export * from './unsubscribeV2';
-
+export * from './getAllTags'
\ No newline at end of file
diff --git a/packages/restapi/src/lib/channels/search.ts b/packages/restapi/src/lib/channels/search.ts
index 0abe5a628..957906537 100644
--- a/packages/restapi/src/lib/channels/search.ts
+++ b/packages/restapi/src/lib/channels/search.ts
@@ -1,11 +1,11 @@
 import { getAPIBaseUrls, getQueryParams, getLimit } from '../helpers';
-import Constants, {ENV} from '../constants';
+import Constants, { ENV } from '../constants';
 import { axiosGet } from '../utils/axiosUtil';
 
 /**
- *  GET /v1/channels/search/ 
+ *  GET /v1/channels/search/
  *  optional params: page=(1)&limit=(20{min:1}{max:30})&query=(searchquery)
- *  
+ *
  */
 
 export type SearchChannelOptionsType = {
@@ -13,16 +13,21 @@ export type SearchChannelOptionsType = {
   env?: ENV;
   page?: number;
   limit?: number;
-}
+  filter?: number;
+  tag?: string;
+  // temp fix to support both new and old format
+  oldFormat?: boolean;
+};
 
-export const search = async (
-  options: SearchChannelOptionsType
-) => {
+export const search = async (options: SearchChannelOptionsType) => {
   const {
     query,
     env = Constants.ENV.PROD,
     page = Constants.PAGINATION.INITIAL_PAGE,
     limit = Constants.PAGINATION.LIMIT,
+    filter,
+    tag,
+    oldFormat = true,
   } = options || {};
 
   if (!query) throw Error('"query" not provided!');
@@ -31,12 +36,28 @@ export const search = async (
   const queryObj = {
     page,
     limit: getLimit(limit),
-    query: query
+    query,
+    ...(tag && { tag }),
+    ...(filter && { filter }),
   };
   const requestUrl = `${apiEndpoint}?${getQueryParams(queryObj)}`;
   return axiosGet(requestUrl)
-    .then((response) => response.data.channels)
+    .then((response) => {
+      const channels = response.data.channels;
+      const itemCount = response.data.itemCount || channels.length;
+
+      const formattedResponse = {
+        itemCount,
+        result: channels,
+      };
+
+      if (typeof oldFormat !== 'undefined' && oldFormat) {
+        return channels; // Old format: return array directly
+      }
+
+      return formattedResponse; // New format: return {itemCount, result}
+    })
     .catch((err) => {
       console.error(`[Push SDK] - API ${requestUrl}: `, err);
     });
-}
+};
diff --git a/packages/restapi/src/lib/channels/searchTags.ts b/packages/restapi/src/lib/channels/searchTags.ts
new file mode 100644
index 000000000..814e4860a
--- /dev/null
+++ b/packages/restapi/src/lib/channels/searchTags.ts
@@ -0,0 +1,41 @@
+import { getAPIBaseUrls, getQueryParams, getLimit } from '../helpers';
+import Constants, {ENV} from '../constants';
+import { axiosGet } from '../utils/axiosUtil';
+
+/**
+ *  GET /v1/channels/search/
+ *  optional params: page=(1)&limit=(20{min:1}{max:30})&query=(searchquery)
+ */
+
+export type SearchChannelTagsOptionsType = {
+  query: string;
+  env?: ENV;
+  page?: number;
+  limit?: number;
+}
+
+export const searchTags = async (
+  options: SearchChannelTagsOptionsType
+) => {
+  const {
+    query,
+    env = Constants.ENV.LOCAL,
+    page = Constants.PAGINATION.INITIAL_PAGE,
+    limit = Constants.PAGINATION.LIMIT,
+  } = options || {};
+
+  if (!query) throw Error('"query" not provided!');
+  const API_BASE_URL = getAPIBaseUrls(env);
+  const apiEndpoint = `${API_BASE_URL}/v1/channels/search/tags`;
+  const queryObj = {
+    page,
+    limit: getLimit(limit),
+    query: query
+  };
+  const requestUrl = `${apiEndpoint}?${getQueryParams(queryObj)}`;
+  return axiosGet(requestUrl)
+    .then((response) => response.data.channels)
+    .catch((err) => {
+      console.error(`[Push SDK] - API ${requestUrl}: `, err);
+    });
+}
diff --git a/packages/restapi/src/lib/config.ts b/packages/restapi/src/lib/config.ts
index 235bb709f..e3a9a0599 100644
--- a/packages/restapi/src/lib/config.ts
+++ b/packages/restapi/src/lib/config.ts
@@ -222,7 +222,7 @@ export const CORE_CONFIG = {
     EPNS_CORE_CONTRACT: '0x5ab1520e2bd519bdab2e1347eee81c00a77f4946',
   },
   [ENV.LOCAL]: {
-    API_BASE_URL: API_BASE_URL[ENV.DEV],
+    API_BASE_URL: API_BASE_URL[ENV.LOCAL],
     EPNS_CORE_CONTRACT: '0x5ab1520e2bd519bdab2e1347eee81c00a77f4946',
   },
 };
diff --git a/packages/restapi/src/lib/constantsV2.ts b/packages/restapi/src/lib/constantsV2.ts
index c7662e75f..ef27e461c 100644
--- a/packages/restapi/src/lib/constantsV2.ts
+++ b/packages/restapi/src/lib/constantsV2.ts
@@ -65,6 +65,11 @@ const CONSTANTS = {
       ORDER: ChannelListOrderType,
     },
     NOTIFICATION_TYPE: NotifictaionType,
+    TAGS: {
+      USER: 'USER',
+      PUSH: 'PUSH',
+      ALL: '*',
+    },
   },
 };
 
diff --git a/packages/restapi/src/lib/pushNotification/PushNotificationTypes.ts b/packages/restapi/src/lib/pushNotification/PushNotificationTypes.ts
index dc3c6c20f..79407f65e 100644
--- a/packages/restapi/src/lib/pushNotification/PushNotificationTypes.ts
+++ b/packages/restapi/src/lib/pushNotification/PushNotificationTypes.ts
@@ -53,6 +53,10 @@ export type FeedsOptions = {
 export type ChannelSearchOptions = {
   page?: number;
   limit?: number;
+  filter?: number;
+  // temp fix to support both new and old format
+  oldFormat?: boolean;
+  tag?: string;
 };
 
 // Types related to notification
@@ -105,6 +109,7 @@ export type CreateChannelOptions = {
   icon: string;
   url: string;
   alias?: string;
+  tags?: string[];
   progressHook?: (progress: ProgressHookType) => void;
 };
 
@@ -151,9 +156,16 @@ export type ChannelListOptions = {
   limit?: number;
   sort?: ChannelListSortType;
   order?: ChannelListOrderType;
+  filter?: number;
+  tag?: string;
 };
 
-
+export type TagListOptions = {
+  page?: number;
+  limit?: number;
+  order?: ChannelListOrderType;
+  filter?: "PUSH" | "USER" | "*"; 
+}
 
 
 
diff --git a/packages/restapi/src/lib/pushNotification/channel.ts b/packages/restapi/src/lib/pushNotification/channel.ts
index cc2a48f8f..0b93273bf 100644
--- a/packages/restapi/src/lib/pushNotification/channel.ts
+++ b/packages/restapi/src/lib/pushNotification/channel.ts
@@ -30,15 +30,19 @@ import {
 
 import { Alias } from './alias';
 import { Delegate } from './delegate';
+import { Tags } from './tags';
 import { PushNotificationBaseClass } from './pushNotificationBase';
 
 export class Channel extends PushNotificationBaseClass {
   public delegate!: Delegate;
   public alias!: Alias;
+  public tags!: Tags;
+
   constructor(signer?: SignerType, env?: ENV, account?: string) {
     super(signer, env, account);
     this.delegate = new Delegate(signer, env, account);
     this.alias = new Alias(signer, env, account);
+    this.tags = new Tags(this, signer, env, account);
   }
 
   /**
@@ -73,12 +77,18 @@ export class Channel extends PushNotificationBaseClass {
       const {
         page = Constants.PAGINATION.INITIAL_PAGE,
         limit = Constants.PAGINATION.LIMIT,
+        filter,
+        tag,
+        oldFormat = true
       } = options || {};
       return await PUSH_CHANNEL.search({
         query: query,
         page: page,
         limit: limit,
+        filter: filter,
+        tag: tag,
         env: this.env,
+        oldFormat
       });
     } catch (error) {
       throw new Error(`Push SDK Error: API : channel::search : ${error}`);
@@ -158,6 +168,8 @@ export class Channel extends PushNotificationBaseClass {
       alias = null,
       progressHook,
     } = options || {};
+
+    let tags = options.tags;
     try {
       // create push token instance
       let aliasInfo;
@@ -188,6 +200,17 @@ export class Channel extends PushNotificationBaseClass {
             aliasDetails?.address,
         };
       }
+      // check for tags length
+      if (tags && tags.length > 5) {
+        tags = tags.slice(0, 5);
+      }
+
+      const tagsStr = tags && tags.length > 0 ? tags.join('') : '';
+
+      if (tagsStr.length > 512) {
+        throw new Error('Tags length should not exceed 512 characters');
+      }
+
       // construct channel identity
       progressHook?.(PROGRESSHOOK['PUSH-CREATE-01'] as ProgressHookType);
       const input = {
@@ -196,6 +219,7 @@ export class Channel extends PushNotificationBaseClass {
         url: url,
         icon: icon,
         aliasDetails: aliasInfo ?? {},
+        tags
       };
       const cid = await this.uploadToIPFSViaPushNode(JSON.stringify(input));
       const allowanceAmount = await this.fetchAllownace(
@@ -248,6 +272,7 @@ export class Channel extends PushNotificationBaseClass {
       alias = null,
       progressHook,
     } = options || {};
+    let tags = options.tags;
     try {
       // create push token instance
       let aliasInfo;
@@ -284,6 +309,14 @@ export class Channel extends PushNotificationBaseClass {
             aliasDetails?.address,
         };
       }
+
+      // check for tags length
+      if (tags && tags.length > 5) {
+        tags = tags.slice(0, 5);
+      }
+
+      const tagsStr = tags && tags.length > 0 ? tags.join('') : '';
+
       // construct channel identity
       progressHook?.(PROGRESSHOOK['PUSH-UPDATE-01'] as ProgressHookType);
       const input = {
@@ -292,6 +325,7 @@ export class Channel extends PushNotificationBaseClass {
         url: url,
         icon: icon,
         aliasDetails: aliasInfo ?? {},
+        tags
       };
       const cid = await this.uploadToIPFSViaPushNode(JSON.stringify(input));
       // approve the tokens to core contract
@@ -444,6 +478,8 @@ export class Channel extends PushNotificationBaseClass {
         limit,
         sort = ChannelListSortType.SUBSCRIBER,
         order = ChannelListOrderType.DESCENDING,
+        filter,
+        tag,
       } = options || {};
 
       return await PUSH_CHANNEL.getChannels({
@@ -452,6 +488,8 @@ export class Channel extends PushNotificationBaseClass {
         limit,
         sort,
         order,
+        filter,
+        tag
       });
     } catch (error) {
       throw new Error(`Push SDK Error: Contract : channel::list : ${error}`);
diff --git a/packages/restapi/src/lib/pushNotification/tags.ts b/packages/restapi/src/lib/pushNotification/tags.ts
new file mode 100644
index 000000000..b0fdcf3be
--- /dev/null
+++ b/packages/restapi/src/lib/pushNotification/tags.ts
@@ -0,0 +1,157 @@
+import Constants, { ENV } from '../constants';
+import { SignerType } from '../types';
+import {
+  ChannelInfoOptions,
+  ChannelSearchOptions,
+  TagListOptions
+} from './PushNotificationTypes';
+import * as PUSH_CHANNEL from '../channels';
+import { PushNotificationBaseClass } from './pushNotificationBase';
+import { Channel } from './channel';
+import ConstantsV2 from '../constantsV2';
+export class Tags extends PushNotificationBaseClass {
+  private channel: Channel;
+
+  constructor(
+    channel: Channel,
+    signer?: SignerType,
+    env?: ENV,
+    account?: string
+  ) {
+    super(signer, env, account);
+    this.channel = channel;
+  }
+
+  /**
+   * @description - Get delegates of a channell
+   * @param {string} [options.channel] - channel in caip. defaults to account from signer with eth caip
+   * @returns array of delegates
+   */
+  get = async (options?: ChannelInfoOptions) => {
+    try {
+      this.checkSignerObjectExists();
+      const channel = await this.channel.info();
+      return await PUSH_CHANNEL.getTags({
+        channel: channel,
+        env: this.env,
+      });
+    } catch (error) {
+      throw new Error(`Push SDK Error: API : tags::get : ${error}`);
+    }
+  };
+
+  /**
+   * @description adds tags for a channel
+   * @param {Array<string>} tags - tags to be added
+   * @returns the tags if the transaction is successfull
+   */
+  add = async (tags: Array<string>) => {
+    try {
+      this.checkSignerObjectExists();
+      const channel = await this.channel.info();
+
+      const resp = await this.channel.update({
+        name: channel.name,
+        description: channel.info,
+        url: channel.url,
+        icon: channel.icon,
+        tags: tags,
+      });
+
+      return { tags };
+    } catch (error) {
+      throw new Error(`Push SDK Error: Contract : tags::add : ${error}`);
+    }
+  };
+
+  /**
+   * @description update tags for a channel
+   * @param {Array<string>} tags - tags to be added
+   * @returns the tags if the transaction is successfull
+   */
+  update = async (tags: Array<string>) => {
+    try {
+      this.checkSignerObjectExists();
+      const channel = await this.channel.info();
+      await this.channel.update({
+        name: channel.name,
+        description: channel.info,
+        url: channel.url,
+        icon: channel.icon,
+        tags: tags,
+      });
+
+      return { tags };
+    } catch (error) {
+      throw new Error(`Push SDK Error: Contract : tags::update : ${error}`);
+    }
+  };
+
+  /**
+   * @description removes tags from a channel
+   * @returns status of the request
+   */
+  remove = async () => {
+    try {
+      this.checkSignerObjectExists();
+      const channel = await this.channel.info();
+      await this.channel.update({
+        name: channel.name,
+        description: channel.info,
+        url: channel.url,
+        icon: channel.icon,
+        tags: [],
+      });
+
+      return { status: 'success' };
+    } catch (error) {
+      throw new Error(`Push SDK Error: Contract : tags::remove : ${error}`);
+    }
+  };
+
+  /**
+   * @description - returns relevant information as per the query that was passed
+   * @param {string} query - search query
+   * @param {number} [options.page] -  page number. default is set to Constants.PAGINATION.INITIAL_PAGE
+   * @param {number} [options.limit] - number of feeds per page. default is set to Constants.PAGINATION.LIMIT
+   * @returns Array of results relevant to the serach query
+   */
+  search = async (query: string, options?: ChannelSearchOptions) => {
+    try {
+      const {
+        page = Constants.PAGINATION.INITIAL_PAGE,
+        limit = Constants.PAGINATION.LIMIT,
+      } = options || {};
+
+      return await PUSH_CHANNEL.searchTags({
+        query: query,
+        page: page,
+        limit: limit,
+        env: this.env,
+      });
+    } catch (error) {
+      throw new Error(`Push SDK Error: API : channel::tags::search : ${error}`);
+    }
+  };
+
+  list = async (options?: TagListOptions) => {
+    try {
+      const {
+        page = Constants.PAGINATION.INITIAL_PAGE,
+        limit = Constants.PAGINATION.LIMIT,
+        order = ConstantsV2.FILTER.CHANNEL_LIST.ORDER.DESCENDING,
+        filter = ConstantsV2.FILTER.TAGS.PUSH,
+      } = options || {};
+
+      return await PUSH_CHANNEL.getAllTags({
+        page: page,
+        limit: limit,
+        order: order,
+        filter: filter,
+        env: this.env,
+      });
+    } catch (error) {
+      throw new Error(`Push SDK Error: API : channel::tags::list : ${error}`);
+    }
+  };
+}
diff --git a/packages/restapi/tests/lib/channel/getChannels.test.ts b/packages/restapi/tests/lib/channel/getChannels.test.ts
new file mode 100644
index 000000000..380fd3171
--- /dev/null
+++ b/packages/restapi/tests/lib/channel/getChannels.test.ts
@@ -0,0 +1,21 @@
+import { getChannels } from '../../../src/lib/channels/getChannels';
+import { ENV } from '../../../src/lib/constants';
+import { expect } from 'chai';
+
+describe('PUSH_CHANNELS.getChannels', () => {
+  it('Should fetch channels based on the filter', async () => {
+    const res = await getChannels({
+      filter: 80002,
+      env: ENV.DEV,
+    });
+    console.log(res);
+  });
+
+  it('Should fetch channels based on the filter and tags', async () => {
+    const res = await getChannels({
+      env: ENV.DEV,
+      tag: 'Infrastructure'
+    });
+    console.log(res.channels[0]);
+  });
+});
diff --git a/packages/restapi/tests/lib/channel/search.test.ts b/packages/restapi/tests/lib/channel/search.test.ts
new file mode 100644
index 000000000..0c63ba9c5
--- /dev/null
+++ b/packages/restapi/tests/lib/channel/search.test.ts
@@ -0,0 +1,34 @@
+import { search } from '../../../src/lib/channels/search';
+import { ENV } from '../../../src/lib/constants';
+import { expect } from 'chai';
+
+describe('PUSH_CHANNELS.search', () => {
+  it('Should fetch channels based on the filter', async () => {
+    const res = await search({
+      filter: 80002,
+      env: ENV.DEV,
+      query: "Node"
+    });
+    console.log(res);
+  });
+
+  it('Should fetch channels based on the filter in new format', async () => {
+    const res = await search({
+      filter: 80002,
+      env: ENV.DEV,
+      query: "Node",
+      oldFormat: false
+    });
+    console.log(res);
+  });
+
+  it('Should fetch channels based on the filter in new format', async () => {
+    const res = await search({
+      env: ENV.DEV,
+      query: "a",
+      oldFormat: false,
+      tag: "Infrastructure"
+    });
+    console.log(res);
+  });
+});
diff --git a/packages/restapi/tests/lib/notification/channel.test.ts b/packages/restapi/tests/lib/notification/channel.test.ts
index f2193db11..189ee28f0 100644
--- a/packages/restapi/tests/lib/notification/channel.test.ts
+++ b/packages/restapi/tests/lib/notification/channel.test.ts
@@ -106,6 +106,12 @@ describe('PushAPI.channel functionality', () => {
       expect(res).not.null;
     });
 
+    it('With signer: Should return response in new fromat', async () => {
+      const res = await userBob.channel.search('Node', { oldFormat: false });
+      // console.log(res);
+      expect(res).not.null;
+    });
+
     it('Should throw error for empty query', async () => {
       // const res = await userBob.channel.search('')
       await expect(() => userBob.channel.search('')).to.Throw;
@@ -586,4 +592,11 @@ describe('PushAPI.channel functionality', () => {
       expect(res).not.null;
     });
   });
+  describe('tags', () => {
+    it('Should fetch all tags', async () => {
+      const res = await userAlice.channel.tags.list();
+      console.log(res);
+      expect(res).not.null;
+    });
+  });
 });
diff --git a/packages/restapi/tests/lib/notification/tags.test.ts b/packages/restapi/tests/lib/notification/tags.test.ts
new file mode 100644
index 000000000..e0b1abf98
--- /dev/null
+++ b/packages/restapi/tests/lib/notification/tags.test.ts
@@ -0,0 +1,124 @@
+import { PushAPI } from '../../../src/lib/pushapi/PushAPI'; // Ensure correct import path
+import { expect } from 'chai';
+import { ethers } from 'ethers';
+import { sepolia } from 'viem/chains';
+import { createWalletClient, http } from 'viem';
+import { privateKeyToAccount } from 'viem/accounts';
+// import tokenABI from './tokenABI';
+import { ENV } from '../../../src/lib/constants';
+
+describe('PushAPI.tags functionality', () => {
+  let userAlice: PushAPI;
+  let userBob: PushAPI;
+  let userKate: PushAPI;
+  let signer1: any;
+  let account1: string;
+  let signer2: any;
+  let viemUser: any;
+  let account2: string;
+
+  // accessing env dynamically using process.env
+  type EnvStrings = keyof typeof ENV;
+  const envMode = process.env.ENV as EnvStrings;
+  const _env = ENV[envMode];
+
+  beforeEach(async () => {
+    signer1 = new ethers.Wallet(`0x${process.env['WALLET_PRIVATE_KEY']}`);
+    account1 = await signer1.getAddress();
+
+    const provider = (ethers as any).providers
+      ? new (ethers as any).providers.JsonRpcProvider('https://rpc.sepolia.org')
+      : new (ethers as any).JsonRpcProvider('https://rpc.sepolia.org');
+
+    signer2 = new ethers.Wallet(
+      `0x${process.env['WALLET_PRIVATE_KEY']}`,
+      provider
+    );
+    const signer3 = createWalletClient({
+      account: privateKeyToAccount(`0x${process.env['WALLET_PRIVATE_KEY']}`),
+      chain: sepolia,
+      transport: http(),
+    });
+
+    account2 = await signer2.getAddress();
+
+    // initialisation with signer and provider
+    userKate = await PushAPI.initialize(signer2, { env: _env });
+    // initialisation with signer
+    userAlice = await PushAPI.initialize(signer1, { env: _env });
+    // initialisation without signer
+    userBob = await PushAPI.initialize(signer1, { env: _env });
+    // initalisation with viem
+    viemUser = await PushAPI.initialize(signer3, { env: _env });
+  });
+
+  describe('tags :: add', () => {
+    // TODO: remove skip after signer becomes optional
+    it('Without signer and account :: should throw error', async () => {
+      await expect(() => userBob.channel.tags.add(['tag1', 'tag2', 'tag3'])).to
+        .Throw;
+    });
+
+    it('With signer and without provider :: should throw error', async () => {
+      await expect(() => userAlice.channel.tags.add(['tag1', 'tag2', 'tag3']))
+        .to.Throw;
+    });
+
+    it('With signer and provider :: should add tags', async () => {
+      const tags = ['tag1', 'tag2', 'tag3'];
+      const res = await userKate.channel.tags.add(tags);
+      expect(res).not.null;
+      expect(res.tags).equal(tags);
+    }, 100000000);
+
+    it('With viem signer and provider :: should add tags', async () => {
+      const tags = ['tag1', 'tag2', 'tag3'];
+      const res = await viemUser.channel.tags.add(tags);
+      expect(res).not.null;
+      expect(res.tags).equal(tags);
+    }, 100000000);
+  });
+
+  describe('tags :: update', () => {
+    // TODO: remove skip after signer becomes optional
+    it('Without signer and account :: should throw error', async () => {
+      await expect(() => userBob.channel.tags.update(['tag1', 'tag2', 'tag3']))
+        .to.Throw;
+    });
+
+    it('With signer and without provider :: should throw error', async () => {
+      await expect(() =>
+        userAlice.channel.tags.update(['tag1', 'tag2', 'tag3'])
+      ).to.Throw;
+    });
+
+    it('With signer and provider :: should update tags', async () => {
+      const tags = ['tag1', 'tag2', 'tag3'];
+      const res = await userKate.channel.tags.update(tags);
+      expect(res.tags).equal(tags);
+    }, 100000000);
+
+    it('With viem signer and provider :: should update tags', async () => {
+      const tags = ['tag1', 'tag2', 'tag3'];
+      const res = await viemUser.channel.tags.update(tags);
+      expect(res.tags).equal(tags);
+    }, 100000000);
+  });
+
+  describe('tags :: remove', () => {
+    // TODO: remove skip after signer becomes optional
+    it('Without signer and account :: should throw error', async () => {
+      await expect(() => userBob.channel.tags.remove()).to.Throw;
+    });
+
+    it('With signer and without provider :: should throw error', async () => {
+      await expect(() => userAlice.channel.tags.remove()).to.Throw;
+    });
+
+    it('With signer and provider :: should remove tags', async () => {
+      await userKate.channel.tags.update(['tag1', 'tag2', 'tag3']);
+      const res = await userKate.channel.tags.remove();
+      expect(res.status).equal('success');
+    }, 100000000);
+  });
+});
diff --git a/packages/restapi/tests/root.ts b/packages/restapi/tests/root.ts
index 3e36df7a9..3ef257559 100644
--- a/packages/restapi/tests/root.ts
+++ b/packages/restapi/tests/root.ts
@@ -3,27 +3,29 @@ import * as path from 'path';
 
 export const mochaHooks = {
   // This file is needed to end the test suite.
-    beforeAll: [
-      async function () {
+  beforeAll: [
+    async function () {
       // Load .env file
-      const envFound = dotenv.config({ path: path.resolve(__dirname, './.env')})
+      const envFound = dotenv.config({
+        path: path.resolve(__dirname, './.env'),
+      });
       // check if .env exists
-      if (!envFound) {
-        console.log('     .env NOT FOUND     ');
-        process.exit(1);
-      } else {
-        // Check environment setup first
-        console.log('     Verifying ENV     ')
-        const EnvVerifierLoader = (await require('./loaders/envVerifier')).default
-        await EnvVerifierLoader()
-        console.log('     ENV Verified / Generated and Loaded!     ')
-      }
-      },
-    ],
+      // if (!envFound) {
+      //   console.log('     .env NOT FOUND     ');
+      //   process.exit(1);
+      // } else {
+      //   // Check environment setup first
+      //   console.log('     Verifying ENV     ')
+      //   const EnvVerifierLoader = (await require('./loaders/envVerifier')).default
+      //   await EnvVerifierLoader()
+      //   console.log('     ENV Verified / Generated and Loaded!     ')
+      // }
+    },
+  ],
 
   afterAll(done: () => void) {
     done();
     console.log('     ALL TEST CASES EXECUTED     ');
     process.exit(0);
   },
-};
\ No newline at end of file
+};
diff --git a/packages/restapi/yarn.lock b/packages/restapi/yarn.lock
index 8befd7352..8dcb73805 100644
--- a/packages/restapi/yarn.lock
+++ b/packages/restapi/yarn.lock
@@ -79,9 +79,9 @@ __metadata:
   linkType: hard
 
 "@jridgewell/sourcemap-codec@npm:^1.4.10":
-  version: 1.4.15
-  resolution: "@jridgewell/sourcemap-codec@npm:1.4.15"
-  checksum: 10c0/0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5
+  version: 1.5.0
+  resolution: "@jridgewell/sourcemap-codec@npm:1.5.0"
+  checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18
   languageName: node
   linkType: hard
 
@@ -136,12 +136,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@noble/curves@npm:1.4.0, @noble/curves@npm:~1.4.0":
-  version: 1.4.0
-  resolution: "@noble/curves@npm:1.4.0"
+"@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0":
+  version: 1.4.2
+  resolution: "@noble/curves@npm:1.4.2"
   dependencies:
     "@noble/hashes": "npm:1.4.0"
-  checksum: 10c0/31fbc370df91bcc5a920ca3f2ce69c8cf26dc94775a36124ed8a5a3faf0453badafd2ee4337061ffea1b43c623a90ee8b286a5a81604aaf9563bdad7ff795d18
+  checksum: 10c0/65620c895b15d46e8087939db6657b46a1a15cd4e0e4de5cd84b97a0dfe0af85f33a431bb21ac88267e3dc508618245d4cb564213959d66a84d690fe18a63419
   languageName: node
   linkType: hard
 
@@ -231,9 +231,9 @@ __metadata:
   linkType: soft
 
 "@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2, @scure/base@npm:~1.1.6":
-  version: 1.1.7
-  resolution: "@scure/base@npm:1.1.7"
-  checksum: 10c0/2d06aaf39e6de4b9640eb40d2e5419176ebfe911597856dcbf3bc6209277ddb83f4b4b02cb1fd1208f819654268ec083da68111d3530bbde07bae913e2fc2e5d
+  version: 1.1.9
+  resolution: "@scure/base@npm:1.1.9"
+  checksum: 10c0/77a06b9a2db8144d22d9bf198338893d77367c51b58c72b99df990c0a11f7cadd066d4102abb15e3ca6798d1529e3765f55c4355742465e49aed7a0c01fe76e8
   languageName: node
   linkType: hard
 
@@ -353,10 +353,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/chai@npm:*, @types/chai@npm:^4.3.4":
-  version: 4.3.16
-  resolution: "@types/chai@npm:4.3.16"
-  checksum: 10c0/745d4a9be429d5d86a7ab26064610b8957fe12dd80e94dc7d0707cf3db1c889e3ffe0d73d69bb15e6d376bf4462a7a75e9d8fc1051750b5d656d6cfe459829b7
+"@types/chai@npm:*":
+  version: 5.0.0
+  resolution: "@types/chai@npm:5.0.0"
+  checksum: 10c0/fcce55f2bbb8485fc860a1dcbac17c1a685b598cfc91a55d37b65b1642b921cf736caa8cce9dcc530830d900f78ab95cf43db4e118db34a5176f252cacd9e1e8
+  languageName: node
+  linkType: hard
+
+"@types/chai@npm:^4.3.4":
+  version: 4.3.20
+  resolution: "@types/chai@npm:4.3.20"
+  checksum: 10c0/4601189d611752e65018f1ecadac82e94eed29f348e1d5430e5681a60b01e1ecf855d9bcc74ae43b07394751f184f6970fac2b5561fc57a1f36e93a0f5ffb6e8
   languageName: node
   linkType: hard
 
@@ -368,9 +375,9 @@ __metadata:
   linkType: hard
 
 "@types/mocha@npm:^10.0.1":
-  version: 10.0.6
-  resolution: "@types/mocha@npm:10.0.6"
-  checksum: 10c0/4526c9e88388f9e1004c6d3937c5488a39908810f26b927173c58d52b43057f3895627dc06538e96706e08b88158885f869ec6311f6b58fd72bdef715f26d6c3
+  version: 10.0.9
+  resolution: "@types/mocha@npm:10.0.9"
+  checksum: 10c0/76dd782ac7e971ea159d4a7fd40c929afa051e040be3f41187ff03a2d7b3279e19828ddaa498ba1757b3e6b91316263bb7640db0e906938275b97a06e087b989
   languageName: node
   linkType: hard
 
@@ -404,20 +411,20 @@ __metadata:
   linkType: hard
 
 "acorn-walk@npm:^8.1.1":
-  version: 8.3.3
-  resolution: "acorn-walk@npm:8.3.3"
+  version: 8.3.4
+  resolution: "acorn-walk@npm:8.3.4"
   dependencies:
     acorn: "npm:^8.11.0"
-  checksum: 10c0/4a9e24313e6a0a7b389e712ba69b66b455b4cb25988903506a8d247e7b126f02060b05a8a5b738a9284214e4ca95f383dd93443a4ba84f1af9b528305c7f243b
+  checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62
   languageName: node
   linkType: hard
 
 "acorn@npm:^8.11.0, acorn@npm:^8.4.1":
-  version: 8.12.0
-  resolution: "acorn@npm:8.12.0"
+  version: 8.12.1
+  resolution: "acorn@npm:8.12.1"
   bin:
     acorn: bin/acorn
-  checksum: 10c0/a19f9dead009d3b430fa3c253710b47778cdaace15b316de6de93a68c355507bc1072a9956372b6c990cbeeb167d4a929249d0faeb8ae4bb6911d68d53299549
+  checksum: 10c0/51fb26cd678f914e13287e886da2d7021f8c2bc0ccc95e03d3e0447ee278dd3b40b9c57dc222acd5881adcf26f3edc40901a4953403232129e3876793cd17386
   languageName: node
   linkType: hard
 
@@ -440,10 +447,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ansi-colors@npm:4.1.1":
-  version: 4.1.1
-  resolution: "ansi-colors@npm:4.1.1"
-  checksum: 10c0/6086ade4336b4250b6b25e144b83e5623bcaf654d3df0c3546ce09c9c5ff999cb6a6f00c87e802d05cf98aef79d92dc76ade2670a2493b8dcb80220bec457838
+"ansi-colors@npm:^4.1.3":
+  version: 4.1.3
+  resolution: "ansi-colors@npm:4.1.3"
+  checksum: 10c0/ec87a2f59902f74e61eada7f6e6fe20094a628dab765cfdbd03c3477599368768cffccdb5d3bb19a1b6c99126783a143b1fee31aab729b31ffe5836c7e5e28b9
   languageName: node
   linkType: hard
 
@@ -469,9 +476,9 @@ __metadata:
   linkType: hard
 
 "ansi-regex@npm:^6.0.1":
-  version: 6.0.1
-  resolution: "ansi-regex@npm:6.0.1"
-  checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08
+  version: 6.1.0
+  resolution: "ansi-regex@npm:6.1.0"
+  checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc
   languageName: node
   linkType: hard
 
@@ -589,7 +596,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"browser-stdout@npm:1.3.1":
+"browser-stdout@npm:^1.3.1":
   version: 1.3.1
   resolution: "browser-stdout@npm:1.3.1"
   checksum: 10c0/c40e482fd82be872b6ea7b9f7591beafbf6f5ba522fe3dade98ba1573a1c29a11101564993e4eb44e5488be8f44510af072df9a9637c739217eb155ceb639205
@@ -614,8 +621,8 @@ __metadata:
   linkType: hard
 
 "cacache@npm:^18.0.0":
-  version: 18.0.3
-  resolution: "cacache@npm:18.0.3"
+  version: 18.0.4
+  resolution: "cacache@npm:18.0.4"
   dependencies:
     "@npmcli/fs": "npm:^3.1.0"
     fs-minipass: "npm:^3.0.0"
@@ -629,7 +636,7 @@ __metadata:
     ssri: "npm:^10.0.0"
     tar: "npm:^6.1.11"
     unique-filename: "npm:^3.0.0"
-  checksum: 10c0/dfda92840bb371fb66b88c087c61a74544363b37a265023223a99965b16a16bbb87661fe4948718d79df6e0cc04e85e62784fbcf1832b2a5e54ff4c46fbb45b7
+  checksum: 10c0/6c055bafed9de4f3dcc64ac3dc7dd24e863210902b7c470eb9ce55a806309b3efff78033e3d8b4f7dcc5d467f2db43c6a2857aaaf26f0094b8a351d44c42179f
   languageName: node
   linkType: hard
 
@@ -659,8 +666,8 @@ __metadata:
   linkType: hard
 
 "chai@npm:^4.3.7":
-  version: 4.4.1
-  resolution: "chai@npm:4.4.1"
+  version: 4.5.0
+  resolution: "chai@npm:4.5.0"
   dependencies:
     assertion-error: "npm:^1.1.0"
     check-error: "npm:^1.0.3"
@@ -668,8 +675,8 @@ __metadata:
     get-func-name: "npm:^2.0.2"
     loupe: "npm:^2.3.6"
     pathval: "npm:^1.1.1"
-    type-detect: "npm:^4.0.8"
-  checksum: 10c0/91590a8fe18bd6235dece04ccb2d5b4ecec49984b50924499bdcd7a95c02cb1fd2a689407c19bb854497bde534ef57525cfad6c7fdd2507100fd802fbc2aefbd
+    type-detect: "npm:^4.1.0"
+  checksum: 10c0/b8cb596bd1aece1aec659e41a6e479290c7d9bee5b3ad63d2898ad230064e5b47889a3bc367b20100a0853b62e026e2dc514acf25a3c9385f936aa3614d4ab4d
   languageName: node
   linkType: hard
 
@@ -703,9 +710,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"chokidar@npm:3.5.3":
-  version: 3.5.3
-  resolution: "chokidar@npm:3.5.3"
+"chokidar@npm:^3.5.3":
+  version: 3.6.0
+  resolution: "chokidar@npm:3.6.0"
   dependencies:
     anymatch: "npm:~3.1.2"
     braces: "npm:~3.0.2"
@@ -718,7 +725,7 @@ __metadata:
   dependenciesMeta:
     fsevents:
       optional: true
-  checksum: 10c0/1076953093e0707c882a92c66c0f56ba6187831aa51bb4de878c1fec59ae611a3bf02898f190efec8e77a086b8df61c2b2a3ea324642a0558bdf8ee6c5dc9ca1
+  checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462
   languageName: node
   linkType: hard
 
@@ -808,9 +815,9 @@ __metadata:
   linkType: hard
 
 "core-js@npm:^3.31.1":
-  version: 3.37.1
-  resolution: "core-js@npm:3.37.1"
-  checksum: 10c0/440eb51a7a39128a320225fe349f870a3641b96c9ecd26470227db730ef8c161ea298eaea621db66ec0ff622a85299efb4e23afebf889c0a1748616102307675
+  version: 3.38.1
+  resolution: "core-js@npm:3.38.1"
+  checksum: 10c0/7df063b6f13a54e46515817ac3e235c6c598a4d3de65cd188a061fc250642be313b895fb9fb2f36e1e31890a1bb4ef61d82666a340413f540b7ce3c65689739b
   languageName: node
   linkType: hard
 
@@ -868,27 +875,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"debug@npm:4, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:~4.3.1, debug@npm:~4.3.2":
-  version: 4.3.5
-  resolution: "debug@npm:4.3.5"
-  dependencies:
-    ms: "npm:2.1.2"
-  peerDependenciesMeta:
-    supports-color:
-      optional: true
-  checksum: 10c0/082c375a2bdc4f4469c99f325ff458adad62a3fc2c482d59923c260cb08152f34e2659f72b3767db8bb2f21ca81a60a42d1019605a412132d7b9f59363a005cc
-  languageName: node
-  linkType: hard
-
-"debug@npm:4.3.4":
-  version: 4.3.4
-  resolution: "debug@npm:4.3.4"
+"debug@npm:4, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:~4.3.1, debug@npm:~4.3.2":
+  version: 4.3.7
+  resolution: "debug@npm:4.3.7"
   dependencies:
-    ms: "npm:2.1.2"
+    ms: "npm:^2.1.3"
   peerDependenciesMeta:
     supports-color:
       optional: true
-  checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736
+  checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b
   languageName: node
   linkType: hard
 
@@ -915,13 +910,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"diff@npm:5.0.0":
-  version: 5.0.0
-  resolution: "diff@npm:5.0.0"
-  checksum: 10c0/08c5904779bbababcd31f1707657b1ad57f8a9b65e6f88d3fb501d09a965d5f8d73066898a7d3f35981f9e4101892c61d99175d421f3b759533213c253d91134
-  languageName: node
-  linkType: hard
-
 "diff@npm:^4.0.1":
   version: 4.0.2
   resolution: "diff@npm:4.0.2"
@@ -929,6 +917,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"diff@npm:^5.2.0":
+  version: 5.2.0
+  resolution: "diff@npm:5.2.0"
+  checksum: 10c0/aed0941f206fe261ecb258dc8d0ceea8abbde3ace5827518ff8d302f0fc9cc81ce116c4d8f379151171336caf0516b79e01abdc1ed1201b6440d895a66689eb4
+  languageName: node
+  linkType: hard
+
 "eastasianwidth@npm:^0.2.0":
   version: 0.2.0
   resolution: "eastasianwidth@npm:0.2.0"
@@ -968,23 +963,23 @@ __metadata:
   languageName: node
   linkType: hard
 
-"engine.io-client@npm:~6.5.2":
-  version: 6.5.4
-  resolution: "engine.io-client@npm:6.5.4"
+"engine.io-client@npm:~6.6.1":
+  version: 6.6.1
+  resolution: "engine.io-client@npm:6.6.1"
   dependencies:
     "@socket.io/component-emitter": "npm:~3.1.0"
     debug: "npm:~4.3.1"
     engine.io-parser: "npm:~5.2.1"
     ws: "npm:~8.17.1"
-    xmlhttprequest-ssl: "npm:~2.0.0"
-  checksum: 10c0/ef220f9875d6a43bade906bd9b61118e812474bbe46e80f38c92dca238484170daf92d51e58bbade6433c29ffb5ba329f4864c5609f2e33c5e31041b1f8ad672
+    xmlhttprequest-ssl: "npm:~2.1.1"
+  checksum: 10c0/f0ba384a86c2965b8016907a970e2b71b792e951cb97013b237a6f13ecedc7444b0262c7886e62f6807ad761418f3e1ed2442179722e67e5f1d7f55ff6590514
   languageName: node
   linkType: hard
 
 "engine.io-parser@npm:~5.2.1":
-  version: 5.2.2
-  resolution: "engine.io-parser@npm:5.2.2"
-  checksum: 10c0/38e71a92ed75e2873d4d9cfab7f889e4a3cfc939b689abd1045e1b2ef9f1a50d0350a2bef69f33d313c1aa626232702da5a9043a1038d76f5ecc0be440c648ab
+  version: 5.2.3
+  resolution: "engine.io-parser@npm:5.2.3"
+  checksum: 10c0/ed4900d8dbef470ab3839ccf3bfa79ee518ea8277c7f1f2759e8c22a48f64e687ea5e474291394d0c94f84054749fd93f3ef0acb51fa2f5f234cc9d9d8e7c536
   languageName: node
   linkType: hard
 
@@ -1019,16 +1014,9 @@ __metadata:
   linkType: hard
 
 "escalade@npm:^3.1.1":
-  version: 3.1.2
-  resolution: "escalade@npm:3.1.2"
-  checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287
-  languageName: node
-  linkType: hard
-
-"escape-string-regexp@npm:4.0.0":
-  version: 4.0.0
-  resolution: "escape-string-regexp@npm:4.0.0"
-  checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9
+  version: 3.2.0
+  resolution: "escalade@npm:3.2.0"
+  checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65
   languageName: node
   linkType: hard
 
@@ -1039,15 +1027,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"escape-string-regexp@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "escape-string-regexp@npm:4.0.0"
+  checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9
+  languageName: node
+  linkType: hard
+
 "ethereum-cryptography@npm:^2.0.0":
-  version: 2.2.0
-  resolution: "ethereum-cryptography@npm:2.2.0"
+  version: 2.2.1
+  resolution: "ethereum-cryptography@npm:2.2.1"
   dependencies:
-    "@noble/curves": "npm:1.4.0"
+    "@noble/curves": "npm:1.4.2"
     "@noble/hashes": "npm:1.4.0"
     "@scure/bip32": "npm:1.4.0"
     "@scure/bip39": "npm:1.3.0"
-  checksum: 10c0/766939345c39936f32929fae101a91f009f5e28261578d44e7a224dbb70827feebb5135013e81fc39bdcf8d70b321e92b4243670f0947e73add8ae5158717b84
+  checksum: 10c0/c6c7626d393980577b57f709878b2eb91f270fe56116044b1d7afb70d5c519cddc0c072e8c05e4a335e05342eb64d9c3ab39d52f78bb75f76ad70817da9645ef
   languageName: node
   linkType: hard
 
@@ -1092,16 +1087,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"find-up@npm:5.0.0":
-  version: 5.0.0
-  resolution: "find-up@npm:5.0.0"
-  dependencies:
-    locate-path: "npm:^6.0.0"
-    path-exists: "npm:^4.0.0"
-  checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a
-  languageName: node
-  linkType: hard
-
 "find-up@npm:^2.1.0":
   version: 2.1.0
   resolution: "find-up@npm:2.1.0"
@@ -1111,6 +1096,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"find-up@npm:^5.0.0":
+  version: 5.0.0
+  resolution: "find-up@npm:5.0.0"
+  dependencies:
+    locate-path: "npm:^6.0.0"
+    path-exists: "npm:^4.0.0"
+  checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a
+  languageName: node
+  linkType: hard
+
 "flat@npm:^5.0.2":
   version: 5.0.2
   resolution: "flat@npm:5.0.2"
@@ -1121,12 +1116,12 @@ __metadata:
   linkType: hard
 
 "foreground-child@npm:^3.1.0":
-  version: 3.2.1
-  resolution: "foreground-child@npm:3.2.1"
+  version: 3.3.0
+  resolution: "foreground-child@npm:3.3.0"
   dependencies:
     cross-spawn: "npm:^7.0.0"
     signal-exit: "npm:^4.0.1"
-  checksum: 10c0/9a53a33dbd87090e9576bef65fb4a71de60f6863a8062a7b11bc1cbe3cc86d428677d7c0b9ef61cdac11007ac580006f78bd5638618d564cfd5e6fd713d6878f
+  checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2
   languageName: node
   linkType: hard
 
@@ -1220,22 +1215,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"glob@npm:8.1.0":
-  version: 8.1.0
-  resolution: "glob@npm:8.1.0"
-  dependencies:
-    fs.realpath: "npm:^1.0.0"
-    inflight: "npm:^1.0.4"
-    inherits: "npm:2"
-    minimatch: "npm:^5.0.1"
-    once: "npm:^1.3.0"
-  checksum: 10c0/cb0b5cab17a59c57299376abe5646c7070f8acb89df5595b492dba3bfb43d301a46c01e5695f01154e6553168207cb60d4eaf07d3be4bc3eb9b0457c5c561d0f
-  languageName: node
-  linkType: hard
-
 "glob@npm:^10.2.2, glob@npm:^10.3.10":
-  version: 10.4.2
-  resolution: "glob@npm:10.4.2"
+  version: 10.4.5
+  resolution: "glob@npm:10.4.5"
   dependencies:
     foreground-child: "npm:^3.1.0"
     jackspeak: "npm:^3.1.2"
@@ -1245,7 +1227,20 @@ __metadata:
     path-scurry: "npm:^1.11.1"
   bin:
     glob: dist/esm/bin.mjs
-  checksum: 10c0/2c7296695fa75a935f3ad17dc62e4e170a8bb8752cf64d328be8992dd6ad40777939003754e10e9741ff8fbe43aa52fba32d6930d0ffa0e3b74bc3fb5eebaa2f
+  checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e
+  languageName: node
+  linkType: hard
+
+"glob@npm:^8.1.0":
+  version: 8.1.0
+  resolution: "glob@npm:8.1.0"
+  dependencies:
+    fs.realpath: "npm:^1.0.0"
+    inflight: "npm:^1.0.4"
+    inherits: "npm:2"
+    minimatch: "npm:^5.0.1"
+    once: "npm:^1.3.0"
+  checksum: 10c0/cb0b5cab17a59c57299376abe5646c7070f8acb89df5595b492dba3bfb43d301a46c01e5695f01154e6553168207cb60d4eaf07d3be4bc3eb9b0457c5c561d0f
   languageName: node
   linkType: hard
 
@@ -1270,7 +1265,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"he@npm:1.2.0":
+"he@npm:^1.2.0":
   version: 1.2.0
   resolution: "he@npm:1.2.0"
   bin:
@@ -1280,9 +1275,9 @@ __metadata:
   linkType: hard
 
 "hls.js@npm:^1.4.12":
-  version: 1.5.11
-  resolution: "hls.js@npm:1.5.11"
-  checksum: 10c0/f32846a3c35d5aad310b94f833228e5182ef883ee9b5fe78271e4dcf1e161d8a9286349d07715be1402d2aefaa0e15e36133e6b94995611922ec1704a3555c05
+  version: 1.5.15
+  resolution: "hls.js@npm:1.5.15"
+  checksum: 10c0/e04d7b7e5e318cf10914bb7ab0e6607fcc3f0e8d5cd89c25c699736b3206a4791a85fd55b62fe4120897fc6bcb848760b4797df288deede8dbc050810503fe89
   languageName: node
   linkType: hard
 
@@ -1304,12 +1299,12 @@ __metadata:
   linkType: hard
 
 "https-proxy-agent@npm:^7.0.1":
-  version: 7.0.4
-  resolution: "https-proxy-agent@npm:7.0.4"
+  version: 7.0.5
+  resolution: "https-proxy-agent@npm:7.0.5"
   dependencies:
     agent-base: "npm:^7.0.2"
     debug: "npm:4"
-  checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b
+  checksum: 10c0/2490e3acec397abeb88807db52cac59102d5ed758feee6df6112ab3ccd8325e8a1ce8bce6f4b66e5470eca102d31e425ace904242e4fa28dbe0c59c4bafa7b2c
   languageName: node
   linkType: hard
 
@@ -1505,15 +1500,15 @@ __metadata:
   linkType: hard
 
 "jackspeak@npm:^3.1.2":
-  version: 3.4.0
-  resolution: "jackspeak@npm:3.4.0"
+  version: 3.4.3
+  resolution: "jackspeak@npm:3.4.3"
   dependencies:
     "@isaacs/cliui": "npm:^8.0.2"
     "@pkgjs/parseargs": "npm:^0.11.0"
   dependenciesMeta:
     "@pkgjs/parseargs":
       optional: true
-  checksum: 10c0/7e42d1ea411b4d57d43ea8a6afbca9224382804359cb72626d0fc45bb8db1de5ad0248283c3db45fe73e77210750d4fcc7c2b4fe5d24fda94aaa24d658295c5f
+  checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9
   languageName: node
   linkType: hard
 
@@ -1537,7 +1532,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"js-yaml@npm:4.1.0":
+"js-yaml@npm:^4.1.0":
   version: 4.1.0
   resolution: "js-yaml@npm:4.1.0"
   dependencies:
@@ -1670,7 +1665,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"log-symbols@npm:4.1.0":
+"log-symbols@npm:^4.1.0":
   version: 4.1.0
   resolution: "log-symbols@npm:4.1.0"
   dependencies:
@@ -1690,9 +1685,9 @@ __metadata:
   linkType: hard
 
 "lru-cache@npm:^10.0.1, lru-cache@npm:^10.1.0, lru-cache@npm:^10.2.0":
-  version: 10.2.2
-  resolution: "lru-cache@npm:10.2.2"
-  checksum: 10c0/402d31094335851220d0b00985084288136136992979d0e015f0f1697e15d1c86052d7d53ae86b614e5b058425606efffc6969a31a091085d7a2b80a8a1e26d6
+  version: 10.4.3
+  resolution: "lru-cache@npm:10.4.3"
+  checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb
   languageName: node
   linkType: hard
 
@@ -1764,16 +1759,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"minimatch@npm:5.0.1":
-  version: 5.0.1
-  resolution: "minimatch@npm:5.0.1"
-  dependencies:
-    brace-expansion: "npm:^2.0.1"
-  checksum: 10c0/baa60fc5839205f13d6c266d8ad4d160ae37c33f66b130b5640acac66deff84b934ac6307f5dc5e4b30362c51284817c12df7c9746ffb600b9009c581e0b1634
-  languageName: node
-  linkType: hard
-
-"minimatch@npm:^5.0.1":
+"minimatch@npm:^5.0.1, minimatch@npm:^5.1.6":
   version: 5.1.6
   resolution: "minimatch@npm:5.1.6"
   dependencies:
@@ -1783,11 +1769,11 @@ __metadata:
   linkType: hard
 
 "minimatch@npm:^9.0.4":
-  version: 9.0.4
-  resolution: "minimatch@npm:9.0.4"
+  version: 9.0.5
+  resolution: "minimatch@npm:9.0.5"
   dependencies:
     brace-expansion: "npm:^2.0.1"
-  checksum: 10c0/2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414
+  checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed
   languageName: node
   linkType: hard
 
@@ -1899,44 +1885,37 @@ __metadata:
   linkType: hard
 
 "mocha@npm:^10.2.0":
-  version: 10.4.0
-  resolution: "mocha@npm:10.4.0"
-  dependencies:
-    ansi-colors: "npm:4.1.1"
-    browser-stdout: "npm:1.3.1"
-    chokidar: "npm:3.5.3"
-    debug: "npm:4.3.4"
-    diff: "npm:5.0.0"
-    escape-string-regexp: "npm:4.0.0"
-    find-up: "npm:5.0.0"
-    glob: "npm:8.1.0"
-    he: "npm:1.2.0"
-    js-yaml: "npm:4.1.0"
-    log-symbols: "npm:4.1.0"
-    minimatch: "npm:5.0.1"
-    ms: "npm:2.1.3"
-    serialize-javascript: "npm:6.0.0"
-    strip-json-comments: "npm:3.1.1"
-    supports-color: "npm:8.1.1"
-    workerpool: "npm:6.2.1"
-    yargs: "npm:16.2.0"
-    yargs-parser: "npm:20.2.4"
-    yargs-unparser: "npm:2.0.0"
+  version: 10.7.3
+  resolution: "mocha@npm:10.7.3"
+  dependencies:
+    ansi-colors: "npm:^4.1.3"
+    browser-stdout: "npm:^1.3.1"
+    chokidar: "npm:^3.5.3"
+    debug: "npm:^4.3.5"
+    diff: "npm:^5.2.0"
+    escape-string-regexp: "npm:^4.0.0"
+    find-up: "npm:^5.0.0"
+    glob: "npm:^8.1.0"
+    he: "npm:^1.2.0"
+    js-yaml: "npm:^4.1.0"
+    log-symbols: "npm:^4.1.0"
+    minimatch: "npm:^5.1.6"
+    ms: "npm:^2.1.3"
+    serialize-javascript: "npm:^6.0.2"
+    strip-json-comments: "npm:^3.1.1"
+    supports-color: "npm:^8.1.1"
+    workerpool: "npm:^6.5.1"
+    yargs: "npm:^16.2.0"
+    yargs-parser: "npm:^20.2.9"
+    yargs-unparser: "npm:^2.0.0"
   bin:
     _mocha: bin/_mocha
     mocha: bin/mocha.js
-  checksum: 10c0/e572e9d8c164e98f64de7e9498608de042fd841c6a7441f456a5e216e9aed2299e2c568d9dc27f2be2de06521e6b2d1dd774ab58a243b1c7697d14aec2f0f7f7
-  languageName: node
-  linkType: hard
-
-"ms@npm:2.1.2":
-  version: 2.1.2
-  resolution: "ms@npm:2.1.2"
-  checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc
+  checksum: 10c0/76a205905ec626262d903954daca31ba8e0dd4347092f627b98b8508dcdb5b30be62ec8f7a405fab3b2e691bdc099721c3291b330c3ee85b8ec40d3d179f8728
   languageName: node
   linkType: hard
 
-"ms@npm:2.1.3":
+"ms@npm:^2.1.3":
   version: 2.1.3
   resolution: "ms@npm:2.1.3"
   checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48
@@ -1986,8 +1965,8 @@ __metadata:
   linkType: hard
 
 "node-gyp@npm:latest":
-  version: 10.1.0
-  resolution: "node-gyp@npm:10.1.0"
+  version: 10.2.0
+  resolution: "node-gyp@npm:10.2.0"
   dependencies:
     env-paths: "npm:^2.2.0"
     exponential-backoff: "npm:^3.1.1"
@@ -1995,13 +1974,13 @@ __metadata:
     graceful-fs: "npm:^4.2.6"
     make-fetch-happen: "npm:^13.0.0"
     nopt: "npm:^7.0.0"
-    proc-log: "npm:^3.0.0"
+    proc-log: "npm:^4.1.0"
     semver: "npm:^7.3.5"
-    tar: "npm:^6.1.2"
+    tar: "npm:^6.2.1"
     which: "npm:^4.0.0"
   bin:
     node-gyp: bin/node-gyp.js
-  checksum: 10c0/9cc821111ca244a01fb7f054db7523ab0a0cd837f665267eb962eb87695d71fb1e681f9e21464cc2fd7c05530dc4c81b810bca1a88f7d7186909b74477491a3c
+  checksum: 10c0/00630d67dbd09a45aee0a5d55c05e3916ca9e6d427ee4f7bc392d2d3dc5fad7449b21fc098dd38260a53d9dcc9c879b36704a1994235d4707e7271af7e9a835b
   languageName: node
   linkType: hard
 
@@ -2142,9 +2121,9 @@ __metadata:
   linkType: hard
 
 "package-json-from-dist@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "package-json-from-dist@npm:1.0.0"
-  checksum: 10c0/e3ffaf6ac1040ab6082a658230c041ad14e72fabe99076a2081bb1d5d41210f11872403fc09082daf4387fc0baa6577f96c9c0e94c90c394fd57794b66aa4033
+  version: 1.0.1
+  resolution: "package-json-from-dist@npm:1.0.1"
+  checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b
   languageName: node
   linkType: hard
 
@@ -2200,14 +2179,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"proc-log@npm:^3.0.0":
-  version: 3.0.0
-  resolution: "proc-log@npm:3.0.0"
-  checksum: 10c0/f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc
-  languageName: node
-  linkType: hard
-
-"proc-log@npm:^4.2.0":
+"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0":
   version: 4.2.0
   resolution: "proc-log@npm:4.2.0"
   checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9
@@ -2236,12 +2208,12 @@ __metadata:
   linkType: hard
 
 "pump@npm:^3.0.0":
-  version: 3.0.0
-  resolution: "pump@npm:3.0.0"
+  version: 3.0.2
+  resolution: "pump@npm:3.0.2"
   dependencies:
     end-of-stream: "npm:^1.1.0"
     once: "npm:^1.3.1"
-  checksum: 10c0/bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478
+  checksum: 10c0/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f
   languageName: node
   linkType: hard
 
@@ -2340,20 +2312,20 @@ __metadata:
   linkType: hard
 
 "semver@npm:^7.3.5":
-  version: 7.6.2
-  resolution: "semver@npm:7.6.2"
+  version: 7.6.3
+  resolution: "semver@npm:7.6.3"
   bin:
     semver: bin/semver.js
-  checksum: 10c0/97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c
+  checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf
   languageName: node
   linkType: hard
 
-"serialize-javascript@npm:6.0.0":
-  version: 6.0.0
-  resolution: "serialize-javascript@npm:6.0.0"
+"serialize-javascript@npm:^6.0.2":
+  version: 6.0.2
+  resolution: "serialize-javascript@npm:6.0.2"
   dependencies:
     randombytes: "npm:^2.1.0"
-  checksum: 10c0/73104922ef0a919064346eea21caab99de1a019a1f5fb54a7daa7fcabc39e83b387a2a363e52a889598c3b1bcf507c4b2a7b26df76e991a310657af20eea2e7c
+  checksum: 10c0/2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2
   languageName: node
   linkType: hard
 
@@ -2433,14 +2405,14 @@ __metadata:
   linkType: hard
 
 "socket.io-client@npm:^4.7.2":
-  version: 4.7.5
-  resolution: "socket.io-client@npm:4.7.5"
+  version: 4.8.0
+  resolution: "socket.io-client@npm:4.8.0"
   dependencies:
     "@socket.io/component-emitter": "npm:~3.1.0"
     debug: "npm:~4.3.2"
-    engine.io-client: "npm:~6.5.2"
+    engine.io-client: "npm:~6.6.1"
     socket.io-parser: "npm:~4.2.4"
-  checksum: 10c0/d5dc90ee63755fbbb0a1cb3faf575c9ce20d98e809a43a4c9c3ce03a56b8810335ae38e678ceb0650ac434d55e72ea6449c2e5d6db8bc7258f7c529148fac99d
+  checksum: 10c0/41f142a79f5903cf007902b9b830313e425c5d6a4257d504b8c94d4b4edd3df037df997e622205228bceb18eea6f3308d25f55b3c919d6100849c232e7c06928
   languageName: node
   linkType: hard
 
@@ -2455,17 +2427,17 @@ __metadata:
   linkType: hard
 
 "socks-proxy-agent@npm:^8.0.3":
-  version: 8.0.3
-  resolution: "socks-proxy-agent@npm:8.0.3"
+  version: 8.0.4
+  resolution: "socks-proxy-agent@npm:8.0.4"
   dependencies:
     agent-base: "npm:^7.1.1"
     debug: "npm:^4.3.4"
-    socks: "npm:^2.7.1"
-  checksum: 10c0/4950529affd8ccd6951575e21c1b7be8531b24d924aa4df3ee32df506af34b618c4e50d261f4cc603f1bfd8d426915b7d629966c8ce45b05fb5ad8c8b9a6459d
+    socks: "npm:^2.8.3"
+  checksum: 10c0/345593bb21b95b0508e63e703c84da11549f0a2657d6b4e3ee3612c312cb3a907eac10e53b23ede3557c6601d63252103494caa306b66560f43af7b98f53957a
   languageName: node
   linkType: hard
 
-"socks@npm:^2.7.1":
+"socks@npm:^2.8.3":
   version: 2.8.3
   resolution: "socks@npm:2.8.3"
   dependencies:
@@ -2595,22 +2567,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"strip-json-comments@npm:3.1.1":
+"strip-json-comments@npm:^3.1.1":
   version: 3.1.1
   resolution: "strip-json-comments@npm:3.1.1"
   checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd
   languageName: node
   linkType: hard
 
-"supports-color@npm:8.1.1":
-  version: 8.1.1
-  resolution: "supports-color@npm:8.1.1"
-  dependencies:
-    has-flag: "npm:^4.0.0"
-  checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89
-  languageName: node
-  linkType: hard
-
 "supports-color@npm:^5.3.0":
   version: 5.5.0
   resolution: "supports-color@npm:5.5.0"
@@ -2629,7 +2592,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"tar@npm:^6.1.11, tar@npm:^6.1.2":
+"supports-color@npm:^8.1.1":
+  version: 8.1.1
+  resolution: "supports-color@npm:8.1.1"
+  dependencies:
+    has-flag: "npm:^4.0.0"
+  checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89
+  languageName: node
+  linkType: hard
+
+"tar@npm:^6.1.11, tar@npm:^6.2.1":
   version: 6.2.1
   resolution: "tar@npm:6.2.1"
   dependencies:
@@ -2726,30 +2698,30 @@ __metadata:
   languageName: node
   linkType: hard
 
-"type-detect@npm:^4.0.0, type-detect@npm:^4.0.8":
-  version: 4.0.8
-  resolution: "type-detect@npm:4.0.8"
-  checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd
+"type-detect@npm:^4.0.0, type-detect@npm:^4.1.0":
+  version: 4.1.0
+  resolution: "type-detect@npm:4.1.0"
+  checksum: 10c0/df8157ca3f5d311edc22885abc134e18ff8ffbc93d6a9848af5b682730ca6a5a44499259750197250479c5331a8a75b5537529df5ec410622041650a7f293e2a
   languageName: node
   linkType: hard
 
 "typescript@npm:^5.0.2":
-  version: 5.5.2
-  resolution: "typescript@npm:5.5.2"
+  version: 5.6.2
+  resolution: "typescript@npm:5.6.2"
   bin:
     tsc: bin/tsc
     tsserver: bin/tsserver
-  checksum: 10c0/8ca39b27b5f9bd7f32db795045933ab5247897660627251e8254180b792a395bf061ea7231947d5d7ffa5cb4cc771970fd4ef543275f9b559f08c9325cccfce3
+  checksum: 10c0/3ed8297a8c7c56b7fec282532503d1ac795239d06e7c4966b42d4330c6cf433a170b53bcf93a130a7f14ccc5235de5560df4f1045eb7f3550b46ebed16d3c5e5
   languageName: node
   linkType: hard
 
 "typescript@patch:typescript@npm%3A^5.0.2#optional!builtin<compat/typescript>":
-  version: 5.5.2
-  resolution: "typescript@patch:typescript@npm%3A5.5.2#optional!builtin<compat/typescript>::version=5.5.2&hash=b45daf"
+  version: 5.6.2
+  resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin<compat/typescript>::version=5.6.2&hash=b45daf"
   bin:
     tsc: bin/tsc
     tsserver: bin/tsserver
-  checksum: 10c0/6721ac8933a70c252d7b640b345792e103d881811ff660355617c1836526dbb71c2044e2e77a8823fb3570b469f33276875a4cab6d3c4de4ae7d7ee1c3074ae4
+  checksum: 10c0/e6c1662e4852e22fe4bbdca471dca3e3edc74f6f1df043135c44a18a7902037023ccb0abdfb754595ca9028df8920f2f8492c00fc3cbb4309079aae8b7de71cd
   languageName: node
   linkType: hard
 
@@ -2781,12 +2753,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"use-sync-external-store@npm:1.2.0":
-  version: 1.2.0
-  resolution: "use-sync-external-store@npm:1.2.0"
+"use-sync-external-store@npm:1.2.2":
+  version: 1.2.2
+  resolution: "use-sync-external-store@npm:1.2.2"
   peerDependencies:
     react: ^16.8.0 || ^17.0.0 || ^18.0.0
-  checksum: 10c0/ac4814e5592524f242921157e791b022efe36e451fe0d4fd4d204322d5433a4fc300d63b0ade5185f8e0735ded044c70bcf6d2352db0f74d097a238cebd2da02
+  checksum: 10c0/23b1597c10adf15b26ade9e8c318d8cc0abc9ec0ab5fc7ca7338da92e89c2536abd150a5891bf076836c352fdfa104fc7231fb48f806fd9960e0cbe03601abaf
   languageName: node
   linkType: hard
 
@@ -2889,10 +2861,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"workerpool@npm:6.2.1":
-  version: 6.2.1
-  resolution: "workerpool@npm:6.2.1"
-  checksum: 10c0/f0efd2d74eafd58eaeb36d7d85837d080f75c52b64893cff317b66257dd308e5c9f85ef0b12904f6c7f24ed2365bc3cfeba1f1d16aa736d84d6ef8156ae37c80
+"workerpool@npm:^6.5.1":
+  version: 6.5.1
+  resolution: "workerpool@npm:6.5.1"
+  checksum: 10c0/58e8e969782292cb3a7bfba823f1179a7615250a0cefb4841d5166234db1880a3d0fe83a31dd8d648329ec92c2d0cd1890ad9ec9e53674bb36ca43e9753cdeac
   languageName: node
   linkType: hard
 
@@ -2965,10 +2937,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"xmlhttprequest-ssl@npm:~2.0.0":
-  version: 2.0.0
-  resolution: "xmlhttprequest-ssl@npm:2.0.0"
-  checksum: 10c0/b64ab371459bd5e3a4827e3c7535759047d285fd310aea6fd028973d547133f3be0d473c1fdae9f14d89bf509267759198ae1fbe89802079a7e217ddd990d734
+"xmlhttprequest-ssl@npm:~2.1.1":
+  version: 2.1.1
+  resolution: "xmlhttprequest-ssl@npm:2.1.1"
+  checksum: 10c0/1cef48c992676d117b1cfeb5636758c33dbd887d72bc9668ebf7d6d0c7d66ed8ea649442913a52aed3996deb9e92588d7405dbdb2e9d19cf801800ab175549fc
   languageName: node
   linkType: hard
 
@@ -2993,14 +2965,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"yargs-parser@npm:20.2.4":
-  version: 20.2.4
-  resolution: "yargs-parser@npm:20.2.4"
-  checksum: 10c0/08dc341f0b9f940c2fffc1d1decf3be00e28cabd2b578a694901eccc7dcd10577f10c6aa1b040fdd9a68b2042515a60f18476543bccacf9f3ce2c8534cd87435
-  languageName: node
-  linkType: hard
-
-"yargs-parser@npm:^20.2.2":
+"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.9":
   version: 20.2.9
   resolution: "yargs-parser@npm:20.2.9"
   checksum: 10c0/0685a8e58bbfb57fab6aefe03c6da904a59769bd803a722bb098bd5b0f29d274a1357762c7258fb487512811b8063fb5d2824a3415a0a4540598335b3b086c72
@@ -3016,7 +2981,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"yargs-unparser@npm:2.0.0":
+"yargs-unparser@npm:^2.0.0":
   version: 2.0.0
   resolution: "yargs-unparser@npm:2.0.0"
   dependencies:
@@ -3028,21 +2993,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"yargs@npm:16.2.0":
-  version: 16.2.0
-  resolution: "yargs@npm:16.2.0"
-  dependencies:
-    cliui: "npm:^7.0.2"
-    escalade: "npm:^3.1.1"
-    get-caller-file: "npm:^2.0.5"
-    require-directory: "npm:^2.1.1"
-    string-width: "npm:^4.2.0"
-    y18n: "npm:^5.0.5"
-    yargs-parser: "npm:^20.2.2"
-  checksum: 10c0/b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651
-  languageName: node
-  linkType: hard
-
 "yargs@npm:^11.0.0":
   version: 11.1.1
   resolution: "yargs@npm:11.1.1"
@@ -3063,6 +3013,21 @@ __metadata:
   languageName: node
   linkType: hard
 
+"yargs@npm:^16.2.0":
+  version: 16.2.0
+  resolution: "yargs@npm:16.2.0"
+  dependencies:
+    cliui: "npm:^7.0.2"
+    escalade: "npm:^3.1.1"
+    get-caller-file: "npm:^2.0.5"
+    require-directory: "npm:^2.1.1"
+    string-width: "npm:^4.2.0"
+    y18n: "npm:^5.0.5"
+    yargs-parser: "npm:^20.2.2"
+  checksum: 10c0/b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651
+  languageName: node
+  linkType: hard
+
 "yn@npm:3.1.1":
   version: 3.1.1
   resolution: "yn@npm:3.1.1"
@@ -3078,10 +3043,10 @@ __metadata:
   linkType: hard
 
 "zustand@npm:^4.3.9":
-  version: 4.5.2
-  resolution: "zustand@npm:4.5.2"
+  version: 4.5.5
+  resolution: "zustand@npm:4.5.5"
   dependencies:
-    use-sync-external-store: "npm:1.2.0"
+    use-sync-external-store: "npm:1.2.2"
   peerDependencies:
     "@types/react": ">=16.8"
     immer: ">=9.0.6"
@@ -3093,6 +3058,6 @@ __metadata:
       optional: true
     react:
       optional: true
-  checksum: 10c0/aee26f11facebb39b016e89539f72a72c2c00151208907fc909c3cedd455728240e09e01d98ebd3b63a2a3518a5917eac5de6c853743ca55a1655296d750bb48
+  checksum: 10c0/d04469d76b29c7e4070da269886de4efdadedd3d3824dc2a06ac4ff62e3b5877f925e927afe7382de651829872b99adec48082f1bd69fe486149be666345e626
   languageName: node
   linkType: hard
diff --git a/packages/uiweb/package.json b/packages/uiweb/package.json
index d59dda4ba..a87ba1a70 100644
--- a/packages/uiweb/package.json
+++ b/packages/uiweb/package.json
@@ -10,7 +10,7 @@
     "@livepeer/react": "^2.6.0",
     "@pushprotocol/socket": "^0.5.0",
     "@unstoppabledomains/resolution": "^8.5.0",
-    "@web3-name-sdk/core": "^0.1.15",
+    "@web3-name-sdk/core": "^0.2.0",
     "@web3-onboard/coinbase": "^2.2.5",
     "@web3-onboard/core": "^2.21.1",
     "@web3-onboard/injected-wallets": "^2.10.5",
@@ -38,7 +38,7 @@
     "uuid": "^9.0.1"
   },
   "peerDependencies": {
-    "@pushprotocol/restapi": "1.7.19",
+    "@pushprotocol/restapi": "1.7.25",
     "@pushprotocol/socket": "^0.5.0",
     "react": ">=16.8.0",
     "styled-components": "^6.0.8"
diff --git a/packages/uiweb/src/lib/components/chat/ChatPreview/ChatPreview.tsx b/packages/uiweb/src/lib/components/chat/ChatPreview/ChatPreview.tsx
index 6acb80fee..687088983 100644
--- a/packages/uiweb/src/lib/components/chat/ChatPreview/ChatPreview.tsx
+++ b/packages/uiweb/src/lib/components/chat/ChatPreview/ChatPreview.tsx
@@ -3,21 +3,22 @@ import React, { useContext, useEffect, useRef, useState } from 'react';
 import styled from 'styled-components';
 
 import { useChatData } from '../../../hooks';
-import { Div, Button, Image, Section } from '../../reusables';
+import { Button, Div, Image, Section } from '../../reusables';
 
 import { CONSTANTS } from '@pushprotocol/restapi';
-import { ethers } from 'ethers';
+
 import { CiImageOn } from 'react-icons/ci';
 import { FaFile } from 'react-icons/fa';
-import { CoreContractChainId, InfuraAPIKey } from '../../../config';
-import { resolveWeb3Name, shortenText } from '../../../helpers';
+import { pushBotAddress } from '../../../config/constants';
+import { pCAIP10ToWallet, resolveWeb3Name, shortenText } from '../../../helpers';
+import { createBlockie } from '../../../helpers/blockies';
 import { IChatPreviewProps } from '../exportedTypes';
 import { formatAddress, formatDate } from '../helpers';
-import { pCAIP10ToWallet } from '../../../helpers';
-import { createBlockie } from '../../../helpers/blockies';
 import { IChatTheme } from '../theme';
 import { ThemeContext } from '../theme/ThemeProvider';
-import { pushBotAddress } from '../../../config/constants';
+
+import { ReplyIcon } from '../../../icons/PushIcons';
+
 /**
  * @interface IThemeProps
  * this interface is used for defining the props for styled components
@@ -53,7 +54,9 @@ export const ChatPreview: React.FC<IChatPreviewProps> = (options: IChatPreviewPr
 
   const hasBadgeCount = !!options?.badge?.count;
   const isSelected = options?.selected;
-  const isBot =  options?.chatPreviewPayload?.chatParticipant === "PushBot" || options?.chatPreviewPayload?.chatParticipant === pushBotAddress;
+  const isBot =
+    options?.chatPreviewPayload?.chatParticipant === 'PushBot' ||
+    options?.chatPreviewPayload?.chatParticipant === pushBotAddress;
 
   // For blockie if icon is missing
   const blockieContainerRef = useRef<HTMLDivElement>(null);
@@ -75,6 +78,49 @@ export const ChatPreview: React.FC<IChatPreviewProps> = (options: IChatPreviewPr
     return options.chatPreviewPayload?.chatGroup ? formattedAddress : web3Name ? web3Name : formattedAddress;
   };
 
+  // collate all message components
+  const msgComponents: React.ReactNode[] = [];
+  let includeText = false;
+
+  // If reply, check message meta to see
+  // Always check this first
+  if (options?.chatPreviewPayload?.chatMsg?.messageMeta === 'Reply') {
+    msgComponents.push(
+      <ReplyIcon
+        color={theme.iconColor?.emoji}
+        size={theme.fontSize?.chatPreviewMessageText}
+      />
+    );
+
+    // Include text in rendering as well
+    includeText = true;
+  }
+
+  // If image, gif, mediaembed
+  if (
+    options?.chatPreviewPayload?.chatMsg?.messageType === 'Image' ||
+    options?.chatPreviewPayload?.chatMsg?.messageType === 'GIF' ||
+    options?.chatPreviewPayload?.chatMsg?.messageType === 'MediaEmbed'
+  ) {
+    msgComponents.push(<CiImageOn />);
+    msgComponents.push(<Message theme={theme}>Media</Message>);
+  }
+
+  // If file
+  if (options?.chatPreviewPayload?.chatMsg?.messageType === 'File') {
+    msgComponents.push(<FaFile />);
+    msgComponents.push(<Message theme={theme}>File</Message>);
+  }
+
+  // Add content
+  if (
+    includeText ||
+    options?.chatPreviewPayload?.chatMsg?.messageType === 'Text' ||
+    options?.chatPreviewPayload?.chatMsg?.messageType === 'Reaction'
+  ) {
+    msgComponents.push(<Message theme={theme}>{options?.chatPreviewPayload?.chatMsg?.messageContent}</Message>);
+  }
+
   return (
     <ChatPreviewContainer
       margin={theme.margin?.chatPreviewMargin}
@@ -167,41 +213,23 @@ export const ChatPreview: React.FC<IChatPreviewProps> = (options: IChatPreviewPr
             animation={theme.skeletonBG}
           >
             <Message theme={theme}>
-              {options?.chatPreviewPayload?.chatMsg?.messageType === 'Image' ||
-              options?.chatPreviewPayload?.chatMsg?.messageType === 'GIF' ||
-              options?.chatPreviewPayload?.chatMsg?.messageType === 'MediaEmbed' ? (
-                <Section
-                  justifyContent="flex-start"
-                  flexDirection="row"
-                  alignItems="center"
-                  alignSelf="stretch"
-                  overflow="hidden"
-                  flex="1"
-                  gap="4px"
-                >
-                  <CiImageOn />
-                  Media
-                </Section>
-              ) : options?.chatPreviewPayload?.chatMsg?.messageType === 'File' ? (
-                <Section
-                  justifyContent="flex-start"
-                  flexDirection="row"
-                  alignItems="center"
-                  alignSelf="stretch"
-                  overflow="hidden"
-                  flex="1"
-                  gap="4px"
-                >
-                  <FaFile />
-                  File
-                </Section>
-              ) : (
-                options?.chatPreviewPayload?.chatMsg?.messageContent
-              )}
+              <Section
+                justifyContent="flex-start"
+                flexDirection="row"
+                alignItems="center"
+                alignSelf="stretch"
+                overflow="hidden"
+                flex="1"
+                gap="4px"
+              >
+                {msgComponents}
+              </Section>
             </Message>
-            
-            {hasBadgeCount && !(isBot || (isSelected && hasBadgeCount)) && <Badge theme={theme}>{options.badge?.count}</Badge>}
-          </Section>                  
+
+            {hasBadgeCount && !(isBot || (isSelected && hasBadgeCount)) && (
+              <Badge theme={theme}>{options.badge?.count}</Badge>
+            )}
+          </Section>
         </Section>
       </Button>
     </ChatPreviewContainer>
diff --git a/packages/uiweb/src/lib/components/chat/ChatPreviewList/ChatPreviewList.tsx b/packages/uiweb/src/lib/components/chat/ChatPreviewList/ChatPreviewList.tsx
index a31fe7d39..a5b02ebe5 100644
--- a/packages/uiweb/src/lib/components/chat/ChatPreviewList/ChatPreviewList.tsx
+++ b/packages/uiweb/src/lib/components/chat/ChatPreviewList/ChatPreviewList.tsx
@@ -261,7 +261,7 @@ export const ChatPreviewList: React.FC<IChatPreviewListProps> = (options: IChatP
       items.forEach((item) => {
         // only increment if not selected
         if (chatPreviewListMeta.selectedChatId !== item.chatId) {
-          console.debug('::ChatPreviewList::incrementing badge', item);
+          console.debug('UIWeb::ChatPreviewList::incrementing badge', item);
           setBadge(
             item.chatId!,
             chatPreviewListMeta.badges[item.chatId!] ? chatPreviewListMeta.badges[item.chatId!] + 1 : 1
@@ -297,6 +297,7 @@ export const ChatPreviewList: React.FC<IChatPreviewListProps> = (options: IChatP
       chatGroup: true,
       chatTimestamp: undefined,
       chatMsg: {
+        messageMeta: '',
         messageType: '',
         messageContent: '',
       },
@@ -360,71 +361,6 @@ export const ChatPreviewList: React.FC<IChatPreviewListProps> = (options: IChatP
     return { type, overrideAccount };
   };
 
-  // //Initialise chat -- Deprecated
-  // const initializeChatList = async () => {
-  //   // Load chat type from options, if not present, default to CHATS
-  //   const { type, overrideAccount } = getTypeAndAccount();
-  //   const newpage = 1;
-
-  //   // store current nonce and page
-  //   const currentNonce = chatPreviewList.nonce;
-  //   if (type === 'SEARCH') {
-  //     await handleSearch(currentNonce);
-  //   } else {
-  //     const chatList = await fetchChatList({
-  //       type,
-  //       page: newpage,
-  //       limit: CHAT_PAGE_LIMIT,
-  //       overrideAccount,
-  //     });
-  //     if (chatList) {
-  //       // get and transform chats
-  //       const transformedChats = transformChatItems(chatList);
-
-  //       // return if nonce doesn't match or if page is not 1
-  //       if (currentNonce !== chatPreviewList.nonce || chatPreviewList.page !== 0) {
-  //         return;
-  //       }
-
-  //       setChatPreviewList((prev) => ({
-  //         nonce: generateRandomNonce(),
-  //         items: transformedChats,
-  //         page: 1,
-  //         loading: false,
-  //         loaded: false,
-  //         reset: false,
-  //         resume: false,
-  //         errored: false,
-  //         error: null,
-  //       }));
-
-  //       if (options?.onPreload) {
-  //         options.onPreload(transformedChats);
-  //       }
-  //     } else {
-  //       // return if nonce doesn't match
-  //       if (currentNonce !== chatPreviewList.nonce) {
-  //         return;
-  //       }
-
-  //       setChatPreviewList({
-  //         nonce: generateRandomNonce(),
-  //         items: [],
-  //         page: 0,
-  //         loading: false,
-  //         loaded: false,
-  //         reset: false,
-  //         resume: false,
-  //         errored: true,
-  //         error: {
-  //           code: ChatPreviewListErrorCodes.CHAT_PREVIEW_LIST_PRELOAD_ERROR,
-  //           message: 'No chats found',
-  //         },
-  //       });
-  //     }
-  //   }
-  // };
-
   // Define Chat Preview List Meta Functions
   // Set selected badge
   const setSelectedBadge: (chatId: string, chatParticipant: string) => void = (
@@ -594,154 +530,6 @@ export const ChatPreviewList: React.FC<IChatPreviewListProps> = (options: IChatP
     }
   }, [chatRejectStream]);
 
-  //search method for a chatId
-  const handleSearch = async (currentNonce: string) => {
-    let error;
-    let searchedChat: IChatPreviewPayload = {
-      chatId: undefined,
-      chatPic: null,
-      chatParticipant: '',
-      chatGroup: false,
-      chatTimestamp: undefined,
-      chatMsg: {
-        messageType: '',
-        messageContent: '',
-      },
-    };
-    //check if searchParamter is there
-    try {
-      if (options?.searchParamter)
-        if (options?.searchParamter) {
-          let formattedChatId: string | null = options?.searchParamter;
-          let userProfile: IUser | undefined = undefined;
-          let groupProfile: Group;
-
-          if (getDomainIfExists(formattedChatId)) {
-            const address = await getAddress(formattedChatId, user ? user.env : CONSTANTS.ENV.PROD);
-            if (address) formattedChatId = pCAIP10ToWallet(address);
-            else {
-              error = {
-                code: ChatPreviewListErrorCodes.CHAT_PREVIEW_LIST_INVALID_SEARCH_ERROR,
-                message: 'Invalid search',
-              };
-            }
-          }
-          if (pCAIP10ToWallet(formattedChatId) === pCAIP10ToWallet(user?.account || '')) {
-            error = {
-              code: ChatPreviewListErrorCodes.CHAT_PREVIEW_LIST_INVALID_SEARCH_ERROR,
-              message: 'Invalid search',
-            };
-          }
-
-          if (!error) {
-            const chatInfo = await fetchChat({ chatId: formattedChatId });
-            if (chatInfo && chatInfo?.meta?.group)
-              groupProfile = await getGroupByIDnew({
-                groupId: formattedChatId,
-              });
-            else if (user?.account)
-              formattedChatId = pCAIP10ToWallet(
-                chatInfo?.participants.find((address) => address != walletToPCAIP10(user?.account)) || formattedChatId
-              );
-            //fetch  profile
-            if (!groupProfile) {
-              userProfile = await getNewChatUser({
-                searchText: formattedChatId,
-                env: user?.env ? user?.env : CONSTANTS.ENV.PROD,
-                fetchChatProfile: fetchUserProfile,
-                user,
-              });
-            }
-
-            if (!userProfile && !groupProfile) {
-              error = {
-                code: ChatPreviewListErrorCodes.CHAT_PREVIEW_LIST_INVALID_SEARCH_ERROR,
-                message: 'Invalid search',
-              };
-            } else {
-              searchedChat = {
-                ...searchedChat,
-                chatId: chatInfo?.chatId || formattedChatId,
-                chatGroup: !!groupProfile,
-                chatPic: (userProfile?.profile?.picture ?? groupProfile?.groupImage) || null,
-                chatParticipant: groupProfile ? groupProfile?.groupName : formattedChatId!,
-              };
-              //fetch latest chat
-              const latestMessage = await fetchLatestMessage({
-                chatId: formattedChatId,
-              });
-              if (latestMessage) {
-                searchedChat = {
-                  ...searchedChat,
-                  chatMsg: {
-                    messageType: latestMessage[0]?.messageType,
-                    messageContent: latestMessage[0]?.messageContent,
-                  },
-                  chatTimestamp: latestMessage[0]?.timestamp,
-                };
-              }
-
-              // return if nonce doesn't match or if page is not 1
-              if (currentNonce !== chatPreviewList.nonce || chatPreviewList.page !== 1) {
-                return;
-              }
-              setChatPreviewList((prev) => ({
-                nonce: generateRandomNonce(),
-                items: [...[searchedChat]],
-                page: 1,
-                loading: false,
-                loaded: false,
-                reset: false,
-                resume: false,
-                errored: false,
-                error: null,
-              }));
-            }
-          }
-        } else {
-          error = {
-            code: ChatPreviewListErrorCodes.CHAT_PREVIEW_LIST_INSUFFICIENT_INPUT,
-            message: 'Insufficient input for search',
-          };
-        }
-      if (error) {
-        setChatPreviewList({
-          nonce: generateRandomNonce(),
-          items: [],
-          page: 1,
-          loading: false,
-          loaded: false,
-          reset: false,
-          resume: false,
-          errored: true,
-          error: error,
-        });
-      }
-    } catch (e) {
-      // return if nonce doesn't match
-      console.debug(e);
-      console.debug(`Errored: currentNonce: ${currentNonce}, chatPreviewList.nonce: ${chatPreviewList.nonce}`);
-      if (currentNonce !== chatPreviewList.nonce) {
-        return;
-      }
-
-      setChatPreviewList({
-        nonce: generateRandomNonce(),
-        items: [],
-        page: 1,
-        loading: false,
-        loaded: false,
-        reset: false,
-        resume: false,
-        errored: true,
-        error: {
-          code: ChatPreviewListErrorCodes.CHAT_PREVIEW_LIST_PRELOAD_ERROR,
-          message: 'Error in searching',
-        },
-      });
-    }
-  };
-
   // Attach scroll listener
   const onScroll = async () => {
     const element = listInnerRef.current;
diff --git a/packages/uiweb/src/lib/components/chat/ChatPreviewSearchList/ChatPreviewSearchList.tsx b/packages/uiweb/src/lib/components/chat/ChatPreviewSearchList/ChatPreviewSearchList.tsx
index 3369166a0..717d31f5a 100644
--- a/packages/uiweb/src/lib/components/chat/ChatPreviewSearchList/ChatPreviewSearchList.tsx
+++ b/packages/uiweb/src/lib/components/chat/ChatPreviewSearchList/ChatPreviewSearchList.tsx
@@ -21,9 +21,9 @@ import { ThemeContext } from '../theme/ThemeProvider';
 // Interfaces & Types
 import {
   ChatPreviewSearchListErrorCodes,
+  IChatPreviewPayload,
   IChatPreviewSearchListError,
   IChatPreviewSearchListProps,
-  IChatPreviewPayload,
 } from '../exportedTypes';
 import { IChatTheme } from '../theme';
 
@@ -155,6 +155,7 @@ export const ChatPreviewSearchList: React.FC<IChatPreviewSearchListProps> = (opt
       chatGroup: false,
       chatTimestamp: undefined,
       chatMsg: {
+        messageMeta: '',
         messageType: '',
         messageContent: '',
       },
@@ -199,6 +200,7 @@ export const ChatPreviewSearchList: React.FC<IChatPreviewSearchListProps> = (opt
                 chatGroup: true,
                 chatPic: groupInfo?.groupImage || null,
                 chatMsg: {
+                  messageMeta: 'Text',
                   messageType: 'Text',
                   messageContent: chatInfo?.list === 'CHATS' ? 'Resume Conversation!' : 'Join Group!',
                 },
@@ -216,6 +218,7 @@ export const ChatPreviewSearchList: React.FC<IChatPreviewSearchListProps> = (opt
               chatGroup: false,
               chatPic: userProfile?.profile?.picture || null,
               chatMsg: {
+                messageMeta: 'Text',
                 messageType: 'Text',
                 messageContent: chatInfo?.list === 'CHATS' ? 'Resume Chat!' : 'Start Chat!',
               },
@@ -611,7 +614,7 @@ const SearchError = styled(Span)`
   align-self: center;
   padding: 12px 18px;
   text-transform: uppercase;
-  letter-spacing: 0.1em;
+  letter-spacing: normal;
   font-size: 10px;
   font-weight: 500;
 `;
diff --git a/packages/uiweb/src/lib/components/chat/ChatProfile/ChatProfile.tsx b/packages/uiweb/src/lib/components/chat/ChatProfile/ChatProfile.tsx
index 81c00cc9e..9c89d95e9 100644
--- a/packages/uiweb/src/lib/components/chat/ChatProfile/ChatProfile.tsx
+++ b/packages/uiweb/src/lib/components/chat/ChatProfile/ChatProfile.tsx
@@ -28,7 +28,7 @@ import { ProfileContainer } from '../reusables';
 import { GroupInfoModal } from './ChatProfileInfoModal';
 
 // Internal Configs
-import { CoreContractChainId, InfuraAPIKey, allowedNetworks, device } from '../../../config';
+import { device } from '../../../config';
 import { ThemeContext } from '../theme/ThemeProvider';
 
 // Assets
diff --git a/packages/uiweb/src/lib/components/chat/ChatView/ChatViewComponent.tsx b/packages/uiweb/src/lib/components/chat/ChatView/ChatViewComponent.tsx
index 615e6fd51..cecdf7ebc 100644
--- a/packages/uiweb/src/lib/components/chat/ChatView/ChatViewComponent.tsx
+++ b/packages/uiweb/src/lib/components/chat/ChatView/ChatViewComponent.tsx
@@ -1,6 +1,6 @@
 import React, { useContext, useEffect, useState } from 'react';
 import { MODAL_BACKGROUND_TYPE, MODAL_POSITION_TYPE } from '../../../types';
-import { IChatTheme, IChatViewComponentProps } from '../exportedTypes';
+import { IChatTheme, IChatViewComponentProps, IMessagePayload } from '../exportedTypes';
 
 import { chatLimit, device } from '../../../config';
 import { deriveChatId } from '../../../helpers';
@@ -33,6 +33,7 @@ export const ChatViewComponent: React.FC<IChatViewComponentProps> = (options: IC
     emoji = true,
     file = true,
     gif = true,
+    handleReply = true,
     isConnected = true,
     autoConnect = false,
     onVerificationFail,
@@ -43,7 +44,7 @@ export const ChatViewComponent: React.FC<IChatViewComponentProps> = (options: IC
     chatProfileRightHelperComponent = null,
     chatProfileLeftHelperComponent = null,
     welcomeComponent = null,
-    closeChatProfileInfoModalOnClickAway = false
+    closeChatProfileInfoModalOnClickAway = false,
   } = options || {};
 
   const { user } = useChatData();
@@ -63,6 +64,8 @@ export const ChatViewComponent: React.FC<IChatViewComponentProps> = (options: IC
     derivedChatId: '',
   });
 
+  const [replyPayload, setReplyPayload] = useState<IMessagePayload | null>(null);
+
   useEffect(() => {
     const fetchDerivedChatId = async () => {
       setInitialized((currentState) => ({ ...currentState, loading: true }));
@@ -137,6 +140,7 @@ export const ChatViewComponent: React.FC<IChatViewComponentProps> = (options: IC
                 chatFilterList={chatFilterList}
                 limit={limit}
                 chatId={initialized.derivedChatId}
+                setReplyPayload={setReplyPayload}
               />
             )}
           </ChatViewSection>
@@ -156,6 +160,8 @@ export const ChatViewComponent: React.FC<IChatViewComponentProps> = (options: IC
                 file={file}
                 emoji={emoji}
                 gif={gif}
+                replyPayload={handleReply ? replyPayload : null}
+                setReplyPayload={setReplyPayload}
                 isConnected={isConnected}
                 verificationFailModalBackground={verificationFailModalBackground}
                 verificationFailModalPosition={verificationFailModalPosition}
@@ -172,12 +178,12 @@ export const ChatViewComponent: React.FC<IChatViewComponentProps> = (options: IC
 };
 
 //styles
-const Conatiner = styled(Section) <IThemeProps>`
+const Conatiner = styled(Section)<IThemeProps>`
   border: ${(props) => props.theme.border?.chatViewComponent};
   box-sizing: border-box;
 `;
 
-const ChatViewSection = styled(Section) <IThemeProps>`
+const ChatViewSection = styled(Section)<IThemeProps>`
   @media (${device.mobileL}) {
     margin: 0;
   }
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubble/ChatViewBubble.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubble/ChatViewBubble.tsx
index c3770fde1..5b39b6745 100644
--- a/packages/uiweb/src/lib/components/chat/ChatViewBubble/ChatViewBubble.tsx
+++ b/packages/uiweb/src/lib/components/chat/ChatViewBubble/ChatViewBubble.tsx
@@ -7,8 +7,8 @@ import styled from 'styled-components';
 
 import { ChatDataContext } from '../../../context';
 import { useChatData } from '../../../hooks';
+import { ReplyIcon } from '../../../icons/PushIcons';
 import { Div, Image, Section, Span } from '../../reusables';
-import { checkTwitterUrl } from '../helpers/twitter';
 import { ThemeContext } from '../theme/ThemeProvider';
 
 import { useConnectWallet, useSetChain } from '@web3-onboard/react';
@@ -20,11 +20,11 @@ import { FILE_ICON, allowedNetworks, device } from '../../../config';
 import {
   formatFileSize,
   getPfp,
+  isMessageEncrypted,
   pCAIP10ToWallet,
   shortenText,
   sign,
   toSerialisedHexString,
-  isMessageEncrypted,
 } from '../../../helpers';
 import { createBlockie } from '../../../helpers/blockies';
 import { FileMessageContent, FrameDetails, IFrame, IFrameButton, IReactionsForChatMessages } from '../../../types';
@@ -32,14 +32,12 @@ import { extractWebLink, getFormattedMetadata, hasWebLink } from '../../../utili
 import { IMessagePayload, TwitterFeedReturnType } from '../exportedTypes';
 import { Button, TextInput } from '../reusables';
 
-import { FileCard } from './cards/file/FileCard';
-import { GIFCard } from './cards/gif/GIFCard';
-import { ImageCard } from './cards/image/ImageCard';
-import { MessageCard } from './cards/message/MessageCard';
-import { TwitterCard } from './cards/twitter/TwitterCard';
+import { Button as RButton } from '../../reusables';
+
+import { ChatViewBubbleCore } from '../ChatViewBubbleCore';
 
-import { Reactions } from './reactions/Reactions';
 import { ReactionPicker } from './reactions/ReactionPicker';
+import { Reactions } from './reactions/Reactions';
 
 const SenderMessageAddress = ({ chat }: { chat: IMessagePayload }) => {
   const { user } = useContext(ChatDataContext);
@@ -188,6 +186,7 @@ export const ChatViewBubble = ({
   decryptedMessagePayload,
   chatPayload: payload,
   chatReactions,
+  setReplyPayload,
   showChatMeta = false,
   chatId,
   actionId,
@@ -197,6 +196,7 @@ export const ChatViewBubble = ({
   decryptedMessagePayload: IMessagePayload;
   chatPayload?: IMessagePayload;
   chatReactions?: any;
+  setReplyPayload?: (payload: IMessagePayload) => void;
   showChatMeta?: boolean;
   chatId?: string;
   actionId?: string | null | undefined;
@@ -220,26 +220,6 @@ export const ChatViewBubble = ({
   const chatPosition =
     pCAIP10ToWallet(chatPayload.fromDID).toLowerCase() !== pCAIP10ToWallet(user?.account ?? '')?.toLowerCase() ? 0 : 1;
 
-  // derive message
-  const message =
-    typeof chatPayload.messageObj === 'object'
-      ? (chatPayload.messageObj?.content as string) ?? ''
-      : (chatPayload.messageObj as string);
-
-  // check and render tweets
-  const { tweetId, messageType }: TwitterFeedReturnType = checkTwitterUrl({
-    message: message,
-  });
-
-  if (messageType === 'TwitterFeedLink') {
-    chatPayload.messageType = 'TwitterFeedLink';
-  }
-
-  // test if the payload is encrypted, if so convert it to text
-  if (isMessageEncrypted(message)) {
-    chatPayload.messageType = 'Text';
-  }
-
   // attach a ref to chat sidebar
   const chatSidebarRef = useRef<HTMLDivElement>(null);
 
@@ -262,6 +242,7 @@ export const ChatViewBubble = ({
         <ChatBubbleSection
           margin="6px 0px 0px 0px"
           flexDirection="column"
+          alignSelf="flex-start"
         >
           {/* hide overflow for chat cards and border them */}
           <Section
@@ -273,44 +254,10 @@ export const ChatViewBubble = ({
             }
             overflow="hidden"
           >
-            {/* Message Card */}
-            {chatPayload.messageType === 'Text' && (
-              <MessageCard
-                chat={chatPayload}
-                position={chatPosition}
-                account={user?.account ?? ''}
-              />
-            )}
-
-            {/* Image Card */}
-            {chatPayload.messageType === 'Image' && <ImageCard chat={chatPayload} />}
-
-            {/* File Card */}
-            {chatPayload.messageType === 'File' && <FileCard chat={chatPayload} />}
-
-            {/* Gif Card */}
-            {chatPayload.messageType === 'GIF' && <GIFCard chat={chatPayload} />}
-
-            {/* Twitter Card */}
-            {chatPayload.messageType === 'TwitterFeedLink' && (
-              <TwitterCard
-                tweetId={tweetId}
-                chat={chatPayload}
-              />
-            )}
-
-            {/* Default Message Card */}
-            {chatPayload.messageType !== 'Text' &&
-              chatPayload.messageType !== 'Image' &&
-              chatPayload.messageType !== 'File' &&
-              chatPayload.messageType !== 'GIF' &&
-              chatPayload.messageType !== 'TwitterFeedLink' && (
-                <MessageCard
-                  chat={chatPayload}
-                  position={chatPosition}
-                  account={user?.account ?? ''}
-                />
-              )}
+            <ChatViewBubbleCore
+              chat={chatPayload}
+              chatId={chatId}
+            />
           </Section>
 
           {/* render if reactions are present */}
@@ -328,9 +275,11 @@ export const ChatViewBubble = ({
 
         <ChatBubbleSidebarSection
           ref={chatSidebarRef}
-          alignItems="flex-end"
-          justifyContent={chatPosition ? 'flex-end' : 'flex-start'}
+          flexDirection="column"
+          alignItems={chatPosition ? 'flex-end' : 'flex-start'}
+          justifyContent="flex-end"
           margin={chatReactions && !!chatReactions.length ? '0px 0px 41px 0px' : '0px 0px 15px 0px'}
+          gap="2px"
           width="auto"
           flex="1 0 auto"
           style={{
@@ -341,16 +290,38 @@ export const ChatViewBubble = ({
           {/* Only render if user and user readmode is false}
           {/* For reaction - additional condition - only render if chatId is passed and setSelectedChatMsgId is passed */}
           {user && !user.readmode() && chatId && (
-            <ReactionPicker
-              chatId={chatId}
-              chat={chatPayload}
-              userSelectingReaction={userSelectingReaction && actionId === singularActionId}
-              setUserSelectingReaction={setUserSelectingReaction}
-              actionId={actionId}
-              singularActionId={singularActionId}
-              setSingularActionId={setSingularActionId}
-              chatSidebarRef={chatSidebarRef}
-            />
+            <>
+              {/* Reply Icon */}
+              <RButton
+                borderRadius={theme.borderRadius?.reactionsPickerBorderRadius}
+                background="transparent"
+                hoverBackground={theme.backgroundColor?.chatReceivedBubbleBackground}
+                padding={theme.padding?.reactionsPickerPadding}
+                border={theme.border?.reactionsBorder}
+                hoverBorder={theme.border?.reactionsHoverBorder}
+                onClick={(e) => {
+                  e.stopPropagation();
+                  setReplyPayload?.(chatPayload);
+                }}
+              >
+                <ReplyIcon
+                  color={theme.iconColor?.emoji}
+                  size={20}
+                />
+              </RButton>
+
+              {/* Reaction Picker */}
+              <ReactionPicker
+                chatId={chatId}
+                chat={chatPayload}
+                userSelectingReaction={userSelectingReaction && actionId === singularActionId}
+                setUserSelectingReaction={setUserSelectingReaction}
+                actionId={actionId}
+                singularActionId={singularActionId}
+                setSingularActionId={setSingularActionId}
+                chatSidebarRef={chatSidebarRef}
+              />
+            </>
           )}
         </ChatBubbleSidebarSection>
       </ChatWrapperSection>
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/gif/GIFCard.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/gif/GIFCard.tsx
deleted file mode 100644
index e4bdb3f53..000000000
--- a/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/gif/GIFCard.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-// React + Web3 Essentials
-
-// External Packages
-
-// Internal Compoonents
-import { Image, Section, Span } from '../../../../reusables';
-
-// Internal Configs
-
-// Assets
-
-// Interfaces & Types
-import { IMessagePayload } from '../../../exportedTypes';
-
-// Constants
-
-// Exported Interfaces & Types
-
-// Exported Functions
-export const GIFCard = ({ chat }: { chat: IMessagePayload }) => {
-  // derive message
-  const message =
-    typeof chat.messageObj === 'object' ? (chat.messageObj?.content as string) ?? '' : (chat.messageObj as string);
-
-  return (
-    <Section
-      maxWidth="512px"
-      width="fit-content"
-    >
-      <Image
-        src={message}
-        alt=""
-        width="100%"
-      />
-    </Section>
-  );
-};
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/image/ImageCard.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/image/ImageCard.tsx
deleted file mode 100644
index ad63c299f..000000000
--- a/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/image/ImageCard.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-// React + Web3 Essentials
-
-// External Packages
-
-// Internal Compoonents
-import { Image, Section } from '../../../../reusables';
-
-// Internal Configs
-
-// Assets
-
-// Interfaces & Types
-import { IMessagePayload } from '../../../exportedTypes';
-
-// Constants
-
-// Exported Interfaces & Types
-
-// Exported Functions
-const getParsedMessage = (message: string) => {
-  try {
-    return JSON.parse(message);
-  } catch (error) {
-    console.error('UIWeb::components::ChatViewBubble::ImageCard::error while parsing image', error);
-    return null;
-  }
-};
-
-const getImageContent = (message: string) => getParsedMessage(message)?.content ?? '';
-
-export const ImageCard = ({ chat }: { chat: IMessagePayload }) => {
-  // derive message
-  const message =
-    typeof chat.messageObj === 'object' ? (chat.messageObj?.content as string) ?? '' : (chat.messageObj as string);
-
-  return (
-    <Section
-      maxWidth="512px"
-      width="fit-content"
-    >
-      <Image
-        src={getImageContent(message)}
-        alt=""
-        width="100%"
-      />
-    </Section>
-  );
-};
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubble/reactions/ReactionPicker.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubble/reactions/ReactionPicker.tsx
index f2defeccf..352b0fd8c 100644
--- a/packages/uiweb/src/lib/components/chat/ChatViewBubble/reactions/ReactionPicker.tsx
+++ b/packages/uiweb/src/lib/components/chat/ChatViewBubble/reactions/ReactionPicker.tsx
@@ -16,6 +16,7 @@ import { EmojiCircleIcon } from '../../../../icons/PushIcons';
 
 // Interfaces & Types
 import { IMessagePayload } from '../../exportedTypes';
+import { pCAIP10ToWallet } from '../../../../helpers';
 
 // Constants
 
@@ -112,8 +113,14 @@ export const ReactionPicker = ({
     }
   }, [sendingReaction]);
 
+  const chatPosition =
+    pCAIP10ToWallet(chat.fromDID).toLowerCase() !== pCAIP10ToWallet(user?.account ?? '')?.toLowerCase() ? 0 : 1;
+
+
   return (
-    <>
+    <Section
+      justifyContent={chatPosition ? 'flex-end' : 'flex-start'}
+    >
       {/* To display emoji picker */}
       <Button
         borderRadius={theme.borderRadius?.reactionsPickerBorderRadius}
@@ -247,6 +254,6 @@ export const ReactionPicker = ({
           )}
         </Section>
       )}
-    </>
+    </Section>
   );
 };
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubble/reactions/Reactions.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubble/reactions/Reactions.tsx
index 36b883948..554163c03 100644
--- a/packages/uiweb/src/lib/components/chat/ChatViewBubble/reactions/Reactions.tsx
+++ b/packages/uiweb/src/lib/components/chat/ChatViewBubble/reactions/Reactions.tsx
@@ -1,10 +1,10 @@
 // React + Web3 Essentials
-import { useContext, useRef, useState, useEffect, RefObject } from 'react';
+import { RefObject, useContext, useEffect, useRef, useState } from 'react';
 
 // External Packages
 
 // Internal Compoonents
-import { Image, Section, Button, Spinner, Span } from '../../../reusables';
+import { Button, Image, Section, Span, Spinner } from '../../../reusables';
 import { ThemeContext } from '../../theme/ThemeProvider';
 
 // Internal Configs
@@ -42,6 +42,9 @@ export const Reactions = ({ chatReactions }: { chatReactions: IReactionsForChatM
     return acc;
   }, {} as IReactions);
 
+  // generate a unique key for the reactions
+  const reactionsKey = chatReactions.map((reaction) => reaction.reference).join('-');
+
   console.debug('UIWeb::components::ChatViewBubble::Reactions::uniqueReactions', uniqueReactions);
 
   // render reactions
@@ -50,6 +53,7 @@ export const Reactions = ({ chatReactions }: { chatReactions: IReactionsForChatM
     <>
       {Object.keys(uniqueReactions).length > 2 ? (
         <Section
+          key={`reactions-${reactionsKey}`}
           borderRadius={theme.borderRadius?.reactionsBorderRadius}
           background={theme.backgroundColor?.chatReceivedBubbleBackground}
           padding={theme.padding?.reactionsPadding}
@@ -74,6 +78,7 @@ export const Reactions = ({ chatReactions }: { chatReactions: IReactionsForChatM
       ) : (
         Object.entries(uniqueReactions).map(([content, reactions]) => (
           <Section
+            key={`reactions-${content}-${reactionsKey}`}
             borderRadius={theme.borderRadius?.reactionsBorderRadius}
             background={theme.backgroundColor?.chatReceivedBubbleBackground}
             padding={theme.padding?.reactionsPadding}
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/CardRenderer.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/CardRenderer.tsx
new file mode 100644
index 000000000..3a458c42e
--- /dev/null
+++ b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/CardRenderer.tsx
@@ -0,0 +1,128 @@
+import { ReactNode, useContext, useEffect, useRef, useState } from 'react';
+
+import { useChatData } from '../../../hooks';
+import { checkTwitterUrl } from '../helpers/twitter';
+import { ThemeContext } from '../theme/ThemeProvider';
+
+import { isMessageEncrypted, pCAIP10ToWallet } from '../../../helpers';
+import { IMessagePayload, TwitterFeedReturnType } from '../exportedTypes';
+
+import { FileCard } from './cards/file/FileCard';
+import { GIFCard } from './cards/gif/GIFCard';
+import { ImageCard } from './cards/image/ImageCard';
+import { MessageCard } from './cards/message/MessageCard';
+import { TwitterCard } from './cards/twitter/TwitterCard';
+
+export const CardRenderer = ({
+  chat,
+  position,
+  previewMode = false,
+  activeMode = false,
+}: {
+  chat: IMessagePayload;
+  position: number;
+  previewMode?: boolean;
+  activeMode?: boolean;
+}) => {
+  // get theme
+  const theme = useContext(ThemeContext);
+
+  // get user
+  const { user } = useChatData();
+
+  // extract message to perform checks
+  const message =
+    typeof chat.messageObj === 'object'
+      ? (typeof chat.messageObj?.content === 'string' ? chat.messageObj?.content : '') ?? ''
+      : (chat.messageObj as string);
+
+  // test if the payload is encrypted, if so convert it to text
+  if (isMessageEncrypted(message)) {
+    chat.messageType = 'Text';
+  }
+
+  // get user account
+  const account = user?.account ?? '';
+
+  // deduce font color
+  const fontColor =
+    position && !activeMode ? theme.textColor?.chatSentBubbleText : theme.textColor?.chatReceivedBubbleText;
+
+  // Render the card render
+  return (
+    <>
+      {/* Message Card */}
+      {/* Twitter Card is handled by PreviewRenderer */}
+      {/* Frame Card is handled by PreviewRenderer */}
+      {/* Code Card is handled by CodeRenderer */}
+      {chat && chat.messageType === 'Text' && (
+        <MessageCard
+          chat={chat}
+          position={position}
+          account={account}
+          color={fontColor}
+          previewMode={previewMode}
+          activeMode={activeMode}
+        />
+      )}
+
+      {/* Image Card */}
+      {chat.messageType === 'Image' && (
+        // Background only valid when no preview or active mode
+        <ImageCard
+          chat={chat}
+          background={
+            position && !activeMode && !previewMode
+              ? theme.backgroundColor?.chatSentBubbleBackground
+              : theme.backgroundColor?.chatReceivedBubbleBackground
+          }
+          color={fontColor}
+          previewMode={previewMode}
+          activeMode={activeMode}
+        />
+      )}
+
+      {/* File Card */}
+      {chat.messageType === 'File' && (
+        <FileCard
+          chat={chat}
+          background={
+            position && !activeMode
+              ? theme.backgroundColor?.chatPreviewSentBubbleBackground
+              : theme.backgroundColor?.chatPreviewRecievedBubbleBackground
+          }
+          color={fontColor}
+          previewMode={previewMode}
+          activeMode={activeMode}
+        />
+      )}
+
+      {/* Gif Card */}
+      {chat.messageType === 'GIF' && (
+        <GIFCard
+          chat={chat}
+          background={
+            position && !activeMode && !previewMode
+              ? theme.backgroundColor?.chatSentBubbleBackground
+              : theme.backgroundColor?.chatReceivedBubbleBackground
+          }
+          color={fontColor}
+          previewMode={previewMode}
+          activeMode={activeMode}
+        />
+      )}
+
+      {/* Default Message Card - Only support limited message types like Reaction */}
+      {chat.messageType === 'Reaction' && (
+        <MessageCard
+          chat={chat}
+          position={position}
+          account={account}
+          color={fontColor}
+          previewMode={previewMode}
+          activeMode={activeMode}
+        />
+      )}
+    </>
+  );
+};
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/ChatViewBubbleCore.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/ChatViewBubbleCore.tsx
new file mode 100644
index 000000000..aa4304368
--- /dev/null
+++ b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/ChatViewBubbleCore.tsx
@@ -0,0 +1,130 @@
+// React + Web3 Essentials
+import { useContext } from 'react';
+
+// External Packages
+import styled from 'styled-components';
+
+// Internal Components
+import { useChatData } from '../../../hooks';
+import { ThemeContext } from '../theme/ThemeProvider';
+
+import { deepCopy, isMessageEncrypted, pCAIP10ToWallet } from '../../../helpers';
+import { IMessagePayload, TwitterFeedReturnType } from '../exportedTypes';
+
+import { Section } from '../../reusables';
+import { CardRenderer } from './CardRenderer';
+import { ReplyCard } from './cards/reply/ReplyCard';
+
+// Internal Configs
+
+// Assets
+
+// Interfaces & Types
+interface ChatViewBubbleCoreProps extends React.ComponentProps<typeof Section> {
+  borderBG?: string;
+  previewMode?: boolean;
+}
+
+// Exported Default Component
+export const ChatViewBubbleCore = ({
+  chat,
+  chatId,
+  previewMode = false,
+  activeMode = false,
+}: {
+  chat: IMessagePayload;
+  chatId: string | undefined;
+  previewMode?: boolean;
+  activeMode?: boolean;
+}) => {
+  // get theme
+  const theme = useContext(ThemeContext);
+
+  // get user
+  const { user } = useChatData();
+
+  // get chat position
+  const chatPosition =
+    pCAIP10ToWallet(chat.fromDID).toLowerCase() !== pCAIP10ToWallet(user?.account ?? '')?.toLowerCase() ? 0 : 1;
+
+  const renderBubble = (chat: IMessagePayload, position: number) => {
+    const components: JSX.Element[] = [];
+
+    // replace derivedMsg with chat as that's the original
+    // take reference from derivedMsg which forms the reply
+    // Create a deep copy of chat
+    const derivedMsg = deepCopy(chat) as any;
+    let replyReference = '';
+
+    if (chat && chat.messageType === 'Reply') {
+      // Reply messageObj content contains messageObj and messageType;
+      replyReference = (chat as any).messageObj?.reference ?? null;
+      derivedMsg.messageType = derivedMsg?.messageObj?.content?.messageType;
+      derivedMsg.messageObj = derivedMsg?.messageObj?.content?.messageObj;
+    }
+
+    // Render cards - Anything not a reply is ChatViewBubbleCardRenderer
+    // Reply is it's own card that calls ChatViewBubbleCardRenderer
+    // This avoids transitive recursion
+
+    // Use replyReference to check and call reply card but only if activeMode is false
+    // as activeMode will be true when user is replying to a message
+    if (replyReference !== '' && !activeMode) {
+      // Add Reply Card
+      components.push(
+        <ReplyCard
+          key="reply"
+          reference={replyReference}
+          chatId={chatId}
+          position={position}
+        />
+      );
+    }
+
+    // Use derivedMsg to render other cards
+    if (derivedMsg) {
+      // Add Message Card
+      components.push(
+        <CardRenderer
+          key="card"
+          chat={derivedMsg}
+          position={position}
+          previewMode={previewMode}
+          activeMode={activeMode}
+        />
+      );
+    }
+
+    // deduce background color
+    // if active mode, use the normal background color as this is user replying to a message
+    // if preview mode, use the reply background color
+    // if not preview mode, use the normal background color
+    const background = activeMode
+      ? theme.backgroundColor?.chatActivePreviewBubbleBackground
+      : position
+        ? previewMode
+          ? theme.backgroundColor?.chatPreviewSentBubbleBackground
+          : theme.backgroundColor?.chatSentBubbleBackground
+        : previewMode
+          ? theme.backgroundColor?.chatPreviewRecievedBubbleBackground
+          : theme.backgroundColor?.chatReceivedBubbleBackground;
+
+    return (
+      <ChatViewBubbleCoreSection
+        flexDirection="column"
+        background={background}
+        borderBG={activeMode ? theme.backgroundColor?.chatActivePreviewBorderBubbleBackground : 'transparent'}
+        borderRadius={activeMode ? theme.borderRadius?.chatBubbleReplyBorderRadius : '0px'}
+        previewMode={previewMode}
+      >
+        {components}
+      </ChatViewBubbleCoreSection>
+    );
+  };
+
+  return renderBubble(chat, chatPosition);
+};
+
+const ChatViewBubbleCoreSection = styled(Section) <ChatViewBubbleCoreProps>`
+  border-left: ${({ borderBG, previewMode }) => (previewMode ? `4px solid ${borderBG || 'transparent'}` : 'none')};
+`;
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/file/FileCard.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/file/FileCard.tsx
similarity index 69%
rename from packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/file/FileCard.tsx
rename to packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/file/FileCard.tsx
index b64a3f281..5d43f53dd 100644
--- a/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/file/FileCard.tsx
+++ b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/file/FileCard.tsx
@@ -1,4 +1,5 @@
 // React + Web3 Essentials
+import { useContext } from 'react';
 
 // External Packages
 import styled from 'styled-components';
@@ -13,6 +14,7 @@ import {
   toSerialisedHexString,
 } from '../../../../../helpers';
 import { Image, Section, Span } from '../../../../reusables';
+import { ThemeContext } from '../../../theme/ThemeProvider';
 
 // Internal Configs
 import { FILE_ICON, allowedNetworks } from '../../../../../config';
@@ -44,7 +46,22 @@ const getParsedMessage = (message: string): FileMessageContent => {
   }
 };
 
-export const FileCard = ({ chat }: { chat: IMessagePayload }) => {
+export const FileCard = ({
+  chat,
+  background,
+  color,
+  previewMode,
+  activeMode,
+}: {
+  chat: IMessagePayload;
+  background?: string;
+  color?: string;
+  previewMode: boolean;
+  activeMode: boolean;
+}) => {
+  // get theme
+  const theme = useContext(ThemeContext);
+
   // derive message
   const message =
     typeof chat.messageObj === 'object' ? (chat.messageObj?.content as string) ?? '' : (chat.messageObj as string);
@@ -54,13 +71,14 @@ export const FileCard = ({ chat }: { chat: IMessagePayload }) => {
   return (
     <Section
       alignSelf="start"
-      maxWidth="512px"
-      background="#343536"
-      borderRadius="8px"
-      justifyContent="space-around"
-      padding="10px 13px"
+      maxWidth={previewMode ? 'auto' : '512px'}
+      background={background}
+      borderRadius={theme.borderRadius?.chatBubbleContentBorderRadius}
+      justifyContent="space-between"
+      padding={theme.padding?.chatBubbleContentPadding}
+      margin={theme.margin?.chatBubbleContentMargin}
       gap="15px"
-      width="fit-content"
+      width={previewMode ? 'fill-available' : '-webkit-fit-content'}
     >
       <Image
         src={FILE_ICON(parsedMessage.name?.split('.').slice(-1)[0])}
@@ -70,16 +88,18 @@ export const FileCard = ({ chat }: { chat: IMessagePayload }) => {
       />
       <Section
         flexDirection="column"
+        flex={previewMode ? '1' : 'auto'}
+        alignItems={previewMode ? 'flex-start' : 'center'}
         gap="5px"
       >
         <Span
-          color="#fff"
+          color={color}
           fontSize="15px"
         >
           {shortenText(parsedMessage.name, 11)}
         </Span>
         <Span
-          color="#fff"
+          color={color}
           fontSize="12px"
         >
           {formatFileSize(parsedMessage.size)}
@@ -91,7 +111,7 @@ export const FileCard = ({ chat }: { chat: IMessagePayload }) => {
         rel="noopener noreferrer"
         download
       >
-        <MdDownload color="#575757" />
+        <MdDownload color={color} />
       </FileDownloadIconAnchor>
     </Section>
   );
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/gif/GIFCard.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/gif/GIFCard.tsx
new file mode 100644
index 000000000..48b80a091
--- /dev/null
+++ b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/gif/GIFCard.tsx
@@ -0,0 +1,74 @@
+// React + Web3 Essentials
+import { useContext } from 'react';
+
+// External Packages
+
+// Internal Compoonents
+import { Image, Section, Span } from '../../../../reusables';
+import { ThemeContext } from '../../../theme/ThemeProvider';
+import { Tag } from '../../tag/Tag';
+
+// Internal Configs
+
+// Assets
+
+// Interfaces & Types
+import { IMessagePayload } from '../../../exportedTypes';
+
+// Constants
+
+// Exported Interfaces & Types
+
+// Exported Functions
+export const GIFCard = ({
+  chat,
+  background = 'transparent',
+  color = 'inherit', // default to inherit
+  previewMode = false,
+  activeMode = false,
+}: {
+  chat: IMessagePayload;
+  background?: string;
+  color?: string;
+  previewMode?: boolean;
+  activeMode?: boolean;
+}) => {
+  // get theme
+  const theme = useContext(ThemeContext);
+
+  // derive message
+  const message =
+    typeof chat.messageObj === 'object' ? (chat.messageObj?.content as string) ?? '' : (chat.messageObj as string);
+
+  return (
+    <Section
+      maxWidth={previewMode ? 'auto' : '512px'}
+      width="fill-available"
+      justifyContent="flex-start"
+      background={previewMode ? 'transparent' : background}
+      color={color}
+      gap="0px"
+    >
+      <Section
+        background="white"
+        borderRadius="12px"
+        overflow="hidden"
+        margin={theme.margin?.chatBubbleContentMargin}
+        maxWidth={previewMode ? '64px' : 'auto'}
+        maxHeight={previewMode ? '64px' : 'auto'}
+      >
+        <Image
+          src={message}
+          alt=""
+          width="100%"
+        />
+      </Section>
+
+      {previewMode && (
+        <Section margin="8px 0px 0px 0px">
+          <Tag type="Image" />
+        </Section>
+      )}
+    </Section>
+  );
+};
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/image/ImageCard.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/image/ImageCard.tsx
new file mode 100644
index 000000000..cc0b33bf9
--- /dev/null
+++ b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/image/ImageCard.tsx
@@ -0,0 +1,81 @@
+// React + Web3 Essentials
+import { useContext } from 'react';
+
+// External Packages
+
+// Internal Compoonents
+import { Image, Section, Span } from '../../../../reusables';
+import { ThemeContext } from '../../../theme/ThemeProvider';
+import { Tag } from '../../tag/Tag';
+
+// Helper functions
+import { getParsedMessage } from '../../../helpers';
+
+// Internal Configs
+
+// Assets
+
+// Interfaces & Types
+import { IMessagePayload } from '../../../exportedTypes';
+
+// Constants
+
+// Exported Interfaces & Types
+
+
+const getImageContent = (message: string) => getParsedMessage(message)?.content ?? '';
+
+export const ImageCard = ({
+  chat,
+  background = 'transparent',
+  color = 'inherit', // default to inherit
+  previewMode = false,
+  activeMode = false,
+}: {
+  chat: IMessagePayload;
+  background?: string;
+  color?: string;
+  previewMode?: boolean;
+  activeMode?: boolean;
+}) => {
+  // get theme
+  const theme = useContext(ThemeContext);
+
+  // derive message
+  const message =
+    typeof chat.messageObj === 'object' ? (chat.messageObj?.content as string) ?? '' : (chat.messageObj as string);
+
+  return (
+    <Section
+      maxWidth={previewMode ? 'auto' : '512px'}
+      width="fill-available"
+      justifyContent="space-between"
+      background={previewMode ? 'transparent' : background}
+      color={color}
+      gap="0px"
+    >
+      {previewMode && (
+        <Section margin="8px" alignSelf='center'>
+          <Tag type="Image" />
+        </Section>
+      )}
+
+      <Section
+        background="white"
+        borderRadius="12px"
+        overflow="hidden"
+        margin={theme.margin?.chatBubbleContentMargin}
+        maxWidth={previewMode ? '64px' : 'auto'}
+        maxHeight={previewMode ? '64px' : 'auto'}
+      >
+        <Image
+          src={getImageContent(message)}
+          alt=""
+          width="100%"
+        />
+      </Section>
+
+
+    </Section>
+  );
+};
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/message/FrameRenderer.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/message/FrameRenderer.tsx
similarity index 100%
rename from packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/message/FrameRenderer.tsx
rename to packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/message/FrameRenderer.tsx
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/message/MessageCard.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/message/MessageCard.tsx
similarity index 83%
rename from packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/message/MessageCard.tsx
rename to packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/message/MessageCard.tsx
index b740e8a75..2bd09526d 100644
--- a/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/message/MessageCard.tsx
+++ b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/message/MessageCard.tsx
@@ -34,10 +34,16 @@ export const MessageCard = ({
   chat,
   position,
   account,
+  color = 'inherit', // default to inherit
+  previewMode = false,
+  activeMode = false,
 }: {
   chat: IMessagePayload;
   position: number;
   account: string;
+  color?: string;
+  previewMode?: boolean;
+  activeMode?: boolean;
 }) => {
   // get theme
   const theme = useContext(ThemeContext);
@@ -126,8 +132,19 @@ export const MessageCard = ({
     return chunks;
   };
 
+  // if preview mode, reduce the message to 100 characters and only 3 lines
+  const reduceMessage = (message: string) => {
+    const limitedMessage = message.slice(0, 100);
+    const lines = limitedMessage.split('\n');
+    const reducedMessage = lines.slice(0, 3).join(' ');
+    return reducedMessage;
+  };
+
   // convert to fragments which can have different types
-  const fragments = splitMessageToMessages({ msg: message, type: 'text' });
+  // if preview mode, skip fragments and only reduce message
+  const fragments = previewMode
+    ? [{ msg: reduceMessage(message), type: 'text' }]
+    : splitMessageToMessages({ msg: message, type: 'text' });
 
   // To render individual fragments
   const renderTxtFragments = (message: string, fragmentIndex: number): ReactNode => {
@@ -136,11 +153,12 @@ export const MessageCard = ({
         key={`${fragmentIndex}-${lineIndex}`} // Updated key to be more unique
         alignSelf="start"
         textAlign="left"
+        lineHeight="1.4em"
         fontSize={position ? `${theme.fontSize?.chatSentBubbleText}` : `${theme.fontSize?.chatReceivedBubbleText}`}
         fontWeight={
           position ? `${theme.fontWeight?.chatSentBubbleText}` : `${theme.fontWeight?.chatReceivedBubbleText}`
         }
-        color={position ? `${theme.textColor?.chatSentBubbleText}` : `${theme.textColor?.chatReceivedBubbleText}`}
+        color={color}
       >
         {line.split(' ').map((word: string, wordIndex: number) => {
           const link = hasWebLink(word) ? extractWebLink(word) : '';
@@ -190,37 +208,37 @@ export const MessageCard = ({
 
   // Render entire message
   return (
-    <MessageCardSection className={initialized.additionalClasses}>
+    <MessageCardSection
+      className={initialized.additionalClasses}
+      justifyContent="stretch"
+      width="fill-available"
+    >
       {/* Preview Renderer - Start with assuming preview is there, callback handles no preview */}
       <MessagePreviewSection
         width="100%"
         minWidth="inherit"
         maxWidth="inherit"
+        background={theme.backgroundColor?.chatReceivedBubbleBackground}
       >
         <PreviewRenderer
           message={message}
           account={account}
           messageId={chat.link ?? 'null'}
           previewCallback={previewCallback}
+          previewMode={previewMode}
         />
       </MessagePreviewSection>
 
       {/* Message Rendering - Always happens */}
       <MessageSection
         gap="5px"
-        background={
-          position
-            ? `${theme.backgroundColor?.chatSentBubbleBackground}`
-            : `${theme.backgroundColor?.chatReceivedBubbleBackground}`
-        }
         border={position ? `${theme.border?.chatSentBubble}` : `${theme.border?.chatReceivedBubble}`}
-        padding="8px 12px"
+        padding={theme.padding?.chatBubbleInnerContentPadding}
         justifyContent="start"
         flexDirection="column"
         maxWidth="inherit"
         minWidth="72px"
         position="relative"
-        color={position ? `${theme.textColor?.chatSentBubbleText}` : `${theme.textColor?.chatReceivedBubbleText}`}
       >
         <Section
           flexDirection="column"
@@ -237,25 +255,27 @@ export const MessageCard = ({
           })}
         </Section>
 
-        {/* Timestamp rendering */}
-        <Span
-          fontSize={
-            position
-              ? `${theme.fontSize?.chatSentBubbleTimestampText}`
-              : `${theme.fontSize?.chatReceivedBubbleTimestampText}`
-          }
-          fontWeight={
-            position
-              ? `${theme.fontWeight?.chatSentBubbleTimestampText}`
-              : `${theme.fontWeight?.chatReceivedBubbleTimestampText}`
-          }
-          color={position ? `${theme.textColor?.chatSentBubbleText}` : `${theme.textColor?.chatReceivedBubbleText}`}
-          right="0px"
-          width="auto"
-          alignSelf="flex-end"
-        >
-          {time}
-        </Span>
+        {/* Timestamp rendering only when no preview mode */}
+        {!previewMode && (
+          <Span
+            fontSize={
+              position
+                ? `${theme.fontSize?.chatSentBubbleTimestampText}`
+                : `${theme.fontSize?.chatReceivedBubbleTimestampText}`
+            }
+            fontWeight={
+              position
+                ? `${theme.fontWeight?.chatSentBubbleTimestampText}`
+                : `${theme.fontWeight?.chatReceivedBubbleTimestampText}`
+            }
+            color={color}
+            right="0px"
+            width="auto"
+            alignSelf="flex-end"
+          >
+            {time}
+          </Span>
+        )}
       </MessageSection>
     </MessageCardSection>
   );
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/message/PreviewRenderer.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/message/PreviewRenderer.tsx
similarity index 69%
rename from packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/message/PreviewRenderer.tsx
rename to packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/message/PreviewRenderer.tsx
index 5a0380774..3abcf6bdc 100644
--- a/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/message/PreviewRenderer.tsx
+++ b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/message/PreviewRenderer.tsx
@@ -2,16 +2,18 @@
 import { useEffect, useState } from 'react';
 
 // External Packages
+import { TwitterTweetEmbed } from 'react-twitter-embed';
+import styled from 'styled-components';
 
 // Internal Compoonents
 import { IFrame } from '../../../../../types';
 import { extractWebLink, getFormattedMetadata, hasWebLink, isSupportedVideoLink } from '../../../../../utilities';
+import { checkTwitterUrl } from '../../../helpers/twitter';
 
 import { FrameRenderer } from './FrameRenderer';
 import { VideoRenderer } from './VideoRenderer';
-
 // Internal Configs
-
+import { device } from '../../../../../config/globals';
 // Assets
 
 // Interfaces & Types
@@ -22,7 +24,7 @@ const PROXY_SERVER = 'https://proxy.push.org';
 // Exported Interfaces & Types
 export interface IPreviewCallback {
   loading: boolean;
-  urlType: 'video' | 'frame' | 'other';
+  urlType: 'video' | 'frame' | 'twitter' | 'other';
   error: unknown | null;
 }
 
@@ -32,18 +34,20 @@ export const PreviewRenderer = ({
   account,
   messageId,
   previewCallback,
+  previewMode = false,
 }: {
   message: string | undefined;
   account: string;
   messageId: string;
   previewCallback?: (callback: IPreviewCallback) => void;
+  previewMode?: boolean;
 }) => {
   // setup frame data
   const [initialized, setInitialized] = useState({
     loading: true,
     frameData: {} as IFrame,
     url: null as string | null,
-    urlType: 'other' as 'video' | 'frame' | 'other',
+    urlType: 'other' as 'video' | 'frame' | 'twitter' | 'other',
     error: null as unknown | null,
   });
 
@@ -90,9 +94,23 @@ export const PreviewRenderer = ({
       }
     };
 
-    if (message && hasWebLink(message)) {
-      const url = extractWebLink(message);
-      fetchMetaTags(url ?? '');
+    if (message && hasWebLink(message) && !previewMode) {
+      // first check for twitter url
+      const twitterUrl = checkTwitterUrl(message);
+
+      if (twitterUrl.isTweet) {
+        setInitialized((prevState) => ({
+          ...prevState,
+          loading: false,
+          error: null,
+          url: `${twitterUrl.tweetId}`,
+          urlType: 'twitter',
+        }));
+      } else {
+        // extract web link and process
+        const url = extractWebLink(message);
+        fetchMetaTags(url ?? '');
+      }
     } else {
       // Initiate the callback
       setInitialized((prevState) => ({
@@ -130,5 +148,32 @@ export const PreviewRenderer = ({
       url={initialized.url}
       frameData={initialized.frameData}
     />
+  ) : !initialized.loading && !initialized.error && initialized.url && initialized.urlType === 'twitter' ? (
+    <TwitterEmbedWrapper>
+      <TwitterTweetEmbed tweetId={initialized.url} />
+    </TwitterEmbedWrapper>
   ) : null;
 };
+
+const TwitterEmbedWrapper = styled.div`
+  width: 100%;
+  max-width: 550px;
+  margin: 0 auto;
+  overflow: hidden;
+  padding: 0 10px;
+  > div {
+    max-width: 100% !important;
+  }
+
+  iframe {
+    max-width: 100% !important;
+  }
+
+  @media (max-width: ${device.mobileL}) {
+    max-width: 100%;
+
+    iframe {
+      width: 100% !important;
+    }
+  }
+`;
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/message/VideoRenderer.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/message/VideoRenderer.tsx
similarity index 100%
rename from packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/message/VideoRenderer.tsx
rename to packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/message/VideoRenderer.tsx
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/reply/ReplyCard.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/reply/ReplyCard.tsx
new file mode 100644
index 000000000..cd4097825
--- /dev/null
+++ b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/reply/ReplyCard.tsx
@@ -0,0 +1,182 @@
+// React + Web3 Essentials
+import { useContext, useEffect, useState } from 'react';
+
+// External Packages
+import styled from 'styled-components';
+
+// Internal Compoonents
+import { useChatData } from '../../../../../hooks';
+import { Section, Span } from '../../../../reusables';
+
+import { ThemeContext } from '../../../theme/ThemeProvider';
+import { CardRenderer } from '../../CardRenderer';
+
+// Internal Configs
+
+// Assets
+
+// Interfaces & Types
+import { IMessagePayload } from '../../../exportedTypes';
+import { pCAIP10ToWallet, shortenText } from '../../../../../helpers';
+
+// Constants
+
+// Exported Interfaces & Types
+// Extend Section via ReplySectionProps
+interface ReplySectionProps extends React.ComponentProps<typeof Section> {
+  borderBG?: string;
+}
+
+// Exported Functions
+export const ReplyCard = ({
+  reference,
+  chatId,
+  position,
+}: {
+  reference: string | null;
+  chatId: string | undefined;
+  position?: number;
+}) => {
+  // get theme
+  const theme = useContext(ThemeContext);
+
+  // get user
+  const { user } = useChatData();
+
+  // set and get reply payload
+  const [replyPayloadManager, setReplyPayloadManager] = useState<{
+    payload: IMessagePayload | null;
+    loaded: boolean;
+    err: string | null;
+  }>({ payload: null, loaded: false, err: null });
+
+  // resolve reply payload
+  useEffect(() => {
+    const resolveReplyPayload = async () => {
+      if (!replyPayloadManager.loaded) {
+        if (reference && chatId) {
+          try {
+            const payloads = await user?.chat.history(chatId, { reference: reference, limit: 1 });
+            const payload = payloads ? payloads[0] : null;
+
+            // check if payload is reply
+            // if so, change the message type to content one
+            if (payload?.messageType === 'Reply') {
+              payload.messageType = payload?.messageObj?.content?.messageType;
+              payload.messageObj = payload?.messageObj?.content?.messageObj;
+            }
+
+            // finally set the reply
+            setReplyPayloadManager({ ...replyPayloadManager, payload: payload, loaded: true });
+          } catch (err) {
+            setReplyPayloadManager({
+              ...replyPayloadManager,
+              payload: null,
+              loaded: true,
+              err: 'Unable to load Preview',
+            });
+          }
+        } else {
+          setReplyPayloadManager({
+            ...replyPayloadManager,
+            payload: null,
+            loaded: true,
+            err: 'Reply reference not found',
+          });
+        }
+      }
+    };
+    resolveReplyPayload();
+  }, [replyPayloadManager, reference, user?.chat, chatId]);
+
+  // render
+  return (
+    <ReplySection
+      key={`card-reply-${replyPayloadManager.payload?.link ?? 'null'}`}
+      maxWidth="512px"
+      minWidth="200px"
+      width="fill-available"
+      background={
+        position
+          ? theme.backgroundColor?.chatPreviewSentBubbleBackground
+          : theme.backgroundColor?.chatPreviewRecievedBubbleBackground
+      }
+      margin={theme.margin?.chatBubbleReplyMargin}
+      borderRadius={theme.borderRadius?.chatBubbleReplyBorderRadius}
+      borderBG={
+        position
+          ? theme.backgroundColor?.chatPreviewSentBorderBubbleBackground
+          : theme.backgroundColor?.chatPreviewRecievedBorderBubbleBackground
+      }
+    >
+      {/* Initial State */}
+      {!replyPayloadManager.loaded && (
+        <Span
+          alignSelf="start"
+          textAlign="left"
+          lineHeight="1.4em"
+          width="inherit"
+          fontSize={position ? `${theme.fontSize?.chatSentBubbleText}` : `${theme.fontSize?.chatReceivedBubbleText}`}
+          fontWeight={
+            position ? `${theme.fontWeight?.chatSentBubbleText}` : `${theme.fontWeight?.chatReceivedBubbleText}`
+          }
+          padding={theme.padding?.chatBubbleInnerContentPadding}
+          color={position ? `${theme.textColor?.chatSentBubbleText}` : `${theme.textColor?.chatReceivedBubbleText}`}
+        >
+          Loading Preview...
+        </Span>
+      )}
+
+      {/* Error State */}
+      {replyPayloadManager.loaded && replyPayloadManager.err && (
+        <Span
+          alignSelf="start"
+          textAlign="left"
+          lineHeight="1.4em"
+          width="inherit"
+          fontSize={position ? `${theme.fontSize?.chatSentBubbleText}` : `${theme.fontSize?.chatReceivedBubbleText}`}
+          fontWeight={
+            position ? `${theme.fontWeight?.chatSentBubbleText}` : `${theme.fontWeight?.chatReceivedBubbleText}`
+          }
+          padding={theme.padding?.chatBubbleInnerContentPadding}
+          color={position ? `${theme.textColor?.chatSentBubbleText}` : `${theme.textColor?.chatReceivedBubbleText}`}
+        >
+          {replyPayloadManager.err}
+        </Span>
+      )}
+
+      {/* Loaded State */}
+      {replyPayloadManager.loaded && replyPayloadManager.payload && (
+        <Section
+          flexDirection="column"
+          alignItems="flex-start"
+          overflow="hidden"
+          width="fill-available"
+        >
+          <Span
+            padding="8px 12px 0px"
+            fontSize="10px"
+            color={position ? `${theme.textColor?.chatSentBubbleText}` : `${theme.textColor?.chatReceivedBubbleText}`}
+          >
+            <Span
+              fontWeight="500"
+              padding="0px"
+            >
+              {shortenText(pCAIP10ToWallet(replyPayloadManager.payload.fromDID), 6, true)}
+            </Span>
+          </Span>
+          <CardRenderer
+            key={`card-render-${replyPayloadManager.payload?.link ?? 'null'}`}
+            chat={replyPayloadManager.payload}
+            position={position ?? 0}
+            previewMode={true}
+          />
+        </Section>
+      )}
+    </ReplySection>
+  );
+};
+
+const ReplySection = styled(Section)<ReplySectionProps>`
+  border-left: 4px solid ${({ borderBG }) => borderBG || 'transparent'};
+`;
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/twitter/TwitterCard.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/twitter/TwitterCard.tsx
similarity index 100%
rename from packages/uiweb/src/lib/components/chat/ChatViewBubble/cards/twitter/TwitterCard.tsx
rename to packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/cards/twitter/TwitterCard.tsx
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/index.ts b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/index.ts
new file mode 100644
index 000000000..c38a34c6e
--- /dev/null
+++ b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/index.ts
@@ -0,0 +1 @@
+export { ChatViewBubbleCore } from './ChatViewBubbleCore';
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/tag/Tag.tsx b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/tag/Tag.tsx
new file mode 100644
index 000000000..e9296472e
--- /dev/null
+++ b/packages/uiweb/src/lib/components/chat/ChatViewBubbleCore/tag/Tag.tsx
@@ -0,0 +1,47 @@
+// React + Web3 Essentials
+import React, { useContext } from 'react';
+
+// External Packages
+import styled from 'styled-components';
+
+// Internal Compoonents
+import { Span } from '../../../reusables';
+import { ThemeContext } from '../../theme/ThemeProvider';
+
+// Internal Configs
+
+// Assets
+
+// Interfaces & Types
+import { IMessagePayload } from '../../exportedTypes';
+
+// Constants
+
+// Exported Interfaces & Types
+interface TagProps {
+  type: 'Image' | 'GIF' | 'Video' | 'Audio';
+}
+
+export const Tag = ({ type }: TagProps) => {
+  // get theme
+  const theme = useContext(ThemeContext);
+
+  return (
+    <Span
+      width="auto"
+      alignSelf="start"
+      textAlign="left"
+      lineHeight="1.4em"
+      fontSize="10px"
+      fontWeight="500"
+      padding="4px 8px"
+      borderRadius="8px"
+      textTransform="uppercase"
+      letterSpacing="1.2px"
+      color={theme.textColor?.chatSentBubbleText}
+      background={theme.backgroundColor?.chatPreviewTagBackground}
+    >
+      {type}
+    </Span>
+  );
+};
diff --git a/packages/uiweb/src/lib/components/chat/ChatViewList/ChatViewList.tsx b/packages/uiweb/src/lib/components/chat/ChatViewList/ChatViewList.tsx
index 9317e3aca..22878c89e 100644
--- a/packages/uiweb/src/lib/components/chat/ChatViewList/ChatViewList.tsx
+++ b/packages/uiweb/src/lib/components/chat/ChatViewList/ChatViewList.tsx
@@ -66,7 +66,7 @@ export const ChatViewList: React.FC<IChatViewListProps> = (options: IChatViewLis
     invalidChat: false,
   });
 
-  const { chatId, limit = chatLimit, chatFilterList = [] } = options || {};
+  const { chatId, limit = chatLimit, chatFilterList = [], setReplyPayload } = options || {};
   const { user, toast } = useChatData();
 
   // const [chatStatusText, setChatStatusText] = useState<string>('');
@@ -216,13 +216,14 @@ export const ChatViewList: React.FC<IChatViewListProps> = (options: IChatViewLis
         scrollLocked = true;
       }
 
-      console.debug(
-        `UIWeb::ChatViewList::onScroll::scrollLocked ${new Date().toISOString()}`,
-        scrollRef.current.scrollTop,
-        scrollRef.current.clientHeight,
-        scrollRef.current.scrollHeight,
-        scrollLocked
-      );
+      // Turning it off as it overfills debug
+      // console.debug(
+      //   `UIWeb::ChatViewList::onScroll::scrollLocked ${new Date().toISOString()}`,
+      //   scrollRef.current.scrollTop,
+      //   scrollRef.current.clientHeight,
+      //   scrollRef.current.scrollHeight,
+      //   scrollLocked
+      // );
 
       // update scroll-locked attribute
       scrollRef.current.setAttribute('data-scroll-locked', scrollLocked.toString());
@@ -247,13 +248,14 @@ export const ChatViewList: React.FC<IChatViewListProps> = (options: IChatViewLis
         if (scrollRef.current && height !== 0) {
           const scrollLocked = scrollRef.current.getAttribute('data-scroll-locked') === 'true' ? true : false;
 
-          console.debug(
-            `UIWeb::ChatViewList::onScroll::scrollLocked Observer ${new Date().toISOString()}`,
-            scrollRef.current.scrollTop,
-            scrollRef.current.clientHeight,
-            scrollRef.current.scrollHeight,
-            scrollLocked
-          );
+          // Turning it off as it overfills debug
+          // console.debug(
+          //   `UIWeb::ChatViewList::onScroll::scrollLocked Observer ${new Date().toISOString()}`,
+          //   scrollRef.current.scrollTop,
+          //   scrollRef.current.clientHeight,
+          //   scrollRef.current.scrollHeight,
+          //   scrollLocked
+          // );
 
           if (height !== 0 && scrollLocked) {
             // update programmable-scroll attribute
@@ -524,6 +526,7 @@ export const ChatViewList: React.FC<IChatViewListProps> = (options: IChatViewLis
 
           {
             <ChatViewListCardInner
+              key={`section-chatview-${user?.uid}`}
               flexDirection="column"
               justifyContent="start"
               width="100%"
@@ -562,6 +565,7 @@ export const ChatViewList: React.FC<IChatViewListProps> = (options: IChatViewLis
                           decryptedMessagePayload={chat}
                           chatPayload={chat}
                           chatReactions={reactions[(chat as any).cid] || []}
+                          setReplyPayload={setReplyPayload}
                           showChatMeta={initialized.chatInfo?.meta?.group ?? false}
                           chatId={chatId}
                           actionId={(chat as any).cid}
@@ -585,7 +589,7 @@ export const ChatViewList: React.FC<IChatViewListProps> = (options: IChatViewLis
 };
 
 //styles
-const ChatViewListCard = styled(Section)<IThemeProps>`
+const ChatViewListCard = styled(Section) <IThemeProps>`
   &::-webkit-scrollbar-thumb {
     background: ${(props) => props.theme.scrollbarColor};
     border-radius: 10px;
@@ -598,6 +602,6 @@ const ChatViewListCard = styled(Section)<IThemeProps>`
   overscroll-behavior: contain;
 `;
 
-const ChatViewListCardInner = styled(Section)<IThemeProps>`
+const ChatViewListCardInner = styled(Section) <IThemeProps>`
   filter: ${(props) => (props.blur ? 'blur(12px)' : 'none')};
 `;
diff --git a/packages/uiweb/src/lib/components/chat/CreateGroup/AddCriteria.tsx b/packages/uiweb/src/lib/components/chat/CreateGroup/AddCriteria.tsx
index 87a3d811a..1a90f5a7f 100644
--- a/packages/uiweb/src/lib/components/chat/CreateGroup/AddCriteria.tsx
+++ b/packages/uiweb/src/lib/components/chat/CreateGroup/AddCriteria.tsx
@@ -18,6 +18,9 @@ import PolygonSvg from '../../../icons/polygon.svg';
 import ArbitrumSvg from '../../../icons/arbitrum.svg';
 import BSCSvg from '../../../icons/bsc.svg';
 import FuseSvg from '../../../icons/fuse.svg';
+import BaseSvg from '../../../icons/base.svg';
+import LineaSvg from '../../../icons/linea.svg';
+import CyberConnectSvg from '../../../icons/cyberconnect.svg';
 
 import OptimismSvg from '../../../icons/optimisim.svg';
 import { BLOCKCHAIN_NETWORK, ENV, device } from '../../../config';
@@ -37,6 +40,7 @@ import {
   checkIfCustomEndpoint,
   checkIfGuild,
   checkIfPushInvite,
+  checkIfTokenId,
   checkIfTokenNFT,
   fetchContractInfo,
   getCategoryDropdownValues,
@@ -56,6 +60,7 @@ const AddCriteria = ({ handlePrevious, onClose, criteriaStateManager }: ModalHea
   const [guildComparison, setGuildComparison] = useState('');
   const [selectedChainValue, setSelectedChainValue] = useState<number>(0);
   const [contract, setContract] = useState<string>('');
+  const [tokenId, setTokenId] = useState<string>('');
   const [inviteCheckboxes, setInviteCheckboxes] = useState<{
     admin: boolean;
     owner: boolean;
@@ -154,6 +159,12 @@ const AddCriteria = ({ handlePrevious, onClose, criteriaStateManager }: ModalHea
         title: 'Custom Endpoint',
         function: () => setSelectedCategoryValue(3),
       },
+      {
+        id: 4,
+        value: CATEGORY.ERC1155,
+        title: 'Token ERC1155',
+        function: () => setSelectedCategoryValue(4),
+      },
     ],
     GUILD: {
       value: CATEGORY.ROLES,
@@ -170,6 +181,10 @@ const AddCriteria = ({ handlePrevious, onClose, criteriaStateManager }: ModalHea
       value: SUBCATEGORY.HOLDER,
       title: 'Holder',
     },
+    ERC1155: {
+      value: SUBCATEGORY.HOLDER,
+      title: 'Holder',
+    },
     INVITE: {
       value: SUBCATEGORY.DEFAULT,
       title: 'Default',
@@ -231,14 +246,35 @@ const AddCriteria = ({ handlePrevious, onClose, criteriaStateManager }: ModalHea
       icon: FuseSvg,
       function: () => setSelectedChainValue(5),
     },
+    {
+      id: 6,
+      value: BLOCKCHAIN_NETWORK[env].CYBER_CONNECT,
+      title: 'Cyber',
+      icon: CyberConnectSvg,
+      function: () => setSelectedChainValue(6),
+    },
+    {
+      id: 7,
+      value: BLOCKCHAIN_NETWORK[env].BASE,
+      title: 'Base',
+      icon: BaseSvg,
+      function: () => setSelectedChainValue(7),
+    },
+    {
+      id: 8,
+      value: BLOCKCHAIN_NETWORK[env].LINEA,
+      title: 'Linea',
+      icon: LineaSvg,
+      function: () => setSelectedChainValue(8),
+    },
   ];
   if (env !== ENV.PROD) {
     dropdownChainsValues.push({
-      id: 6,
+      id: 9,
       value: BLOCKCHAIN_NETWORK[env].BERACHAIN,
       title: 'Berachain',
       icon: BerachainSvg,
-      function: () => setSelectedChainValue(6),
+      function: () => setSelectedChainValue(9),
     } as DropdownValueType);
   }
   console.debug(dropdownChainsValues);
@@ -256,7 +292,7 @@ const AddCriteria = ({ handlePrevious, onClose, criteriaStateManager }: ModalHea
 
     let subCategory = 'DEFAULT';
     if (_type === 'PUSH') {
-      if (category === CATEGORY.ERC20 || category === CATEGORY.ERC721) {
+      if (category === CATEGORY.ERC20 || category === CATEGORY.ERC721 || category === CATEGORY.ERC1155) {
         subCategory = SUBCATEGORY.HOLDER;
       } else if (category === CATEGORY.CustomEndpoint) {
         subCategory = 'GET';
@@ -283,6 +319,7 @@ const AddCriteria = ({ handlePrevious, onClose, criteriaStateManager }: ModalHea
         dropdownQuantityRangeValues,
         selectedChainValue,
         dropdownChainsValues,
+        tokenId: Number(tokenId),
       }),
     };
 
@@ -320,7 +357,11 @@ const AddCriteria = ({ handlePrevious, onClose, criteriaStateManager }: ModalHea
         const pushData = oldValue.data as PushData;
 
         // sub category
-        if (oldValue.category === CATEGORY.ERC20 || oldValue.category === CATEGORY.ERC721) {
+        if (
+          oldValue.category === CATEGORY.ERC20 ||
+          oldValue.category === CATEGORY.ERC721 ||
+          oldValue.category === CATEGORY.ERC1155
+        ) {
           if (pushData.token) {
             setUnit(pushData.token);
           }
@@ -335,6 +376,7 @@ const AddCriteria = ({ handlePrevious, onClose, criteriaStateManager }: ModalHea
             dropdownChainsValues.findIndex((obj) => obj.value === contractAndChain[0] + ':' + contractAndChain[1])
           );
           setContract(contractAndChain.length === 3 ? contractAndChain[2] : '');
+          setTokenId(pushData.tokenId?.toString() || '');
           setQuantity({
             value: pushData.amount || 0,
             range: dropdownQuantityRangeValues.findIndex((obj) => obj.value === pushData.comparison),
@@ -374,6 +416,7 @@ const AddCriteria = ({ handlePrevious, onClose, criteriaStateManager }: ModalHea
         setDecimals,
         selectedChainValue,
         dropdownChainsValues,
+        tokenId: Number(tokenId),
       });
     }, 2000);
     return () => clearTimeout(getData);
@@ -536,6 +579,22 @@ const AddCriteria = ({ handlePrevious, onClose, criteriaStateManager }: ModalHea
             />
             {!!validationErrors?.tokenError && <ErrorSpan>{validationErrors?.tokenError}</ErrorSpan>}
           </Section>
+          {checkIfTokenId({ dropdownCategoryValues, dropdownTypeValues, selectedCategoryValue, selectedTypeValue }) && (
+            <Section
+              gap="10px"
+              flexDirection="column"
+              alignItems="start"
+            >
+              <TextInput
+                labelName="Token Id"
+                inputValue={tokenId}
+                onInputChange={(e: any) => setTokenId(e.target.value)}
+                placeholder="e.g. 2"
+                error={!!validationErrors?.tokenId}
+              />
+              {!!validationErrors?.tokenId && <ErrorSpan>{validationErrors?.tokenId}</ErrorSpan>}
+            </Section>
+          )}
           <Section
             gap="10px"
             flexDirection="column"
diff --git a/packages/uiweb/src/lib/components/chat/CreateGroup/ConditionsComponent.tsx b/packages/uiweb/src/lib/components/chat/CreateGroup/ConditionsComponent.tsx
index c54635da6..e1132f76b 100644
--- a/packages/uiweb/src/lib/components/chat/CreateGroup/ConditionsComponent.tsx
+++ b/packages/uiweb/src/lib/components/chat/CreateGroup/ConditionsComponent.tsx
@@ -89,12 +89,17 @@ const CriteriaSection = ({ criteria }: { criteria: ConditionData }) => {
   const checkIfNftToken = () => {
     if (
       criteria?.category === CATEGORY.ERC721 ||
-      criteria?.category === CATEGORY.ERC20
+      criteria?.category === CATEGORY.ERC20 || 
+      criteria?.category === CATEGORY.ERC1155
     )
       return true;
     return false;
   };
 
+  const checkIfIDToken = () => {
+    return criteria?.category === CATEGORY.ERC1155;
+  };
+
   const getGuildRole = () => {
     if (!criteria?.data?.['comparison']) {
       return 'SPECIFIC';
@@ -123,12 +128,26 @@ const CriteriaSection = ({ criteria }: { criteria: ConditionData }) => {
           justifyContent="space-between"
           alignItems="center"
         >
-          <Span fontWeight="700" color={theme.textColor?.modalHeadingText}>
-            <Span fontWeight="500" color={theme.textColor?.modalSubHeadingText}>
-              {getTokenNftComparisionLabel()}{' '}
+          {checkIfIDToken() ?
+            <Section>
+              <Span fontWeight="500" color={theme.textColor?.modalSubHeadingText}>
+                {getTokenNftComparisionLabel()}{' '}
+              </Span>
+              <Section flexDirection='column' alignItems='start' margin="0px 0px 0px 8px">
+                <Span color={theme.textColor?.modalSubHeadingText} fontSize='10px'>
+                  {criteria?.data?.['amount']} {tokenSymbol}
+                </Span>
+                <Span color={theme.textColor?.modalHeadingText} textAlign='flex-start'>ID: {criteria?.data?.['tokenId']}</Span>
+              </Section>
+            </Section>
+            : 
+            <Span fontWeight="700" color={theme.textColor?.modalHeadingText}>
+              <Span fontWeight="500" color={theme.textColor?.modalSubHeadingText}>
+                {getTokenNftComparisionLabel()}{' '}
+              </Span>
+              {criteria?.data?.['amount']} {tokenSymbol}
             </Span>
-            {criteria?.data?.['amount']} {tokenSymbol}
-          </Span>
+          }
           <ChainIconSVG padding="3px 6px 0 0" >
             {
               NETWORK_ICON_DETAILS[
diff --git a/packages/uiweb/src/lib/components/chat/MessageInput/MessageInput.tsx b/packages/uiweb/src/lib/components/chat/MessageInput/MessageInput.tsx
index 104d6f28a..7b34d991d 100644
--- a/packages/uiweb/src/lib/components/chat/MessageInput/MessageInput.tsx
+++ b/packages/uiweb/src/lib/components/chat/MessageInput/MessageInput.tsx
@@ -14,11 +14,11 @@ import useGroupMemberUtilities from '../../../hooks/chat/useGroupMemberUtilities
 import usePushSendMessage from '../../../hooks/chat/usePushSendMessage';
 import useVerifyAccessControl from '../../../hooks/chat/useVerifyAccessControl';
 import { AttachmentIcon } from '../../../icons/Attachment';
-import { EmojiCircleIcon } from '../../../icons/PushIcons';
 import { GifIcon } from '../../../icons/Gif';
 import OpenLink from '../../../icons/OpenLink';
+import { EmojiCircleIcon } from '../../../icons/PushIcons';
 import { SendCompIcon } from '../../../icons/SendCompIcon';
-import { Div, Section, Span, Spinner } from '../../reusables';
+import { Button, Div, Section, Span, Spinner } from '../../reusables';
 import { ConditionsInformation } from '../ChatProfile/ChatProfileInfoModal';
 import { ConnectButton } from '../ConnectButton';
 import { Modal, ModalHeader } from '../reusables/Modal';
@@ -26,12 +26,15 @@ import { ThemeContext } from '../theme/ThemeProvider';
 
 import { PUBLIC_GOOGLE_TOKEN, device } from '../../../config';
 import usePushUser from '../../../hooks/usePushUser';
+import { CancelCircleIcon } from '../../../icons/PushIcons';
 import { MODAL_BACKGROUND_TYPE, MODAL_POSITION_TYPE, type FileMessageContent } from '../../../types';
 import { GIFType, Group, IChatTheme, MessageInputProps } from '../exportedTypes';
 import { checkIfAccessVerifiedGroup } from '../helpers';
 import { InfoContainer } from '../reusables';
 import { IChatInfoResponse } from '../types';
 
+import { ChatViewBubbleCore } from '../ChatViewBubbleCore';
+
 /**
  * @interface IThemeProps
  * this interface is used for defining the props for styled components
@@ -70,6 +73,8 @@ export const MessageInput: React.FC<MessageInputProps> = ({
   emoji = true,
   gif = true,
   file = true,
+  replyPayload = null,
+  setReplyPayload,
   isConnected = true,
   autoConnect = false,
   verificationFailModalBackground = MODAL_BACKGROUND_TYPE.OVERLAY,
@@ -350,8 +355,8 @@ export const MessageInput: React.FC<MessageInputProps> = ({
         try {
           const TWO_MB = 1024 * 1024 * 2;
           if (file.size > TWO_MB) {
-            console.log('Files larger than 2mb is now allowed');
-            throw new Error('Files larger than 2mb is now allowed');
+            console.log('Files larger than 2mb is not allowed');
+            throw new Error('Files larger than 2mb is not allowed');
           }
           setFileUploading(true);
           const messageType = file.type.startsWith('image') ? 'Image' : 'File';
@@ -388,9 +393,10 @@ export const MessageInput: React.FC<MessageInputProps> = ({
   const sendPushMessage = async (content: string, type: string) => {
     try {
       const sendMessageResponse = await sendMessage({
-        message: content,
         chatId: formattedChatId,
+        message: content,
         messageType: type as any,
+        replyRef: replyPayload?.cid || undefined,
       });
       if (sendMessageResponse && typeof sendMessageResponse === 'string' && sendMessageResponse.includes('403')) {
         setAccessControl(chatId, true);
@@ -399,6 +405,9 @@ export const MessageInput: React.FC<MessageInputProps> = ({
       }
     } catch (error) {
       console.log(error);
+    } finally {
+      // reset reply payload
+      setReplyPayload?.(null);
     }
   };
 
@@ -414,13 +423,20 @@ export const MessageInput: React.FC<MessageInputProps> = ({
     setGifOpen(false);
   };
 
+  // To focus when replyPayload is truthly
+  useEffect(() => {
+    if (replyPayload) {
+      textAreaRef.current?.focus();
+    }
+  }, [replyPayload]);
+
   return !(user && !user?.readmode()) && isConnected ? (
     <TypebarSection
       width="100%"
       overflow="hidden"
       borderRadius="13px"
       position="static"
-      padding={` ${user && !user?.readmode() ? '13px 16px' : ''}`}
+      padding={` ${user && !user?.readmode() ? '14px 16px' : ''}`}
       background={`${theme.backgroundColor?.messageInputBackground}`}
       alignItems="center"
       justifyContent="space-between"
@@ -439,7 +455,7 @@ export const MessageInput: React.FC<MessageInputProps> = ({
         borderRadius={theme.borderRadius?.messageInput}
         position="static"
         border={theme.border?.messageInput}
-        padding={` ${user && !user?.readmode() ? '13px 16px' : ''}`}
+        padding={` ${user && !user?.readmode() ? '14px 16px' : ''}`}
         background={`${theme.backgroundColor?.messageInputBackground}`}
         alignItems="center"
         justifyContent="space-between"
@@ -548,123 +564,185 @@ export const MessageInput: React.FC<MessageInputProps> = ({
               )}
           </>
         ) : null}
+
+        {/* Message bar logic */}
         {user && !user?.readmode() && (((isRules ? verified : true) && isMember) || (chatInfo && !groupInfo)) && (
-          <SendSection flex="1">
-            {emoji && (
-              <Div
-                width="25px"
-                cursor="pointer"
-                height="25px"
-                alignSelf="end"
-                onClick={() => setShowEmojis(!showEmojis)}
-              >
-                <EmojiCircleIcon
-                  color={theme.iconColor?.emoji}
-                  size={22}
-                />
-              </Div>
-            )}
-            {showEmojis && (
+          <Section
+            flexDirection="column"
+            flex="1"
+            gap="12px"
+          >
+            {/* Render reply message */}
+            {replyPayload && (
               <Section
-                ref={modalRef}
-                position="absolute"
-                bottom="50px"
-                left="-12px"
-                zIndex="700"
+                flexDirection="column"
+                alignItems="flex-start"
+                overflow="hidden"
+                gap="8px"
               >
-                <EmojiPicker
-                  width={isMobile ? 260 : 320}
-                  height={370}
-                  onEmojiClick={addEmoji}
+                <Section
+                  flexDirection="row"
+                  justifyContent="space-between"
+                  alignItems="center"
+                  overflow="hidden"
+                  gap="8px"
+                >
+                  <Span
+                    padding="0px"
+                    fontSize="10px"
+                    color={theme.iconColor?.emoji}
+                  >
+                    {`Reply to `}
+                    <Span
+                      fontWeight="500"
+                      padding="0px"
+                    >
+                      {`${replyPayload.fromDID?.split(':')[1].slice(0, 6)}...${replyPayload.fromDID
+                        ?.split(':')[1]
+                        .slice(-6)}`}
+                    </Span>
+                  </Span>
+                  <Button
+                    onClick={(e) => {
+                      e.stopPropagation();
+                      if (setReplyPayload) {
+                        setReplyPayload(null);
+                      }
+                    }}
+                  >
+                    <CancelCircleIcon
+                      size={14}
+                      color={theme.textColor?.messageInputText}
+                    />
+                  </Button>
+                </Section>
+                <ChatViewBubbleCore
+                  chat={replyPayload}
+                  chatId={chatId}
+                  previewMode={true}
+                  activeMode={true}
                 />
               </Section>
             )}
 
-            <MultiLineInput
-              disabled={loading ? true : false}
-              theme={theme}
-              onKeyDown={(event) => {
-                if (event.key === 'Enter' && !event.shiftKey) {
-                  event.preventDefault();
-                  sendTextMsg();
-                }
-              }}
-              placeholder="Type your message..."
-              onChange={(e) => onChangeTypedMessage(e.target.value)}
-              value={typedMessage}
-              ref={textAreaRef}
-              rows={1}
-            />
-            {gif && (
-              <Section
-                width="30px"
-                height="24px"
-                cursor="pointer"
-                alignSelf="end"
-                onClick={() => setGifOpen(!gifOpen)}
-              >
-                <GifIcon />
-              </Section>
-            )}
-            {gifOpen && (
-              <Section
-                position="absolute"
-                bottom="50px"
-                right="-18px"
-                zIndex="1"
-                ref={modalRef}
-              >
-                <GifPicker
-                  onGifClick={sendGIF}
-                  width={isMobile ? 260 : 320}
-                  height={370}
-                  tenorApiKey={String(PUBLIC_GOOGLE_TOKEN)}
-                />
-              </Section>
-            )}
-            <Section onClick={handleUploadFile}>
-              {!fileUploading && file && (
-                <>
-                  <Section
-                    width="18px"
-                    height="24px"
-                    cursor="pointer"
-                    alignSelf="end"
-                  >
-                    <AttachmentIcon color={theme.iconColor?.attachment} />
-                  </Section>
-                  <FileInput
-                    type="file"
-                    ref={fileUploadInputRef}
-                    onChange={(e) => uploadFile(e)}
+            {/* Render message bar */}
+            <SendSection flex="1">
+              {emoji && (
+                <Div
+                  width="25px"
+                  cursor="pointer"
+                  height="25px"
+                  alignSelf="end"
+                  onClick={() => setShowEmojis(!showEmojis)}
+                >
+                  <EmojiCircleIcon
+                    color={theme.iconColor?.emoji}
+                    size={22}
                   />
-                </>
+                </Div>
+              )}
+              {showEmojis && (
+                <Section
+                  ref={modalRef}
+                  position="absolute"
+                  bottom="50px"
+                  left="-12px"
+                  zIndex="700"
+                >
+                  <EmojiPicker
+                    width={isMobile ? 260 : 320}
+                    height={370}
+                    onEmojiClick={addEmoji}
+                  />
+                </Section>
               )}
-            </Section>
-            {!(loading || fileUploading) && (
-              <Section
-                cursor="pointer"
-                alignSelf="end"
-                height="20px"
-                width="22px"
-                onClick={() => sendTextMsg()}
-              >
-                <SendCompIcon color={theme.iconColor?.sendButton} />
-              </Section>
-            )}
 
-            {(loading || fileUploading) && (
-              <Section
-                alignSelf="end"
-                height="24px"
-              >
-                <Spinner
-                  color={theme.spinnerColor}
-                  size="22"
-                />
+              <MultiLineInput
+                ref={textAreaRef}
+                disabled={loading ? true : false}
+                theme={theme}
+                onKeyDown={(event) => {
+                  if (event.key === 'Enter' && !event.shiftKey) {
+                    event.preventDefault();
+                    sendTextMsg();
+                  }
+                }}
+                placeholder="Type your message..."
+                onChange={(e) => onChangeTypedMessage(e.target.value)}
+                value={typedMessage}
+                rows={1}
+              />
+              {gif && (
+                <Section
+                  width="30px"
+                  height="24px"
+                  cursor="pointer"
+                  alignSelf="end"
+                  onClick={() => setGifOpen(!gifOpen)}
+                >
+                  <GifIcon />
+                </Section>
+              )}
+              {gifOpen && (
+                <Section
+                  position="absolute"
+                  bottom="50px"
+                  right="-18px"
+                  zIndex="1"
+                  ref={modalRef}
+                >
+                  <GifPicker
+                    onGifClick={sendGIF}
+                    width={isMobile ? 260 : 320}
+                    height={370}
+                    tenorApiKey={String(PUBLIC_GOOGLE_TOKEN)}
+                  />
+                </Section>
+              )}
+              <Section onClick={handleUploadFile}>
+                {!fileUploading && file && (
+                  <>
+                    <Section
+                      width="18px"
+                      height="24px"
+                      cursor="pointer"
+                      alignSelf="end"
+                    >
+                      <AttachmentIcon color={theme.iconColor?.attachment} />
+                    </Section>
+                    <FileInput
+                      type="file"
+                      ref={fileUploadInputRef}
+                      onChange={(e) => uploadFile(e)}
+                    />
+                  </>
+                )}
               </Section>
-            )}
-          </SendSection>
+              {!(loading || fileUploading) && (
+                <Section
+                  cursor="pointer"
+                  alignSelf="end"
+                  height="20px"
+                  width="22px"
+                  onClick={() => sendTextMsg()}
+                >
+                  <SendCompIcon color={theme.iconColor?.sendButton} />
+                </Section>
+              )}
+
+              {(loading || fileUploading) && (
+                <Section
+                  alignSelf="end"
+                  height="24px"
+                >
+                  <Spinner
+                    color={theme.spinnerColor}
+                    size="22"
+                  />
+                </Section>
+              )}
+            </SendSection>
+          </Section>
         )}
       </TypebarSection>
     </MessageInputContainer>
@@ -673,7 +751,7 @@ export const MessageInput: React.FC<MessageInputProps> = ({
   );
 };
 
-const TypebarSection = styled(Section)<{ border?: string }>`
+const TypebarSection = styled(Section) <{ border?: string }>`
   // gap: 10px;
   border: ${(props) => props.border || 'none'};
   @media ${device.mobileL} {
diff --git a/packages/uiweb/src/lib/components/chat/UserProfile/UserProfile.tsx b/packages/uiweb/src/lib/components/chat/UserProfile/UserProfile.tsx
index 7fa81bc57..8fcea502f 100644
--- a/packages/uiweb/src/lib/components/chat/UserProfile/UserProfile.tsx
+++ b/packages/uiweb/src/lib/components/chat/UserProfile/UserProfile.tsx
@@ -15,7 +15,7 @@ import { ProfileContainer } from '../reusables';
 import { ThemeContext } from '../theme/ThemeProvider';
 import { UpdateUserProfileModal } from './UpdateUserProfileModal';
 
-import { Constants, CoreContractChainId, InfuraAPIKey, ProfilePicture, device } from '../../../config';
+import { device } from '../../../config';
 import VerticalEllipsisIcon from '../../../icons/VerticalEllipsis.svg';
 import UserProfileIcon from '../../../icons/userCircleGear.svg';
 import { MODAL_BACKGROUND_TYPE, MODAL_POSITION_TYPE } from '../../../types';
@@ -33,7 +33,7 @@ export const UserProfile: React.FC<UserProfileProps> = ({
   updateUserProfileModalBackground = MODAL_BACKGROUND_TYPE.OVERLAY,
   updateUserProfileModalPositionType = MODAL_POSITION_TYPE.GLOBAL,
   onUserProfileUpdateModalOpen,
-  closeUserProfileModalOnClickAway = false
+  closeUserProfileModalOnClickAway = false,
 }) => {
   const { user } = useChatData();
   const [userProfile, setUserProfile] = useState<IUser>();
@@ -157,7 +157,7 @@ export const UserProfile: React.FC<UserProfileProps> = ({
 };
 
 //styles
-const Conatiner = styled(Section) <IThemeProps>`
+const Conatiner = styled(Section)<IThemeProps>`
   border: ${(props) => props.theme.border?.userProfile};
   box-sizing: border-box;
 `;
diff --git a/packages/uiweb/src/lib/components/chat/exportedTypes.ts b/packages/uiweb/src/lib/components/chat/exportedTypes.ts
index 0b98cb753..2afedbd38 100644
--- a/packages/uiweb/src/lib/components/chat/exportedTypes.ts
+++ b/packages/uiweb/src/lib/components/chat/exportedTypes.ts
@@ -9,6 +9,7 @@ export interface IChatPreviewPayload {
   chatGroup: boolean;
   chatTimestamp: number | undefined;
   chatMsg?: {
+    messageMeta: string;
     messageType: string;
     messageContent: string | object;
   };
@@ -54,6 +55,7 @@ export interface IChatViewListProps {
   chatId: string;
   chatFilterList?: Array<string>;
   limit?: number;
+  setReplyPayload?: (payload: IMessagePayload) => void;
 }
 
 export interface IChatViewComponentProps {
@@ -66,6 +68,7 @@ export interface IChatViewComponentProps {
   emoji?: boolean;
   gif?: boolean;
   file?: boolean;
+  handleReply?: boolean;
   isConnected?: boolean;
   autoConnect?: boolean;
   groupInfoModalBackground?: ModalBackgroundType;
@@ -90,7 +93,7 @@ export interface IChatProfile {
 
 export interface TwitterFeedReturnType {
   tweetId: string;
-  messageType: string;
+  isTweet: boolean;
 }
 
 export interface IToast {
@@ -98,7 +101,10 @@ export interface IToast {
   status: string;
 }
 
-export type IMessagePayload = IMessageIPFS;
+export type IMessagePayload = IMessageIPFS & {
+  cid?: string;
+  reference?: string;
+};
 
 export const CHAT_THEME_OPTIONS = {
   LIGHT: 'light',
@@ -116,6 +122,8 @@ export interface MessageInputProps {
   emoji?: boolean;
   gif?: boolean;
   file?: boolean;
+  replyPayload?: IMessagePayload | null;
+  setReplyPayload?: (payload: IMessagePayload | null) => void;
   isConnected?: boolean;
   autoConnect?: boolean;
   verificationFailModalBackground?: ModalBackgroundType;
diff --git a/packages/uiweb/src/lib/components/chat/helpers/addCriteriaUtilities.ts b/packages/uiweb/src/lib/components/chat/helpers/addCriteriaUtilities.ts
index 92ebbd9fe..0180833c9 100644
--- a/packages/uiweb/src/lib/components/chat/helpers/addCriteriaUtilities.ts
+++ b/packages/uiweb/src/lib/components/chat/helpers/addCriteriaUtilities.ts
@@ -77,7 +77,24 @@ export const checkIfTokenNFT = ({
     selectedTypeValue,
     selectedCategoryValue,
   });
-  if (category === CATEGORY.ERC20 || category === CATEGORY.ERC721) return true;
+  if (category === CATEGORY.ERC20 || category === CATEGORY.ERC721 || category === CATEGORY.ERC1155) return true;
+
+  return false;
+};
+
+export const checkIfTokenId = ({
+  dropdownCategoryValues,
+  dropdownTypeValues,
+  selectedCategoryValue,
+  selectedTypeValue,
+}: InputFunctionParams) => {
+  const category = getSelectedCategoryValue({
+    dropdownCategoryValues,
+    dropdownTypeValues,
+    selectedTypeValue,
+    selectedCategoryValue,
+  });
+  if (category === CATEGORY.ERC1155) return true;
 
   return false;
 };
@@ -184,6 +201,7 @@ type FetchContractInfoParamType = {
   setUnit: Dispatch<SetStateAction<string>>;
   setDecimals: Dispatch<SetStateAction<number>>;
   contract: string;
+  tokenId: number;
   dropdownChainsValues: Array<DropdownValueType>;
   selectedChainValue: number;
 } & InputFunctionParams;
@@ -199,6 +217,7 @@ export const fetchContractInfo = async ({
   setDecimals,
   selectedChainValue,
   dropdownChainsValues,
+  tokenId,
 }: FetchContractInfoParamType) => {
   setValidationErrors((prev: any) => ({ ...prev, tokenError: undefined }));
 
@@ -215,7 +234,8 @@ export const fetchContractInfo = async ({
     _category,
     _chainInfo,
     setUnit,
-    setDecimals
+    setDecimals,
+    tokenId
   );
 };
 
@@ -228,6 +248,7 @@ type GetCriteriaDataParamType = {
   selectedChainValue: number;
   decimals: number;
   unit: string;
+  tokenId: number;
   url: string;
   guildId: string;
   specificRoleId: string;
@@ -257,17 +278,19 @@ export const getCriteriaData = ({
   dropdownQuantityRangeValues,
   selectedChainValue,
   dropdownChainsValues,
+  tokenId,
 }: GetCriteriaDataParamType): Data => {
   if (type === 'PUSH') {
-    if (category === CATEGORY.ERC20 || category === CATEGORY.ERC721) {
+    if (category === CATEGORY.ERC20 || category === CATEGORY.ERC721 || category === CATEGORY.ERC1155) {
       const selectedChain =
         dropdownChainsValues[selectedChainValue].value || 'eip155:1';
       return {
         contract: `${selectedChain}:${contract}`,
         amount: quantity.value,
         comparison: dropdownQuantityRangeValues[quantity.range].value,
-        decimals: category === CATEGORY.ERC20 ? decimals : undefined,
+        decimals: (category === CATEGORY.ERC20 || category === CATEGORY.ERC1155) ? decimals : undefined,
         token: unit,
+        tokenId,
       };
     } else if (category === CATEGORY.INVITE) {
       const _inviteRoles = [];
diff --git a/packages/uiweb/src/lib/components/chat/helpers/getRulesToCondtionArray.ts b/packages/uiweb/src/lib/components/chat/helpers/getRulesToCondtionArray.ts
index c24da7465..8a7b59e02 100644
--- a/packages/uiweb/src/lib/components/chat/helpers/getRulesToCondtionArray.ts
+++ b/packages/uiweb/src/lib/components/chat/helpers/getRulesToCondtionArray.ts
@@ -1,6 +1,5 @@
 import { ConditionArray } from '../exportedTypes';
 import * as PushAPI from '@pushprotocol/restapi';
-import { fetchERC20Info, fetchERC721nfo } from './tokenHelpers';
 
 export interface GroupRulesType {
   CHAT: ConditionArray[];
diff --git a/packages/uiweb/src/lib/components/chat/helpers/helper.ts b/packages/uiweb/src/lib/components/chat/helpers/helper.ts
index d03f7e3ac..13357ad9c 100644
--- a/packages/uiweb/src/lib/components/chat/helpers/helper.ts
+++ b/packages/uiweb/src/lib/components/chat/helpers/helper.ts
@@ -161,23 +161,63 @@ export const generateRandomNonce: () => string = () => {
 export const transformChatItems: (items: IFeeds[]) => IChatPreviewPayload[] = (items: IFeeds[]) => {
   // map but also filter to remove any duplicates which might creep in if stream sends a message
   const transformedItems: IChatPreviewPayload[] = items
-    .map((item: IFeeds) => ({
-      chatId: item.chatId,
-      chatPic: item.groupInformation ? item.groupInformation.groupImage : item.profilePicture,
-      chatParticipant: item.groupInformation ? item.groupInformation.groupName : item.did,
-      chatGroup: item.groupInformation ? true : false,
-      chatTimestamp: item.msg.timestamp,
-      chatMsg: {
-        messageType: item.msg.messageType,
-        messageContent: item.msg.messageContent,
-      },
-    }))
+    .map((item: IFeeds) => {
+      let messageType = '';
+      let messageContent = '';
+
+      // Typescript doesn't know about the messageObj property
+      // Workaround: cast to any
+      const modItem = item as any;
+
+      if (modItem.msg.messageType === 'Reply') {
+        if (typeof modItem.msg.messageObj === 'object' && !Array.isArray(modItem.msg.messageObj)) {
+          messageType = modItem.msg.messageObj.content.messageType;
+
+          if (modItem.msg.messageObj.content.messageObj) {
+            messageContent = modItem.msg.messageObj.content.messageObj.content;
+          }
+        }
+      } else if (typeof modItem.msg.messageObj === 'object' && !Array.isArray(modItem.msg.messageObj)) {
+        messageType = modItem.msg.messageType;
+        if (modItem.msg.messageObj) {
+          messageContent = modItem.msg.messageObj.content;
+        }
+      }
+
+      return {
+        chatId: item.chatId,
+        chatPic: item.groupInformation ? item.groupInformation.groupImage : item.profilePicture,
+        chatParticipant: item.groupInformation ? item.groupInformation.groupName : item.did,
+        chatGroup: item.groupInformation ? true : false,
+        chatTimestamp: item.msg.timestamp,
+        chatMsg: {
+          messageMeta: item.msg.messageType,
+          messageType: messageType,
+          messageContent: messageContent,
+        },
+      };
+    })
     .filter((item, index, self) => index === self.findIndex((t) => t.chatId === item.chatId));
 
   return transformedItems;
 };
 
 export const transformStreamToIChatPreviewPayload: (item: any) => IChatPreviewPayload = (item: any) => {
+  let messageType = '';
+  let messageContent = '';
+  let messageMeta = '';
+
+  const modItem = item as any;
+  if (modItem.message.type === 'Reply') {
+    messageMeta = modItem.message.type;
+    messageType = modItem.message.content.messageType;
+    messageContent = modItem.message.content.messageObj.content;
+  } else {
+    messageMeta = modItem.message.type;
+    messageType = modItem.message.type;
+    messageContent = modItem.message.content;
+  }
+
   // transform the item
   const transformedItem: IChatPreviewPayload = {
     chatId: item.chatId,
@@ -192,8 +232,9 @@ export const transformStreamToIChatPreviewPayload: (item: any) => IChatPreviewPa
     chatGroup: item.meta.group,
     chatTimestamp: Number(item.timestamp),
     chatMsg: {
-      messageType: item?.message?.type,
-      messageContent: item?.message?.content,
+      messageMeta: messageType,
+      messageType: messageType,
+      messageContent: messageContent,
     },
   };
 
@@ -227,6 +268,15 @@ export const transformStreamToIMessageIPFSWithCID: (item: any) => IMessageIPFSWi
   return transformedItem;
 };
 
+export const getParsedMessage = (message: string) => {
+  try {
+    return JSON.parse(message);
+  } catch (error) {
+    console.error('UIWeb::components::ChatViewBubble::ImageCard::error while parsing image', error);
+    return null;
+  }
+};
+
 export const getChatParticipantDisplayName = (derivedChatId: string, chatId: string) => {
   return derivedChatId ? getDomainIfExists(chatId) ?? derivedChatId : derivedChatId;
 };
diff --git a/packages/uiweb/src/lib/components/chat/helpers/tokenGatedGroup.ts b/packages/uiweb/src/lib/components/chat/helpers/tokenGatedGroup.ts
index aa626cb40..f9d692441 100644
--- a/packages/uiweb/src/lib/components/chat/helpers/tokenGatedGroup.ts
+++ b/packages/uiweb/src/lib/components/chat/helpers/tokenGatedGroup.ts
@@ -1,7 +1,7 @@
 import axios from 'axios';
 import { ethers } from 'ethers';
 
-import { fetchERC20Info, fetchERC721nfo } from './tokenHelpers';
+import { fetchERC20Info, fetchERC721nfo, fetchERC1155Info } from './tokenHelpers';
 import {
   CATEGORY,
   CriteriaStateType,
@@ -124,10 +124,15 @@ const validateTokenData = async (condition: Rule): Promise<CriteriaValidationErr
   if (!ethers.utils.isAddress(address)) {
     return { tokenError: `Invalid contract address` };
   }
-  const [err] =
-    condition.category === CATEGORY.ERC721
-      ? await fetchERC721nfo(address, chainId)
-      : await fetchERC20Info(address, chainId);
+
+  let err;
+  if (condition.category === CATEGORY.ERC1155) {
+    err = (await fetchERC1155Info(address, chainId, data.tokenId ?? 0))?.[0];
+  } else if (condition.category === CATEGORY.ERC721) {
+    err = (await fetchERC721nfo(address, chainId))?.[0];
+  } else {
+    err = (await fetchERC20Info(address, chainId))?.[0];
+  }
 
   if (err) {
     return { tokenError: `Invalid ${condition.category} contract` };
@@ -139,6 +144,15 @@ const validateTokenData = async (condition: Rule): Promise<CriteriaValidationErr
       return { tokenAmount: `Amount cannot be in negative` };
     }
   }
+
+  if(condition.category === CATEGORY.ERC1155) {
+    if(data.tokenId === undefined || Number.isNaN(data.tokenId)) {
+      return { tokenId: 'Invalid Token ID' };
+    } else if(data.tokenId < 0) {
+      return { tokenId: 'Token ID cannot be in negative' };
+    }
+  }
+  
   return {};
 };
 
diff --git a/packages/uiweb/src/lib/components/chat/helpers/tokenHelpers/abi.ts b/packages/uiweb/src/lib/components/chat/helpers/tokenHelpers/abi.ts
index d941608ab..56a5623b1 100644
--- a/packages/uiweb/src/lib/components/chat/helpers/tokenHelpers/abi.ts
+++ b/packages/uiweb/src/lib/components/chat/helpers/tokenHelpers/abi.ts
@@ -29,4 +29,10 @@ const TokenContractABI = [
   },
 ];
 
-export { NFTContractABI, TokenContractABI };
+const ERC1155ContractABI = [
+  'function uri(uint256 _id) external view returns (string memory)',
+  'function supportsInterface(bytes4 interfaceID) external view returns (bool)'
+];
+
+
+export { NFTContractABI, TokenContractABI, ERC1155ContractABI };
diff --git a/packages/uiweb/src/lib/components/chat/helpers/tokenHelpers/chain.ts b/packages/uiweb/src/lib/components/chat/helpers/tokenHelpers/chain.ts
index e53db5b32..377d48247 100644
--- a/packages/uiweb/src/lib/components/chat/helpers/tokenHelpers/chain.ts
+++ b/packages/uiweb/src/lib/components/chat/helpers/tokenHelpers/chain.ts
@@ -1,14 +1,13 @@
-import { InfuraAPIKey } from '../../../../config';
+import { infuraAPIKey } from '../../../../config';
 
-const getInfuraUrlFor = (network: string, key: string) =>
-  `https://${network}.infura.io/v3/${key}`;
+const getInfuraUrlFor = (network: string, key: string) => `https://${network}.infura.io/v3/${key}`;
 
 const getRpcURL = (network: string, key: string) => {
   return getInfuraUrlFor(network, key);
 };
 
 export const getChainRPC = (chainId: number): string => {
-  const key = InfuraAPIKey;
+  const key = infuraAPIKey;
 
   switch (chainId) {
     case 1:
diff --git a/packages/uiweb/src/lib/components/chat/helpers/tokenHelpers/fetch.ts b/packages/uiweb/src/lib/components/chat/helpers/tokenHelpers/fetch.ts
index 0031f06c0..7da7a73a7 100644
--- a/packages/uiweb/src/lib/components/chat/helpers/tokenHelpers/fetch.ts
+++ b/packages/uiweb/src/lib/components/chat/helpers/tokenHelpers/fetch.ts
@@ -1,7 +1,8 @@
 import { ethers } from "ethers";
 import { getChainRPC } from "./chain";
-import { NFTContractABI, TokenContractABI } from "./abi";
+import { NFTContractABI, TokenContractABI, ERC1155ContractABI } from "./abi";
 import { CATEGORY } from "../../types";
+import axios from "axios";
 
 interface ERC20InfoType {
   symbol: string;
@@ -14,7 +15,8 @@ export const tokenFetchHandler = async (
   category: string,
   chainInfo: string,
   setUnit: (value: React.SetStateAction<string>) => void,
-  setDecimals: (value: React.SetStateAction<number>) => void
+  setDecimals: (value: React.SetStateAction<number>) => void,
+  tokenId: number
 ): Promise<[boolean, string]> => {
   const isValid = ethers.utils.isAddress(contract);
 
@@ -23,7 +25,7 @@ export const tokenFetchHandler = async (
   }
 
   if (!isValid) {
-    if(category === CATEGORY.ERC20){
+    if(category === CATEGORY.ERC20 || category === CATEGORY.ERC1155){
       setUnit('TOKEN');
     }else{
       setUnit('NFT');
@@ -50,7 +52,7 @@ export const tokenFetchHandler = async (
 
       return [false, ''];
     }
-  } else {
+  } else if (category === CATEGORY.ERC721) {
     // erc 721 logic
     const [isErr, tokenInfo] = await fetchERC721nfo(contract, _chainId);
     if (isErr) {
@@ -64,6 +66,21 @@ export const tokenFetchHandler = async (
       setUnit(tokenInfo);
       return [false, ''];
     }
+  } else {
+    // erc 1155 logic
+    const [isErr, tokenInfo] = await fetchERC1155Info(contract, _chainId, tokenId);
+    if (isErr) {
+      // handle error
+      const errMessage = `${contract} is invalid ERC1155 on chain ${_chainId}`;
+      setUnit('TOKEN');
+      setDecimals(18);
+      return [true, errMessage];
+    } else {
+      // set the token info
+      setUnit(tokenInfo);
+      setDecimals(18);
+      return [false, ''];
+    }
   }
 };
 
@@ -112,3 +129,39 @@ export const fetchERC721nfo = async (
     return [true, ""];
   }
 };
+
+export const fetchERC1155Info = async (
+  contractAddress: string,
+  chainId: number,
+  tokenId: number,
+): Promise<[boolean, string]> => {
+  try {
+    const rpcURL = getChainRPC(chainId);
+    const provider = new ethers.providers.JsonRpcProvider(rpcURL);
+
+    const contract = new ethers.Contract(
+      contractAddress,
+      ERC1155ContractABI,
+      provider
+    );
+
+    const ERC1155_INTERFACE_ID = '0xd9b67a26';
+    const isERC1155 = await contract.supportsInterface(ERC1155_INTERFACE_ID);
+
+    if(isERC1155 && tokenId !== undefined) {
+      try {
+        const uri: string | undefined = await contract.uri(tokenId);
+        const uriToCall = uri?.toString().replace('{id}', tokenId.toString());
+        const response = await axios.get(uriToCall ?? '');
+        const name = response.data?.name;
+        return [false, name || 'ERC1155'];
+      } catch (error) {
+        return [false, "ERC1155"];
+      }
+    }
+
+    return [!isERC1155, "ERC1155"];
+  } catch {
+    return [true, "ERC1155"];
+  }
+};
diff --git a/packages/uiweb/src/lib/components/chat/helpers/twitter.ts b/packages/uiweb/src/lib/components/chat/helpers/twitter.ts
index 2983e1ae6..1e8a98435 100644
--- a/packages/uiweb/src/lib/components/chat/helpers/twitter.ts
+++ b/packages/uiweb/src/lib/components/chat/helpers/twitter.ts
@@ -1,30 +1,31 @@
 import { TwitterFeedReturnType } from '../exportedTypes';
 
-interface TwitterFeedProps {
-  message: string;
-}
-
-export const checkTwitterUrl = ({ message }: TwitterFeedProps): TwitterFeedReturnType => {
+export const checkTwitterUrl = (message: string): TwitterFeedReturnType => {
   let tweetId = '';
-  let messageType = '';
+  let isTweet = false;
 
   const URL_REGEX = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/)?([\w#!:.?+=&%@!-]+)/;
-  const messageContent = message?.split(' ');
+  const messageContent = typeof message === 'string' ? message.split(' ') : [];
+
+  messageContent?.forEach((message) => {
+    if (isTweet) return; // Exit the iteration if the tweet was already found
+
+    const lowerCaseMessage = message.toLowerCase();
+
+    // Check if the message contains a Twitter URL or the letter 'x'
+    if (URL_REGEX.test(message) && (lowerCaseMessage.includes('twitter') || lowerCaseMessage.includes('x'))) {
+      // Extract tweetId by splitting the URL before the '?' and then splitting by '/'
+      const urlParts = message.split('?')[0].split('/');
 
-  for (let i = 0; i < messageContent?.length; i++) {
-    if (URL_REGEX.test(messageContent[i]) && messageContent[i].toLowerCase().includes('twitter')) {
-      // Extracting tweetId
-      const wordArray = messageContent[i].split('?')[0].split('/'); // split url at '?' and take first element and split at '/'
-      if (wordArray?.length >= 6) {
-        tweetId = wordArray[wordArray?.length - 1];
-        messageType = 'TwitterFeedLink';
-        break;
+      // Ensure the URL has at least 6 parts to extract the tweetId
+      if (urlParts.length >= 6) {
+        tweetId = urlParts[urlParts.length - 1];
+        isTweet = true;
       } else {
-        messageType = 'Text';
-        break;
+        isTweet = false;
       }
     }
-  }
+  });
 
-  return { tweetId, messageType };
+  return { tweetId, isTweet };
 };
diff --git a/packages/uiweb/src/lib/components/chat/reusables/NewToast.tsx b/packages/uiweb/src/lib/components/chat/reusables/NewToast.tsx
index dad8d7552..cff9da0d6 100644
--- a/packages/uiweb/src/lib/components/chat/reusables/NewToast.tsx
+++ b/packages/uiweb/src/lib/components/chat/reusables/NewToast.tsx
@@ -210,7 +210,7 @@ const LoaderMessage = styled.div`
   font-size: 1rem;
   font-weight: 600;
   line-height: 1.3rem;
-  letter-spacing: 0em;
+  letter-spacing: normal;
   text-align: left;
 `;
 
@@ -232,9 +232,9 @@ const ToastContent = styled.div`
 const ToastTitle = styled.div`
   font-weight: 500;
   font-size: 1.125rem;
-  letter-spacing: -0.019em;
+  letter-spacing: normal;
   line-height: 1.4rem;
-  letter-spacing: 0em;
+  letter-spacing: normal;
   text-align: left;
   margin-bottom: 1%;
 `;
diff --git a/packages/uiweb/src/lib/components/chat/reusables/ProfileContainer.tsx b/packages/uiweb/src/lib/components/chat/reusables/ProfileContainer.tsx
index 167cef78d..6bfa23d04 100644
--- a/packages/uiweb/src/lib/components/chat/reusables/ProfileContainer.tsx
+++ b/packages/uiweb/src/lib/components/chat/reusables/ProfileContainer.tsx
@@ -105,7 +105,7 @@ export const ProfileContainer = ({ theme, member, copy, customStyle, loading }:
         <>
           {member?.name || member?.web3Name ? (
             <Span
-              fontSize={customStyle?.fontSize ?? '18px'}
+              fontSize={customStyle?.fontSize ?? '16px'}
               fontWeight={customStyle?.fontWeight ?? '400'}
               color={customStyle?.textColor ?? theme.textColor?.modalSubHeadingText}
               position="relative"
@@ -135,7 +135,7 @@ export const ProfileContainer = ({ theme, member, copy, customStyle, loading }:
               animation={theme.skeletonBG}
             >
               <RecipientSpan
-                fontSize={member?.name || member?.web3Name ? '14px' : customStyle?.fontSize ?? '18px'}
+                fontSize={member?.name || member?.web3Name ? '14px' : customStyle?.fontSize ?? '16px'}
                 fontWeight={member?.name || member?.web3Name ? '500' : customStyle?.fontWeight ?? '400'}
                 color={
                   member?.name || member?.web3Name
diff --git a/packages/uiweb/src/lib/components/chat/reusables/TextInput.tsx b/packages/uiweb/src/lib/components/chat/reusables/TextInput.tsx
index 8543214f0..a0e02a380 100644
--- a/packages/uiweb/src/lib/components/chat/reusables/TextInput.tsx
+++ b/packages/uiweb/src/lib/components/chat/reusables/TextInput.tsx
@@ -12,7 +12,7 @@ export interface ITextInputProps {
   onInputChange?: any;
   disabled?: boolean;
   customStyle?: CustomStyleParamsType;
-  error?:boolean;
+  error?: boolean;
 }
 type CustomStyleParamsType = {
   background?: string;
@@ -73,19 +73,17 @@ const LabelContainer = styled.div`
   justify-content: space-between;
 
   font-weight: 500;
-  font-size: 16px;
+  font-size: 14px;
   color: ${(props) => props.theme.textColor?.modalHeadingText ?? '#000'};
 `;
 
-const Input = styled.input<IChatTheme & {customStyle:CustomStyleParamsType,error:boolean}>`
+const Input = styled.input<IChatTheme & { customStyle: CustomStyleParamsType; error: boolean }>`
   padding: 16px;
   margin-top: 8px;
   color: ${(props) => props.theme.textColor?.modalHeadingText ?? '#000'};
   background: ${(props) =>
-    props.customStyle?.background
-      ? props.customStyle.background
-      : props.theme.backgroundColor.modalInputBackground};
-  border: ${(props) => props.error?' 1px solid #ED5858':props.theme.border.modalInnerComponents};
+    props.customStyle?.background ? props.customStyle.background : props.theme.backgroundColor.modalInputBackground};
+  border: ${(props) => (props.error ? ' 1px solid #ED5858' : props.theme.border.modalInnerComponents)};
   border-radius: ${(props) => props.theme.borderRadius.modalInnerComponents};
 
   font-family: ${(props) => props.theme.fontFamily};
@@ -98,7 +96,6 @@ const Input = styled.input<IChatTheme & {customStyle:CustomStyleParamsType,error
   &:focus {
     border: 1px solid #ffdbf0;
   }
- 
 `;
 
 const CharCounter = styled.div<IChatTheme>`
diff --git a/packages/uiweb/src/lib/components/chat/theme/index.ts b/packages/uiweb/src/lib/components/chat/theme/index.ts
index 367d8a51f..36d8417da 100644
--- a/packages/uiweb/src/lib/components/chat/theme/index.ts
+++ b/packages/uiweb/src/lib/components/chat/theme/index.ts
@@ -1,8 +1,8 @@
 /**
  * @file theme file: all the predefined themes are defined here
  */
+import styled, { css, keyframes } from 'styled-components';
 import { CHAT_THEME_OPTIONS } from '../exportedTypes';
-import styled, { keyframes, css } from 'styled-components';
 // bgColorPrimary: "#fff",
 //   bgColorSecondary: "#D53A94",
 //   textColorPrimary: "#1e1e1e",
@@ -39,6 +39,8 @@ interface IBorderRadius {
   userProfile?: string;
   chatWidget?: string;
   chatBubbleBorderRadius?: string;
+  chatBubbleContentBorderRadius?: string;
+  chatBubbleReplyBorderRadius?: string;
   reactionsPickerBorderRadius?: string;
   reactionsBorderRadius?: string;
 }
@@ -52,6 +54,8 @@ interface IPadding {
   messageInputPadding?: string;
   chatBubbleSenderPadding?: string;
   chatBubbleReceiverPadding?: string;
+  chatBubbleContentPadding?: string;
+  chatBubbleInnerContentPadding?: string;
   reactionsPickerPadding?: string;
   reactionsPadding?: string;
 }
@@ -65,6 +69,8 @@ interface IMargin {
   messageInputMargin?: string;
   chatBubbleSenderMargin?: string;
   chatBubbleReceiverMargin?: string;
+  chatBubbleContentMargin?: string;
+  chatBubbleReplyMargin?: string;
 }
 
 interface IBackgroundColor {
@@ -75,6 +81,13 @@ interface IBackgroundColor {
   messageInputBackground?: string;
   chatSentBubbleBackground?: string;
   chatReceivedBubbleBackground?: string;
+  chatPreviewSentBubbleBackground?: string;
+  chatPreviewSentBorderBubbleBackground?: string;
+  chatPreviewRecievedBubbleBackground?: string;
+  chatPreviewRecievedBorderBubbleBackground?: string;
+  chatActivePreviewBubbleBackground?: string;
+  chatActivePreviewBorderBubbleBackground?: string;
+  chatPreviewTagBackground?: string;
   chatFrameBackground?: string;
   encryptionMessageBackground?: string;
   buttonBackground?: string;
@@ -217,12 +230,12 @@ const darkSkeletonLoading = keyframes`
 const animation = () =>
   css`
     ${lightSkeletonLoading} 1s linear infinite alternate;
-`;
+  `;
 
 const darkAnimation = () =>
   css`
     ${darkSkeletonLoading} 1s linear infinite alternate;
-`;
+  `;
 
 //dark theme object
 export const lightChatTheme: IChatTheme = {
@@ -237,6 +250,8 @@ export const lightChatTheme: IChatTheme = {
     userProfile: '0px',
     chatWidget: '24px',
     chatBubbleBorderRadius: '12px',
+    chatBubbleContentBorderRadius: '8px',
+    chatBubbleReplyBorderRadius: '12px',
     reactionsPickerBorderRadius: '12px',
     reactionsBorderRadius: '24px',
   },
@@ -250,6 +265,8 @@ export const lightChatTheme: IChatTheme = {
     messageInputPadding: '0px',
     chatBubbleSenderPadding: '0px',
     chatBubbleReceiverPadding: '0px',
+    chatBubbleContentPadding: '8px 16px',
+    chatBubbleInnerContentPadding: '8px 12px',
     reactionsPickerPadding: '4px',
     reactionsPadding: '4px 8px',
   },
@@ -263,6 +280,8 @@ export const lightChatTheme: IChatTheme = {
     messageInputMargin: '2px 10px 10px 10px',
     chatBubbleSenderMargin: '16px 8px',
     chatBubbleReceiverMargin: '16px 8px',
+    chatBubbleContentMargin: '8px',
+    chatBubbleReplyMargin: '8px 8px 0px 8px',
   },
 
   backgroundColor: {
@@ -274,6 +293,13 @@ export const lightChatTheme: IChatTheme = {
     messageInputBackground: '#fff',
     chatSentBubbleBackground: 'rgb(202, 89, 155)',
     chatReceivedBubbleBackground: '#fff',
+    chatPreviewSentBubbleBackground: 'rgba(255, 255, 255, 0.1)',
+    chatPreviewSentBorderBubbleBackground: 'rgba(255, 255, 255, 0.5)',
+    chatPreviewRecievedBubbleBackground: 'rgba(0, 0, 0, 0.1)',
+    chatPreviewRecievedBorderBubbleBackground: 'rgba(0, 0, 0, 0.5)',
+    chatActivePreviewBubbleBackground: '#22222210',
+    chatActivePreviewBorderBubbleBackground: '#22222299',
+    chatPreviewTagBackground: 'rgba(0, 0, 0, 0.25)',
     chatFrameBackground: '#f5f5f5',
     encryptionMessageBackground: '#fff',
     buttonBackground: 'rgb(202, 89, 155)',
@@ -300,20 +326,20 @@ export const lightChatTheme: IChatTheme = {
   fontSize: {
     chatProfileText: '17px',
     messageInputText: '16px',
-    chatSentBubbleText: '16px',
-    chatReceivedBubbleText: '16px',
+    chatSentBubbleText: '14px',
+    chatReceivedBubbleText: '14px',
     timestamp: '12px',
     encryptionMessageText: '13px',
-    chatReceivedBubbleAddressText: '16px',
-    chatReceivedBubbleTimestampText: '12px',
-    chatSentBubbleTimestampText: '12px',
+    chatReceivedBubbleAddressText: '12px',
+    chatReceivedBubbleTimestampText: '10px',
+    chatSentBubbleTimestampText: '10px',
     searchInputText: '16px',
     searchPlaceholderText: '16px',
-    chatPreviewParticipantText: '16px',
+    chatPreviewParticipantText: '14px',
     chatPreviewMessageText: '14px',
     chatPreviewDateText: '12px',
     chatPreviewBadgeText: '12px',
-    userProfileText: '18px',
+    userProfileText: '16px',
     chatFrameTitleText: '16px',
     chatFrameDescriptionText: '14px',
   },
@@ -325,7 +351,7 @@ export const lightChatTheme: IChatTheme = {
     chatReceivedBubbleText: '400',
     timestamp: '400',
     encryptionMessageText: '400',
-    chatReceivedBubbleAddressText: '300',
+    chatReceivedBubbleAddressText: '500',
     chatReceivedBubbleTimestampText: '400',
     chatSentBubbleTimestampText: '400',
     searchInputText: '400',
@@ -397,7 +423,7 @@ export const lightChatTheme: IChatTheme = {
   backdropFilter: 'none',
   spinnerColor: 'rgb(202, 89, 155)',
   scrollbarColor: 'rgb(202, 89, 155)',
-  skeletonBG: animation
+  skeletonBG: animation,
 };
 
 export const darkChatTheme: IChatTheme = {
@@ -412,6 +438,8 @@ export const darkChatTheme: IChatTheme = {
     userProfile: '0px',
     chatWidget: '24px',
     chatBubbleBorderRadius: '12px',
+    chatBubbleContentBorderRadius: '8px',
+    chatBubbleReplyBorderRadius: '8px',
     reactionsPickerBorderRadius: '12px',
     reactionsBorderRadius: '24px',
   },
@@ -425,6 +453,8 @@ export const darkChatTheme: IChatTheme = {
     messageInputPadding: '0px',
     chatBubbleSenderPadding: '0px',
     chatBubbleReceiverPadding: '0px',
+    chatBubbleContentPadding: '8px 16px',
+    chatBubbleInnerContentPadding: '8px 12px',
     reactionsPickerPadding: '4px',
     reactionsPadding: '4px 8px',
   },
@@ -438,6 +468,8 @@ export const darkChatTheme: IChatTheme = {
     messageInputMargin: '2px 10px 10px 10px',
     chatBubbleSenderMargin: '16px 8px',
     chatBubbleReceiverMargin: '16px 8px',
+    chatBubbleContentMargin: '8px',
+    chatBubbleReplyMargin: '8px',
   },
 
   backgroundColor: {
@@ -449,13 +481,20 @@ export const darkChatTheme: IChatTheme = {
     messageInputBackground: 'rgb(64, 70, 80)',
     chatSentBubbleBackground: 'rgb(202, 89, 155)',
     chatReceivedBubbleBackground: 'rgb(64, 70, 80)',
+    chatPreviewSentBubbleBackground: 'rgba(255, 255, 255, 0.1)',
+    chatPreviewSentBorderBubbleBackground: 'rgba(255, 255, 255, 0.5)',
+    chatPreviewRecievedBubbleBackground: 'rgba(0, 0, 0, 0.1)',
+    chatPreviewRecievedBorderBubbleBackground: 'rgba(0, 0, 0, 0.5)',
+    chatActivePreviewBubbleBackground: '#ffffff10',
+    chatActivePreviewBorderBubbleBackground: '#ffffff99',
+    chatPreviewTagBackground: 'rgba(255, 255, 255, 0.25)',
     chatFrameBackground: '#343536',
     encryptionMessageBackground: 'rgb(64, 70, 80)',
     buttonBackground: 'rgb(202, 89, 155)',
     buttonHotBackground: '#D53A94',
     searchInputBackground: 'rgb(64,70,80)',
-    modalBackground: 'rgb(47, 49, 55)',
-    criteriaLabelBackground: 'rgb(47, 49, 55)',
+    modalBackground: '#202124',
+    criteriaLabelBackground: '#202124',
     modalInputBackground: 'transparent',
     modalHoverBackground: 'rgb(64, 70, 80)',
     buttonDisableBackground: '#787E99',
@@ -463,32 +502,31 @@ export const darkChatTheme: IChatTheme = {
     toastErrorBackground: 'linear-gradient(89.96deg, #FF2070 -101.85%, #2F3137 51.33%)',
     toastWarningBackground: 'linear-gradient(90.15deg, #FFB800 -125.65%, #FFB800 -125.63%, #FFF9FB 42.81%)',
     toastShadowBackground: '#00000010',
-    chatPreviewBackground: 'rgb(47, 49, 55)',
+    chatPreviewBackground: '#202124',
     chatPreviewSelectedBackground: 'rgb(64, 70, 80)',
     chatPreviewBadgeBackground: 'rgb(226,8,128)',
     chatPreviewHoverBackground: 'rgb(64, 70, 80)',
-    userProfileBackground: 'rgb(47, 49, 55)',
-
-    chatWidgetModalBackground: 'rgb(47, 49, 55)',
+    userProfileBackground: '#202124',
+    chatWidgetModalBackground: '#202124',
   },
 
   fontSize: {
     chatProfileText: '17px',
     messageInputText: '16px',
-    chatSentBubbleText: '16px',
-    chatReceivedBubbleText: '16px',
+    chatSentBubbleText: '14px',
+    chatReceivedBubbleText: '14px',
     timestamp: '12px',
     encryptionMessageText: '13px',
-    chatReceivedBubbleAddressText: '16px',
-    chatReceivedBubbleTimestampText: '12px',
-    chatSentBubbleTimestampText: '12px',
+    chatReceivedBubbleAddressText: '12px',
+    chatReceivedBubbleTimestampText: '10px',
+    chatSentBubbleTimestampText: '10px',
     searchInputText: '16px',
     searchPlaceholderText: '16px',
-    chatPreviewParticipantText: '16px',
+    chatPreviewParticipantText: '14px',
     chatPreviewMessageText: '14px',
     chatPreviewDateText: '12px',
     chatPreviewBadgeText: '12px',
-    userProfileText: '18px',
+    userProfileText: '16px',
     chatFrameTitleText: '16px',
     chatFrameDescriptionText: '14px',
   },
@@ -500,7 +538,7 @@ export const darkChatTheme: IChatTheme = {
     chatReceivedBubbleText: '400',
     timestamp: '400',
     encryptionMessageText: '400',
-    chatReceivedBubbleAddressText: '300',
+    chatReceivedBubbleAddressText: '500',
     chatReceivedBubbleTimestampText: '400',
     chatSentBubbleTimestampText: '400',
     searchInputText: '400',
@@ -571,5 +609,5 @@ export const darkChatTheme: IChatTheme = {
   backdropFilter: 'none',
   spinnerColor: 'rgb(202, 89, 155)',
   scrollbarColor: 'rgb(202, 89, 155)',
-  skeletonBG: darkAnimation
+  skeletonBG: darkAnimation,
 };
diff --git a/packages/uiweb/src/lib/components/chat/types/index.ts b/packages/uiweb/src/lib/components/chat/types/index.ts
index bee046a06..2300697f0 100644
--- a/packages/uiweb/src/lib/components/chat/types/index.ts
+++ b/packages/uiweb/src/lib/components/chat/types/index.ts
@@ -42,6 +42,7 @@ export type TypeKeys = typeof TYPE[keyof typeof TYPE];
 export const CATEGORY = {
   ERC20: 'ERC20',
   ERC721: 'ERC721',
+  ERC1155: 'ERC1155',
   INVITE: 'INVITE',
   CustomEndpoint: 'CustomEndpoint',
   ROLES: 'ROLES',
@@ -50,6 +51,7 @@ export const CATEGORY = {
 export const UNIT = {
   ERC20: 'TOKEN',
   ERC721: 'NFT',
+  ERC1155: 'TOKEN',
 } as const;
 export type UnitKeys = typeof UNIT[keyof typeof UNIT];
 export const SUBCATEGORY = {
@@ -89,6 +91,7 @@ export type TokenNftComparision = keyof typeof TOKEN_NFT_COMPARISION;
 export const CRITERIA_TYPE = {
   ERC20: 'Token',
   ERC721: 'NFT',
+  ERC1155: 'Token',
   INVITE: 'Invite',
   CustomEndpoint: 'URL',
   ROLES: 'Guild ID',
diff --git a/packages/uiweb/src/lib/components/chat/types/tokenGatedGroupCreationType.ts b/packages/uiweb/src/lib/components/chat/types/tokenGatedGroupCreationType.ts
index 4a91e8ec4..6e1aa6050 100644
--- a/packages/uiweb/src/lib/components/chat/types/tokenGatedGroupCreationType.ts
+++ b/packages/uiweb/src/lib/components/chat/types/tokenGatedGroupCreationType.ts
@@ -6,6 +6,7 @@ export interface PushData {
   comparison?:string;
   url?: string;
   token?:string;
+  tokenId?:number;
 }
 
 export interface GuildData {
@@ -87,6 +88,7 @@ export type CriteriaValidationErrorType = {
   //token error
   tokenError?:string
   tokenAmount?:string;
+  tokenId?:string;
   //custom endpoint errors
   url?:string;
 }
diff --git a/packages/uiweb/src/lib/components/chatAndNotification/MinimisedModalHeader.tsx b/packages/uiweb/src/lib/components/chatAndNotification/MinimisedModalHeader.tsx
index abb71f61c..627a4b56b 100644
--- a/packages/uiweb/src/lib/components/chatAndNotification/MinimisedModalHeader.tsx
+++ b/packages/uiweb/src/lib/components/chatAndNotification/MinimisedModalHeader.tsx
@@ -13,14 +13,13 @@ import {
 } from '../../context';
 import type { PushSubTabs, PushTabs } from '../../types';
 import { PUSH_SUB_TABS, PUSH_TABS } from '../../types';
-import { useResolveWeb3Name } from '../../hooks';
 import { pCAIP10ToWallet, shortenText } from '../../helpers';
-import { ethers } from 'ethers';
 import { PushSubTabTitle } from '../../config';
 import { Tooltip } from '../reusables';
 import type { ChatAndNotificationMainContextType } from '../../context/chatAndNotification/chatAndNotificationMainContext';
 import type { ChatMainStateContextType } from '../../context/chatAndNotification/chat/chatMainStateContext';
 import { ChatSnap } from './modal/sidebar/chatSidebar/ChatSnap';
+import { useDomianName } from '../../hooks';
 
 type MinimisedModalHeaderPropType = {
   onMaximizeMinimizeToggle: () => void;
@@ -52,39 +51,22 @@ export const UnreadChats = ({
 
 export const MessageBoxHeader = () => {
   const { activeTab, setActiveTab, setActiveSubTab, activeSubTab } =
-    useContext<ChatAndNotificationMainContextType>(
-      ChatAndNotificationMainContext
-    );
-  const {
-    selectedChatId,
-    chatsFeed,
-    requestsFeed,
-    web3NameList,
-    searchedChats,
-    setSearchedChats,
-    setSelectedChatId,
-  } = useContext<ChatMainStateContextType>(ChatMainStateContext);
+    useContext<ChatAndNotificationMainContextType>(ChatAndNotificationMainContext);
+  const { selectedChatId, chatsFeed, requestsFeed, searchedChats, setSearchedChats, setSelectedChatId } =
+    useContext<ChatMainStateContextType>(ChatMainStateContext);
   const { env } = useContext<any>(ChatAndNotificationPropsContext);
   const { spamNotifsFeed } = useContext<any>(NotificationMainStateContext);
   const selectedChat =
     chatsFeed[selectedChatId as string] ||
     requestsFeed[selectedChatId as string] ||
-    (Object.keys(searchedChats || {}).length
-      ? searchedChats![selectedChatId as string]
-      : null);
-  useResolveWeb3Name(selectedChat?.did, env);
-  const walletLowercase = pCAIP10ToWallet(selectedChat?.did)?.toLowerCase();
-  const checksumWallet = walletLowercase
-    ? ethers.utils.getAddress(walletLowercase)
-    : null;
-  const web3Name = checksumWallet ? web3NameList[checksumWallet.toLowerCase()] : null;
+    (Object.keys(searchedChats || {}).length ? searchedChats![selectedChatId as string] : null);
+  const web3Name = useDomianName(selectedChat?.did, env);
+
   const handleBack = () => {
     if (
       activeSubTab &&
-      ((activeSubTab === PUSH_SUB_TABS.REQUESTS &&
-        Object.keys(requestsFeed || {}).length) ||
-        (activeSubTab === PUSH_SUB_TABS.SPAM &&
-          Object.keys(spamNotifsFeed || {}).length))
+      ((activeSubTab === PUSH_SUB_TABS.REQUESTS && Object.keys(requestsFeed || {}).length) ||
+        (activeSubTab === PUSH_SUB_TABS.SPAM && Object.keys(spamNotifsFeed || {}).length))
     ) {
       setActiveSubTab(PUSH_SUB_TABS[activeSubTab as PushSubTabs]);
     } else {
@@ -96,8 +78,11 @@ export const MessageBoxHeader = () => {
       setSearchedChats(null);
     }
   };
+
   return selectedChat ? (
-    <Section gap="12px"  padding='23px 2px'
+    <Section
+      gap="12px"
+      padding="23px 2px"
     >
       <Div
         width="16px"
@@ -120,7 +105,11 @@ export const MessageBoxHeader = () => {
           content={pCAIP10ToWallet(selectedChat?.did)}
           direction="bottom-right"
         >
-          <Span fontWeight="700" fontSize="16px" cursor="pointer">
+          <Span
+            fontWeight="700"
+            fontSize="16px"
+            cursor="pointer"
+          >
             {' '}
             {selectedChat?.name
               ? shortenText(selectedChat?.name, 30)
@@ -134,16 +123,14 @@ export const MessageBoxHeader = () => {
 
 export const SubTabHeader = () => {
   const { activeTab, setActiveTab, activeSubTab } =
-    useContext<ChatAndNotificationMainContextType>(
-      ChatAndNotificationMainContext
-    );
-  const { setSearchedChats, setSelectedChatId } =
-    useContext<ChatMainStateContextType>(ChatMainStateContext);
-  const { setSearchedNotifications } = useContext<any>(
-    NotificationMainStateContext
-  );
+    useContext<ChatAndNotificationMainContextType>(ChatAndNotificationMainContext);
+  const { setSearchedChats, setSelectedChatId } = useContext<ChatMainStateContextType>(ChatMainStateContext);
+  const { setSearchedNotifications } = useContext<any>(NotificationMainStateContext);
   return (
-    <Section gap="12px" padding='23px 2px'>
+    <Section
+      gap="12px"
+      padding="23px 2px"
+    >
       <Div
         width="16px"
         height="16px"
@@ -162,7 +149,10 @@ export const SubTabHeader = () => {
         <BackIcon />
       </Div>
 
-      <Span fontWeight="700" fontSize="16px">
+      <Span
+        fontWeight="700"
+        fontSize="16px"
+      >
         {PushSubTabTitle[activeSubTab as PushSubTabs].title}
       </Span>
     </Section>
@@ -174,26 +164,16 @@ export const MinimisedModalHeader: React.FC<MinimisedModalHeaderPropType> = ({
   modalOpen,
 }) => {
   const { newChat, setNewChat, setActiveTab, activeSubTab } =
-    useContext<ChatAndNotificationMainContextType>(
-      ChatAndNotificationMainContext
-    );
+    useContext<ChatAndNotificationMainContextType>(ChatAndNotificationMainContext);
 
-  const {
-    selectedChatId,
-    chatsFeed,
-    requestsFeed,
-    setSearchedChats,
-    setSelectedChatId,
-    searchedChats,
-  } = useContext<ChatMainStateContextType>(ChatMainStateContext);
+  const { selectedChatId, chatsFeed, requestsFeed, setSearchedChats, setSelectedChatId, searchedChats } =
+    useContext<ChatMainStateContextType>(ChatMainStateContext);
 
   const SnapMessageHeader = () => {
     const selectedChat =
-    chatsFeed[selectedChatId as string] ||
-    requestsFeed[selectedChatId as string] ||
-    (Object.keys(searchedChats || {}).length
-      ? searchedChats![selectedChatId as string]
-      : null);
+      chatsFeed[selectedChatId as string] ||
+      requestsFeed[selectedChatId as string] ||
+      (Object.keys(searchedChats || {}).length ? searchedChats![selectedChatId as string] : null);
     return (
       <ChatSnap
         chat={selectedChat}
@@ -203,11 +183,8 @@ export const MinimisedModalHeader: React.FC<MinimisedModalHeaderPropType> = ({
     );
   };
 
-  const condition =
-    (selectedChatId && modalOpen) ||
-    (!selectedChatId && modalOpen && activeSubTab);
-  const snapCondition = 
-    (selectedChatId && !modalOpen);
+  const condition = (selectedChatId && modalOpen) || (!selectedChatId && modalOpen && activeSubTab);
+  const snapCondition = selectedChatId && !modalOpen;
   return (
     <Container
       justifyContent="space-between"
@@ -215,8 +192,7 @@ export const MinimisedModalHeader: React.FC<MinimisedModalHeaderPropType> = ({
       padding={`${snapCondition ? '12px' : '0'} 0 `}
       borderWidth={`0 0 ${condition ? '1px' : '0'} 0 `}
       borderStyle={`none none ${condition ? 'dashed' : 'none'} none `}
-      borderColor={`transparent transparent ${condition ? '#ededee' : 'transparent'
-        }  transparent`}
+      borderColor={`transparent transparent ${condition ? '#ededee' : 'transparent'}  transparent`}
     >
       {selectedChatId &&
         !!(
@@ -229,13 +205,12 @@ export const MinimisedModalHeader: React.FC<MinimisedModalHeaderPropType> = ({
       {selectedChatId && !modalOpen && <SnapMessageHeader />}
 
       {!selectedChatId && modalOpen && activeSubTab && <SubTabHeader />}
-      {((!selectedChatId && modalOpen && !activeSubTab) ||
-        (!modalOpen && !selectedChatId)) && (
+      {((!selectedChatId && modalOpen && !activeSubTab) || (!modalOpen && !selectedChatId)) && (
         <Section gap="4px">
           <Span
             fontWeight="700"
             fontSize="18px"
-            padding='24px 2px'
+            padding="24px 2px"
             cursor={!modalOpen ? 'default' : 'pointer'}
             onClick={() => {
               setActiveTab(PUSH_TABS.CHATS);
@@ -251,8 +226,7 @@ export const MinimisedModalHeader: React.FC<MinimisedModalHeaderPropType> = ({
         </Section>
       )}
       <Section gap="20px">
-        {((!selectedChatId && modalOpen && !activeSubTab && !newChat) ||
-          (!modalOpen && !selectedChatId)) && (
+        {((!selectedChatId && modalOpen && !activeSubTab && !newChat) || (!modalOpen && !selectedChatId)) && (
           <Div
             width="20px"
             height="20px"
@@ -272,7 +246,7 @@ export const MinimisedModalHeader: React.FC<MinimisedModalHeaderPropType> = ({
           cursor="pointer"
           // alignSelf={selectedChatId && !modalOpen ? 'center' : 'baseline'}
           margin="0 0 10px 0"
-          alignSelf='center'
+          alignSelf="center"
           onClick={onMaximizeMinimizeToggle}
         >
           {modalOpen ? <MinimizeIcon /> : <MaximizeIcon />}
@@ -286,5 +260,3 @@ export const MinimisedModalHeader: React.FC<MinimisedModalHeaderPropType> = ({
 const Container = styled(Section)`
   box-sizing: border-box;
 `;
-
-
diff --git a/packages/uiweb/src/lib/components/chatAndNotification/modal/sidebar/chatSidebar/ChatSnap.tsx b/packages/uiweb/src/lib/components/chatAndNotification/modal/sidebar/chatSidebar/ChatSnap.tsx
index a5b285906..9b7a115bd 100644
--- a/packages/uiweb/src/lib/components/chatAndNotification/modal/sidebar/chatSidebar/ChatSnap.tsx
+++ b/packages/uiweb/src/lib/components/chatAndNotification/modal/sidebar/chatSidebar/ChatSnap.tsx
@@ -1,24 +1,13 @@
 import type { IFeeds } from '@pushprotocol/restapi';
-import {
-  ChatMainStateContext,
-  ChatAndNotificationPropsContext,
-} from '../../../../../context';
-import {
-  checkIfUnread,
-  dateToFromNowDaily,
-  setData,
-  shortenText,
-} from '../../../../../helpers';
+import { ChatMainStateContext, ChatAndNotificationPropsContext } from '../../../../../context';
+import { checkIfUnread, dateToFromNowDaily, setData, shortenText } from '../../../../../helpers';
 import React, { useContext } from 'react';
 import styled, { css } from 'styled-components';
 import { Section, Span, Image } from '../../../../reusables/sharedStyling';
 import { UnreadChats } from '../../../MinimisedModalHeader';
-import { pCAIP10ToWallet } from '../../../../../helpers';
-import { ethers } from 'ethers';
-import { useResolveWeb3Name } from '../../../../../hooks';
 import { device } from '../../../../../config';
 import type { ChatMainStateContextType } from '../../../../../context/chatAndNotification/chat/chatMainStateContext';
-import { useDeviceWidthCheck } from '../../../../../hooks';
+import { useDeviceWidthCheck, useDomianName } from '../../../../../hooks';
 
 type ChatSnapPropType = {
   chat: IFeeds;
@@ -27,13 +16,7 @@ type ChatSnapPropType = {
 };
 
 //fix messageType type
-const Message = ({
-  messageContent,
-  messageType,
-}: {
-  messageContent: string;
-  messageType: string;
-}) => {
+const Message = ({ messageContent, messageType }: { messageContent: string; messageType: string }) => {
   const isMobile = useDeviceWidthCheck(425);
   const digitsToDisplay = isMobile ? 27 : 48;
   return messageType === 'Text' ? (
@@ -54,7 +37,11 @@ const Message = ({
       color="#62626A"
       cursor="pointer"
     >
-      <i className="fa fa-picture-o" aria-hidden="true"></i> Image
+      <i
+        className="fa fa-picture-o"
+        aria-hidden="true"
+      ></i>{' '}
+      Image
     </Span>
   ) : messageType === 'File' ? (
     <Span
@@ -64,7 +51,11 @@ const Message = ({
       color="#62626A"
       cursor="pointer"
     >
-      <i className="fa fa-file" aria-hidden="true"></i> File
+      <i
+        className="fa fa-file"
+        aria-hidden="true"
+      ></i>{' '}
+      File
     </Span>
   ) : messageType === 'GIF' || messageType === 'MediaEmbed' ? (
     <Span
@@ -74,37 +65,28 @@ const Message = ({
       color="#62626A"
       cursor="pointer"
     >
-      <i className="fa fa-picture-o" aria-hidden="true"></i> Media
+      <i
+        className="fa fa-picture-o"
+        aria-hidden="true"
+      ></i>{' '}
+      Media
     </Span>
   ) : null;
 };
 
-export const ChatSnap: React.FC<ChatSnapPropType> = ({
-  chat,
-  id,
-  modalOpen,
-}) => {
-  const { setSelectedChatId, web3NameList } =
-    useContext<ChatMainStateContextType>(ChatMainStateContext);
+export const ChatSnap: React.FC<ChatSnapPropType> = ({ chat, id, modalOpen }) => {
+  const { setSelectedChatId } = useContext<ChatMainStateContextType>(ChatMainStateContext);
   const { env } = useContext<any>(ChatAndNotificationPropsContext);
-
+  const web3Name = useDomianName(chat?.did, env);
   const isMobile = useDeviceWidthCheck(425);
   const digitsToDisplay = chat?.name ? (isMobile ? 15 : 30) : isMobile ? 6 : 8;
 
-  useResolveWeb3Name(chat?.did, env);
-  //shift to helper
-  const walletLowercase = pCAIP10ToWallet(chat?.did)?.toLowerCase();
-  const checksumWallet = walletLowercase
-    ? ethers.utils.getAddress(walletLowercase)
-    : null;
-  const web3Name = checksumWallet
-    ? web3NameList[checksumWallet.toLowerCase()]
-    : null;
   const handleOnClick = () => {
     setSelectedChatId(id);
     setData({ chatId: id, value: chat });
   };
   const open = modalOpen === undefined ? true : modalOpen;
+
   return (
     <Container
       justifyContent="flex-start"
@@ -122,44 +104,52 @@ export const ChatSnap: React.FC<ChatSnapPropType> = ({
         borderRadius="100%"
         cursor="pointer"
       />
-      <Section flexDirection="column" flex="2">
+      <Section
+        flexDirection="column"
+        flex="2"
+      >
         <Section
           gap={open ? '8px' : ' 2px '}
           justifyContent="space-between"
           cursor="pointer"
         >
-          <NameSpan fontWeight="700" color="#000" cursor="pointer">
+          <NameSpan
+            fontWeight="700"
+            color="#000"
+            cursor="pointer"
+          >
             {chat?.name
               ? shortenText(chat?.name, digitsToDisplay, false)
-              : web3Name ??
-                shortenText(chat?.did?.split(':')[1], digitsToDisplay, true)}
+              : web3Name ?? shortenText(chat?.did?.split(':')[1], digitsToDisplay, true)}
           </NameSpan>
-         {open &&  <Span
-            fontWeight="400"
-            fontSize="12px"
-            color="#62626A"
-            cursor="pointer"
-          >
-            {chat?.msg?.timestamp
-              ? dateToFromNowDaily(chat?.msg?.timestamp as number)
-              : ''}
-          </Span>}
+          {open && (
+            <Span
+              fontWeight="400"
+              fontSize="12px"
+              color="#62626A"
+              cursor="pointer"
+            >
+              {chat?.msg?.timestamp ? dateToFromNowDaily(chat?.msg?.timestamp as number) : ''}
+            </Span>
+          )}
         </Section>
 
-        
-          <Section gap="12px" cursor="pointer" justifyContent="space-between">
-            <Message
-              messageContent={chat?.msg?.messageContent}
-              messageType={chat?.msg?.messageType}
-            />
+        <Section
+          gap="12px"
+          cursor="pointer"
+          justifyContent="space-between"
+        >
+          <Message
+            messageContent={chat?.msg?.messageContent}
+            messageType={chat?.msg?.messageType}
+          />
 
-           {open && checkIfUnread(id, chat) && (
-              <UnreadChats
-              //  numberOfUnreadMessages="3"
-              />
-            )}
-          </Section>
-        
+          {open && checkIfUnread(id, chat) && (
+            <UnreadChats
+            //  numberOfUnreadMessages="3"
+            />
+          )}
+        </Section>
       </Section>
     </Container>
   );
diff --git a/packages/uiweb/src/lib/components/notification/index.tsx b/packages/uiweb/src/lib/components/notification/index.tsx
index 02a010ef0..17fe99109 100644
--- a/packages/uiweb/src/lib/components/notification/index.tsx
+++ b/packages/uiweb/src/lib/components/notification/index.tsx
@@ -3,19 +3,19 @@ import * as React from 'react';
 import styled, { css } from 'styled-components';
 
 import { MediaHelper, convertTimeStamp, extractTimeStamp } from '../../utilities';
-import IPFSIcon from '../ipfsicon';
 import Loader from '../loader/loader';
 import ImageOverlayComponent from '../overlay';
 import { ParseMarkdownText } from '../parsetext';
 import chainDetails from './chainDetails';
 import { DecryptButton, useDecrypt } from './decrypt';
-import ActionButton from './styled/ActionButton';
 
 import { useDivOffsetWidth } from '../../hooks';
 import { LinkIcon } from '../../icons/Link';
 
 import type { INotificationItemTheme } from './theme';
 import { getCustomTheme } from './theme';
+import { Button } from '../reusables';
+import { CloseIcon } from '../../icons/Close';
 export {
   baseTheme as notificationBaseTheme,
   darkTheme as notificationDarkTheme,
@@ -54,10 +54,12 @@ export type NotificationItemProps = {
   notificationBody: string | undefined;
   cta: string | undefined;
   app: string | undefined;
+  isToast?: boolean;
   icon: string | undefined;
   image: string | undefined;
   url: string | undefined;
   isSpam?: boolean;
+  onClose?: () => void;
   subscribeFn?: () => Promise<unknown>;
   isSubscribedFn?: () => Promise<unknown>;
   theme?: string | undefined;
@@ -79,6 +81,10 @@ type OffsetWidthType = {
   offsetWidth: number;
 };
 
+type FontSizeType = {
+  fontSize: string;
+};
+
 type CustomThemeProps = {
   themeObject: INotificationItemTheme;
 };
@@ -100,6 +106,7 @@ export const NotificationItem: React.FC<NotificationItemProps> = ({
   app,
   icon,
   image,
+  isToast = false,
   url,
   isSpam, //for rendering the spam conterpart of the notification component
   isSubscribedFn, //A function for getting if a user is subscribed to the channel in question
@@ -109,6 +116,7 @@ export const NotificationItem: React.FC<NotificationItemProps> = ({
   customTheme,
   isSecret,
   decryptFn,
+  onClose,
 }) => {
   const { notificationBody: parsedBody, timeStamp } = extractTimeStamp(notificationBody || '');
   const themeObject = getCustomTheme(theme, customTheme!);
@@ -118,7 +126,7 @@ export const NotificationItem: React.FC<NotificationItemProps> = ({
     isSecret
   );
 
-  const isCtaURLValid = MediaHelper.validURL(notifCta);
+  const isCtaURLValid = MediaHelper.validURL(notifCta) && !isToast;
   const isChannelURLValid = MediaHelper.validURL(url);
 
   // store the image to be displayed in this state variable
@@ -127,12 +135,6 @@ export const NotificationItem: React.FC<NotificationItemProps> = ({
   const [isSubscribed, setIsSubscribed] = React.useState(true); //use this to confirm if this is s
   const [divRef, offsetWidth] = useDivOffsetWidth();
 
-  const showMetaInfo = isSecret || timeStamp;
-  // console.log({
-  //   chainName,
-  //   rightIcon,
-  //   ai: ChainImages['CHAIN_ICONS']
-  // })
   const gotToCTA = (e: React.SyntheticEvent<HTMLElement>) => {
     e.stopPropagation();
     if (!isCtaURLValid) return;
@@ -192,9 +194,9 @@ export const NotificationItem: React.FC<NotificationItemProps> = ({
       timestamp={timeStamp}
       offsetWidth={offsetWidth}
       ref={divRef}
+      cta={isCtaURLValid}
       themeObject={themeObject!}
     >
-      {/* header that only pops up on small devices */}
       <MobileHeader themeObject={themeObject!}>
         <HeaderButton themeObject={themeObject!}>
           <ImageContainer
@@ -208,22 +210,35 @@ export const NotificationItem: React.FC<NotificationItemProps> = ({
               alt=""
             />
           </ImageContainer>
-          <ChannelName onClick={goToURL}>{app}</ChannelName>
+          <ChannelName
+            fontSize={`calc(${themeObject?.fontSize?.channelNameText} - ${isToast ? '2px' : '0px'})`}
+            themeObject={themeObject}
+            onClick={goToURL}
+          >
+            {app}
+          </ChannelName>
+          <Ellipse background={theme === 'dark' ? '#757D8D' : '#c4cbd5'} />
+          {timeStamp ? <TimestampLabel themeObject={themeObject!}>{convertTimeStamp(timeStamp)}</TimestampLabel> : null}
         </HeaderButton>
-        {chainName && chainDetails[chainName] ? (
-          <BlockchainContainer>
-            <ChainIconSVG offsetWidth={offsetWidth}>{chainDetails[chainName].icon}</ChainIconSVG>
-          </BlockchainContainer>
-        ) : null}
+        <ChainCloseContainer>
+          {chainName && chainDetails[chainName] ? (
+            <BlockchainContainer>
+              <ChainIconSVG offsetWidth={offsetWidth}>{chainDetails[chainName].icon}</ChainIconSVG>
+            </BlockchainContainer>
+          ) : null}
+          {isToast && onClose && (
+            <CloseContainer onClick={onClose}>
+              <CloseIcon />
+            </CloseContainer>
+          )}
+        </ChainCloseContainer>
       </MobileHeader>
-      {/* header that only pops up on small devices */}
 
       {/* content of the component */}
       <ContentSection
+        isToast={isToast && !!notifImage}
         themeObject={themeObject!}
         offsetWidth={offsetWidth}
-        onClick={isCtaURLValid ? gotToCTA : undefined}
-        cta={isCtaURLValid}
       >
         {/* section for media content */}
         {notifImage &&
@@ -231,6 +246,7 @@ export const NotificationItem: React.FC<NotificationItemProps> = ({
           (!MediaHelper.isMediaSupportedVideo(notifImage) ? (
             <MobileImage
               theme={theme}
+              size={isToast ? '56px' : '90px'}
               offsetWidth={offsetWidth}
               style={{ cursor: 'pointer' }}
               onClick={() => setImageOverlay(notifImage || '')}
@@ -241,99 +257,135 @@ export const NotificationItem: React.FC<NotificationItemProps> = ({
               />
             </MobileImage>
           ) : // if its a youtube url, RENDER THIS
-          MediaHelper.isMediaYoutube(notifImage) ? (
-            <MobileImage offsetWidth={offsetWidth}>
-              <iframe
-                id="ytplayer"
-                width="640"
-                allow="fullscreen;"
-                height="360"
-                src={MediaHelper.isMediaExternalEmbed(notifImage)}
-                title="Youtube"
-              ></iframe>
-            </MobileImage>
-          ) : (
-            // if its aN MP4 url, RENDER THIS
-            <MobileImage offsetWidth={offsetWidth}>
-              <video
-                width="360"
-                height="100%"
-                controls
+            MediaHelper.isMediaYoutube(notifImage) ? (
+              <MobileImage
+                offsetWidth={offsetWidth}
+                size={isToast ? '56px' : '90px'}
               >
-                <source
-                  src={notifImage}
-                  type="video/mp4"
-                />
-                Your browser does not support the video tag.
-              </video>
-            </MobileImage>
-          ))}
+                <iframe
+                  id="ytplayer"
+                  width="640"
+                  allow="fullscreen;"
+                  height="360"
+                  src={MediaHelper.isMediaExternalEmbed(notifImage)}
+                  title="Youtube"
+                ></iframe>
+              </MobileImage>
+            ) : (
+              // if its aN MP4 url, RENDER THIS
+              <MobileImage
+                offsetWidth={offsetWidth}
+                size={isToast ? '56px' : '90px'}
+              >
+                <video
+                  width="360"
+                  height="100%"
+                  controls
+                >
+                  <source
+                    src={notifImage}
+                    type="video/mp4"
+                  />
+                  Your browser does not support the video tag.
+                </video>
+              </MobileImage>
+            ))}
         {/* section for media content */}
 
         {/* section for text content */}
-        <ChannelDetailsWrapper>
-          <ChannelTitle
-            themeObject={themeObject!}
-            cta={isCtaURLValid}
+        <NotificationDetialsWrapper>
+          <NotificationDetails
             offsetWidth={offsetWidth}
+            themeObject={themeObject!}
           >
-            <ChannelTitleText themeObject={themeObject!}>{notifTitle}</ChannelTitleText>
-            {/* display link svg if notification has a valid cta url */}
-            {isCtaURLValid ? (
-              <span style={{ height: '20px', marginLeft: '7px' }}>
-                <LinkIcon />
-              </span>
-            ) : (
-              ''
-            )}
-          </ChannelTitle>
-          <ChannelDesc themeObject={themeObject!}>
-            <ChannelDescLabel
-              themeObject={themeObject!}
+            <ChannelTitleWrapper
               cta={isCtaURLValid}
+              onClick={isCtaURLValid ? gotToCTA : undefined}
+            >
+              <ChannelTitleText
+                fontSize={`calc(${themeObject?.fontSize?.notificationTitleText} - ${isToast ? '2px' : '0px'})`}
+                themeObject={themeObject!}
+              >
+                {notifTitle}
+              </ChannelTitleText>
+              {/* display link svg if notification has a valid cta url */}
+              {isCtaURLValid ? (
+                <span
+                  style={{
+                    width: `calc(16px - ${isToast ? '2px' : '0px'})`,
+                    height: `calc(16px - ${isToast ? '2px' : '0px'})`,
+                  }}
+                >
+                  <LinkIcon />
+                </span>
+              ) : (
+                ''
+              )}
+            </ChannelTitleWrapper>
+            <ChannelDesc
+              themeObject={themeObject!}
+              fontSize={`calc(${themeObject?.fontSize?.notificationContentText} - ${isToast ? '2px' : '0px'})`}
             >
-              <ParseMarkdownText text={notifBody} />
-            </ChannelDescLabel>
-          </ChannelDesc>
-        </ChannelDetailsWrapper>
+              <ChannelDescLabel
+                themeObject={themeObject!}
+                cta={isCtaURLValid}
+              >
+                <ParseMarkdownText text={notifBody} />
+              </ChannelDescLabel>
+            </ChannelDesc>
+          </NotificationDetails>
+          {isSpam && (
+            <Button
+              height="32px"
+              onClick={onSubscribe}
+              width="fit-content"
+              color={themeObject.color?.optInButtonText}
+              fontWeight={(themeObject.fontWeight?.optInButtonText || 500).toString()}
+              fontSize={themeObject.fontSize?.optInButtonText}
+              borderRadius="8px"
+              padding="12px 16px"
+              background={themeObject.color?.optInButtonBackground}
+            >
+              {subscribeLoading ? <Loader /> : 'Subscribe'}
+            </Button>
+          )}
+        </NotificationDetialsWrapper>
         {/* section for text content */}
 
-        <ButtonGroupContainer>
-          <ButtonGroup>
-            {/* include a channel opt into */}
-            {isSpam && <ActionButton onClick={onSubscribe}>{subscribeLoading ? <Loader /> : 'opt-in'}</ActionButton>}
-            {/* include a channel opt into */}
-
-            {isSecret ? (
-              <DecryptButton
-                decryptFn={onDecrypt}
-                isSecretRevealed={isSecretRevealed}
-              />
-            ) : null}
-          </ButtonGroup>
-        </ButtonGroupContainer>
+        {isSecret && (
+          <ButtonGroupContainer>
+            <ButtonGroup>
+              {isSecret ? (
+                <DecryptButton
+                  decryptFn={onDecrypt}
+                  isSecretRevealed={isSecretRevealed}
+                />
+              ) : null}
+            </ButtonGroup>
+          </ButtonGroupContainer>
+        )}
       </ContentSection>
       {/* content of the component */}
 
       {/* Meta Data section */}
-      <ChannelMetaInfo
-        hidden={!showMetaInfo}
-        hasLeft={false}
-      >
-        {/* For left aligned items use ChannelMetaInfoLeft as parent */}
-        <ChannelMetaInfoLeft hidden></ChannelMetaInfoLeft>
-
-        {/* For right aligned items use ChannelMetaInfoRight */}
-        <ChannelMetaInfoRight hidden={!showMetaInfo}>
-          {isSecret ? (
-            <SecretIconContainer>
-              <SecretIcon></SecretIcon>
-            </SecretIconContainer>
-          ) : null}
-
-          {timeStamp ? <TimestampLabel themeObject={themeObject!}>{convertTimeStamp(timeStamp)}</TimestampLabel> : null}
-        </ChannelMetaInfoRight>
-      </ChannelMetaInfo>
+      {isSecret && (
+        <ChannelMetaInfo
+          hidden={!isSecret}
+          hasLeft={false}
+        >
+          {/* For left aligned items use ChannelMetaInfoLeft as parent */}
+          <ChannelMetaInfoLeft hidden></ChannelMetaInfoLeft>
+
+          {/* For right aligned items use ChannelMetaInfoRight */}
+          <ChannelMetaInfoRight hidden={!isSecret}>
+            {isSecret ? (
+              <SecretIconContainer>
+                <SecretIcon></SecretIcon>
+              </SecretIconContainer>
+            ) : null}
+          </ChannelMetaInfoRight>
+        </ChannelMetaInfo>
+      )}
 
       {/* add image overlay for full screen images */}
       <ImageOverlayComponent
@@ -376,34 +428,12 @@ NotificationItem.defaultProps = {
 const MD_BREAKPOINT = '50050px'; //set an arbitrarily large number because we no longer use this breakpoint
 const SM_BREAKPOINT = '900px';
 
-const ContentSection = styled.div<CTADataType & CustomThemeProps & OffsetWidthType>`
+const ContentSection = styled.div<CustomThemeProps & OffsetWidthType & { isToast: boolean }>`
   display: flex;
-  padding: 15px 16px;
-
-  cursor: ${(props) => (props.cta ? 'pointer' : 'default')};
-
-  &:hover {
-    background: ${(props) => (props.cta ? props?.themeObject?.color?.contentHoverBackground : 'none')};
-  }
-  ${(props: any) =>
-    props.offsetWidth > 461 &&
-    css`
-      @media (min-width: ${SM_BREAKPOINT}) {
-        align-items: flex-start;
-        flex-direction: row;
-        gap: 20px;
-        justify-content: space-between;
-      }
-      @media (max-width: ${SM_BREAKPOINT}) {
-        flex-direction: column;
-      }
-    `};
-
-  ${(props: any) =>
-    props.offsetWidth <= 461 &&
-    css`
-      flex-direction: column;
-    `};
+  gap: 12px;
+  justify-content: ${(props) => (props?.isToast ? 'space-between' : 'start')};
+  flex-direction: ${(props) => (props?.isToast ? 'row-reverse' : 'row')};
+  align-items: flex-start;
 `;
 
 const BlockchainContainer = styled.div`
@@ -413,9 +443,15 @@ const BlockchainContainer = styled.div`
   font-weight: 700;
 `;
 
+const Ellipse = styled.div<{ background?: string }>`
+  width: 4px;
+  height: 4px;
+  background: ${(props) => props?.background};
+  border-radius: 100%;
+`;
 const ChainIconSVG = styled.div<OffsetWidthType>`
-  width: 28px;
-  height: 28px;
+  width: 18px;
+  height: 18px;
 
   svg,
   svg image,
@@ -429,8 +465,11 @@ const ChainIconSVG = styled.div<OffsetWidthType>`
   }
 `;
 
-const MobileImage = styled.div<OffsetWidthType & { theme?: string }>`
+const MobileImage = styled.div<OffsetWidthType & { theme?: string; size?: string }>`
   overflow: hidden;
+  flex-shrink: 0;
+  width: ${(props) => props?.size};
+  height: ${(props) => props?.size};
   img,
   iframe,
   video {
@@ -438,131 +477,69 @@ const MobileImage = styled.div<OffsetWidthType & { theme?: string }>`
     width: 100%;
     height: 100% !important;
     object-fit: fill;
-    border-radius: 10px;
+    border-radius: 100%;
     border: 0;
   }
-
-  ${(props: OffsetWidthType & { theme?: string }) =>
-    props.offsetWidth > 461 &&
-    css`
-      @media (min-width: ${SM_BREAKPOINT}) {
-        border: 1px solid ${(props) => ((props.theme as unknown as string) === 'light' ? '#ededed' : '#444')};
-        border-radius: 10px;
-        min-width: 220px;
-        width: 220px;
-        height: 200px;
-      }
-      @media (max-width: ${SM_BREAKPOINT}) {
-        display: block;
-        width: 100%;
-        max-height: 200px;
-        margin-bottom: 12px;
-        border: 0;
-
-        img,
-        iframe,
-        video {
-          border: 0;
-          border-radius: 0;
-        }
-      }
-    `};
-
-  ${(props: any) =>
-    props.offsetWidth <= 461 &&
-    css`
-      display: block;
-      width: 100%;
-      max-height: 200px;
-      margin-bottom: 12px;
-      border: 0;
-
-      img,
-      iframe,
-      video {
-        border: 0;
-        border-radius: 0;
-      }
-    `};
 `;
 
-const ImageContainer = styled.span<OffsetWidthType & { theme?: string }>`
-  background: ${(props) => (props.theme === 'light' ? '#ededed' : '#444')};
-  display: inline-block;
-  margin-right: 10px;
-  border-radius: 5px;
+const ImageContainer = styled.div<OffsetWidthType & { theme?: string }>`
+  border: 1px solid #eaebf2;
+  overflow: hidden;
+  border-radius: 8px;
   width: 24px;
   height: 24px;
-  @media (max-width: ${SM_BREAKPOINT}) {
-    width: 24px;
-    height: 24px;
-  }
 `;
 
-const ChannelDetailsWrapper = styled.div`
+const NotificationDetialsWrapper = styled.div`
   display: flex;
   flex-direction: column;
-  flex-grow: 4;
+  gap: 16px;
 `;
 
-const Container = styled.div<ContainerDataType & CustomThemeProps>`
+const Container = styled.div<ContainerDataType & CustomThemeProps & CTADataType>`
   position: relative;
+  padding: 16px;
   overflow: hidden;
+  flex-direction: column;
   font-family: ${(props) => props?.themeObject?.fontFamily};
   flex: 1;
   display: flex;
+  gap: 8px;
   flex-wrap: wrap;
   border: ${(props) => `1px solid ${props?.themeObject?.color?.modalBorder}`};
   background: ${(props) => props?.themeObject?.color?.accentBackground};
   border-radius: ${(props) => props?.themeObject?.borderRadius?.modal};
-  margin: 1.8rem 0px;
-  justify-content: center;
-  justify-content: space-between;
-  @media (max-width: ${MD_BREAKPOINT}) {
-    flex-direction: column;
-  }
+  ${(props) =>
+    props.cta &&
+    css`
+      &:hover {
+        background: ${props?.themeObject?.color?.contentHoverBackground};
+      }
+    `};
 `;
 
 const MobileHeader = styled.div<CustomThemeProps>`
-  display: none;
-  @media (max-width: ${MD_BREAKPOINT}) {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    padding: 12px 10px;
-    border-bottom: ${(props) => props?.themeObject?.modalDivider};
-    border-top-left-radius: 10px;
-    border-top-right-radius: 10px;
-    text-align: left;
-  }
+  display: flex;
+  justify-content: space-between;
 `;
 
-const ChannelName = styled.div`
+const ChannelName = styled.div<CustomThemeProps & FontSizeType>`
   cursor: pointer;
-  &:hover {
-    text-decoration: underline;
-  }
+  font-size: ${(props) => props.fontSize};
+  font-weight: ${(props) => props?.themeObject?.fontWeight?.channelNameText};
+  color: ${(props) => props?.themeObject?.color?.channelNameText};
 `;
 
 const HeaderButton = styled.div<CustomThemeProps>`
   display: flex;
-  justify-content: space-between;
+  gap: 8px;
   align-items: center;
-  font-size: ${(props) => props?.themeObject?.fontSize?.channelNameText};
-  font-weight: ${(props) => props?.themeObject?.fontWeight?.channelNameText};
-  color: ${(props) => props?.themeObject?.color?.channelNameText};
 `;
 
-const ChannelTitle = styled.div<CTADataType & OffsetWidthType & CustomThemeProps>`
-  width: fit-content;
+const NotificationDetails = styled.div<OffsetWidthType & CustomThemeProps>`
   display: flex;
-  align-items: center;
-  text-align: left;
-  margin-bottom: 8px;
-
-  &:hover {
-    text-decoration: ${(props) => (props.cta ? 'underline' : 'none')};
-  }
+  flex-direction: column;
+  gap: 4px;
 
   @media (max-width: ${MD_BREAKPOINT}) {
     color: ${(props) => props?.themeObject?.color?.notificationTitleText};
@@ -582,16 +559,35 @@ const ChannelTitle = styled.div<CTADataType & OffsetWidthType & CustomThemeProps
       margin-bottom: 6px;
     `};
 `;
+const ChannelTitleWrapper = styled.div<CTADataType>`
+  ${(props) =>
+    props.cta &&
+    css`
+      &:hover {
+        color: #c742dd;
+        span {
+          color: #c742dd;
+        }
+      }
+    `};
+
+  cursor: pointer;
+  align-items: center;
+  display: flex;
+  gap: 8px;
+`;
 
-const ChannelTitleText = styled.div<CustomThemeProps>`
-  font-size: ${(props) => props?.themeObject?.fontSize?.notificationTitleText};
+const ChannelTitleText = styled.span<CustomThemeProps & FontSizeType>`
+  cursor: pointer;
+  font-size: ${(props) => props?.fontSize};
   font-weight: ${(props) => props?.themeObject?.fontWeight?.notificationTitleText};
+  color: ${(props) => props?.themeObject?.color?.notificationTitleText};
 `;
-const ChannelDesc = styled.div<CustomThemeProps>`
+const ChannelDesc = styled.div<CustomThemeProps & FontSizeType>`
   line-height: 20px;
   flex: 1;
   display: flex;
-  font-size: ${(props) => props?.themeObject?.fontSize?.notificationContentText};
+  font-size: ${(props) => props?.fontSize};
   color: ${(props) => props?.themeObject?.color?.notificationContentText};
   font-weight: ${(props) => props?.themeObject?.fontWeight?.notificationContentText};
   flex-direction: column;
@@ -610,7 +606,16 @@ const ChannelMetaInfo = styled.div<MetaInfoType>`
   flex-direction: row;
   justify-content: ${(props) => (props.hasLeft ? 'space-between' : 'end')};
 `;
+const CloseContainer = styled.div`
+  cursor: pointer;
+  display: flex;
+`;
 
+const ChainCloseContainer = styled.div`
+  display: flex;
+  gap: 6px;
+  align-items: center;
+`;
 const ChannelMetaSection = styled.div<MetaDataType>`
   display: ${(props) => (props.hidden ? 'none' : 'flex')};
   align-items: center;
@@ -626,16 +631,10 @@ const ChannelMetaInfoRight = styled(ChannelMetaSection)`
 
 const TimestampLabel = styled.label<CustomThemeProps>`
   color: ${(props) => props?.themeObject?.color?.timestamp};
-  border-radius: 0;
-  border-top-left-radius: 6px;
-  border-bottom-right-radius: 10px;
-  border-right: 0;
-  border-bottom: 0;
-  margin-bottom: -1px;
-  margin-right: -1px;
+  line-height: 14px;
+
   font-weight: ${(props) => props?.themeObject?.fontWeight?.timestamp};
   font-size: ${(props) => props?.themeObject?.fontSize?.timestamp};
-  padding: 6px 10px 6px 0px;
 `;
 
 const SecretIconContainer = styled.div`
diff --git a/packages/uiweb/src/lib/components/notification/theme/index.ts b/packages/uiweb/src/lib/components/notification/theme/index.ts
index e54c3bf61..80a395189 100644
--- a/packages/uiweb/src/lib/components/notification/theme/index.ts
+++ b/packages/uiweb/src/lib/components/notification/theme/index.ts
@@ -5,14 +5,14 @@ interface IBorderRadius {
 }
 interface IColor {
   accentBackground?: string;
-  contentHoverBackground?:string;
   channelNameText?: string;
   notificationTitleText?: string;
   notificationContentText?: string;
   timestamp?: string;
   optInButtonText?: string;
   optInButtonBackground?: string;
-  modalBorder?:string;
+  contentHoverBackground?: string;
+  modalBorder?: string;
 }
 
 interface IFont {
@@ -39,7 +39,6 @@ export interface INotificationItemTheme {
   fontWeight?: IFontWeight;
 
   fontFamily?: string;
-
   modalDivider?: string;
 }
 
@@ -47,58 +46,58 @@ export interface INotificationItemTheme {
 
 export const baseTheme: INotificationItemTheme = {
   borderRadius: {
-    modal: '10px',
+    modal: '16px',
     optInButton: '3px',
   },
   fontWeight: {
-    channelNameText: 400,
-    notificationTitleText: 400,
+    channelNameText: 500,
+    notificationTitleText: 500,
     notificationContentText: 400,
-    timestamp: 600,
+    timestamp: 500,
     optInButtonText: 500,
   },
   fontSize: {
-    channelNameText: '15px',
-    notificationTitleText: '22px',
-    notificationContentText: '16px',
+    channelNameText: '14px',
+    notificationTitleText: '16px',
+    notificationContentText: '14px',
     timestamp: '10px',
-    optInButtonText: 'unset',
+    optInButtonText: '12px',
   },
-  fontFamily: 'Strawford, sans-serif',
+  fontFamily: 'inherit',
 };
 //light theme object
 export const lightTheme: INotificationItemTheme = {
-    ...baseTheme,
-    color:{
-        accentBackground: '#fff',
-        contentHoverBackground:'#e8eaf680',
-        channelNameText:'#333333',
-        notificationTitleText:'#333333',
-        notificationContentText:'#333333',
-        timestamp:'#808080',
-        optInButtonText:'#fff',
-        optInButtonBackground:'rgb(226, 8, 128)',
-        modalBorder:'#D9D9D9'
-    },
-    modalDivider:'1px solid #D9D9D9'
+  ...baseTheme,
+  color: {
+    contentHoverBackground: '#e8eaf680',
+    accentBackground: '#fff',
+    channelNameText: '#17181B',
+    notificationTitleText: '#17181B',
+    notificationContentText: '#313338',
+    timestamp: '#8C93A0',
+    optInButtonText: '#fff',
+    optInButtonBackground: '#D548EC',
+    modalBorder: '#C4CBD5',
+  },
+  modalDivider: '1px solid #D9D9D9',
 };
 //dark theme object
 export const darkTheme: INotificationItemTheme = {
-    ...baseTheme,
-    color:{
-        accentBackground: '#2F3137',
-        channelNameText:'#C5CAE9',
-        contentHoverBackground:'#404650',
-        notificationTitleText:'#C5CAE9',
-        notificationContentText:'#C5CAE9',
-        timestamp:'#808080',
-        optInButtonText:'#fff',
-        optInButtonBackground:'rgb(226, 8, 128)',
-        modalBorder:'#4A4F67'
-    },
-    modalDivider:'1px solid #4A4F67'
+  ...baseTheme,
+  color: {
+    contentHoverBackground: '#404650',
+    accentBackground: '#202124',
+    channelNameText: '#F5F6F8',
+    notificationTitleText: '#F5F6F8',
+    notificationContentText: '#C4CBD5',
+    timestamp: '#757D8D',
+    optInButtonText: '#fff',
+    optInButtonBackground: '#D548EC',
+    modalBorder: '#484D58',
+  },
+  modalDivider: '1px solid #4A4F67',
 };
 //function to return final theme object
-export const getCustomTheme = (theme:string | undefined,customTheme:INotificationItemTheme) => {
-  return Object.assign({}, theme==='dark'?darkTheme:lightTheme, customTheme);
-}
\ No newline at end of file
+export const getCustomTheme = (theme: string | undefined, customTheme: INotificationItemTheme) => {
+  return Object.assign({}, theme === 'dark' ? darkTheme : lightTheme, customTheme);
+};
diff --git a/packages/uiweb/src/lib/components/reusables/sharedStyling.tsx b/packages/uiweb/src/lib/components/reusables/sharedStyling.tsx
index 68d9b5bfd..6cb5399c8 100644
--- a/packages/uiweb/src/lib/components/reusables/sharedStyling.tsx
+++ b/packages/uiweb/src/lib/components/reusables/sharedStyling.tsx
@@ -176,7 +176,7 @@ export const Span = styled.span<SpanStyleProps>`
   font-size: ${(props) => props.fontSize || 'inherit'};
   font-weight: ${(props) => props.fontWeight || '300'};
   left: ${(props) => props.left || 'auto'};
-  letter-spacing: ${(props) => props.letterSpacing || 'inherit'};
+  letter-spacing: ${(props) => props.letterSpacing || 'normal'};
   line-height: ${(props) => props.lineHeight || 'initial'};
   cursor: ${(props) => props.cursor || 'default'};
   margin: ${(props) => props.margin || '0px'};
@@ -249,7 +249,7 @@ export const Anchor = styled.a<AnchorStyleProps>`
   font-size: ${(props) => props.fontSize || 'inherit'};
   font-weight: ${(props) => props.fontWeight || '300'};
   left: ${(props) => props.left || 'auto'};
-  letter-spacing: ${(props) => props.letterSpacing || 'inherit'};
+  letter-spacing: ${(props) => props.letterSpacing || 'normal'};
   line-height: ${(props) => props.lineHeight || 'initial'};
   cursor: ${(props) => props.cursor || 'pointer'};
   margin: ${(props) => props.margin || '0px'};
diff --git a/packages/uiweb/src/lib/components/supportChat/AddressInfo.tsx b/packages/uiweb/src/lib/components/supportChat/AddressInfo.tsx
index 628d5bb8d..86dc2fb26 100644
--- a/packages/uiweb/src/lib/components/supportChat/AddressInfo.tsx
+++ b/packages/uiweb/src/lib/components/supportChat/AddressInfo.tsx
@@ -6,7 +6,7 @@ import { ethers } from 'ethers';
 import { ChatProps } from './Chat';
 
 import { SupportChatPropsContext } from '../../context';
-import { Constants, ENV, InfuraAPIKey, allowedNetworks } from '../../config';
+import { Constants, infuraAPIKey, allowedNetworks } from '../../config';
 
 import { copyToClipboard, pCAIP10ToWallet, resolveWeb3Name } from '../../helpers';
 import { CopySvg } from '../../icons/CopySvg';
@@ -19,7 +19,7 @@ export const AddressInfo: React.FC = () => {
   const [isCopied, setIsCopied] = useState<boolean>(false);
   const walletAddress = pCAIP10ToWallet(supportAddress!);
   const l1ChainId = allowedNetworks[env!]?.includes(1) ? 1 : 5;
-  const provider = new ethers.providers.InfuraProvider(l1ChainId, InfuraAPIKey);
+  const provider = new ethers.providers.InfuraProvider(l1ChainId, infuraAPIKey);
 
   useEffect(() => {
     const getUser = async () => {
diff --git a/packages/uiweb/src/lib/components/supportChat/Modal.tsx b/packages/uiweb/src/lib/components/supportChat/Modal.tsx
index 6b81680f8..ed9921601 100644
--- a/packages/uiweb/src/lib/components/supportChat/Modal.tsx
+++ b/packages/uiweb/src/lib/components/supportChat/Modal.tsx
@@ -6,16 +6,9 @@ import { AddressInfo } from './AddressInfo';
 import PoweredByPushLogo from '../../icons/sponsorPush.svg';
 import { SponserPushIcon } from '../../icons/SponserPush';
 import { HandWaveSvg } from '../../icons/HandWaveSvg';
-import {
-  SupportChatMainStateContext,
-  SupportChatPropsContext,
-} from '../../context';
+import { SupportChatMainStateContext, SupportChatPropsContext } from '../../context';
 import { Chats } from './Chats';
-import {
-  createUserIfNecessary,
-  getChats,
-  walletToPCAIP10,
-} from '../../helpers';
+import { createUserIfNecessary, getChats, walletToPCAIP10 } from '../../helpers';
 import type { IMessageIPFS } from '../../types';
 import { useChatScroll } from '../../hooks';
 import { Spinner } from './spinner/Spinner';
@@ -26,12 +19,9 @@ const chatsFetchedLimit = 10;
 
 export const Modal: React.FC = () => {
   const [loading, setLoading] = useState<boolean>(false);
-  const [lastThreadHashFetched, setLastThreadHashFetched] = useState<
-    string | null
-  >(null);
+  const [lastThreadHashFetched, setLastThreadHashFetched] = useState<string | null>(null);
   const [wasLastListPresent, setWasLastListPresent] = useState<boolean>(true);
-  const { supportAddress, user, env, account, signer, greetingMsg, theme } =
-    useContext<any>(SupportChatPropsContext);
+  const { supportAddress, user, env, account, signer, greetingMsg, theme } = useContext<any>(SupportChatPropsContext);
   const {
     chats,
     setChatsSorted,
@@ -170,7 +160,11 @@ export const Modal: React.FC = () => {
         />
       )}
       {loading && <Spinner size="40" />}
-      <ChatSection ref={listInnerRef} onScroll={onScroll} theme={theme}>
+      <ChatSection
+        ref={listInnerRef}
+        onScroll={onScroll}
+        theme={theme}
+      >
         {connectedUser && chats.length ? (
           chats.map((chat: IMessageIPFS, index: number) => (
             <Chats
@@ -186,17 +180,28 @@ export const Modal: React.FC = () => {
       </ChatSection>
       {!connectedUser && !loading && (
         <ConnectSection>
-          <Button onClick={() => connectUser()} theme={theme}>
+          <Button
+            onClick={() => connectUser()}
+            theme={theme}
+          >
             Connect
           </Button>
           <Span>Connect your wallet to continue</Span>
         </ConnectSection>
       )}
-      {toastMessage && <Toaster message={toastMessage} type={toastType} />}
+      {toastMessage && (
+        <Toaster
+          message={toastMessage}
+          type={toastType}
+        />
+      )}
 
       <InputSection>
         {connectedUser && <ChatInput />}
-        <Div height="18px" width="145px">
+        <Div
+          height="18px"
+          width="145px"
+        >
           <SponserPushIcon />
         </Div>
       </InputSection>
diff --git a/packages/uiweb/src/lib/config/constants.ts b/packages/uiweb/src/lib/config/constants.ts
index d57413840..08edc54b3 100644
--- a/packages/uiweb/src/lib/config/constants.ts
+++ b/packages/uiweb/src/lib/config/constants.ts
@@ -44,11 +44,16 @@ export const CoreContractChainId = {
   local: 11155111,
 };
 
-export const CoreRPC = {
-  prod: 'https://mainnet.infura.io/v3/4ff53a5254144d988a8318210b56f47a',
-  dev: 'https://sepolia.infura.io/v3/5524d420b29f4f7a8d8d2f582a0d43f7',
-  staging: 'https://sepolia.infura.io/v3/49f638cc25a94ddb86b7aefd612f11ab',
-  local: 'https://sepolia.infura.io/v3/5524d420b29f4f7a8d8d2f582a0d43f7',
+export const infuraAPIKey = '100cce93cd9d4626b9cedf707d4dbabc';
+
+export const CoreRPC = (env: ENV) => {
+  const baseinfuraURL = {
+    prod: 'https://mainnet.infura.io/v3/',
+    dev: 'https://sepolia.infura.io/v3/',
+    staging: 'https://sepolia.infura.io/v3/',
+    local: 'https://sepolia.infura.io/v3/',
+  };
+  return `${baseinfuraURL[env]}${infuraAPIKey}`;
 };
 
 const TESTNET_NETWORK = {
@@ -62,6 +67,7 @@ const TESTNET_NETWORK = {
   BERACHAIN: 'eip155:80085',
   CYBER_CONNECT: 'eip155:111557560',
   BASE: 'eip155:84532',
+  LINEA: 'eip155:59141'
 };
 const MAINET_NETWORK = {
   ETHEREUM: 'eip155:1',
@@ -73,6 +79,7 @@ const MAINET_NETWORK = {
   FUSE: 'eip155:122',
   CYBER_CONNECT: 'eip155:7560',
   BASE: 'eip155:8453',
+  LINEA: 'eip155:59144'
 };
 
 export const BLOCKCHAIN_NETWORK = {
@@ -138,8 +145,6 @@ export const allowedNetworks = {
 
 export const BLOCKNATIVE_PROJECT_ID = '64a44a0fb537407bfe97d24330e4109c';
 
-export const InfuraAPIKey = '150f25623ae64d08ab7ec7dd0c6b6ee9';
-
 export const PUBLIC_GOOGLE_TOKEN = 'AIzaSyBhUBnCia6zpxY7KcqjghRS1IphinAvKXs';
 
 export const ProfilePicture = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAvklEQVR4AcXBsW2FMBiF0Y8r3GQb6jeBxRauYRpo4yGQkMd4A7kg7Z/GUfSKe8703fKDkTATZsJsrr0RlZSJ9r4RLayMvLmJjnQS1d6IhJkwE2bT13U/DBzp5BN73xgRZsJMmM1HOolqb/yWiWpvjJSUiRZWopIykTATZsJs5g+1N6KSMiO1N/5DmAkzYTa9Lh6MhJkwE2ZzSZlo7xvRwson3txERzqJhJkwE2bT6+JhoKTMJ2pvjAgzYSbMfgDlXixqjH6gRgAAAABJRU5ErkJggg==`;
diff --git a/packages/uiweb/src/lib/context/chatContext.ts b/packages/uiweb/src/lib/context/chatContext.ts
index 444904949..6313604ff 100644
--- a/packages/uiweb/src/lib/context/chatContext.ts
+++ b/packages/uiweb/src/lib/context/chatContext.ts
@@ -25,6 +25,7 @@ export interface IChatDataContextValues {
   isPushChatStreamConnected: boolean;
   setIsPushChatStreamConnected: React.Dispatch<React.SetStateAction<boolean>>;
   toast: any;
+  infuraAPIKey: string | null;
   uiConfig: {
     suppressToast?: boolean;
   };
@@ -88,6 +89,7 @@ export const initialChatDataContextValues: IChatDataContextValues = {
   uiConfig: {
     suppressToast: false,
   },
+  infuraAPIKey: null,
   chatStream: {},
   chatAcceptStream: {},
   chatRejectStream: {},
diff --git a/packages/uiweb/src/lib/dataProviders/ChatDataProvider.tsx b/packages/uiweb/src/lib/dataProviders/ChatDataProvider.tsx
index 78f0ae73d..e5d6d1445 100644
--- a/packages/uiweb/src/lib/dataProviders/ChatDataProvider.tsx
+++ b/packages/uiweb/src/lib/dataProviders/ChatDataProvider.tsx
@@ -10,13 +10,13 @@ import { pCAIP10ToWallet } from '../helpers';
 
 import usePushUserInfoUtilities from '../hooks/chat/useUserInfoUtilities';
 
-import usePushUser from '../hooks/usePushUser';
 import useToast from '../components/chat/reusables/NewToast'; // Re-write this later
+import usePushUser from '../hooks/usePushUser';
 
 // Internal Configs
 import { lightChatTheme } from '../components/chat/theme';
 import { ThemeContext } from '../components/chat/theme/ThemeProvider';
-import { Constants, ENV, GUEST_MODE_ACCOUNT } from '../config';
+import { Constants, ENV, GUEST_MODE_ACCOUNT, infuraAPIKey as infuraProjectId } from '../config';
 
 // Assets
 
@@ -48,6 +48,7 @@ export interface IChatUIProviderProps {
   uiConfig?: {
     suppressToast?: boolean;
   };
+  infuraAPIKey?: string;
 }
 
 // Exported Functions
@@ -61,6 +62,7 @@ export const ChatUIProvider = ({
   theme,
   debug = false,
   uiConfig = {},
+  infuraAPIKey = infuraProjectId,
 }: IChatUIProviderProps) => {
   // Now destructure with a default value for suppressToast
   const { suppressToast = false } = uiConfig;
@@ -452,6 +454,7 @@ export const ChatUIProvider = ({
     setIsPushChatStreamConnected,
     user: pushUser,
     setUser: setPushUser,
+    infuraAPIKey: infuraAPIKey,
     toast: toastify,
     uiConfig: uiConfig,
     chatStream,
diff --git a/packages/uiweb/src/lib/dataProviders/Web3OnboardDataProvider.tsx b/packages/uiweb/src/lib/dataProviders/Web3OnboardDataProvider.tsx
index 0e1997857..b57892736 100644
--- a/packages/uiweb/src/lib/dataProviders/Web3OnboardDataProvider.tsx
+++ b/packages/uiweb/src/lib/dataProviders/Web3OnboardDataProvider.tsx
@@ -1,6 +1,6 @@
 import coinbaseWalletModule from '@web3-onboard/coinbase';
 
-import { BLOCKNATIVE_PROJECT_ID, InfuraAPIKey } from '../config';
+import { BLOCKNATIVE_PROJECT_ID, infuraAPIKey } from '../config';
 import { Web3OnboardProvider } from '@web3-onboard/react';
 import injectedModule, { ProviderLabel } from '@web3-onboard/injected-wallets';
 import walletConnectModule from '@web3-onboard/walletconnect';
@@ -30,13 +30,13 @@ const CHAINS: ChainType[] = [
     id: '0x1',
     token: 'ETH',
     label: 'Ethereum Mainnet',
-    rpcUrl: `https://mainnet.infura.io/v3/${InfuraAPIKey}`,
+    rpcUrl: `https://mainnet.infura.io/v3/${infuraAPIKey}`,
   },
   {
     id: '0xAA36A7',
     token: 'ETH',
     label: 'Sepolia',
-    rpcUrl: `https://sepolia.infura.io/v3/${InfuraAPIKey}`,
+    rpcUrl: `https://sepolia.infura.io/v3/${infuraAPIKey}`,
   },
   {
     id: '0x13882',
diff --git a/packages/uiweb/src/lib/helpers/address.ts b/packages/uiweb/src/lib/helpers/address.ts
index d6c6a2f4f..0b23c82ba 100644
--- a/packages/uiweb/src/lib/helpers/address.ts
+++ b/packages/uiweb/src/lib/helpers/address.ts
@@ -1,6 +1,6 @@
 import { SignerType, CONSTANTS } from '@pushprotocol/restapi';
 import { ethers } from 'ethers';
-import { ENV, allowedNetworks } from '../config';
+import { ENV, allowedNetworks, infuraAPIKey } from '../config';
 import { createWeb3Name } from '@web3-name-sdk/core';
 import { getUdResolverClient } from './udResolver';
 
diff --git a/packages/uiweb/src/lib/helpers/udResolver.ts b/packages/uiweb/src/lib/helpers/udResolver.ts
index cc54d1d57..dda897b1b 100644
--- a/packages/uiweb/src/lib/helpers/udResolver.ts
+++ b/packages/uiweb/src/lib/helpers/udResolver.ts
@@ -1,7 +1,7 @@
 import type { Env } from '@pushprotocol/restapi';
 import Resolution from '@unstoppabledomains/resolution';
 import { ethers } from 'ethers';
-import { allowedNetworks, InfuraAPIKey, NETWORK_DETAILS } from '../config';
+import { allowedNetworks, infuraAPIKey, NETWORK_DETAILS } from '../config';
 
 export const getUdResolverClient = (env: Env): Resolution | undefined => {
   try {
@@ -14,11 +14,11 @@ export const getUdResolverClient = (env: Env): Resolution | undefined => {
         locations: {
           Layer1: {
             network: 'mainnet', // add config for sepolia once it's supported by UD
-            provider: new ethers.providers.InfuraProvider(l1ChainId, InfuraAPIKey),
+            provider: new ethers.providers.InfuraProvider(l1ChainId, infuraAPIKey),
           },
           Layer2: {
             network: NETWORK_DETAILS[l2ChainId].network,
-            provider: new ethers.providers.InfuraProvider(l2ChainId, InfuraAPIKey),
+            provider: new ethers.providers.InfuraProvider(l2ChainId, infuraAPIKey),
           },
         },
       },
diff --git a/packages/uiweb/src/lib/helpers/utils.ts b/packages/uiweb/src/lib/helpers/utils.ts
index f865e5567..4d13e1063 100644
--- a/packages/uiweb/src/lib/helpers/utils.ts
+++ b/packages/uiweb/src/lib/helpers/utils.ts
@@ -35,6 +35,34 @@ export const deriveChatId = async (chatId: string, user: PushAPI | undefined): P
   return chatId;
 };
 
+// Main Logic
+// Deep Copy Helper Function
+export function deepCopy<T>(obj: T): T {
+  if (obj === null || typeof obj !== 'object') {
+    return obj;
+  }
+
+  if (obj instanceof Date) {
+    return new Date(obj.getTime()) as any;
+  }
+
+  if (obj instanceof Array) {
+    return obj.reduce((arr, item, i) => {
+      arr[i] = deepCopy(item);
+      return arr;
+    }, [] as any[]) as any;
+  }
+
+  if (obj instanceof Object) {
+    return Object.keys(obj).reduce((newObj, key) => {
+      newObj[key as keyof T] = deepCopy((obj as any)[key]);
+      return newObj;
+    }, {} as T);
+  }
+
+  throw new Error(`Unable to copy obj! Its type isn't supported.`);
+}
+
 export const isMessageEncrypted = (message: string) => {
   if (!message) return false;
 
diff --git a/packages/uiweb/src/lib/hooks/chat/usePushSendMessage.ts b/packages/uiweb/src/lib/hooks/chat/usePushSendMessage.ts
index 76d57742a..7600d1185 100644
--- a/packages/uiweb/src/lib/hooks/chat/usePushSendMessage.ts
+++ b/packages/uiweb/src/lib/hooks/chat/usePushSendMessage.ts
@@ -1,14 +1,15 @@
 import * as PushAPI from '@pushprotocol/restapi';
 import { useCallback, useContext, useState } from 'react';
-import useVerifyAccessControl from './useVerifyAccessControl';
 import { useChatData } from '..';
 import { ENV } from '../../config';
 import { setAccessControl } from '../../helpers';
+import useVerifyAccessControl from './useVerifyAccessControl';
 
 interface SendMessageParams {
   message: string;
   chatId: string;
-  messageType?: 'Text' | 'Image' | 'File' | 'GIF' | 'MediaEmbed';
+  messageType?: 'Text' | 'Image' | 'File' | 'GIF' | 'MediaEmbed' | 'Reply';
+  replyRef?: string;
 }
 
 const usePushSendMessage = () => {
@@ -19,13 +20,26 @@ const usePushSendMessage = () => {
 
   const sendMessage = useCallback(
     async (options: SendMessageParams) => {
-      const { chatId, message, messageType } = options || {};
+      const { chatId, message, messageType, replyRef } = options || {};
       setLoading(true);
-      try {
-        const response = await user?.chat.send(chatId, {
+
+      const messagePayload: any = {
+        type: messageType,
+        content: message,
+      };
+
+      if (replyRef !== undefined) {
+        messagePayload.type = 'Reply';
+        messagePayload.content = {
           type: messageType,
           content: message,
-        });
+        };
+        messagePayload.reference = replyRef;
+      }
+      console.log(messagePayload);
+
+      try {
+        const response = await user?.chat.send(chatId, messagePayload);
         setLoading(false);
         if (!response) {
           return false;
diff --git a/packages/uiweb/src/lib/hooks/index.ts b/packages/uiweb/src/lib/hooks/index.ts
index 90e8cb702..52f9c2688 100644
--- a/packages/uiweb/src/lib/hooks/index.ts
+++ b/packages/uiweb/src/lib/hooks/index.ts
@@ -1,6 +1,6 @@
 export * from './chat';
 export * from './chatAndNotification';
-export * from "./space";
+export * from './space';
 export * from './useChatScroll';
 export * from './useClickAway';
 export * from './useCreateChatProfile';
@@ -10,8 +10,7 @@ export * from './useDivOffsetWidth';
 export * from './useGetChatProfile';
 export * from './useMediaQuery';
 export * from './usePushUser';
-export * from './useResolveWeb3Name';
 export * from './useSupportChatStream';
 export * from './useTokenSymbolLoader';
 export * from './widget';
-
+export * from './useDomainName';
diff --git a/packages/uiweb/src/lib/hooks/useAccount.ts b/packages/uiweb/src/lib/hooks/useAccount.ts
index a37c99647..951aa2c82 100644
--- a/packages/uiweb/src/lib/hooks/useAccount.ts
+++ b/packages/uiweb/src/lib/hooks/useAccount.ts
@@ -2,12 +2,12 @@ import { Env } from '@pushprotocol/restapi';
 import { useConnectWallet, useSetChain } from '@web3-onboard/react';
 import { ethers } from 'ethers';
 import { useMemo } from 'react';
-import { CoreContractChainId, CoreRPC, GUEST_MODE_ACCOUNT } from '../config';
+import { CoreContractChainId, CoreRPC, ENV, GUEST_MODE_ACCOUNT } from '../config';
 
 interface useAccountParams {
-  env:Env;
+  env: Env;
 }
-export const useAccount = ({env}:useAccountParams) => {
+export const useAccount = ({ env }: useAccountParams) => {
   const [{ wallet, connecting }, connect, disconnect, updateBalances, setWalletModules, setPrimaryWallet] =
     useConnectWallet();
 
@@ -20,8 +20,17 @@ export const useAccount = ({env}:useAccountParams) => {
   const switchChain = async (desiredChain: number) => {
     setChain({ chainId: ethers.utils.hexValue(desiredChain) });
   };
+  /*
+  Create a new top level context provider which will hold this provider for the infura calls.
+
+  All the chat specific things will move to top level context.
+
+  All the widget specific things will move to top level context.
+  */
   const provider = useMemo(() => {
-    return wallet ? new ethers.providers.Web3Provider(wallet.provider, 'any') : new ethers.providers.JsonRpcProvider(CoreRPC[env]);
+    return wallet
+      ? new ethers.providers.Web3Provider(wallet.provider, 'any')
+      : new ethers.providers.JsonRpcProvider(CoreRPC(env));
   }, [wallet]);
 
   return {
@@ -33,7 +42,8 @@ export const useAccount = ({env}:useAccountParams) => {
     setWalletModules,
     setPrimaryWallet,
     provider,
-    account: wallet && wallet.accounts.length > 0 ? ethers.utils.getAddress(wallet.accounts[0].address) : GUEST_MODE_ACCOUNT,
+    account:
+      wallet && wallet.accounts.length > 0 ? ethers.utils.getAddress(wallet.accounts[0].address) : GUEST_MODE_ACCOUNT,
     chainId: connectedChain ? Number(connectedChain.id) : CoreContractChainId[env],
     isActive,
     setChain,
@@ -41,4 +51,4 @@ export const useAccount = ({env}:useAccountParams) => {
     settingChain,
     chains,
   };
-};
\ No newline at end of file
+};
diff --git a/packages/uiweb/src/lib/hooks/useDomainName.ts b/packages/uiweb/src/lib/hooks/useDomainName.ts
new file mode 100644
index 000000000..4f293ebd8
--- /dev/null
+++ b/packages/uiweb/src/lib/hooks/useDomainName.ts
@@ -0,0 +1,20 @@
+import { useCallback, useEffect, useState } from 'react';
+import { resolveWeb3Name } from '../helpers';
+import { ENV } from '../config';
+
+export const useDomianName = (address: string, env: ENV) => {
+  const [name, setName] = useState<string | null>(null);
+
+  const getName = useCallback(async () => {
+    const result = await resolveWeb3Name(address, env);
+    if (result) setName(result);
+  }, [address, env]);
+
+  useEffect(() => {
+    (async () => {
+      await getName();
+    })();
+  }, [address, env]);
+
+  return name;
+};
diff --git a/packages/uiweb/src/lib/hooks/useResolveWeb3Name.ts b/packages/uiweb/src/lib/hooks/useResolveWeb3Name.ts
deleted file mode 100644
index 12c2301f9..000000000
--- a/packages/uiweb/src/lib/hooks/useResolveWeb3Name.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-// React + Web3 Essentials
-import type { Env } from '@pushprotocol/restapi';
-import { ethers } from 'ethers';
-import { useContext, useEffect, useState } from 'react';
-import { ChatMainStateContext } from '../context';
-import type { ChatMainStateContextType } from '../context/chatAndNotification/chat/chatMainStateContext';
-
-// Internal Components
-
-// Internal Configs
-import { pCAIP10ToWallet, resolveWeb3Name } from '../helpers';
-
-export function useResolveWeb3Name(address: string, env: Env) {
-  const { web3NameList, setWeb3Name, selectedChatId } = useContext<ChatMainStateContextType>(ChatMainStateContext);
-
-  useEffect(() => {
-    (async () => {
-      if (address) {
-        const walletLowercase = pCAIP10ToWallet(address)?.toLowerCase();
-        const checksumWallet = ethers.utils.getAddress(walletLowercase);
-        if (ethers.utils.isAddress(checksumWallet)) {
-          try {
-            // attempt ENS name resolution first, with a fallback to Unstoppable Domains if
-            // a value is not found from ENS.
-            Object.keys(web3NameList).forEach((element) => {
-              if (web3NameList[checksumWallet.toLowerCase()]) {
-                return;
-              }
-            });
-            const result = await resolveWeb3Name(checksumWallet, env);
-            if (result) setWeb3Name(checksumWallet.toLowerCase(), result);
-          } catch (e) {
-            console.error(e);
-          }
-        }
-      }
-    })();
-  }, [address, selectedChatId]);
-}
diff --git a/packages/uiweb/src/lib/hooks/useTokenSymbolLoader.ts b/packages/uiweb/src/lib/hooks/useTokenSymbolLoader.ts
index 497887a4f..292f4f2f7 100644
--- a/packages/uiweb/src/lib/hooks/useTokenSymbolLoader.ts
+++ b/packages/uiweb/src/lib/hooks/useTokenSymbolLoader.ts
@@ -4,6 +4,7 @@ import { CATEGORY, PushData } from '../components/chat/types';
 import {
   fetchERC20Info,
   fetchERC721nfo,
+  fetchERC1155Info,
 } from '../components/chat/helpers/tokenHelpers';
 
 export const useTokenSymbolLoader = (
@@ -48,6 +49,11 @@ export const useTokenSymbolLoader = (
             if (!isErr) {
               updateTokenValue(tokenInfo);
             }
+          } else if (category === CATEGORY.ERC1155) {
+            const [isErr, tokenInfo] = await fetchERC1155Info(address, chainId, data.tokenId ?? 0);
+            if (!isErr) {
+              updateTokenValue(tokenInfo);
+            }
           }
         }
       }
@@ -61,7 +67,8 @@ const isTokenType = (conditionData: ConditionData): boolean => {
   if (conditionData.type === 'PUSH') {
     if (
       conditionData.category === CATEGORY.ERC20 ||
-      conditionData.category === CATEGORY.ERC721
+      conditionData.category === CATEGORY.ERC721 ||
+      conditionData.category === CATEGORY.ERC1155
     ) {
       if (conditionData.data) {
         return true;
diff --git a/packages/uiweb/src/lib/icons/Link.tsx b/packages/uiweb/src/lib/icons/Link.tsx
index 6b36be146..913d2c4b2 100644
--- a/packages/uiweb/src/lib/icons/Link.tsx
+++ b/packages/uiweb/src/lib/icons/Link.tsx
@@ -2,10 +2,18 @@ import React from 'react';
 
 export const LinkIcon = () => {
   return (
-    <svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
-    <path d="M9.5542 6.07818L11.1011 4.5313C11.756 3.93437 12.6158 3.61274 13.5017 3.63325C14.3876 3.65376 15.2315 4.01483 15.8581 4.64143C16.4847 5.26804 16.8458 6.11198 16.8663 6.9979C16.8868 7.88381 16.5652 8.74356 15.9683 9.39849L13.7573 11.6016C13.4387 11.9215 13.06 12.1752 12.6431 12.3484C12.2261 12.5216 11.7791 12.6107 11.3276 12.6107C10.8762 12.6107 10.4291 12.5216 10.0122 12.3484C9.59524 12.1752 9.21659 11.9215 8.89795 11.6016" stroke="#575D73" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
-    <path d="M10.4454 14.9222L8.89849 16.469C8.24356 17.066 7.38381 17.3876 6.4979 17.3671C5.61198 17.3466 4.76804 16.9855 4.14143 16.3589C3.51483 15.7323 3.15376 14.8884 3.13325 14.0024C3.11274 13.1165 3.43437 12.2568 4.0313 11.6018L6.24224 9.39872C6.56088 9.07889 6.93954 8.82511 7.35648 8.65195C7.77342 8.47879 8.22046 8.38965 8.67193 8.38965C9.1234 8.38965 9.57043 8.47879 9.98738 8.65195C10.4043 8.82511 10.783 9.07889 11.1016 9.39872" stroke="#575D73" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+    <svg
+      xmlns="http://www.w3.org/2000/svg"
+      style={{ width: 'inherit', height: 'inherit' }}
+      viewBox="0 0 18 16"
+      fill="none"
+    >
+      <path
+        d="M7.89219 12.9084L6.94656 13.8156C5.4873 15.2156 3.1694 15.1676 1.76939 13.7084C0.36937 12.2491 0.417393 9.93122 1.87665 8.5312L4.65793 5.86283C6.11718 4.46281 8.43508 4.51083 9.8351 5.97009C10.5743 6.74056 10.9098 7.7504 10.8471 8.73813M7.11786 7.18824C7.01647 8.21605 7.34626 9.27741 8.11433 10.078C9.51434 11.5372 11.8404 11.5774 13.3097 10.1678L16.1102 7.48098C17.5795 6.07131 17.6357 3.74558 16.2357 2.28633C14.8356 0.827073 12.5096 0.786878 11.0403 2.19655L10.1129 3.08631"
+        stroke="currentColor"
+        stroke-width="1.5"
+        stroke-linecap="round"
+      />
     </svg>
-    
   );
-};
\ No newline at end of file
+};
diff --git a/packages/uiweb/src/lib/icons/PushIcons.tsx b/packages/uiweb/src/lib/icons/PushIcons.tsx
index a9ffea5e4..c9c8e9743 100644
--- a/packages/uiweb/src/lib/icons/PushIcons.tsx
+++ b/packages/uiweb/src/lib/icons/PushIcons.tsx
@@ -6,19 +6,43 @@ enum ICON_COLOR {
 
 // HELPERS
 interface IconProps {
-  size: number | { width?: number; height?: number };
+  size: number | { width?: number; height?: number } | string | undefined | null;
   color?: string | ICON_COLOR;
 }
 
-const returnWSize = (size: number | { width?: number; height?: number }) => {
+const returnWSize = (size: number | { width?: number; height?: number } | string | undefined | null) => {
+  if (typeof size === 'string') {
+    size = parseInt(size);
+  }
+
+  if (typeof size === 'undefined' || size === null) {
+    return '100%';
+  }
+
   return typeof size === 'number' ? size.toString() : size.width ? size.width.toString() : '100%';
 };
 
-const returnHSize = (size: number | { width?: number; height?: number }) => {
+const returnHSize = (size: number | { width?: number; height?: number } | string | undefined | null) => {
+  if (typeof size === 'string') {
+    size = parseInt(size);
+  }
+
+  if (typeof size === 'undefined' || size === null) {
+    return '100%';
+  }
+
   return typeof size === 'number' ? size.toString() : size.height ? size.height.toString() : '100%';
 };
 
-const returnViewBox = (size: number | { width?: number; height?: number }, ratio = 1) => {
+const returnViewBox = (size: number | { width?: number; height?: number } | string | undefined | null, ratio = 1) => {
+  if (typeof size === 'string') {
+    size = parseInt(size);
+  }
+
+  if (typeof size === 'undefined' || size === null) {
+    size = 20; // default viewport size
+  }
+
   if (typeof size === 'number') {
     return `0 0 ${size * ratio} ${size * ratio}`;
   } else if (size.width && size.height) {
@@ -226,24 +250,25 @@ export const EmojiCircleIcon: React.FC<IconProps> = ({ size, color }) => {
 export const ReplyIcon: React.FC<IconProps> = ({ size, color }) => {
   return (
     <svg
-      fill="none"
       width={returnWSize(size)}
       height={returnHSize(size)}
-      viewBox={returnViewBox(48)}
+      viewBox="0 0 48 48"
       xmlns="http://www.w3.org/2000/svg"
+      fill="none"
     >
-      <path
-        d="m0 0h48v48h-48z"
-        fill={color}
+      <rect
+        width="48"
+        height="48"
+        fill="none"
       />
       <g
         stroke={color}
-        stroke-linecap="round"
-        stroke-linejoin="round"
-        stroke-width="4"
+        strokeLinecap="round"
+        strokeLinejoin="round"
+        strokeWidth="4"
       >
-        <path d="m12.3638 8-6.36399 6.364 6.36399 6.3639" />
-        <path d="m6 14.364h22.6722c6.8848 0 12.54 5.4388 12.8083 12.3184.2836 7.2696-5.5331 13.3176-12.8083 13.3176h-16.6722" />
+        <path d="M12.364 8L6 14.364 12.364 20.728" />
+        <path d="M6 14.364H28.672c6.885 0 12.54 5.439 12.808 12.318.284 7.27-5.533 13.318-12.808 13.318H12" />
       </g>
     </svg>
   );
diff --git a/packages/uiweb/src/lib/utilities/time.ts b/packages/uiweb/src/lib/utilities/time.ts
index f10fe7341..8fec4f5ce 100644
--- a/packages/uiweb/src/lib/utilities/time.ts
+++ b/packages/uiweb/src/lib/utilities/time.ts
@@ -1,34 +1,41 @@
-import { format } from "date-fns";
 import { FormatBody } from './formatbody';
+import moment from 'moment';
 
 /**
  * @description parse and extract the timestamp from the body of the notification and remove the text from the body
  * @param notificationBody the text which would represent the body of the notification
  * @returns
  */
- export function extractTimeStamp(notificationBody: string): {
-    notificationBody: string;
-    timeStamp: string;
-    originalBody: string;
-  } {
-    const parsedBody = {
-      notificationBody: FormatBody(notificationBody),
-      timeStamp: "",
-      originalBody: notificationBody,
-    };
-    const matches = notificationBody.match(/\[timestamp:(.*?)\]/);
-    if (matches) {
-      parsedBody.timeStamp = matches[1];
-      const textWithoutTimeStamp = notificationBody.replace(
-        / *\[timestamp:[^)]*\] */g,
-        ""
-      );
-      parsedBody.notificationBody = FormatBody(textWithoutTimeStamp);
-      parsedBody.originalBody = textWithoutTimeStamp;
-    }
-    return parsedBody;
+export function extractTimeStamp(notificationBody: string): {
+  notificationBody: string;
+  timeStamp: string;
+  originalBody: string;
+} {
+  const parsedBody = {
+    notificationBody: FormatBody(notificationBody),
+    timeStamp: '',
+    originalBody: notificationBody,
+  };
+  const matches = notificationBody.match(/\[timestamp:(.*?)\]/);
+  if (matches) {
+    parsedBody.timeStamp = matches[1];
+    const textWithoutTimeStamp = notificationBody.replace(/ *\[timestamp:[^)]*\] */g, '');
+    parsedBody.notificationBody = FormatBody(textWithoutTimeStamp);
+    parsedBody.originalBody = textWithoutTimeStamp;
   }
-  
-  export function convertTimeStamp(timeStamp: string) {
-    return format(new Date(Number(timeStamp) * 1000), 'dd MMM yyyy | hh:mm a')
-  }
\ No newline at end of file
+  return parsedBody;
+}
+
+export function convertTimeStamp(timeStamp: string) {
+  const date = moment.unix(Number(timeStamp));
+
+  if (moment().isSame(date, 'day')) {
+    return `Today | ${date.format('hh:mm A')}`;
+  } else if (moment().subtract(1, 'days').isSame(date, 'day')) {
+    return `Yesterday | ${date.format('hh:mm A')}`;
+  } else if (moment().add(1, 'days').isSame(date, 'day')) {
+    return `Tomorrow | ${date.format('hh:mm A')}`;
+  } else {
+    return date.format('DD MMM YYYY | hh:mm A');
+  }
+}
diff --git a/packages/uiweb/yarn.lock b/packages/uiweb/yarn.lock
index 5f8fe6817..33beaf186 100644
--- a/packages/uiweb/yarn.lock
+++ b/packages/uiweb/yarn.lock
@@ -13,18 +13,18 @@ __metadata:
   linkType: hard
 
 "@adraffy/ens-normalize@npm:^1.10.0":
-  version: 1.10.1
-  resolution: "@adraffy/ens-normalize@npm:1.10.1"
-  checksum: 10c0/fdd647604e8fac6204921888aaf5a6bc65eabf0d2921bc5f93b64d01f4bc33ead167c1445f7de05468d05cd92ac31b74c68d2be840c62b79d73693308f885c06
+  version: 1.11.0
+  resolution: "@adraffy/ens-normalize@npm:1.11.0"
+  checksum: 10c0/5111d0f1a273468cb5661ed3cf46ee58de8f32f84e2ebc2365652e66c1ead82649df94c736804e2b9cfa831d30ef24e1cc3575d970dbda583416d3a98d8870a6
   languageName: node
   linkType: hard
 
 "@babel/runtime@npm:^7.10.4, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.3.1":
-  version: 7.24.7
-  resolution: "@babel/runtime@npm:7.24.7"
+  version: 7.25.7
+  resolution: "@babel/runtime@npm:7.25.7"
   dependencies:
     regenerator-runtime: "npm:^0.14.0"
-  checksum: 10c0/b6fa3ec61a53402f3c1d75f4d808f48b35e0dfae0ec8e2bb5c6fc79fb95935da75766e0ca534d0f1c84871f6ae0d2ebdd950727cfadb745a2cdbef13faef5513
+  checksum: 10c0/86b7829d2fc9343714a9afe92757cf96c4dc799006ca61d73cda62f4b9e29bfa1ce36794955bc6cb4c188f5b10db832c949339895e1bbe81a69022d9d578ce29
   languageName: node
   linkType: hard
 
@@ -642,12 +642,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@floating-ui/core@npm:^1.0.0, @floating-ui/core@npm:^1.5.3":
-  version: 1.6.2
-  resolution: "@floating-ui/core@npm:1.6.2"
+"@floating-ui/core@npm:^1.5.3, @floating-ui/core@npm:^1.6.0":
+  version: 1.6.8
+  resolution: "@floating-ui/core@npm:1.6.8"
   dependencies:
-    "@floating-ui/utils": "npm:^0.2.0"
-  checksum: 10c0/db2621dc682e7f043d6f118d087ae6a6bfdacf40b26ede561760dd53548c16e2e7c59031e013e37283801fa307b55e6de65bf3b316b96a054e4a6a7cb937c59e
+    "@floating-ui/utils": "npm:^0.2.8"
+  checksum: 10c0/d6985462aeccae7b55a2d3f40571551c8c42bf820ae0a477fc40ef462e33edc4f3f5b7f11b100de77c9b58ecb581670c5c3f46d0af82b5e30aa185c735257eb9
   languageName: node
   linkType: hard
 
@@ -662,31 +662,31 @@ __metadata:
   linkType: hard
 
 "@floating-ui/dom@npm:^1.0.0":
-  version: 1.6.5
-  resolution: "@floating-ui/dom@npm:1.6.5"
+  version: 1.6.11
+  resolution: "@floating-ui/dom@npm:1.6.11"
   dependencies:
-    "@floating-ui/core": "npm:^1.0.0"
-    "@floating-ui/utils": "npm:^0.2.0"
-  checksum: 10c0/ebdc14806f786e60df8e7cc2c30bf9cd4d75fe734f06d755588bbdef2f60d0a0f21dffb14abdc58dea96e5577e2e366feca6d66ba962018efd1bc91a3ece4526
+    "@floating-ui/core": "npm:^1.6.0"
+    "@floating-ui/utils": "npm:^0.2.8"
+  checksum: 10c0/02ef34a75a515543c772880338eea7b66724997bd5ec7cd58d26b50325709d46d480a306b84e7d5509d734434411a4bcf23af5680c2e461e6e6a8bf45d751df8
   languageName: node
   linkType: hard
 
 "@floating-ui/react-dom@npm:^2.0.0":
-  version: 2.1.0
-  resolution: "@floating-ui/react-dom@npm:2.1.0"
+  version: 2.1.2
+  resolution: "@floating-ui/react-dom@npm:2.1.2"
   dependencies:
     "@floating-ui/dom": "npm:^1.0.0"
   peerDependencies:
     react: ">=16.8.0"
     react-dom: ">=16.8.0"
-  checksum: 10c0/9ee44dfeb27f585fb1e0114cbe37c72ff5d34149900f4f3013f6b0abf8c3365eab13286c360f97fbe0c44bb91a745e7a4c18b82d111990b45a7a7796dc55e461
+  checksum: 10c0/e855131c74e68cab505f7f44f92cd4e2efab1c125796db3116c54c0859323adae4bf697bf292ee83ac77b9335a41ad67852193d7aeace90aa2e1c4a640cafa60
   languageName: node
   linkType: hard
 
-"@floating-ui/utils@npm:^0.2.0":
-  version: 0.2.2
-  resolution: "@floating-ui/utils@npm:0.2.2"
-  checksum: 10c0/b2becdcafdf395af1641348da0031ff1eaad2bc60c22e14bd3abad4acfe2c8401e03097173d89a2f646a99b75819a78ef21ebb2572cab0042a56dd654b0065cd
+"@floating-ui/utils@npm:^0.2.0, @floating-ui/utils@npm:^0.2.8":
+  version: 0.2.8
+  resolution: "@floating-ui/utils@npm:0.2.8"
+  checksum: 10c0/a8cee5f17406c900e1c3ef63e3ca89b35e7a2ed645418459a73627b93b7377477fc888081011c6cd177cac45ec2b92a6cab018c14ea140519465498dddd2d3f9
   languageName: node
   linkType: hard
 
@@ -770,9 +770,9 @@ __metadata:
   linkType: hard
 
 "@lit-labs/ssr-dom-shim@npm:^1.0.0, @lit-labs/ssr-dom-shim@npm:^1.1.0":
-  version: 1.2.0
-  resolution: "@lit-labs/ssr-dom-shim@npm:1.2.0"
-  checksum: 10c0/016168cf6901ab343462c13fb168dda6d549f8b42680aa394e6b7cd0af7cce51271e00dbfa5bbbe388912bf89cbb8f941a21cc3ec9bf95d6a84b6241aa9e5a72
+  version: 1.2.1
+  resolution: "@lit-labs/ssr-dom-shim@npm:1.2.1"
+  checksum: 10c0/75cecf2cc4c1a089c6984d9f45b8264e3b4947b4ebed96aef7eb201bd6b3f26caeaafedf457884ac38d4f2d99cddaf94a4b2414c02c61fbf1f64c0a0dade11f4
   languageName: node
   linkType: hard
 
@@ -818,9 +818,9 @@ __metadata:
   linkType: hard
 
 "@livekit/components-styles@npm:^1.0.6":
-  version: 1.0.12
-  resolution: "@livekit/components-styles@npm:1.0.12"
-  checksum: 10c0/b6cc2f471468e5300243edbd56e036118e61d68418ca2396bb9869dc5e38f22e91bd81561dab9370a114ad6ec23302e055f02d017cd4da7033c85c151126c254
+  version: 1.1.3
+  resolution: "@livekit/components-styles@npm:1.1.3"
+  checksum: 10c0/f80bdf4c1314016bfeb8f1ac9eeb2d268ce58ae4722e23c703d7919e5cf6616605da2709bbe3ecf910c6695ad65a89b49f933542698e353ead4ea7f412eefd61
   languageName: node
   linkType: hard
 
@@ -1257,7 +1257,7 @@ __metadata:
     "@livepeer/react": "npm:^2.6.0"
     "@pushprotocol/socket": "npm:^0.5.0"
     "@unstoppabledomains/resolution": "npm:^8.5.0"
-    "@web3-name-sdk/core": "npm:^0.1.15"
+    "@web3-name-sdk/core": "npm:^0.2.0"
     "@web3-onboard/coinbase": "npm:^2.2.5"
     "@web3-onboard/core": "npm:^2.21.1"
     "@web3-onboard/injected-wallets": "npm:^2.10.5"
@@ -1285,7 +1285,7 @@ __metadata:
     react-twitter-embed: "npm:^4.0.4"
     uuid: "npm:^9.0.1"
   peerDependencies:
-    "@pushprotocol/restapi": 1.7.19
+    "@pushprotocol/restapi": 1.7.25
     "@pushprotocol/socket": ^0.5.0
     react: ">=16.8.0"
     styled-components: ^6.0.8
@@ -1435,24 +1435,37 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@radix-ui/react-dialog@npm:^1.0.4":
+"@radix-ui/react-context@npm:1.1.1":
   version: 1.1.1
-  resolution: "@radix-ui/react-dialog@npm:1.1.1"
+  resolution: "@radix-ui/react-context@npm:1.1.1"
+  peerDependencies:
+    "@types/react": "*"
+    react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+  peerDependenciesMeta:
+    "@types/react":
+      optional: true
+  checksum: 10c0/fc4ace9d79d7954c715ade765e06c95d7e1b12a63a536bcbe842fb904f03f88fc5bd6e38d44bd23243d37a270b4c44380fedddaeeae2d274f0b898a20665aba2
+  languageName: node
+  linkType: hard
+
+"@radix-ui/react-dialog@npm:^1.0.4":
+  version: 1.1.2
+  resolution: "@radix-ui/react-dialog@npm:1.1.2"
   dependencies:
     "@radix-ui/primitive": "npm:1.1.0"
     "@radix-ui/react-compose-refs": "npm:1.1.0"
-    "@radix-ui/react-context": "npm:1.1.0"
-    "@radix-ui/react-dismissable-layer": "npm:1.1.0"
-    "@radix-ui/react-focus-guards": "npm:1.1.0"
+    "@radix-ui/react-context": "npm:1.1.1"
+    "@radix-ui/react-dismissable-layer": "npm:1.1.1"
+    "@radix-ui/react-focus-guards": "npm:1.1.1"
     "@radix-ui/react-focus-scope": "npm:1.1.0"
     "@radix-ui/react-id": "npm:1.1.0"
-    "@radix-ui/react-portal": "npm:1.1.1"
-    "@radix-ui/react-presence": "npm:1.1.0"
+    "@radix-ui/react-portal": "npm:1.1.2"
+    "@radix-ui/react-presence": "npm:1.1.1"
     "@radix-ui/react-primitive": "npm:2.0.0"
     "@radix-ui/react-slot": "npm:1.1.0"
     "@radix-ui/react-use-controllable-state": "npm:1.1.0"
     aria-hidden: "npm:^1.1.1"
-    react-remove-scroll: "npm:2.5.7"
+    react-remove-scroll: "npm:2.6.0"
   peerDependencies:
     "@types/react": "*"
     "@types/react-dom": "*"
@@ -1463,7 +1476,7 @@ __metadata:
       optional: true
     "@types/react-dom":
       optional: true
-  checksum: 10c0/a21e318e8d45bed22067880f66beb4ea91118a6c0d43aa20de495c0373b53c12dfe28f58196d5b33300573a5e24e064ec53648a576f02366fb5a297d887b0860
+  checksum: 10c0/61997c23605ff604ef1673480eea0b63cbe2e102d24e64b71431afa408bfdda26f879193c09254304eb17a8d623085a2e6c96b5c944658c02bd935f8cf0f9546
   languageName: node
   linkType: hard
 
@@ -1506,9 +1519,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@radix-ui/react-dismissable-layer@npm:1.1.0":
-  version: 1.1.0
-  resolution: "@radix-ui/react-dismissable-layer@npm:1.1.0"
+"@radix-ui/react-dismissable-layer@npm:1.1.1":
+  version: 1.1.1
+  resolution: "@radix-ui/react-dismissable-layer@npm:1.1.1"
   dependencies:
     "@radix-ui/primitive": "npm:1.1.0"
     "@radix-ui/react-compose-refs": "npm:1.1.0"
@@ -1525,7 +1538,7 @@ __metadata:
       optional: true
     "@types/react-dom":
       optional: true
-  checksum: 10c0/72967068ab02127b668ecfd0a1863149e2a42d9fd12d3247f51422a41f3d5faa82a147a5b0a8a6ec609eff8fe6baede6fb7d6111f76896656d13567e3ec29ba8
+  checksum: 10c0/637f8d55437bd2269d5aa9fa48e869eade31082cd950b5efcc5f0d9ed016b46feb7fcfcc115ba9972dba68c4686b57873d84aca67ece76ab77463e7de995f6da
   languageName: node
   linkType: hard
 
@@ -1544,16 +1557,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@radix-ui/react-focus-guards@npm:1.1.0":
-  version: 1.1.0
-  resolution: "@radix-ui/react-focus-guards@npm:1.1.0"
+"@radix-ui/react-focus-guards@npm:1.1.1":
+  version: 1.1.1
+  resolution: "@radix-ui/react-focus-guards@npm:1.1.1"
   peerDependencies:
     "@types/react": "*"
     react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
   peerDependenciesMeta:
     "@types/react":
       optional: true
-  checksum: 10c0/23af9ff17244568db9b2e99ae6e5718747a4b656bf12b1b15b0d3adca407988641a930612eca35a61b7e15d1ce312b3db13ea95999fa31ae641aaaac1e325df8
+  checksum: 10c0/2e99750ca593083a530542a185d656b45b100752353a7a193a67566e3c256414a76fa9171d152f8c0167b8d6c1fdf62b2e07750d7af2974bf8ef39eb204aa537
   languageName: node
   linkType: hard
 
@@ -1632,24 +1645,24 @@ __metadata:
   linkType: hard
 
 "@radix-ui/react-popover@npm:^1.0.6":
-  version: 1.1.1
-  resolution: "@radix-ui/react-popover@npm:1.1.1"
+  version: 1.1.2
+  resolution: "@radix-ui/react-popover@npm:1.1.2"
   dependencies:
     "@radix-ui/primitive": "npm:1.1.0"
     "@radix-ui/react-compose-refs": "npm:1.1.0"
-    "@radix-ui/react-context": "npm:1.1.0"
-    "@radix-ui/react-dismissable-layer": "npm:1.1.0"
-    "@radix-ui/react-focus-guards": "npm:1.1.0"
+    "@radix-ui/react-context": "npm:1.1.1"
+    "@radix-ui/react-dismissable-layer": "npm:1.1.1"
+    "@radix-ui/react-focus-guards": "npm:1.1.1"
     "@radix-ui/react-focus-scope": "npm:1.1.0"
     "@radix-ui/react-id": "npm:1.1.0"
     "@radix-ui/react-popper": "npm:1.2.0"
-    "@radix-ui/react-portal": "npm:1.1.1"
-    "@radix-ui/react-presence": "npm:1.1.0"
+    "@radix-ui/react-portal": "npm:1.1.2"
+    "@radix-ui/react-presence": "npm:1.1.1"
     "@radix-ui/react-primitive": "npm:2.0.0"
     "@radix-ui/react-slot": "npm:1.1.0"
     "@radix-ui/react-use-controllable-state": "npm:1.1.0"
     aria-hidden: "npm:^1.1.1"
-    react-remove-scroll: "npm:2.5.7"
+    react-remove-scroll: "npm:2.6.0"
   peerDependencies:
     "@types/react": "*"
     "@types/react-dom": "*"
@@ -1660,7 +1673,7 @@ __metadata:
       optional: true
     "@types/react-dom":
       optional: true
-  checksum: 10c0/4539082143c6c006727cf4a6300479f3dd912e85291d5ed7f084d8a7730acc3b5f6589925ab70eca025d3c78026f52f99c0155e11a35de37fe26b8078e6802b3
+  checksum: 10c0/d8fb4e3507a3cd6168bdbb6b840fb8eb538b3b1ce62192a1dcc4e8e4947fbf082c437c0ad5f6faed078006dcb7073867e493378d04c50372c6ea826c5a811f2c
   languageName: node
   linkType: hard
 
@@ -1741,9 +1754,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@radix-ui/react-portal@npm:1.1.1":
-  version: 1.1.1
-  resolution: "@radix-ui/react-portal@npm:1.1.1"
+"@radix-ui/react-portal@npm:1.1.2":
+  version: 1.1.2
+  resolution: "@radix-ui/react-portal@npm:1.1.2"
   dependencies:
     "@radix-ui/react-primitive": "npm:2.0.0"
     "@radix-ui/react-use-layout-effect": "npm:1.1.0"
@@ -1757,13 +1770,13 @@ __metadata:
       optional: true
     "@types/react-dom":
       optional: true
-  checksum: 10c0/7e7130fcb0d99197322cd97987e1d7279b6c264fb6be3d883cbfcd49267740d83ca17b431e0d98848afd6067a13ee823ca396a8b63ae68f18a728cf70398c830
+  checksum: 10c0/836967330893b16b85371775ed1a59e038ce99189f4851cfa976bde2710d704c2a9e49e0a5206e7ac3fcf8a67ddd2d126b8352a88f295d6ef49d04e269736ed1
   languageName: node
   linkType: hard
 
-"@radix-ui/react-presence@npm:1.1.0":
-  version: 1.1.0
-  resolution: "@radix-ui/react-presence@npm:1.1.0"
+"@radix-ui/react-presence@npm:1.1.1":
+  version: 1.1.1
+  resolution: "@radix-ui/react-presence@npm:1.1.1"
   dependencies:
     "@radix-ui/react-compose-refs": "npm:1.1.0"
     "@radix-ui/react-use-layout-effect": "npm:1.1.0"
@@ -1777,7 +1790,7 @@ __metadata:
       optional: true
     "@types/react-dom":
       optional: true
-  checksum: 10c0/58acb658b15b72991ad7a234ea90995902c470b3a182aa90ad03145cbbeaa40f211700c444bfa14cf47537cbb6b732e1359bc5396182de839bd680843c11bf31
+  checksum: 10c0/777cda0406450ff5ca0e49235e486237723323d046a3382e35a0e78eededccfc95a76a9b5fecd7404dac793264762f4bc10111af1e08f8cc2d4d571d7971220e
   languageName: node
   linkType: hard
 
@@ -2132,9 +2145,9 @@ __metadata:
   linkType: hard
 
 "@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2":
-  version: 1.1.7
-  resolution: "@scure/base@npm:1.1.7"
-  checksum: 10c0/2d06aaf39e6de4b9640eb40d2e5419176ebfe911597856dcbf3bc6209277ddb83f4b4b02cb1fd1208f819654268ec083da68111d3530bbde07bae913e2fc2e5d
+  version: 1.1.9
+  resolution: "@scure/base@npm:1.1.9"
+  checksum: 10c0/77a06b9a2db8144d22d9bf198338893d77367c51b58c72b99df990c0a11f7cadd066d4102abb15e3ca6798d1529e3765f55c4355742465e49aed7a0c01fe76e8
   languageName: node
   linkType: hard
 
@@ -2440,11 +2453,11 @@ __metadata:
   linkType: hard
 
 "@types/node@npm:>=13.7.0":
-  version: 20.14.7
-  resolution: "@types/node@npm:20.14.7"
+  version: 22.7.5
+  resolution: "@types/node@npm:22.7.5"
   dependencies:
-    undici-types: "npm:~5.26.4"
-  checksum: 10c0/6211ffe86f769a58617e3bdca58610256021ef54bd99d2c442ee6109196cd6ee8e0bcd1cfac0e39bf4bb353f8900fa5fae540485a03816bd91ad1f86a0e18512
+    undici-types: "npm:~6.19.2"
+  checksum: 10c0/cf11f74f1a26053ec58066616e3a8685b6bcd7259bc569738b8f752009f9f0f7f85a1b2d24908e5b0f752482d1e8b6babdf1fbb25758711ec7bb9500bfcd6e60
   languageName: node
   linkType: hard
 
@@ -2463,9 +2476,9 @@ __metadata:
   linkType: hard
 
 "@types/unist@npm:^2":
-  version: 2.0.10
-  resolution: "@types/unist@npm:2.0.10"
-  checksum: 10c0/5f247dc2229944355209ad5c8e83cfe29419fa7f0a6d557421b1985a1500444719cc9efcc42c652b55aab63c931813c88033e0202c1ac684bcd4829d66e44731
+  version: 2.0.11
+  resolution: "@types/unist@npm:2.0.11"
+  checksum: 10c0/24dcdf25a168f453bb70298145eb043cfdbb82472db0bc0b56d6d51cd2e484b9ed8271d4ac93000a80da568f2402e9339723db262d0869e2bf13bc58e081768d
   languageName: node
   linkType: hard
 
@@ -2482,9 +2495,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@walletconnect/core@npm:2.13.3":
-  version: 2.13.3
-  resolution: "@walletconnect/core@npm:2.13.3"
+"@walletconnect/core@npm:2.17.0":
+  version: 2.17.0
+  resolution: "@walletconnect/core@npm:2.17.0"
   dependencies:
     "@walletconnect/heartbeat": "npm:1.2.2"
     "@walletconnect/jsonrpc-provider": "npm:1.0.14"
@@ -2493,17 +2506,16 @@ __metadata:
     "@walletconnect/jsonrpc-ws-connection": "npm:1.0.14"
     "@walletconnect/keyvaluestorage": "npm:1.1.1"
     "@walletconnect/logger": "npm:2.1.2"
-    "@walletconnect/relay-api": "npm:1.0.10"
+    "@walletconnect/relay-api": "npm:1.0.11"
     "@walletconnect/relay-auth": "npm:1.0.4"
     "@walletconnect/safe-json": "npm:1.0.2"
     "@walletconnect/time": "npm:1.0.2"
-    "@walletconnect/types": "npm:2.13.3"
-    "@walletconnect/utils": "npm:2.13.3"
+    "@walletconnect/types": "npm:2.17.0"
+    "@walletconnect/utils": "npm:2.17.0"
     events: "npm:3.3.0"
-    isomorphic-unfetch: "npm:3.1.0"
     lodash.isequal: "npm:4.5.0"
     uint8arrays: "npm:3.1.0"
-  checksum: 10c0/1f2ce950997330e89f2a773291426cb3cfe994227300ee74c683f6af282ac5069689406bf05ad752d443024802d570a2ae2f93b65e45439849453734122936c9
+  checksum: 10c0/34ae5b9b68c08c1dd3ebb2a6ebff8697307e76fbfe4d6b51d5d090da5cd1613e1c66fa5ac3a87c914333458d7b5bf075bb664292f6b2c7d438c72f706d87416d
   languageName: node
   linkType: hard
 
@@ -2517,20 +2529,20 @@ __metadata:
   linkType: hard
 
 "@walletconnect/ethereum-provider@npm:^2.13.0":
-  version: 2.13.3
-  resolution: "@walletconnect/ethereum-provider@npm:2.13.3"
+  version: 2.17.0
+  resolution: "@walletconnect/ethereum-provider@npm:2.17.0"
   dependencies:
     "@walletconnect/jsonrpc-http-connection": "npm:1.0.8"
     "@walletconnect/jsonrpc-provider": "npm:1.0.14"
     "@walletconnect/jsonrpc-types": "npm:1.0.4"
     "@walletconnect/jsonrpc-utils": "npm:1.0.8"
-    "@walletconnect/modal": "npm:2.6.2"
-    "@walletconnect/sign-client": "npm:2.13.3"
-    "@walletconnect/types": "npm:2.13.3"
-    "@walletconnect/universal-provider": "npm:2.13.3"
-    "@walletconnect/utils": "npm:2.13.3"
+    "@walletconnect/modal": "npm:2.7.0"
+    "@walletconnect/sign-client": "npm:2.17.0"
+    "@walletconnect/types": "npm:2.17.0"
+    "@walletconnect/universal-provider": "npm:2.17.0"
+    "@walletconnect/utils": "npm:2.17.0"
     events: "npm:3.3.0"
-  checksum: 10c0/38fdde20f887fc9d8e28edc5e5e00734a89490ec90d531b7f2f176462901517d68979503b2f5547b5822f82f1629eff39541a053c41b8ffe0ff679c3a97a261a
+  checksum: 10c0/b046a9c296e95b22841f0b2efd28a4ce1a38529a9ba412d3c8ffc482879d79c3d2a24b8c0ec712baecf781938b4321ab5c1ecad5573d078add7c47b0cfd08a25
   languageName: node
   linkType: hard
 
@@ -2637,43 +2649,43 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@walletconnect/modal-core@npm:2.6.2":
-  version: 2.6.2
-  resolution: "@walletconnect/modal-core@npm:2.6.2"
+"@walletconnect/modal-core@npm:2.7.0":
+  version: 2.7.0
+  resolution: "@walletconnect/modal-core@npm:2.7.0"
   dependencies:
     valtio: "npm:1.11.2"
-  checksum: 10c0/5e3fb21a1fc923ec0d2a3e33cc360e3d56278a211609d5fd4cc4d6e3b4f1acb40b9783fcc771b259b78c7e731af3862def096aa1da2e210e7859729808304c94
+  checksum: 10c0/84b11735c005e37e661aa0f08b2e8c8098db3b2cacd957c4a73f4d3de11b2d5e04dd97ab970f8d22fc3e8269fea3297b9487e177343bbab8dd69b3b917fb7f60
   languageName: node
   linkType: hard
 
-"@walletconnect/modal-ui@npm:2.6.2":
-  version: 2.6.2
-  resolution: "@walletconnect/modal-ui@npm:2.6.2"
+"@walletconnect/modal-ui@npm:2.7.0":
+  version: 2.7.0
+  resolution: "@walletconnect/modal-ui@npm:2.7.0"
   dependencies:
-    "@walletconnect/modal-core": "npm:2.6.2"
+    "@walletconnect/modal-core": "npm:2.7.0"
     lit: "npm:2.8.0"
     motion: "npm:10.16.2"
     qrcode: "npm:1.5.3"
-  checksum: 10c0/5d8f0a2703b9757dfa48ad3e48a40e64608f6a28db31ec93a2f10e942dcc5ee986c03ffdab94018e905836d339131fc928bc14614a94943011868cdddc36a32a
+  checksum: 10c0/b717f1fc9854b7d14a4364720fce2d44167f547533340704644ed2fdf9d861b3798ffd19a3b51062a366a8bc39f84b9a8bb3dd04e9e33da742192359be00b051
   languageName: node
   linkType: hard
 
-"@walletconnect/modal@npm:2.6.2":
-  version: 2.6.2
-  resolution: "@walletconnect/modal@npm:2.6.2"
+"@walletconnect/modal@npm:2.7.0":
+  version: 2.7.0
+  resolution: "@walletconnect/modal@npm:2.7.0"
   dependencies:
-    "@walletconnect/modal-core": "npm:2.6.2"
-    "@walletconnect/modal-ui": "npm:2.6.2"
-  checksum: 10c0/1cc309f63d061e49fdf7b10d28093d7ef1a47f4624f717f8fd3bf6097ac3b00cea4acc45c50e8bd386d4bcfdf10f4dcba960f7129c557b9dc42ef7d05b970807
+    "@walletconnect/modal-core": "npm:2.7.0"
+    "@walletconnect/modal-ui": "npm:2.7.0"
+  checksum: 10c0/2f3074eebbca41a46e29680dc2565bc762133508774f05db0075a82b0b66ecc8defca40a94ad63669676090a7e3ef671804592b10e91636ab1cdeac014a1eb11
   languageName: node
   linkType: hard
 
-"@walletconnect/relay-api@npm:1.0.10":
-  version: 1.0.10
-  resolution: "@walletconnect/relay-api@npm:1.0.10"
+"@walletconnect/relay-api@npm:1.0.11":
+  version: 1.0.11
+  resolution: "@walletconnect/relay-api@npm:1.0.11"
   dependencies:
     "@walletconnect/jsonrpc-types": "npm:^1.0.2"
-  checksum: 10c0/2709bbe45f60579cd2e1c74b0fd03c36ea409cd8a9117e00a7485428d0c9ba7eb02e525c21e5286db2b6ce563b1d29053b0249c2ed95f8adcf02b11e54f61fcd
+  checksum: 10c0/2595d7e68d3a93e7735e0b6204811762898b0ce1466e811d78be5bcec7ac1cde5381637615a99104099165bf63695da5ef9381d6ded29924a57a71b10712a91d
   languageName: node
   linkType: hard
 
@@ -2700,20 +2712,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@walletconnect/sign-client@npm:2.13.3":
-  version: 2.13.3
-  resolution: "@walletconnect/sign-client@npm:2.13.3"
+"@walletconnect/sign-client@npm:2.17.0":
+  version: 2.17.0
+  resolution: "@walletconnect/sign-client@npm:2.17.0"
   dependencies:
-    "@walletconnect/core": "npm:2.13.3"
+    "@walletconnect/core": "npm:2.17.0"
     "@walletconnect/events": "npm:1.0.1"
     "@walletconnect/heartbeat": "npm:1.2.2"
     "@walletconnect/jsonrpc-utils": "npm:1.0.8"
     "@walletconnect/logger": "npm:2.1.2"
     "@walletconnect/time": "npm:1.0.2"
-    "@walletconnect/types": "npm:2.13.3"
-    "@walletconnect/utils": "npm:2.13.3"
+    "@walletconnect/types": "npm:2.17.0"
+    "@walletconnect/utils": "npm:2.17.0"
     events: "npm:3.3.0"
-  checksum: 10c0/da3139931162fe62ddcb7d7c390dc297f37192e5fb5a01e406faac6670110347ea2586b65aa6c4abc076daca04cfc38ba2c009f2e969410c20cf0df42f50afe2
+  checksum: 10c0/48f7d13b3db49584a40dc2653f49fabadd100a324e2213476b8d9e4d6fe0808a08ae14103d2e5b609abff3115197003d8570d606275dbd0f6774d0d49da10c61
   languageName: node
   linkType: hard
 
@@ -2726,9 +2738,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@walletconnect/types@npm:2.13.3":
-  version: 2.13.3
-  resolution: "@walletconnect/types@npm:2.13.3"
+"@walletconnect/types@npm:2.17.0":
+  version: 2.17.0
+  resolution: "@walletconnect/types@npm:2.17.0"
   dependencies:
     "@walletconnect/events": "npm:1.0.1"
     "@walletconnect/heartbeat": "npm:1.2.2"
@@ -2736,46 +2748,48 @@ __metadata:
     "@walletconnect/keyvaluestorage": "npm:1.1.1"
     "@walletconnect/logger": "npm:2.1.2"
     events: "npm:3.3.0"
-  checksum: 10c0/b12e92e39fa2fd9dbdfbef62265c7f5e5aa1d824b6db68ea5ce4fa9ed56c9fcdf6d93fbc6ffeb57169cff4082d475899739377b91f2b13f5209c8ccb66c47d6e
+  checksum: 10c0/bdc0c062da1edb4410882d9cfca1bb30eb0afd7caea90d5e7a66eaf15e28380e9ef97635cd5e5a017947f4c814c1f780622b4d8946b11a335d415ae066ec7ade
   languageName: node
   linkType: hard
 
-"@walletconnect/universal-provider@npm:2.13.3":
-  version: 2.13.3
-  resolution: "@walletconnect/universal-provider@npm:2.13.3"
+"@walletconnect/universal-provider@npm:2.17.0":
+  version: 2.17.0
+  resolution: "@walletconnect/universal-provider@npm:2.17.0"
   dependencies:
     "@walletconnect/jsonrpc-http-connection": "npm:1.0.8"
     "@walletconnect/jsonrpc-provider": "npm:1.0.14"
     "@walletconnect/jsonrpc-types": "npm:1.0.4"
     "@walletconnect/jsonrpc-utils": "npm:1.0.8"
     "@walletconnect/logger": "npm:2.1.2"
-    "@walletconnect/sign-client": "npm:2.13.3"
-    "@walletconnect/types": "npm:2.13.3"
-    "@walletconnect/utils": "npm:2.13.3"
+    "@walletconnect/sign-client": "npm:2.17.0"
+    "@walletconnect/types": "npm:2.17.0"
+    "@walletconnect/utils": "npm:2.17.0"
     events: "npm:3.3.0"
-  checksum: 10c0/b1e071bf84ff62e3dd97575eb7881e4746578b83f0d55e5710dd7133c561751cbed0086946943c523689e5f462022fdfe4c809c0cd253ac8a827a513ce307eda
+  checksum: 10c0/7c1afc79054db5add4e937d7adaadb4fc26aecffb5d749d388418fa5d4eb153807ab4de301b642cd80669b4e5c6bcae917f18cf5ce8696d87da8b3705b60d1ec
   languageName: node
   linkType: hard
 
-"@walletconnect/utils@npm:2.13.3":
-  version: 2.13.3
-  resolution: "@walletconnect/utils@npm:2.13.3"
+"@walletconnect/utils@npm:2.17.0":
+  version: 2.17.0
+  resolution: "@walletconnect/utils@npm:2.17.0"
   dependencies:
     "@stablelib/chacha20poly1305": "npm:1.0.1"
     "@stablelib/hkdf": "npm:1.0.1"
     "@stablelib/random": "npm:1.0.2"
     "@stablelib/sha256": "npm:1.0.1"
     "@stablelib/x25519": "npm:1.0.3"
-    "@walletconnect/relay-api": "npm:1.0.10"
+    "@walletconnect/relay-api": "npm:1.0.11"
+    "@walletconnect/relay-auth": "npm:1.0.4"
     "@walletconnect/safe-json": "npm:1.0.2"
     "@walletconnect/time": "npm:1.0.2"
-    "@walletconnect/types": "npm:2.13.3"
+    "@walletconnect/types": "npm:2.17.0"
     "@walletconnect/window-getters": "npm:1.0.1"
     "@walletconnect/window-metadata": "npm:1.0.1"
     detect-browser: "npm:5.3.0"
+    elliptic: "npm:^6.5.7"
     query-string: "npm:7.1.3"
     uint8arrays: "npm:3.1.0"
-  checksum: 10c0/d33d66f306612637ed29f113c3cf6fd28f2a0c1062f88eafde2e9d2689859418725be0591c14d8a38ba24f56b70874117d47a6aa7ce0c1efa16e6eb6e3b79aad
+  checksum: 10c0/d1da74b2cd7af35f16d735fe408cfc820c611b2709bd00899e4e91b0b0a6dcd8f344f97df34d0ef8cabc121619a40b62118ffa2aa233ddba9863d1ba23480a0c
   languageName: node
   linkType: hard
 
@@ -2798,20 +2812,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@web3-name-sdk/core@npm:^0.1.15":
-  version: 0.1.18
-  resolution: "@web3-name-sdk/core@npm:0.1.18"
+"@web3-name-sdk/core@npm:^0.2.0":
+  version: 0.2.0
+  resolution: "@web3-name-sdk/core@npm:0.2.0"
   dependencies:
     "@adraffy/ens-normalize": "npm:^1.10.0"
     "@ensdomains/ens-validation": "npm:^0.1.0"
-    viem: "npm:^1.20"
   peerDependencies:
-    "@bonfida/spl-name-service": ^1.4.0
+    "@bonfida/spl-name-service": ^2.5.1
     "@sei-js/core": ^3.1.0
     "@siddomains/injective-sidjs": 0.0.2-beta
     "@siddomains/sei-sidjs": ^0.0.4
     "@solana/web3.js": ^1.75.0
-  checksum: 10c0/2f2c4611ba1868fbd683ec2249d2581d31aafaa24bdc187a1fd437cf08ffb13dcfda637b6b322afa12d6aea799c5a1fccbd03aacb808218fe315938be4005fd6
+    viem: ^2.15.1
+  checksum: 10c0/c7503dc312f23d3411def0dd76a4d02bc38ba1867c36ca28461336548fc78abdfac6607f960bbe1aee9199fe1b4aa1480c27b7f9403ec25377fc6bd3b0a47c82
   languageName: node
   linkType: hard
 
@@ -2835,9 +2849,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@web3-onboard/core@npm:2.22.1, @web3-onboard/core@npm:^2.21.1":
-  version: 2.22.1
-  resolution: "@web3-onboard/core@npm:2.22.1"
+"@web3-onboard/core@npm:2.22.3, @web3-onboard/core@npm:^2.21.1":
+  version: 2.22.3
+  resolution: "@web3-onboard/core@npm:2.22.3"
   dependencies:
     "@web3-onboard/common": "npm:^2.4.1"
     bnc-sdk: "npm:^4.6.7"
@@ -2851,31 +2865,31 @@ __metadata:
     svelte: "npm:^3.49.0"
     svelte-i18n: "npm:^3.3.13"
     viem: "npm:2.12.0"
-  checksum: 10c0/140a5704db66c89a2837646b56515e671ffc27124c180f8700b39fb3a58c77827237cab51a907010d91ce40eace7b91858d73ed0a69dd9621b9f41b3be5293ee
+  checksum: 10c0/d60c781746b23a8ee0984e2e89ccc5d9f220ec7aa3003535639ed11bf48be215456499ef4d42f117cbab521eadc7744448c104241b4ed7f7cb89d53bec05d7cb
   languageName: node
   linkType: hard
 
 "@web3-onboard/injected-wallets@npm:^2.10.5":
-  version: 2.11.1
-  resolution: "@web3-onboard/injected-wallets@npm:2.11.1"
+  version: 2.11.2
+  resolution: "@web3-onboard/injected-wallets@npm:2.11.2"
   dependencies:
     "@web3-onboard/common": "npm:^2.4.1"
     joi: "npm:17.9.1"
     lodash.uniqby: "npm:^4.7.0"
-  checksum: 10c0/1477654bd333e9f2ea1c6a4d20423cefb1c9eeec93c37bbbc3a7bc137ccef50b50440092af48550eb67b16a562efb11353c8601d504918af72c26da6301a870e
+  checksum: 10c0/389a8faa657303a58ae5c932145f03f0571ed36b56d33b7f09c98943f33d980c6542387de14d15da1fe9f17dc9de3bce0aac98661cfface7885d4401b9a7a0c9
   languageName: node
   linkType: hard
 
 "@web3-onboard/react@npm:^2.8.9":
-  version: 2.9.1
-  resolution: "@web3-onboard/react@npm:2.9.1"
+  version: 2.9.3
+  resolution: "@web3-onboard/react@npm:2.9.3"
   dependencies:
     "@web3-onboard/common": "npm:^2.4.1"
-    "@web3-onboard/core": "npm:2.22.1"
+    "@web3-onboard/core": "npm:2.22.3"
     use-sync-external-store: "npm:1.0.0"
   peerDependencies:
     react: ">=16.8"
-  checksum: 10c0/afcf81644b652c469d81a75bd2cfb8806ae0603371fad4e2abe3c8f7735b7f3cdfabcf98a3f8e629382d34ea947473db9d72955c47018db5bdce36b9c3778d38
+  checksum: 10c0/66b846d98aac9c56bce18c54e3d87c9e3f5d005f3114bdf7c584bbb1c4808870d2e2c40ed5433acac5dbf9f9c665e7808803d0af70877b1e085e38b3006f5fce
   languageName: node
   linkType: hard
 
@@ -2925,21 +2939,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"abitype@npm:0.9.8":
-  version: 0.9.8
-  resolution: "abitype@npm:0.9.8"
-  peerDependencies:
-    typescript: ">=5.0.4"
-    zod: ^3 >=3.19.1
-  peerDependenciesMeta:
-    typescript:
-      optional: true
-    zod:
-      optional: true
-  checksum: 10c0/ec559461d901d456820faf307e21b2c129583d44f4c68257ed9d0d44eae461114a7049046e715e069bc6fa70c410f644e06bdd2c798ac30d0ada794cd2a6c51e
-  languageName: node
-  linkType: hard
-
 "abitype@npm:1.0.0":
   version: 1.0.0
   resolution: "abitype@npm:1.0.0"
@@ -2955,12 +2954,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"acorn@npm:^8.11.3":
-  version: 8.12.0
-  resolution: "acorn@npm:8.12.0"
+"acorn@npm:^8.12.1":
+  version: 8.12.1
+  resolution: "acorn@npm:8.12.1"
   bin:
     acorn: bin/acorn
-  checksum: 10c0/a19f9dead009d3b430fa3c253710b47778cdaace15b316de6de93a68c355507bc1072a9956372b6c990cbeeb167d4a929249d0faeb8ae4bb6911d68d53299549
+  checksum: 10c0/51fb26cd678f914e13287e886da2d7021f8c2bc0ccc95e03d3e0447ee278dd3b40b9c57dc222acd5881adcf26f3edc40901a4953403232129e3876793cd17386
   languageName: node
   linkType: hard
 
@@ -3005,9 +3004,9 @@ __metadata:
   linkType: hard
 
 "ansi-regex@npm:^6.0.1":
-  version: 6.0.1
-  resolution: "ansi-regex@npm:6.0.1"
-  checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08
+  version: 6.1.0
+  resolution: "ansi-regex@npm:6.1.0"
+  checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc
   languageName: node
   linkType: hard
 
@@ -3170,8 +3169,8 @@ __metadata:
   linkType: hard
 
 "cacache@npm:^18.0.0":
-  version: 18.0.3
-  resolution: "cacache@npm:18.0.3"
+  version: 18.0.4
+  resolution: "cacache@npm:18.0.4"
   dependencies:
     "@npmcli/fs": "npm:^3.1.0"
     fs-minipass: "npm:^3.0.0"
@@ -3185,7 +3184,7 @@ __metadata:
     ssri: "npm:^10.0.0"
     tar: "npm:^6.1.11"
     unique-filename: "npm:^3.0.0"
-  checksum: 10c0/dfda92840bb371fb66b88c087c61a74544363b37a265023223a99965b16a16bbb87661fe4948718d79df6e0cc04e85e62784fbcf1832b2a5e54ff4c46fbb45b7
+  checksum: 10c0/6c055bafed9de4f3dcc64ac3dc7dd24e863210902b7c470eb9ce55a806309b3efff78033e3d8b4f7dcc5d467f2db43c6a2857aaaf26f0094b8a351d44c42179f
   languageName: node
   linkType: hard
 
@@ -3355,10 +3354,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"confbox@npm:^0.1.7":
-  version: 0.1.7
-  resolution: "confbox@npm:0.1.7"
-  checksum: 10c0/18b40c2f652196a833f3f1a5db2326a8a579cd14eacabfe637e4fc8cb9b68d7cf296139a38c5e7c688ce5041bf46f9adce05932d43fde44cf7e012840b5da111
+"confbox@npm:^0.1.8":
+  version: 0.1.8
+  resolution: "confbox@npm:0.1.8"
+  checksum: 10c0/fc2c68d97cb54d885b10b63e45bd8da83a8a71459d3ecf1825143dd4c7f9f1b696b3283e07d9d12a144c1301c2ebc7842380bdf0014e55acc4ae1c9550102418
   languageName: node
   linkType: hard
 
@@ -3369,17 +3368,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"cookie-es@npm:^1.1.0":
-  version: 1.1.0
-  resolution: "cookie-es@npm:1.1.0"
-  checksum: 10c0/27f1057b05eb42dca539a80cf45b8f9d5bacf35482690d756025447810dcd669e0cd13952a063a43e47a4e6fd7400745defedc97479a4254019f0bdb5c200341
+"cookie-es@npm:^1.2.2":
+  version: 1.2.2
+  resolution: "cookie-es@npm:1.2.2"
+  checksum: 10c0/210eb67cd40a53986fda99d6f47118cfc45a69c4abc03490d15ab1b83ac978d5518356aecdd7a7a4969292445e3063c2302deda4c73706a67edc008127608638
   languageName: node
   linkType: hard
 
 "core-js@npm:^3.31.1":
-  version: 3.37.1
-  resolution: "core-js@npm:3.37.1"
-  checksum: 10c0/440eb51a7a39128a320225fe349f870a3641b96c9ecd26470227db730ef8c161ea298eaea621db66ec0ff622a85299efb4e23afebf889c0a1748616102307675
+  version: 3.38.1
+  resolution: "core-js@npm:3.38.1"
+  checksum: 10c0/7df063b6f13a54e46515817ac3e235c6c598a4d3de65cd188a061fc250642be313b895fb9fb2f36e1e31890a1bb4ef61d82666a340413f540b7ce3c65689739b
   languageName: node
   linkType: hard
 
@@ -3412,15 +3411,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"crossws@npm:^0.2.0, crossws@npm:^0.2.4":
-  version: 0.2.4
-  resolution: "crossws@npm:0.2.4"
-  peerDependencies:
-    uWebSockets.js: "*"
-  peerDependenciesMeta:
-    uWebSockets.js:
-      optional: true
-  checksum: 10c0/b950c64d36f3f11fdb8e0faf3107598660d89d77eb860e68b535fe6acba9f0f2f0507cc7250bd219a3ef2fe08718db91b591e6912b7324fcfc8fd1b8d9f78c96
+"crossws@npm:>=0.2.0 <0.4.0":
+  version: 0.3.1
+  resolution: "crossws@npm:0.3.1"
+  dependencies:
+    uncrypto: "npm:^0.1.3"
+  checksum: 10c0/37dc72074ee61ee999ec79e061a0ddab870e061a88cd9b83f479c5c4130c6742ce6b308c38968ee4be9073246c32b0cb0adaed50f1e448b988c3b3172c4ce2e0
   languageName: node
   linkType: hard
 
@@ -3490,14 +3486,14 @@ __metadata:
   linkType: hard
 
 "debug@npm:4, debug@npm:^4.3.4, debug@npm:~4.3.1, debug@npm:~4.3.2":
-  version: 4.3.5
-  resolution: "debug@npm:4.3.5"
+  version: 4.3.7
+  resolution: "debug@npm:4.3.7"
   dependencies:
-    ms: "npm:2.1.2"
+    ms: "npm:^2.1.3"
   peerDependenciesMeta:
     supports-color:
       optional: true
-  checksum: 10c0/082c375a2bdc4f4469c99f325ff458adad62a3fc2c482d59923c260cb08152f34e2659f72b3767db8bb2f21ca81a60a42d1019605a412132d7b9f59363a005cc
+  checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b
   languageName: node
   linkType: hard
 
@@ -3522,7 +3518,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"defu@npm:^6.1.3, defu@npm:^6.1.4":
+"defu@npm:^6.1.4":
   version: 6.1.4
   resolution: "defu@npm:6.1.4"
   checksum: 10c0/2d6cc366262dc0cb8096e429368e44052fdf43ed48e53ad84cc7c9407f890301aa5fcb80d0995abaaf842b3949f154d060be4160f7a46cb2bc2f7726c81526f5
@@ -3638,9 +3634,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"elliptic@npm:^6.5.4":
-  version: 6.5.5
-  resolution: "elliptic@npm:6.5.5"
+"elliptic@npm:^6.5.4, elliptic@npm:^6.5.7":
+  version: 6.5.7
+  resolution: "elliptic@npm:6.5.7"
   dependencies:
     bn.js: "npm:^4.11.9"
     brorand: "npm:^1.1.0"
@@ -3649,7 +3645,7 @@ __metadata:
     inherits: "npm:^2.0.4"
     minimalistic-assert: "npm:^1.0.1"
     minimalistic-crypto-utils: "npm:^1.0.1"
-  checksum: 10c0/3e591e93783a1b66f234ebf5bd3a8a9a8e063a75073a35a671e03e3b25253b6e33ac121f7efe9b8808890fffb17b40596cc19d01e6e8d1fa13b9a56ff65597c8
+  checksum: 10c0/799959b6c54ea3564e8961f35abdf8c77e37617f3051614b05ab1fb6a04ddb65bd1caa75ed1bae375b15dda312a0f79fed26ebe76ecf05c5a7af244152a601b8
   languageName: node
   linkType: hard
 
@@ -3661,13 +3657,13 @@ __metadata:
   linkType: hard
 
 "emoji-picker-react@npm:^4.4.9":
-  version: 4.10.0
-  resolution: "emoji-picker-react@npm:4.10.0"
+  version: 4.12.0
+  resolution: "emoji-picker-react@npm:4.12.0"
   dependencies:
-    flairup: "npm:0.0.39"
+    flairup: "npm:1.0.0"
   peerDependencies:
     react: ">=16"
-  checksum: 10c0/b4c524a199fe070373e5ec19d8e05647523545776adff211f424ab989e82d232cdc62ae7507d212af831a74a2259f34e47f0a115a77918d3527910a128575354
+  checksum: 10c0/e2e3bc9a3665a3908b8c8d0a6d456633efa36e422455c80f7b7d63c7fd5157c682b18cdab7f5c36a736155bfc09fd876b38033f2404bb2f8710900c699608376
   languageName: node
   linkType: hard
 
@@ -3710,23 +3706,23 @@ __metadata:
   languageName: node
   linkType: hard
 
-"engine.io-client@npm:~6.5.2":
-  version: 6.5.4
-  resolution: "engine.io-client@npm:6.5.4"
+"engine.io-client@npm:~6.6.1":
+  version: 6.6.1
+  resolution: "engine.io-client@npm:6.6.1"
   dependencies:
     "@socket.io/component-emitter": "npm:~3.1.0"
     debug: "npm:~4.3.1"
     engine.io-parser: "npm:~5.2.1"
     ws: "npm:~8.17.1"
-    xmlhttprequest-ssl: "npm:~2.0.0"
-  checksum: 10c0/ef220f9875d6a43bade906bd9b61118e812474bbe46e80f38c92dca238484170daf92d51e58bbade6433c29ffb5ba329f4864c5609f2e33c5e31041b1f8ad672
+    xmlhttprequest-ssl: "npm:~2.1.1"
+  checksum: 10c0/f0ba384a86c2965b8016907a970e2b71b792e951cb97013b237a6f13ecedc7444b0262c7886e62f6807ad761418f3e1ed2442179722e67e5f1d7f55ff6590514
   languageName: node
   linkType: hard
 
 "engine.io-parser@npm:~5.2.1":
-  version: 5.2.2
-  resolution: "engine.io-parser@npm:5.2.2"
-  checksum: 10c0/38e71a92ed75e2873d4d9cfab7f889e4a3cfc939b689abd1045e1b2ef9f1a50d0350a2bef69f33d313c1aa626232702da5a9043a1038d76f5ecc0be440c648ab
+  version: 5.2.3
+  resolution: "engine.io-parser@npm:5.2.3"
+  checksum: 10c0/ed4900d8dbef470ab3839ccf3bfa79ee518ea8277c7f1f2759e8c22a48f64e687ea5e474291394d0c94f84054749fd93f3ef0acb51fa2f5f234cc9d9d8e7c536
   languageName: node
   linkType: hard
 
@@ -4037,12 +4033,11 @@ __metadata:
   linkType: hard
 
 "find-babel-config@npm:^2.1.1":
-  version: 2.1.1
-  resolution: "find-babel-config@npm:2.1.1"
+  version: 2.1.2
+  resolution: "find-babel-config@npm:2.1.2"
   dependencies:
     json5: "npm:^2.2.3"
-    path-exists: "npm:^4.0.0"
-  checksum: 10c0/fb1f348027b83e9fe3b4163ec9c45719adab1205b2807708d660fe2a7beb5f812e0fabb6b21746cf0ef9c9fbf67bcc8e37f6cddb9d43229f0524767522d6110b
+  checksum: 10c0/c9151b23d636378eae11aa761b0af41d5f67d5479e3ebfca7b0ec7feef91723f14242d243342783b89e6c51fc5b4120086eacf5d8a1a335cf7bae4b0ac89f493
   languageName: node
   linkType: hard
 
@@ -4065,20 +4060,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"flairup@npm:0.0.39":
-  version: 0.0.39
-  resolution: "flairup@npm:0.0.39"
-  checksum: 10c0/ad6392e8fc4a0dd6c7c8f529e9ce9046060c4c304455aba8a75b07ee2c4a1f3a390812480d493063c6fe4f7ba504ecbf68f00dfb9d93b87b73e690d42d734952
+"flairup@npm:1.0.0":
+  version: 1.0.0
+  resolution: "flairup@npm:1.0.0"
+  checksum: 10c0/2d9fe1f1c890383be65ae0ec95d57b96f3ff42eecffaf493f8a39f09f4982e12109a865e79baca051e784919eecd72fa6cf620cfae8a4663b98deaa6d883d7ba
   languageName: node
   linkType: hard
 
 "foreground-child@npm:^3.1.0":
-  version: 3.2.1
-  resolution: "foreground-child@npm:3.2.1"
+  version: 3.3.0
+  resolution: "foreground-child@npm:3.3.0"
   dependencies:
     cross-spawn: "npm:^7.0.0"
     signal-exit: "npm:^4.0.1"
-  checksum: 10c0/9a53a33dbd87090e9576bef65fb4a71de60f6863a8062a7b11bc1cbe3cc86d428677d7c0b9ef61cdac11007ac580006f78bd5638618d564cfd5e6fd713d6878f
+  checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2
   languageName: node
   linkType: hard
 
@@ -4169,12 +4164,12 @@ __metadata:
   linkType: hard
 
 "gif-picker-react@npm:^1.1.0":
-  version: 1.3.3
-  resolution: "gif-picker-react@npm:1.3.3"
+  version: 1.4.0
+  resolution: "gif-picker-react@npm:1.4.0"
   peerDependencies:
     react: ">=17"
     react-dom: ">=17"
-  checksum: 10c0/355b5714742dd1259a29727e5330cd84ba5e09ee70175f96de0d115dfe539993d23f09b3cbf51f39bcd3e14c61ce6ef9f426078b52f5e47e3cbef1381f12613d
+  checksum: 10c0/dd067641252855f8d8f77eb224f5ef222d98f42fc8723736d573d8c034abd759e076cad8a174af77f36ceb54528ea1a7615256734f58cf31f56b71a4a3422737
   languageName: node
   linkType: hard
 
@@ -4188,8 +4183,8 @@ __metadata:
   linkType: hard
 
 "glob@npm:^10.2.2, glob@npm:^10.3.10":
-  version: 10.4.2
-  resolution: "glob@npm:10.4.2"
+  version: 10.4.5
+  resolution: "glob@npm:10.4.5"
   dependencies:
     foreground-child: "npm:^3.1.0"
     jackspeak: "npm:^3.1.2"
@@ -4199,7 +4194,7 @@ __metadata:
     path-scurry: "npm:^1.11.1"
   bin:
     glob: dist/esm/bin.mjs
-  checksum: 10c0/2c7296695fa75a935f3ad17dc62e4e170a8bb8752cf64d328be8992dd6ad40777939003754e10e9741ff8fbe43aa52fba32d6930d0ffa0e3b74bc3fb5eebaa2f
+  checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e
   languageName: node
   linkType: hard
 
@@ -4236,21 +4231,21 @@ __metadata:
   languageName: node
   linkType: hard
 
-"h3@npm:^1.10.2, h3@npm:^1.11.1":
-  version: 1.12.0
-  resolution: "h3@npm:1.12.0"
+"h3@npm:^1.12.0":
+  version: 1.13.0
+  resolution: "h3@npm:1.13.0"
   dependencies:
-    cookie-es: "npm:^1.1.0"
-    crossws: "npm:^0.2.4"
+    cookie-es: "npm:^1.2.2"
+    crossws: "npm:>=0.2.0 <0.4.0"
     defu: "npm:^6.1.4"
     destr: "npm:^2.0.3"
-    iron-webcrypto: "npm:^1.1.1"
-    ohash: "npm:^1.1.3"
+    iron-webcrypto: "npm:^1.2.1"
+    ohash: "npm:^1.1.4"
     radix3: "npm:^1.1.2"
-    ufo: "npm:^1.5.3"
+    ufo: "npm:^1.5.4"
     uncrypto: "npm:^0.1.3"
-    unenv: "npm:^1.9.0"
-  checksum: 10c0/21ac3ee2451e96a74d6a4ec3a6e589c4725590dc4e675816436ae9d041556fc1b64052ba3775a48912f4ae98977031e1be4c57ac8a80bb4297117506b6ec7a6f
+    unenv: "npm:^1.10.0"
+  checksum: 10c0/d2e91d44c7133c31c62e39288961be28fb9f2c75f91d83a4a0416e29ff408b3207b79e46ba25a2652e13aea78a3e6f10d12c53d746feb00e91b864e1f4b21302
   languageName: node
   linkType: hard
 
@@ -4308,9 +4303,9 @@ __metadata:
   linkType: hard
 
 "hls.js@npm:^1.4.12":
-  version: 1.5.11
-  resolution: "hls.js@npm:1.5.11"
-  checksum: 10c0/f32846a3c35d5aad310b94f833228e5182ef883ee9b5fe78271e4dcf1e161d8a9286349d07715be1402d2aefaa0e15e36133e6b94995611922ec1704a3555c05
+  version: 1.5.15
+  resolution: "hls.js@npm:1.5.15"
+  checksum: 10c0/e04d7b7e5e318cf10914bb7ab0e6607fcc3f0e8d5cd89c25c699736b3206a4791a85fd55b62fe4120897fc6bcb848760b4797df288deede8dbc050810503fe89
   languageName: node
   linkType: hard
 
@@ -4386,12 +4381,12 @@ __metadata:
   linkType: hard
 
 "https-proxy-agent@npm:^7.0.1":
-  version: 7.0.4
-  resolution: "https-proxy-agent@npm:7.0.4"
+  version: 7.0.5
+  resolution: "https-proxy-agent@npm:7.0.5"
   dependencies:
     agent-base: "npm:^7.0.2"
     debug: "npm:4"
-  checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b
+  checksum: 10c0/2490e3acec397abeb88807db52cac59102d5ed758feee6df6112ab3ccd8325e8a1ce8bce6f4b66e5470eca102d31e425ace904242e4fa28dbe0c59c4bafa7b2c
   languageName: node
   linkType: hard
 
@@ -4484,7 +4479,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"iron-webcrypto@npm:^1.1.1":
+"iron-webcrypto@npm:^1.2.1":
   version: 1.2.1
   resolution: "iron-webcrypto@npm:1.2.1"
   checksum: 10c0/5cf27c6e2bd3ef3b4970e486235fd82491ab8229e2ed0ac23307c28d6c80d721772a86ed4e9fe2a5cabadd710c2f024b706843b40561fb83f15afee58f809f66
@@ -4518,11 +4513,11 @@ __metadata:
   linkType: hard
 
 "is-core-module@npm:^2.13.0":
-  version: 2.14.0
-  resolution: "is-core-module@npm:2.14.0"
+  version: 2.15.1
+  resolution: "is-core-module@npm:2.15.1"
   dependencies:
     hasown: "npm:^2.0.2"
-  checksum: 10c0/ae8dbc82bd20426558bc8d20ce290ce301c1cfd6ae4446266d10cacff4c63c67ab16440ade1d72ced9ec41c569fbacbcee01e293782ce568527c4cdf35936e4c
+  checksum: 10c0/53432f10c69c40bfd2fa8914133a68709ff9498c86c3bf5fca3cdf3145a56fd2168cbf4a43b29843a6202a120a5f9c5ffba0a4322e1e3441739bc0b641682612
   languageName: node
   linkType: hard
 
@@ -4650,25 +4645,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"isomorphic-unfetch@npm:3.1.0":
-  version: 3.1.0
-  resolution: "isomorphic-unfetch@npm:3.1.0"
-  dependencies:
-    node-fetch: "npm:^2.6.1"
-    unfetch: "npm:^4.2.0"
-  checksum: 10c0/d3b61fca06304db692b7f76bdfd3a00f410e42cfa7403c3b250546bf71589d18cf2f355922f57198e4cc4a9872d3647b20397a5c3edf1a347c90d57c83cf2a89
-  languageName: node
-  linkType: hard
-
-"isows@npm:1.0.3":
-  version: 1.0.3
-  resolution: "isows@npm:1.0.3"
-  peerDependencies:
-    ws: "*"
-  checksum: 10c0/adec15db704bb66615dd8ef33f889d41ae2a70866b21fa629855da98cc82a628ae072ee221fe9779a9a19866cad2a3e72593f2d161a0ce0e168b4484c7df9cd2
-  languageName: node
-  linkType: hard
-
 "isows@npm:1.0.4":
   version: 1.0.4
   resolution: "isows@npm:1.0.4"
@@ -4679,24 +4655,24 @@ __metadata:
   linkType: hard
 
 "jackspeak@npm:^3.1.2":
-  version: 3.4.0
-  resolution: "jackspeak@npm:3.4.0"
+  version: 3.4.3
+  resolution: "jackspeak@npm:3.4.3"
   dependencies:
     "@isaacs/cliui": "npm:^8.0.2"
     "@pkgjs/parseargs": "npm:^0.11.0"
   dependenciesMeta:
     "@pkgjs/parseargs":
       optional: true
-  checksum: 10c0/7e42d1ea411b4d57d43ea8a6afbca9224382804359cb72626d0fc45bb8db1de5ad0248283c3db45fe73e77210750d4fcc7c2b4fe5d24fda94aaa24d658295c5f
+  checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9
   languageName: node
   linkType: hard
 
-"jiti@npm:^1.21.0":
-  version: 1.21.6
-  resolution: "jiti@npm:1.21.6"
+"jiti@npm:^2.1.2":
+  version: 2.3.3
+  resolution: "jiti@npm:2.3.3"
   bin:
-    jiti: bin/jiti.js
-  checksum: 10c0/05b9ed58cd30d0c3ccd3c98209339e74f50abd9a17e716f65db46b6a35812103f6bde6e134be7124d01745586bca8cc5dae1d0d952267c3ebe55171949c32e56
+    jiti: lib/jiti-cli.mjs
+  checksum: 10c0/d71e40fb3c359cddafa2a6a03aea7e5e3a571aedeb5bec7627d5bc67c1e66c6275be5c03b4e0b10cd22cde9d39c892f27f6598a4e63bde030b607efc5051fd7f
   languageName: node
   linkType: hard
 
@@ -4770,31 +4746,31 @@ __metadata:
   linkType: hard
 
 "listhen@npm:^1.7.2":
-  version: 1.7.2
-  resolution: "listhen@npm:1.7.2"
+  version: 1.9.0
+  resolution: "listhen@npm:1.9.0"
   dependencies:
     "@parcel/watcher": "npm:^2.4.1"
     "@parcel/watcher-wasm": "npm:^2.4.1"
     citty: "npm:^0.1.6"
     clipboardy: "npm:^4.0.0"
     consola: "npm:^3.2.3"
-    crossws: "npm:^0.2.0"
+    crossws: "npm:>=0.2.0 <0.4.0"
     defu: "npm:^6.1.4"
     get-port-please: "npm:^3.1.2"
-    h3: "npm:^1.10.2"
+    h3: "npm:^1.12.0"
     http-shutdown: "npm:^1.2.2"
-    jiti: "npm:^1.21.0"
-    mlly: "npm:^1.6.1"
+    jiti: "npm:^2.1.2"
+    mlly: "npm:^1.7.1"
     node-forge: "npm:^1.3.1"
     pathe: "npm:^1.1.2"
     std-env: "npm:^3.7.0"
-    ufo: "npm:^1.4.0"
+    ufo: "npm:^1.5.4"
     untun: "npm:^0.1.3"
     uqr: "npm:^0.1.2"
   bin:
     listen: bin/listhen.mjs
     listhen: bin/listhen.mjs
-  checksum: 10c0/cd4d0651686b88c61a5bd5d5afc03feb99e352eb7862260112010655cf7997fb3356e61317f09555e2b7412175ae05265fc9e97458aa014586bf9fa4ab22bd5a
+  checksum: 10c0/b13e732eec48a49017121013853bb0f184c6f40dc9839a8ccad03b57a50a29186a57edafe5807e892cf65b49cb710026ba95d064bdcf294e135b95c6553fe36b
   languageName: node
   linkType: hard
 
@@ -5001,9 +4977,9 @@ __metadata:
   linkType: hard
 
 "loglevel@npm:^1.8.0":
-  version: 1.9.1
-  resolution: "loglevel@npm:1.9.1"
-  checksum: 10c0/152f0501cea367cf998c844a38b19f0b5af555756ad7d8650214a1f8c6a5b045e31b8cf5dae27d28339a061624ce3f618aadb333aed386cac041d6ddc5101a39
+  version: 1.9.2
+  resolution: "loglevel@npm:1.9.2"
+  checksum: 10c0/1e317fa4648fe0b4a4cffef6de037340592cee8547b07d4ce97a487abe9153e704b98451100c799b032c72bb89c9366d71c9fb8192ada8703269263ae77acdc7
   languageName: node
   linkType: hard
 
@@ -5035,10 +5011,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0":
-  version: 10.2.2
-  resolution: "lru-cache@npm:10.2.2"
-  checksum: 10c0/402d31094335851220d0b00985084288136136992979d0e015f0f1697e15d1c86052d7d53ae86b614e5b058425606efffc6969a31a091085d7a2b80a8a1e26d6
+"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3":
+  version: 10.4.3
+  resolution: "lru-cache@npm:10.4.3"
+  checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb
   languageName: node
   linkType: hard
 
@@ -5102,12 +5078,12 @@ __metadata:
   linkType: hard
 
 "micromatch@npm:^4.0.5":
-  version: 4.0.7
-  resolution: "micromatch@npm:4.0.7"
+  version: 4.0.8
+  resolution: "micromatch@npm:4.0.8"
   dependencies:
     braces: "npm:^3.0.3"
     picomatch: "npm:^2.3.1"
-  checksum: 10c0/58fa99bc5265edec206e9163a1d2cec5fabc46a5b473c45f4a700adce88c2520456ae35f2b301e4410fb3afb27e9521fb2813f6fc96be0a48a89430e0916a772
+  checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8
   languageName: node
   linkType: hard
 
@@ -5151,11 +5127,11 @@ __metadata:
   linkType: hard
 
 "minimatch@npm:^9.0.4":
-  version: 9.0.4
-  resolution: "minimatch@npm:9.0.4"
+  version: 9.0.5
+  resolution: "minimatch@npm:9.0.5"
   dependencies:
     brace-expansion: "npm:^2.0.1"
-  checksum: 10c0/2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414
+  checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed
   languageName: node
   linkType: hard
 
@@ -5259,15 +5235,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"mlly@npm:^1.6.1, mlly@npm:^1.7.0":
-  version: 1.7.1
-  resolution: "mlly@npm:1.7.1"
+"mlly@npm:^1.7.1, mlly@npm:^1.7.2":
+  version: 1.7.2
+  resolution: "mlly@npm:1.7.2"
   dependencies:
-    acorn: "npm:^8.11.3"
+    acorn: "npm:^8.12.1"
     pathe: "npm:^1.1.2"
-    pkg-types: "npm:^1.1.1"
-    ufo: "npm:^1.5.3"
-  checksum: 10c0/d836a7b0adff4d118af41fb93ad4d9e57f80e694a681185280ba220a4607603c19e86c80f9a6c57512b04280567f2599e3386081705c5b5fd74c9ddfd571d0fa
+    pkg-types: "npm:^1.2.0"
+    ufo: "npm:^1.5.4"
+  checksum: 10c0/e5a990b9d895477f3d3dfceec9797e41d6f029ce3b1b2dcf787d4b7500b4caff4b3cdc0ae5cb82c14b469b85209fe3d7368286415c0ca5415b163219fc6b5f21
   languageName: node
   linkType: hard
 
@@ -5299,10 +5275,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ms@npm:2.1.2":
-  version: 2.1.2
-  resolution: "ms@npm:2.1.2"
-  checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc
+"ms@npm:^2.1.3":
+  version: 2.1.3
+  resolution: "ms@npm:2.1.3"
+  checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48
   languageName: node
   linkType: hard
 
@@ -5339,9 +5315,9 @@ __metadata:
   linkType: hard
 
 "napi-wasm@npm:^1.1.0":
-  version: 1.1.0
-  resolution: "napi-wasm@npm:1.1.0"
-  checksum: 10c0/074df6b5b72698f07b39ca3c448a3fcbaf8e6e78521f0cb3aefd8c2f059d69eae0e3bfe367b4aa3df1976c25e351e4e52a359f22fb2c379eb6781bfa042f582b
+  version: 1.1.3
+  resolution: "napi-wasm@npm:1.1.3"
+  checksum: 10c0/7c365ab9dc59e6f20d7b7886279ecc03ffc7c3d502ed66d32652e3681c3a56c372f00f29b110aefd9b074a6bab6a997e9b602968c18622e2586818f417e41a5d
   languageName: node
   linkType: hard
 
@@ -5369,22 +5345,22 @@ __metadata:
   linkType: hard
 
 "node-addon-api@npm:^7.0.0":
-  version: 7.1.0
-  resolution: "node-addon-api@npm:7.1.0"
+  version: 7.1.1
+  resolution: "node-addon-api@npm:7.1.1"
   dependencies:
     node-gyp: "npm:latest"
-  checksum: 10c0/2e096ab079e3c46d33b0e252386e9c239c352f7cc6d75363d9a3c00bdff34c1a5da170da861917512843f213c32d024ced9dc9552b968029786480d18727ec66
+  checksum: 10c0/fb32a206276d608037fa1bcd7e9921e177fe992fc610d098aa3128baca3c0050fc1e014fa007e9b3874cf865ddb4f5bd9f43ccb7cbbbe4efaff6a83e920b17e9
   languageName: node
   linkType: hard
 
-"node-fetch-native@npm:^1.6.1, node-fetch-native@npm:^1.6.2, node-fetch-native@npm:^1.6.3":
+"node-fetch-native@npm:^1.6.4":
   version: 1.6.4
   resolution: "node-fetch-native@npm:1.6.4"
   checksum: 10c0/78334dc6def5d1d95cfe87b33ac76c4833592c5eb84779ad2b0c23c689f9dd5d1cfc827035ada72d6b8b218f717798968c5a99aeff0a1a8bf06657e80592f9c3
   languageName: node
   linkType: hard
 
-"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12":
+"node-fetch@npm:^2.6.12":
   version: 2.7.0
   resolution: "node-fetch@npm:2.7.0"
   dependencies:
@@ -5406,19 +5382,19 @@ __metadata:
   linkType: hard
 
 "node-gyp-build@npm:^4.2.0":
-  version: 4.8.1
-  resolution: "node-gyp-build@npm:4.8.1"
+  version: 4.8.2
+  resolution: "node-gyp-build@npm:4.8.2"
   bin:
     node-gyp-build: bin.js
     node-gyp-build-optional: optional.js
     node-gyp-build-test: build-test.js
-  checksum: 10c0/e36ca3d2adf2b9cca316695d7687207c19ac6ed326d6d7c68d7112cebe0de4f82d6733dff139132539fcc01cf5761f6c9082a21864ab9172edf84282bc849ce7
+  checksum: 10c0/d816b43974d31d6257b6e87d843f2626c72389a285208394bc57a7766b210454d2642860a5e5b5c333d8ecabaeabad3b31b94f58cf8ca1aabdef0c320d02baaa
   languageName: node
   linkType: hard
 
 "node-gyp@npm:latest":
-  version: 10.1.0
-  resolution: "node-gyp@npm:10.1.0"
+  version: 10.2.0
+  resolution: "node-gyp@npm:10.2.0"
   dependencies:
     env-paths: "npm:^2.2.0"
     exponential-backoff: "npm:^3.1.1"
@@ -5426,13 +5402,13 @@ __metadata:
     graceful-fs: "npm:^4.2.6"
     make-fetch-happen: "npm:^13.0.0"
     nopt: "npm:^7.0.0"
-    proc-log: "npm:^3.0.0"
+    proc-log: "npm:^4.1.0"
     semver: "npm:^7.3.5"
-    tar: "npm:^6.1.2"
+    tar: "npm:^6.2.1"
     which: "npm:^4.0.0"
   bin:
     node-gyp: bin/node-gyp.js
-  checksum: 10c0/9cc821111ca244a01fb7f054db7523ab0a0cd837f665267eb962eb87695d71fb1e681f9e21464cc2fd7c05530dc4c81b810bca1a88f7d7186909b74477491a3c
+  checksum: 10c0/00630d67dbd09a45aee0a5d55c05e3916ca9e6d427ee4f7bc392d2d3dc5fad7449b21fc098dd38260a53d9dcc9c879b36704a1994235d4707e7271af7e9a835b
   languageName: node
   linkType: hard
 
@@ -5477,21 +5453,21 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ofetch@npm:^1.3.3":
-  version: 1.3.4
-  resolution: "ofetch@npm:1.3.4"
+"ofetch@npm:^1.3.4":
+  version: 1.4.0
+  resolution: "ofetch@npm:1.4.0"
   dependencies:
     destr: "npm:^2.0.3"
-    node-fetch-native: "npm:^1.6.3"
-    ufo: "npm:^1.5.3"
-  checksum: 10c0/39855005c3f8aa11c11d3a3b0c4366b67d316da58633f4cf5d4a5af0a61495fd68699f355e70deda70355ead25f27b41c3bde2fdd1d24ce3f85ac79608dd8677
+    node-fetch-native: "npm:^1.6.4"
+    ufo: "npm:^1.5.4"
+  checksum: 10c0/8825bfd1e87117aba462c1e654ba37e09415e6161527a9ef20723ec220b5cd802b52b07a042f6582746240c65bd5fa6fefb289ea5c6d6ea987d2beca3cc0d2f9
   languageName: node
   linkType: hard
 
-"ohash@npm:^1.1.3":
-  version: 1.1.3
-  resolution: "ohash@npm:1.1.3"
-  checksum: 10c0/928f5bdbd8cd73f90cf544c0533dbda8e0a42d9b8c7454ab89e64e4d11bc85f85242830b4e107426ce13dc4dd3013286f8f5e0c84abd8942a014b907d9692540
+"ohash@npm:^1.1.4":
+  version: 1.1.4
+  resolution: "ohash@npm:1.1.4"
+  checksum: 10c0/73c3bcab2891ee2155ed62bb4c2906f622bf2204a3c9f4616ada8a6a76276bb6b4b4180eaf273b7c7d6232793e4d79d486aab436ebfc0d06d92a997f07122864
   languageName: node
   linkType: hard
 
@@ -5564,9 +5540,9 @@ __metadata:
   linkType: hard
 
 "package-json-from-dist@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "package-json-from-dist@npm:1.0.0"
-  checksum: 10c0/e3ffaf6ac1040ab6082a658230c041ad14e72fabe99076a2081bb1d5d41210f11872403fc09082daf4387fc0baa6577f96c9c0e94c90c394fd57794b66aa4033
+  version: 1.0.1
+  resolution: "package-json-from-dist@npm:1.0.1"
+  checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b
   languageName: node
   linkType: hard
 
@@ -5644,9 +5620,9 @@ __metadata:
   linkType: hard
 
 "picocolors@npm:^1.0.0":
-  version: 1.0.1
-  resolution: "picocolors@npm:1.0.1"
-  checksum: 10c0/c63cdad2bf812ef0d66c8db29583802355d4ca67b9285d846f390cc15c2f6ccb94e8cb7eb6a6e97fc5990a6d3ad4ae42d86c84d3146e667c739a4234ed50d400
+  version: 1.1.0
+  resolution: "picocolors@npm:1.1.0"
+  checksum: 10c0/86946f6032148801ef09c051c6fb13b5cf942eaf147e30ea79edb91dd32d700934edebe782a1078ff859fb2b816792e97ef4dab03d7f0b804f6b01a0df35e023
   languageName: node
   linkType: hard
 
@@ -5695,14 +5671,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"pkg-types@npm:^1.1.1":
-  version: 1.1.1
-  resolution: "pkg-types@npm:1.1.1"
+"pkg-types@npm:^1.2.0":
+  version: 1.2.1
+  resolution: "pkg-types@npm:1.2.1"
   dependencies:
-    confbox: "npm:^0.1.7"
-    mlly: "npm:^1.7.0"
+    confbox: "npm:^0.1.8"
+    mlly: "npm:^1.7.2"
     pathe: "npm:^1.1.2"
-  checksum: 10c0/c7d167935de7207479e5829086040d70bea289f31fc1331f17c83e996a4440115c9deba2aa96de839ea66e1676d083c9ca44b33886f87bffa6b49740b67b6fcb
+  checksum: 10c0/4aef765c039e3ec3ca55171bb8ad776cf060d894c45ddf92b9d680b3fdb1817c8d1c428f74ea6aae144493fa1d6a97df6b8caec6dc31e418f1ce1f728d38014e
   languageName: node
   linkType: hard
 
@@ -5741,9 +5717,9 @@ __metadata:
   linkType: hard
 
 "preact@npm:^10.16.0":
-  version: 10.22.0
-  resolution: "preact@npm:10.22.0"
-  checksum: 10c0/dc5466c5968c56997e917580c00983cec2f6486a89ea9ba29f1bb88dcfd2f9ff67c8d561a69a1b3acdab17f2bb36b311fef0c348b62e89c332d00c674f7871f0
+  version: 10.24.2
+  resolution: "preact@npm:10.24.2"
+  checksum: 10c0/d1d22c5e1abc10eb8f83501857ef22c54a3fda2d20449d06f5b3c7d5ae812bd702c16c05b672138b8906504f9c893e072e9cebcbcada8cac320edf36265788fb
   languageName: node
   linkType: hard
 
@@ -5761,14 +5737,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"proc-log@npm:^3.0.0":
-  version: 3.0.0
-  resolution: "proc-log@npm:3.0.0"
-  checksum: 10c0/f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc
-  languageName: node
-  linkType: hard
-
-"proc-log@npm:^4.2.0":
+"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0":
   version: 4.2.0
   resolution: "proc-log@npm:4.2.0"
   checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9
@@ -5824,8 +5793,8 @@ __metadata:
   linkType: hard
 
 "protobufjs@npm:^7.2.6":
-  version: 7.3.2
-  resolution: "protobufjs@npm:7.3.2"
+  version: 7.4.0
+  resolution: "protobufjs@npm:7.4.0"
   dependencies:
     "@protobufjs/aspromise": "npm:^1.1.2"
     "@protobufjs/base64": "npm:^1.1.2"
@@ -5839,7 +5808,7 @@ __metadata:
     "@protobufjs/utf8": "npm:^1.1.0"
     "@types/node": "npm:>=13.7.0"
     long: "npm:^5.0.0"
-  checksum: 10c0/b87e38fffc989793099010439a7ff45a0a57ef5b8f44b5209f06bfa5085ac96a365aa37eb3c79bd6954d6ef1b50fc69da37dae8ea2a31d90b7bc8fb2fa0e3955
+  checksum: 10c0/a5460a63fe596523b9a067cbce39a6b310d1a71750fda261f076535662aada97c24450e18c5bc98a27784f70500615904ff1227e1742183509f0db4fdede669b
   languageName: node
   linkType: hard
 
@@ -5985,7 +5954,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"react-remove-scroll-bar@npm:^2.3.3, react-remove-scroll-bar@npm:^2.3.4":
+"react-remove-scroll-bar@npm:^2.3.3, react-remove-scroll-bar@npm:^2.3.6":
   version: 2.3.6
   resolution: "react-remove-scroll-bar@npm:2.3.6"
   dependencies:
@@ -6020,11 +5989,11 @@ __metadata:
   languageName: node
   linkType: hard
 
-"react-remove-scroll@npm:2.5.7":
-  version: 2.5.7
-  resolution: "react-remove-scroll@npm:2.5.7"
+"react-remove-scroll@npm:2.6.0":
+  version: 2.6.0
+  resolution: "react-remove-scroll@npm:2.6.0"
   dependencies:
-    react-remove-scroll-bar: "npm:^2.3.4"
+    react-remove-scroll-bar: "npm:^2.3.6"
     react-style-singleton: "npm:^2.2.1"
     tslib: "npm:^2.1.0"
     use-callback-ref: "npm:^1.3.0"
@@ -6035,7 +6004,7 @@ __metadata:
   peerDependenciesMeta:
     "@types/react":
       optional: true
-  checksum: 10c0/dcd523ada602bd0a839c2032cadf0b3e4af55ee85acefee3760976a9cceaa4606927801b093bbb8bf3c2989c71e048f5428c2c6eb9e6681762e86356833d039b
+  checksum: 10c0/c5881c537477d986e8d25d2588a9b6f7fe1254e05946fb4f4b55baeead502b0e1875fc3c42bb6f82736772cd96a50266e41d84e3c4cd25e9525bdfe2d838e96d
   languageName: node
   linkType: hard
 
@@ -6236,9 +6205,9 @@ __metadata:
   linkType: hard
 
 "safe-stable-stringify@npm:^2.1.0":
-  version: 2.4.3
-  resolution: "safe-stable-stringify@npm:2.4.3"
-  checksum: 10c0/81dede06b8f2ae794efd868b1e281e3c9000e57b39801c6c162267eb9efda17bd7a9eafa7379e1f1cacd528d4ced7c80d7460ad26f62ada7c9e01dec61b2e768
+  version: 2.5.0
+  resolution: "safe-stable-stringify@npm:2.5.0"
+  checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49
   languageName: node
   linkType: hard
 
@@ -6280,11 +6249,11 @@ __metadata:
   linkType: hard
 
 "semver@npm:^7.3.5":
-  version: 7.6.2
-  resolution: "semver@npm:7.6.2"
+  version: 7.6.3
+  resolution: "semver@npm:7.6.3"
   bin:
     semver: bin/semver.js
-  checksum: 10c0/97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c
+  checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf
   languageName: node
   linkType: hard
 
@@ -6352,14 +6321,14 @@ __metadata:
   linkType: hard
 
 "socket.io-client@npm:^4.5.2":
-  version: 4.7.5
-  resolution: "socket.io-client@npm:4.7.5"
+  version: 4.8.0
+  resolution: "socket.io-client@npm:4.8.0"
   dependencies:
     "@socket.io/component-emitter": "npm:~3.1.0"
     debug: "npm:~4.3.2"
-    engine.io-client: "npm:~6.5.2"
+    engine.io-client: "npm:~6.6.1"
     socket.io-parser: "npm:~4.2.4"
-  checksum: 10c0/d5dc90ee63755fbbb0a1cb3faf575c9ce20d98e809a43a4c9c3ce03a56b8810335ae38e678ceb0650ac434d55e72ea6449c2e5d6db8bc7258f7c529148fac99d
+  checksum: 10c0/41f142a79f5903cf007902b9b830313e425c5d6a4257d504b8c94d4b4edd3df037df997e622205228bceb18eea6f3308d25f55b3c919d6100849c232e7c06928
   languageName: node
   linkType: hard
 
@@ -6374,17 +6343,17 @@ __metadata:
   linkType: hard
 
 "socks-proxy-agent@npm:^8.0.3":
-  version: 8.0.3
-  resolution: "socks-proxy-agent@npm:8.0.3"
+  version: 8.0.4
+  resolution: "socks-proxy-agent@npm:8.0.4"
   dependencies:
     agent-base: "npm:^7.1.1"
     debug: "npm:^4.3.4"
-    socks: "npm:^2.7.1"
-  checksum: 10c0/4950529affd8ccd6951575e21c1b7be8531b24d924aa4df3ee32df506af34b618c4e50d261f4cc603f1bfd8d426915b7d629966c8ce45b05fb5ad8c8b9a6459d
+    socks: "npm:^2.8.3"
+  checksum: 10c0/345593bb21b95b0508e63e703c84da11549f0a2657d6b4e3ee3612c312cb3a907eac10e53b23ede3557c6601d63252103494caa306b66560f43af7b98f53957a
   languageName: node
   linkType: hard
 
-"socks@npm:^2.7.1":
+"socks@npm:^2.8.3":
   version: 2.8.3
   resolution: "socks@npm:2.8.3"
   dependencies:
@@ -6404,9 +6373,9 @@ __metadata:
   linkType: hard
 
 "source-map-js@npm:^1.2.0":
-  version: 1.2.0
-  resolution: "source-map-js@npm:1.2.0"
-  checksum: 10c0/7e5f896ac10a3a50fe2898e5009c58ff0dc102dcb056ed27a354623a0ece8954d4b2649e1a1b2b52ef2e161d26f8859c7710350930751640e71e374fe2d321a4
+  version: 1.2.1
+  resolution: "source-map-js@npm:1.2.1"
+  checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf
   languageName: node
   linkType: hard
 
@@ -6552,8 +6521,8 @@ __metadata:
   linkType: hard
 
 "styled-components@npm:^6.1.0":
-  version: 6.1.11
-  resolution: "styled-components@npm:6.1.11"
+  version: 6.1.13
+  resolution: "styled-components@npm:6.1.13"
   dependencies:
     "@emotion/is-prop-valid": "npm:1.2.2"
     "@emotion/unitless": "npm:0.8.1"
@@ -6567,7 +6536,7 @@ __metadata:
   peerDependencies:
     react: ">= 16.8.0"
     react-dom: ">= 16.8.0"
-  checksum: 10c0/1d149a51d24f779bba700c8c23ec0538b2d2b57745ccd49d1cfdc2dfce8bcea21e8ff81fed1143d1b35d127cc591717a398da72ea6671abbf705432b13e59e56
+  checksum: 10c0/dd0379179c6ce9655c97285e9f6475b533d4cc4cad72e8f16824c5454803a9d12126877d8b2837cd5b54520250c55cde97a183e813eed720d2575362d9646663
   languageName: node
   linkType: hard
 
@@ -6618,7 +6587,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"tar@npm:^6.1.11, tar@npm:^6.1.2":
+"tar@npm:^6.1.11, tar@npm:^6.2.1":
   version: 6.2.1
   resolution: "tar@npm:6.2.1"
   dependencies:
@@ -6713,9 +6682,9 @@ __metadata:
   linkType: hard
 
 "tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.6.0":
-  version: 2.6.3
-  resolution: "tslib@npm:2.6.3"
-  checksum: 10c0/2598aef53d9dbe711af75522464b2104724d6467b26a60f2bdac8297d2b5f1f6b86a71f61717384aa8fd897240467aaa7bcc36a0700a0faf751293d1331db39a
+  version: 2.7.0
+  resolution: "tslib@npm:2.7.0"
+  checksum: 10c0/469e1d5bf1af585742128827000711efa61010b699cb040ab1800bcd3ccdd37f63ec30642c9e07c4439c1db6e46345582614275daca3e0f4abae29b0083f04a6
   languageName: node
   linkType: hard
 
@@ -6753,10 +6722,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ufo@npm:^1.4.0, ufo@npm:^1.5.3":
-  version: 1.5.3
-  resolution: "ufo@npm:1.5.3"
-  checksum: 10c0/1df10702582aa74f4deac4486ecdfd660e74be057355f1afb6adfa14243476cf3d3acff734ccc3d0b74e9bfdefe91d578f3edbbb0a5b2430fe93cd672370e024
+"ufo@npm:^1.5.4":
+  version: 1.5.4
+  resolution: "ufo@npm:1.5.4"
+  checksum: 10c0/b5dc4dc435c49c9ef8890f1b280a19ee4d0954d1d6f9ab66ce62ce64dd04c7be476781531f952a07c678d51638d02ad4b98e16237be29149295b0f7c09cda765
   languageName: node
   linkType: hard
 
@@ -6785,30 +6754,23 @@ __metadata:
   languageName: node
   linkType: hard
 
-"undici-types@npm:~5.26.4":
-  version: 5.26.5
-  resolution: "undici-types@npm:5.26.5"
-  checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501
+"undici-types@npm:~6.19.2":
+  version: 6.19.8
+  resolution: "undici-types@npm:6.19.8"
+  checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344
   languageName: node
   linkType: hard
 
-"unenv@npm:^1.9.0":
-  version: 1.9.0
-  resolution: "unenv@npm:1.9.0"
+"unenv@npm:^1.10.0":
+  version: 1.10.0
+  resolution: "unenv@npm:1.10.0"
   dependencies:
     consola: "npm:^3.2.3"
-    defu: "npm:^6.1.3"
+    defu: "npm:^6.1.4"
     mime: "npm:^3.0.0"
-    node-fetch-native: "npm:^1.6.1"
-    pathe: "npm:^1.1.1"
-  checksum: 10c0/d00012badc83731c07f08d5129c702c49c0212375eb3732b27aae89ace3c67162dbaea4496965676f18fc06b0ec445d91385e283f5fd3e4540dda8b0b5424f81
-  languageName: node
-  linkType: hard
-
-"unfetch@npm:^4.2.0":
-  version: 4.2.0
-  resolution: "unfetch@npm:4.2.0"
-  checksum: 10c0/a5c0a896a6f09f278b868075aea65652ad185db30e827cb7df45826fe5ab850124bf9c44c4dafca4bf0c55a0844b17031e8243467fcc38dd7a7d435007151f1b
+    node-fetch-native: "npm:^1.6.4"
+    pathe: "npm:^1.1.2"
+  checksum: 10c0/354180647e21204b6c303339e7364b920baadb2672b540a88af267bc827636593e0bf79f59753dcc6b7ab5d4c83e71d69a9171a3596befb8bf77e0bb3c7612b9
   languageName: node
   linkType: hard
 
@@ -6831,33 +6793,33 @@ __metadata:
   linkType: hard
 
 "unstorage@npm:^1.9.0":
-  version: 1.10.2
-  resolution: "unstorage@npm:1.10.2"
+  version: 1.12.0
+  resolution: "unstorage@npm:1.12.0"
   dependencies:
     anymatch: "npm:^3.1.3"
     chokidar: "npm:^3.6.0"
     destr: "npm:^2.0.3"
-    h3: "npm:^1.11.1"
+    h3: "npm:^1.12.0"
     listhen: "npm:^1.7.2"
-    lru-cache: "npm:^10.2.0"
+    lru-cache: "npm:^10.4.3"
     mri: "npm:^1.2.0"
-    node-fetch-native: "npm:^1.6.2"
-    ofetch: "npm:^1.3.3"
-    ufo: "npm:^1.4.0"
+    node-fetch-native: "npm:^1.6.4"
+    ofetch: "npm:^1.3.4"
+    ufo: "npm:^1.5.4"
   peerDependencies:
-    "@azure/app-configuration": ^1.5.0
-    "@azure/cosmos": ^4.0.0
+    "@azure/app-configuration": ^1.7.0
+    "@azure/cosmos": ^4.1.1
     "@azure/data-tables": ^13.2.2
-    "@azure/identity": ^4.0.1
+    "@azure/identity": ^4.4.1
     "@azure/keyvault-secrets": ^4.8.0
-    "@azure/storage-blob": ^12.17.0
-    "@capacitor/preferences": ^5.0.7
+    "@azure/storage-blob": ^12.24.0
+    "@capacitor/preferences": ^6.0.2
     "@netlify/blobs": ^6.5.0 || ^7.0.0
-    "@planetscale/database": ^1.16.0
-    "@upstash/redis": ^1.28.4
+    "@planetscale/database": ^1.19.0
+    "@upstash/redis": ^1.34.0
     "@vercel/kv": ^1.0.1
     idb-keyval: ^6.2.1
-    ioredis: ^5.3.2
+    ioredis: ^5.4.1
   peerDependenciesMeta:
     "@azure/app-configuration":
       optional: true
@@ -6885,7 +6847,7 @@ __metadata:
       optional: true
     ioredis:
       optional: true
-  checksum: 10c0/89d61e6b2165ddc78005b8a4a340576877b56b70ec0b318f7cf2e74ee7ab19006036267ba28587100fa7256c573db3bd720700daf6586bbdcad4ed60b64c4284
+  checksum: 10c0/66fc3938e6b840c326d171de34ad05b0d2752f65c67a297ad1bda5e135f1975491bab8829e1885e2a74b579015c1e2cd0db280a0fc16d205783459493643c6f6
   languageName: node
   linkType: hard
 
@@ -6968,7 +6930,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"use-sync-external-store@npm:^1.2.0":
+"use-sync-external-store@npm:1.2.2, use-sync-external-store@npm:^1.2.0":
   version: 1.2.2
   resolution: "use-sync-external-store@npm:1.2.2"
   peerDependencies:
@@ -7042,27 +7004,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"viem@npm:^1.20":
-  version: 1.21.4
-  resolution: "viem@npm:1.21.4"
-  dependencies:
-    "@adraffy/ens-normalize": "npm:1.10.0"
-    "@noble/curves": "npm:1.2.0"
-    "@noble/hashes": "npm:1.3.2"
-    "@scure/bip32": "npm:1.3.2"
-    "@scure/bip39": "npm:1.2.1"
-    abitype: "npm:0.9.8"
-    isows: "npm:1.0.3"
-    ws: "npm:8.13.0"
-  peerDependencies:
-    typescript: ">=5.0.4"
-  peerDependenciesMeta:
-    typescript:
-      optional: true
-  checksum: 10c0/8b29c790181e44c4c95b9ffed1a8c1b6c2396eb949b95697cc390ca8c49d88ef9e2cd56bd4800b90a9bbc93681ae8d63045fc6fa06e00d84f532bef77967e751
-  languageName: node
-  linkType: hard
-
 "webidl-conversions@npm:^3.0.0":
   version: 3.0.1
   resolution: "webidl-conversions@npm:3.0.1"
@@ -7218,10 +7159,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"xmlhttprequest-ssl@npm:~2.0.0":
-  version: 2.0.0
-  resolution: "xmlhttprequest-ssl@npm:2.0.0"
-  checksum: 10c0/b64ab371459bd5e3a4827e3c7535759047d285fd310aea6fd028973d547133f3be0d473c1fdae9f14d89bf509267759198ae1fbe89802079a7e217ddd990d734
+"xmlhttprequest-ssl@npm:~2.1.1":
+  version: 2.1.1
+  resolution: "xmlhttprequest-ssl@npm:2.1.1"
+  checksum: 10c0/1cef48c992676d117b1cfeb5636758c33dbd887d72bc9668ebf7d6d0c7d66ed8ea649442913a52aed3996deb9e92588d7405dbdb2e9d19cf801800ab175549fc
   languageName: node
   linkType: hard
 
@@ -7276,10 +7217,10 @@ __metadata:
   linkType: hard
 
 "zustand@npm:^4.3.9":
-  version: 4.5.2
-  resolution: "zustand@npm:4.5.2"
+  version: 4.5.5
+  resolution: "zustand@npm:4.5.5"
   dependencies:
-    use-sync-external-store: "npm:1.2.0"
+    use-sync-external-store: "npm:1.2.2"
   peerDependencies:
     "@types/react": ">=16.8"
     immer: ">=9.0.6"
@@ -7291,6 +7232,6 @@ __metadata:
       optional: true
     react:
       optional: true
-  checksum: 10c0/aee26f11facebb39b016e89539f72a72c2c00151208907fc909c3cedd455728240e09e01d98ebd3b63a2a3518a5917eac5de6c853743ca55a1655296d750bb48
+  checksum: 10c0/d04469d76b29c7e4070da269886de4efdadedd3d3824dc2a06ac4ff62e3b5877f925e927afe7382de651829872b99adec48082f1bd69fe486149be666345e626
   languageName: node
   linkType: hard
diff --git a/tsconfig.base.json b/tsconfig.base.json
index 69d902ee7..5a85853e3 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -15,12 +15,14 @@
     "skipDefaultLibCheck": true,
     "baseUrl": ".",
     "paths": {
+      "@pushprotocol/dnode": ["packages/dnode/src/index.ts"],
       "@pushprotocol/ledgerlive": ["packages/ledgerlive/src/index.ts"],
       "@pushprotocol/reactnative": ["packages/reactnative/src/index.ts"],
       "@pushprotocol/restapi": ["packages/restapi/src/index.ts"],
       "@pushprotocol/socket": ["packages/socket/src/index.ts"],
       "@pushprotocol/uiembed": ["packages/uiembed/src/index.ts"],
       "@pushprotocol/uiweb": ["packages/uiweb/src/index.ts"]
+
     }
   },
   "exclude": ["node_modules", "tmp"]
diff --git a/workspace.json b/workspace.json
index 37bec3e7e..b8411fa67 100644
--- a/workspace.json
+++ b/workspace.json
@@ -2,13 +2,14 @@
   "$schema": "./node_modules/nx/schemas/workspace-schema.json",
   "version": 2,
   "projects": {
+    "dnode": "packages/dnode",
     "examples-sdk-frontend-react": "packages/examples/sdk-frontend-react",
     "ledgerlive": "packages/ledgerlive",
+    "react-native-sdk": "packages/reactnative",
     "restapi": "packages/restapi",
     "socket": "packages/socket",
     "uiembed": "packages/uiembed",
-    "uiweb": "packages/uiweb",
-    "react-native-sdk": "packages/reactnative",
-    "uireactnative": "packages/uireactnative"
+    "uireactnative": "packages/uireactnative",
+    "uiweb": "packages/uiweb"
   }
 }
diff --git a/yarn.lock b/yarn.lock
index 172a433f3..dd949300c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6,14 +6,14 @@ __metadata:
   cacheKey: 10c0
 
 "@0no-co/graphql.web@npm:^1.0.5":
-  version: 1.0.7
-  resolution: "@0no-co/graphql.web@npm:1.0.7"
+  version: 1.0.8
+  resolution: "@0no-co/graphql.web@npm:1.0.8"
   peerDependencies:
     graphql: ^14.0.0 || ^15.0.0 || ^16.0.0
   peerDependenciesMeta:
     graphql:
       optional: true
-  checksum: 10c0/4744a6c327e0a2d564c8f4720ef08dcece6c3b8373f52208ff29f7086f90e18d211c59cc222c229f1e3241abd1fc6e30377dc1dadac491bbb25706f29dea626a
+  checksum: 10c0/06504e14955cc88ebf5debd1caa58f6f7f33f195a749d75d13e91fd7e448957590d3b790f6a002bdca4a81af7a13d8ff05b471802dd02bd29f3c8853533c950b
   languageName: node
   linkType: hard
 
@@ -43,123 +43,121 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.7, @babel/code-frame@npm:^7.8.3":
-  version: 7.24.7
-  resolution: "@babel/code-frame@npm:7.24.7"
+"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.25.7, @babel/code-frame@npm:^7.8.3":
+  version: 7.25.7
+  resolution: "@babel/code-frame@npm:7.25.7"
   dependencies:
-    "@babel/highlight": "npm:^7.24.7"
+    "@babel/highlight": "npm:^7.25.7"
     picocolors: "npm:^1.0.0"
-  checksum: 10c0/ab0af539473a9f5aeaac7047e377cb4f4edd255a81d84a76058595f8540784cc3fbe8acf73f1e073981104562490aabfb23008cd66dc677a456a4ed5390fdde6
+  checksum: 10c0/14825c298bdec914caf3d24d1383b6d4cd6b030714686004992f4fc251831ecf432236652896f99d5d341f17170ae9a07b58d8d7b15aa0df8cfa1c5a7d5474bc
   languageName: node
   linkType: hard
 
-"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/compat-data@npm:7.24.7"
-  checksum: 10c0/dcd93a5632b04536498fbe2be5af1057f635fd7f7090483d8e797878559037e5130b26862ceb359acbae93ed27e076d395ddb4663db6b28a665756ffd02d324f
+"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/compat-data@npm:7.25.7"
+  checksum: 10c0/e5cc915abdd18d021236474a96606b2d4a915c4fb620c1ad776b8a08d91111e788cb3b7e9bad43593d4e0bfa4f06894357bcb0984102de1861b9e7322b6bc9f8
   languageName: node
   linkType: hard
 
 "@babel/core@npm:^7.1.0, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.16, @babel/core@npm:^7.14.0, @babel/core@npm:^7.15.0, @babel/core@npm:^7.19.6, @babel/core@npm:^7.7.2, @babel/core@npm:^7.8.0":
-  version: 7.24.7
-  resolution: "@babel/core@npm:7.24.7"
+  version: 7.25.7
+  resolution: "@babel/core@npm:7.25.7"
   dependencies:
     "@ampproject/remapping": "npm:^2.2.0"
-    "@babel/code-frame": "npm:^7.24.7"
-    "@babel/generator": "npm:^7.24.7"
-    "@babel/helper-compilation-targets": "npm:^7.24.7"
-    "@babel/helper-module-transforms": "npm:^7.24.7"
-    "@babel/helpers": "npm:^7.24.7"
-    "@babel/parser": "npm:^7.24.7"
-    "@babel/template": "npm:^7.24.7"
-    "@babel/traverse": "npm:^7.24.7"
-    "@babel/types": "npm:^7.24.7"
+    "@babel/code-frame": "npm:^7.25.7"
+    "@babel/generator": "npm:^7.25.7"
+    "@babel/helper-compilation-targets": "npm:^7.25.7"
+    "@babel/helper-module-transforms": "npm:^7.25.7"
+    "@babel/helpers": "npm:^7.25.7"
+    "@babel/parser": "npm:^7.25.7"
+    "@babel/template": "npm:^7.25.7"
+    "@babel/traverse": "npm:^7.25.7"
+    "@babel/types": "npm:^7.25.7"
     convert-source-map: "npm:^2.0.0"
     debug: "npm:^4.1.0"
     gensync: "npm:^1.0.0-beta.2"
     json5: "npm:^2.2.3"
     semver: "npm:^6.3.1"
-  checksum: 10c0/4004ba454d3c20a46ea66264e06c15b82e9f6bdc35f88819907d24620da70dbf896abac1cb4cc4b6bb8642969e45f4d808497c9054a1388a386cf8c12e9b9e0d
+  checksum: 10c0/dad20af39624086afc3a0910bd97ae712c9ad0e9dda09fc5da93876e8ea1802b63ddd81c44f4aa8a9834db46de801eaab1ce9b81ab54b4fe907ae052c24de136
   languageName: node
   linkType: hard
 
-"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.24.7, @babel/generator@npm:^7.7.2":
-  version: 7.24.7
-  resolution: "@babel/generator@npm:7.24.7"
+"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.25.7, @babel/generator@npm:^7.7.2":
+  version: 7.25.7
+  resolution: "@babel/generator@npm:7.25.7"
   dependencies:
-    "@babel/types": "npm:^7.24.7"
+    "@babel/types": "npm:^7.25.7"
     "@jridgewell/gen-mapping": "npm:^0.3.5"
     "@jridgewell/trace-mapping": "npm:^0.3.25"
-    jsesc: "npm:^2.5.1"
-  checksum: 10c0/06b1f3350baf527a3309e50ffd7065f7aee04dd06e1e7db794ddfde7fe9d81f28df64edd587173f8f9295496a7ddb74b9a185d4bf4de7bb619e6d4ec45c8fd35
+    jsesc: "npm:^3.0.2"
+  checksum: 10c0/c03a26c79864d60d04ce36b649c3fa0d6fd7b2bf6a22e22854a0457aa09206508392dd73ee40e7bc8d50b3602f9ff068afa47770cda091d332e7db1ca382ee96
   languageName: node
   linkType: hard
 
-"@babel/helper-annotate-as-pure@npm:^7.15.4, @babel/helper-annotate-as-pure@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-annotate-as-pure@npm:7.24.7"
+"@babel/helper-annotate-as-pure@npm:^7.15.4, @babel/helper-annotate-as-pure@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-annotate-as-pure@npm:7.25.7"
   dependencies:
-    "@babel/types": "npm:^7.24.7"
-  checksum: 10c0/4679f7df4dffd5b3e26083ae65228116c3da34c3fff2c11ae11b259a61baec440f51e30fd236f7a0435b9d471acd93d0bc5a95df8213cbf02b1e083503d81b9a
+    "@babel/types": "npm:^7.25.7"
+  checksum: 10c0/2f020b0fa9d336b5778485cc2de3141561ec436a7591b685457a5bcdae4ce41d9ddee68169c95504e0789e5a4327e73b8b7e72e5b60e82e96d730c4d19255248
   languageName: node
   linkType: hard
 
-"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.7"
+"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.25.7"
   dependencies:
-    "@babel/traverse": "npm:^7.24.7"
-    "@babel/types": "npm:^7.24.7"
-  checksum: 10c0/0ed84abf848c79fb1cd4c1ddac12c771d32c1904d87fc3087f33cfdeb0c2e0db4e7892b74b407d9d8d0c000044f3645a7391a781f788da8410c290bb123a1f13
+    "@babel/traverse": "npm:^7.25.7"
+    "@babel/types": "npm:^7.25.7"
+  checksum: 10c0/e9dc5a7920a1d74150dec53ccd5e34f2b31ae307df7cdeec6289866f7bda97ecb1328b49a7710ecde5db5b6daad768c904a030f9a0fa3184963b0017622c42aa
   languageName: node
   linkType: hard
 
-"@babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-compilation-targets@npm:7.24.7"
+"@babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-compilation-targets@npm:7.25.7"
   dependencies:
-    "@babel/compat-data": "npm:^7.24.7"
-    "@babel/helper-validator-option": "npm:^7.24.7"
-    browserslist: "npm:^4.22.2"
+    "@babel/compat-data": "npm:^7.25.7"
+    "@babel/helper-validator-option": "npm:^7.25.7"
+    browserslist: "npm:^4.24.0"
     lru-cache: "npm:^5.1.1"
     semver: "npm:^6.3.1"
-  checksum: 10c0/1d580a9bcacefe65e6bf02ba1dafd7ab278269fef45b5e281d8354d95c53031e019890464e7f9351898c01502dd2e633184eb0bcda49ed2ecd538675ce310f51
+  checksum: 10c0/705be7e5274a3fdade68e3e2cf42e2b600316ab52794e13b91299a16f16c926f15886b6e9d6df20eb943ccc1cdba5a363d4766f8d01e47b8e6f4e01175f5e66c
   languageName: node
   linkType: hard
 
-"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-create-class-features-plugin@npm:7.24.7"
-  dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.24.7"
-    "@babel/helper-environment-visitor": "npm:^7.24.7"
-    "@babel/helper-function-name": "npm:^7.24.7"
-    "@babel/helper-member-expression-to-functions": "npm:^7.24.7"
-    "@babel/helper-optimise-call-expression": "npm:^7.24.7"
-    "@babel/helper-replace-supers": "npm:^7.24.7"
-    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7"
-    "@babel/helper-split-export-declaration": "npm:^7.24.7"
+"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-create-class-features-plugin@npm:7.25.7"
+  dependencies:
+    "@babel/helper-annotate-as-pure": "npm:^7.25.7"
+    "@babel/helper-member-expression-to-functions": "npm:^7.25.7"
+    "@babel/helper-optimise-call-expression": "npm:^7.25.7"
+    "@babel/helper-replace-supers": "npm:^7.25.7"
+    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.7"
+    "@babel/traverse": "npm:^7.25.7"
     semver: "npm:^6.3.1"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/6b7b47d70b41c00f39f86790cff67acf2bce0289d52a7c182b28e797f4e0e6d69027e3d06eccf1d54dddc2e5dde1df663bb1932437e5f447aeb8635d8d64a6ab
+  checksum: 10c0/405c3c1a137acda1206380a96993cf2cfd808b3bee1c11c4af47ee0f03a20858497aa53394d6adc5431793c543be5e02010620e871a5ab39d938ae90a54b50f2
   languageName: node
   linkType: hard
 
-"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-create-regexp-features-plugin@npm:7.24.7"
+"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.7"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.24.7"
-    regexpu-core: "npm:^5.3.1"
+    "@babel/helper-annotate-as-pure": "npm:^7.25.7"
+    regexpu-core: "npm:^6.1.1"
     semver: "npm:^6.3.1"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/ed611a7eb0c71843f9cdc471eeb38767972229f9225f7aaa90d124d7ee0062cf6908fd53ee9c34f731394c429594f06049a7738a71d342e0191d4047b2fc0ac2
+  checksum: 10c0/75919fd5a67cd7be8497b56f7b9ed6b4843cb401956ba8d403aa9ae5b005bc28e35c7f27e704d820edbd1154394ed7a7984d4719916795d89d716f6980fe8bd4
   languageName: node
   linkType: hard
 
-"@babel/helper-define-polyfill-provider@npm:^0.6.1, @babel/helper-define-polyfill-provider@npm:^0.6.2":
+"@babel/helper-define-polyfill-provider@npm:^0.6.2":
   version: 0.6.2
   resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2"
   dependencies:
@@ -174,7 +172,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-environment-visitor@npm:^7.18.9, @babel/helper-environment-visitor@npm:^7.24.7":
+"@babel/helper-environment-visitor@npm:^7.18.9":
   version: 7.24.7
   resolution: "@babel/helper-environment-visitor@npm:7.24.7"
   dependencies:
@@ -183,240 +181,223 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-function-name@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-function-name@npm:7.24.7"
+"@babel/helper-member-expression-to-functions@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-member-expression-to-functions@npm:7.25.7"
   dependencies:
-    "@babel/template": "npm:^7.24.7"
-    "@babel/types": "npm:^7.24.7"
-  checksum: 10c0/e5e41e6cf86bd0f8bf272cbb6e7c5ee0f3e9660414174435a46653efba4f2479ce03ce04abff2aa2ef9359cf057c79c06cb7b134a565ad9c0e8a50dcdc3b43c4
+    "@babel/traverse": "npm:^7.25.7"
+    "@babel/types": "npm:^7.25.7"
+  checksum: 10c0/1e948162ab48d84593a7c6ec9570d14c906146f1697144fc369c59dbeb00e4a062da67dd06cb0d8f98a044cd8389002dcf2ab6f5613d99c35748307846ec63fc
   languageName: node
   linkType: hard
 
-"@babel/helper-hoist-variables@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-hoist-variables@npm:7.24.7"
+"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.15.4, @babel/helper-module-imports@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-module-imports@npm:7.25.7"
   dependencies:
-    "@babel/types": "npm:^7.24.7"
-  checksum: 10c0/19ee37563bbd1219f9d98991ad0e9abef77803ee5945fd85aa7aa62a67c69efca9a801696a1b58dda27f211e878b3327789e6fd2a6f6c725ccefe36774b5ce95
+    "@babel/traverse": "npm:^7.25.7"
+    "@babel/types": "npm:^7.25.7"
+  checksum: 10c0/0fd0c3673835e5bf75558e184bcadc47c1f6dd2fe2016d53ebe1e5a6ae931a44e093015c2f9a6651c1a89f25c76d9246710c2b0b460b95ee069c464f2837fa2c
   languageName: node
   linkType: hard
 
-"@babel/helper-member-expression-to-functions@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-member-expression-to-functions@npm:7.24.7"
+"@babel/helper-module-transforms@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-module-transforms@npm:7.25.7"
   dependencies:
-    "@babel/traverse": "npm:^7.24.7"
-    "@babel/types": "npm:^7.24.7"
-  checksum: 10c0/9638c1d33cf6aba028461ccd3db6061c76ff863ca0d5013dd9a088bf841f2f77c46956493f9da18355c16759449d23b74cc1de4da357ade5c5c34c858f840f0a
-  languageName: node
-  linkType: hard
-
-"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.15.4, @babel/helper-module-imports@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-module-imports@npm:7.24.7"
-  dependencies:
-    "@babel/traverse": "npm:^7.24.7"
-    "@babel/types": "npm:^7.24.7"
-  checksum: 10c0/97c57db6c3eeaea31564286e328a9fb52b0313c5cfcc7eee4bc226aebcf0418ea5b6fe78673c0e4a774512ec6c86e309d0f326e99d2b37bfc16a25a032498af0
-  languageName: node
-  linkType: hard
-
-"@babel/helper-module-transforms@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-module-transforms@npm:7.24.7"
-  dependencies:
-    "@babel/helper-environment-visitor": "npm:^7.24.7"
-    "@babel/helper-module-imports": "npm:^7.24.7"
-    "@babel/helper-simple-access": "npm:^7.24.7"
-    "@babel/helper-split-export-declaration": "npm:^7.24.7"
-    "@babel/helper-validator-identifier": "npm:^7.24.7"
+    "@babel/helper-module-imports": "npm:^7.25.7"
+    "@babel/helper-simple-access": "npm:^7.25.7"
+    "@babel/helper-validator-identifier": "npm:^7.25.7"
+    "@babel/traverse": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/4f311755fcc3b4cbdb689386309cdb349cf0575a938f0b9ab5d678e1a81bbb265aa34ad93174838245f2ac7ff6d5ddbd0104638a75e4e961958ed514355687b6
+  checksum: 10c0/f37fa7d1d4df21690535b278468cbd5faf0133a3080f282000cfa4f3ffc9462a1458f866b04b6a2f2d1eec4691236cba9a867da61270dab3ab19846e62f05090
   languageName: node
   linkType: hard
 
-"@babel/helper-optimise-call-expression@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-optimise-call-expression@npm:7.24.7"
+"@babel/helper-optimise-call-expression@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-optimise-call-expression@npm:7.25.7"
   dependencies:
-    "@babel/types": "npm:^7.24.7"
-  checksum: 10c0/ca6a9884705dea5c95a8b3ce132d1e3f2ae951ff74987d400d1d9c215dae9c0f9e29924d8f8e131e116533d182675bc261927be72f6a9a2968eaeeaa51eb1d0f
+    "@babel/types": "npm:^7.25.7"
+  checksum: 10c0/19b4cc7e77811b1fedca4928dbc14026afef913c2ba4142e5e110ebdcb5c3b2efc0f0fbee9f362c23a194674147b9d627adea71c289b9be08b9067bc0085308b
   languageName: node
   linkType: hard
 
-"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3":
-  version: 7.24.7
-  resolution: "@babel/helper-plugin-utils@npm:7.24.7"
-  checksum: 10c0/c3d38cd9b3520757bb4a279255cc3f956fc0ac1c193964bd0816ebd5c86e30710be8e35252227e0c9d9e0f4f56d9b5f916537f2bc588084b0988b4787a967d31
+"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.7, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3":
+  version: 7.25.7
+  resolution: "@babel/helper-plugin-utils@npm:7.25.7"
+  checksum: 10c0/241f8cf3c5b7700e91cab7cfe5b432a3c710ae3cd5bb96dc554da536a6d25f5b9f000cc0c0917501ceb4f76ba92599ee3beb25e10adaf96be59f8df89a842faf
   languageName: node
   linkType: hard
 
-"@babel/helper-remap-async-to-generator@npm:^7.18.9, @babel/helper-remap-async-to-generator@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-remap-async-to-generator@npm:7.24.7"
+"@babel/helper-remap-async-to-generator@npm:^7.18.9, @babel/helper-remap-async-to-generator@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-remap-async-to-generator@npm:7.25.7"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.24.7"
-    "@babel/helper-environment-visitor": "npm:^7.24.7"
-    "@babel/helper-wrap-function": "npm:^7.24.7"
+    "@babel/helper-annotate-as-pure": "npm:^7.25.7"
+    "@babel/helper-wrap-function": "npm:^7.25.7"
+    "@babel/traverse": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/4e7fa2cdcbc488e41c27066c16e562857ef3c5c2bfe70d2f1e32e9ee7546b17c3fc1c20d05bf2a7f1c291bd9e7a0a219f6a9fa387209013294be79a26fcfe64d
+  checksum: 10c0/972d84876adce6ab61c87a2df47e1afc790b73cff0d1767d0a1c5d9f7aa5e91d8c581a272b66b2051a26cfbb167d8a780564705e488e3ce1f477f1c15059bc5f
   languageName: node
   linkType: hard
 
-"@babel/helper-replace-supers@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-replace-supers@npm:7.24.7"
+"@babel/helper-replace-supers@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-replace-supers@npm:7.25.7"
   dependencies:
-    "@babel/helper-environment-visitor": "npm:^7.24.7"
-    "@babel/helper-member-expression-to-functions": "npm:^7.24.7"
-    "@babel/helper-optimise-call-expression": "npm:^7.24.7"
+    "@babel/helper-member-expression-to-functions": "npm:^7.25.7"
+    "@babel/helper-optimise-call-expression": "npm:^7.25.7"
+    "@babel/traverse": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/0e133bb03371dee78e519c334a09c08e1493103a239d9628db0132dfaac3fc16380479ca3c590d278a9b71b624030a338c18ebbfe6d430ebb2e4653775c4b3e3
+  checksum: 10c0/761d64ee74429f7326a6aa65e2cd5bfcb8de9e3bc3f1efb14b8f610d2410f003b0fca52778dc801d49ff8fbc90b057e8f51b27c62b0b05c95eaf23140ca1287b
   languageName: node
   linkType: hard
 
-"@babel/helper-simple-access@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-simple-access@npm:7.24.7"
+"@babel/helper-simple-access@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-simple-access@npm:7.25.7"
   dependencies:
-    "@babel/traverse": "npm:^7.24.7"
-    "@babel/types": "npm:^7.24.7"
-  checksum: 10c0/7230e419d59a85f93153415100a5faff23c133d7442c19e0cd070da1784d13cd29096ee6c5a5761065c44e8164f9f80e3a518c41a0256df39e38f7ad6744fed7
+    "@babel/traverse": "npm:^7.25.7"
+    "@babel/types": "npm:^7.25.7"
+  checksum: 10c0/eed1b499bfb4f613c18debd61517e3de77b6da2727ca025aa05ac81599e0269f1dddb5237db04e8bb598115d015874752e0a7f11ff38672d74a4976097417059
   languageName: node
   linkType: hard
 
-"@babel/helper-skip-transparent-expression-wrappers@npm:^7.20.0, @babel/helper-skip-transparent-expression-wrappers@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.7"
+"@babel/helper-skip-transparent-expression-wrappers@npm:^7.20.0, @babel/helper-skip-transparent-expression-wrappers@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.7"
   dependencies:
-    "@babel/traverse": "npm:^7.24.7"
-    "@babel/types": "npm:^7.24.7"
-  checksum: 10c0/e3a9b8ac9c262ac976a1bcb5fe59694db5e6f0b4f9e7bdba5c7693b8b5e28113c23bdaa60fe8d3ec32a337091b67720b2053bcb3d5655f5406536c3d0584242b
+    "@babel/traverse": "npm:^7.25.7"
+    "@babel/types": "npm:^7.25.7"
+  checksum: 10c0/5804adb893849a9d8cfb548e3812566a81d95cb0c9a10d66b52912d13f488e577c33063bf19bc06ac70e6333162a7370d67ba1a1c3544d37fb50d5f4a00db4de
   languageName: node
   linkType: hard
 
-"@babel/helper-split-export-declaration@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-split-export-declaration@npm:7.24.7"
-  dependencies:
-    "@babel/types": "npm:^7.24.7"
-  checksum: 10c0/0254577d7086bf09b01bbde98f731d4fcf4b7c3fa9634fdb87929801307c1f6202a1352e3faa5492450fa8da4420542d44de604daf540704ff349594a78184f6
+"@babel/helper-string-parser@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-string-parser@npm:7.25.7"
+  checksum: 10c0/73ef2ceb81f8294678a0afe8ab0103729c0370cac2e830e0d5128b03be5f6a2635838af31d391d763e3c5a4460ed96f42fd7c9b552130670d525be665913bc4c
   languageName: node
   linkType: hard
 
-"@babel/helper-string-parser@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-string-parser@npm:7.24.7"
-  checksum: 10c0/47840c7004e735f3dc93939c77b099bb41a64bf3dda0cae62f60e6f74a5ff80b63e9b7cf77b5ec25a324516381fc994e1f62f922533236a8e3a6af57decb5e1e
+"@babel/helper-validator-identifier@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-validator-identifier@npm:7.25.7"
+  checksum: 10c0/07438e5bf01ab2882a15027fdf39ac3b0ba1b251774a5130917907014684e2f70fef8fd620137ca062c4c4eedc388508d2ea7a3a7d9936a32785f4fe116c68c0
   languageName: node
   linkType: hard
 
-"@babel/helper-validator-identifier@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-validator-identifier@npm:7.24.7"
-  checksum: 10c0/87ad608694c9477814093ed5b5c080c2e06d44cb1924ae8320474a74415241223cc2a725eea2640dd783ff1e3390e5f95eede978bc540e870053152e58f1d651
+"@babel/helper-validator-option@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-validator-option@npm:7.25.7"
+  checksum: 10c0/12ed418c8e3ed9ed44c8c80d823f4e42d399b5eb2e423adccb975e31a31a008cd3b5d8eab688b31f740caff4a1bb28fe06ea2fa7d635aee34cc0ad6995d50f0a
   languageName: node
   linkType: hard
 
-"@babel/helper-validator-option@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-validator-option@npm:7.24.7"
-  checksum: 10c0/21aea2b7bc5cc8ddfb828741d5c8116a84cbc35b4a3184ec53124f08e09746f1f67a6f9217850188995ca86059a7942e36d8965a6730784901def777b7e8a436
-  languageName: node
-  linkType: hard
-
-"@babel/helper-wrap-function@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helper-wrap-function@npm:7.24.7"
+"@babel/helper-wrap-function@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helper-wrap-function@npm:7.25.7"
   dependencies:
-    "@babel/helper-function-name": "npm:^7.24.7"
-    "@babel/template": "npm:^7.24.7"
-    "@babel/traverse": "npm:^7.24.7"
-    "@babel/types": "npm:^7.24.7"
-  checksum: 10c0/d5689f031bf0eb38c0d7fad6b7e320ddef4bfbdf08d12d7d76ef41b7ca365a32721e74cb5ed5a9a9ec634bc20f9b7a27314fa6fb08f1576b8f6d8330fcea6f47
+    "@babel/template": "npm:^7.25.7"
+    "@babel/traverse": "npm:^7.25.7"
+    "@babel/types": "npm:^7.25.7"
+  checksum: 10c0/b5d412f72697f4a4ce4cb9784fbaf82501c63cf95066c0eadd3179e3439cbbf0aa5fa4858d93590083671943cd357aeb87286958df34aa56fdf8a4c9dea39755
   languageName: node
   linkType: hard
 
-"@babel/helpers@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/helpers@npm:7.24.7"
+"@babel/helpers@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/helpers@npm:7.25.7"
   dependencies:
-    "@babel/template": "npm:^7.24.7"
-    "@babel/types": "npm:^7.24.7"
-  checksum: 10c0/aa8e230f6668773e17e141dbcab63e935c514b4b0bf1fed04d2eaefda17df68e16b61a56573f7f1d4d1e605ce6cc162b5f7e9fdf159fde1fd9b77c920ae47d27
+    "@babel/template": "npm:^7.25.7"
+    "@babel/types": "npm:^7.25.7"
+  checksum: 10c0/3b3ae9e373bd785414195ef8f59976a69d5a6ebe0ef2165fdcc5165e5c3ee09e0fcee94bb457df2ddb8c0532e4146d0a9b7a96b3497399a4bff4ffe196b30228
   languageName: node
   linkType: hard
 
-"@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/highlight@npm:7.24.7"
+"@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/highlight@npm:7.25.7"
   dependencies:
-    "@babel/helper-validator-identifier": "npm:^7.24.7"
+    "@babel/helper-validator-identifier": "npm:^7.25.7"
     chalk: "npm:^2.4.2"
     js-tokens: "npm:^4.0.0"
     picocolors: "npm:^1.0.0"
-  checksum: 10c0/674334c571d2bb9d1c89bdd87566383f59231e16bcdcf5bb7835babdf03c9ae585ca0887a7b25bdf78f303984af028df52831c7989fecebb5101cc132da9393a
+  checksum: 10c0/1f5894fdb0a0af6101fb2822369b2eeeae32cbeae2ef73ff73fc6a0a4a20471565cd9cfa589f54ed69df66adeca7c57266031ca9134b7bd244d023a488d419aa
   languageName: node
   linkType: hard
 
-"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/parser@npm:7.24.7"
+"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/parser@npm:7.25.7"
+  dependencies:
+    "@babel/types": "npm:^7.25.7"
   bin:
     parser: ./bin/babel-parser.js
-  checksum: 10c0/8b244756872185a1c6f14b979b3535e682ff08cb5a2a5fd97cc36c017c7ef431ba76439e95e419d43000c5b07720495b00cf29a7f0d9a483643d08802b58819b
+  checksum: 10c0/b771469bb6b636c18a8d642b9df3c73913c3860a979591e1a29a98659efd38b81d3e393047b5251fe382d4c82c681c12da9ce91c98d69316d2604d155a214bcf
   languageName: node
   linkType: hard
 
-"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.7"
+"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.7"
   dependencies:
-    "@babel/helper-environment-visitor": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/traverse": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/394c30e2b708ad385fa1219528e039066a1f1cb40f47986f283878848fd354c745e6397f588b4e5a046ee8d64bfdf4c208e4c3dfbdcfb2fd34315ec67c64e7af
+  checksum: 10c0/c6ba97c39973897a2ab021c4a77221e1e93e853a5811d498db325da1bd692e41fa521db6d91bb709ccafd4e54ddd00869ffb35846923c3ccd49d46124b316904
   languageName: node
   linkType: hard
 
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.7"
+"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/a36307428ecc1a01b00cf90812335eed1575d13f211ab24fe4d0c55c28a2fcbd4135f142efabc3b277b2a8e09ee05df594a1272353f061b63829495b5dcfdb96
+  checksum: 10c0/ac284868bf410f952c6959b0d77708464127160416f003b05c8127d30e64792d671abc167ebf778b17707e32174223ea8d3ff487276991fa90297d92f0dac6e2
   languageName: node
   linkType: hard
 
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.7"
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.7"
+  dependencies:
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+  peerDependencies:
+    "@babel/core": ^7.0.0
+  checksum: 10c0/1bffc0a20c8c82b4c77515eb4c99b961b38184116f008bb42bed4e12d3379ba7b2bc6cf299bcea8118d645bb7a5e0caa83969842f16dd1fce49fb3a050e4ac65
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7"
-    "@babel/plugin-transform-optional-chaining": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.7"
+    "@babel/plugin-transform-optional-chaining": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.13.0
-  checksum: 10c0/aeb6e7aa363a47f815cf956ea1053c5dd8b786a17799f065c9688ba4b0051fe7565d258bbe9400bfcbfb3114cb9fda66983e10afe4d750bc70ff75403e15dd36
+  checksum: 10c0/32223f012614a0b2657579317ded7d0d09af2aa316285715c5012f974d0f15c2ce2fe0d8e80fdd9bac6c10c21c93cc925a9dfd6c8e21ce7ba1a9fe06a58088b4
   languageName: node
   linkType: hard
 
-"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.7"
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.7"
   dependencies:
-    "@babel/helper-environment-visitor": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/traverse": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/2b52a73e444f6adc73f927b623e53a4cf64397170dd1071268536df1b3db1e02131418c8dc91351af48837a6298212118f4a72d5407f8005cf9a732370a315b0
+  checksum: 10c0/aa2ee7a5954d187de6cbcca0e0b64cfb79c4d224c332d1eb1e0e4afd92ef1a1f4bc4af24f66154097ccb348c08121a875456f47baed220b1b9e93584e6a19b65
   languageName: node
   linkType: hard
 
@@ -447,27 +428,27 @@ __metadata:
   linkType: hard
 
 "@babel/plugin-proposal-decorators@npm:^7.12.9, @babel/plugin-proposal-decorators@npm:^7.14.5":
-  version: 7.24.7
-  resolution: "@babel/plugin-proposal-decorators@npm:7.24.7"
+  version: 7.25.7
+  resolution: "@babel/plugin-proposal-decorators@npm:7.25.7"
   dependencies:
-    "@babel/helper-create-class-features-plugin": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/plugin-syntax-decorators": "npm:^7.24.7"
+    "@babel/helper-create-class-features-plugin": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/plugin-syntax-decorators": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/fb4e4711f90fed63aa4dfe34fc5f5a5d0af175725181678f462ee0df2b78a23ae83b9424403c6b957edbc07d2abc80f82f3b9f91baf568bdaf85e8196a9138d5
+  checksum: 10c0/224785977af0e6318a8ef7a54481221df62f2148e04a6143a1a664e92461d98d2ffbf6d72caab1bee5e24483cc0fc9707ec2ecef943a35640019496d1334dd0c
   languageName: node
   linkType: hard
 
 "@babel/plugin-proposal-export-default-from@npm:^7.0.0":
-  version: 7.24.7
-  resolution: "@babel/plugin-proposal-export-default-from@npm:7.24.7"
+  version: 7.25.7
+  resolution: "@babel/plugin-proposal-export-default-from@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/plugin-syntax-export-default-from": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/plugin-syntax-export-default-from": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/ebc98b1bc0b9334a82030f8fe93f9a9de546982c5402b936c8cfae3eec63742ceb862d95104ac8976293aa2dd9c1b7a8cbebc44da3d63bbf3896517ad47616a4
+  checksum: 10c0/51d89ccaa2f165d888031569b1115929594ba72cf0fd87c23a9061c97c79d215956adcc1eeffdba6bb8cebcf9d5e882fdbdac484dfec281ce96e96a6c20d2b1e
   languageName: node
   linkType: hard
 
@@ -554,7 +535,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-class-properties@npm:^7.0.0, @babel/plugin-syntax-class-properties@npm:^7.12.13, @babel/plugin-syntax-class-properties@npm:^7.8.3":
+"@babel/plugin-syntax-class-properties@npm:^7.0.0, @babel/plugin-syntax-class-properties@npm:^7.12.13":
   version: 7.12.13
   resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13"
   dependencies:
@@ -576,14 +557,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-decorators@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-syntax-decorators@npm:7.24.7"
+"@babel/plugin-syntax-decorators@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-syntax-decorators@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/d1ecc334af7a5418a6e8ad5e711bf5d5a892ba00e04ba05b90077b9da735585ff8d4141e4fc3ae781b854f48eda9f3a9cfa9f1c80f5f4a697dbded01058a8b63
+  checksum: 10c0/7a2a5b6f1965b2cc883d534845923cb0f02c641de9a2150207289f5bef1776d1b5aa60e4d08917540c3692d48257c1a7b9b12389c31755f715d262f60e756f20
   languageName: node
   linkType: hard
 
@@ -598,14 +579,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-export-default-from@npm:^7.0.0, @babel/plugin-syntax-export-default-from@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-syntax-export-default-from@npm:7.24.7"
+"@babel/plugin-syntax-export-default-from@npm:^7.0.0, @babel/plugin-syntax-export-default-from@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-syntax-export-default-from@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/2748bcd6777d1ef29d568815915df5db043744364a4bc746e8b27f2f461de89a4bdf332764339146ef91b8474440edf04c745e97ef0360effb4ac35e750379a4
+  checksum: 10c0/490344179679e380f36349d937b2b5d31bfdbb41b011bbd0a4b5dcb07d0491c3cd69e0e3d01d98482be08e3411bd60c343d32b9cd137c899d7d6da3ff5e910d0
   languageName: node
   linkType: hard
 
@@ -620,40 +601,40 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-flow@npm:^7.0.0, @babel/plugin-syntax-flow@npm:^7.2.0, @babel/plugin-syntax-flow@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-syntax-flow@npm:7.24.7"
+"@babel/plugin-syntax-flow@npm:^7.0.0, @babel/plugin-syntax-flow@npm:^7.2.0, @babel/plugin-syntax-flow@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-syntax-flow@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/2f0cb7a78379029707e61f6665634a5b758c8b4ccb602a72d798e41d36b0647c2f2de59f90e0c1d522b026962918e54d82f3aee0c194dc87cd340455aa58562a
+  checksum: 10c0/36799e0af9cab97b688c46caef0fc596323dea7f8772abea229267be9a2c205db27b74bdac26e29ea4f9f116a0337fc40e7b96644a87f26572e6ba1723ed0bbb
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-import-assertions@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.7"
+"@babel/plugin-syntax-import-assertions@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-syntax-import-assertions@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/b82c53e095274ee71c248551352d73441cf65b3b3fc0107258ba4e9aef7090772a425442b3ed1c396fa207d0efafde8929c87a17d3c885b3ca2021316e87e246
+  checksum: 10c0/0fee0d971f3c654749fdf92e09b6556bba26ab014c8e99b7252f6a7f1ca108f17edd7ceefb5401d7b7008e98ab1b6f8c3c6a5db72862e7c7b2fcd649d000d690
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-import-attributes@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.7"
+"@babel/plugin-syntax-import-attributes@npm:^7.24.7, @babel/plugin-syntax-import-attributes@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-syntax-import-attributes@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/eccc54d0f03c96d0eec7a6e2fa124dadbc7298345b62ffc4238f173308c4325b5598f139695ff05a95cf78412ef6903599e4b814496612bf39aad4715a16375b
+  checksum: 10c0/fe00cdb96fd289ab126830a98e1dcf5ab7b529a6ef1c01a72506b5e7b1197d6e46c3c4d029cd90d1d61eb9a15ef77c282d156d0c02c7e32f168bb09d84150db4
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-import-meta@npm:^7.10.4, @babel/plugin-syntax-import-meta@npm:^7.8.3":
+"@babel/plugin-syntax-import-meta@npm:^7.10.4":
   version: 7.10.4
   resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4"
   dependencies:
@@ -675,18 +656,18 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-jsx@npm:^7.0.0, @babel/plugin-syntax-jsx@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-syntax-jsx@npm:7.24.7"
+"@babel/plugin-syntax-jsx@npm:^7.0.0, @babel/plugin-syntax-jsx@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-syntax-jsx@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/f44d927a9ae8d5ef016ff5b450e1671e56629ddc12e56b938e41fd46e141170d9dfc9a53d6cb2b9a20a7dd266a938885e6a3981c60c052a2e1daed602ac80e51
+  checksum: 10c0/17db499c31fcfaa94d5408726d943955d51d478353d1e2dd84eda6024f7e3d104b9456a77f8aabfae0db7f4dc32f810d08357112f7fcbe305e7c9fcf5b3cac13
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3":
+"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4":
   version: 7.10.4
   resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4"
   dependencies:
@@ -708,7 +689,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-numeric-separator@npm:^7.10.4, @babel/plugin-syntax-numeric-separator@npm:^7.8.3":
+"@babel/plugin-syntax-numeric-separator@npm:^7.10.4":
   version: 7.10.4
   resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4"
   dependencies:
@@ -763,7 +744,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-top-level-await@npm:^7.14.5, @babel/plugin-syntax-top-level-await@npm:^7.8.3":
+"@babel/plugin-syntax-top-level-await@npm:^7.14.5":
   version: 7.14.5
   resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5"
   dependencies:
@@ -774,14 +755,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-typescript@npm:^7.24.7, @babel/plugin-syntax-typescript@npm:^7.3.3, @babel/plugin-syntax-typescript@npm:^7.7.2":
-  version: 7.24.7
-  resolution: "@babel/plugin-syntax-typescript@npm:7.24.7"
+"@babel/plugin-syntax-typescript@npm:^7.25.7, @babel/plugin-syntax-typescript@npm:^7.3.3, @babel/plugin-syntax-typescript@npm:^7.7.2":
+  version: 7.25.7
+  resolution: "@babel/plugin-syntax-typescript@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/cdabd2e8010fb0ad15b49c2c270efc97c4bfe109ead36c7bbcf22da7a74bc3e49702fc4f22f12d2d6049e8e22a5769258df1fd05f0420ae45e11bdd5bc07805a
+  checksum: 10c0/ed51fd81a5cf571a89fc4cf4c0e3b0b91285c367237374c133d2e5e718f3963cfa61b81997df39220a8837dc99f9e9a8ab7701d259c09fae379e4843d9db60c2
   languageName: node
   linkType: hard
 
@@ -797,740 +778,752 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-arrow-functions@npm:^7.0.0, @babel/plugin-transform-arrow-functions@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7"
+"@babel/plugin-transform-arrow-functions@npm:^7.0.0, @babel/plugin-transform-arrow-functions@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/6ac05a54e5582f34ac6d5dc26499e227227ec1c7fa6fc8de1f3d40c275f140d3907f79bbbd49304da2d7008a5ecafb219d0b71d78ee3290ca22020d878041245
+  checksum: 10c0/c8d75ead93f130bf113b6d29493aca695092661ef039336d2a227169c3b7895aa5e9bcc548c42a95a6eaaaf49e512317b00699940bd40ccefd77443e703d3935
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-async-generator-functions@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.7"
+"@babel/plugin-transform-async-generator-functions@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.7"
   dependencies:
-    "@babel/helper-environment-visitor": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-remap-async-to-generator": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-remap-async-to-generator": "npm:^7.25.7"
     "@babel/plugin-syntax-async-generators": "npm:^7.8.4"
+    "@babel/traverse": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/6b5e33ae66dce0afce9b06d8dace6fa052528e60f7622aa6cfd3e71bd372ca5079d426e78336ca564bc0d5f37acbcda1b21f4fe656fcb642f1a93a697ab39742
+  checksum: 10c0/dcdd17d8cafafe0eb2edd0a46a7abe86c72235c957c8eb1157ccadb2b199572d5d1aa36a2d3bce5cb99990f7d3c6290ecf09959c62f3081c4df9ff717a1c84a4
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-async-to-generator@npm:^7.0.0, @babel/plugin-transform-async-to-generator@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.7"
+"@babel/plugin-transform-async-to-generator@npm:^7.0.0, @babel/plugin-transform-async-to-generator@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.7"
   dependencies:
-    "@babel/helper-module-imports": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-remap-async-to-generator": "npm:^7.24.7"
+    "@babel/helper-module-imports": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-remap-async-to-generator": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/83c82e243898875af8457972a26ab29baf8a2078768ee9f35141eb3edff0f84b165582a2ff73e90a9e08f5922bf813dbf15a85c1213654385198f4591c0dc45d
+  checksum: 10c0/1dbefba9c1455f7a92b8c59a93c622091db945294c936fc2c09b1648308c5b4cb2ecaae92baae0d07a324ab890a8a2ee27ceb046bc120932845d27aede275821
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-block-scoped-functions@npm:^7.0.0, @babel/plugin-transform-block-scoped-functions@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7"
+"@babel/plugin-transform-block-scoped-functions@npm:^7.0.0, @babel/plugin-transform-block-scoped-functions@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/113e86de4612ae91773ff5cb6b980f01e1da7e26ae6f6012127415d7ae144e74987bc23feb97f63ba4bc699331490ddea36eac004d76a20d5369e4cc6a7f61cd
+  checksum: 10c0/b1e77492295d1b271ef850a81b0404cf3d0dd6a2bcbeab28a0fd99e61c6de4bda91dff583bb42138eec61bf71282bdd3b1bebcb53b7e373035e77fd6ba66caeb
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-block-scoping@npm:^7.0.0, @babel/plugin-transform-block-scoping@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-block-scoping@npm:7.24.7"
+"@babel/plugin-transform-block-scoping@npm:^7.0.0, @babel/plugin-transform-block-scoping@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-block-scoping@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/dcbc5e385c0ca5fb5736b1c720c90755cffe9f91d8c854f82e61e59217dd3f6c91b3633eeee4b55a89d3f59e5275d0f5b0b1b1363d4fa70c49c468b55aa87700
+  checksum: 10c0/b2057e00535cd0e8bd5ee5d4640aa2e952564aeafb1bcf4e7b6de33442422877bb0ca8669ad0a48262ec077271978c61eae87b6b3bc8f472d830fa781d6f7e44
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-class-properties@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-class-properties@npm:7.24.7"
+"@babel/plugin-transform-class-properties@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-class-properties@npm:7.25.7"
   dependencies:
-    "@babel/helper-create-class-features-plugin": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-create-class-features-plugin": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/75018a466c7ede3d2397e158891c224ba7fca72864506ce067ddbc02fc65191d44da4d6379c996d0c7f09019e26b5c3f5f1d3a639cd98366519723886f0689d0
+  checksum: 10c0/1f41e6934b20ad3e05df63959cff9bc600ff3119153b9acbbd44c1731e7df04866397e6e17799173f4c53cdee6115e155632859aee20bf47ec7dcef3f2168a47
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-class-static-block@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-class-static-block@npm:7.24.7"
+"@babel/plugin-transform-class-static-block@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-class-static-block@npm:7.25.7"
   dependencies:
-    "@babel/helper-create-class-features-plugin": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-create-class-features-plugin": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
     "@babel/plugin-syntax-class-static-block": "npm:^7.14.5"
   peerDependencies:
     "@babel/core": ^7.12.0
-  checksum: 10c0/b0ade39a3d09dce886f79dbd5907c3d99b48167eddb6b9bbde24a0598129654d7017e611c20494cdbea48b07ac14397cd97ea34e3754bbb2abae4e698128eccb
+  checksum: 10c0/cbb4b46cbd8ad10106eb2bedb5a0665661a1d1d5b6f3ab565ff454b802dab4718e02b25670fe0d40835494aedb3dc26757c06cc4da6ff3e80291c5f882269bd3
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-classes@npm:^7.0.0, @babel/plugin-transform-classes@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-classes@npm:7.24.7"
-  dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.24.7"
-    "@babel/helper-compilation-targets": "npm:^7.24.7"
-    "@babel/helper-environment-visitor": "npm:^7.24.7"
-    "@babel/helper-function-name": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-replace-supers": "npm:^7.24.7"
-    "@babel/helper-split-export-declaration": "npm:^7.24.7"
+"@babel/plugin-transform-classes@npm:^7.0.0, @babel/plugin-transform-classes@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-classes@npm:7.25.7"
+  dependencies:
+    "@babel/helper-annotate-as-pure": "npm:^7.25.7"
+    "@babel/helper-compilation-targets": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-replace-supers": "npm:^7.25.7"
+    "@babel/traverse": "npm:^7.25.7"
     globals: "npm:^11.1.0"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/e51dba7ce8b770d1eee929e098d5a3be3efc3e8b941e22dda7d0097dc4e7be5feabd2da7b707ac06fcac5661b31223c541941dec08ce76c1faa55544d87d06ec
+  checksum: 10c0/8121781e1d8acd80e6169019106f73a399475ad9c895c1988a344dfed5a6ddd340938ac55123dc1e423bb8f25f255f5d11031116ad756ba3c314595a97c973af
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-computed-properties@npm:^7.0.0, @babel/plugin-transform-computed-properties@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7"
+"@babel/plugin-transform-computed-properties@npm:^7.0.0, @babel/plugin-transform-computed-properties@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-computed-properties@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/template": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/template": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/25636dbc1f605c0b8bc60aa58628a916b689473d11551c9864a855142e36742fe62d4a70400ba3b74902338e77fb3d940376c0a0ba154b6b7ec5367175233b49
+  checksum: 10c0/7ad0a1c126f50935a02e77d438ebc39078a9d644b3a60de60bec32c5d9f49e7f2b193fcecb8c61bb1bc3cdd4af1e93f72d022d448511fa76a171527c633cd1bf
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-destructuring@npm:^7.0.0, @babel/plugin-transform-destructuring@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-destructuring@npm:7.24.7"
+"@babel/plugin-transform-destructuring@npm:^7.0.0, @babel/plugin-transform-destructuring@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-destructuring@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/929f07a807fb62230bfbf881cfcedf187ac5daf2f1b01da94a75c7a0f6f72400268cf4bcfee534479e43260af8193e42c31ee03c8b0278ba77d0036ed6709c27
+  checksum: 10c0/a563123b2fb267e03aa50104005f00b56226a685938906c42c1b251462e0cc9fc89e587d5656d3324159071eb8ebda8c68a6011f11d5a00fb1436cb5a5411b7b
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-dotall-regex@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.7"
+"@babel/plugin-transform-dotall-regex@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.7"
   dependencies:
-    "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-create-regexp-features-plugin": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/793f14c9494972d294b7e7b97b747f47874b6d57d7804d3443c701becf5db192c9311be6a1835c07664486df1f5c60d33196c36fb7e11a53015e476b4c145b33
+  checksum: 10c0/7f1db3ec20b7fae46db4a9c4c257d75418b0896b72c0a3de20b3044f952801480f0a2e75ebb0d64f13e8cd4db0e49aa42c5c0edff372b23c41679b1ea5dd3ed4
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-duplicate-keys@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.7"
+"@babel/plugin-transform-duplicate-keys@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/75ff7ec1117ac500e77bf20a144411d39c0fdd038f108eec061724123ce6d1bb8d5bd27968e466573ee70014f8be0043361cdb0ef388f8a182d1d97ad67e51b9
+  checksum: 10c0/b4079981e2db19737a0f1a00254e7388e2d3c01ce36e9fd826e4d86d3c1755339495e29c71fd7c84a068201ec24687328d48f3bf53b32b6d6224f51d9a34da74
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-dynamic-import@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7"
+"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.7"
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+  peerDependencies:
+    "@babel/core": ^7.0.0
+  checksum: 10c0/e4946090ff6d88d54b78265ee653079ec34c117ac046e22f66f7c4ac44249cdc2dfca385bc5bf4386db668b9948eeb12985589500188bc252e684c7714c31475
+  languageName: node
+  linkType: hard
+
+"@babel/plugin-transform-dynamic-import@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
     "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/eeda48372efd0a5103cb22dadb13563c975bce18ae85daafbb47d57bb9665d187da9d4fe8d07ac0a6e1288afcfcb73e4e5618bf75ff63fddf9736bfbf225203b
+  checksum: 10c0/c733252ff20a32d9747dd081916270f5a073856597e849a5f458b12f4354499b18714f5e7049e341432851d9975077cb37effcd276c7f816faa6f5ff708dc5e1
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-exponentiation-operator@npm:^7.0.0, @babel/plugin-transform-exponentiation-operator@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.7"
+"@babel/plugin-transform-exponentiation-operator@npm:^7.0.0, @babel/plugin-transform-exponentiation-operator@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.25.7"
   dependencies:
-    "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/ace3e11c94041b88848552ba8feb39ae4d6cad3696d439ff51445bd2882d8b8775d85a26c2c0edb9b5e38c9e6013cc11b0dea89ec8f93c7d9d7ee95e3645078c
+  checksum: 10c0/c8537b9f3cddc5a8d3710f6980196dc7a0f4389f8f82617312a5f7b8b15bcd8ddaeba783c687c3ac6031eb0a4ba0bc380a98da6bf7efe98e225602a98ad42a1e
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-export-namespace-from@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.7"
+"@babel/plugin-transform-export-namespace-from@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
     "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/4e144d7f1c57bc63b4899dbbbdfed0880f2daa75ea9c7251c7997f106e4b390dc362175ab7830f11358cb21f6b972ca10a43a2e56cd789065f7606b082674c0c
+  checksum: 10c0/ef61fc5d54c9c8b075cbd9db62beaf295e38e08a1edb1882995105d3e959763be1631f7d7f7cb7461b702ebd0b4a601f2eb2cd6521acaf061310a3a3305fa756
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-flow-strip-types@npm:^7.0.0, @babel/plugin-transform-flow-strip-types@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-flow-strip-types@npm:7.24.7"
+"@babel/plugin-transform-flow-strip-types@npm:^7.0.0, @babel/plugin-transform-flow-strip-types@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-flow-strip-types@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/plugin-syntax-flow": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/plugin-syntax-flow": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/9995d52af58ceaa223c6553873bd5a16a94b2abdebb39993d59d9eb0c0c9666636ceb7a80f63ac86fe7ab3cb217f1dac9fb2f448ad5a54f8fb8e41e12716ef9a
+  checksum: 10c0/01afd2196c99ace415d58d939cc568a17e9925fcc4cbf8ff16a659053be3f7ce2b1fa254b5662aa36e6a3300620bcc81d9399d849288a012fe2dc337e4efa49e
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-for-of@npm:^7.0.0, @babel/plugin-transform-for-of@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-for-of@npm:7.24.7"
+"@babel/plugin-transform-for-of@npm:^7.0.0, @babel/plugin-transform-for-of@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-for-of@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/77629b1173e55d07416f05ba7353caa09d2c2149da2ca26721ab812209b63689d1be45116b68eadc011c49ced59daf5320835b15245eb7ae93ae0c5e8277cfc0
+  checksum: 10c0/08a37a1742368a422d095c998ed76f60f6bf3f9cc060033be121d803fd2dddc08fe543e48ee49c022bdc9ed80893ca79d084958d83d30684178b088774754277
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-function-name@npm:^7.0.0, @babel/plugin-transform-function-name@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-function-name@npm:7.24.7"
+"@babel/plugin-transform-function-name@npm:^7.0.0, @babel/plugin-transform-function-name@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-function-name@npm:7.25.7"
   dependencies:
-    "@babel/helper-compilation-targets": "npm:^7.24.7"
-    "@babel/helper-function-name": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-compilation-targets": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/traverse": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/3e9642428d6952851850d89ea9307d55946528d18973784d0e2f04a651b23bd9924dd8a2641c824b483bd4ab1223bab1d2f6a1106a939998f7ced512cb60ac5b
+  checksum: 10c0/ca98e1116c0ada7211ed43e4b7f21ca15f95bbbdad70f2fbe1ec2d90a97daedf9f22fcb0a25c8b164a5e394f509f2e4d1f7609d26dc938a58d37c5ee9b80088a
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-json-strings@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-json-strings@npm:7.24.7"
+"@babel/plugin-transform-json-strings@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-json-strings@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
     "@babel/plugin-syntax-json-strings": "npm:^7.8.3"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/17c72cd5bf3e90e722aabd333559275f3309e3fa0b9cea8c2944ab83ae01502c71a2be05da5101edc02b3fc8df15a8dbb9b861cbfcc8a52bf5e797cf01d3a40a
+  checksum: 10c0/aa6e5f65c8a5f2459d7daa9b5b4ff97ff43bab21f4a8513ed84d35300b0323ec542dc101c5f11622e442dfc93b3a229c7f41ebc7645370dfec6d066bda800a0b
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-literals@npm:^7.0.0, @babel/plugin-transform-literals@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-literals@npm:7.24.7"
+"@babel/plugin-transform-literals@npm:^7.0.0, @babel/plugin-transform-literals@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-literals@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/9f3f6f3831929cd2a977748c07addf9944d5cccb50bd3a24a58beb54f91f00d6cacd3d7831d13ffe1ad6f8aba0aefd7bca5aec65d63b77f39c62ad1f2d484a3e
+  checksum: 10c0/c2c2488102f33e566f45becdcb632e53bd052ecfb2879deb07a614b3e9437e3b624c3b16d080096d50b0b622edebd03e438acbf9260bcc41167897963f64560e
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.7"
+"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
     "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/dbe882eb9053931f2ab332c50fc7c2a10ef507d6421bd9831adbb4cb7c9f8e1e5fbac4fbd2e007f6a1bf1df1843547559434012f118084dc0bf42cda3b106272
+  checksum: 10c0/d610a8a2c1be83e03cce2256f29519e705dc68289c09d67f1f362d1fd80f4b36eaf2affc05710abb53a272895041e24d9e95ec73a516a23a67cb907023fbe37b
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-member-expression-literals@npm:^7.0.0, @babel/plugin-transform-member-expression-literals@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.7"
+"@babel/plugin-transform-member-expression-literals@npm:^7.0.0, @babel/plugin-transform-member-expression-literals@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/e789ae359bdf2d20e90bedef18dfdbd965c9ebae1cee398474a0c349590fda7c8b874e1a2ceee62e47e5e6ec1730e76b0f24e502164357571854271fc12cc684
+  checksum: 10c0/d6936b98ae4d3daed850dc4e064042ea4375f815219ba9d8591373bf1fba4cfdb5be42623ae8882f2d666cc34af650a4855e2a5ad89e3c235d73a6f172f9969c
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-modules-amd@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-modules-amd@npm:7.24.7"
+"@babel/plugin-transform-modules-amd@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-modules-amd@npm:7.25.7"
   dependencies:
-    "@babel/helper-module-transforms": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-module-transforms": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/6df7de7fce34117ca4b2fa07949b12274c03668cbfe21481c4037b6300796d50ae40f4f170527b61b70a67f26db906747797e30dbd0d9809a441b6e220b5728f
+  checksum: 10c0/c0bc999206c3834c090e6559a6c8a55d7672d3573104e832223ebe7df99bd1b82fc850e15ba32f512c84b0db1cdb613b66fa60abe9abb9c7e8dcbff91649b356
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-modules-commonjs@npm:^7.0.0, @babel/plugin-transform-modules-commonjs@npm:^7.13.8, @babel/plugin-transform-modules-commonjs@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.7"
+"@babel/plugin-transform-modules-commonjs@npm:^7.0.0, @babel/plugin-transform-modules-commonjs@npm:^7.13.8, @babel/plugin-transform-modules-commonjs@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-modules-commonjs@npm:7.25.7"
   dependencies:
-    "@babel/helper-module-transforms": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-simple-access": "npm:^7.24.7"
+    "@babel/helper-module-transforms": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-simple-access": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/9442292b3daf6a5076cdc3c4c32bf423bda824ccaeb0dd0dc8b3effaa1fecfcb0130ae6e647fef12a5d5ff25bcc99a0d6bfc6d24a7525345e1bcf46fcdf81752
+  checksum: 10c0/2f1c945fc3c9b690b0ddcf2c80156b2e4fbf2cf15aac43ac8fe6e4b34125869528839a53d07c564e62e4aed394ebdc1d2c3b796b547374455522581c11b7599c
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-modules-systemjs@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.7"
+"@babel/plugin-transform-modules-systemjs@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.7"
   dependencies:
-    "@babel/helper-hoist-variables": "npm:^7.24.7"
-    "@babel/helper-module-transforms": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-validator-identifier": "npm:^7.24.7"
+    "@babel/helper-module-transforms": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-validator-identifier": "npm:^7.25.7"
+    "@babel/traverse": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/e2a795e0a6baafe26f4a74010622212ddd873170742d673f450e0097f8d984f6e6a95eb8ce41b05071ee9790c4be088b33801aaab3f78ee202c567634e52a331
+  checksum: 10c0/95eaea7082636710c61e49e58b3907e85ec79db4327411d3784f28592509fbe94a53cc3d20a36a1cf245efc6d3f0017eae15b45ffd645c1ab949bb4e1670e6bb
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-modules-umd@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-modules-umd@npm:7.24.7"
+"@babel/plugin-transform-modules-umd@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-modules-umd@npm:7.25.7"
   dependencies:
-    "@babel/helper-module-transforms": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-module-transforms": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/7791d290121db210e4338b94b4a069a1a79e4c7a8d7638d8159a97b281851bbed3048dac87a4ae718ad963005e6c14a5d28e6db2eeb2b04e031cee92fb312f85
+  checksum: 10c0/8849ab04eecdb73cd37e2d7289449fa5256331832b0304c220b2a6aaa12e2d2dd87684f2813412d1fc5bdb3d6b55cc08c6386d3273fe05a65177c09bee5b6769
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.0.0, @babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.7"
+"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.0.0, @babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.7"
   dependencies:
-    "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-create-regexp-features-plugin": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/41a0b0f2d0886318237440aa3b489f6d0305361d8671121777d9ff89f9f6de9d0c02ce93625049061426c8994064ef64deae8b819d1b14c00374a6a2336fb5d9
+  checksum: 10c0/eb55fec55dc930cd122911f3e4a421320fa8b1b4de85bfd7ef11b46c611ec69b0213c114a6e1c6bc224d6b954ff183a0caa7251267d5258ecc0f00d6d9ca1d52
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-new-target@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-new-target@npm:7.24.7"
+"@babel/plugin-transform-new-target@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-new-target@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/2540808a35e1a978e537334c43dab439cf24c93e7beb213a2e71902f6710e60e0184316643790c0a6644e7a8021e52f7ab8165e6b3e2d6651be07bdf517b67df
+  checksum: 10c0/8e5dce6d027e0f3fd394578ea1af7f515de157793a15c23a5aad7034a6d8a4005ef280238e67a232bb4dd4fafd3a264fed462deb149128ddd9ce59ff6f575cff
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.7"
+"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
     "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/7243c8ff734ed5ef759dd8768773c4b443c12e792727e759a1aec2c7fa2bfdd24f1ecb42e292a7b3d8bd3d7f7b861cf256a8eb4ba144fc9cc463892c303083d9
+  checksum: 10c0/b35a96a79ef4895b00e4f758d3185cb17e4fbfada311894ad5f0988a55fc2c21820dc789b26a3cb8fbd620434faa516e52acb6e2da105c2edbd29de8b6b0facf
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-numeric-separator@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.7"
+"@babel/plugin-transform-numeric-separator@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
     "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/e18e09ca5a6342645d00ede477731aa6e8714ff357efc9d7cda5934f1703b3b6fb7d3298dce3ce3ba53e9ff1158eab8f1aadc68874cc21a6099d33a1ca457789
+  checksum: 10c0/c028ae89e6b4e1d757f8f1ebcb3b420e6559bb35002728f6f5651d5f669fbf73764adf6e3597908fa12adf8dbae683e5f74b3a7f68e8774a9663c18c0f999539
   languageName: node
   linkType: hard
 
 "@babel/plugin-transform-object-assign@npm:^7.0.0":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-object-assign@npm:7.24.7"
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-object-assign@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/11725c2f91bee7007a76fb6525d2b8a8883e15a25f49295ccc680bbf6857f36d49e8fb5e2a1ff46e0386b74442377ff81bbe946ba5230ed4482c57e56b7e81a7
+  checksum: 10c0/1de1e06755ba03a7f15a0c47b160034534fdfedb5a818e1c3db10941266faf7b00d9bfe5e76aa93133549cf7a6c0d21b6fddc89bd23649609671b8f574594e94
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-object-rest-spread@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.7"
+"@babel/plugin-transform-object-rest-spread@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.7"
   dependencies:
-    "@babel/helper-compilation-targets": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-compilation-targets": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
     "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3"
-    "@babel/plugin-transform-parameters": "npm:^7.24.7"
+    "@babel/plugin-transform-parameters": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/9ad64bc003f583030f9da50614b485852f8edac93f8faf5d1cd855201a4852f37c5255ae4daf70dd4375bdd4874e16e39b91f680d4668ec219ba05441ce286eb
+  checksum: 10c0/e8b978d9d1020452da0d5d92f80fe57e302761dac20137bb8bf863478a4779fcd63d314db89e796125d9d76da2a38f64f012d6e0c4913815951b3eb3fba2feb6
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-object-super@npm:^7.0.0, @babel/plugin-transform-object-super@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-object-super@npm:7.24.7"
+"@babel/plugin-transform-object-super@npm:^7.0.0, @babel/plugin-transform-object-super@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-object-super@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-replace-supers": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-replace-supers": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/770cebb4b4e1872c216b17069db9a13b87dfee747d359dc56d9fcdd66e7544f92dc6ab1861a4e7e0528196aaff2444e4f17dc84efd8eaf162d542b4ba0943869
+  checksum: 10c0/7f2968d4da997101b63fd3b74445c9b16f56bd32cd8a0a16c368af9d3e983e7675c1b05d18601f32307cb06e7d884ee11d13ff18a1f6830c0db243a9a852afab
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.7"
+"@babel/plugin-transform-optional-catch-binding@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
     "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/1e2f10a018f7d03b3bde6c0b70d063df8d5dd5209861d4467726cf834f5e3d354e2276079dc226aa8e6ece35f5c9b264d64b8229a8bb232829c01e561bcfb07a
+  checksum: 10c0/bb609e5103780be0825a255ffe1fefbb5335aead88a46eecc2257053279ea2c45ff66b0ef1fb54302c8c8c57146e88e52f3ecb62b4c6f619218d7b3843b352d9
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-optional-chaining@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.7"
+"@babel/plugin-transform-optional-chaining@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.7"
     "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/b9e3649b299e103b0d1767bbdba56574d065ff776e5350403b7bfd4e3982743c0cdb373d33bdbf94fa3c322d155e45d0aad946acf0aa741b870aed22dfec8b8e
+  checksum: 10c0/887441ada6c2bc1b789984b7531d9bc585f335ece99642886d3d9fd8aee7e6b8d4f7ca61d76b5f23477f3aa607284d5056eadaa1eb17e7b39af6b0e834cbe878
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-parameters@npm:^7.0.0, @babel/plugin-transform-parameters@npm:^7.20.7, @babel/plugin-transform-parameters@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-parameters@npm:7.24.7"
+"@babel/plugin-transform-parameters@npm:^7.0.0, @babel/plugin-transform-parameters@npm:^7.20.7, @babel/plugin-transform-parameters@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-parameters@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/53bf190d6926771545d5184f1f5f3f5144d0f04f170799ad46a43f683a01fab8d5fe4d2196cf246774530990c31fe1f2b9f0def39f0a5ddbb2340b924f5edf01
+  checksum: 10c0/b40ba70278842ce1e800d7ab400df730994941550da547ef453780023bd61a9b8acf4b9fb8419c1b5bcbe09819a1146ff59369db11db07eb71870bef86a12422
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-private-methods@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-private-methods@npm:7.24.7"
+"@babel/plugin-transform-private-methods@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-private-methods@npm:7.25.7"
   dependencies:
-    "@babel/helper-create-class-features-plugin": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-create-class-features-plugin": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/5b7bf923b738fbe3ad6c33b260e0a7451be288edfe4ef516303fa787a1870cd87533bfbf61abb779c22ed003c2fc484dec2436fe75a48756f686c0241173d364
+  checksum: 10c0/92e076f63f7c4696e1321dafdd56c4212eb41784cdadba0ebc39091f959a76d357c3df61a6c668be81d6b6ad8964ee458e85752ab0c6cfbbaf2066903edda732
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-private-property-in-object@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.7"
+"@babel/plugin-transform-private-property-in-object@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.7"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.24.7"
-    "@babel/helper-create-class-features-plugin": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-annotate-as-pure": "npm:^7.25.7"
+    "@babel/helper-create-class-features-plugin": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
     "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/c6fa7defb90b1b0ed46f24ff94ff2e77f44c1f478d1090e81712f33cf992dda5ba347016f030082a2f770138bac6f4a9c2c1565e9f767a125901c77dd9c239ba
+  checksum: 10c0/5ad8832ba54e2079c1f558b8680e170265e3f376424e5fbb75b17b7f08696fb0af6c96d23d92f7df3dcc559f5971a02587281fcec38a853174aa95478565f5fc
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-property-literals@npm:^7.0.0, @babel/plugin-transform-property-literals@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-property-literals@npm:7.24.7"
+"@babel/plugin-transform-property-literals@npm:^7.0.0, @babel/plugin-transform-property-literals@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-property-literals@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/52564b58f3d111dc02d241d5892a4b01512e98dfdf6ef11b0ed62f8b11b0acacccef0fc229b44114fe8d1a57a8b70780b11bdd18b807d3754a781a07d8f57433
+  checksum: 10c0/6d5bccdc772207906666ad5201bd91e4e132e1d806dbcf4163a1d08e18c57cc3795578c4e10596514bcd6afaf9696f478ea4f0dea890176d93b9cb077b9e5c55
   languageName: node
   linkType: hard
 
 "@babel/plugin-transform-react-constant-elements@npm:^7.18.12":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-react-constant-elements@npm:7.24.7"
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-react-constant-elements@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/4b7a7314c4492d5ea0d0d705e76065e669f63812fe6f61588168d71a0f3c99f1bcaac22cdd09d71a56d951cf5ea0aec0b4b49717fd51db919b49e14f9a29503a
+  checksum: 10c0/2261a793e65b4236ac256096ee8ad40e1149b4202d3d5d4464ca92e87980bc1886ccb2fe1282e668c82fd49db2afadfcea6e943a75fbe56ceb58c33245bac0dc
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-react-display-name@npm:^7.0.0, @babel/plugin-transform-react-display-name@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-react-display-name@npm:7.24.7"
+"@babel/plugin-transform-react-display-name@npm:^7.0.0, @babel/plugin-transform-react-display-name@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-react-display-name@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/c14a07a9e75723c96f1a0a306b8a8e899ff1c6a0cc3d62bcda79bb1b54e4319127b258651c513a1a47da152cdc22e16525525a30ae5933a2980c7036fd0b4d24
+  checksum: 10c0/a0c537cc7c328ed7468d3b6a37bf0d9cb15d94afcdf3f2849ce6e5a68494fc61f0fa4fc529482a6b95b00f3c5c734f310bf18085293bff40702789f06c816f36
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-react-jsx-development@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-react-jsx-development@npm:7.24.7"
+"@babel/plugin-transform-react-jsx-development@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-react-jsx-development@npm:7.25.7"
   dependencies:
-    "@babel/plugin-transform-react-jsx": "npm:^7.24.7"
+    "@babel/plugin-transform-react-jsx": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/fce647db50f90a5291681f0f97865d9dc76981262dff71d6d0332e724b85343de5860c26f9e9a79e448d61e1d70916b07ce91e8c7f2b80dceb4b16aee41794d8
+  checksum: 10c0/a3dc14644d09a6d22875af7b5584393ab53e467e0531cd192fc6242504dacaffa421e89265ba7f84fd4edef2b7b100d2e2ebf092a4dce2b55cf9c5fe29390c18
   languageName: node
   linkType: hard
 
 "@babel/plugin-transform-react-jsx-self@npm:^7.0.0":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-react-jsx-self@npm:7.24.7"
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-react-jsx-self@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/dcf3b732401f47f06bb29d6016e48066f66de00029a0ded98ddd9983c770a00a109d91cd04d2700d15ee0bcec3ae3027a5f12d69e15ec56efc0bcbfac65e92cb
+  checksum: 10c0/51ab0302f808186b671722db40ef25d6f691f969aeaa8f7ef8565c5ca227c8b4dbd1002997478414d3f6984b1fd80a01303e98853fd8bd9606c35bcd72c94065
   languageName: node
   linkType: hard
 
 "@babel/plugin-transform-react-jsx-source@npm:^7.0.0":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-react-jsx-source@npm:7.24.7"
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-react-jsx-source@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/970ef1264c7c6c416ab11610665d5309aec2bd2b9086ae394e1132e65138d97b060a7dc9d31054e050d6dc475b5a213938c9707c0202a5022d55dcb4c5abe28f
+  checksum: 10c0/c014de49a466c18ab77bea409542f40409a6a561afc8879ecbeca6a4618161b5aa71ab0825b733c5c87bebe09a19455a79bc1bed86488a84ef712e42e1ed2875
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-react-jsx@npm:^7.0.0, @babel/plugin-transform-react-jsx@npm:^7.12.17, @babel/plugin-transform-react-jsx@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-react-jsx@npm:7.24.7"
+"@babel/plugin-transform-react-jsx@npm:^7.0.0, @babel/plugin-transform-react-jsx@npm:^7.12.17, @babel/plugin-transform-react-jsx@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-react-jsx@npm:7.25.7"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.24.7"
-    "@babel/helper-module-imports": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/plugin-syntax-jsx": "npm:^7.24.7"
-    "@babel/types": "npm:^7.24.7"
+    "@babel/helper-annotate-as-pure": "npm:^7.25.7"
+    "@babel/helper-module-imports": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/plugin-syntax-jsx": "npm:^7.25.7"
+    "@babel/types": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/5c46d2c1c06a30e6bde084839df9cc689bf9c9cb0292105d61c225ca731f64247990724caee7dfc7f817dc964c062e8319e7f05394209590c476b65d75373435
+  checksum: 10c0/6766b0357b8bbfcb77fca5350f06cf822c89bbe75ddcaea24614601ef23957504da24e76597d743038ce8fa081373b0663c8ad0c86d7c7226e8185f0680b8b56
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-react-pure-annotations@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.7"
+"@babel/plugin-transform-react-pure-annotations@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.25.7"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-annotate-as-pure": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/fae517d293d9c93b7b920458c3e4b91cb0400513889af41ba184a5f3acc8bfef27242cc262741bb8f87870df376f1733a0d0f52b966d342e2aaaf5607af8f73d
+  checksum: 10c0/d92c9b511850fb6dea71966a0d4f313d67e317db7fc3633a7ff2e27d6df2e95cbc91c4c25abdb6c8db651fcda842a0cb7433835a8a9d4a3fdc5d452068428101
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-regenerator@npm:^7.0.0, @babel/plugin-transform-regenerator@npm:^7.14.5, @babel/plugin-transform-regenerator@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-regenerator@npm:7.24.7"
+"@babel/plugin-transform-regenerator@npm:^7.0.0, @babel/plugin-transform-regenerator@npm:^7.14.5, @babel/plugin-transform-regenerator@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-regenerator@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
     regenerator-transform: "npm:^0.15.2"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/d2dc2c788fdae9d97217e70d46ba8ca9db0035c398dc3e161552b0c437113719a75c04f201f9c91ddc8d28a1da60d0b0853f616dead98a396abb9c845c44892b
+  checksum: 10c0/7ee3a57c4050bc908ef7ac392d810826b294970a7182f4ec34a8ca93dbe36deb21bc862616d46a6f3d881d6b5749930e1679e875b638a00866d844a4250df212
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-reserved-words@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-reserved-words@npm:7.24.7"
+"@babel/plugin-transform-reserved-words@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-reserved-words@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/2229de2768615e7f5dc0bbc55bc121b5678fd6d2febd46c74a58e42bb894d74cd5955c805880f4e02d0e1cf94f6886270eda7fafc1be9305a1ec3b9fd1d063f5
+  checksum: 10c0/920c98130daff6c1288fb13a9a2d2e45863bba93e619cb88d90e1f5b5cb358a3ee8880a425a3adb1b4bd5dbb6bd0500eea3370fc612633045eec851b08cc586c
   languageName: node
   linkType: hard
 
 "@babel/plugin-transform-runtime@npm:^7.0.0, @babel/plugin-transform-runtime@npm:^7.15.0":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-runtime@npm:7.24.7"
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-runtime@npm:7.25.7"
   dependencies:
-    "@babel/helper-module-imports": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-module-imports": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
     babel-plugin-polyfill-corejs2: "npm:^0.4.10"
-    babel-plugin-polyfill-corejs3: "npm:^0.10.1"
+    babel-plugin-polyfill-corejs3: "npm:^0.10.6"
     babel-plugin-polyfill-regenerator: "npm:^0.6.1"
     semver: "npm:^6.3.1"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/a33f5095872bbba00b8ee553dfe6941477e69a017a2e65e9dd86e80dab5c627635093b796eb1eb22aaaf2f874704f63ad1d99b952b83b59ef6b368ae04e5bb41
+  checksum: 10c0/9b2514e9079361ac8e7e500ffd522dad869d61a3894302da7e29bbac80de00276c8a1b4394d1dcf0b51c57b2c854919928df9648be336139fdf1d6ecd6d1bb32
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-shorthand-properties@npm:^7.0.0, @babel/plugin-transform-shorthand-properties@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7"
+"@babel/plugin-transform-shorthand-properties@npm:^7.0.0, @babel/plugin-transform-shorthand-properties@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/41b155bdbb3be66618358488bf7731b3b2e8fff2de3dbfd541847720a9debfcec14db06a117abedd03c9cd786db20a79e2a86509a4f19513f6e1b610520905cf
+  checksum: 10c0/4250f89a0072f0f400be7a2e3515227b8e2518737899bd57d497e5173284a0e05d812e4a3c219ffcd484e9fa9a01c19fce5acd77bbb898f4d594512c56701eb4
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-spread@npm:^7.0.0, @babel/plugin-transform-spread@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-spread@npm:7.24.7"
+"@babel/plugin-transform-spread@npm:^7.0.0, @babel/plugin-transform-spread@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-spread@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/facba1553035f76b0d2930d4ada89a8cd0f45b79579afd35baefbfaf12e3b86096995f4b0c402cf9ee23b3f2ea0a4460c3b1ec0c192d340962c948bb223d4e66
+  checksum: 10c0/258bd1b52388cd7425d0ae25fa39538734f7540ea503a1d8a72211d33f6f214cb4e3b73d6cd03016cbcff5d41169f1e578b9ea331965ad224d223591983e90a7
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-sticky-regex@npm:^7.0.0, @babel/plugin-transform-sticky-regex@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.7"
+"@babel/plugin-transform-sticky-regex@npm:^7.0.0, @babel/plugin-transform-sticky-regex@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/5a74ed2ed0a3ab51c3d15fcaf09d9e2fe915823535c7a4d7b019813177d559b69677090e189ec3d5d08b619483eb5ad371fbcfbbff5ace2a76ba33ee566a1109
+  checksum: 10c0/0e466cfc3ca1e0db4bb11eb630215b0e1f43066d7678325e5ddadcf5a118b2351a528f67205729c32ac5b78ab68ab7f40517dd33bcb1fb6b456509f5f54ce097
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-template-literals@npm:^7.0.0, @babel/plugin-transform-template-literals@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-template-literals@npm:7.24.7"
+"@babel/plugin-transform-template-literals@npm:^7.0.0, @babel/plugin-transform-template-literals@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-template-literals@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/3630f966257bcace122f04d3157416a09d40768c44c3a800855da81146b009187daa21859d1c3b7d13f4e19e8888e60613964b175b2275d451200fb6d8d6cfe6
+  checksum: 10c0/a3455303b6841cb536ac66d1a2d03c194b9f371519482d8d1e8edbd33bf5ca7cdd5db1586b2b0ea5f909ebf74a0eafacf0fb28d257e4905445282dcdccfa6139
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-typeof-symbol@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.7"
+"@babel/plugin-transform-typeof-symbol@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-typeof-symbol@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/5649e7260a138681e68b296ab5931e2b1f132f287d6b4131d49b24f9dc20d62902b7e9d63c4d2decd5683b41df35ef4b9b03f58c7f9f65e4c25a6d8bbf04e9e9
+  checksum: 10c0/ce1a0744a900b05de1372a70508c4148f17eb941c482da26eb369b9f0347570dce45470c8a86d907bc3a0443190344da1e18489ecfecb30388ab6178e8a9916b
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-typescript@npm:^7.24.7, @babel/plugin-transform-typescript@npm:^7.5.0":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-typescript@npm:7.24.7"
+"@babel/plugin-transform-typescript@npm:^7.25.7, @babel/plugin-transform-typescript@npm:^7.5.0":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-typescript@npm:7.25.7"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.24.7"
-    "@babel/helper-create-class-features-plugin": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/plugin-syntax-typescript": "npm:^7.24.7"
+    "@babel/helper-annotate-as-pure": "npm:^7.25.7"
+    "@babel/helper-create-class-features-plugin": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.7"
+    "@babel/plugin-syntax-typescript": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/e8dacdc153a4c4599014b66eb01b94e3dc933d58d4f0cc3039c1a8f432e77b9df14f34a61964e014b975bf466f3fefd8c4768b3e887d3da1be9dc942799bdfdf
+  checksum: 10c0/5fa839b9560221698edff5e00b5cccc658c7875efaa7971c66d478f5b026770f12dd47b1be024463a44f9e29b4e14e8ddddbf4a2b324b0b94f58370dd5ae7195
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-unicode-escapes@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.7"
+"@babel/plugin-transform-unicode-escapes@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/8b18e2e66af33471a6971289492beff5c240e56727331db1d34c4338a6a368a82a7ed6d57ec911001b6d65643aed76531e1e7cac93265fb3fb2717f54d845e69
+  checksum: 10c0/8b1f71fda0a832c6e26ba4c00f99e9033e6f9b36ced542a512921f4ad861a70e2fec2bd54a91a5ca2efa46aaa8c8893e4c602635c4ef172bd3ed6eef3178c70b
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-unicode-property-regex@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.7"
+"@babel/plugin-transform-unicode-property-regex@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.7"
   dependencies:
-    "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-create-regexp-features-plugin": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/bc57656eb94584d1b74a385d378818ac2b3fca642e3f649fead8da5fb3f9de22f8461185936915dfb33d5a9104e62e7a47828331248b09d28bb2d59e9276de3e
+  checksum: 10c0/b4bfcf7529138d00671bf5cdfe606603d52cfe57ec1be837da57683f404fc0b0c171834a02515eb03379e5c806121866d097b90e31cb437d21d0ea59368ad82b
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-unicode-regex@npm:^7.0.0, @babel/plugin-transform-unicode-regex@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.7"
+"@babel/plugin-transform-unicode-regex@npm:^7.0.0, @babel/plugin-transform-unicode-regex@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.7"
   dependencies:
-    "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-create-regexp-features-plugin": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/83f72a345b751566b601dc4d07e9f2c8f1bc0e0c6f7abb56ceb3095b3c9d304de73f85f2f477a09f8cc7edd5e65afd0ff9e376cdbcbea33bc0c28f3705b38fd9
+  checksum: 10c0/73ae34c02ea8b7ac7e4efa690f8c226089c074e3fef658d2a630ad898a93550d84146ce05e073c271c8b2bbba61cbbfd5a2002a7ea940dcad3274e5b5dcb6bcf
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.7":
-  version: 7.24.7
-  resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.7"
+"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.7":
+  version: 7.25.7
+  resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.7"
   dependencies:
-    "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
+    "@babel/helper-create-regexp-features-plugin": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/7457c0ee8e80a80cb6fdc1fe54ab115b52815627616ce9151be8ef292fc99d04a910ec24f11382b4f124b89374264396892b086886bd2a9c2317904d87c9b21b
+  checksum: 10c0/39e45ae3db7adfc3457b1d6ba5608ffbace957ad019785967e5357a6639f261765bda12363f655d39265f5a2834af26327037751420191d0b73152ccc7ce3c35
   languageName: node
   linkType: hard
 
 "@babel/preset-env@npm:^7.12.9, @babel/preset-env@npm:^7.15.0, @babel/preset-env@npm:^7.19.4":
-  version: 7.24.7
-  resolution: "@babel/preset-env@npm:7.24.7"
-  dependencies:
-    "@babel/compat-data": "npm:^7.24.7"
-    "@babel/helper-compilation-targets": "npm:^7.24.7"
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-validator-option": "npm:^7.24.7"
-    "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.7"
-    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.7"
-    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.7"
-    "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.7"
+  version: 7.25.7
+  resolution: "@babel/preset-env@npm:7.25.7"
+  dependencies:
+    "@babel/compat-data": "npm:^7.25.7"
+    "@babel/helper-compilation-targets": "npm:^7.25.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-validator-option": "npm:^7.25.7"
+    "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.7"
+    "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.7"
+    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.7"
+    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.25.7"
+    "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.7"
     "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2"
     "@babel/plugin-syntax-async-generators": "npm:^7.8.4"
     "@babel/plugin-syntax-class-properties": "npm:^7.12.13"
     "@babel/plugin-syntax-class-static-block": "npm:^7.14.5"
     "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3"
     "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3"
-    "@babel/plugin-syntax-import-assertions": "npm:^7.24.7"
-    "@babel/plugin-syntax-import-attributes": "npm:^7.24.7"
+    "@babel/plugin-syntax-import-assertions": "npm:^7.25.7"
+    "@babel/plugin-syntax-import-attributes": "npm:^7.25.7"
     "@babel/plugin-syntax-import-meta": "npm:^7.10.4"
     "@babel/plugin-syntax-json-strings": "npm:^7.8.3"
     "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4"
@@ -1542,76 +1535,77 @@ __metadata:
     "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5"
     "@babel/plugin-syntax-top-level-await": "npm:^7.14.5"
     "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6"
-    "@babel/plugin-transform-arrow-functions": "npm:^7.24.7"
-    "@babel/plugin-transform-async-generator-functions": "npm:^7.24.7"
-    "@babel/plugin-transform-async-to-generator": "npm:^7.24.7"
-    "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.7"
-    "@babel/plugin-transform-block-scoping": "npm:^7.24.7"
-    "@babel/plugin-transform-class-properties": "npm:^7.24.7"
-    "@babel/plugin-transform-class-static-block": "npm:^7.24.7"
-    "@babel/plugin-transform-classes": "npm:^7.24.7"
-    "@babel/plugin-transform-computed-properties": "npm:^7.24.7"
-    "@babel/plugin-transform-destructuring": "npm:^7.24.7"
-    "@babel/plugin-transform-dotall-regex": "npm:^7.24.7"
-    "@babel/plugin-transform-duplicate-keys": "npm:^7.24.7"
-    "@babel/plugin-transform-dynamic-import": "npm:^7.24.7"
-    "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.7"
-    "@babel/plugin-transform-export-namespace-from": "npm:^7.24.7"
-    "@babel/plugin-transform-for-of": "npm:^7.24.7"
-    "@babel/plugin-transform-function-name": "npm:^7.24.7"
-    "@babel/plugin-transform-json-strings": "npm:^7.24.7"
-    "@babel/plugin-transform-literals": "npm:^7.24.7"
-    "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7"
-    "@babel/plugin-transform-member-expression-literals": "npm:^7.24.7"
-    "@babel/plugin-transform-modules-amd": "npm:^7.24.7"
-    "@babel/plugin-transform-modules-commonjs": "npm:^7.24.7"
-    "@babel/plugin-transform-modules-systemjs": "npm:^7.24.7"
-    "@babel/plugin-transform-modules-umd": "npm:^7.24.7"
-    "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7"
-    "@babel/plugin-transform-new-target": "npm:^7.24.7"
-    "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7"
-    "@babel/plugin-transform-numeric-separator": "npm:^7.24.7"
-    "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7"
-    "@babel/plugin-transform-object-super": "npm:^7.24.7"
-    "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7"
-    "@babel/plugin-transform-optional-chaining": "npm:^7.24.7"
-    "@babel/plugin-transform-parameters": "npm:^7.24.7"
-    "@babel/plugin-transform-private-methods": "npm:^7.24.7"
-    "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7"
-    "@babel/plugin-transform-property-literals": "npm:^7.24.7"
-    "@babel/plugin-transform-regenerator": "npm:^7.24.7"
-    "@babel/plugin-transform-reserved-words": "npm:^7.24.7"
-    "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7"
-    "@babel/plugin-transform-spread": "npm:^7.24.7"
-    "@babel/plugin-transform-sticky-regex": "npm:^7.24.7"
-    "@babel/plugin-transform-template-literals": "npm:^7.24.7"
-    "@babel/plugin-transform-typeof-symbol": "npm:^7.24.7"
-    "@babel/plugin-transform-unicode-escapes": "npm:^7.24.7"
-    "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.7"
-    "@babel/plugin-transform-unicode-regex": "npm:^7.24.7"
-    "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.7"
+    "@babel/plugin-transform-arrow-functions": "npm:^7.25.7"
+    "@babel/plugin-transform-async-generator-functions": "npm:^7.25.7"
+    "@babel/plugin-transform-async-to-generator": "npm:^7.25.7"
+    "@babel/plugin-transform-block-scoped-functions": "npm:^7.25.7"
+    "@babel/plugin-transform-block-scoping": "npm:^7.25.7"
+    "@babel/plugin-transform-class-properties": "npm:^7.25.7"
+    "@babel/plugin-transform-class-static-block": "npm:^7.25.7"
+    "@babel/plugin-transform-classes": "npm:^7.25.7"
+    "@babel/plugin-transform-computed-properties": "npm:^7.25.7"
+    "@babel/plugin-transform-destructuring": "npm:^7.25.7"
+    "@babel/plugin-transform-dotall-regex": "npm:^7.25.7"
+    "@babel/plugin-transform-duplicate-keys": "npm:^7.25.7"
+    "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.7"
+    "@babel/plugin-transform-dynamic-import": "npm:^7.25.7"
+    "@babel/plugin-transform-exponentiation-operator": "npm:^7.25.7"
+    "@babel/plugin-transform-export-namespace-from": "npm:^7.25.7"
+    "@babel/plugin-transform-for-of": "npm:^7.25.7"
+    "@babel/plugin-transform-function-name": "npm:^7.25.7"
+    "@babel/plugin-transform-json-strings": "npm:^7.25.7"
+    "@babel/plugin-transform-literals": "npm:^7.25.7"
+    "@babel/plugin-transform-logical-assignment-operators": "npm:^7.25.7"
+    "@babel/plugin-transform-member-expression-literals": "npm:^7.25.7"
+    "@babel/plugin-transform-modules-amd": "npm:^7.25.7"
+    "@babel/plugin-transform-modules-commonjs": "npm:^7.25.7"
+    "@babel/plugin-transform-modules-systemjs": "npm:^7.25.7"
+    "@babel/plugin-transform-modules-umd": "npm:^7.25.7"
+    "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.25.7"
+    "@babel/plugin-transform-new-target": "npm:^7.25.7"
+    "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.25.7"
+    "@babel/plugin-transform-numeric-separator": "npm:^7.25.7"
+    "@babel/plugin-transform-object-rest-spread": "npm:^7.25.7"
+    "@babel/plugin-transform-object-super": "npm:^7.25.7"
+    "@babel/plugin-transform-optional-catch-binding": "npm:^7.25.7"
+    "@babel/plugin-transform-optional-chaining": "npm:^7.25.7"
+    "@babel/plugin-transform-parameters": "npm:^7.25.7"
+    "@babel/plugin-transform-private-methods": "npm:^7.25.7"
+    "@babel/plugin-transform-private-property-in-object": "npm:^7.25.7"
+    "@babel/plugin-transform-property-literals": "npm:^7.25.7"
+    "@babel/plugin-transform-regenerator": "npm:^7.25.7"
+    "@babel/plugin-transform-reserved-words": "npm:^7.25.7"
+    "@babel/plugin-transform-shorthand-properties": "npm:^7.25.7"
+    "@babel/plugin-transform-spread": "npm:^7.25.7"
+    "@babel/plugin-transform-sticky-regex": "npm:^7.25.7"
+    "@babel/plugin-transform-template-literals": "npm:^7.25.7"
+    "@babel/plugin-transform-typeof-symbol": "npm:^7.25.7"
+    "@babel/plugin-transform-unicode-escapes": "npm:^7.25.7"
+    "@babel/plugin-transform-unicode-property-regex": "npm:^7.25.7"
+    "@babel/plugin-transform-unicode-regex": "npm:^7.25.7"
+    "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.7"
     "@babel/preset-modules": "npm:0.1.6-no-external-plugins"
     babel-plugin-polyfill-corejs2: "npm:^0.4.10"
-    babel-plugin-polyfill-corejs3: "npm:^0.10.4"
+    babel-plugin-polyfill-corejs3: "npm:^0.10.6"
     babel-plugin-polyfill-regenerator: "npm:^0.6.1"
-    core-js-compat: "npm:^3.31.0"
+    core-js-compat: "npm:^3.38.1"
     semver: "npm:^6.3.1"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/c6714346f3ccc1271eaa90051c75b8bb57b20ef57408ab68740e2f3552693ae0ee5a4bcce3a00211d40e4947af1f7b8ab422066b953f0095461937fb72d11274
+  checksum: 10c0/bf704a06a69420250c1de2b126cd5c859a851002c2fb2cce0910cd85a8e6755b9b31577021e94feb7e1e53519923726349aaf07580923928791583db61438fb8
   languageName: node
   linkType: hard
 
 "@babel/preset-flow@npm:^7.13.13":
-  version: 7.24.7
-  resolution: "@babel/preset-flow@npm:7.24.7"
+  version: 7.25.7
+  resolution: "@babel/preset-flow@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-validator-option": "npm:^7.24.7"
-    "@babel/plugin-transform-flow-strip-types": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-validator-option": "npm:^7.25.7"
+    "@babel/plugin-transform-flow-strip-types": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/2a99333b9aac17033cefe17fb9d8c41b20c4f2cd3eab34f56c20d7c1c528cc1cca7e6d909de92fc700739a505b43166c9de62423f8a30b484161ebdf9474e217
+  checksum: 10c0/c0d533628ea9e92558d705e1ecfec51e465e9f251b9dcbd2b4b8ec5007b3238feb1a5cd3e14739f12984a35ccd71a422c92696010b71e69216dfd9389c3cf51c
   languageName: node
   linkType: hard
 
@@ -1629,39 +1623,39 @@ __metadata:
   linkType: hard
 
 "@babel/preset-react@npm:^7.14.5, @babel/preset-react@npm:^7.18.6":
-  version: 7.24.7
-  resolution: "@babel/preset-react@npm:7.24.7"
+  version: 7.25.7
+  resolution: "@babel/preset-react@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-validator-option": "npm:^7.24.7"
-    "@babel/plugin-transform-react-display-name": "npm:^7.24.7"
-    "@babel/plugin-transform-react-jsx": "npm:^7.24.7"
-    "@babel/plugin-transform-react-jsx-development": "npm:^7.24.7"
-    "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-validator-option": "npm:^7.25.7"
+    "@babel/plugin-transform-react-display-name": "npm:^7.25.7"
+    "@babel/plugin-transform-react-jsx": "npm:^7.25.7"
+    "@babel/plugin-transform-react-jsx-development": "npm:^7.25.7"
+    "@babel/plugin-transform-react-pure-annotations": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/9658b685b25cedaadd0b65c4e663fbc7f57394b5036ddb4c99b1a75b0711fb83292c1c625d605c05b73413fc7a6dc20e532627f6a39b6dc8d4e00415479b054c
+  checksum: 10c0/b133b1a2f46c70a337d8b1ef442e09e3dbdaecb0d6bed8f1cb64dfddc31c16e248b017385ab909caeebd8462111c9c0e1c5409deb10f2be5cb5bcfdaa4d27718
   languageName: node
   linkType: hard
 
 "@babel/preset-typescript@npm:^7.13.0, @babel/preset-typescript@npm:^7.15.0, @babel/preset-typescript@npm:^7.18.6":
-  version: 7.24.7
-  resolution: "@babel/preset-typescript@npm:7.24.7"
+  version: 7.25.7
+  resolution: "@babel/preset-typescript@npm:7.25.7"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.7"
-    "@babel/helper-validator-option": "npm:^7.24.7"
-    "@babel/plugin-syntax-jsx": "npm:^7.24.7"
-    "@babel/plugin-transform-modules-commonjs": "npm:^7.24.7"
-    "@babel/plugin-transform-typescript": "npm:^7.24.7"
+    "@babel/helper-plugin-utils": "npm:^7.25.7"
+    "@babel/helper-validator-option": "npm:^7.25.7"
+    "@babel/plugin-syntax-jsx": "npm:^7.25.7"
+    "@babel/plugin-transform-modules-commonjs": "npm:^7.25.7"
+    "@babel/plugin-transform-typescript": "npm:^7.25.7"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/986bc0978eedb4da33aba8e1e13a3426dd1829515313b7e8f4ba5d8c18aff1663b468939d471814e7acf4045d326ae6cff37239878d169ac3fe53a8fde71f8ee
+  checksum: 10c0/8dc1258e3c5230bbe42ff9811f08924509238e6bd32fa0b7b0c0a6c5e1419512a8e1f733e1b114454d367b7c164beca2cf33acf2ed9e0d99be010c1c5cdbef0c
   languageName: node
   linkType: hard
 
 "@babel/register@npm:^7.0.0, @babel/register@npm:^7.13.16":
-  version: 7.24.6
-  resolution: "@babel/register@npm:7.24.6"
+  version: 7.25.7
+  resolution: "@babel/register@npm:7.25.7"
   dependencies:
     clone-deep: "npm:^4.0.1"
     find-cache-dir: "npm:^2.0.0"
@@ -1670,63 +1664,53 @@ __metadata:
     source-map-support: "npm:^0.5.16"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/e0c6d6c8945dd792f83dc7bd6be468246b3aedd62b32620e56a3f3328389b577a6261d4338a9de9519f4eadddfef5aa0fdc1f92082c778dedddcc5854e357f09
-  languageName: node
-  linkType: hard
-
-"@babel/regjsgen@npm:^0.8.0":
-  version: 0.8.0
-  resolution: "@babel/regjsgen@npm:0.8.0"
-  checksum: 10c0/4f3ddd8c7c96d447e05c8304c1d5ba3a83fcabd8a716bc1091c2f31595cdd43a3a055fff7cb5d3042b8cb7d402d78820fcb4e05d896c605a7d8bcf30f2424c4a
+  checksum: 10c0/af32db39edb2ed0c46d05bcb09cb2c14f8ee452d112f08a96a2e2daeaddc127d4f2269354aa968d0c01cd286523ad7e865b0abed1da9229833fd440ee6831199
   languageName: node
   linkType: hard
 
 "@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.14.0, @babel/runtime@npm:^7.14.8, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4":
-  version: 7.24.7
-  resolution: "@babel/runtime@npm:7.24.7"
+  version: 7.25.7
+  resolution: "@babel/runtime@npm:7.25.7"
   dependencies:
     regenerator-runtime: "npm:^0.14.0"
-  checksum: 10c0/b6fa3ec61a53402f3c1d75f4d808f48b35e0dfae0ec8e2bb5c6fc79fb95935da75766e0ca534d0f1c84871f6ae0d2ebdd950727cfadb745a2cdbef13faef5513
+  checksum: 10c0/86b7829d2fc9343714a9afe92757cf96c4dc799006ca61d73cda62f4b9e29bfa1ce36794955bc6cb4c188f5b10db832c949339895e1bbe81a69022d9d578ce29
   languageName: node
   linkType: hard
 
-"@babel/template@npm:^7.0.0, @babel/template@npm:^7.24.7, @babel/template@npm:^7.3.3":
-  version: 7.24.7
-  resolution: "@babel/template@npm:7.24.7"
+"@babel/template@npm:^7.0.0, @babel/template@npm:^7.25.7, @babel/template@npm:^7.3.3":
+  version: 7.25.7
+  resolution: "@babel/template@npm:7.25.7"
   dependencies:
-    "@babel/code-frame": "npm:^7.24.7"
-    "@babel/parser": "npm:^7.24.7"
-    "@babel/types": "npm:^7.24.7"
-  checksum: 10c0/95b0b3ee80fcef685b7f4426f5713a855ea2cd5ac4da829b213f8fb5afe48a2a14683c2ea04d446dbc7f711c33c5cd4a965ef34dcbe5bc387c9e966b67877ae3
+    "@babel/code-frame": "npm:^7.25.7"
+    "@babel/parser": "npm:^7.25.7"
+    "@babel/types": "npm:^7.25.7"
+  checksum: 10c0/8ae9e36e4330ee83d4832531d1d9bec7dc2ef6a2a8afa1ef1229506fd60667abcb17f306d1c3d7e582251270597022990c845d5d69e7add70a5aea66720decb9
   languageName: node
   linkType: hard
 
-"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.7.2":
-  version: 7.24.7
-  resolution: "@babel/traverse@npm:7.24.7"
-  dependencies:
-    "@babel/code-frame": "npm:^7.24.7"
-    "@babel/generator": "npm:^7.24.7"
-    "@babel/helper-environment-visitor": "npm:^7.24.7"
-    "@babel/helper-function-name": "npm:^7.24.7"
-    "@babel/helper-hoist-variables": "npm:^7.24.7"
-    "@babel/helper-split-export-declaration": "npm:^7.24.7"
-    "@babel/parser": "npm:^7.24.7"
-    "@babel/types": "npm:^7.24.7"
+"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.25.7, @babel/traverse@npm:^7.7.2":
+  version: 7.25.7
+  resolution: "@babel/traverse@npm:7.25.7"
+  dependencies:
+    "@babel/code-frame": "npm:^7.25.7"
+    "@babel/generator": "npm:^7.25.7"
+    "@babel/parser": "npm:^7.25.7"
+    "@babel/template": "npm:^7.25.7"
+    "@babel/types": "npm:^7.25.7"
     debug: "npm:^4.3.1"
     globals: "npm:^11.1.0"
-  checksum: 10c0/a5135e589c3f1972b8877805f50a084a04865ccb1d68e5e1f3b94a8841b3485da4142e33413d8fd76bc0e6444531d3adf1f59f359c11ffac452b743d835068ab
+  checksum: 10c0/75d73e52c507a7a7a4c7971d6bf4f8f26fdd094e0d3a0193d77edf6a5efa36fc3db91ec5cc48e8b94e6eb5d5ad21af0a1040e71309172851209415fd105efb1a
   languageName: node
   linkType: hard
 
-"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3":
-  version: 7.24.7
-  resolution: "@babel/types@npm:7.24.7"
+"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.7, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4":
+  version: 7.25.7
+  resolution: "@babel/types@npm:7.25.7"
   dependencies:
-    "@babel/helper-string-parser": "npm:^7.24.7"
-    "@babel/helper-validator-identifier": "npm:^7.24.7"
+    "@babel/helper-string-parser": "npm:^7.25.7"
+    "@babel/helper-validator-identifier": "npm:^7.25.7"
     to-fast-properties: "npm:^2.0.0"
-  checksum: 10c0/d9ecbfc3eb2b05fb1e6eeea546836ac30d990f395ef3fe3f75ced777a222c3cfc4489492f72e0ce3d9a5a28860a1ce5f81e66b88cf5088909068b3ff4fab72c1
+  checksum: 10c0/e03e1e2e08600fa1e8eb90632ac9c253dd748176c8d670d85f85b0dc83a0573b26ae748a1cbcb81f401903a3d95f43c3f4f8d516a5ed779929db27de56289633
   languageName: node
   linkType: hard
 
@@ -1783,13 +1767,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@commitlint/config-validator@npm:^19.0.3":
-  version: 19.0.3
-  resolution: "@commitlint/config-validator@npm:19.0.3"
+"@commitlint/config-validator@npm:^19.5.0":
+  version: 19.5.0
+  resolution: "@commitlint/config-validator@npm:19.5.0"
   dependencies:
-    "@commitlint/types": "npm:^19.0.3"
+    "@commitlint/types": "npm:^19.5.0"
     ajv: "npm:^8.11.0"
-  checksum: 10c0/7a0d55837fb88b1f05892fed67a9582669331a452de96e4caec0c9a397cd6083701265b066e6e32a259b43737187cd31b15ab02b0459c817ea9e7b75602db3c7
+  checksum: 10c0/f04b8c66448c9a4f335d1ac9625393d471d2bcc864adc834eeec52ce19939c25475bf90677504df03ab88869e883b4ebfddff68f99f7652900d6b297ef586643
   languageName: node
   linkType: hard
 
@@ -1814,10 +1798,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@commitlint/execute-rule@npm:^19.0.0":
-  version: 19.0.0
-  resolution: "@commitlint/execute-rule@npm:19.0.0"
-  checksum: 10c0/70d37f25a9af0a6adcd9ae7cadd4a917e8d219d316798469e2957608288d7cab8a3b03f7b132f1229a5ee545bbba139dc801d0006a7df3b756354b3890b9c1bb
+"@commitlint/execute-rule@npm:^19.5.0":
+  version: 19.5.0
+  resolution: "@commitlint/execute-rule@npm:19.5.0"
+  checksum: 10c0/966dfc09ae3fe609527fb49c7773ae210ade9d14a802a92a57ab251900a77d2968aed08df6b34f175bf4ae9bf5d675b52b346e7b10b717e8a635499e4cf42267
   languageName: node
   linkType: hard
 
@@ -1854,20 +1838,20 @@ __metadata:
   linkType: hard
 
 "@commitlint/load@npm:>6.1.1":
-  version: 19.2.0
-  resolution: "@commitlint/load@npm:19.2.0"
+  version: 19.5.0
+  resolution: "@commitlint/load@npm:19.5.0"
   dependencies:
-    "@commitlint/config-validator": "npm:^19.0.3"
-    "@commitlint/execute-rule": "npm:^19.0.0"
-    "@commitlint/resolve-extends": "npm:^19.1.0"
-    "@commitlint/types": "npm:^19.0.3"
+    "@commitlint/config-validator": "npm:^19.5.0"
+    "@commitlint/execute-rule": "npm:^19.5.0"
+    "@commitlint/resolve-extends": "npm:^19.5.0"
+    "@commitlint/types": "npm:^19.5.0"
     chalk: "npm:^5.3.0"
     cosmiconfig: "npm:^9.0.0"
     cosmiconfig-typescript-loader: "npm:^5.0.0"
     lodash.isplainobject: "npm:^4.0.6"
     lodash.merge: "npm:^4.6.2"
     lodash.uniq: "npm:^4.5.0"
-  checksum: 10c0/100ad63e99f59cdad7f48748b77a9a55710a2487971dd2ee503ba003aaf407ab49acf844a45c87a8b5e0a4de3a037cadaed9460ecd6d2e886bbdf943eb344bb2
+  checksum: 10c0/72fb5f3b2299cb40374181e4fb630658c7faf0cca775bd15338e9a49f9571134ef25529319b453ed0d68917346949abf88c44f73a132f89d8965d6b3e7347d0b
   languageName: node
   linkType: hard
 
@@ -1938,17 +1922,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@commitlint/resolve-extends@npm:^19.1.0":
-  version: 19.1.0
-  resolution: "@commitlint/resolve-extends@npm:19.1.0"
+"@commitlint/resolve-extends@npm:^19.5.0":
+  version: 19.5.0
+  resolution: "@commitlint/resolve-extends@npm:19.5.0"
   dependencies:
-    "@commitlint/config-validator": "npm:^19.0.3"
-    "@commitlint/types": "npm:^19.0.3"
+    "@commitlint/config-validator": "npm:^19.5.0"
+    "@commitlint/types": "npm:^19.5.0"
     global-directory: "npm:^4.0.1"
     import-meta-resolve: "npm:^4.0.0"
     lodash.mergewith: "npm:^4.6.2"
     resolve-from: "npm:^5.0.0"
-  checksum: 10c0/5b4c69694ddf63f15499a940f99a39bdf0ae1943eb4731c7ea10572e416e44d6d57280faa8011801f4dc64aa70e55eb3b510c86c8e2b76820dcfe88b421afd4a
+  checksum: 10c0/10569a46036b7aa93c77dc5001a67bc9f36b340b97b2fd39b5ee95b0efc5e35335c61f86d4ba0bb5a8e6dd49ccf956990cce9ee29cfea9ba567e02668be01841
   languageName: node
   linkType: hard
 
@@ -1990,13 +1974,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@commitlint/types@npm:^19.0.3":
-  version: 19.0.3
-  resolution: "@commitlint/types@npm:19.0.3"
+"@commitlint/types@npm:^19.5.0":
+  version: 19.5.0
+  resolution: "@commitlint/types@npm:19.5.0"
   dependencies:
     "@types/conventional-commits-parser": "npm:^5.0.0"
     chalk: "npm:^5.3.0"
-  checksum: 10c0/279454409771097432cb3ecd4930b8f10e99e150b9306e931b69e4e80011a4251f326523bfaba59fcf9a9db7978c76073b7c7c07fbad6b90e045cb0fa2b70047
+  checksum: 10c0/f4a93992f43b23cd5af200c69bb73227fdc0f78a6f7ebcda73dad10d558c1ac66ff164aa6dc3c2ddb322c9ed8b1a89b05f458e40d7c440a0358f435d2d71c2df
   languageName: node
   linkType: hard
 
@@ -2025,6 +2009,34 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@emnapi/core@npm:^1.1.0":
+  version: 1.3.0
+  resolution: "@emnapi/core@npm:1.3.0"
+  dependencies:
+    "@emnapi/wasi-threads": "npm:1.0.1"
+    tslib: "npm:^2.4.0"
+  checksum: 10c0/ec204a6a1d8caf189ae5268359c7fa58b8b07b730f86e0e4492ec2610a3dc2d236c256bd8ac3af970db141a58a1eed41f52dd0a47dc2613ee744b26bee71b039
+  languageName: node
+  linkType: hard
+
+"@emnapi/runtime@npm:^1.1.0":
+  version: 1.3.0
+  resolution: "@emnapi/runtime@npm:1.3.0"
+  dependencies:
+    tslib: "npm:^2.4.0"
+  checksum: 10c0/b5f454bf258c45fba8543de16f6c3042313f78efe50a57ad577bf5172b745e1b657c4e69848476e754be3a1e9d1742a1ef409cce3bd5a2808d7b472103aeb660
+  languageName: node
+  linkType: hard
+
+"@emnapi/wasi-threads@npm:1.0.1":
+  version: 1.0.1
+  resolution: "@emnapi/wasi-threads@npm:1.0.1"
+  dependencies:
+    tslib: "npm:^2.4.0"
+  checksum: 10c0/1e0c8036b8d53e9b07cc9acf021705ef6c86ab6b13e1acda7fffaf541a2d3565072afb92597419173ced9ea14f6bf32fce149106e669b5902b825e8b499e5c6c
+  languageName: node
+  linkType: hard
+
 "@emotion/is-prop-valid@npm:1.2.2":
   version: 1.2.2
   resolution: "@emotion/is-prop-valid@npm:1.2.2"
@@ -2467,7 +2479,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@expo/bunyan@npm:4.0.0, @expo/bunyan@npm:^4.0.0":
+"@expo/bunyan@npm:4.0.0":
   version: 4.0.0
   resolution: "@expo/bunyan@npm:4.0.0"
   dependencies:
@@ -2483,6 +2495,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@expo/bunyan@npm:^4.0.0":
+  version: 4.0.1
+  resolution: "@expo/bunyan@npm:4.0.1"
+  dependencies:
+    uuid: "npm:^8.0.0"
+  checksum: 10c0/ebbec51c7b19dcfcbd981da9c1c6262c0dc03ea118356fefca3b427f445308845fc33d97da92350d68fda174f9f1d5ee95ed3ac978f1f6cc88de73d785b909cc
+  languageName: node
+  linkType: hard
+
 "@expo/cli@npm:0.1.7":
   version: 0.1.7
   resolution: "@expo/cli@npm:0.1.7"
@@ -2632,23 +2653,22 @@ __metadata:
   linkType: hard
 
 "@expo/devcert@npm:^1.0.0":
-  version: 1.1.2
-  resolution: "@expo/devcert@npm:1.1.2"
+  version: 1.1.4
+  resolution: "@expo/devcert@npm:1.1.4"
   dependencies:
     application-config-path: "npm:^0.1.0"
     command-exists: "npm:^1.2.4"
     debug: "npm:^3.1.0"
     eol: "npm:^0.9.1"
     get-port: "npm:^3.2.0"
-    glob: "npm:^7.1.2"
+    glob: "npm:^10.4.2"
     lodash: "npm:^4.17.21"
     mkdirp: "npm:^0.5.1"
     password-prompt: "npm:^1.0.4"
-    rimraf: "npm:^2.6.2"
     sudo-prompt: "npm:^8.2.0"
     tmp: "npm:^0.0.33"
     tslib: "npm:^2.4.0"
-  checksum: 10c0/cb3cee0197adaf9a20d63d0fa5e93292c4e06f76937a32d84114de3757c978ea8e51aa448cc3e0bc46c1f3f919e5e0e3e51e9eb5250b328d7d9218c29d788ee0
+  checksum: 10c0/2d6018623be7435acbbe7a8eaf46d6f25c8d33549640b0468afa4c20fe02bafd4291e69e9b36624d8d4d7c5eb4246d4c8b0a784b15e6014f70ad629a667e2916
   languageName: node
   linkType: hard
 
@@ -3199,9 +3219,9 @@ __metadata:
   linkType: hard
 
 "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14":
-  version: 1.4.15
-  resolution: "@jridgewell/sourcemap-codec@npm:1.4.15"
-  checksum: 10c0/0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5
+  version: 1.5.0
+  resolution: "@jridgewell/sourcemap-codec@npm:1.5.0"
+  checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18
   languageName: node
   linkType: hard
 
@@ -3266,6 +3286,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@napi-rs/wasm-runtime@npm:^0.2.4":
+  version: 0.2.5
+  resolution: "@napi-rs/wasm-runtime@npm:0.2.5"
+  dependencies:
+    "@emnapi/core": "npm:^1.1.0"
+    "@emnapi/runtime": "npm:^1.1.0"
+    "@tybys/wasm-util": "npm:^0.9.0"
+  checksum: 10c0/32ea8defd3cc380bcf0de6ffc39a3b9cbe746f6c64000e0f0996a96dc776a7e87df7efeba5ce94e53d8b0ff2cda42f5a54673bdfeedbe8f037426255aba853f7
+  languageName: node
+  linkType: hard
+
 "@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0":
   version: 1.2.0
   resolution: "@noble/curves@npm:1.2.0"
@@ -3742,6 +3773,85 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@oxc-resolver/binding-darwin-arm64@npm:1.12.0":
+  version: 1.12.0
+  resolution: "@oxc-resolver/binding-darwin-arm64@npm:1.12.0"
+  conditions: os=darwin & cpu=arm64
+  languageName: node
+  linkType: hard
+
+"@oxc-resolver/binding-darwin-x64@npm:1.12.0":
+  version: 1.12.0
+  resolution: "@oxc-resolver/binding-darwin-x64@npm:1.12.0"
+  conditions: os=darwin & cpu=x64
+  languageName: node
+  linkType: hard
+
+"@oxc-resolver/binding-freebsd-x64@npm:1.12.0":
+  version: 1.12.0
+  resolution: "@oxc-resolver/binding-freebsd-x64@npm:1.12.0"
+  conditions: os=freebsd & cpu=x64
+  languageName: node
+  linkType: hard
+
+"@oxc-resolver/binding-linux-arm-gnueabihf@npm:1.12.0":
+  version: 1.12.0
+  resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:1.12.0"
+  conditions: os=linux & cpu=arm
+  languageName: node
+  linkType: hard
+
+"@oxc-resolver/binding-linux-arm64-gnu@npm:1.12.0":
+  version: 1.12.0
+  resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:1.12.0"
+  conditions: os=linux & cpu=arm64 & libc=glibc
+  languageName: node
+  linkType: hard
+
+"@oxc-resolver/binding-linux-arm64-musl@npm:1.12.0":
+  version: 1.12.0
+  resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:1.12.0"
+  conditions: os=linux & cpu=arm64 & libc=musl
+  languageName: node
+  linkType: hard
+
+"@oxc-resolver/binding-linux-x64-gnu@npm:1.12.0":
+  version: 1.12.0
+  resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:1.12.0"
+  conditions: os=linux & cpu=x64 & libc=glibc
+  languageName: node
+  linkType: hard
+
+"@oxc-resolver/binding-linux-x64-musl@npm:1.12.0":
+  version: 1.12.0
+  resolution: "@oxc-resolver/binding-linux-x64-musl@npm:1.12.0"
+  conditions: os=linux & cpu=x64 & libc=musl
+  languageName: node
+  linkType: hard
+
+"@oxc-resolver/binding-wasm32-wasi@npm:1.12.0":
+  version: 1.12.0
+  resolution: "@oxc-resolver/binding-wasm32-wasi@npm:1.12.0"
+  dependencies:
+    "@napi-rs/wasm-runtime": "npm:^0.2.4"
+  conditions: cpu=wasm32
+  languageName: node
+  linkType: hard
+
+"@oxc-resolver/binding-win32-arm64-msvc@npm:1.12.0":
+  version: 1.12.0
+  resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:1.12.0"
+  conditions: os=win32 & cpu=arm64
+  languageName: node
+  linkType: hard
+
+"@oxc-resolver/binding-win32-x64-msvc@npm:1.12.0":
+  version: 1.12.0
+  resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:1.12.0"
+  conditions: os=win32 & cpu=x64
+  languageName: node
+  linkType: hard
+
 "@parcel/watcher@npm:2.0.4":
   version: 2.0.4
   resolution: "@parcel/watcher@npm:2.0.4"
@@ -4203,10 +4313,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@rtsao/scc@npm:^1.1.0":
+  version: 1.1.0
+  resolution: "@rtsao/scc@npm:1.1.0"
+  checksum: 10c0/b5bcfb0d87f7d1c1c7c0f7693f53b07866ed9fec4c34a97a8c948fb9a7c0082e416ce4d3b60beb4f5e167cbe04cdeefbf6771320f3ede059b9ce91188c409a5b
+  languageName: node
+  linkType: hard
+
 "@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2":
-  version: 1.1.7
-  resolution: "@scure/base@npm:1.1.7"
-  checksum: 10c0/2d06aaf39e6de4b9640eb40d2e5419176ebfe911597856dcbf3bc6209277ddb83f4b4b02cb1fd1208f819654268ec083da68111d3530bbde07bae913e2fc2e5d
+  version: 1.1.9
+  resolution: "@scure/base@npm:1.1.9"
+  checksum: 10c0/77a06b9a2db8144d22d9bf198338893d77367c51b58c72b99df990c0a11f7cadd066d4102abb15e3ca6798d1529e3765f55c4355742465e49aed7a0c01fe76e8
   languageName: node
   linkType: hard
 
@@ -4458,129 +4575,130 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@swc-node/core@npm:^1.13.1":
-  version: 1.13.1
-  resolution: "@swc-node/core@npm:1.13.1"
+"@swc-node/core@npm:^1.13.3":
+  version: 1.13.3
+  resolution: "@swc-node/core@npm:1.13.3"
   peerDependencies:
     "@swc/core": ">= 1.4.13"
     "@swc/types": ">= 0.1"
-  checksum: 10c0/03223813c1b736ded4e3a6fe73e87d19e9578215e7f7b0c96308ac0e06c7de355334f210074256cfc8b52446461716df695aaf0f863ec621679cf4c48010a695
+  checksum: 10c0/01f69d6124691569cedd2e6d0c6d3e33ab96d8fca6607780d64359c884750cfd77541e112e545cf37d9f0ee5fdccd57fbf9eb07cfd0ae26f8cca88c974e82e08
   languageName: node
   linkType: hard
 
 "@swc-node/register@npm:^1.4.2":
-  version: 1.9.2
-  resolution: "@swc-node/register@npm:1.9.2"
+  version: 1.10.9
+  resolution: "@swc-node/register@npm:1.10.9"
   dependencies:
-    "@swc-node/core": "npm:^1.13.1"
-    "@swc-node/sourcemap-support": "npm:^0.5.0"
+    "@swc-node/core": "npm:^1.13.3"
+    "@swc-node/sourcemap-support": "npm:^0.5.1"
     colorette: "npm:^2.0.20"
-    debug: "npm:^4.3.4"
+    debug: "npm:^4.3.5"
+    oxc-resolver: "npm:^1.10.2"
     pirates: "npm:^4.0.6"
-    tslib: "npm:^2.6.2"
+    tslib: "npm:^2.6.3"
   peerDependencies:
     "@swc/core": ">= 1.4.13"
     typescript: ">= 4.3"
-  checksum: 10c0/9169461866b5081074e4ca96256776d0dc586e979ec0f589115daba6959628cdad7233ad7a66816c0fc412dad1c0b83a32fc271f8e46dd19a82f9e4843198a2f
+  checksum: 10c0/54cc40b200cd9dda881c59bfe163bed3f8790cb93befe4d0ac4c130ab9836a31edc32da856d72ab45573aeb26bb36072aa3a1a9f68547cbb5d76cff1df814d41
   languageName: node
   linkType: hard
 
-"@swc-node/sourcemap-support@npm:^0.5.0":
-  version: 0.5.0
-  resolution: "@swc-node/sourcemap-support@npm:0.5.0"
+"@swc-node/sourcemap-support@npm:^0.5.1":
+  version: 0.5.1
+  resolution: "@swc-node/sourcemap-support@npm:0.5.1"
   dependencies:
     source-map-support: "npm:^0.5.21"
-    tslib: "npm:^2.6.2"
-  checksum: 10c0/ce079d56d23aca8110fe5aa4826b394aa613b44fc442198a5403bf146d8963f38ed7cb4fa9594095c4c78fe06e5a0781dc51b5343d687658c4426e7fbfce749b
+    tslib: "npm:^2.6.3"
+  checksum: 10c0/5ac7e701a0683e0e6760c8078d4bb2829daa78c4946dcc729c75588b87112afc7352f7c8cd90cea9417b5f7494418d374a354795344c4cf81152bce3d5a17853
   languageName: node
   linkType: hard
 
-"@swc/core-darwin-arm64@npm:1.6.3":
-  version: 1.6.3
-  resolution: "@swc/core-darwin-arm64@npm:1.6.3"
+"@swc/core-darwin-arm64@npm:1.7.26":
+  version: 1.7.26
+  resolution: "@swc/core-darwin-arm64@npm:1.7.26"
   conditions: os=darwin & cpu=arm64
   languageName: node
   linkType: hard
 
-"@swc/core-darwin-x64@npm:1.6.3":
-  version: 1.6.3
-  resolution: "@swc/core-darwin-x64@npm:1.6.3"
+"@swc/core-darwin-x64@npm:1.7.26":
+  version: 1.7.26
+  resolution: "@swc/core-darwin-x64@npm:1.7.26"
   conditions: os=darwin & cpu=x64
   languageName: node
   linkType: hard
 
-"@swc/core-linux-arm-gnueabihf@npm:1.6.3":
-  version: 1.6.3
-  resolution: "@swc/core-linux-arm-gnueabihf@npm:1.6.3"
+"@swc/core-linux-arm-gnueabihf@npm:1.7.26":
+  version: 1.7.26
+  resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.26"
   conditions: os=linux & cpu=arm
   languageName: node
   linkType: hard
 
-"@swc/core-linux-arm64-gnu@npm:1.6.3":
-  version: 1.6.3
-  resolution: "@swc/core-linux-arm64-gnu@npm:1.6.3"
+"@swc/core-linux-arm64-gnu@npm:1.7.26":
+  version: 1.7.26
+  resolution: "@swc/core-linux-arm64-gnu@npm:1.7.26"
   conditions: os=linux & cpu=arm64 & libc=glibc
   languageName: node
   linkType: hard
 
-"@swc/core-linux-arm64-musl@npm:1.6.3":
-  version: 1.6.3
-  resolution: "@swc/core-linux-arm64-musl@npm:1.6.3"
+"@swc/core-linux-arm64-musl@npm:1.7.26":
+  version: 1.7.26
+  resolution: "@swc/core-linux-arm64-musl@npm:1.7.26"
   conditions: os=linux & cpu=arm64 & libc=musl
   languageName: node
   linkType: hard
 
-"@swc/core-linux-x64-gnu@npm:1.6.3":
-  version: 1.6.3
-  resolution: "@swc/core-linux-x64-gnu@npm:1.6.3"
+"@swc/core-linux-x64-gnu@npm:1.7.26":
+  version: 1.7.26
+  resolution: "@swc/core-linux-x64-gnu@npm:1.7.26"
   conditions: os=linux & cpu=x64 & libc=glibc
   languageName: node
   linkType: hard
 
-"@swc/core-linux-x64-musl@npm:1.6.3":
-  version: 1.6.3
-  resolution: "@swc/core-linux-x64-musl@npm:1.6.3"
+"@swc/core-linux-x64-musl@npm:1.7.26":
+  version: 1.7.26
+  resolution: "@swc/core-linux-x64-musl@npm:1.7.26"
   conditions: os=linux & cpu=x64 & libc=musl
   languageName: node
   linkType: hard
 
-"@swc/core-win32-arm64-msvc@npm:1.6.3":
-  version: 1.6.3
-  resolution: "@swc/core-win32-arm64-msvc@npm:1.6.3"
+"@swc/core-win32-arm64-msvc@npm:1.7.26":
+  version: 1.7.26
+  resolution: "@swc/core-win32-arm64-msvc@npm:1.7.26"
   conditions: os=win32 & cpu=arm64
   languageName: node
   linkType: hard
 
-"@swc/core-win32-ia32-msvc@npm:1.6.3":
-  version: 1.6.3
-  resolution: "@swc/core-win32-ia32-msvc@npm:1.6.3"
+"@swc/core-win32-ia32-msvc@npm:1.7.26":
+  version: 1.7.26
+  resolution: "@swc/core-win32-ia32-msvc@npm:1.7.26"
   conditions: os=win32 & cpu=ia32
   languageName: node
   linkType: hard
 
-"@swc/core-win32-x64-msvc@npm:1.6.3":
-  version: 1.6.3
-  resolution: "@swc/core-win32-x64-msvc@npm:1.6.3"
+"@swc/core-win32-x64-msvc@npm:1.7.26":
+  version: 1.7.26
+  resolution: "@swc/core-win32-x64-msvc@npm:1.7.26"
   conditions: os=win32 & cpu=x64
   languageName: node
   linkType: hard
 
 "@swc/core@npm:^1.2.173":
-  version: 1.6.3
-  resolution: "@swc/core@npm:1.6.3"
-  dependencies:
-    "@swc/core-darwin-arm64": "npm:1.6.3"
-    "@swc/core-darwin-x64": "npm:1.6.3"
-    "@swc/core-linux-arm-gnueabihf": "npm:1.6.3"
-    "@swc/core-linux-arm64-gnu": "npm:1.6.3"
-    "@swc/core-linux-arm64-musl": "npm:1.6.3"
-    "@swc/core-linux-x64-gnu": "npm:1.6.3"
-    "@swc/core-linux-x64-musl": "npm:1.6.3"
-    "@swc/core-win32-arm64-msvc": "npm:1.6.3"
-    "@swc/core-win32-ia32-msvc": "npm:1.6.3"
-    "@swc/core-win32-x64-msvc": "npm:1.6.3"
+  version: 1.7.26
+  resolution: "@swc/core@npm:1.7.26"
+  dependencies:
+    "@swc/core-darwin-arm64": "npm:1.7.26"
+    "@swc/core-darwin-x64": "npm:1.7.26"
+    "@swc/core-linux-arm-gnueabihf": "npm:1.7.26"
+    "@swc/core-linux-arm64-gnu": "npm:1.7.26"
+    "@swc/core-linux-arm64-musl": "npm:1.7.26"
+    "@swc/core-linux-x64-gnu": "npm:1.7.26"
+    "@swc/core-linux-x64-musl": "npm:1.7.26"
+    "@swc/core-win32-arm64-msvc": "npm:1.7.26"
+    "@swc/core-win32-ia32-msvc": "npm:1.7.26"
+    "@swc/core-win32-x64-msvc": "npm:1.7.26"
     "@swc/counter": "npm:^0.1.3"
-    "@swc/types": "npm:^0.1.8"
+    "@swc/types": "npm:^0.1.12"
   peerDependencies:
     "@swc/helpers": "*"
   dependenciesMeta:
@@ -4607,7 +4725,7 @@ __metadata:
   peerDependenciesMeta:
     "@swc/helpers":
       optional: true
-  checksum: 10c0/1f0aa07a00ba29ca3b9d5977d0006bff8b44b2ef497d9bc565af3550b8facec60e5a4f0da72c8d1d7494807287a75537c7e3a7cbc26bfe642ec82228efa08b76
+  checksum: 10c0/6c5ce3d048cb100cd545145b1701a857207b1aeecc8f6bc44ed10b0a1792052834d155a6fa651dad20f38d3fff595034649cc75618946be8da751fa86a9c75b7
   languageName: node
   linkType: hard
 
@@ -4618,12 +4736,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@swc/types@npm:^0.1.8":
-  version: 0.1.8
-  resolution: "@swc/types@npm:0.1.8"
+"@swc/types@npm:^0.1.12":
+  version: 0.1.12
+  resolution: "@swc/types@npm:0.1.12"
   dependencies:
     "@swc/counter": "npm:^0.1.3"
-  checksum: 10c0/a3bb7145d8f01d58f93683645ef530c479243f04c2a79a15020e2a1ac69003643bc1cad1075225f3992b2a5e55be43f264eaea88620263d90ada98a4107fb872
+  checksum: 10c0/f95fea7dee8fc07f8389afbb9578f3d0cd84b429b1d0dbff7fd99b2ef06ed88e96bc33631f36c3bc0505d5a783bee1374acd84b8fc2593001219b6c2caba241b
   languageName: node
   linkType: hard
 
@@ -4726,6 +4844,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@tybys/wasm-util@npm:^0.9.0":
+  version: 0.9.0
+  resolution: "@tybys/wasm-util@npm:0.9.0"
+  dependencies:
+    tslib: "npm:^2.4.0"
+  checksum: 10c0/f9fde5c554455019f33af6c8215f1a1435028803dc2a2825b077d812bed4209a1a64444a4ca0ce2ea7e1175c8d88e2f9173a36a33c199e8a5c671aa31de8242d
+  languageName: node
+  linkType: hard
+
 "@types/aria-query@npm:^5.0.1":
   version: 5.0.4
   resolution: "@types/aria-query@npm:5.0.4"
@@ -4794,9 +4921,9 @@ __metadata:
   linkType: hard
 
 "@types/chai@npm:^4.3.4":
-  version: 4.3.16
-  resolution: "@types/chai@npm:4.3.16"
-  checksum: 10c0/745d4a9be429d5d86a7ab26064610b8957fe12dd80e94dc7d0707cf3db1c889e3ffe0d73d69bb15e6d376bf4462a7a75e9d8fc1051750b5d656d6cfe459829b7
+  version: 4.3.20
+  resolution: "@types/chai@npm:4.3.20"
+  checksum: 10c0/4601189d611752e65018f1ecadac82e94eed29f348e1d5430e5681a60b01e1ecf855d9bcc74ae43b07394751f184f6970fac2b5561fc57a1f36e93a0f5ffb6e8
   languageName: node
   linkType: hard
 
@@ -4835,30 +4962,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/eslint-scope@npm:^3.7.3":
-  version: 3.7.7
-  resolution: "@types/eslint-scope@npm:3.7.7"
-  dependencies:
-    "@types/eslint": "npm:*"
-    "@types/estree": "npm:*"
-  checksum: 10c0/a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc
-  languageName: node
-  linkType: hard
-
-"@types/eslint@npm:*":
-  version: 8.56.10
-  resolution: "@types/eslint@npm:8.56.10"
-  dependencies:
-    "@types/estree": "npm:*"
-    "@types/json-schema": "npm:*"
-  checksum: 10c0/674349d6c342c3864d70f4d5a9965f96fb253801532752c8c500ad6a1c2e8b219e01ccff5dc8791dcb58b5483012c495708bb9f3ff929f5c9322b3da126c15d3
-  languageName: node
-  linkType: hard
-
 "@types/estree@npm:*, @types/estree@npm:^1.0.5":
-  version: 1.0.5
-  resolution: "@types/estree@npm:1.0.5"
-  checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d
+  version: 1.0.6
+  resolution: "@types/estree@npm:1.0.6"
+  checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a
   languageName: node
   linkType: hard
 
@@ -4869,19 +4976,43 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33":
-  version: 4.19.5
-  resolution: "@types/express-serve-static-core@npm:4.19.5"
+"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^5.0.0":
+  version: 5.0.0
+  resolution: "@types/express-serve-static-core@npm:5.0.0"
   dependencies:
     "@types/node": "npm:*"
     "@types/qs": "npm:*"
     "@types/range-parser": "npm:*"
     "@types/send": "npm:*"
-  checksum: 10c0/ba8d8d976ab797b2602c60e728802ff0c98a00f13d420d82770f3661b67fa36ea9d3be0b94f2ddd632afe1fbc6e41620008b01db7e4fabdd71a2beb5539b0725
+  checksum: 10c0/671a67a5b367e19aa634dcd515364212490f10efb938fc1097082085a883ccb11c81ec96a3c2b5cc67d5756e5cb1ccbf1de192806f8193bb7de341994beb4ea6
   languageName: node
   linkType: hard
 
-"@types/express@npm:*, @types/express@npm:^4.17.13":
+"@types/express-serve-static-core@npm:^4.17.33":
+  version: 4.19.6
+  resolution: "@types/express-serve-static-core@npm:4.19.6"
+  dependencies:
+    "@types/node": "npm:*"
+    "@types/qs": "npm:*"
+    "@types/range-parser": "npm:*"
+    "@types/send": "npm:*"
+  checksum: 10c0/4281f4ead71723f376b3ddf64868ae26244d434d9906c101cf8d436d4b5c779d01bd046e4ea0ed1a394d3e402216fabfa22b1fa4dba501061cd7c81c54045983
+  languageName: node
+  linkType: hard
+
+"@types/express@npm:*":
+  version: 5.0.0
+  resolution: "@types/express@npm:5.0.0"
+  dependencies:
+    "@types/body-parser": "npm:*"
+    "@types/express-serve-static-core": "npm:^5.0.0"
+    "@types/qs": "npm:*"
+    "@types/serve-static": "npm:*"
+  checksum: 10c0/0d74b53aefa69c3b3817ee9b5145fd50d7dbac52a8986afc2d7500085c446656d0b6dc13158c04e2d9f18f4324d4d93b0452337c5ff73dd086dca3e4ff11f47b
+  languageName: node
+  linkType: hard
+
+"@types/express@npm:^4.17.13":
   version: 4.17.21
   resolution: "@types/express@npm:4.17.21"
   dependencies:
@@ -4946,11 +5077,11 @@ __metadata:
   linkType: hard
 
 "@types/http-proxy@npm:^1.17.8":
-  version: 1.17.14
-  resolution: "@types/http-proxy@npm:1.17.14"
+  version: 1.17.15
+  resolution: "@types/http-proxy@npm:1.17.15"
   dependencies:
     "@types/node": "npm:*"
-  checksum: 10c0/c4bffd87be9aff7e879c05bd2c28716220e0eb39788e3f8d314eee665324ad8f5f0919041cbd710254d553cd9cea023f8b776d4b1ec31d2188eac60af18c3022
+  checksum: 10c0/e2bf2fcdf23c88141b8d2c85ed5e5418b62ef78285884a2b5a717af55f4d9062136aa475489d10292093343df58fb81975f34bebd6b9df322288fd9821cbee07
   languageName: node
   linkType: hard
 
@@ -4999,7 +5130,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9":
+"@types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9":
   version: 7.0.15
   resolution: "@types/json-schema@npm:7.0.15"
   checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db
@@ -5035,9 +5166,9 @@ __metadata:
   linkType: hard
 
 "@types/mocha@npm:^10.0.1":
-  version: 10.0.6
-  resolution: "@types/mocha@npm:10.0.6"
-  checksum: 10c0/4526c9e88388f9e1004c6d3937c5488a39908810f26b927173c58d52b43057f3895627dc06538e96706e08b88158885f869ec6311f6b58fd72bdef715f26d6c3
+  version: 10.0.9
+  resolution: "@types/mocha@npm:10.0.9"
+  checksum: 10c0/76dd782ac7e971ea159d4a7fd40c929afa051e040be3f41187ff03a2d7b3279e19828ddaa498ba1757b3e6b91316263bb7640db0e906938275b97a06e087b989
   languageName: node
   linkType: hard
 
@@ -5058,11 +5189,11 @@ __metadata:
   linkType: hard
 
 "@types/node@npm:*":
-  version: 20.14.7
-  resolution: "@types/node@npm:20.14.7"
+  version: 22.7.5
+  resolution: "@types/node@npm:22.7.5"
   dependencies:
-    undici-types: "npm:~5.26.4"
-  checksum: 10c0/6211ffe86f769a58617e3bdca58610256021ef54bd99d2c442ee6109196cd6ee8e0bcd1cfac0e39bf4bb353f8900fa5fae540485a03816bd91ad1f86a0e18512
+    undici-types: "npm:~6.19.2"
+  checksum: 10c0/cf11f74f1a26053ec58066616e3a8685b6bcd7259bc569738b8f752009f9f0f7f85a1b2d24908e5b0f752482d1e8b6babdf1fbb25758711ec7bb9500bfcd6e60
   languageName: node
   linkType: hard
 
@@ -5111,16 +5242,16 @@ __metadata:
   linkType: hard
 
 "@types/prop-types@npm:*":
-  version: 15.7.12
-  resolution: "@types/prop-types@npm:15.7.12"
-  checksum: 10c0/1babcc7db6a1177779f8fde0ccc78d64d459906e6ef69a4ed4dd6339c920c2e05b074ee5a92120fe4e9d9f1a01c952f843ebd550bee2332fc2ef81d1706878f8
+  version: 15.7.13
+  resolution: "@types/prop-types@npm:15.7.13"
+  checksum: 10c0/1b20fc67281902c6743379960247bc161f3f0406ffc0df8e7058745a85ea1538612109db0406290512947f9632fe9e10e7337bf0ce6338a91d6c948df16a7c61
   languageName: node
   linkType: hard
 
 "@types/qs@npm:*":
-  version: 6.9.15
-  resolution: "@types/qs@npm:6.9.15"
-  checksum: 10c0/49c5ff75ca3adb18a1939310042d273c9fc55920861bd8e5100c8a923b3cda90d759e1a95e18334092da1c8f7b820084687770c83a1ccef04fb2c6908117c823
+  version: 6.9.16
+  resolution: "@types/qs@npm:6.9.16"
+  checksum: 10c0/a4e871b80fff623755e356fd1f225aea45ff7a29da30f99fddee1a05f4f5f33485b314ab5758145144ed45708f97e44595aa9a8368e9bbc083932f931b12dbb6
   languageName: node
   linkType: hard
 
@@ -5180,23 +5311,23 @@ __metadata:
   linkType: hard
 
 "@types/react@npm:*":
-  version: 18.3.3
-  resolution: "@types/react@npm:18.3.3"
+  version: 18.3.11
+  resolution: "@types/react@npm:18.3.11"
   dependencies:
     "@types/prop-types": "npm:*"
     csstype: "npm:^3.0.2"
-  checksum: 10c0/fe455f805c5da13b89964c3d68060cebd43e73ec15001a68b34634604a78140e6fc202f3f61679b9d809dde6d7a7c2cb3ed51e0fd1462557911db09879b55114
+  checksum: 10c0/ce80512246ca5bda69db85b9f4f1835189334acfb6b2c4f3eda8cabff1ff1a3ea9ce4f3b895bdbc18c94140aa45592331aa3fdeb557f525c1b048de7ce84fc0e
   languageName: node
   linkType: hard
 
 "@types/react@npm:^17, @types/react@npm:^17.0.0":
-  version: 17.0.80
-  resolution: "@types/react@npm:17.0.80"
+  version: 17.0.83
+  resolution: "@types/react@npm:17.0.83"
   dependencies:
     "@types/prop-types": "npm:*"
     "@types/scheduler": "npm:^0.16"
     csstype: "npm:^3.0.2"
-  checksum: 10c0/c5d2862564212a41a327ea9c7e70b9d3996d9b0f67971d39519d42d1f3ae6ddf76b183457b7b0be9d7b5d6ff0aaeed5711448423406d20018f082077c984eec4
+  checksum: 10c0/c8f76790190a9df42099f5f78d08dd4095f2da3bd97ff7cce0001d5a97ff3ffb31f703575acf2c457606e0d0b229ca8d1ba0ff459b77a4e44c5ea5154fe3fb4b
   languageName: node
   linkType: hard
 
@@ -5295,11 +5426,11 @@ __metadata:
   linkType: hard
 
 "@types/ws@npm:^8.5.5":
-  version: 8.5.10
-  resolution: "@types/ws@npm:8.5.10"
+  version: 8.5.12
+  resolution: "@types/ws@npm:8.5.12"
   dependencies:
     "@types/node": "npm:*"
-  checksum: 10c0/e9af279b984c4a04ab53295a40aa95c3e9685f04888df5c6920860d1dd073fcc57c7bd33578a04b285b2c655a0b52258d34bee0a20569dca8defb8393e1e5d29
+  checksum: 10c0/3fd77c9e4e05c24ce42bfc7647f7506b08c40a40fe2aea236ef6d4e96fc7cb4006a81ed1b28ec9c457e177a74a72924f4768b7b4652680b42dfd52bc380e15f9
   languageName: node
   linkType: hard
 
@@ -5478,12 +5609,12 @@ __metadata:
   linkType: hard
 
 "@urql/core@npm:>=2.3.1":
-  version: 5.0.4
-  resolution: "@urql/core@npm:5.0.4"
+  version: 5.0.6
+  resolution: "@urql/core@npm:5.0.6"
   dependencies:
     "@0no-co/graphql.web": "npm:^1.0.5"
     wonka: "npm:^6.3.2"
-  checksum: 10c0/3aec9420ef930cfdb0dc4635588bb2727884f9691cb56e074440b225d7dbf7a1c0d60c9fd35b1dac53fe7e7ca9d5d4d3a33fd001734096f9dfacb404df919751
+  checksum: 10c0/126d008e34d5b1bc5118742d92222002c8c2fd357c905e5a3166ab74220854b9de7eb19d416aba2b24d9ff44ed7f90065868f0ac3ce0dc8d2c3369a4c85f0899
   languageName: node
   linkType: hard
 
@@ -5841,11 +5972,11 @@ __metadata:
   linkType: hard
 
 "acorn-walk@npm:^8.1.1":
-  version: 8.3.3
-  resolution: "acorn-walk@npm:8.3.3"
+  version: 8.3.4
+  resolution: "acorn-walk@npm:8.3.4"
   dependencies:
     acorn: "npm:^8.11.0"
-  checksum: 10c0/4a9e24313e6a0a7b389e712ba69b66b455b4cb25988903506a8d247e7b126f02060b05a8a5b738a9284214e4ca95f383dd93443a4ba84f1af9b528305c7f243b
+  checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62
   languageName: node
   linkType: hard
 
@@ -5859,11 +5990,11 @@ __metadata:
   linkType: hard
 
 "acorn@npm:^8.11.0, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0":
-  version: 8.12.0
-  resolution: "acorn@npm:8.12.0"
+  version: 8.12.1
+  resolution: "acorn@npm:8.12.1"
   bin:
     acorn: bin/acorn
-  checksum: 10c0/a19f9dead009d3b430fa3c253710b47778cdaace15b316de6de93a68c355507bc1072a9956372b6c990cbeeb167d4a929249d0faeb8ae4bb6911d68d53299549
+  checksum: 10c0/51fb26cd678f914e13287e886da2d7021f8c2bc0ccc95e03d3e0447ee278dd3b40b9c57dc222acd5881adcf26f3edc40901a4953403232129e3876793cd17386
   languageName: node
   linkType: hard
 
@@ -5956,14 +6087,14 @@ __metadata:
   linkType: hard
 
 "ajv@npm:^8.0.0, ajv@npm:^8.11.0, ajv@npm:^8.9.0":
-  version: 8.16.0
-  resolution: "ajv@npm:8.16.0"
+  version: 8.17.1
+  resolution: "ajv@npm:8.17.1"
   dependencies:
     fast-deep-equal: "npm:^3.1.3"
+    fast-uri: "npm:^3.0.1"
     json-schema-traverse: "npm:^1.0.0"
     require-from-string: "npm:^2.0.2"
-    uri-js: "npm:^4.4.1"
-  checksum: 10c0/6fc38aa8fd4fbfaa7096ac049e48c0cb440db36b76fef2d7d5b7d92b102735670d055d412d19176c08c9d48eaa9d06661b67e59f04943dc71ab1551e0484f88c
+  checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35
   languageName: node
   linkType: hard
 
@@ -5974,14 +6105,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ansi-colors@npm:4.1.1":
-  version: 4.1.1
-  resolution: "ansi-colors@npm:4.1.1"
-  checksum: 10c0/6086ade4336b4250b6b25e144b83e5623bcaf654d3df0c3546ce09c9c5ff999cb6a6f00c87e802d05cf98aef79d92dc76ade2670a2493b8dcb80220bec457838
-  languageName: node
-  linkType: hard
-
-"ansi-colors@npm:^4.1.1":
+"ansi-colors@npm:^4.1.1, ansi-colors@npm:^4.1.3":
   version: 4.1.3
   resolution: "ansi-colors@npm:4.1.3"
   checksum: 10c0/ec87a2f59902f74e61eada7f6e6fe20094a628dab765cfdbd03c3477599368768cffccdb5d3bb19a1b6c99126783a143b1fee31aab729b31ffe5836c7e5e28b9
@@ -6055,9 +6179,9 @@ __metadata:
   linkType: hard
 
 "ansi-regex@npm:^6.0.1":
-  version: 6.0.1
-  resolution: "ansi-regex@npm:6.0.1"
-  checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08
+  version: 6.1.0
+  resolution: "ansi-regex@npm:6.1.0"
+  checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc
   languageName: node
   linkType: hard
 
@@ -6225,7 +6349,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"array-includes@npm:^3.1.4, array-includes@npm:^3.1.6, array-includes@npm:^3.1.7, array-includes@npm:^3.1.8":
+"array-includes@npm:^3.1.4, array-includes@npm:^3.1.6, array-includes@npm:^3.1.8":
   version: 3.1.8
   resolution: "array-includes@npm:3.1.8"
   dependencies:
@@ -6267,7 +6391,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"array.prototype.findlastindex@npm:^1.2.3":
+"array.prototype.findlastindex@npm:^1.2.5":
   version: 1.2.5
   resolution: "array.prototype.findlastindex@npm:1.2.5"
   dependencies:
@@ -6305,18 +6429,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"array.prototype.toreversed@npm:^1.1.2":
-  version: 1.1.2
-  resolution: "array.prototype.toreversed@npm:1.1.2"
-  dependencies:
-    call-bind: "npm:^1.0.2"
-    define-properties: "npm:^1.2.0"
-    es-abstract: "npm:^1.22.1"
-    es-shim-unscopables: "npm:^1.0.0"
-  checksum: 10c0/2b7627ea85eae1e80ecce665a500cc0f3355ac83ee4a1a727562c7c2a1d5f1c0b4dd7b65c468ec6867207e452ba01256910a2c0b41486bfdd11acf875a7a3435
-  languageName: node
-  linkType: hard
-
 "array.prototype.tosorted@npm:^1.1.4":
   version: 1.1.4
   resolution: "array.prototype.tosorted@npm:1.1.4"
@@ -6450,9 +6562,9 @@ __metadata:
   linkType: hard
 
 "async@npm:^3.2.2, async@npm:^3.2.3":
-  version: 3.2.5
-  resolution: "async@npm:3.2.5"
-  checksum: 10c0/1408287b26c6db67d45cb346e34892cee555b8b59e6c68e6f8c3e495cad5ca13b4f218180e871f3c2ca30df4ab52693b66f2f6ff43644760cab0b2198bda79c1
+  version: 3.2.6
+  resolution: "async@npm:3.2.6"
+  checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70
   languageName: node
   linkType: hard
 
@@ -6480,20 +6592,20 @@ __metadata:
   linkType: hard
 
 "autoprefixer@npm:^10.2.5":
-  version: 10.4.19
-  resolution: "autoprefixer@npm:10.4.19"
+  version: 10.4.20
+  resolution: "autoprefixer@npm:10.4.20"
   dependencies:
-    browserslist: "npm:^4.23.0"
-    caniuse-lite: "npm:^1.0.30001599"
+    browserslist: "npm:^4.23.3"
+    caniuse-lite: "npm:^1.0.30001646"
     fraction.js: "npm:^4.3.7"
     normalize-range: "npm:^0.1.2"
-    picocolors: "npm:^1.0.0"
+    picocolors: "npm:^1.0.1"
     postcss-value-parser: "npm:^4.2.0"
   peerDependencies:
     postcss: ^8.1.0
   bin:
     autoprefixer: bin/autoprefixer
-  checksum: 10c0/fe0178eb8b1da4f15c6535cd329926609b22d1811e047371dccce50563623f8075dd06fb167daff059e4228da651b0bdff6d9b44281541eaf0ce0b79125bfd19
+  checksum: 10c0/e1f00978a26e7c5b54ab12036d8c13833fad7222828fc90914771b1263f51b28c7ddb5803049de4e77696cbd02bb25cfc3634e80533025bb26c26aacdf938940
   languageName: node
   linkType: hard
 
@@ -6506,10 +6618,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"axe-core@npm:^4.9.1":
-  version: 4.9.1
-  resolution: "axe-core@npm:4.9.1"
-  checksum: 10c0/ac9e5a0c6fa115a43ebffc32a1d2189e1ca6431b5a78e88cdcf94a72a25c5964185682edd94fe6bdb1cb4266c0d06301b022866e0e50dcdf6e3cefe556470110
+"axe-core@npm:^4.10.0":
+  version: 4.10.0
+  resolution: "axe-core@npm:4.10.0"
+  checksum: 10c0/732c171d48caaace5e784895c4dacb8ca6155e9d98045138ebe3952f78457dd05b92c57d05b41ce2a570aff87dbd0471e8398d2c0f6ebe79617b746c8f658998
   languageName: node
   linkType: hard
 
@@ -6523,12 +6635,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"axobject-query@npm:~3.1.1":
-  version: 3.1.1
-  resolution: "axobject-query@npm:3.1.1"
-  dependencies:
-    deep-equal: "npm:^2.0.5"
-  checksum: 10c0/fff3175a22fd1f41fceb7ae0cd25f6594a0d7fba28c2335dd904538b80eb4e1040432564a3c643025cd2bb748f68d35aaabffb780b794da97ecfc748810b25ad
+"axobject-query@npm:^4.1.0":
+  version: 4.1.0
+  resolution: "axobject-query@npm:4.1.0"
+  checksum: 10c0/c470e4f95008f232eadd755b018cb55f16c03ccf39c027b941cd8820ac6b68707ce5d7368a46756db4256fbc91bb4ead368f84f7fb034b2b7932f082f6dc0775
   languageName: node
   linkType: hard
 
@@ -6560,17 +6670,17 @@ __metadata:
   linkType: hard
 
 "babel-loader@npm:^8.2.2":
-  version: 8.3.0
-  resolution: "babel-loader@npm:8.3.0"
+  version: 8.4.1
+  resolution: "babel-loader@npm:8.4.1"
   dependencies:
     find-cache-dir: "npm:^3.3.1"
-    loader-utils: "npm:^2.0.0"
+    loader-utils: "npm:^2.0.4"
     make-dir: "npm:^3.1.0"
     schema-utils: "npm:^2.6.5"
   peerDependencies:
     "@babel/core": ^7.0.0
     webpack: ">=2"
-  checksum: 10c0/7b83bae35a12fbc5cdf250e2d36a288305fe5b6d20ab044ab7c09bbf456c8895b80af7a4f1e8b64b5c07a4fd48d4b5144dab40b4bc72a4fed532dc000362f38f
+  checksum: 10c0/efdca9c3ef502af58b923a32123d660c54fd0be125b7b64562c8a43bda0a3a55dac0db32331674104e7e5184061b75c3a0e395b2c5ccdc7cb2125dd9ec7108d2
   languageName: node
   linkType: hard
 
@@ -6649,15 +6759,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"babel-plugin-polyfill-corejs3@npm:^0.10.1, babel-plugin-polyfill-corejs3@npm:^0.10.4":
-  version: 0.10.4
-  resolution: "babel-plugin-polyfill-corejs3@npm:0.10.4"
+"babel-plugin-polyfill-corejs3@npm:^0.10.6":
+  version: 0.10.6
+  resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6"
   dependencies:
-    "@babel/helper-define-polyfill-provider": "npm:^0.6.1"
-    core-js-compat: "npm:^3.36.1"
+    "@babel/helper-define-polyfill-provider": "npm:^0.6.2"
+    core-js-compat: "npm:^3.38.0"
   peerDependencies:
     "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0
-  checksum: 10c0/31b92cd3dfb5b417da8dfcf0deaa4b8b032b476d7bb31ca51c66127cf25d41e89260e89d17bc004b2520faa38aa9515fafabf81d89f9d4976e9dc1163e4a7c41
+  checksum: 10c0/3a69220471b07722c2ae6537310bf26b772514e12b601398082965459c838be70a0ca70b0662f0737070654ff6207673391221d48599abb4a2b27765206d9f79
   languageName: node
   linkType: hard
 
@@ -6731,24 +6841,27 @@ __metadata:
   linkType: hard
 
 "babel-preset-current-node-syntax@npm:^1.0.0":
-  version: 1.0.1
-  resolution: "babel-preset-current-node-syntax@npm:1.0.1"
+  version: 1.1.0
+  resolution: "babel-preset-current-node-syntax@npm:1.1.0"
   dependencies:
     "@babel/plugin-syntax-async-generators": "npm:^7.8.4"
     "@babel/plugin-syntax-bigint": "npm:^7.8.3"
-    "@babel/plugin-syntax-class-properties": "npm:^7.8.3"
-    "@babel/plugin-syntax-import-meta": "npm:^7.8.3"
+    "@babel/plugin-syntax-class-properties": "npm:^7.12.13"
+    "@babel/plugin-syntax-class-static-block": "npm:^7.14.5"
+    "@babel/plugin-syntax-import-attributes": "npm:^7.24.7"
+    "@babel/plugin-syntax-import-meta": "npm:^7.10.4"
     "@babel/plugin-syntax-json-strings": "npm:^7.8.3"
-    "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.8.3"
+    "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4"
     "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3"
-    "@babel/plugin-syntax-numeric-separator": "npm:^7.8.3"
+    "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4"
     "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3"
     "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3"
     "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3"
-    "@babel/plugin-syntax-top-level-await": "npm:^7.8.3"
+    "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5"
+    "@babel/plugin-syntax-top-level-await": "npm:^7.14.5"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/5ba39a3a0e6c37d25e56a4fb843be632dac98d54706d8a0933f9bcb1a07987a96d55c2b5a6c11788a74063fb2534fe68c1f1dbb6c93626850c785e0938495627
+  checksum: 10c0/0b838d4412e3322cb4436f246e24e9c00bebcedfd8f00a2f51489db683bd35406bbd55a700759c28d26959c6e03f84dd6a1426f576f440267c1d7a73c5717281
   languageName: node
   linkType: hard
 
@@ -6929,7 +7042,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"bn.js@npm:^5.0.0, bn.js@npm:^5.2.1":
+"bn.js@npm:^5.2.1":
   version: 5.2.1
   resolution: "bn.js@npm:5.2.1"
   checksum: 10c0/bed3d8bd34ec89dbcf9f20f88bd7d4a49c160fda3b561c7bb227501f974d3e435a48fb9b61bc3de304acab9215a3bda0803f7017ffb4d0016a0c3a740a283caa
@@ -6954,9 +7067,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"body-parser@npm:1.20.2":
-  version: 1.20.2
-  resolution: "body-parser@npm:1.20.2"
+"body-parser@npm:1.20.3":
+  version: 1.20.3
+  resolution: "body-parser@npm:1.20.3"
   dependencies:
     bytes: "npm:3.1.2"
     content-type: "npm:~1.0.5"
@@ -6966,11 +7079,11 @@ __metadata:
     http-errors: "npm:2.0.0"
     iconv-lite: "npm:0.4.24"
     on-finished: "npm:2.4.1"
-    qs: "npm:6.11.0"
+    qs: "npm:6.13.0"
     raw-body: "npm:2.5.2"
     type-is: "npm:~1.6.18"
     unpipe: "npm:1.0.0"
-  checksum: 10c0/06f1438fff388a2e2354c96aa3ea8147b79bfcb1262dfcc2aae68ec13723d01d5781680657b74e9f83c808266d5baf52804032fbde2b7382b89bd8cdb273ace9
+  checksum: 10c0/0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310
   languageName: node
   linkType: hard
 
@@ -7078,7 +7191,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"browser-stdout@npm:1.3.1":
+"browser-stdout@npm:^1.3.1":
   version: 1.3.1
   resolution: "browser-stdout@npm:1.3.1"
   checksum: 10c0/c40e482fd82be872b6ea7b9f7591beafbf6f5ba522fe3dade98ba1573a1c29a11101564993e4eb44e5488be8f44510af072df9a9637c739217eb155ceb639205
@@ -7123,12 +7236,13 @@ __metadata:
   linkType: hard
 
 "browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.1.0":
-  version: 4.1.0
-  resolution: "browserify-rsa@npm:4.1.0"
+  version: 4.1.1
+  resolution: "browserify-rsa@npm:4.1.1"
   dependencies:
-    bn.js: "npm:^5.0.0"
-    randombytes: "npm:^2.0.1"
-  checksum: 10c0/fb2b5a8279d8a567a28d8ee03fb62e448428a906bab5c3dc9e9c3253ace551b5ea271db15e566ac78f1b1d71b243559031446604168b9235c351a32cae99d02a
+    bn.js: "npm:^5.2.1"
+    randombytes: "npm:^2.1.0"
+    safe-buffer: "npm:^5.2.1"
+  checksum: 10c0/b650ee1192e3d7f3d779edc06dd96ed8720362e72ac310c367b9d7fe35f7e8dbb983c1829142b2b3215458be8bf17c38adc7224920843024ed8cf39e19c513c0
   languageName: node
   linkType: hard
 
@@ -7159,17 +7273,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"browserslist@npm:^4.0.0, browserslist@npm:^4.16.6, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0":
-  version: 4.23.1
-  resolution: "browserslist@npm:4.23.1"
+"browserslist@npm:^4.0.0, browserslist@npm:^4.16.6, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0":
+  version: 4.24.0
+  resolution: "browserslist@npm:4.24.0"
   dependencies:
-    caniuse-lite: "npm:^1.0.30001629"
-    electron-to-chromium: "npm:^1.4.796"
-    node-releases: "npm:^2.0.14"
-    update-browserslist-db: "npm:^1.0.16"
+    caniuse-lite: "npm:^1.0.30001663"
+    electron-to-chromium: "npm:^1.5.28"
+    node-releases: "npm:^2.0.18"
+    update-browserslist-db: "npm:^1.1.0"
   bin:
     browserslist: cli.js
-  checksum: 10c0/eb47c7ab9d60db25ce2faca70efeb278faa7282a2f62b7f2fa2f92e5f5251cf65144244566c86559419ff4f6d78f59ea50e39911321ad91f3b27788901f1f5e9
+  checksum: 10c0/95e76ad522753c4c470427f6e3c8a4bb5478ff448841e22b3d3e53f89ecaf17b6984666d6c7e715c370f1e7fa0cf684f42e34e554236a8b2fab38ea76b9e4c52
   languageName: node
   linkType: hard
 
@@ -7318,8 +7432,8 @@ __metadata:
   linkType: hard
 
 "cacache@npm:^18.0.0":
-  version: 18.0.3
-  resolution: "cacache@npm:18.0.3"
+  version: 18.0.4
+  resolution: "cacache@npm:18.0.4"
   dependencies:
     "@npmcli/fs": "npm:^3.1.0"
     fs-minipass: "npm:^3.0.0"
@@ -7333,7 +7447,7 @@ __metadata:
     ssri: "npm:^10.0.0"
     tar: "npm:^6.1.11"
     unique-filename: "npm:^3.0.0"
-  checksum: 10c0/dfda92840bb371fb66b88c087c61a74544363b37a265023223a99965b16a16bbb87661fe4948718d79df6e0cc04e85e62784fbcf1832b2a5e54ff4c46fbb45b7
+  checksum: 10c0/6c055bafed9de4f3dcc64ac3dc7dd24e863210902b7c470eb9ce55a806309b3efff78033e3d8b4f7dcc5d467f2db43c6a2857aaaf26f0094b8a351d44c42179f
   languageName: node
   linkType: hard
 
@@ -7457,10 +7571,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001251, caniuse-lite@npm:^1.0.30001599, caniuse-lite@npm:^1.0.30001629":
-  version: 1.0.30001636
-  resolution: "caniuse-lite@npm:1.0.30001636"
-  checksum: 10c0/e5f965b4da7bae1531fd9f93477d015729ff9e3fa12670ead39a9e6cdc4c43e62c272d47857c5cc332e7b02d697cb3f2f965a1030870ac7476da60c2fc81ee94
+"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001251, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001663":
+  version: 1.0.30001667
+  resolution: "caniuse-lite@npm:1.0.30001667"
+  checksum: 10c0/6bc8555a47603e1e76eaef9b185d6fdeeca7d9c20a283f7c32c971eb1b52ea3a80e6ec086920f088f06abe619240f1023a2d3a08b5b1f2f11df1475695e9f71c
   languageName: node
   linkType: hard
 
@@ -7476,8 +7590,8 @@ __metadata:
   linkType: hard
 
 "chai@npm:^4.3.7":
-  version: 4.4.1
-  resolution: "chai@npm:4.4.1"
+  version: 4.5.0
+  resolution: "chai@npm:4.5.0"
   dependencies:
     assertion-error: "npm:^1.1.0"
     check-error: "npm:^1.0.3"
@@ -7485,8 +7599,8 @@ __metadata:
     get-func-name: "npm:^2.0.2"
     loupe: "npm:^2.3.6"
     pathval: "npm:^1.1.1"
-    type-detect: "npm:^4.0.8"
-  checksum: 10c0/91590a8fe18bd6235dece04ccb2d5b4ecec49984b50924499bdcd7a95c02cb1fd2a689407c19bb854497bde534ef57525cfad6c7fdd2507100fd802fbc2aefbd
+    type-detect: "npm:^4.1.0"
+  checksum: 10c0/b8cb596bd1aece1aec659e41a6e479290c7d9bee5b3ad63d2898ad230064e5b47889a3bc367b20100a0853b62e026e2dc514acf25a3c9385f936aa3614d4ab4d
   languageName: node
   linkType: hard
 
@@ -7558,9 +7672,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"chokidar@npm:3.5.3":
-  version: 3.5.3
-  resolution: "chokidar@npm:3.5.3"
+"chokidar@npm:^3.4.2, chokidar@npm:^3.5.1, chokidar@npm:^3.5.3":
+  version: 3.6.0
+  resolution: "chokidar@npm:3.6.0"
   dependencies:
     anymatch: "npm:~3.1.2"
     braces: "npm:~3.0.2"
@@ -7573,26 +7687,16 @@ __metadata:
   dependenciesMeta:
     fsevents:
       optional: true
-  checksum: 10c0/1076953093e0707c882a92c66c0f56ba6187831aa51bb4de878c1fec59ae611a3bf02898f190efec8e77a086b8df61c2b2a3ea324642a0558bdf8ee6c5dc9ca1
+  checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462
   languageName: node
   linkType: hard
 
-"chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.4.2, chokidar@npm:^3.5.1, chokidar@npm:^3.5.3":
-  version: 3.6.0
-  resolution: "chokidar@npm:3.6.0"
+"chokidar@npm:^4.0.0":
+  version: 4.0.1
+  resolution: "chokidar@npm:4.0.1"
   dependencies:
-    anymatch: "npm:~3.1.2"
-    braces: "npm:~3.0.2"
-    fsevents: "npm:~2.3.2"
-    glob-parent: "npm:~5.1.2"
-    is-binary-path: "npm:~2.1.0"
-    is-glob: "npm:~4.0.1"
-    normalize-path: "npm:~3.0.0"
-    readdirp: "npm:~3.6.0"
-  dependenciesMeta:
-    fsevents:
-      optional: true
-  checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462
+    readdirp: "npm:^4.0.1"
+  checksum: 10c0/4bb7a3adc304059810bb6c420c43261a15bb44f610d77c35547addc84faa0374265c3adc67f25d06f363d9a4571962b02679268c40de07676d260de1986efea9
   languageName: node
   linkType: hard
 
@@ -7635,9 +7739,9 @@ __metadata:
   linkType: hard
 
 "cjs-module-lexer@npm:^1.0.0":
-  version: 1.3.1
-  resolution: "cjs-module-lexer@npm:1.3.1"
-  checksum: 10c0/cd98fbf3c7f4272fb0ebf71d08d0c54bc75ce0e30b9d186114e15b4ba791f3d310af65a339eea2a0318599af2818cdd8886d353b43dfab94468f72987397ad16
+  version: 1.4.1
+  resolution: "cjs-module-lexer@npm:1.4.1"
+  checksum: 10c0/5a7d8279629c9ba8ccf38078c2fed75b7737973ced22b9b5a54180efa57fb2fe2bb7bec6aec55e3b8f3f5044f5d7b240347ad9bd285e7c3d0ee5b0a1d0504dfc
   languageName: node
   linkType: hard
 
@@ -7897,8 +8001,8 @@ __metadata:
   linkType: hard
 
 "commitizen@npm:^4.0.3, commitizen@npm:^4.2.5":
-  version: 4.3.0
-  resolution: "commitizen@npm:4.3.0"
+  version: 4.3.1
+  resolution: "commitizen@npm:4.3.1"
   dependencies:
     cachedir: "npm:2.3.0"
     cz-conventional-changelog: "npm:3.3.0"
@@ -7918,7 +8022,7 @@ __metadata:
     commitizen: bin/commitizen
     cz: bin/git-cz
     git-cz: bin/git-cz
-  checksum: 10c0/889d2d28e3029e397a77ee05f123eab92148fa2880f904f973307a5156cb991e7361ff1e32ccf9608895672dced84a3038a9cafa7e687fbcaf4b2df1e4ae3142
+  checksum: 10c0/3422c6f8b24075a650582f3939def379954714d3fc613dd60a927923f52b93742a196346f0669b63adf367e40127c0e481573ab1aa6cb8b96a06dfc903e923ab
   languageName: node
   linkType: hard
 
@@ -8352,26 +8456,26 @@ __metadata:
   languageName: node
   linkType: hard
 
-"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.36.1":
-  version: 3.37.1
-  resolution: "core-js-compat@npm:3.37.1"
+"core-js-compat@npm:^3.38.0, core-js-compat@npm:^3.38.1":
+  version: 3.38.1
+  resolution: "core-js-compat@npm:3.38.1"
   dependencies:
-    browserslist: "npm:^4.23.0"
-  checksum: 10c0/4e2da9c900f2951a57947af7aeef4d16f2c75d7f7e966c0d0b62953f65225003ade5e84d3ae98847f65b24c109c606821d9dc925db8ca418fb761e7c81963c2a
+    browserslist: "npm:^4.23.3"
+  checksum: 10c0/d8bc8a35591fc5fbf3e376d793f298ec41eb452619c7ef9de4ea59b74be06e9fda799e0dcbf9ba59880dae87e3b41fb191d744ffc988315642a1272bb9442b31
   languageName: node
   linkType: hard
 
 "core-js-pure@npm:^3.23.3":
-  version: 3.37.1
-  resolution: "core-js-pure@npm:3.37.1"
-  checksum: 10c0/38200d08862b4ef2207af72a7525f7b9ac750f5e1d84ef27a3e314aefa69518179a9b732f51ebe35c3b38606d9fa4f686fcf6eff067615cc293a3b1c84041e74
+  version: 3.38.1
+  resolution: "core-js-pure@npm:3.38.1"
+  checksum: 10c0/466adbc0468b8c2a95b9bc49829492dece2cc6584d757c5b38555a26ed3d71f8364ac1ea3128a0a949e004e0e60206cc535ed84320982c3efb9a40c1785ddcc6
   languageName: node
   linkType: hard
 
 "core-js@npm:^3.0.1, core-js@npm:^3.6.5":
-  version: 3.37.1
-  resolution: "core-js@npm:3.37.1"
-  checksum: 10c0/440eb51a7a39128a320225fe349f870a3641b96c9ecd26470227db730ef8c161ea298eaea621db66ec0ff622a85299efb4e23afebf889c0a1748616102307675
+  version: 3.38.1
+  resolution: "core-js@npm:3.38.1"
+  checksum: 10c0/7df063b6f13a54e46515817ac3e235c6c598a4d3de65cd188a061fc250642be313b895fb9fb2f36e1e31890a1bb4ef61d82666a340413f540b7ce3c65689739b
   languageName: node
   linkType: hard
 
@@ -8929,9 +9033,9 @@ __metadata:
   linkType: hard
 
 "dayjs@npm:^1.8.15":
-  version: 1.11.11
-  resolution: "dayjs@npm:1.11.11"
-  checksum: 10c0/0131d10516b9945f05a57e13f4af49a6814de5573a494824e103131a3bbe4cc470b1aefe8e17e51f9a478a22cd116084be1ee5725cedb66ec4c3f9091202dc4b
+  version: 1.11.13
+  resolution: "dayjs@npm:1.11.13"
+  checksum: 10c0/a3caf6ac8363c7dade9d1ee797848ddcf25c1ace68d9fe8678ecf8ba0675825430de5d793672ec87b24a69bf04a1544b176547b2539982275d5542a7955f35b7
   languageName: node
   linkType: hard
 
@@ -8944,27 +9048,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:~4.3.1, debug@npm:~4.3.2":
-  version: 4.3.5
-  resolution: "debug@npm:4.3.5"
-  dependencies:
-    ms: "npm:2.1.2"
-  peerDependenciesMeta:
-    supports-color:
-      optional: true
-  checksum: 10c0/082c375a2bdc4f4469c99f325ff458adad62a3fc2c482d59923c260cb08152f34e2659f72b3767db8bb2f21ca81a60a42d1019605a412132d7b9f59363a005cc
-  languageName: node
-  linkType: hard
-
-"debug@npm:4.3.4":
-  version: 4.3.4
-  resolution: "debug@npm:4.3.4"
+"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:~4.3.1, debug@npm:~4.3.2":
+  version: 4.3.7
+  resolution: "debug@npm:4.3.7"
   dependencies:
-    ms: "npm:2.1.2"
+    ms: "npm:^2.1.3"
   peerDependenciesMeta:
     supports-color:
       optional: true
-  checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736
+  checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b
   languageName: node
   linkType: hard
 
@@ -9300,13 +9392,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"diff@npm:5.0.0":
-  version: 5.0.0
-  resolution: "diff@npm:5.0.0"
-  checksum: 10c0/08c5904779bbababcd31f1707657b1ad57f8a9b65e6f88d3fb501d09a965d5f8d73066898a7d3f35981f9e4101892c61d99175d421f3b759533213c253d91134
-  languageName: node
-  linkType: hard
-
 "diff@npm:^3.1.0":
   version: 3.5.0
   resolution: "diff@npm:3.5.0"
@@ -9321,6 +9406,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"diff@npm:^5.2.0":
+  version: 5.2.0
+  resolution: "diff@npm:5.2.0"
+  checksum: 10c0/aed0941f206fe261ecb258dc8d0ceea8abbde3ace5827518ff8d302f0fc9cc81ce116c4d8f379151171336caf0516b79e01abdc1ed1201b6440d895a66689eb4
+  languageName: node
+  linkType: hard
+
 "diffie-hellman@npm:^5.0.0":
   version: 5.0.3
   resolution: "diffie-hellman@npm:5.0.3"
@@ -9470,10 +9562,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"electron-to-chromium@npm:^1.4.796":
-  version: 1.4.808
-  resolution: "electron-to-chromium@npm:1.4.808"
-  checksum: 10c0/2db2379358426d36b288aceeb3011b880c0be5f89426849e4aa6a914c13c3a27172312f6f12531515d82f4e22bc652a5800453a3c00d18d200339fa0fdf9e824
+"electron-to-chromium@npm:^1.5.28":
+  version: 1.5.33
+  resolution: "electron-to-chromium@npm:1.5.33"
+  checksum: 10c0/46b914e85ce9ff5d57b78782f750ca6585c5aa713c0e6f70225bc6cf0f7637ce40567ccfd0d9a95d84120164fef01c8ff42c7cd206afdb1bace481e187a3919f
   languageName: node
   linkType: hard
 
@@ -9493,8 +9585,8 @@ __metadata:
   linkType: hard
 
 "elliptic@npm:^6.5.3, elliptic@npm:^6.5.5":
-  version: 6.5.5
-  resolution: "elliptic@npm:6.5.5"
+  version: 6.5.7
+  resolution: "elliptic@npm:6.5.7"
   dependencies:
     bn.js: "npm:^4.11.9"
     brorand: "npm:^1.1.0"
@@ -9503,7 +9595,7 @@ __metadata:
     inherits: "npm:^2.0.4"
     minimalistic-assert: "npm:^1.0.1"
     minimalistic-crypto-utils: "npm:^1.0.1"
-  checksum: 10c0/3e591e93783a1b66f234ebf5bd3a8a9a8e063a75073a35a671e03e3b25253b6e33ac121f7efe9b8808890fffb17b40596cc19d01e6e8d1fa13b9a56ff65597c8
+  checksum: 10c0/799959b6c54ea3564e8961f35abdf8c77e37617f3051614b05ab1fb6a04ddb65bd1caa75ed1bae375b15dda312a0f79fed26ebe76ecf05c5a7af244152a601b8
   languageName: node
   linkType: hard
 
@@ -9556,6 +9648,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"encodeurl@npm:~2.0.0":
+  version: 2.0.0
+  resolution: "encodeurl@npm:2.0.0"
+  checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb
+  languageName: node
+  linkType: hard
+
 "encoding@npm:^0.1.13":
   version: 0.1.13
   resolution: "encoding@npm:0.1.13"
@@ -9574,33 +9673,33 @@ __metadata:
   languageName: node
   linkType: hard
 
-"engine.io-client@npm:~6.5.2":
-  version: 6.5.4
-  resolution: "engine.io-client@npm:6.5.4"
+"engine.io-client@npm:~6.6.1":
+  version: 6.6.1
+  resolution: "engine.io-client@npm:6.6.1"
   dependencies:
     "@socket.io/component-emitter": "npm:~3.1.0"
     debug: "npm:~4.3.1"
     engine.io-parser: "npm:~5.2.1"
     ws: "npm:~8.17.1"
-    xmlhttprequest-ssl: "npm:~2.0.0"
-  checksum: 10c0/ef220f9875d6a43bade906bd9b61118e812474bbe46e80f38c92dca238484170daf92d51e58bbade6433c29ffb5ba329f4864c5609f2e33c5e31041b1f8ad672
+    xmlhttprequest-ssl: "npm:~2.1.1"
+  checksum: 10c0/f0ba384a86c2965b8016907a970e2b71b792e951cb97013b237a6f13ecedc7444b0262c7886e62f6807ad761418f3e1ed2442179722e67e5f1d7f55ff6590514
   languageName: node
   linkType: hard
 
 "engine.io-parser@npm:~5.2.1":
-  version: 5.2.2
-  resolution: "engine.io-parser@npm:5.2.2"
-  checksum: 10c0/38e71a92ed75e2873d4d9cfab7f889e4a3cfc939b689abd1045e1b2ef9f1a50d0350a2bef69f33d313c1aa626232702da5a9043a1038d76f5ecc0be440c648ab
+  version: 5.2.3
+  resolution: "engine.io-parser@npm:5.2.3"
+  checksum: 10c0/ed4900d8dbef470ab3839ccf3bfa79ee518ea8277c7f1f2759e8c22a48f64e687ea5e474291394d0c94f84054749fd93f3ef0acb51fa2f5f234cc9d9d8e7c536
   languageName: node
   linkType: hard
 
-"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.17.0, enhanced-resolve@npm:^5.7.0, enhanced-resolve@npm:^5.8.3":
-  version: 5.17.0
-  resolution: "enhanced-resolve@npm:5.17.0"
+"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.17.1, enhanced-resolve@npm:^5.7.0, enhanced-resolve@npm:^5.8.3":
+  version: 5.17.1
+  resolution: "enhanced-resolve@npm:5.17.1"
   dependencies:
     graceful-fs: "npm:^4.2.4"
     tapable: "npm:^2.2.0"
-  checksum: 10c0/90065e58e4fd08e77ba47f827eaa17d60c335e01e4859f6e644bb3b8d0e32b203d33894aee92adfa5121fa262f912b48bdf0d0475e98b4a0a1132eea1169ad37
+  checksum: 10c0/81a0515675eca17efdba2cf5bad87abc91a528fc1191aad50e275e74f045b41506167d420099022da7181c8d787170ea41e4a11a0b10b7a16f6237daecb15370
   languageName: node
   linkType: hard
 
@@ -9649,11 +9748,11 @@ __metadata:
   linkType: hard
 
 "envinfo@npm:^7.7.2":
-  version: 7.13.0
-  resolution: "envinfo@npm:7.13.0"
+  version: 7.14.0
+  resolution: "envinfo@npm:7.14.0"
   bin:
     envinfo: dist/cli.js
-  checksum: 10c0/9c279213cbbb353b3171e8e333fd2ed564054abade08ab3d735fe136e10a0e14e0588e1ce77e6f01285f2462eaca945d64f0778be5ae3d9e82804943e36a4411
+  checksum: 10c0/059a031eee101e056bd9cc5cbfe25c2fab433fe1780e86cf0a82d24a000c6931e327da6a8ffb3dce528a24f83f256e7efc0b36813113eff8fdc6839018efe327
   languageName: node
   linkType: hard
 
@@ -9820,9 +9919,9 @@ __metadata:
   linkType: hard
 
 "es-module-lexer@npm:^1.2.1":
-  version: 1.5.3
-  resolution: "es-module-lexer@npm:1.5.3"
-  checksum: 10c0/0f50b655490d1048432eac6eec94d99d3933119666ae82be578c3db1ea4b2c594118a336f6b7a3c4e2815355dcc9a469d880acef1c45aa656a5aae8c8ae8e5f6
+  version: 1.5.4
+  resolution: "es-module-lexer@npm:1.5.4"
+  checksum: 10c0/300a469488c2f22081df1e4c8398c78db92358496e639b0df7f89ac6455462aaf5d8893939087c1a1cbcbf20eed4610c70e0bcb8f3e4b0d80a5d2611c539408c
   languageName: node
   linkType: hard
 
@@ -9866,10 +9965,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"escalade@npm:^3.1.1, escalade@npm:^3.1.2":
-  version: 3.1.2
-  resolution: "escalade@npm:3.1.2"
-  checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287
+"escalade@npm:^3.1.1, escalade@npm:^3.2.0":
+  version: 3.2.0
+  resolution: "escalade@npm:3.2.0"
+  checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65
   languageName: node
   linkType: hard
 
@@ -9880,13 +9979,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"escape-string-regexp@npm:4.0.0, escape-string-regexp@npm:^4.0.0":
-  version: 4.0.0
-  resolution: "escape-string-regexp@npm:4.0.0"
-  checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9
-  languageName: node
-  linkType: hard
-
 "escape-string-regexp@npm:^1.0.5":
   version: 1.0.5
   resolution: "escape-string-regexp@npm:1.0.5"
@@ -9901,6 +9993,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"escape-string-regexp@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "escape-string-regexp@npm:4.0.0"
+  checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9
+  languageName: node
+  linkType: hard
+
 "escodegen@npm:^2.0.0":
   version: 2.1.0
   resolution: "escodegen@npm:2.1.0"
@@ -9941,55 +10040,57 @@ __metadata:
   languageName: node
   linkType: hard
 
-"eslint-module-utils@npm:^2.8.0":
-  version: 2.8.1
-  resolution: "eslint-module-utils@npm:2.8.1"
+"eslint-module-utils@npm:^2.12.0":
+  version: 2.12.0
+  resolution: "eslint-module-utils@npm:2.12.0"
   dependencies:
     debug: "npm:^3.2.7"
   peerDependenciesMeta:
     eslint:
       optional: true
-  checksum: 10c0/1aeeb97bf4b688d28de136ee57c824480c37691b40fa825c711a4caf85954e94b99c06ac639d7f1f6c1d69223bd21bcb991155b3e589488e958d5b83dfd0f882
+  checksum: 10c0/4d8b46dcd525d71276f9be9ffac1d2be61c9d54cc53c992e6333cf957840dee09381842b1acbbb15fc6b255ebab99cd481c5007ab438e5455a14abe1a0468558
   languageName: node
   linkType: hard
 
 "eslint-plugin-import@npm:^2.25.2, eslint-plugin-import@npm:^2.26.0":
-  version: 2.29.1
-  resolution: "eslint-plugin-import@npm:2.29.1"
+  version: 2.31.0
+  resolution: "eslint-plugin-import@npm:2.31.0"
   dependencies:
-    array-includes: "npm:^3.1.7"
-    array.prototype.findlastindex: "npm:^1.2.3"
+    "@rtsao/scc": "npm:^1.1.0"
+    array-includes: "npm:^3.1.8"
+    array.prototype.findlastindex: "npm:^1.2.5"
     array.prototype.flat: "npm:^1.3.2"
     array.prototype.flatmap: "npm:^1.3.2"
     debug: "npm:^3.2.7"
     doctrine: "npm:^2.1.0"
     eslint-import-resolver-node: "npm:^0.3.9"
-    eslint-module-utils: "npm:^2.8.0"
-    hasown: "npm:^2.0.0"
-    is-core-module: "npm:^2.13.1"
+    eslint-module-utils: "npm:^2.12.0"
+    hasown: "npm:^2.0.2"
+    is-core-module: "npm:^2.15.1"
     is-glob: "npm:^4.0.3"
     minimatch: "npm:^3.1.2"
-    object.fromentries: "npm:^2.0.7"
-    object.groupby: "npm:^1.0.1"
-    object.values: "npm:^1.1.7"
+    object.fromentries: "npm:^2.0.8"
+    object.groupby: "npm:^1.0.3"
+    object.values: "npm:^1.2.0"
     semver: "npm:^6.3.1"
+    string.prototype.trimend: "npm:^1.0.8"
     tsconfig-paths: "npm:^3.15.0"
   peerDependencies:
-    eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
-  checksum: 10c0/5f35dfbf4e8e67f741f396987de9504ad125c49f4144508a93282b4ea0127e052bde65ab6def1f31b6ace6d5d430be698333f75bdd7dca3bc14226c92a083196
+    eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+  checksum: 10c0/e21d116ddd1900e091ad120b3eb68c5dd5437fe2c930f1211781cd38b246f090a6b74d5f3800b8255a0ed29782591521ad44eb21c5534960a8f1fb4040fd913a
   languageName: node
   linkType: hard
 
 "eslint-plugin-jsx-a11y@npm:^6.5.1":
-  version: 6.9.0
-  resolution: "eslint-plugin-jsx-a11y@npm:6.9.0"
+  version: 6.10.0
+  resolution: "eslint-plugin-jsx-a11y@npm:6.10.0"
   dependencies:
     aria-query: "npm:~5.1.3"
     array-includes: "npm:^3.1.8"
     array.prototype.flatmap: "npm:^1.3.2"
     ast-types-flow: "npm:^0.0.8"
-    axe-core: "npm:^4.9.1"
-    axobject-query: "npm:~3.1.1"
+    axe-core: "npm:^4.10.0"
+    axobject-query: "npm:^4.1.0"
     damerau-levenshtein: "npm:^1.0.8"
     emoji-regex: "npm:^9.2.2"
     es-iterator-helpers: "npm:^1.0.19"
@@ -10001,8 +10102,8 @@ __metadata:
     safe-regex-test: "npm:^1.0.3"
     string.prototype.includes: "npm:^2.0.0"
   peerDependencies:
-    eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
-  checksum: 10c0/72ac719ca90b6149c8f3c708ac5b1177f6757668b6e174d72a78512d4ac10329331b9c666c21e9561237a96a45d7f147f6a5d270dadbb99eb4ee093f127792c3
+    eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
+  checksum: 10c0/9f8e29a3317fb6a82e2ecd333fe0fab3a69fff786d087eb65dc723d6e954473ab681d14a252d7cb2971f5e7f68816cb6f7731766558e1833a77bd73af1b5ab34
   languageName: node
   linkType: hard
 
@@ -10040,30 +10141,30 @@ __metadata:
   linkType: hard
 
 "eslint-plugin-react@npm:^7.29.4":
-  version: 7.34.3
-  resolution: "eslint-plugin-react@npm:7.34.3"
+  version: 7.37.1
+  resolution: "eslint-plugin-react@npm:7.37.1"
   dependencies:
     array-includes: "npm:^3.1.8"
     array.prototype.findlast: "npm:^1.2.5"
     array.prototype.flatmap: "npm:^1.3.2"
-    array.prototype.toreversed: "npm:^1.1.2"
     array.prototype.tosorted: "npm:^1.1.4"
     doctrine: "npm:^2.1.0"
     es-iterator-helpers: "npm:^1.0.19"
     estraverse: "npm:^5.3.0"
+    hasown: "npm:^2.0.2"
     jsx-ast-utils: "npm:^2.4.1 || ^3.0.0"
     minimatch: "npm:^3.1.2"
     object.entries: "npm:^1.1.8"
     object.fromentries: "npm:^2.0.8"
-    object.hasown: "npm:^1.1.4"
     object.values: "npm:^1.2.0"
     prop-types: "npm:^15.8.1"
     resolve: "npm:^2.0.0-next.5"
     semver: "npm:^6.3.1"
     string.prototype.matchall: "npm:^4.0.11"
+    string.prototype.repeat: "npm:^1.0.0"
   peerDependencies:
-    eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
-  checksum: 10c0/60717e32c9948e2b4ddc53dac7c4b62c68fc7129c3249079191c941c08ebe7d1f4793d65182922d19427c2a6634e05231a7b74ceee34169afdfd0e43d4a43d26
+    eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
+  checksum: 10c0/13cf55666f16d2ca45b14aad1b0e14741d1817679c86d20aff0bc1e802439a8541f40a42c4c8e3486ffb710f1bcc2f3e56697f2b5f724306a7fca174e1ad6433
   languageName: node
   linkType: hard
 
@@ -10179,11 +10280,11 @@ __metadata:
   linkType: hard
 
 "esquery@npm:^1.0.1, esquery@npm:^1.4.0":
-  version: 1.5.0
-  resolution: "esquery@npm:1.5.0"
+  version: 1.6.0
+  resolution: "esquery@npm:1.6.0"
   dependencies:
     estraverse: "npm:^5.1.0"
-  checksum: 10c0/a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213
+  checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2
   languageName: node
   linkType: hard
 
@@ -10563,41 +10664,41 @@ __metadata:
   linkType: hard
 
 "express@npm:^4.17.3":
-  version: 4.19.2
-  resolution: "express@npm:4.19.2"
+  version: 4.21.0
+  resolution: "express@npm:4.21.0"
   dependencies:
     accepts: "npm:~1.3.8"
     array-flatten: "npm:1.1.1"
-    body-parser: "npm:1.20.2"
+    body-parser: "npm:1.20.3"
     content-disposition: "npm:0.5.4"
     content-type: "npm:~1.0.4"
     cookie: "npm:0.6.0"
     cookie-signature: "npm:1.0.6"
     debug: "npm:2.6.9"
     depd: "npm:2.0.0"
-    encodeurl: "npm:~1.0.2"
+    encodeurl: "npm:~2.0.0"
     escape-html: "npm:~1.0.3"
     etag: "npm:~1.8.1"
-    finalhandler: "npm:1.2.0"
+    finalhandler: "npm:1.3.1"
     fresh: "npm:0.5.2"
     http-errors: "npm:2.0.0"
-    merge-descriptors: "npm:1.0.1"
+    merge-descriptors: "npm:1.0.3"
     methods: "npm:~1.1.2"
     on-finished: "npm:2.4.1"
     parseurl: "npm:~1.3.3"
-    path-to-regexp: "npm:0.1.7"
+    path-to-regexp: "npm:0.1.10"
     proxy-addr: "npm:~2.0.7"
-    qs: "npm:6.11.0"
+    qs: "npm:6.13.0"
     range-parser: "npm:~1.2.1"
     safe-buffer: "npm:5.2.1"
-    send: "npm:0.18.0"
-    serve-static: "npm:1.15.0"
+    send: "npm:0.19.0"
+    serve-static: "npm:1.16.2"
     setprototypeof: "npm:1.2.0"
     statuses: "npm:2.0.1"
     type-is: "npm:~1.6.18"
     utils-merge: "npm:1.0.1"
     vary: "npm:~1.1.2"
-  checksum: 10c0/e82e2662ea9971c1407aea9fc3c16d6b963e55e3830cd0ef5e00b533feda8b770af4e3be630488ef8a752d7c75c4fcefb15892868eeaafe7353cb9e3e269fdcb
+  checksum: 10c0/4cf7ca328f3fdeb720f30ccb2ea7708bfa7d345f9cc460b64a82bf1b2c91e5b5852ba15a9a11b2a165d6089acf83457fc477dc904d59cd71ed34c7a91762c6cc
   languageName: node
   linkType: hard
 
@@ -10694,6 +10795,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"fast-uri@npm:^3.0.1":
+  version: 3.0.2
+  resolution: "fast-uri@npm:3.0.2"
+  checksum: 10c0/8cdd3da7b4022a037d348d587d55caff74b7e4f862bbdd2cc35c1e6e3f97d0aedb567894d44c57ee8798d3192cceb97dcf41dbdabfa07dd2842a0474a6c6eeef
+  languageName: node
+  linkType: hard
+
 "fastq@npm:^1.6.0":
   version: 1.17.1
   resolution: "fastq@npm:1.17.1"
@@ -10834,18 +10942,18 @@ __metadata:
   languageName: node
   linkType: hard
 
-"finalhandler@npm:1.2.0":
-  version: 1.2.0
-  resolution: "finalhandler@npm:1.2.0"
+"finalhandler@npm:1.3.1":
+  version: 1.3.1
+  resolution: "finalhandler@npm:1.3.1"
   dependencies:
     debug: "npm:2.6.9"
-    encodeurl: "npm:~1.0.2"
+    encodeurl: "npm:~2.0.0"
     escape-html: "npm:~1.0.3"
     on-finished: "npm:2.4.1"
     parseurl: "npm:~1.3.3"
     statuses: "npm:2.0.1"
     unpipe: "npm:~1.0.0"
-  checksum: 10c0/64b7e5ff2ad1fcb14931cd012651631b721ce657da24aedb5650ddde9378bf8e95daa451da43398123f5de161a81e79ff5affe4f9f2a6d2df4a813d6d3e254b7
+  checksum: 10c0/d38035831865a49b5610206a3a9a9aae4e8523cbbcd01175d0480ffbf1278c47f11d89be3ca7f617ae6d94f29cf797546a4619cd84dd109009ef33f12f69019f
   languageName: node
   linkType: hard
 
@@ -10898,16 +11006,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"find-up@npm:5.0.0, find-up@npm:^5.0.0, find-up@npm:~5.0.0":
-  version: 5.0.0
-  resolution: "find-up@npm:5.0.0"
-  dependencies:
-    locate-path: "npm:^6.0.0"
-    path-exists: "npm:^4.0.0"
-  checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a
-  languageName: node
-  linkType: hard
-
 "find-up@npm:^2.0.0, find-up@npm:^2.1.0":
   version: 2.1.0
   resolution: "find-up@npm:2.1.0"
@@ -10936,6 +11034,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"find-up@npm:^5.0.0, find-up@npm:~5.0.0":
+  version: 5.0.0
+  resolution: "find-up@npm:5.0.0"
+  dependencies:
+    locate-path: "npm:^6.0.0"
+    path-exists: "npm:^4.0.0"
+  checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a
+  languageName: node
+  linkType: hard
+
 "find-yarn-workspace-root@npm:^2.0.0, find-yarn-workspace-root@npm:~2.0.0":
   version: 2.0.0
   resolution: "find-yarn-workspace-root@npm:2.0.0"
@@ -10985,9 +11093,9 @@ __metadata:
   linkType: hard
 
 "flow-parser@npm:0.*":
-  version: 0.238.0
-  resolution: "flow-parser@npm:0.238.0"
-  checksum: 10c0/8e2a39337a1e53a1e4a6405f489af9093e80f297caed823f04be778d8dadba1ba94553b6110f67d4855621877ca03a4fcce7e77f79ea7275f3fc75c3f960a2b9
+  version: 0.247.1
+  resolution: "flow-parser@npm:0.247.1"
+  checksum: 10c0/1f4b11794895eb1be4dd7c78a0960835b6cc4191217761057985dcb827938b42072ac66835f2784b2ea0a4047fb9c36dfba1da8e9e0d5a559286ac608ebda9c4
   languageName: node
   linkType: hard
 
@@ -10999,12 +11107,12 @@ __metadata:
   linkType: hard
 
 "follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.9":
-  version: 1.15.6
-  resolution: "follow-redirects@npm:1.15.6"
+  version: 1.15.9
+  resolution: "follow-redirects@npm:1.15.9"
   peerDependenciesMeta:
     debug:
       optional: true
-  checksum: 10c0/9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071
+  checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f
   languageName: node
   linkType: hard
 
@@ -11032,12 +11140,12 @@ __metadata:
   linkType: hard
 
 "foreground-child@npm:^3.1.0":
-  version: 3.2.1
-  resolution: "foreground-child@npm:3.2.1"
+  version: 3.3.0
+  resolution: "foreground-child@npm:3.3.0"
   dependencies:
     cross-spawn: "npm:^7.0.0"
     signal-exit: "npm:^4.0.1"
-  checksum: 10c0/9a53a33dbd87090e9576bef65fb4a71de60f6863a8062a7b11bc1cbe3cc86d428677d7c0b9ef61cdac11007ac580006f78bd5638618d564cfd5e6fd713d6878f
+  checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2
   languageName: node
   linkType: hard
 
@@ -11254,7 +11362,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6":
+"function.prototype.name@npm:^1.1.6":
   version: 1.1.6
   resolution: "function.prototype.name@npm:1.1.6"
   dependencies:
@@ -11528,22 +11636,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"glob@npm:8.1.0":
-  version: 8.1.0
-  resolution: "glob@npm:8.1.0"
-  dependencies:
-    fs.realpath: "npm:^1.0.0"
-    inflight: "npm:^1.0.4"
-    inherits: "npm:2"
-    minimatch: "npm:^5.0.1"
-    once: "npm:^1.3.0"
-  checksum: 10c0/cb0b5cab17a59c57299376abe5646c7070f8acb89df5595b492dba3bfb43d301a46c01e5695f01154e6553168207cb60d4eaf07d3be4bc3eb9b0457c5c561d0f
-  languageName: node
-  linkType: hard
-
-"glob@npm:^10.2.2, glob@npm:^10.3.10":
-  version: 10.4.2
-  resolution: "glob@npm:10.4.2"
+"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.4.2":
+  version: 10.4.5
+  resolution: "glob@npm:10.4.5"
   dependencies:
     foreground-child: "npm:^3.1.0"
     jackspeak: "npm:^3.1.2"
@@ -11553,7 +11648,7 @@ __metadata:
     path-scurry: "npm:^1.11.1"
   bin:
     glob: dist/esm/bin.mjs
-  checksum: 10c0/2c7296695fa75a935f3ad17dc62e4e170a8bb8752cf64d328be8992dd6ad40777939003754e10e9741ff8fbe43aa52fba32d6930d0ffa0e3b74bc3fb5eebaa2f
+  checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e
   languageName: node
   linkType: hard
 
@@ -11570,6 +11665,19 @@ __metadata:
   languageName: node
   linkType: hard
 
+"glob@npm:^8.1.0":
+  version: 8.1.0
+  resolution: "glob@npm:8.1.0"
+  dependencies:
+    fs.realpath: "npm:^1.0.0"
+    inflight: "npm:^1.0.4"
+    inherits: "npm:2"
+    minimatch: "npm:^5.0.1"
+    once: "npm:^1.3.0"
+  checksum: 10c0/cb0b5cab17a59c57299376abe5646c7070f8acb89df5595b492dba3bfb43d301a46c01e5695f01154e6553168207cb60d4eaf07d3be4bc3eb9b0457c5c561d0f
+  languageName: node
+  linkType: hard
+
 "global-directory@npm:^4.0.1":
   version: 4.0.1
   resolution: "global-directory@npm:4.0.1"
@@ -11880,7 +11988,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"he@npm:1.2.0, he@npm:^1.2.0":
+"he@npm:^1.2.0":
   version: 1.2.0
   resolution: "he@npm:1.2.0"
   bin:
@@ -12161,8 +12269,8 @@ __metadata:
   linkType: hard
 
 "http-proxy-middleware@npm:^2.0.3":
-  version: 2.0.6
-  resolution: "http-proxy-middleware@npm:2.0.6"
+  version: 2.0.7
+  resolution: "http-proxy-middleware@npm:2.0.7"
   dependencies:
     "@types/http-proxy": "npm:^1.17.8"
     http-proxy: "npm:^1.18.1"
@@ -12174,7 +12282,7 @@ __metadata:
   peerDependenciesMeta:
     "@types/express":
       optional: true
-  checksum: 10c0/25a0e550dd1900ee5048a692e0e9b2b6339d06d487a705d90c47e359e9c6561d648cd7862d001d090e651c9efffa1b6e5160fcf1f299b5fa4935f76e9754eb11
+  checksum: 10c0/8d00a61eb215b83826460b07489d8bb095368ec16e02a9d63e228dcf7524e7c20d61561e5476de1391aecd4ec32ea093279cdc972115b311f8e0a95a24c9e47e
   languageName: node
   linkType: hard
 
@@ -12230,12 +12338,12 @@ __metadata:
   linkType: hard
 
 "https-proxy-agent@npm:^7.0.1":
-  version: 7.0.4
-  resolution: "https-proxy-agent@npm:7.0.4"
+  version: 7.0.5
+  resolution: "https-proxy-agent@npm:7.0.5"
   dependencies:
     agent-base: "npm:^7.0.2"
     debug: "npm:4"
-  checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b
+  checksum: 10c0/2490e3acec397abeb88807db52cac59102d5ed758feee6df6112ab3ccd8325e8a1ce8bce6f4b66e5470eca102d31e425ace904242e4fa28dbe0c59c4bafa7b2c
   languageName: node
   linkType: hard
 
@@ -12306,9 +12414,9 @@ __metadata:
   linkType: hard
 
 "ignore@npm:^5.0.4, ignore@npm:^5.1.1, ignore@npm:^5.1.8, ignore@npm:^5.2.0":
-  version: 5.3.1
-  resolution: "ignore@npm:5.3.1"
-  checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd
+  version: 5.3.2
+  resolution: "ignore@npm:5.3.2"
+  checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337
   languageName: node
   linkType: hard
 
@@ -12331,9 +12439,9 @@ __metadata:
   linkType: hard
 
 "immutable@npm:^4.0.0":
-  version: 4.3.6
-  resolution: "immutable@npm:4.3.6"
-  checksum: 10c0/7d0952a768b4fadcee47230ed86dc9505a4517095eceaf5a47e65288571c42400c6e4a2ae21eca4eda957cb7bc50720213135b62cf6a181639111f8acae128c3
+  version: 4.3.7
+  resolution: "immutable@npm:4.3.7"
+  checksum: 10c0/9b099197081b22f6433003e34929da8ecddbbdc1474cdc8aa3b7669dee4adda349c06143de22def36016d1b6de5322b043eccd7a11db1dad2ca85dad4fff5435
   languageName: node
   linkType: hard
 
@@ -12376,14 +12484,14 @@ __metadata:
   linkType: hard
 
 "import-local@npm:^3.0.2":
-  version: 3.1.0
-  resolution: "import-local@npm:3.1.0"
+  version: 3.2.0
+  resolution: "import-local@npm:3.2.0"
   dependencies:
     pkg-dir: "npm:^4.2.0"
     resolve-cwd: "npm:^3.0.0"
   bin:
     import-local-fixture: fixtures/cli.js
-  checksum: 10c0/c67ecea72f775fe8684ca3d057e54bdb2ae28c14bf261d2607c269c18ea0da7b730924c06262eca9aed4b8ab31e31d65bc60b50e7296c85908a56e2f7d41ecd2
+  checksum: 10c0/94cd6367a672b7e0cb026970c85b76902d2710a64896fa6de93bd5c571dd03b228c5759308959de205083e3b1c61e799f019c9e36ee8e9c523b993e1057f0433
   languageName: node
   linkType: hard
 
@@ -12672,12 +12780,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.5.0":
-  version: 2.14.0
-  resolution: "is-core-module@npm:2.14.0"
+"is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1, is-core-module@npm:^2.5.0":
+  version: 2.15.1
+  resolution: "is-core-module@npm:2.15.1"
   dependencies:
     hasown: "npm:^2.0.2"
-  checksum: 10c0/ae8dbc82bd20426558bc8d20ce290ce301c1cfd6ae4446266d10cacff4c63c67ab16440ade1d72ced9ec41c569fbacbcee01e293782ce568527c4cdf35936e4c
+  checksum: 10c0/53432f10c69c40bfd2fa8914133a68709ff9498c86c3bf5fca3cdf3145a56fd2168cbf4a43b29843a6202a120a5f9c5ffba0a4322e1e3441739bc0b641682612
   languageName: node
   linkType: hard
 
@@ -13261,34 +13369,34 @@ __metadata:
   linkType: hard
 
 "iterator.prototype@npm:^1.1.2":
-  version: 1.1.2
-  resolution: "iterator.prototype@npm:1.1.2"
+  version: 1.1.3
+  resolution: "iterator.prototype@npm:1.1.3"
   dependencies:
     define-properties: "npm:^1.2.1"
     get-intrinsic: "npm:^1.2.1"
     has-symbols: "npm:^1.0.3"
     reflect.getprototypeof: "npm:^1.0.4"
     set-function-name: "npm:^2.0.1"
-  checksum: 10c0/a32151326095e916f306990d909f6bbf23e3221999a18ba686419535dcd1749b10ded505e89334b77dc4c7a58a8508978f0eb16c2c8573e6d412eb7eb894ea79
+  checksum: 10c0/68b0320c14291fbb3d8ed5a17e255d3127e7971bec19108076667e79c9ff4c7d69f99de4b0b3075c789c3f318366d7a0a35bb086eae0f2cf832dd58465b2f9e6
   languageName: node
   linkType: hard
 
 "jackspeak@npm:^3.1.2":
-  version: 3.4.0
-  resolution: "jackspeak@npm:3.4.0"
+  version: 3.4.3
+  resolution: "jackspeak@npm:3.4.3"
   dependencies:
     "@isaacs/cliui": "npm:^8.0.2"
     "@pkgjs/parseargs": "npm:^0.11.0"
   dependenciesMeta:
     "@pkgjs/parseargs":
       optional: true
-  checksum: 10c0/7e42d1ea411b4d57d43ea8a6afbca9224382804359cb72626d0fc45bb8db1de5ad0248283c3db45fe73e77210750d4fcc7c2b4fe5d24fda94aaa24d658295c5f
+  checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9
   languageName: node
   linkType: hard
 
 "jake@npm:^10.8.5":
-  version: 10.9.1
-  resolution: "jake@npm:10.9.1"
+  version: 10.9.2
+  resolution: "jake@npm:10.9.2"
   dependencies:
     async: "npm:^3.2.3"
     chalk: "npm:^4.0.2"
@@ -13296,7 +13404,7 @@ __metadata:
     minimatch: "npm:^3.1.2"
   bin:
     jake: bin/cli.js
-  checksum: 10c0/dda972431a926462f08fcf583ea8997884216a43daa5cce81cb42e7e661dc244f836c0a802fde23439c6e1fc59743d1c0be340aa726d3b17d77557611a5cd541
+  checksum: 10c0/c4597b5ed9b6a908252feab296485a4f87cba9e26d6c20e0ca144fb69e0c40203d34a2efddb33b3d297b8bd59605e6c1f44f6221ca1e10e69175ecbf3ff5fe31
   languageName: node
   linkType: hard
 
@@ -13922,17 +14030,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0":
-  version: 4.1.0
-  resolution: "js-yaml@npm:4.1.0"
-  dependencies:
-    argparse: "npm:^2.0.1"
-  bin:
-    js-yaml: bin/js-yaml.js
-  checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f
-  languageName: node
-  linkType: hard
-
 "js-yaml@npm:^3.13.1":
   version: 3.14.1
   resolution: "js-yaml@npm:3.14.1"
@@ -13945,6 +14042,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"js-yaml@npm:^4.1.0":
+  version: 4.1.0
+  resolution: "js-yaml@npm:4.1.0"
+  dependencies:
+    argparse: "npm:^2.0.1"
+  bin:
+    js-yaml: bin/js-yaml.js
+  checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f
+  languageName: node
+  linkType: hard
+
 "jsbn@npm:1.1.0":
   version: 1.1.0
   resolution: "jsbn@npm:1.1.0"
@@ -14030,21 +14138,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"jsesc@npm:^2.5.1":
-  version: 2.5.2
-  resolution: "jsesc@npm:2.5.2"
-  bin:
-    jsesc: bin/jsesc
-  checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88
-  languageName: node
-  linkType: hard
-
-"jsesc@npm:~0.5.0":
-  version: 0.5.0
-  resolution: "jsesc@npm:0.5.0"
+"jsesc@npm:^3.0.2, jsesc@npm:~3.0.2":
+  version: 3.0.2
+  resolution: "jsesc@npm:3.0.2"
   bin:
     jsesc: bin/jsesc
-  checksum: 10c0/f93792440ae1d80f091b65f8ceddf8e55c4bb7f1a09dee5dcbdb0db5612c55c0f6045625aa6b7e8edb2e0a4feabd80ee48616dbe2d37055573a84db3d24f96d9
+  checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1
   languageName: node
   linkType: hard
 
@@ -14289,12 +14388,12 @@ __metadata:
   linkType: hard
 
 "launch-editor@npm:^2.6.0":
-  version: 2.8.0
-  resolution: "launch-editor@npm:2.8.0"
+  version: 2.9.1
+  resolution: "launch-editor@npm:2.9.1"
   dependencies:
     picocolors: "npm:^1.0.0"
     shell-quote: "npm:^1.8.1"
-  checksum: 10c0/bfe946d4eda8d3405b1e15d2ad71323c9f31c5cf1412733d3f933a06a967c93e76965ec7b88a312616321e73ed77ccdf67ac8f9f0ba137709f07edcc21156e4e
+  checksum: 10c0/891f1d136ed8e4ea12e16c196a0d2e07f23c7b983e3ab532b2be1775fb244909581507cce97c50f9d5ca92680b53e4a75c72ddcf20184aa6c4da6ebbe87703f5
   languageName: node
   linkType: hard
 
@@ -14595,16 +14694,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"log-symbols@npm:4.1.0, log-symbols@npm:^4.1.0":
-  version: 4.1.0
-  resolution: "log-symbols@npm:4.1.0"
-  dependencies:
-    chalk: "npm:^4.1.0"
-    is-unicode-supported: "npm:^0.1.0"
-  checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6
-  languageName: node
-  linkType: hard
-
 "log-symbols@npm:^2.2.0":
   version: 2.2.0
   resolution: "log-symbols@npm:2.2.0"
@@ -14614,6 +14703,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"log-symbols@npm:^4.1.0":
+  version: 4.1.0
+  resolution: "log-symbols@npm:4.1.0"
+  dependencies:
+    chalk: "npm:^4.1.0"
+    is-unicode-supported: "npm:^0.1.0"
+  checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6
+  languageName: node
+  linkType: hard
+
 "logkitty@npm:^0.7.1":
   version: 0.7.1
   resolution: "logkitty@npm:0.7.1"
@@ -14655,9 +14754,9 @@ __metadata:
   linkType: hard
 
 "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0":
-  version: 10.2.2
-  resolution: "lru-cache@npm:10.2.2"
-  checksum: 10c0/402d31094335851220d0b00985084288136136992979d0e015f0f1697e15d1c86052d7d53ae86b614e5b058425606efffc6969a31a091085d7a2b80a8a1e26d6
+  version: 10.4.3
+  resolution: "lru-cache@npm:10.4.3"
+  checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb
   languageName: node
   linkType: hard
 
@@ -14911,10 +15010,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"merge-descriptors@npm:1.0.1":
-  version: 1.0.1
-  resolution: "merge-descriptors@npm:1.0.1"
-  checksum: 10c0/b67d07bd44cfc45cebdec349bb6e1f7b077ee2fd5beb15d1f7af073849208cb6f144fe403e29a36571baf3f4e86469ac39acf13c318381e958e186b2766f54ec
+"merge-descriptors@npm:1.0.3":
+  version: 1.0.3
+  resolution: "merge-descriptors@npm:1.0.3"
+  checksum: 10c0/866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93
   languageName: node
   linkType: hard
 
@@ -15574,12 +15673,12 @@ __metadata:
   linkType: hard
 
 "micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4":
-  version: 4.0.7
-  resolution: "micromatch@npm:4.0.7"
+  version: 4.0.8
+  resolution: "micromatch@npm:4.0.8"
   dependencies:
     braces: "npm:^3.0.3"
     picomatch: "npm:^2.3.1"
-  checksum: 10c0/58fa99bc5265edec206e9163a1d2cec5fabc46a5b473c45f4a700adce88c2520456ae35f2b301e4410fb3afb27e9521fb2813f6fc96be0a48a89430e0916a772
+  checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8
   languageName: node
   linkType: hard
 
@@ -15595,13 +15694,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2":
+"mime-db@npm:1.52.0":
   version: 1.52.0
   resolution: "mime-db@npm:1.52.0"
   checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa
   languageName: node
   linkType: hard
 
+"mime-db@npm:>= 1.43.0 < 2":
+  version: 1.53.0
+  resolution: "mime-db@npm:1.53.0"
+  checksum: 10c0/1dcc37ba8ed5d1c179f5c6f0837e8db19371d5f2ea3690c3c2f3fa8c3858f976851d3460b172b4dee78ebd606762cbb407aa398545fbacd539e519f858cd7bf4
+  languageName: node
+  linkType: hard
+
 "mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34":
   version: 2.1.35
   resolution: "mime-types@npm:2.1.35"
@@ -15702,16 +15808,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"minimatch@npm:5.0.1":
-  version: 5.0.1
-  resolution: "minimatch@npm:5.0.1"
-  dependencies:
-    brace-expansion: "npm:^2.0.1"
-  checksum: 10c0/baa60fc5839205f13d6c266d8ad4d160ae37c33f66b130b5640acac66deff84b934ac6307f5dc5e4b30362c51284817c12df7c9746ffb600b9009c581e0b1634
-  languageName: node
-  linkType: hard
-
-"minimatch@npm:^5.0.1":
+"minimatch@npm:^5.0.1, minimatch@npm:^5.1.6":
   version: 5.1.6
   resolution: "minimatch@npm:5.1.6"
   dependencies:
@@ -15721,11 +15818,11 @@ __metadata:
   linkType: hard
 
 "minimatch@npm:^9.0.4":
-  version: 9.0.4
-  resolution: "minimatch@npm:9.0.4"
+  version: 9.0.5
+  resolution: "minimatch@npm:9.0.5"
   dependencies:
     brace-expansion: "npm:^2.0.1"
-  checksum: 10c0/2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414
+  checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed
   languageName: node
   linkType: hard
 
@@ -15901,33 +15998,33 @@ __metadata:
   linkType: hard
 
 "mocha@npm:^10.2.0":
-  version: 10.4.0
-  resolution: "mocha@npm:10.4.0"
-  dependencies:
-    ansi-colors: "npm:4.1.1"
-    browser-stdout: "npm:1.3.1"
-    chokidar: "npm:3.5.3"
-    debug: "npm:4.3.4"
-    diff: "npm:5.0.0"
-    escape-string-regexp: "npm:4.0.0"
-    find-up: "npm:5.0.0"
-    glob: "npm:8.1.0"
-    he: "npm:1.2.0"
-    js-yaml: "npm:4.1.0"
-    log-symbols: "npm:4.1.0"
-    minimatch: "npm:5.0.1"
-    ms: "npm:2.1.3"
-    serialize-javascript: "npm:6.0.0"
-    strip-json-comments: "npm:3.1.1"
-    supports-color: "npm:8.1.1"
-    workerpool: "npm:6.2.1"
-    yargs: "npm:16.2.0"
-    yargs-parser: "npm:20.2.4"
-    yargs-unparser: "npm:2.0.0"
+  version: 10.7.3
+  resolution: "mocha@npm:10.7.3"
+  dependencies:
+    ansi-colors: "npm:^4.1.3"
+    browser-stdout: "npm:^1.3.1"
+    chokidar: "npm:^3.5.3"
+    debug: "npm:^4.3.5"
+    diff: "npm:^5.2.0"
+    escape-string-regexp: "npm:^4.0.0"
+    find-up: "npm:^5.0.0"
+    glob: "npm:^8.1.0"
+    he: "npm:^1.2.0"
+    js-yaml: "npm:^4.1.0"
+    log-symbols: "npm:^4.1.0"
+    minimatch: "npm:^5.1.6"
+    ms: "npm:^2.1.3"
+    serialize-javascript: "npm:^6.0.2"
+    strip-json-comments: "npm:^3.1.1"
+    supports-color: "npm:^8.1.1"
+    workerpool: "npm:^6.5.1"
+    yargs: "npm:^16.2.0"
+    yargs-parser: "npm:^20.2.9"
+    yargs-unparser: "npm:^2.0.0"
   bin:
     _mocha: bin/_mocha
     mocha: bin/mocha.js
-  checksum: 10c0/e572e9d8c164e98f64de7e9498608de042fd841c6a7441f456a5e216e9aed2299e2c568d9dc27f2be2de06521e6b2d1dd774ab58a243b1c7697d14aec2f0f7f7
+  checksum: 10c0/76a205905ec626262d903954daca31ba8e0dd4347092f627b98b8508dcdb5b30be62ec8f7a405fab3b2e691bdc099721c3291b330c3ee85b8ec40d3d179f8728
   languageName: node
   linkType: hard
 
@@ -15952,14 +16049,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ms@npm:2.1.2":
-  version: 2.1.2
-  resolution: "ms@npm:2.1.2"
-  checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc
-  languageName: node
-  linkType: hard
-
-"ms@npm:2.1.3, ms@npm:^2.1.1":
+"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3":
   version: 2.1.3
   resolution: "ms@npm:2.1.3"
   checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48
@@ -16036,9 +16126,9 @@ __metadata:
   linkType: hard
 
 "native-request@npm:^1.0.5":
-  version: 1.1.0
-  resolution: "native-request@npm:1.1.0"
-  checksum: 10c0/e3cee67687cf4cafb25675803cd263e8688e8e91c1eff4bac7d24fa0e19624904f1dc9b0b062830b889631111feb6b1b9f05bbb5d56ccecc2354883d11892e02
+  version: 1.1.2
+  resolution: "native-request@npm:1.1.2"
+  checksum: 10c0/6126aef460472217e8fdc317e0461505500ca4812bb8c20a2a1ad3bfb6cd16e49a7a3b89f272701f0cb756e045deb428985051069c43140b9355f351c8cba344
   languageName: node
   linkType: hard
 
@@ -16133,19 +16223,19 @@ __metadata:
   linkType: hard
 
 "node-gyp-build@npm:^4.3.0":
-  version: 4.8.1
-  resolution: "node-gyp-build@npm:4.8.1"
+  version: 4.8.2
+  resolution: "node-gyp-build@npm:4.8.2"
   bin:
     node-gyp-build: bin.js
     node-gyp-build-optional: optional.js
     node-gyp-build-test: build-test.js
-  checksum: 10c0/e36ca3d2adf2b9cca316695d7687207c19ac6ed326d6d7c68d7112cebe0de4f82d6733dff139132539fcc01cf5761f6c9082a21864ab9172edf84282bc849ce7
+  checksum: 10c0/d816b43974d31d6257b6e87d843f2626c72389a285208394bc57a7766b210454d2642860a5e5b5c333d8ecabaeabad3b31b94f58cf8ca1aabdef0c320d02baaa
   languageName: node
   linkType: hard
 
 "node-gyp@npm:latest":
-  version: 10.1.0
-  resolution: "node-gyp@npm:10.1.0"
+  version: 10.2.0
+  resolution: "node-gyp@npm:10.2.0"
   dependencies:
     env-paths: "npm:^2.2.0"
     exponential-backoff: "npm:^3.1.1"
@@ -16153,13 +16243,13 @@ __metadata:
     graceful-fs: "npm:^4.2.6"
     make-fetch-happen: "npm:^13.0.0"
     nopt: "npm:^7.0.0"
-    proc-log: "npm:^3.0.0"
+    proc-log: "npm:^4.1.0"
     semver: "npm:^7.3.5"
-    tar: "npm:^6.1.2"
+    tar: "npm:^6.2.1"
     which: "npm:^4.0.0"
   bin:
     node-gyp: bin/node-gyp.js
-  checksum: 10c0/9cc821111ca244a01fb7f054db7523ab0a0cd837f665267eb962eb87695d71fb1e681f9e21464cc2fd7c05530dc4c81b810bca1a88f7d7186909b74477491a3c
+  checksum: 10c0/00630d67dbd09a45aee0a5d55c05e3916ca9e6d427ee4f7bc392d2d3dc5fad7449b21fc098dd38260a53d9dcc9c879b36704a1994235d4707e7271af7e9a835b
   languageName: node
   linkType: hard
 
@@ -16204,10 +16294,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"node-releases@npm:^2.0.14":
-  version: 2.0.14
-  resolution: "node-releases@npm:2.0.14"
-  checksum: 10c0/199fc93773ae70ec9969bc6d5ac5b2bbd6eb986ed1907d751f411fef3ede0e4bfdb45ceb43711f8078bea237b6036db8b1bf208f6ff2b70c7d615afd157f3ab9
+"node-releases@npm:^2.0.18":
+  version: 2.0.18
+  resolution: "node-releases@npm:2.0.18"
+  checksum: 10c0/786ac9db9d7226339e1dc84bbb42007cb054a346bd9257e6aa154d294f01bc6a6cddb1348fa099f079be6580acbb470e3c048effd5f719325abd0179e566fd27
   languageName: node
   linkType: hard
 
@@ -16340,9 +16430,9 @@ __metadata:
   linkType: hard
 
 "nwsapi@npm:^2.2.0":
-  version: 2.2.10
-  resolution: "nwsapi@npm:2.2.10"
-  checksum: 10c0/43dfa150387bd2a578e37556d0ae3330d5617f99e5a7b64e3400d4c2785620762aa6169caf8f5fbce17b7ef29c372060b602594320c374fba0a39da4163d77ed
+  version: 2.2.13
+  resolution: "nwsapi@npm:2.2.13"
+  checksum: 10c0/9dbd1071bba3570ef0b046c43c03d0584c461063f27539ba39f4185188e9d5c10cb06fd4426cdb300bb83020c3daa2c8f4fa9e8a070299539ac4007433357ac0
   languageName: node
   linkType: hard
 
@@ -16422,9 +16512,9 @@ __metadata:
   linkType: hard
 
 "object-inspect@npm:^1.13.1":
-  version: 1.13.1
-  resolution: "object-inspect@npm:1.13.1"
-  checksum: 10c0/fad603f408e345c82e946abdf4bfd774260a5ed3e5997a0b057c44153ac32c7271ff19e3a5ae39c858da683ba045ccac2f65245c12763ce4e8594f818f4a648d
+  version: 1.13.2
+  resolution: "object-inspect@npm:1.13.2"
+  checksum: 10c0/b97835b4c91ec37b5fd71add84f21c3f1047d1d155d00c0fcd6699516c256d4fcc6ff17a1aced873197fe447f91a3964178fd2a67a1ee2120cdaf60e81a050b4
   languageName: node
   linkType: hard
 
@@ -16477,7 +16567,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"object.fromentries@npm:^2.0.5, object.fromentries@npm:^2.0.7, object.fromentries@npm:^2.0.8":
+"object.fromentries@npm:^2.0.5, object.fromentries@npm:^2.0.8":
   version: 2.0.8
   resolution: "object.fromentries@npm:2.0.8"
   dependencies:
@@ -16489,7 +16579,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"object.groupby@npm:^1.0.1":
+"object.groupby@npm:^1.0.3":
   version: 1.0.3
   resolution: "object.groupby@npm:1.0.3"
   dependencies:
@@ -16500,7 +16590,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"object.hasown@npm:^1.1.0, object.hasown@npm:^1.1.4":
+"object.hasown@npm:^1.1.0":
   version: 1.1.4
   resolution: "object.hasown@npm:1.1.4"
   dependencies:
@@ -16520,7 +16610,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"object.values@npm:^1.1.5, object.values@npm:^1.1.6, object.values@npm:^1.1.7, object.values@npm:^1.2.0":
+"object.values@npm:^1.1.5, object.values@npm:^1.1.6, object.values@npm:^1.2.0":
   version: 1.2.0
   resolution: "object.values@npm:1.2.0"
   dependencies:
@@ -16725,6 +16815,48 @@ __metadata:
   languageName: node
   linkType: hard
 
+"oxc-resolver@npm:^1.10.2":
+  version: 1.12.0
+  resolution: "oxc-resolver@npm:1.12.0"
+  dependencies:
+    "@oxc-resolver/binding-darwin-arm64": "npm:1.12.0"
+    "@oxc-resolver/binding-darwin-x64": "npm:1.12.0"
+    "@oxc-resolver/binding-freebsd-x64": "npm:1.12.0"
+    "@oxc-resolver/binding-linux-arm-gnueabihf": "npm:1.12.0"
+    "@oxc-resolver/binding-linux-arm64-gnu": "npm:1.12.0"
+    "@oxc-resolver/binding-linux-arm64-musl": "npm:1.12.0"
+    "@oxc-resolver/binding-linux-x64-gnu": "npm:1.12.0"
+    "@oxc-resolver/binding-linux-x64-musl": "npm:1.12.0"
+    "@oxc-resolver/binding-wasm32-wasi": "npm:1.12.0"
+    "@oxc-resolver/binding-win32-arm64-msvc": "npm:1.12.0"
+    "@oxc-resolver/binding-win32-x64-msvc": "npm:1.12.0"
+  dependenciesMeta:
+    "@oxc-resolver/binding-darwin-arm64":
+      optional: true
+    "@oxc-resolver/binding-darwin-x64":
+      optional: true
+    "@oxc-resolver/binding-freebsd-x64":
+      optional: true
+    "@oxc-resolver/binding-linux-arm-gnueabihf":
+      optional: true
+    "@oxc-resolver/binding-linux-arm64-gnu":
+      optional: true
+    "@oxc-resolver/binding-linux-arm64-musl":
+      optional: true
+    "@oxc-resolver/binding-linux-x64-gnu":
+      optional: true
+    "@oxc-resolver/binding-linux-x64-musl":
+      optional: true
+    "@oxc-resolver/binding-wasm32-wasi":
+      optional: true
+    "@oxc-resolver/binding-win32-arm64-msvc":
+      optional: true
+    "@oxc-resolver/binding-win32-x64-msvc":
+      optional: true
+  checksum: 10c0/61c0b9c2f02ee91fe73e49f6d84b3e373d48aba5e86c25503369f5285d6d2d1be54b0f2026ce5d2f18acc5989f9232fa44371e7855baeb3bffbd9c0b93777dac
+  languageName: node
+  linkType: hard
+
 "p-defer@npm:^1.0.0":
   version: 1.0.0
   resolution: "p-defer@npm:1.0.0"
@@ -16862,9 +16994,9 @@ __metadata:
   linkType: hard
 
 "package-json-from-dist@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "package-json-from-dist@npm:1.0.0"
-  checksum: 10c0/e3ffaf6ac1040ab6082a658230c041ad14e72fabe99076a2081bb1d5d41210f11872403fc09082daf4387fc0baa6577f96c9c0e94c90c394fd57794b66aa4033
+  version: 1.0.1
+  resolution: "package-json-from-dist@npm:1.0.1"
+  checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b
   languageName: node
   linkType: hard
 
@@ -17052,12 +17184,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"path-is-network-drive@npm:^1.0.20":
-  version: 1.0.20
-  resolution: "path-is-network-drive@npm:1.0.20"
+"path-is-network-drive@npm:^1.0.21":
+  version: 1.0.21
+  resolution: "path-is-network-drive@npm:1.0.21"
   dependencies:
     tslib: "npm:^2"
-  checksum: 10c0/60bcd514d473d402dc93df83cc695c091f3790ea661261534b4a7cb6c60a3871e2e1875a9d68f2e908f0cd41166fd2bd9c128a50afe28640c03c5b45b6ee124d
+  checksum: 10c0/430d063982d44af437efd156c10a11217716503969ba9c3c3c50bd6c027b956c812c0f473c4cdaa0ef09c08d7cc1569c60ff32af840f9a99f080eb3812473eda
   languageName: node
   linkType: hard
 
@@ -17092,19 +17224,19 @@ __metadata:
   languageName: node
   linkType: hard
 
-"path-strip-sep@npm:^1.0.17":
-  version: 1.0.17
-  resolution: "path-strip-sep@npm:1.0.17"
+"path-strip-sep@npm:^1.0.18":
+  version: 1.0.18
+  resolution: "path-strip-sep@npm:1.0.18"
   dependencies:
     tslib: "npm:^2"
-  checksum: 10c0/5d92c3abfa34852cbd9727481ce8feb732b50b84f8390c13d021f5c6e1213ea2b054ce0caa7fb1553f521fc5dcd0948d33b20e79ec7045a67603600c6791b95f
+  checksum: 10c0/a6551d6bb8ebc6b8ae2b588906671e1113707e4c7a9617bf89bb221b761bd2d4138a39140831979378ae9a4c274f22d5a61736b432ade5c7e17563818f0aad1d
   languageName: node
   linkType: hard
 
-"path-to-regexp@npm:0.1.7":
-  version: 0.1.7
-  resolution: "path-to-regexp@npm:0.1.7"
-  checksum: 10c0/50a1ddb1af41a9e68bd67ca8e331a705899d16fb720a1ea3a41e310480948387daf603abb14d7b0826c58f10146d49050a1291ba6a82b78a382d1c02c0b8f905
+"path-to-regexp@npm:0.1.10":
+  version: 0.1.10
+  resolution: "path-to-regexp@npm:0.1.10"
+  checksum: 10c0/34196775b9113ca6df88e94c8d83ba82c0e1a2063dd33bfe2803a980da8d49b91db8104f49d5191b44ea780d46b8670ce2b7f4a5e349b0c48c6779b653f1afe4
   languageName: node
   linkType: hard
 
@@ -17144,10 +17276,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1":
-  version: 1.0.1
-  resolution: "picocolors@npm:1.0.1"
-  checksum: 10c0/c63cdad2bf812ef0d66c8db29583802355d4ca67b9285d846f390cc15c2f6ccb94e8cb7eb6a6e97fc5990a6d3ad4ae42d86c84d3146e667c739a4234ed50d400
+"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0":
+  version: 1.1.0
+  resolution: "picocolors@npm:1.1.0"
+  checksum: 10c0/86946f6032148801ef09c051c6fb13b5cf942eaf147e30ea79edb91dd32d700934edebe782a1078ff859fb2b816792e97ef4dab03d7f0b804f6b01a0df35e023
   languageName: node
   linkType: hard
 
@@ -17662,12 +17794,12 @@ __metadata:
   linkType: hard
 
 "postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.9":
-  version: 6.1.0
-  resolution: "postcss-selector-parser@npm:6.1.0"
+  version: 6.1.2
+  resolution: "postcss-selector-parser@npm:6.1.2"
   dependencies:
     cssesc: "npm:^3.0.0"
     util-deprecate: "npm:^1.0.2"
-  checksum: 10c0/91e9c6434772506bc7f318699dd9d19d32178b52dfa05bed24cb0babbdab54f8fb765d9920f01ac548be0a642aab56bce493811406ceb00ae182bbb53754c473
+  checksum: 10c0/523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e
   languageName: node
   linkType: hard
 
@@ -17701,7 +17833,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"postcss@npm:8.4.38, postcss@npm:^8.2.13, postcss@npm:^8.3.5, postcss@npm:^8.4.33":
+"postcss@npm:8.4.38":
   version: 8.4.38
   resolution: "postcss@npm:8.4.38"
   dependencies:
@@ -17712,6 +17844,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"postcss@npm:^8.2.13, postcss@npm:^8.3.5, postcss@npm:^8.4.33":
+  version: 8.4.47
+  resolution: "postcss@npm:8.4.47"
+  dependencies:
+    nanoid: "npm:^3.3.7"
+    picocolors: "npm:^1.1.0"
+    source-map-js: "npm:^1.2.1"
+  checksum: 10c0/929f68b5081b7202709456532cee2a145c1843d391508c5a09de2517e8c4791638f71dd63b1898dba6712f8839d7a6da046c72a5e44c162e908f5911f57b5f44
+  languageName: node
+  linkType: hard
+
 "prelude-ls@npm:^1.2.1":
   version: 1.2.1
   resolution: "prelude-ls@npm:1.2.1"
@@ -17777,14 +17920,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"proc-log@npm:^3.0.0":
-  version: 3.0.0
-  resolution: "proc-log@npm:3.0.0"
-  checksum: 10c0/f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc
-  languageName: node
-  linkType: hard
-
-"proc-log@npm:^4.2.0":
+"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0":
   version: 4.2.0
   resolution: "proc-log@npm:4.2.0"
   checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9
@@ -17914,12 +18050,12 @@ __metadata:
   linkType: hard
 
 "pump@npm:^3.0.0":
-  version: 3.0.0
-  resolution: "pump@npm:3.0.0"
+  version: 3.0.2
+  resolution: "pump@npm:3.0.2"
   dependencies:
     end-of-stream: "npm:^1.1.0"
     once: "npm:^1.3.1"
-  checksum: 10c0/bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478
+  checksum: 10c0/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f
   languageName: node
   linkType: hard
 
@@ -17953,12 +18089,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"qs@npm:6.11.0":
-  version: 6.11.0
-  resolution: "qs@npm:6.11.0"
+"qs@npm:6.13.0, qs@npm:^6.12.3, qs@npm:^6.4.0":
+  version: 6.13.0
+  resolution: "qs@npm:6.13.0"
   dependencies:
-    side-channel: "npm:^1.0.4"
-  checksum: 10c0/4e4875e4d7c7c31c233d07a448e7e4650f456178b9dd3766b7cfa13158fdb24ecb8c4f059fa91e820dc6ab9f2d243721d071c9c0378892dcdad86e9e9a27c68f
+    side-channel: "npm:^1.0.6"
+  checksum: 10c0/62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860
   languageName: node
   linkType: hard
 
@@ -17969,15 +18105,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"qs@npm:^6.11.2, qs@npm:^6.4.0":
-  version: 6.12.1
-  resolution: "qs@npm:6.12.1"
-  dependencies:
-    side-channel: "npm:^1.0.6"
-  checksum: 10c0/439e6d7c6583e7c69f2cab2c39c55b97db7ce576e4c7c469082b938b7fc8746e8d547baacb69b4cd2b6666484776c3f4840ad7163a4c5326300b0afa0acdd84b
-  languageName: node
-  linkType: hard
-
 "querystring-es3@npm:^0.2.1":
   version: 0.2.1
   resolution: "querystring-es3@npm:0.2.1"
@@ -18495,6 +18622,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"readdirp@npm:^4.0.1":
+  version: 4.0.2
+  resolution: "readdirp@npm:4.0.2"
+  checksum: 10c0/a16ecd8ef3286dcd90648c3b103e3826db2b766cdb4a988752c43a83f683d01c7059158d623cbcd8bdfb39e65d302d285be2d208e7d9f34d022d912b929217dd
+  languageName: node
+  linkType: hard
+
 "readdirp@npm:~3.6.0":
   version: 3.6.0
   resolution: "readdirp@npm:3.6.0"
@@ -18558,12 +18692,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"regenerate-unicode-properties@npm:^10.1.0":
-  version: 10.1.1
-  resolution: "regenerate-unicode-properties@npm:10.1.1"
+"regenerate-unicode-properties@npm:^10.2.0":
+  version: 10.2.0
+  resolution: "regenerate-unicode-properties@npm:10.2.0"
   dependencies:
     regenerate: "npm:^1.4.2"
-  checksum: 10c0/89adb5ee5ba081380c78f9057c02e156a8181969f6fcca72451efc45612e0c3df767b4333f8d8479c274d9c6fe52ec4854f0d8a22ef95dccbe87da8e5f2ac77d
+  checksum: 10c0/5510785eeaf56bbfdf4e663d6753f125c08d2a372d4107bc1b756b7bf142e2ed80c2733a8b54e68fb309ba37690e66a0362699b0e21d5c1f0255dea1b00e6460
   languageName: node
   linkType: hard
 
@@ -18615,14 +18749,14 @@ __metadata:
   linkType: hard
 
 "regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.2":
-  version: 1.5.2
-  resolution: "regexp.prototype.flags@npm:1.5.2"
+  version: 1.5.3
+  resolution: "regexp.prototype.flags@npm:1.5.3"
   dependencies:
-    call-bind: "npm:^1.0.6"
+    call-bind: "npm:^1.0.7"
     define-properties: "npm:^1.2.1"
     es-errors: "npm:^1.3.0"
-    set-function-name: "npm:^2.0.1"
-  checksum: 10c0/0f3fc4f580d9c349f8b560b012725eb9c002f36daa0041b3fbf6f4238cb05932191a4d7d5db3b5e2caa336d5150ad0402ed2be81f711f9308fe7e1a9bf9bd552
+    set-function-name: "npm:^2.0.2"
+  checksum: 10c0/e1a7c7dc42cc91abf73e47a269c4b3a8f225321b7f617baa25821f6a123a91d23a73b5152f21872c566e699207e1135d075d2251cd3e84cc96d82a910adf6020
   languageName: node
   linkType: hard
 
@@ -18633,28 +18767,35 @@ __metadata:
   languageName: node
   linkType: hard
 
-"regexpu-core@npm:^5.3.1":
-  version: 5.3.2
-  resolution: "regexpu-core@npm:5.3.2"
+"regexpu-core@npm:^6.1.1":
+  version: 6.1.1
+  resolution: "regexpu-core@npm:6.1.1"
   dependencies:
-    "@babel/regjsgen": "npm:^0.8.0"
     regenerate: "npm:^1.4.2"
-    regenerate-unicode-properties: "npm:^10.1.0"
-    regjsparser: "npm:^0.9.1"
+    regenerate-unicode-properties: "npm:^10.2.0"
+    regjsgen: "npm:^0.8.0"
+    regjsparser: "npm:^0.11.0"
     unicode-match-property-ecmascript: "npm:^2.0.0"
     unicode-match-property-value-ecmascript: "npm:^2.1.0"
-  checksum: 10c0/7945d5ab10c8bbed3ca383d4274687ea825aee4ab93a9c51c6e31e1365edd5ea807f6908f800ba017b66c462944ba68011164e7055207747ab651f8111ef3770
+  checksum: 10c0/07d49697e20f9b65977535abba4858b7f5171c13f7c366be53ec1886d3d5f69f1b98cc6a6e63cf271adda077c3366a4c851c7473c28bbd69cf5a6b6b008efc3e
   languageName: node
   linkType: hard
 
-"regjsparser@npm:^0.9.1":
-  version: 0.9.1
-  resolution: "regjsparser@npm:0.9.1"
+"regjsgen@npm:^0.8.0":
+  version: 0.8.0
+  resolution: "regjsgen@npm:0.8.0"
+  checksum: 10c0/44f526c4fdbf0b29286101a282189e4dbb303f4013cf3fea058668d96d113b9180d3d03d1e13f6d4cbde38b7728bf951aecd9dc199938c080093a9a6f0d7a6bd
+  languageName: node
+  linkType: hard
+
+"regjsparser@npm:^0.11.0":
+  version: 0.11.1
+  resolution: "regjsparser@npm:0.11.1"
   dependencies:
-    jsesc: "npm:~0.5.0"
+    jsesc: "npm:~3.0.2"
   bin:
     regjsparser: bin/parser
-  checksum: 10c0/fe44fcf19a99fe4f92809b0b6179530e5ef313ff7f87df143b08ce9a2eb3c4b6189b43735d645be6e8f4033bfb015ed1ca54f0583bc7561bed53fd379feb8225
+  checksum: 10c0/be4b40981a596b31eacd84ee12cfa474f1d33a6c05f7e995e8ec9d5ad8f1c3fbf7a5b690a05c443e1f312a1c0b16d4ea0b3384596a61d4fda97aa322879bb3cd
   languageName: node
   linkType: hard
 
@@ -18920,7 +19061,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"rimraf@npm:^2.5.4, rimraf@npm:^2.6.2, rimraf@npm:^2.6.3":
+"rimraf@npm:^2.5.4, rimraf@npm:^2.6.3":
   version: 2.7.1
   resolution: "rimraf@npm:2.7.1"
   dependencies:
@@ -19055,8 +19196,8 @@ __metadata:
   linkType: hard
 
 "rollup@npm:^2.56.2":
-  version: 2.79.1
-  resolution: "rollup@npm:2.79.1"
+  version: 2.79.2
+  resolution: "rollup@npm:2.79.2"
   dependencies:
     fsevents: "npm:~2.3.2"
   dependenciesMeta:
@@ -19064,7 +19205,7 @@ __metadata:
       optional: true
   bin:
     rollup: dist/bin/rollup
-  checksum: 10c0/421418687f5dcd7324f4387f203c6bfc7118b7ace789e30f5da022471c43e037a76f5fd93837052754eeeae798a4fb266ac05ccee1e594406d912a59af98dde9
+  checksum: 10c0/bc3746c988d903c2211266ddc539379d53d92689b9cc5c2b4e3ae161689de9af491957a567c629b6cc81f48d0928a7591fc4c383fba68a48d2966c9fb8a2bce9
   languageName: node
   linkType: hard
 
@@ -19213,15 +19354,15 @@ __metadata:
   linkType: hard
 
 "sass@npm:^1.42.1":
-  version: 1.77.6
-  resolution: "sass@npm:1.77.6"
+  version: 1.79.4
+  resolution: "sass@npm:1.79.4"
   dependencies:
-    chokidar: "npm:>=3.0.0 <4.0.0"
+    chokidar: "npm:^4.0.0"
     immutable: "npm:^4.0.0"
     source-map-js: "npm:>=0.6.2 <2.0.0"
   bin:
     sass: sass.js
-  checksum: 10c0/fe5a393c0aa29eda9f83c06be9b94788b61fe8bad0616ee6e3a25d21ab504f430d40c0064fdca89b02b8e426411ae6dcd906c91f2e48c263575c3d392b6daeb1
+  checksum: 10c0/505ff0d9267d0fb990971e617acfeabf7c060c55d4cef68fe8a4bc693e7ea88ae7d7caeca3975e4b453459ba4a707b6e5b6979fc9395a7e08f0a43ca6aed06b8
   languageName: node
   linkType: hard
 
@@ -19493,11 +19634,11 @@ __metadata:
   linkType: hard
 
 "semver@npm:7.x, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4":
-  version: 7.6.2
-  resolution: "semver@npm:7.6.2"
+  version: 7.6.3
+  resolution: "semver@npm:7.6.3"
   bin:
     semver: bin/semver.js
-  checksum: 10c0/97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c
+  checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf
   languageName: node
   linkType: hard
 
@@ -19510,9 +19651,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"send@npm:0.18.0":
-  version: 0.18.0
-  resolution: "send@npm:0.18.0"
+"send@npm:0.19.0":
+  version: 0.19.0
+  resolution: "send@npm:0.19.0"
   dependencies:
     debug: "npm:2.6.9"
     depd: "npm:2.0.0"
@@ -19527,7 +19668,7 @@ __metadata:
     on-finished: "npm:2.4.1"
     range-parser: "npm:~1.2.1"
     statuses: "npm:2.0.1"
-  checksum: 10c0/0eb134d6a51fc13bbcb976a1f4214ea1e33f242fae046efc311e80aff66c7a43603e26a79d9d06670283a13000e51be6e0a2cb80ff0942eaf9f1cd30b7ae736a
+  checksum: 10c0/ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3
   languageName: node
   linkType: hard
 
@@ -19547,16 +19688,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"serialize-javascript@npm:6.0.0":
-  version: 6.0.0
-  resolution: "serialize-javascript@npm:6.0.0"
-  dependencies:
-    randombytes: "npm:^2.1.0"
-  checksum: 10c0/73104922ef0a919064346eea21caab99de1a019a1f5fb54a7daa7fcabc39e83b387a2a363e52a889598c3b1bcf507c4b2a7b26df76e991a310657af20eea2e7c
-  languageName: node
-  linkType: hard
-
-"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1":
+"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1, serialize-javascript@npm:^6.0.2":
   version: 6.0.2
   resolution: "serialize-javascript@npm:6.0.2"
   dependencies:
@@ -19580,15 +19712,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"serve-static@npm:1.15.0, serve-static@npm:^1.13.1":
-  version: 1.15.0
-  resolution: "serve-static@npm:1.15.0"
+"serve-static@npm:1.16.2, serve-static@npm:^1.13.1":
+  version: 1.16.2
+  resolution: "serve-static@npm:1.16.2"
   dependencies:
-    encodeurl: "npm:~1.0.2"
+    encodeurl: "npm:~2.0.0"
     escape-html: "npm:~1.0.3"
     parseurl: "npm:~1.3.3"
-    send: "npm:0.18.0"
-  checksum: 10c0/fa9f0e21a540a28f301258dfe1e57bb4f81cd460d28f0e973860477dd4acef946a1f41748b5bd41c73b621bea2029569c935faa38578fd34cd42a9b4947088ba
+    send: "npm:0.19.0"
+  checksum: 10c0/528fff6f5e12d0c5a391229ad893910709bc51b5705962b09404a1d813857578149b8815f35d3ee5752f44cd378d0f31669d4b1d7e2d11f41e08283d5134bd1f
   languageName: node
   linkType: hard
 
@@ -19861,14 +19993,14 @@ __metadata:
   linkType: hard
 
 "socket.io-client@npm:^4.5.2":
-  version: 4.7.5
-  resolution: "socket.io-client@npm:4.7.5"
+  version: 4.8.0
+  resolution: "socket.io-client@npm:4.8.0"
   dependencies:
     "@socket.io/component-emitter": "npm:~3.1.0"
     debug: "npm:~4.3.2"
-    engine.io-client: "npm:~6.5.2"
+    engine.io-client: "npm:~6.6.1"
     socket.io-parser: "npm:~4.2.4"
-  checksum: 10c0/d5dc90ee63755fbbb0a1cb3faf575c9ce20d98e809a43a4c9c3ce03a56b8810335ae38e678ceb0650ac434d55e72ea6449c2e5d6db8bc7258f7c529148fac99d
+  checksum: 10c0/41f142a79f5903cf007902b9b830313e425c5d6a4257d504b8c94d4b4edd3df037df997e622205228bceb18eea6f3308d25f55b3c919d6100849c232e7c06928
   languageName: node
   linkType: hard
 
@@ -19894,17 +20026,17 @@ __metadata:
   linkType: hard
 
 "socks-proxy-agent@npm:^8.0.3":
-  version: 8.0.3
-  resolution: "socks-proxy-agent@npm:8.0.3"
+  version: 8.0.4
+  resolution: "socks-proxy-agent@npm:8.0.4"
   dependencies:
     agent-base: "npm:^7.1.1"
     debug: "npm:^4.3.4"
-    socks: "npm:^2.7.1"
-  checksum: 10c0/4950529affd8ccd6951575e21c1b7be8531b24d924aa4df3ee32df506af34b618c4e50d261f4cc603f1bfd8d426915b7d629966c8ce45b05fb5ad8c8b9a6459d
+    socks: "npm:^2.8.3"
+  checksum: 10c0/345593bb21b95b0508e63e703c84da11549f0a2657d6b4e3ee3612c312cb3a907eac10e53b23ede3557c6601d63252103494caa306b66560f43af7b98f53957a
   languageName: node
   linkType: hard
 
-"socks@npm:^2.7.1":
+"socks@npm:^2.8.3":
   version: 2.8.3
   resolution: "socks@npm:2.8.3"
   dependencies:
@@ -19914,10 +20046,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0":
-  version: 1.2.0
-  resolution: "source-map-js@npm:1.2.0"
-  checksum: 10c0/7e5f896ac10a3a50fe2898e5009c58ff0dc102dcb056ed27a354623a0ece8954d4b2649e1a1b2b52ef2e161d26f8859c7710350930751640e71e374fe2d321a4
+"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1":
+  version: 1.2.1
+  resolution: "source-map-js@npm:1.2.1"
+  checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf
   languageName: node
   linkType: hard
 
@@ -20047,9 +20179,9 @@ __metadata:
   linkType: hard
 
 "spdx-license-ids@npm:^3.0.0":
-  version: 3.0.18
-  resolution: "spdx-license-ids@npm:3.0.18"
-  checksum: 10c0/c64ba03d4727191c8fdbd001f137d6ab51386c350d5516be8a4576c2e74044cb27bc8a758f6a04809da986cc0b14213f069b04de72caccecbc9f733753ccde32
+  version: 3.0.20
+  resolution: "spdx-license-ids@npm:3.0.20"
+  checksum: 10c0/bdff7534fad6ef59be49becda1edc3fb7f5b3d6f296a715516ab9d972b8ad59af2c34b2003e01db8970d4c673d185ff696ba74c6b61d3bf327e2b3eac22c297c
   languageName: node
   linkType: hard
 
@@ -20323,6 +20455,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"string.prototype.repeat@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "string.prototype.repeat@npm:1.0.0"
+  dependencies:
+    define-properties: "npm:^1.1.3"
+    es-abstract: "npm:^1.17.5"
+  checksum: 10c0/94c7978566cffa1327d470fd924366438af9b04b497c43a9805e476e2e908aa37a1fd34cc0911156c17556dab62159d12c7b92b3cc304c3e1281fe4c8e668f40
+  languageName: node
+  linkType: hard
+
 "string.prototype.trim@npm:^1.2.9":
   version: 1.2.9
   resolution: "string.prototype.trim@npm:1.2.9"
@@ -20520,8 +20662,8 @@ __metadata:
   linkType: hard
 
 "styled-components@npm:^6.0.8":
-  version: 6.1.11
-  resolution: "styled-components@npm:6.1.11"
+  version: 6.1.13
+  resolution: "styled-components@npm:6.1.13"
   dependencies:
     "@emotion/is-prop-valid": "npm:1.2.2"
     "@emotion/unitless": "npm:0.8.1"
@@ -20535,7 +20677,7 @@ __metadata:
   peerDependencies:
     react: ">= 16.8.0"
     react-dom: ">= 16.8.0"
-  checksum: 10c0/1d149a51d24f779bba700c8c23ec0538b2d2b57745ccd49d1cfdc2dfce8bcea21e8ff81fed1143d1b35d127cc591717a398da72ea6671abbf705432b13e59e56
+  checksum: 10c0/dd0379179c6ce9655c97285e9f6475b533d4cc4cad72e8f16824c5454803a9d12126877d8b2837cd5b54520250c55cde97a183e813eed720d2575362d9646663
   languageName: node
   linkType: hard
 
@@ -20629,15 +20771,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"supports-color@npm:8.1.1, supports-color@npm:^8.0.0":
-  version: 8.1.1
-  resolution: "supports-color@npm:8.1.1"
-  dependencies:
-    has-flag: "npm:^4.0.0"
-  checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89
-  languageName: node
-  linkType: hard
-
 "supports-color@npm:^5.3.0":
   version: 5.5.0
   resolution: "supports-color@npm:5.5.0"
@@ -20656,6 +20789,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"supports-color@npm:^8.0.0, supports-color@npm:^8.1.1":
+  version: 8.1.1
+  resolution: "supports-color@npm:8.1.1"
+  dependencies:
+    has-flag: "npm:^4.0.0"
+  checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89
+  languageName: node
+  linkType: hard
+
 "supports-hyperlinks@npm:^2.0.0":
   version: 2.3.0
   resolution: "supports-hyperlinks@npm:2.3.0"
@@ -20731,7 +20873,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"tar@npm:^6.0.2, tar@npm:^6.0.5, tar@npm:^6.1.11, tar@npm:^6.1.2":
+"tar@npm:^6.0.2, tar@npm:^6.0.5, tar@npm:^6.1.11, tar@npm:^6.2.1":
   version: 6.2.1
   resolution: "tar@npm:6.2.1"
   dependencies:
@@ -20835,8 +20977,8 @@ __metadata:
   linkType: hard
 
 "terser@npm:^5.26.0":
-  version: 5.31.1
-  resolution: "terser@npm:5.31.1"
+  version: 5.34.1
+  resolution: "terser@npm:5.34.1"
   dependencies:
     "@jridgewell/source-map": "npm:^0.3.3"
     acorn: "npm:^8.8.2"
@@ -20844,7 +20986,7 @@ __metadata:
     source-map-support: "npm:~0.5.20"
   bin:
     terser: bin/terser
-  checksum: 10c0/4d49a58f64c11f3742e779a0a03aff69972ca5739decb361d909d22c8f3f7d8e2ec982a928d987d56737ad50229e8ab3f62d8ba993e4b5f360a53ed487d3c06c
+  checksum: 10c0/51c7d704c5c4ae88bf937124112c9972aed4e1fd29d805cc2d86e0f54cd631ecd4e69db5bb3c1e3b450c741c86e2313328bea0fde925329e8a31a07a7941723c
   languageName: node
   linkType: hard
 
@@ -21074,13 +21216,13 @@ __metadata:
   linkType: hard
 
 "traverse@npm:~0.6.6":
-  version: 0.6.9
-  resolution: "traverse@npm:0.6.9"
+  version: 0.6.10
+  resolution: "traverse@npm:0.6.10"
   dependencies:
     gopd: "npm:^1.0.1"
     typedarray.prototype.slice: "npm:^1.0.3"
     which-typed-array: "npm:^1.1.15"
-  checksum: 10c0/6809ef684b04cd6985a4470f93bf794ad417f04bb1c43a6b1166fe1c94506118c7a7a87c34545fe15918f4e1fe29ced7a5813d8455932042f4ccc5981634139d
+  checksum: 10c0/d37619cd650dda26fc9f8c3c55087098e702abc1a91e57a5701644f3aee67a5c61daf47ca883ebe6777ea810424317bd142b8e90ee0d9dc9171bd19df6cf6fd8
   languageName: node
   linkType: hard
 
@@ -21287,10 +21429,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"tslib@npm:^2, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.6.2":
-  version: 2.6.3
-  resolution: "tslib@npm:2.6.3"
-  checksum: 10c0/2598aef53d9dbe711af75522464b2104724d6467b26a60f2bdac8297d2b5f1f6b86a71f61717384aa8fd897240467aaa7bcc36a0700a0faf751293d1331db39a
+"tslib@npm:^2, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.6.3":
+  version: 2.7.0
+  resolution: "tslib@npm:2.7.0"
+  checksum: 10c0/469e1d5bf1af585742128827000711efa61010b699cb040ab1800bcd3ccdd37f63ec30642c9e07c4439c1db6e46345582614275daca3e0f4abae29b0083f04a6
   languageName: node
   linkType: hard
 
@@ -21321,13 +21463,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"type-detect@npm:4.0.8, type-detect@npm:^4.0.0, type-detect@npm:^4.0.8":
+"type-detect@npm:4.0.8":
   version: 4.0.8
   resolution: "type-detect@npm:4.0.8"
   checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd
   languageName: node
   linkType: hard
 
+"type-detect@npm:^4.0.0, type-detect@npm:^4.1.0":
+  version: 4.1.0
+  resolution: "type-detect@npm:4.1.0"
+  checksum: 10c0/df8157ca3f5d311edc22885abc134e18ff8ffbc93d6a9848af5b682730ca6a5a44499259750197250479c5331a8a75b5537529df5ec410622041650a7f293e2a
+  languageName: node
+  linkType: hard
+
 "type-fest@npm:^0.12.0":
   version: 0.12.0
   resolution: "type-fest@npm:0.12.0"
@@ -21392,9 +21541,9 @@ __metadata:
   linkType: hard
 
 "type-fest@npm:^4.4.0":
-  version: 4.20.1
-  resolution: "type-fest@npm:4.20.1"
-  checksum: 10c0/c31da16fe170a74c5b7e102e70e764ba8ec6ade128e782a56f842aefa07307df5a6353e6b5601d3b30ff2d856d8b955f89813df639e4758fedcf8e426b2d854e
+  version: 4.26.1
+  resolution: "type-fest@npm:4.26.1"
+  checksum: 10c0/d2719ff8d380befe8a3c61068f37f28d6fa2849fd140c5d2f0f143099e371da6856aad7c97e56b83329d45bfe504afe9fd936a7cff600cc0d46aa9ffb008d6c6
   languageName: node
   linkType: hard
 
@@ -21508,12 +21657,12 @@ __metadata:
   linkType: hard
 
 "typescript@npm:^4.6.4 || ^5.2.2":
-  version: 5.5.2
-  resolution: "typescript@npm:5.5.2"
+  version: 5.6.2
+  resolution: "typescript@npm:5.6.2"
   bin:
     tsc: bin/tsc
     tsserver: bin/tsserver
-  checksum: 10c0/8ca39b27b5f9bd7f32db795045933ab5247897660627251e8254180b792a395bf061ea7231947d5d7ffa5cb4cc771970fd4ef543275f9b559f08c9325cccfce3
+  checksum: 10c0/3ed8297a8c7c56b7fec282532503d1ac795239d06e7c4966b42d4330c6cf433a170b53bcf93a130a7f14ccc5235de5560df4f1045eb7f3550b46ebed16d3c5e5
   languageName: node
   linkType: hard
 
@@ -21528,19 +21677,21 @@ __metadata:
   linkType: hard
 
 "typescript@patch:typescript@npm%3A^4.6.4 || ^5.2.2#optional!builtin<compat/typescript>":
-  version: 5.5.2
-  resolution: "typescript@patch:typescript@npm%3A5.5.2#optional!builtin<compat/typescript>::version=5.5.2&hash=b45daf"
+  version: 5.6.2
+  resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin<compat/typescript>::version=5.6.2&hash=b45daf"
   bin:
     tsc: bin/tsc
     tsserver: bin/tsserver
-  checksum: 10c0/6721ac8933a70c252d7b640b345792e103d881811ff660355617c1836526dbb71c2044e2e77a8823fb3570b469f33276875a4cab6d3c4de4ae7d7ee1c3074ae4
+  checksum: 10c0/e6c1662e4852e22fe4bbdca471dca3e3edc74f6f1df043135c44a18a7902037023ccb0abdfb754595ca9028df8920f2f8492c00fc3cbb4309079aae8b7de71cd
   languageName: node
   linkType: hard
 
 "ua-parser-js@npm:^1.0.35":
-  version: 1.0.38
-  resolution: "ua-parser-js@npm:1.0.38"
-  checksum: 10c0/b1dd11b87e1784c79f7129e9aec679753fccf8a9b22f5202b79b19492635b5b46b779607a3cfae0270999a0d48da223bf94015642d2abee69d83c9069ab37bd0
+  version: 1.0.39
+  resolution: "ua-parser-js@npm:1.0.39"
+  bin:
+    ua-parser-js: script/cli.js
+  checksum: 10c0/c6452b0c683000f10975cb0a7e74cb1119ea95d4522ae85f396fa53b0b17884358a24ffdd86a66030c6b2981bdc502109a618c79fdaa217ee9032c9e46fcc78a
   languageName: node
   linkType: hard
 
@@ -21557,11 +21708,11 @@ __metadata:
   linkType: hard
 
 "uglify-js@npm:^3.1.4":
-  version: 3.18.0
-  resolution: "uglify-js@npm:3.18.0"
+  version: 3.19.3
+  resolution: "uglify-js@npm:3.19.3"
   bin:
     uglifyjs: bin/uglifyjs
-  checksum: 10c0/57f5f6213a2c4e8c551be9c875c085d565dc88af6b7caaab40a197aa639183cdce7c9dc2f858675eca72a5323f850ab7e88b9cc0a52dfbe3e0768aee6ab6e102
+  checksum: 10c0/83b0a90eca35f778e07cad9622b80c448b6aad457c9ff8e568afed978212b42930a95f9e1be943a1ffa4258a3340fbb899f41461131c05bb1d0a9c303aed8479
   languageName: node
   linkType: hard
 
@@ -21577,17 +21728,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"undici-types@npm:~5.26.4":
-  version: 5.26.5
-  resolution: "undici-types@npm:5.26.5"
-  checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501
+"undici-types@npm:~6.19.2":
+  version: 6.19.8
+  resolution: "undici-types@npm:6.19.8"
+  checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344
   languageName: node
   linkType: hard
 
 "unicode-canonical-property-names-ecmascript@npm:^2.0.0":
-  version: 2.0.0
-  resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0"
-  checksum: 10c0/0fe812641bcfa3ae433025178a64afb5d9afebc21a922dafa7cba971deebb5e4a37350423890750132a85c936c290fb988146d0b1bd86838ad4897f4fc5bd0de
+  version: 2.0.1
+  resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.1"
+  checksum: 10c0/f83bc492fdbe662860795ef37a85910944df7310cac91bd778f1c19ebc911e8b9cde84e703de631e5a2fcca3905e39896f8fc5fc6a44ddaf7f4aff1cda24f381
   languageName: node
   linkType: hard
 
@@ -21602,9 +21753,9 @@ __metadata:
   linkType: hard
 
 "unicode-match-property-value-ecmascript@npm:^2.1.0":
-  version: 2.1.0
-  resolution: "unicode-match-property-value-ecmascript@npm:2.1.0"
-  checksum: 10c0/f5b9499b9e0ffdc6027b744d528f17ec27dd7c15da03254ed06851feec47e0531f20d410910c8a49af4a6a190f4978413794c8d75ce112950b56d583b5d5c7f2
+  version: 2.2.0
+  resolution: "unicode-match-property-value-ecmascript@npm:2.2.0"
+  checksum: 10c0/1d0a2deefd97974ddff5b7cb84f9884177f4489928dfcebb4b2b091d6124f2739df51fc6ea15958e1b5637ac2a24cff9bf21ea81e45335086ac52c0b4c717d6d
   languageName: node
   linkType: hard
 
@@ -21743,32 +21894,32 @@ __metadata:
   linkType: hard
 
 "upath2@npm:^3.1.13":
-  version: 3.1.19
-  resolution: "upath2@npm:3.1.19"
+  version: 3.1.20
+  resolution: "upath2@npm:3.1.20"
   dependencies:
     "@types/node": "npm:*"
-    path-is-network-drive: "npm:^1.0.20"
-    path-strip-sep: "npm:^1.0.17"
+    path-is-network-drive: "npm:^1.0.21"
+    path-strip-sep: "npm:^1.0.18"
     tslib: "npm:^2"
-  checksum: 10c0/018655237195e0b61abf1e6e3ced1083c7c3d12078fa96bdb5c7f12197023e80665bc04d3cbb6728981aed572f1de00f7093ab34a3dbefab088d727567d5784c
+  checksum: 10c0/17143cd2a9596c793b9d1a12396fc26c87cbe07d305c0d3617c489c5c3ff8f148d0a9bac57ef5171755ec2321032a0f4ea639ce554e25dc97a7bca47f0c453e1
   languageName: node
   linkType: hard
 
-"update-browserslist-db@npm:^1.0.16":
-  version: 1.0.16
-  resolution: "update-browserslist-db@npm:1.0.16"
+"update-browserslist-db@npm:^1.1.0":
+  version: 1.1.1
+  resolution: "update-browserslist-db@npm:1.1.1"
   dependencies:
-    escalade: "npm:^3.1.2"
-    picocolors: "npm:^1.0.1"
+    escalade: "npm:^3.2.0"
+    picocolors: "npm:^1.1.0"
   peerDependencies:
     browserslist: ">= 4.21.0"
   bin:
     update-browserslist-db: cli.js
-  checksum: 10c0/5995399fc202adbb51567e4810e146cdf7af630a92cc969365a099150cb00597e425cc14987ca7080b09a4d0cfd2a3de53fbe72eebff171aed7f9bb81f9bf405
+  checksum: 10c0/536a2979adda2b4be81b07e311bd2f3ad5e978690987956bc5f514130ad50cac87cd22c710b686d79731e00fbee8ef43efe5fcd72baa241045209195d43dcc80
   languageName: node
   linkType: hard
 
-"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1":
+"uri-js@npm:^4.2.2":
   version: 4.4.1
   resolution: "uri-js@npm:4.4.1"
   dependencies:
@@ -21826,12 +21977,12 @@ __metadata:
   linkType: hard
 
 "url@npm:^0.11.3":
-  version: 0.11.3
-  resolution: "url@npm:0.11.3"
+  version: 0.11.4
+  resolution: "url@npm:0.11.4"
   dependencies:
     punycode: "npm:^1.4.1"
-    qs: "npm:^6.11.2"
-  checksum: 10c0/7546b878ee7927cfc62ca21dbe2dc395cf70e889c3488b2815bf2c63355cb3c7db555128176a01b0af6cccf265667b6fd0b4806de00cb71c143c53986c08c602
+    qs: "npm:^6.12.3"
+  checksum: 10c0/cc93405ae4a9b97a2aa60ca67f1cb1481c0221cb4725a7341d149be5e2f9cfda26fd432d64dbbec693d16593b68b8a46aad8e5eab21f814932134c9d8620c662
   languageName: node
   linkType: hard
 
@@ -22051,12 +22202,12 @@ __metadata:
   linkType: hard
 
 "watchpack@npm:^2.4.1":
-  version: 2.4.1
-  resolution: "watchpack@npm:2.4.1"
+  version: 2.4.2
+  resolution: "watchpack@npm:2.4.2"
   dependencies:
     glob-to-regexp: "npm:^0.4.1"
     graceful-fs: "npm:^4.1.2"
-  checksum: 10c0/c694de0a61004e587a8a0fdc9cfec20ee692c52032d9ab2c2e99969a37fdab9e6e1bd3164ed506f9a13f7c83e65563d563e0d6b87358470cdb7309b83db78683
+  checksum: 10c0/ec60a5f0e9efaeca0102fd9126346b3b2d523e01c34030d3fddf5813a7125765121ebdc2552981136dcd2c852deb1af0b39340f2fcc235f292db5399d0283577
   languageName: node
   linkType: hard
 
@@ -22202,10 +22353,9 @@ __metadata:
   linkType: hard
 
 "webpack@npm:^5.58.1":
-  version: 5.92.1
-  resolution: "webpack@npm:5.92.1"
+  version: 5.95.0
+  resolution: "webpack@npm:5.95.0"
   dependencies:
-    "@types/eslint-scope": "npm:^3.7.3"
     "@types/estree": "npm:^1.0.5"
     "@webassemblyjs/ast": "npm:^1.12.1"
     "@webassemblyjs/wasm-edit": "npm:^1.12.1"
@@ -22214,7 +22364,7 @@ __metadata:
     acorn-import-attributes: "npm:^1.9.5"
     browserslist: "npm:^4.21.10"
     chrome-trace-event: "npm:^1.0.2"
-    enhanced-resolve: "npm:^5.17.0"
+    enhanced-resolve: "npm:^5.17.1"
     es-module-lexer: "npm:^1.2.1"
     eslint-scope: "npm:5.1.1"
     events: "npm:^3.2.0"
@@ -22234,7 +22384,7 @@ __metadata:
       optional: true
   bin:
     webpack: bin/webpack.js
-  checksum: 10c0/43ca7c76b9c1005bd85f05303d048f918bac10276a209e3ef5e359353fbfef4e5fcee876265e6bc305bf5ef326576e02df63bc7e5af878fb7f06d7e1795b811a
+  checksum: 10c0/b9e6d0f8ebcbf0632494ac0b90fe4acb8f4a9b83f7ace4a67a15545a36fe58599c912ab58e625e1bf58ab3b0916c75fe99da6196d412ee0cab0b5065edd84238
   languageName: node
   linkType: hard
 
@@ -22323,11 +22473,11 @@ __metadata:
   linkType: hard
 
 "which-builtin-type@npm:^1.1.3":
-  version: 1.1.3
-  resolution: "which-builtin-type@npm:1.1.3"
+  version: 1.1.4
+  resolution: "which-builtin-type@npm:1.1.4"
   dependencies:
-    function.prototype.name: "npm:^1.1.5"
-    has-tostringtag: "npm:^1.0.0"
+    function.prototype.name: "npm:^1.1.6"
+    has-tostringtag: "npm:^1.0.2"
     is-async-function: "npm:^2.0.0"
     is-date-object: "npm:^1.0.5"
     is-finalizationregistry: "npm:^1.0.2"
@@ -22336,13 +22486,13 @@ __metadata:
     is-weakref: "npm:^1.0.2"
     isarray: "npm:^2.0.5"
     which-boxed-primitive: "npm:^1.0.2"
-    which-collection: "npm:^1.0.1"
-    which-typed-array: "npm:^1.1.9"
-  checksum: 10c0/2b7b234df3443b52f4fbd2b65b731804de8d30bcc4210ec84107ef377a81923cea7f2763b7fb78b394175cea59118bf3c41b9ffd2d643cb1d748ef93b33b6bd4
+    which-collection: "npm:^1.0.2"
+    which-typed-array: "npm:^1.1.15"
+  checksum: 10c0/a4a76d20d869a81b1dbb4adea31edc7e6c1a4466d3ab7c2cd757c9219d48d3723b04076c85583257b0f0f8e3ebe5af337248b8ceed57b9051cb97bce5bd881d1
   languageName: node
   linkType: hard
 
-"which-collection@npm:^1.0.1":
+"which-collection@npm:^1.0.1, which-collection@npm:^1.0.2":
   version: 1.0.2
   resolution: "which-collection@npm:1.0.2"
   dependencies:
@@ -22361,7 +22511,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9":
+"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2":
   version: 1.1.15
   resolution: "which-typed-array@npm:1.1.15"
   dependencies:
@@ -22451,10 +22601,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"workerpool@npm:6.2.1":
-  version: 6.2.1
-  resolution: "workerpool@npm:6.2.1"
-  checksum: 10c0/f0efd2d74eafd58eaeb36d7d85837d080f75c52b64893cff317b66257dd308e5c9f85ef0b12904f6c7f24ed2365bc3cfeba1f1d16aa736d84d6ef8156ae37c80
+"workerpool@npm:^6.5.1":
+  version: 6.5.1
+  resolution: "workerpool@npm:6.5.1"
+  checksum: 10c0/58e8e969782292cb3a7bfba823f1179a7615250a0cefb4841d5166234db1880a3d0fe83a31dd8d648329ec92c2d0cd1890ad9ec9e53674bb36ca43e9753cdeac
   languageName: node
   linkType: hard
 
@@ -22585,7 +22735,22 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ws@npm:^8.13.0, ws@npm:~8.17.1":
+"ws@npm:^8.13.0":
+  version: 8.18.0
+  resolution: "ws@npm:8.18.0"
+  peerDependencies:
+    bufferutil: ^4.0.1
+    utf-8-validate: ">=5.0.2"
+  peerDependenciesMeta:
+    bufferutil:
+      optional: true
+    utf-8-validate:
+      optional: true
+  checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06
+  languageName: node
+  linkType: hard
+
+"ws@npm:~8.17.1":
   version: 8.17.1
   resolution: "ws@npm:8.17.1"
   peerDependencies:
@@ -22664,10 +22829,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"xmlhttprequest-ssl@npm:~2.0.0":
-  version: 2.0.0
-  resolution: "xmlhttprequest-ssl@npm:2.0.0"
-  checksum: 10c0/b64ab371459bd5e3a4827e3c7535759047d285fd310aea6fd028973d547133f3be0d473c1fdae9f14d89bf509267759198ae1fbe89802079a7e217ddd990d734
+"xmlhttprequest-ssl@npm:~2.1.1":
+  version: 2.1.1
+  resolution: "xmlhttprequest-ssl@npm:2.1.1"
+  checksum: 10c0/1cef48c992676d117b1cfeb5636758c33dbd887d72bc9668ebf7d6d0c7d66ed8ea649442913a52aed3996deb9e92588d7405dbdb2e9d19cf801800ab175549fc
   languageName: node
   linkType: hard
 
@@ -22720,14 +22885,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"yargs-parser@npm:20.2.4":
-  version: 20.2.4
-  resolution: "yargs-parser@npm:20.2.4"
-  checksum: 10c0/08dc341f0b9f940c2fffc1d1decf3be00e28cabd2b578a694901eccc7dcd10577f10c6aa1b040fdd9a68b2042515a60f18476543bccacf9f3ce2c8534cd87435
-  languageName: node
-  linkType: hard
-
-"yargs-parser@npm:20.x, yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3":
+"yargs-parser@npm:20.x, yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3, yargs-parser@npm:^20.2.9":
   version: 20.2.9
   resolution: "yargs-parser@npm:20.2.9"
   checksum: 10c0/0685a8e58bbfb57fab6aefe03c6da904a59769bd803a722bb098bd5b0f29d274a1357762c7258fb487512811b8063fb5d2824a3415a0a4540598335b3b086c72
@@ -22767,7 +22925,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"yargs-unparser@npm:2.0.0":
+"yargs-unparser@npm:^2.0.0":
   version: 2.0.0
   resolution: "yargs-unparser@npm:2.0.0"
   dependencies:
@@ -22779,21 +22937,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"yargs@npm:16.2.0, yargs@npm:^16.2.0":
-  version: 16.2.0
-  resolution: "yargs@npm:16.2.0"
-  dependencies:
-    cliui: "npm:^7.0.2"
-    escalade: "npm:^3.1.1"
-    get-caller-file: "npm:^2.0.5"
-    require-directory: "npm:^2.1.1"
-    string-width: "npm:^4.2.0"
-    y18n: "npm:^5.0.5"
-    yargs-parser: "npm:^20.2.2"
-  checksum: 10c0/b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651
-  languageName: node
-  linkType: hard
-
 "yargs@npm:^11.0.0":
   version: 11.1.1
   resolution: "yargs@npm:11.1.1"
@@ -22833,6 +22976,21 @@ __metadata:
   languageName: node
   linkType: hard
 
+"yargs@npm:^16.2.0":
+  version: 16.2.0
+  resolution: "yargs@npm:16.2.0"
+  dependencies:
+    cliui: "npm:^7.0.2"
+    escalade: "npm:^3.1.1"
+    get-caller-file: "npm:^2.0.5"
+    require-directory: "npm:^2.1.1"
+    string-width: "npm:^4.2.0"
+    y18n: "npm:^5.0.5"
+    yargs-parser: "npm:^20.2.2"
+  checksum: 10c0/b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651
+  languageName: node
+  linkType: hard
+
 "yargs@npm:^17.0.0, yargs@npm:^17.4.0":
   version: 17.7.2
   resolution: "yargs@npm:17.7.2"