diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..76108e7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+# Node_Moludes
+/stix-modeler-app/node_modules
+
+# Distribution
+/stix-modeler-app/dist/
+
+# Schemas
+/stix-modeler-app/schemas/*.json
\ No newline at end of file
diff --git a/README.md b/README.md
index c7bed69..0ec3517 100644
--- a/README.md
+++ b/README.md
@@ -3,10 +3,7 @@
This is a fork of the [STIX Modeler](https://github.com/STIX-Modeler/UI/tree/develop), originally created by Jason Minnick
## Overview
-A React-based user interface tool for visualizing, creating, and modifying STIX 2.1 bundles.
-
-This material is based upon work supported by the U.S. Department of Homeland Security / Cybersecurity and Infrastructure Security Agency. Any views and conclusions contained on this page are those of the authors and should not be interpreted as necessarily representing the official policies, either
-expressed or implied, of the U.S. Department of Homeland Security / Cybersecurity and Infrastructure Security Agency.
+A React-based user interface tool for visualizing, creating, and modifying STIX 2.1 bundles
## New Features
- Define custom STIX Domain Objects (SDO) using schemas
@@ -19,7 +16,38 @@ expressed or implied, of the U.S. Department of Homeland Security / Cybersecurit
This modeler was developed in and optimized for use with node v20.11.1 and npm 10.2.4
-Earlier versions of node may not be supported
+Other versions of node may not be supported
+
+All listed third-party dependencies grant use, modification, and distribution rights under the MIT License.
+
+## Third-Party Dependencies
+- "@vitejs/plugin-react": "5.0.4",
+- "classnames": "2.5.1",
+- "d3-hierarchy": "3.1.2",
+- "deepmerge": "4.3.1",
+- "lodash": "4.17.21",
+- "mobx": "6.15.0",
+- "mobx-react": "9.2.1",
+- "moment": "2.30.1",
+- "prop-types": "15.8.1",
+- "rc-slider": "11.1.9",
+- "react": "19.2.0",
+- "react-datepicker": "8.7.0",
+- "react-dom": "19.2.0",
+- "react-tooltip": "5.29.1",
+- "reactflow": "11.11.4",
+- "sass": "1.93.2",
+- "uuid": "13.0.0",
+- "vite": "7.1.9"
+
+## Third-Party Development Dependencies
+- "@eslint/js": "9.37.0",
+- "eslint": "9.37.0",
+- "globals": "16.4.0",
+- "jsdom": "27.0.0",
+- "typescript-eslint": "8.46.0",
+- "vitest": "3.2.4"
+
# Installation and Use
@@ -43,6 +71,13 @@ Earlier versions of node may not be supported
- Added functionality for creating new Group SDOs via clicking and selecting SDOs
- Updated dependencies and removed unused dependencies
- Upgraded handling of default field and relationship values
+- Added bundle validation for required SDO properties
+- Added bundle file export
+- Added vitest testing infrastructure
+- Added unknown object and property handling
+- Added automatic schema loading
+- Added UI configuration via config file
+- Updated STIX schemas to latest versions
## Bug Fixes
@@ -51,6 +86,10 @@ Earlier versions of node may not be supported
- Fixed implied fields based on relationships between nodes (e.g. "created_by")
- Fixed import and modification of nodes with "hashes" fields
- Added ability to delete external_reference objects from external_references fields
+- Fixed inclusion of invalid fields in relationship objects
+- Fixed extension definition inconsistency
+
+
## Definitions
@@ -88,8 +127,6 @@ Specific vocab notes
- labels: there are placeholder values located in definition-adapters/Base.js. This can easily be updated to reflect your sharing group or company's standard list for each object or even hidden with the `control` property.
# Quality Assurance
-## Style Guide
-The source code follows a modification of the [Airbnb Javascript Style Guide](https://airbnb.io/javascript/react/)
## Automated Tools
The project uses eslint for quality assurance and styling.
- See current code quality issues: `npm run lint`
diff --git a/STIX-Modeler_User_Guide.pdf b/STIX-Modeler_User_Guide.pdf
new file mode 100644
index 0000000..da01291
Binary files /dev/null and b/STIX-Modeler_User_Guide.pdf differ
diff --git a/app/package-lock.json b/app/package-lock.json
deleted file mode 100644
index 5d97e4f..0000000
--- a/app/package-lock.json
+++ /dev/null
@@ -1,5515 +0,0 @@
-{
- "name": "stix-modeler-app",
- "version": "1.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "stix-modeler-app",
- "version": "1.0.0",
- "dependencies": {
- "classnames": "^2.5.1",
- "deepmerge": "^4.3.1",
- "lodash": "^4.17.21",
- "mobx": "^6.12.0",
- "mobx-react": "^9.1.0",
- "moment": "^2.30.1",
- "prop-types": "^15.8.1",
- "rc-slider": "^10.5.0",
- "react": "^18.2.0",
- "react-datepicker": "^6.1.0",
- "react-dom": "^18.2.0",
- "react-tooltip": "^5.26.3",
- "reactflow": "^11.10.4",
- "sass": "^1.71.0",
- "uuid": "^9.0.1"
- },
- "devDependencies": {
- "@types/react": "^18.2.55",
- "@types/react-dom": "^18.2.19",
- "@vitejs/plugin-react": "^4.2.1",
- "eslint": "^8.57.0",
- "eslint-config-airbnb": "^19.0.4",
- "eslint-plugin-import": "^2.29.1",
- "eslint-plugin-jsx-a11y": "^6.8.0",
- "eslint-plugin-react": "^7.34.1",
- "eslint-plugin-react-hooks": "^4.6.0",
- "eslint-plugin-react-refresh": "^0.4.5",
- "vite": "^5.2.6"
- }
- },
- "node_modules/@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@ampproject/remapping": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
- "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
- "dev": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/code-frame": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
- "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
- "dev": true,
- "dependencies": {
- "@babel/highlight": "^7.23.4",
- "chalk": "^2.4.2"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz",
- "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz",
- "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==",
- "dev": true,
- "dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.23.5",
- "@babel/generator": "^7.23.6",
- "@babel/helper-compilation-targets": "^7.23.6",
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helpers": "^7.23.9",
- "@babel/parser": "^7.23.9",
- "@babel/template": "^7.23.9",
- "@babel/traverse": "^7.23.9",
- "@babel/types": "^7.23.9",
- "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/generator": {
- "version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
- "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.23.6",
- "@jridgewell/gen-mapping": "^0.3.2",
- "@jridgewell/trace-mapping": "^0.3.17",
- "jsesc": "^2.5.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
- "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
- "dev": true,
- "dependencies": {
- "@babel/compat-data": "^7.23.5",
- "@babel/helper-validator-option": "^7.23.5",
- "browserslist": "^4.22.2",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-environment-visitor": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
- "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-function-name": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
- "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
- "dev": true,
- "dependencies": {
- "@babel/template": "^7.22.15",
- "@babel/types": "^7.23.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-hoist-variables": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
- "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
- "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.22.15"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
- "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
- "dev": true,
- "dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-simple-access": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/helper-validator-identifier": "^7.22.20"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
- "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-simple-access": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
- "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-split-export-declaration": {
- "version": "7.22.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
- "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
- "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
- "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
- "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz",
- "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==",
- "dev": true,
- "dependencies": {
- "@babel/template": "^7.23.9",
- "@babel/traverse": "^7.23.9",
- "@babel/types": "^7.23.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
- "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
- "dev": true,
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.22.20",
- "chalk": "^2.4.2",
- "js-tokens": "^4.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz",
- "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==",
- "dev": true,
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-self": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz",
- "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-source": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz",
- "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz",
- "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz",
- "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.23.5",
- "@babel/parser": "^7.23.9",
- "@babel/types": "^7.23.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz",
- "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.23.5",
- "@babel/generator": "^7.23.6",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-hoist-variables": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.23.9",
- "@babel/types": "^7.23.9",
- "debug": "^4.3.1",
- "globals": "^11.1.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz",
- "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==",
- "dev": true,
- "dependencies": {
- "@babel/helper-string-parser": "^7.23.4",
- "@babel/helper-validator-identifier": "^7.22.20",
- "to-fast-properties": "^2.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
- "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
- "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
- "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
- "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
- "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
- "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
- "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
- "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
- "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
- "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
- "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
- "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
- "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
- "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
- "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
- "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
- "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
- "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
- "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
- "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
- "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
- "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
- "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "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,
- "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.10.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
- "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
- "dev": true,
- "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,
- "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/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "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,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/@floating-ui/core": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz",
- "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==",
- "dependencies": {
- "@floating-ui/utils": "^0.2.1"
- }
- },
- "node_modules/@floating-ui/dom": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz",
- "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==",
- "dependencies": {
- "@floating-ui/core": "^1.0.0",
- "@floating-ui/utils": "^0.2.0"
- }
- },
- "node_modules/@floating-ui/react": {
- "version": "0.26.9",
- "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.9.tgz",
- "integrity": "sha512-p86wynZJVEkEq2BBjY/8p2g3biQ6TlgT4o/3KgFKyTWoJLU1GZ8wpctwRqtkEl2tseYA+kw7dBAIDFcednfI5w==",
- "dependencies": {
- "@floating-ui/react-dom": "^2.0.8",
- "@floating-ui/utils": "^0.2.1",
- "tabbable": "^6.0.1"
- },
- "peerDependencies": {
- "react": ">=16.8.0",
- "react-dom": ">=16.8.0"
- }
- },
- "node_modules/@floating-ui/react-dom": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz",
- "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==",
- "dependencies": {
- "@floating-ui/dom": "^1.6.1"
- },
- "peerDependencies": {
- "react": ">=16.8.0",
- "react-dom": ">=16.8.0"
- }
- },
- "node_modules/@floating-ui/utils": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz",
- "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
- },
- "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==",
- "dev": true,
- "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,
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/object-schema": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
- "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
- "dev": true
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
- "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
- "dev": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "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==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "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==",
- "dev": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.22",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz",
- "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==",
- "dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "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==",
- "dev": true,
- "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==",
- "dev": true,
- "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==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@reactflow/background": {
- "version": "11.3.9",
- "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.9.tgz",
- "integrity": "sha512-byj/G9pEC8tN0wT/ptcl/LkEP/BBfa33/SvBkqE4XwyofckqF87lKp573qGlisfnsijwAbpDlf81PuFL41So4Q==",
- "dependencies": {
- "@reactflow/core": "11.10.4",
- "classcat": "^5.0.3",
- "zustand": "^4.4.1"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
- "node_modules/@reactflow/controls": {
- "version": "11.2.9",
- "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.9.tgz",
- "integrity": "sha512-e8nWplbYfOn83KN1BrxTXS17+enLyFnjZPbyDgHSRLtI5ZGPKF/8iRXV+VXb2LFVzlu4Wh3la/pkxtfP/0aguA==",
- "dependencies": {
- "@reactflow/core": "11.10.4",
- "classcat": "^5.0.3",
- "zustand": "^4.4.1"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
- "node_modules/@reactflow/core": {
- "version": "11.10.4",
- "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.10.4.tgz",
- "integrity": "sha512-j3i9b2fsTX/sBbOm+RmNzYEFWbNx4jGWGuGooh2r1jQaE2eV+TLJgiG/VNOp0q5mBl9f6g1IXs3Gm86S9JfcGw==",
- "dependencies": {
- "@types/d3": "^7.4.0",
- "@types/d3-drag": "^3.0.1",
- "@types/d3-selection": "^3.0.3",
- "@types/d3-zoom": "^3.0.1",
- "classcat": "^5.0.3",
- "d3-drag": "^3.0.0",
- "d3-selection": "^3.0.0",
- "d3-zoom": "^3.0.0",
- "zustand": "^4.4.1"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
- "node_modules/@reactflow/minimap": {
- "version": "11.7.9",
- "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.9.tgz",
- "integrity": "sha512-le95jyTtt3TEtJ1qa7tZ5hyM4S7gaEQkW43cixcMOZLu33VAdc2aCpJg/fXcRrrf7moN2Mbl9WIMNXUKsp5ILA==",
- "dependencies": {
- "@reactflow/core": "11.10.4",
- "@types/d3-selection": "^3.0.3",
- "@types/d3-zoom": "^3.0.1",
- "classcat": "^5.0.3",
- "d3-selection": "^3.0.0",
- "d3-zoom": "^3.0.0",
- "zustand": "^4.4.1"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
- "node_modules/@reactflow/node-resizer": {
- "version": "2.2.9",
- "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.9.tgz",
- "integrity": "sha512-HfickMm0hPDIHt9qH997nLdgLt0kayQyslKE0RS/GZvZ4UMQJlx/NRRyj5y47Qyg0NnC66KYOQWDM9LLzRTnUg==",
- "dependencies": {
- "@reactflow/core": "11.10.4",
- "classcat": "^5.0.4",
- "d3-drag": "^3.0.0",
- "d3-selection": "^3.0.0",
- "zustand": "^4.4.1"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
- "node_modules/@reactflow/node-toolbar": {
- "version": "1.3.9",
- "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.9.tgz",
- "integrity": "sha512-VmgxKmToax4sX1biZ9LXA7cj/TBJ+E5cklLGwquCCVVxh+lxpZGTBF3a5FJGVHiUNBBtFsC8ldcSZIK4cAlQww==",
- "dependencies": {
- "@reactflow/core": "11.10.4",
- "classcat": "^5.0.3",
- "zustand": "^4.4.1"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz",
- "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz",
- "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz",
- "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz",
- "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz",
- "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz",
- "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz",
- "integrity": "sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz",
- "integrity": "sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz",
- "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz",
- "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz",
- "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz",
- "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz",
- "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz",
- "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz",
- "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz",
- "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@types/babel__core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
- "dev": true,
- "dependencies": {
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "node_modules/@types/babel__generator": {
- "version": "7.6.8",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
- "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
- "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
- "dev": true,
- "dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__traverse": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz",
- "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.20.7"
- }
- },
- "node_modules/@types/d3": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",
- "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",
- "dependencies": {
- "@types/d3-array": "*",
- "@types/d3-axis": "*",
- "@types/d3-brush": "*",
- "@types/d3-chord": "*",
- "@types/d3-color": "*",
- "@types/d3-contour": "*",
- "@types/d3-delaunay": "*",
- "@types/d3-dispatch": "*",
- "@types/d3-drag": "*",
- "@types/d3-dsv": "*",
- "@types/d3-ease": "*",
- "@types/d3-fetch": "*",
- "@types/d3-force": "*",
- "@types/d3-format": "*",
- "@types/d3-geo": "*",
- "@types/d3-hierarchy": "*",
- "@types/d3-interpolate": "*",
- "@types/d3-path": "*",
- "@types/d3-polygon": "*",
- "@types/d3-quadtree": "*",
- "@types/d3-random": "*",
- "@types/d3-scale": "*",
- "@types/d3-scale-chromatic": "*",
- "@types/d3-selection": "*",
- "@types/d3-shape": "*",
- "@types/d3-time": "*",
- "@types/d3-time-format": "*",
- "@types/d3-timer": "*",
- "@types/d3-transition": "*",
- "@types/d3-zoom": "*"
- }
- },
- "node_modules/@types/d3-array": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
- "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="
- },
- "node_modules/@types/d3-axis": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz",
- "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",
- "dependencies": {
- "@types/d3-selection": "*"
- }
- },
- "node_modules/@types/d3-brush": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz",
- "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",
- "dependencies": {
- "@types/d3-selection": "*"
- }
- },
- "node_modules/@types/d3-chord": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz",
- "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="
- },
- "node_modules/@types/d3-color": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
- "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="
- },
- "node_modules/@types/d3-contour": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz",
- "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",
- "dependencies": {
- "@types/d3-array": "*",
- "@types/geojson": "*"
- }
- },
- "node_modules/@types/d3-delaunay": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
- "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="
- },
- "node_modules/@types/d3-dispatch": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz",
- "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ=="
- },
- "node_modules/@types/d3-drag": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz",
- "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",
- "dependencies": {
- "@types/d3-selection": "*"
- }
- },
- "node_modules/@types/d3-dsv": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",
- "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="
- },
- "node_modules/@types/d3-ease": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
- "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="
- },
- "node_modules/@types/d3-fetch": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",
- "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
- "dependencies": {
- "@types/d3-dsv": "*"
- }
- },
- "node_modules/@types/d3-force": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz",
- "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA=="
- },
- "node_modules/@types/d3-format": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz",
- "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="
- },
- "node_modules/@types/d3-geo": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz",
- "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
- "dependencies": {
- "@types/geojson": "*"
- }
- },
- "node_modules/@types/d3-hierarchy": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.6.tgz",
- "integrity": "sha512-qlmD/8aMk5xGorUvTUWHCiumvgaUXYldYjNVOWtYoTYY/L+WwIEAmJxUmTgr9LoGNG0PPAOmqMDJVDPc7DOpPw=="
- },
- "node_modules/@types/d3-interpolate": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
- "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
- "dependencies": {
- "@types/d3-color": "*"
- }
- },
- "node_modules/@types/d3-path": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz",
- "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ=="
- },
- "node_modules/@types/d3-polygon": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",
- "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="
- },
- "node_modules/@types/d3-quadtree": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",
- "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="
- },
- "node_modules/@types/d3-random": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz",
- "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="
- },
- "node_modules/@types/d3-scale": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz",
- "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==",
- "dependencies": {
- "@types/d3-time": "*"
- }
- },
- "node_modules/@types/d3-scale-chromatic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz",
- "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw=="
- },
- "node_modules/@types/d3-selection": {
- "version": "3.0.10",
- "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz",
- "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg=="
- },
- "node_modules/@types/d3-shape": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz",
- "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==",
- "dependencies": {
- "@types/d3-path": "*"
- }
- },
- "node_modules/@types/d3-time": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz",
- "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw=="
- },
- "node_modules/@types/d3-time-format": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",
- "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="
- },
- "node_modules/@types/d3-timer": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
- "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="
- },
- "node_modules/@types/d3-transition": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz",
- "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==",
- "dependencies": {
- "@types/d3-selection": "*"
- }
- },
- "node_modules/@types/d3-zoom": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz",
- "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==",
- "dependencies": {
- "@types/d3-interpolate": "*",
- "@types/d3-selection": "*"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
- },
- "node_modules/@types/geojson": {
- "version": "7946.0.14",
- "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
- "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg=="
- },
- "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
- },
- "node_modules/@types/prop-types": {
- "version": "15.7.11",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
- "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==",
- "devOptional": true
- },
- "node_modules/@types/react": {
- "version": "18.2.56",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.56.tgz",
- "integrity": "sha512-NpwHDMkS/EFZF2dONFQHgkPRwhvgq/OAvIaGQzxGSBmaeR++kTg6njr15Vatz0/2VcCEwJQFi6Jf4Q0qBu0rLA==",
- "devOptional": true,
- "dependencies": {
- "@types/prop-types": "*",
- "@types/scheduler": "*",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "18.2.19",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz",
- "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==",
- "dev": true,
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/scheduler": {
- "version": "0.16.8",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
- "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
- "devOptional": true
- },
- "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
- },
- "node_modules/@vitejs/plugin-react": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz",
- "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.23.5",
- "@babel/plugin-transform-react-jsx-self": "^7.23.3",
- "@babel/plugin-transform-react-jsx-source": "^7.23.3",
- "@types/babel__core": "^7.20.5",
- "react-refresh": "^0.14.0"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "peerDependencies": {
- "vite": "^4.2.0 || ^5.0.0"
- }
- },
- "node_modules/acorn": {
- "version": "8.11.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
- "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
- "dev": true,
- "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,
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "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,
- "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/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/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/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- },
- "node_modules/aria-query": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
- "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
- "dev": true,
- "dependencies": {
- "dequal": "^2.0.3"
- }
- },
- "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,
- "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.7",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
- "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "is-string": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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,
- "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,
- "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,
- "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,
- "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,
- "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.3",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz",
- "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.1.0",
- "es-shim-unscopables": "^1.0.2"
- }
- },
- "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,
- "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/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
- },
- "node_modules/asynciterator.prototype": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
- "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.3"
- }
- },
- "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==",
- "dev": true,
- "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.7.0",
- "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz",
- "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/axobject-query": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz",
- "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==",
- "dev": true,
- "dependencies": {
- "dequal": "^2.0.3"
- }
- },
- "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==",
- "dev": true
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "engines": {
- "node": ">=8"
- }
- },
- "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==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.23.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
- "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
- "dev": true,
- "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.30001587",
- "electron-to-chromium": "^1.4.668",
- "node-releases": "^2.0.14",
- "update-browserslist-db": "^1.0.13"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "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==",
- "dev": true,
- "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/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001588",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz",
- "integrity": "sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==",
- "dev": true,
- "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/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "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/chokidar/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/classcat": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.4.tgz",
- "integrity": "sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g=="
- },
- "node_modules/classnames": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
- "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
- },
- "node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "node_modules/confusing-browser-globals": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
- "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
- "dev": true
- },
- "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==",
- "dev": true
- },
- "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==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "devOptional": true
- },
- "node_modules/d3-color": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
- "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-dispatch": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
- "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-drag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
- "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
- "dependencies": {
- "d3-dispatch": "1 - 3",
- "d3-selection": "3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-ease": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
- "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-interpolate": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
- "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
- "dependencies": {
- "d3-color": "1 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-selection": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
- "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-timer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
- "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-transition": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
- "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
- "dependencies": {
- "d3-color": "1 - 3",
- "d3-dispatch": "1 - 3",
- "d3-ease": "1 - 3",
- "d3-interpolate": "1 - 3",
- "d3-timer": "1 - 3"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "d3-selection": "2 - 3"
- }
- },
- "node_modules/d3-zoom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
- "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
- "dependencies": {
- "d3-dispatch": "1 - 3",
- "d3-drag": "2 - 3",
- "d3-interpolate": "1 - 3",
- "d3-selection": "2 - 3",
- "d3-transition": "2 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "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
- },
- "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,
- "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,
- "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,
- "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": "3.3.1",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.3.1.tgz",
- "integrity": "sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/kossnocorp"
- }
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "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
- },
- "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/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==",
- "dev": true,
- "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-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,
- "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/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.674",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.674.tgz",
- "integrity": "sha512-jZtIZxv9FlwTLX5kVZStUtXZywhEi3vqvY6iEzJnc57cNgHFQ5JCczElTs/062v6ODTT7eX8ZOTqQcxa3nMUWQ==",
- "dev": true
- },
- "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
- },
- "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,
- "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==",
- "dev": true,
- "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==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-iterator-helpers": {
- "version": "1.0.17",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz",
- "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==",
- "dev": true,
- "dependencies": {
- "asynciterator.prototype": "^1.0.0",
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.4",
- "es-errors": "^1.3.0",
- "es-set-tostringtag": "^2.0.2",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "globalthis": "^1.0.3",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.7",
- "iterator.prototype": "^1.1.2",
- "safe-array-concat": "^1.1.0"
- },
- "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,
- "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,
- "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,
- "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,
- "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/esbuild": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
- "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
- "dev": true,
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.20.2",
- "@esbuild/android-arm": "0.20.2",
- "@esbuild/android-arm64": "0.20.2",
- "@esbuild/android-x64": "0.20.2",
- "@esbuild/darwin-arm64": "0.20.2",
- "@esbuild/darwin-x64": "0.20.2",
- "@esbuild/freebsd-arm64": "0.20.2",
- "@esbuild/freebsd-x64": "0.20.2",
- "@esbuild/linux-arm": "0.20.2",
- "@esbuild/linux-arm64": "0.20.2",
- "@esbuild/linux-ia32": "0.20.2",
- "@esbuild/linux-loong64": "0.20.2",
- "@esbuild/linux-mips64el": "0.20.2",
- "@esbuild/linux-ppc64": "0.20.2",
- "@esbuild/linux-riscv64": "0.20.2",
- "@esbuild/linux-s390x": "0.20.2",
- "@esbuild/linux-x64": "0.20.2",
- "@esbuild/netbsd-x64": "0.20.2",
- "@esbuild/openbsd-x64": "0.20.2",
- "@esbuild/sunos-x64": "0.20.2",
- "@esbuild/win32-arm64": "0.20.2",
- "@esbuild/win32-ia32": "0.20.2",
- "@esbuild/win32-x64": "0.20.2"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/eslint": {
- "version": "8.57.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
- "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
- "dev": true,
- "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-airbnb": {
- "version": "19.0.4",
- "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz",
- "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==",
- "dev": true,
- "dependencies": {
- "eslint-config-airbnb-base": "^15.0.0",
- "object.assign": "^4.1.2",
- "object.entries": "^1.1.5"
- },
- "engines": {
- "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "peerDependencies": {
- "eslint": "^7.32.0 || ^8.2.0",
- "eslint-plugin-import": "^2.25.3",
- "eslint-plugin-jsx-a11y": "^6.5.1",
- "eslint-plugin-react": "^7.28.0",
- "eslint-plugin-react-hooks": "^4.3.0"
- }
- },
- "node_modules/eslint-config-airbnb-base": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
- "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
- "dev": true,
- "dependencies": {
- "confusing-browser-globals": "^1.0.10",
- "object.assign": "^4.1.2",
- "object.entries": "^1.1.5",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- },
- "peerDependencies": {
- "eslint": "^7.32.0 || ^8.2.0",
- "eslint-plugin-import": "^2.25.2"
- }
- },
- "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,
- "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,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-import-resolver-node/node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
- "dev": true,
- "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-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,
- "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,
- "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,
- "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,
- "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,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint-plugin-jsx-a11y": {
- "version": "6.8.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz",
- "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.23.2",
- "aria-query": "^5.3.0",
- "array-includes": "^3.1.7",
- "array.prototype.flatmap": "^1.3.2",
- "ast-types-flow": "^0.0.8",
- "axe-core": "=4.7.0",
- "axobject-query": "^3.2.1",
- "damerau-levenshtein": "^1.0.8",
- "emoji-regex": "^9.2.2",
- "es-iterator-helpers": "^1.0.15",
- "hasown": "^2.0.0",
- "jsx-ast-utils": "^3.3.5",
- "language-tags": "^1.0.9",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.7",
- "object.fromentries": "^2.0.7"
- },
- "engines": {
- "node": ">=4.0"
- },
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
- }
- },
- "node_modules/eslint-plugin-react": {
- "version": "7.34.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz",
- "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==",
- "dev": true,
- "dependencies": {
- "array-includes": "^3.1.7",
- "array.prototype.findlast": "^1.2.4",
- "array.prototype.flatmap": "^1.3.2",
- "array.prototype.toreversed": "^1.1.2",
- "array.prototype.tosorted": "^1.1.3",
- "doctrine": "^2.1.0",
- "es-iterator-helpers": "^1.0.17",
- "estraverse": "^5.3.0",
- "jsx-ast-utils": "^2.4.1 || ^3.0.0",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.7",
- "object.fromentries": "^2.0.7",
- "object.hasown": "^1.1.3",
- "object.values": "^1.1.7",
- "prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.5",
- "semver": "^6.3.1",
- "string.prototype.matchall": "^4.0.10"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
- }
- },
- "node_modules/eslint-plugin-react-hooks": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
- "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
- "dev": true,
- "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-refresh": {
- "version": "0.4.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz",
- "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==",
- "dev": true,
- "peerDependencies": {
- "eslint": ">=7"
- }
- },
- "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,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "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,
- "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,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint/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==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "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/eslint/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==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/eslint/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==",
- "dev": true
- },
- "node_modules/eslint/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==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/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==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/eslint/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==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "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,
- "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/esquery": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
- "dev": true,
- "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,
- "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,
- "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==",
- "dev": true,
- "engines": {
- "node": ">=0.10.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==",
- "dev": true
- },
- "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
- },
- "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
- },
- "node_modules/fastq": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
- "dev": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "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,
- "dependencies": {
- "flat-cache": "^3.0.4"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "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,
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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,
- "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.2.9",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
- "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
- "dev": 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==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.3"
- }
- },
- "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==",
- "dev": true
- },
- "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==",
- "dev": true,
- "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,
- "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,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "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==",
- "dev": true,
- "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-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,
- "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/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "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": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "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==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true
- },
- "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,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/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==",
- "dev": true,
- "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==",
- "dev": true,
- "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==",
- "dev": true,
- "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==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "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,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/immutable": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz",
- "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw=="
- },
- "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,
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
- "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==",
- "dev": true,
- "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==",
- "dev": true
- },
- "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,
- "dependencies": {
- "es-errors": "^1.3.0",
- "hasown": "^2.0.0",
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "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,
- "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-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,
- "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,
- "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,
- "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==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.13.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
- "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
- "dev": true,
- "dependencies": {
- "hasown": "^2.0.0"
- },
- "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,
- "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,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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==",
- "dev": true,
- "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-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
- "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
- "dev": true,
- "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,
- "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,
- "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,
- "engines": {
- "node": ">=8"
- }
- },
- "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,
- "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.2",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
- "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
- "dev": true,
- "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,
- "dependencies": {
- "call-bind": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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,
- "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,
- "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==",
- "dev": true,
- "dependencies": {
- "which-typed-array": "^1.1.14"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakmap": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
- "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
- "dev": true,
- "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,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakset": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
- "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "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,
- "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/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": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": 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
- },
- "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
- },
- "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
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=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,
- "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/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,
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/language-subtag-registry": {
- "version": "0.3.22",
- "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
- "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==",
- "dev": true
- },
- "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,
- "dependencies": {
- "language-subtag-registry": "^0.3.20"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "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,
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "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,
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "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
- },
- "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==",
- "dev": true,
- "dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "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==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/mobx": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.12.0.tgz",
- "integrity": "sha512-Mn6CN6meXEnMa0a5u6a5+RKrqRedHBhZGd15AWLk9O6uFY4KYHzImdt8JI8WODo1bjTSRnwXhJox+FCUZhCKCQ==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mobx"
- }
- },
- "node_modules/mobx-react": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.1.0.tgz",
- "integrity": "sha512-DeDRTYw4AlgHw8xEXtiZdKKEnp+c5/jeUgTbTQXEqnAzfkrgYRWP3p3Nv3Whc2CEcM/mDycbDWGjxKokQdlffg==",
- "dependencies": {
- "mobx-react-lite": "^4.0.4"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mobx"
- },
- "peerDependencies": {
- "mobx": "^6.9.0",
- "react": "^16.8.0 || ^17 || ^18"
- },
- "peerDependenciesMeta": {
- "react-dom": {
- "optional": true
- },
- "react-native": {
- "optional": true
- }
- }
- },
- "node_modules/mobx-react-lite": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.0.5.tgz",
- "integrity": "sha512-StfB2wxE8imKj1f6T8WWPf4lVMx3cYH9Iy60bbKXEs21+HQ4tvvfIBZfSmMXgQAefi8xYEwQIz4GN9s0d2h7dg==",
- "dependencies": {
- "use-sync-external-store": "^1.2.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mobx"
- },
- "peerDependencies": {
- "mobx": "^6.9.0",
- "react": "^16.8.0 || ^17 || ^18"
- },
- "peerDependenciesMeta": {
- "react-dom": {
- "optional": true
- },
- "react-native": {
- "optional": true
- }
- }
- },
- "node_modules/moment": {
- "version": "2.30.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
- "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
- "engines": {
- "node": "*"
- }
- },
- "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==",
- "dev": true
- },
- "node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
- "dev": true,
- "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
- },
- "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==",
- "dev": true
- },
- "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/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-inspect": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
- "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
- "dev": true,
- "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,
- "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,
- "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.7",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
- "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.fromentries": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
- "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "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,
- "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.3",
- "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz",
- "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.values": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
- "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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==",
- "dev": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/optionator": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
- "dev": true,
- "dependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-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,
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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,
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/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==",
- "dev": true,
- "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==",
- "dev": true,
- "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==",
- "dev": true
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "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/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==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/postcss": {
- "version": "8.4.38",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
- "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
- "dev": true,
- "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"
- }
- ],
- "dependencies": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "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,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "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==",
- "dependencies": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.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,
- "engines": {
- "node": ">=6"
- }
- },
- "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==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/rc-slider": {
- "version": "10.5.0",
- "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.5.0.tgz",
- "integrity": "sha512-xiYght50cvoODZYI43v3Ylsqiw14+D7ELsgzR40boDZaya1HFa1Etnv9MDkQE8X/UrXAffwv2AcNAhslgYuDTw==",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.2.5",
- "rc-util": "^5.27.0"
- },
- "engines": {
- "node": ">=8.x"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/rc-util": {
- "version": "5.38.1",
- "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.38.1.tgz",
- "integrity": "sha512-e4ZMs7q9XqwTuhIK7zBIVFltUtMSjphuPPQXHoHlzRzNdOwUxDejo0Zls5HYaJfRKNURcsS/ceKVULlhjBrxng==",
- "dependencies": {
- "@babel/runtime": "^7.18.3",
- "react-is": "^18.2.0"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/rc-util/node_modules/react-is": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
- "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
- },
- "node_modules/react": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
- "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
- "dependencies": {
- "loose-envify": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-datepicker": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-6.1.0.tgz",
- "integrity": "sha512-8uz+hAOpvHqZGvD4Ky1hJ0/tLI4S9B0Gu9LV7LtLxRKXODs/xrxEay0aMVp7AW9iizTeImZh/6aA00fFaRZpJw==",
- "dependencies": {
- "@floating-ui/react": "^0.26.2",
- "classnames": "^2.2.6",
- "date-fns": "^3.3.1",
- "prop-types": "^15.7.2",
- "react-onclickoutside": "^6.13.0"
- },
- "peerDependencies": {
- "react": "^16.9.0 || ^17 || ^18",
- "react-dom": "^16.9.0 || ^17 || ^18"
- }
- },
- "node_modules/react-dom": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
- "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "scheduler": "^0.23.0"
- },
- "peerDependencies": {
- "react": "^18.2.0"
- }
- },
- "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=="
- },
- "node_modules/react-onclickoutside": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz",
- "integrity": "sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==",
- "funding": {
- "type": "individual",
- "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md"
- },
- "peerDependencies": {
- "react": "^15.5.x || ^16.x || ^17.x || ^18.x",
- "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x"
- }
- },
- "node_modules/react-refresh": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
- "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-tooltip": {
- "version": "5.26.3",
- "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.26.3.tgz",
- "integrity": "sha512-MpYAws8CEHUd/RC4GaDCdoceph/T4KHM5vS5Dbk8FOmLMvvIht2ymP2htWdrke7K6lqPO8rz8+bnwWUIXeDlzg==",
- "dependencies": {
- "@floating-ui/dom": "^1.6.1",
- "classnames": "^2.3.0"
- },
- "peerDependencies": {
- "react": ">=16.14.0",
- "react-dom": ">=16.14.0"
- }
- },
- "node_modules/reactflow": {
- "version": "11.10.4",
- "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.10.4.tgz",
- "integrity": "sha512-0CApYhtYicXEDg/x2kvUHiUk26Qur8lAtTtiSlptNKuyEuGti6P1y5cS32YGaUoDMoCqkm/m+jcKkfMOvSCVRA==",
- "dependencies": {
- "@reactflow/background": "11.3.9",
- "@reactflow/controls": "11.2.9",
- "@reactflow/core": "11.10.4",
- "@reactflow/minimap": "11.7.9",
- "@reactflow/node-resizer": "2.2.9",
- "@reactflow/node-toolbar": "1.3.9"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
- "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/reflect.getprototypeof": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz",
- "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.0.0",
- "get-intrinsic": "^1.2.3",
- "globalthis": "^1.0.3",
- "which-builtin-type": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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/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,
- "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/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,
- "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": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
- "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==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/rollup": {
- "version": "4.14.3",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz",
- "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==",
- "dev": true,
- "dependencies": {
- "@types/estree": "1.0.5"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.14.3",
- "@rollup/rollup-android-arm64": "4.14.3",
- "@rollup/rollup-darwin-arm64": "4.14.3",
- "@rollup/rollup-darwin-x64": "4.14.3",
- "@rollup/rollup-linux-arm-gnueabihf": "4.14.3",
- "@rollup/rollup-linux-arm-musleabihf": "4.14.3",
- "@rollup/rollup-linux-arm64-gnu": "4.14.3",
- "@rollup/rollup-linux-arm64-musl": "4.14.3",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3",
- "@rollup/rollup-linux-riscv64-gnu": "4.14.3",
- "@rollup/rollup-linux-s390x-gnu": "4.14.3",
- "@rollup/rollup-linux-x64-gnu": "4.14.3",
- "@rollup/rollup-linux-x64-musl": "4.14.3",
- "@rollup/rollup-win32-arm64-msvc": "4.14.3",
- "@rollup/rollup-win32-ia32-msvc": "4.14.3",
- "@rollup/rollup-win32-x64-msvc": "4.14.3",
- "fsevents": "~2.3.2"
- }
- },
- "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==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "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,
- "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-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,
- "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/sass": {
- "version": "1.71.0",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.0.tgz",
- "integrity": "sha512-HKKIKf49Vkxlrav3F/w6qRuPcmImGVbIXJ2I3Kg0VMA+3Bav+8yE9G5XmP5lMj6nl4OlqbPftGAscNaNu28b8w==",
- "dependencies": {
- "chokidar": ">=3.0.0 <4.0.0",
- "immutable": "^4.0.0",
- "source-map-js": ">=0.6.2 <2.0.0"
- },
- "bin": {
- "sass": "sass.js"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/scheduler": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
- "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
- "dependencies": {
- "loose-envify": "^1.1.0"
- }
- },
- "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,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/set-function-length": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz",
- "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==",
- "dev": true,
- "dependencies": {
- "define-data-property": "^1.1.2",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.3",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/set-function-name": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
- "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
- "dev": true,
- "dependencies": {
- "define-data-property": "^1.0.1",
- "functions-have-names": "^1.2.3",
- "has-property-descriptors": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "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==",
- "dev": true,
- "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==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz",
- "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.6",
- "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/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/string.prototype.matchall": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz",
- "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.5",
- "regexp.prototype.flags": "^1.5.0",
- "set-function-name": "^2.0.0",
- "side-channel": "^1.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,
- "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,
- "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,
- "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==",
- "dev": true,
- "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,
- "engines": {
- "node": ">=4"
- }
- },
- "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,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "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==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/tabbable": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
- "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="
- },
- "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
- },
- "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==",
- "dev": 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/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,
- "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,
- "dependencies": {
- "minimist": "^1.2.0"
- },
- "bin": {
- "json5": "lib/cli.js"
- }
- },
- "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,
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "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,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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,
- "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,
- "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,
- "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,
- "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/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,
- "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/update-browserslist-db": {
- "version": "1.0.13",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
- "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
- "dev": true,
- "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.1",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "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,
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "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/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"
- ],
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/vite": {
- "version": "5.2.8",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz",
- "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==",
- "dev": true,
- "dependencies": {
- "esbuild": "^0.20.1",
- "postcss": "^8.4.38",
- "rollup": "^4.13.0"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^18.0.0 || >=20.0.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^18.0.0 || >=20.0.0",
- "less": "*",
- "lightningcss": "^1.21.0",
- "sass": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.4.0"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- }
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "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,
- "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,
- "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-collection": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
- "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
- "dev": true,
- "dependencies": {
- "is-map": "^2.0.1",
- "is-set": "^2.0.1",
- "is-weakmap": "^2.0.1",
- "is-weakset": "^2.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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==",
- "dev": true,
- "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/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
- },
- "node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/zustand": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.1.tgz",
- "integrity": "sha512-XlauQmH64xXSC1qGYNv00ODaQ3B+tNPoy22jv2diYiP4eoDKr9LA+Bh5Bc3gplTrFdb6JVI+N4kc1DZ/tbtfPg==",
- "dependencies": {
- "use-sync-external-store": "1.2.0"
- },
- "engines": {
- "node": ">=12.7.0"
- },
- "peerDependencies": {
- "@types/react": ">=16.8",
- "immer": ">=9.0.6",
- "react": ">=16.8"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "immer": {
- "optional": true
- },
- "react": {
- "optional": true
- }
- }
- }
- }
-}
diff --git a/app/package.json b/app/package.json
deleted file mode 100644
index f7d9833..0000000
--- a/app/package.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "name": "stix-modeler-app",
- "private": true,
- "version": "1.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "vite build",
- "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
- "lint:fix": "npm run lint -- --fix",
- "preview": "vite preview"
- },
- "dependencies": {
- "classnames": "^2.5.1",
- "deepmerge": "^4.3.1",
- "lodash": "^4.17.21",
- "mobx": "^6.12.0",
- "mobx-react": "^9.1.0",
- "moment": "^2.30.1",
- "prop-types": "^15.8.1",
- "rc-slider": "^10.5.0",
- "react": "^18.2.0",
- "react-datepicker": "^6.1.0",
- "react-dom": "^18.2.0",
- "react-tooltip": "^5.26.3",
- "reactflow": "^11.10.4",
- "sass": "^1.71.0",
- "uuid": "^9.0.1"
- },
- "devDependencies": {
- "@types/react": "^18.2.55",
- "@types/react-dom": "^18.2.19",
- "@vitejs/plugin-react": "^4.2.1",
- "eslint": "^8.57.0",
- "eslint-config-airbnb": "^19.0.4",
- "eslint-plugin-import": "^2.29.1",
- "eslint-plugin-jsx-a11y": "^6.8.0",
- "eslint-plugin-react": "^7.34.1",
- "eslint-plugin-react-hooks": "^4.6.0",
- "eslint-plugin-react-refresh": "^0.4.5",
- "vite": "^5.2.6"
- }
-}
diff --git a/app/src/components/Flow/FlowNode.scss b/app/src/components/Flow/FlowNode.scss
deleted file mode 100644
index 23bb840..0000000
--- a/app/src/components/Flow/FlowNode.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-@import '../../defaults';
-
-.nodeLabel {
- overflow: visible;
- position: relative;
- bottom: -45px;
-}
\ No newline at end of file
diff --git a/app/src/components/SubmissionError.scss b/app/src/components/SubmissionError.scss
deleted file mode 100644
index 6ab5ebe..0000000
--- a/app/src/components/SubmissionError.scss
+++ /dev/null
@@ -1,22 +0,0 @@
-@import "../defaults";
-
-.submission-error {
- .header {
- padding: 10px;
- font-size: 18px;
-
- img {
- vertical-align: middle;
- padding-right: 10px;
- }
- }
-
- .row {
- padding-left: 55px;
-
- span {
- color: $default-active-bg;
- padding-right: 6px;
- }
- }
-}
diff --git a/app/src/components/menus/TopMenu.scss b/app/src/components/menus/TopMenu.scss
deleted file mode 100644
index d3adf98..0000000
--- a/app/src/components/menus/TopMenu.scss
+++ /dev/null
@@ -1,133 +0,0 @@
-@import '../../defaults';
-
-.top-menu {
- position: fixed;
- top: 20px;
- right: 20px;
-
- .row {
- display: flex;
- flex-direction: row;
-
- .menu-item-small {
- width: 20px;
- height: 20px;
- }
-
- .menu-item-medium {
- width: 25px;
- height: 20px;
- }
-
- .schema-paste-btn {
- border-radius: 5px;
- cursor: pointer;
- padding: 5px 4px 5px 11px;
- margin-left: 10px;
- color: #fff;
- font-weight: bold;
- background-color: $default-active-bg;
- }
-
- .grouping-btn {
- border-radius: 5px;
- cursor: pointer;
- padding: 5px 11px 5px 11px;
- color: #fff;
- font-weight: bold;
- background-color: $default-active-bg;
- width: 55px;
- height: 80%;
- }
-
- .dropdown {
- position: relative;
- display: inline-block;
- margin-left: 10px;
- }
-
- .dropdown-content {
- display: none;
- position: absolute;
- top: 100%;
- left: -25%;
- background-color: #f1f1f1;
- min-width: 160px;
- box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
- z-index: 1;
- }
-
- .dropdown-content a {
- color: black;
- padding: 12px 16px;
- text-decoration: none;
- display: block;
- }
-
- .dropdown-content a:hover {background-color: #ddd;}
-
- .dropdown:hover .dropdown-content {display: block;}
-
-
- .cancel-btn:hover {
- background-color: $error-font;
- }
-
- .sdos-btn {
- border-radius: 5px;
- cursor: pointer;
- padding: 5px 11px 5px 11px;
- color: #fff;
- font-weight: bold;
- background-color: $default-active-bg;
- margin-left: 10px;
-
- .i {
- width: 20px;
- vertical-align: middle;
- font-size: 16px;
- }
- }
-
- .ctr-input {
- padding-right: 10px;
- width: 500px;
- }
-
- .json-btn {
- border-radius: 5px;
- cursor: pointer;
- padding: 5px 4px 5px 8px;
- margin-left: 10px;
- color: #fff;
- font-weight: bold;
- background-color: $default-active-bg;
- }
-
- .json-paste-btn {
- border-radius: 5px;
- cursor: pointer;
- padding: 5px 4px 5px 8px;
- margin-left: 5px;
- color: #fff;
- font-weight: bold;
- background-color: $default-active-bg;
- }
-
- .reset-btn {
- border-radius: 5px;
- cursor: pointer;
- padding: 5px 11px 5px 11px;
- color: #fff;
- font-weight: bold;
- background-color: $default-active-bg;
- margin-left: 10px;
-
- .i {
- width: 20px;
- vertical-align: middle;
- font-size: 16px;
- }
- }
- }
-}
diff --git a/app/src/components/relationship/RelationshipDetails.scss b/app/src/components/relationship/RelationshipDetails.scss
deleted file mode 100644
index b585470..0000000
--- a/app/src/components/relationship/RelationshipDetails.scss
+++ /dev/null
@@ -1,139 +0,0 @@
-@import '../../defaults';
-
-.details {
- font-size: 18px;
- display: flex;
- flex-direction: column;
- height: 100%;
-
- .header {
- padding: 20px;
- font-size: 18px;
- height: 40px;
-
- display: flex;
- flex-direction: row;
-
- background-color: $lt-gray-bg;
-
- .title {
- padding-top: 5px;
- img {
- vertical-align: middle;
- padding-right: 5px;
- }
-
- flex: 1;
- }
-
- .delete {
- padding-left: 7px;
- width: 80px;
- display: flex;
- background-color: $default-active-bg;
- border-radius: 5px;
- padding-top: 7px;
- color: $light-font-0;
- cursor: pointer;
-
- font-size: 14px;
-
- span {
- padding-left: 1px;
- }
-
- .text {
- padding-top: 3px;
- }
- }
-
- .delete:hover {
- background-color: $error-font;
- }
- }
-
- .body {
- overflow-y: scroll;
- overflow-x: hidden;
- flex: 1;
-
- .preview {
- padding-left: 20px;
- padding-top: 10px;
- cursor: pointer;
- font-weight: bold;
- font-family: $default-font-family;
- line-height: 30px;
-
- img {
- vertical-align: middle;
- }
-
- img.src-image {
- padding-right: 5px;
- }
-
- img.target-image {
- padding-right: 5px;
- padding-left: 5px;
- }
-
- .rel-type {
- color: $default-active-bg;
- padding-left: 10px;
- padding-right: 10px;
- }
- }
-
- .submit-btn {
- border-radius: 5px;
- cursor: pointer;
- padding: 5px 11px 5px 11px;
- color: #fff;
- font-weight: bold;
- background-color: $default-active-bg;
- margin-left: 10px;
- margin-top: 10px;
- width: fit-content;
-
- .i {
- width: 20px;
- vertical-align: middle;
- font-size: 16px;
- }
- }
-
- .item {
- padding-left: 20px;
- padding-top: 15px;
- font-weight: normal;
-
- .horizontal-slider {
- width: 98%;
- }
-
- .item-header {
- font-weight: bold;
- color: $default-active-bg;
- padding-bottom: 3px;
-
- span {
- padding-left: 3px;
- vertical-align: middle;
- font-size: 14px;
- cursor: pointer;
- }
- }
- }
-
- .slider {
- padding-bottom: 20px;
- }
- }
-
- .footer {
- height: 40px;
- }
-
-
-}
diff --git a/app/src/components/relationship/RelationshipPicker.jsx b/app/src/components/relationship/RelationshipPicker.jsx
deleted file mode 100644
index 29326aa..0000000
--- a/app/src/components/relationship/RelationshipPicker.jsx
+++ /dev/null
@@ -1,90 +0,0 @@
-import React from 'react';
-import { observer } from 'mobx-react';
-import Panel from '../ui/panel/Panel';
-import Images from '../../imgs/Images';
-
-import './RelationshipPicker.scss';
-
-class RelationshipPicker extends React.Component {
- constructor(props) {
- super(props);
- }
-
- onClickSelectRelHandler(relationship) {
- this.props.onClickSelectRelHandler(relationship);
- }
-
- render() {
- // Do not allow relationship defininition for generic observables
- let create;
- if (this.props.relationships.length == 0 || this.props.relationships[0].target_ref) {
- create = (
-
-
-
Create New Relationship
-
- );
- }
-
- return (
-
-
-
-
- {' '}
- Possible Relationships
-
-
- {create}
- {
- this.props.relationships.slice(1).map((relationship) => {
- let src = relationship.source_ref.split('--')[0];
- let target = relationship.target_ref.split('--')[0];
-
- if (relationship.subTarget) {
- target = relationship.subTarget;
- }
-
- if (relationship.x_reverse) {
- const tmp = src;
- src = target;
- target = tmp;
- }
-
- const srcImg = Images.getImage(`${src}.png`);
- const targetImg = Images.getImage(`${target}.png`);
-
- return (
-
this.onClickSelectRelHandler(relationship)}
- >
-
- {' '}
- {src}
-
- {' '}
- {relationship.relationship_type}
- {' '}
-
- {target}
- {' '}
-
-
- );
- })
- }
-
-
-
- );
- }
-} export default (observer(RelationshipPicker));
diff --git a/app/src/components/ui/growl/growl.scss b/app/src/components/ui/growl/growl.scss
deleted file mode 100644
index 5889028..0000000
--- a/app/src/components/ui/growl/growl.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-@import "../../../defaults";
-
-.growl {
- position: fixed;
- right: 10px;
- top: 10px;
- z-index: $growl-index;
- background-color: $default-active-bg;
- color: $light-font-0;
- padding: 11px;
- border-radius: 5px;
-}
diff --git a/app/src/definition-adapters/Base.js b/app/src/definition-adapters/Base.js
deleted file mode 100644
index 7883ae9..0000000
--- a/app/src/definition-adapters/Base.js
+++ /dev/null
@@ -1,288 +0,0 @@
-import deepmerge from 'deepmerge';
-import moment from 'moment';
-
-const SPEC_VERSION = 2.1;
-
-const COMMON_RELS = [
- {
- type: 'created-by', target: 'identity', x_exclusive: true, x_embed: 'created_by_ref',
- },
-
- {
- type: 'includes', target: 'grouping', x_embed: 'object_refs', x_reverse: true,
- },
- {
- type: 'applies-to', target: 'note', x_embed: 'object_refs', x_reverse: true,
- },
- {
- type: 'applies-to', target: 'opinion', x_embed: 'object_refs', x_reverse: true,
- },
- {
- type: 'references', target: 'report', x_embed: 'object_refs', x_reverse: true,
- },
- {
- type: 'applies-to', target: 'marking-definition', x_embed: 'object_marking_refs', x_reverse: true,
- }
-];
-
-export class Base {
- constructor(common, def) {
- const commonProps = common.properties;
- let defProps = {};
-
- common.required.map((item) => {
- if (commonProps[item]) {
- commonProps[item].required = true;
- }
- });
-
- if (def.allOf) {
- def.allOf.map((item) => {
- if (item.hasOwnProperty('properties')) {
- defProps = item.properties;
- }
- });
- } else {
- defProps = def.properties;
- }
-
- if (def.required) {
- def.required.map((item) => {
- if (defProps[item]) {
- defProps[item].required = true;
- }
- });
- }
-
- for (const item in def) {
- this[item] = def[item];
- }
-
- for (const rel of COMMON_RELS) {
- def.relationships.push(rel);
- }
-
- const mergedProps = deepmerge(commonProps, defProps);
-
- this.handleFields(mergedProps);
-
- this.properties = mergedProps;
- }
-
- handleFields(mergedProps) {
- // Start special handling of common object
- // properties.
- for (const prop in mergedProps) {
- // Get (possibly nested) ref
- let ref = mergedProps[prop].$ref;
- for (const a in mergedProps[prop].allOf) {
- if (mergedProps[prop].allOf[a].$ref) {
- ref = mergedProps[prop].allOf[a].$ref;
- }
- }
- ref = ref || '';
-
- // set type for values with ref
- if (ref.indexOf('timestamp.json') !== -1) {
- mergedProps[prop].type = 'dts';
- } else if (ref.indexOf('identifier.json') !== -1) {
- mergedProps[prop].type = 'string';
- } else if (ref.indexOf('dictionary.json') !== -1) {
- mergedProps[prop].type = 'object';
- }
-
- // Set default blank values based on the prop
- // type.
- if (mergedProps[prop].type) {
- mergedProps[prop].value = this.defaultValue(mergedProps[prop].type);
- }
- }
-
- if (mergedProps.type) {
- mergedProps.type.control = 'literal';
- if (mergedProps.type.enum) {
- mergedProps.type.value = mergedProps.type.enum[0];
- }
- }
-
- if (mergedProps.aliases) {
- mergedProps.aliases.control = 'csv';
- }
-
- if (mergedProps.kill_chain_phases) {
- mergedProps.kill_chain_phases.control = 'killchain';
- mergedProps.kill_chain_phases.vocab = [
- {
- label: 'Lockheed Kill Chain',
- value: 'lockheed-martin-cyber-kill-chain',
- phases: [
- {
- label: 'Reconnaissance',
- phase_name: 'reconnaissance',
- },
- {
- label: 'Weaponize',
- phase_name: 'weaponization',
- },
- {
- label: 'Delivery',
- phase_name: 'delivery',
- },
- {
- label: 'Exploitation',
- phase_name: 'exploitation',
- },
- {
- label: 'Installation',
- phase_name: 'installation',
- },
- {
- label: 'Command & Control (C2)',
- phase_name: 'command-and-control',
- },
- {
- label: 'Actions On Objectives',
- phase_name: 'actions-on-objectives',
- }
- ],
- }
- ];
- }
-
- if (mergedProps.external_references) {
- mergedProps.external_references.control = 'externalrefs';
- }
-
- mergedProps.id.control = 'hidden';
-
- if (mergedProps.confidence) {
- mergedProps.confidence.control = 'slider';
- }
-
- if (mergedProps.description) {
- mergedProps.description.control = 'textarea';
- }
-
- /**
- * These are defaults that are to be set by the TI orchestrator
- */
-
- mergedProps.spec_version.value = SPEC_VERSION;
- mergedProps.spec_version.control = 'literal';
-
- if (mergedProps.extensions) {
- mergedProps.extensions.control = 'genericobject';
- mergedProps.extensions.type = 'object';
- mergedProps.extensions.value = {};
- }
-
- if (mergedProps.created_by_ref) {
- mergedProps.created_by_ref.type = 'literal';
- }
-
- if (mergedProps.lang) {
- mergedProps.lang.value = 'en';
- mergedProps.lang.control = 'hidden';
- }
-
- mergedProps.object_marking_refs.control = 'hidden';
- mergedProps.granular_markings.control = 'hidden';
- }
-
- defaultValue(type) {
- let def;
-
- // ignores type path
- if (type.includes('.json')) {
- type = type.split('/').slice(-1)[0];
- }
-
- switch (type) {
- case 'string':
- def = '';
- break;
- case 'dts':
- def = moment().utc(true).format('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
- break;
- case 'integer':
- def = 0;
- break;
- case 'array':
- def = [];
- break;
- case 'object':
- def = {};
- break;
- case 'boolean':
- def = false;
- break;
- }
-
- return def;
- }
-
- flattenExtensionProperties(def) {
- const properties = {};
- let tmp = {};
- if ('properties' in def) {
- tmp = this.flattenExtensionProperties(def.properties);
- for (const [key, value] of Object.entries(tmp)) {
- properties[key] = value;
- }
- } else if ('extensions' in def) {
- tmp = this.flattenExtensionProperties(def.extensions);
- for (const [key, value] of Object.entries(tmp)) {
- properties[key] = value;
- }
- } else {
- for (const [key, value] of Object.entries(def)) {
- if (key.includes('extension-definition')) {
- tmp = this.flattenExtensionProperties(value);
- for (const [key, value] of Object.entries(tmp)) {
- properties[key] = value;
- }
- } else {
- properties[key] = value;
- }
- }
- }
- return properties;
- }
-
- mergeExtension(def, extDef) {
- const { properties, } = this;
- let defProps;
- if (def.allOf) {
- def.allOf.map((item) => {
- if ('properties' in item) {
- defProps = this.flattenExtensionProperties(item.properties);
- }
- });
- } else {
- defProps = this.flattenExtensionProperties(def.properties);
- }
-
- if ('extension_type' in defProps) {
- delete defProps.extension_type;
- }
-
- if (!('extensions' in properties)) {
- this.properties.extensions = {};
- this.properties.extensions.value = {};
- this.properties.extensions.type = 'object';
- this.properties.extensions.control = 'hidden';
- }
-
- const props = { extension_type: 'property-extension', };
- for (const prop in defProps) {
- if ((prop !== 'extension_type') && (defProps[prop].type)) {
- const value = this.defaultValue(defProps[prop].type);
- props[prop] = value;
- defProps[prop].value = value;
- }
- }
- const mergedProps = deepmerge(properties, defProps);
- this.properties = mergedProps;
- this.properties.extensions.value[extDef.id] = props;
- }
-}
diff --git a/app/src/imgs/custom.png b/app/src/imgs/custom.png
deleted file mode 100644
index 46bb79b..0000000
Binary files a/app/src/imgs/custom.png and /dev/null differ
diff --git a/app/src/stores/App.js b/app/src/stores/App.js
deleted file mode 100644
index 7ab90a9..0000000
--- a/app/src/stores/App.js
+++ /dev/null
@@ -1,1811 +0,0 @@
-import { makeAutoObservable, toJS } from 'mobx';
-import _cloneDeep from 'lodash/cloneDeep';
-import _merge from 'lodash/merge';
-import moment from 'moment';
-import { v4 as uuidv4 } from 'uuid';
-import Proxy from './Proxy';
-
-import ap from '../definition-adapters/AttackPattern.js';
-import indicator from '../definition-adapters/Indicator.js';
-import malware from '../definition-adapters/Malware.js';
-import ma from '../definition-adapters/MalwareAnalysis.js';
-import sighting from '../definition-adapters/Sighting.js';
-import coa from '../definition-adapters/CourseOfAction.js';
-import campaign from '../definition-adapters/Campaign.js';
-import od from '../definition-adapters/ObservedData.js';
-import identity from '../definition-adapters/Identity.js';
-import tool from '../definition-adapters/Tool.js';
-import report from '../definition-adapters/Report.js';
-import vuln from '../definition-adapters/Vulnerability.js';
-import grouping from '../definition-adapters/Grouping.js';
-import infra from '../definition-adapters/Infrastructure.js';
-import is from '../definition-adapters/IntrusionSet.js';
-import location from '../definition-adapters/Location.js';
-import ta from '../definition-adapters/ThreatActor.js';
-import note from '../definition-adapters/Note.js';
-import opinion from '../definition-adapters/Opinion.js';
-import tlpred from '../definition-adapters/MarkingDefinitionRed.js';
-import tlpamber from '../definition-adapters/MarkingDefinitionAmber.js';
-import tlpgreen from '../definition-adapters/MarkingDefinitionGreen.js';
-import tlpwhite from '../definition-adapters/MarkingDefinitionWhite.js';
-import md from '../definition-adapters/MarkingDefinitionStatement.js';
-
-import obs from '../definition-adapters/Observable.js';
-import artifact from '../definition-adapters/Artifact.js';
-import software from '../definition-adapters/Software.js';
-import ipv4 from '../definition-adapters/IPv4Addr.js';
-import ipv6 from '../definition-adapters/IPv6Addr.js';
-import autosys from '../definition-adapters/AutonomousSystem.js';
-import dir from '../definition-adapters/Directory.js';
-import domain from '../definition-adapters/DomainName.js';
-import emailaddr from '../definition-adapters/EmailAddr.js';
-import emailmsg from '../definition-adapters/EmailMessage.js';
-import file from '../definition-adapters/File.js';
-import mac from '../definition-adapters/MacAddr.js';
-import mutex from '../definition-adapters/Mutex.js';
-import network from '../definition-adapters/NetworkTraffic.js';
-import process from '../definition-adapters/Process.js';
-import url from '../definition-adapters/Url.js';
-import ua from '../definition-adapters/UserAccount.js';
-import winregkey from '../definition-adapters/WindowsRegistryKey.js';
-import cert from '../definition-adapters/Certificate.js';
-
-import extDef from '../definition-adapters/ExtensionDefinition.js';
-import custom from '../definition-adapters/Custom.js';
-
-const SPEC_VERSION = '2.1';
-
-export default class App {
- creatorID = `identity--${uuidv4()}`;
-
- showDetails = false;
-
- showRelDetails = false;
-
- showRelEditor = false;
-
- showEditor = false;
-
- showJSON = false;
-
- showJSONPaste = false;
-
- showSchemaPaste = false;
-
- showImporter = false;
-
- showRelPicker = false;
-
- showSDOPicker = false;
-
- showGrowl = false;
-
- showSubmissionError = false;
-
- updateFlow = false;
-
- groupMode = false;
-
- growlMessage = '';
-
- mutatedBundle = '';
-
- relationships = [];
-
- customRelationships = {};
-
- dragging = {};
-
- selected = {};
-
- selectedRel = {};
-
- selectedSDO = {};
-
- selectedGroup = [];
-
- bundle = {};
-
- pasteBundle;
-
- pasteSchema;
-
- nodes = [];
-
- edges = [];
-
- schemas = [];
-
- extendedSDOs = {};
-
- extensionDefs = {};
-
- failedCollection = [];
-
- objects = [
- sighting,
- malware,
- ma,
- indicator,
- coa,
- ap,
- od,
- campaign,
- identity,
- tool,
- report,
- vuln,
- grouping,
- infra,
- is,
- location,
- ta,
- note,
- opinion,
- tlpred,
- tlpamber,
- tlpgreen,
- tlpwhite,
- md,
- artifact,
- obs,
- software,
- ipv4,
- ipv6,
- autosys,
- dir,
- domain,
- emailaddr,
- emailmsg,
- file,
- mac,
- mutex,
- network,
- process,
- url,
- ua,
- winregkey,
- cert,
- extDef
- ];
-
- mousePosition = {
- clientX: 0,
- clientY: 0,
- };
-
- constructor() {
- makeAutoObservable(this, { autoBind: true, });
-
- this.bundle.spec_version = SPEC_VERSION;
- this.bundle.id = this.generateNodeID('bundle--');
- this.bundle.type = 'bundle';
- this.bundle.objects = [];
- }
-
- setMousePosition(x, y) {
- this.mousePosition.clientX = x;
- this.mousePosition.clientY = y;
- }
-
- setUpdateFlow(update) {
- this.updateFlow = update;
- }
-
- setSelected(o) {
- this.selected = o;
- }
-
- setSelectedRel(r) {
- this.selectedRel = r;
- }
-
- setSelectedSDO(sdo) {
- this.selectedSDO = sdo;
- }
-
- setDragging(dragging) {
- this.dragging = dragging;
- }
-
- setRelationships(relationships) {
- this.relationships = relationships;
- }
-
- showModal() {
- this.modal = true;
- }
-
- hideModal() {
- this.modal = false;
- }
-
- getCreatorID() {
- return this.creatorID;
- }
-
- updateCreatorID(id) {
- const oldID = this.creatorID;
- this.bundle.objects.map((object) => {
- if (object.created_by_ref === oldID) {
- object.created_by_ref = id;
- }
- });
- this.nodes.map((node) => {
- if (node.properties.created_by_ref.value === oldID) {
- node.properties.created_by_ref.value = id;
- }
- });
- this.creatorID = id;
- }
-
- generateNodeID(prefix) {
- return `${prefix}${uuidv4()}`;
- }
-
- generateMoment() {
- return moment().utc(true).format('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
- }
-
- generateTimestamp(time) {
- return moment(time).utc(true).format('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
- }
-
- addNodeToBundle(node) {
- const props = node.properties;
-
- const newProps = {
- id: node.id,
- };
- for (const prop in props) {
- if (props[prop].type !== undefined && prop !== 'id') {
- newProps[prop] = props[prop].value;
- }
-
- if (prop === 'definition') {
- newProps[prop] = props[prop];
- }
- }
-
- this.bundle.objects.push(newProps);
- }
-
- getEmbeddedType(relationship) {
- let type;
- if (relationship.x_embed.includes('refs')) {
- type = 'array';
- } else {
- type = 'string';
- }
- return type;
- }
-
- addEmbeddedRelationship(relationship) {
- const key = relationship.x_embed;
- const type = this.getEmbeddedType(relationship);
- this.bundle.objects.map((object) => {
- if (relationship.x_reverse) {
- if (object.id === relationship.target_ref) {
- if (type === 'string') {
- object[key] = relationship.source_ref;
- } else if (type == 'array') {
- object[key].push(relationship.source_ref);
- }
- }
- } else if (object.id === relationship.source_ref) {
- if (Array.isArray(key)) {
- key.map((k) => {
- for (const item in object) {
- if (item === k) {
- if (typeof object[k] === 'string') {
- object[k] = relationship.target_ref;
- } else if (Array.isArray(object[k])) {
- object[k].push(relationship.target_ref);
- } else {
- console.warn(
- 'No type for relating in addRelationshipToBundle() in App.js'
- );
- }
- }
- }
- });
- } else if (type === 'string') {
- object[key] = relationship.target_ref;
- } else if (type === 'array') {
- object[key].push(relationship.target_ref);
- }
- }
- });
- }
-
- addRelationshipToBundle(relationship) {
- if (relationship.x_embed) {
- this.addEmbeddedRelationship(relationship);
- } else {
- this.bundle.objects.push(relationship);
- }
- }
-
- addCreatorID(node) {
- // Set created_by_ref to creator id
- if ('created_by_ref' in node.properties) {
- node.properties.created_by_ref.value = this.creatorID;
- }
- }
-
- persistNode(node) {
- let nodeExists = false;
- // This will block generic observables
- // from persisting.
- if (node.type) {
- this.nodes.map((n) => {
- if (node.id === n.id) {
- nodeExists = true;
- }
- });
-
- if (!nodeExists) {
- this.nodes.push(node);
- this.addNodeToBundle(node);
- }
- return !nodeExists;
- }
- }
-
- removeKillChainPhase(value) {
- let removeIdx = -1;
-
- this.bundle.objects.map((object) => {
- removeIdx = -1;
-
- if (object.id === this.selected.id) {
- object.kill_chain_phases.map((phase, idx) => {
- if (
- phase.kill_chain_name === value.kill_chain_name
- && phase.phase_name === value.phase_name
- ) {
- removeIdx = idx;
- }
- });
-
- if (removeIdx > -1) {
- object.kill_chain_phases.splice(removeIdx, 1);
- }
- }
- });
- }
-
- editSDOValues(event) {
- const sdo = this.selectedSDO;
- const { value, } = event.currentTarget;
- const { name, } = event.currentTarget;
-
- this.selectedSDO[name] = value;
-
- this.nodes.map((node) => {
- if (node.title === sdo.title) {
- node[name] = value;
- }
- });
- }
-
- editNodeValues(event) {
- const props = this.selected.properties;
- const updateProps = {
- id: this.selected.id,
- value: event.currentTarget.value,
- name: event.currentTarget.name,
- };
-
- // Array's clearly need different treatment than strings.
- if (
- props[updateProps.name].type === 'array'
- && props[updateProps.name].vocab
- ) {
- let idx;
- // We need to see if this is a push or
- // a splice.
- props[updateProps.name].value.map((prop, i) => {
- if (prop === updateProps.value) {
- idx = i;
- }
- });
- // If the value exists, we know this is a splice or,
- // remove operation. Otherwise, the user is trying
- // to add a value.
- if (idx > -1) {
- props[updateProps.name].value.splice(idx, 1);
- this.removeNodeArrayValuesInBundle(updateProps);
- } else {
- this.updateNodeArrayValuesInBundle(updateProps);
- }
- } else if (props[updateProps.name].type === 'object') {
- props[updateProps.name].value = updateProps.value;
-
- try {
- updateProps.value = JSON.parse(updateProps.value);
- this.updateNodeValuesInBundle(updateProps);
- } catch (error) {
- console.warn('not a valid object');
- }
- } else {
- props[updateProps.name].value = updateProps.value;
- this.updateNodeValuesInBundle(updateProps);
- }
- }
-
- updateNodeValuesInBundle(props) {
- this.bundle.objects.map((object) => {
- if (object.id === props.id) {
- object[props.name] = props.value;
- }
- });
- }
-
- updateNodeArrayValuesInBundle(props) {
- this.bundle.objects.map((object) => {
- if (object.id === props.id) {
- object[props.name].push(props.value);
- }
- });
- }
-
- addGenericObject(field, value) {
- let v = this.selected.properties[field].value;
- v = _merge(v, value);
- this.bundle.objects.map((object) => {
- if (object.id === this.selected.id) {
- object[field] = v;
- }
- });
- }
-
- deleteGenericObject(field, key) {
- const v = this.selected.properties[field].value;
-
- delete v[key];
-
- this.bundle.objects.map((object) => {
- if (object.id === this.selected.id) {
- object[field] = v;
- }
- });
- }
-
- /**
- * For editing CSV values we will do both the property
- * and the bundle updates in one function since they
- * are unique in how both are updated.
- */
- editCSVInput(event) {
- const props = this.selected.properties;
- const updateProps = {
- id: this.selected.id,
- value: event.currentTarget.value,
- name: event.currentTarget.name,
- };
-
- props[updateProps.name].value = [];
-
- updateProps.value = updateProps.value.replace(/, /g, ',');
- updateProps.value = updateProps.value.replace(/ ,/g, ',');
-
- let newArray = updateProps.value.split(',');
-
- if (!updateProps.value.length) {
- newArray = [];
- }
-
- newArray.map((item) => {
- props[updateProps.name].value.push(item);
- });
-
- if (newArray.length > 0) {
- this.bundle.objects.map((object) => {
- if (object.id === updateProps.id) {
- object[updateProps.name] = [];
- newArray.map((item) => {
- object[updateProps.name].push(item);
- });
- }
- });
- } else {
- this.bundle.objects.map((object) => {
- if (object.id === updateProps.id) {
- object[updateProps.name] = [];
- }
- });
- }
- }
-
- removeNodeArrayValuesInBundle(props) {
- let idx;
-
- this.bundle.objects.map((object) => {
- if (object.id === props.id) {
- object[props.name].map((item, i) => {
- if (item === props.value) {
- idx = i;
- }
- });
- }
-
- if (idx > -1) {
- object[props.name].splice(idx, 1);
- }
- });
- }
-
- addDefaultObject(field, requiredFields) {
- const def = {};
- for (const f in requiredFields) {
- const field = requiredFields[f];
- def[field] = '';
- }
-
- this.bundle.objects.map((object) => {
- if (object.id === this.selected.id) {
- object[field].push(def);
- }
- });
- }
-
- changeERValue(input, select, idx) {
- const nodeProp = this.selected.properties.external_references.value;
-
- try {
- if (typeof JSON.parse(input) === 'object') {
- input = JSON.parse(input);
- }
- } catch (e) {}
-
- nodeProp[idx][select] = input;
-
- this.bundle.objects.map((object) => {
- if (object.id === this.selected.id) {
- object.external_references[idx][select] = input;
- }
- });
- }
-
- deleteERObjectProperty(select, idx) {
- const nodeProp = this.selected.properties.external_references.value;
-
- delete nodeProp[idx][select];
-
- this.bundle.objects.map((object) => {
- if (object.id === this.selected.id) {
- delete object.external_references[idx][select];
- }
- });
- }
-
- deleteERObject(idx) {
- const nodeProp = this.selected.properties.external_references.value;
-
- nodeProp.splice(idx, 1);
- this.bundle.objects.map((object) => {
- if (object.id === this.selected.id) {
- object.external_references.splice(idx, 1);
- }
- });
- }
-
- changeArrayObjectValue(input, select, idx, property) {
- const nodeProp = this.selected.properties[property].value;
-
- try {
- if (typeof JSON.parse(input) === 'object') {
- input = JSON.parse(input);
- }
- } catch (e) {}
-
- nodeProp[idx][select] = input;
-
- this.bundle.objects.map((object) => {
- if (object.id === this.selected.id) {
- object[property][idx][select] = input;
- }
- });
- }
-
- deleteArrayObjectProperty(field, idx, property) {
- const nodeProp = this.selected.properties[property].value;
-
- delete nodeProp[idx][field];
-
- this.bundle.objects.map((object) => {
- if (object.id === this.selected.id) {
- delete object[property][idx][field];
- }
- });
- }
-
- deleteArrayObject(idx, property) {
- const nodeProp = this.selected.properties[property].value;
- nodeProp.splice(idx, 1);
- this.bundle.objects.map((object) => {
- if (object.id === this.selected.id) {
- object[property].splice(idx, 1);
- }
- });
- }
-
- deleteObject(idx, property) {
- const nodeProp = this.selected.properties[property].value;
-
- nodeProp.splice(idx, 1);
- this.bundle.objects.map((object) => {
- if (object.id === this.selected.id) {
- object[property].splice(idx, 1);
- }
- });
- }
-
- blockDuplicateRelationships(source, target, relationship) {
- let alreadyRelated = false;
- this.edges.map((edge) => {
- if (
- edge.source_ref === source
- && edge.target_ref === target
- && edge.relationship_type === relationship
- ) {
- alreadyRelated = true;
- }
- });
-
- return alreadyRelated;
- }
-
- makeRelationship(source, target, relationship) {
- let rel;
- let exclusiveRelationshipDefined = false;
- if (target == undefined) {
- target = { id: '', };
- }
- const alreadyRelated = this.blockDuplicateRelationships(
- source.id,
- target.id,
- relationship.type
- );
- // Some relationships are exclusive by nature.
- // This bit of code will protect that exclusivity.
- if (relationship.x_exclusive) {
- this.edges.map((edge) => {
- if (
- edge.source_ref === source.id
- && relationship.type === edge.relationship_type
- ) {
- exclusiveRelationshipDefined = true;
- }
- });
- }
-
- if (!alreadyRelated && !exclusiveRelationshipDefined) {
- rel = {
- source_ref: source.id,
- target_ref: target.id,
- relationship_type: relationship.type,
- type: 'relationship',
- spec_version: '2.1',
- created: this.generateMoment(),
- modified: this.generateMoment(),
- id: this.generateNodeID('relationship--'),
- targetObjectType: relationship.target,
- };
-
- if (relationship['sub-target']) {
- rel.subTarget = relationship['sub-target'];
- }
-
- // x_reverse should never occur when targetobjectype is non-null
- if (relationship.x_reverse) {
- rel.source_ref = target.id;
- rel.target_ref = source.id;
- }
-
- if (relationship.x_embed) {
- rel.x_embed = relationship.x_embed;
- }
- }
- return rel;
- }
-
- canRelate(source, target) {
- const targetType = target.properties.type.enum[0];
- const sourceType = source.properties.type.enum[0];
-
- const alredyPushed = (rel, relationship) => {
- let found = false;
-
- rel.map((r) => {
- const t = relationship['sub-target']
- ? relationship['sub-target']
- : relationship.target;
-
- if (
- r.targetObjectType === t
- && r.relationship_type === relationship.type
- ) {
- found = true;
- }
- });
-
- return found;
- };
-
- const rel = [];
-
- if (target.id !== source.id) {
- target.relationships.map((relationship) => {
- if (relationship.target === sourceType) {
- const madeRel = this.makeRelationship(target, source, relationship);
- if (madeRel && !alredyPushed(rel, relationship)) {
- rel.push(madeRel);
- }
- }
- });
-
- source.relationships.map((relationship) => {
- if (relationship.target === targetType) {
- const madeRel = this.makeRelationship(source, target, relationship);
- if (madeRel && !alredyPushed(rel, relationship)) {
- rel.push(madeRel);
- }
- }
- });
-
- if (sourceType in this.customRelationships) {
- this.customRelationships[sourceType].map((relationship) => {
- if (relationship.target === targetType) {
- const madeRel = this.makeRelationship(source, target, relationship);
- if (madeRel && !alredyPushed(rel, relationship)) {
- rel.push(madeRel);
- }
- }
- });
- }
- }
- return rel;
- }
-
- addNodeWithRelationship(nodeOnScreen) {
- let relationship = this.canRelate(nodeOnScreen);
- const dragging = toJS(this.dragging);
-
- if (Array.isArray(relationship)) {
- this.relationships = relationship;
- this.showRelPicker = true;
- } else {
- const nodeToPersist = dragging;
-
- if (relationship) {
- // if the relationship is an observable, we need to swap
- // it out for the specific sub type.
- if (relationship.targetObjectType === 'observable') {
- if (nodeOnScreen.type === 'observable') {
- relationship = this.handleGenericObservable(relationship);
- }
- } else {
- this.edges.push(relationship);
- this.persistNode(nodeToPersist);
- }
-
- this.addRelationshipToBundle(relationship);
- return relationship;
- }
- this.persistNode(nodeToPersist);
- return relationship;
- }
- }
-
- getRelById(id) {
- let rel;
-
- this.edges.map((e) => {
- if (e.id === id) {
- rel = e;
- }
- });
-
- return rel;
- }
-
- getTypeNameFromJson(object) {
- let typeName;
- let ref;
- if (object.allOf) {
- object.allOf.map((item) => {
- if ('$ref' in item) {
- ref = item.$ref;
- }
- });
- }
- if (ref === undefined) {
- typeName = object.type;
- } else if (ref.includes('common/core.json')) {
- typeName = this.getTypeName(object);
- } else {
- try {
- // Assumes the reference json has the same name as its original type name
- const schemaFile = ref.split('/').slice(-1)[0];
- typeName = schemaFile.split('.')[0];
- } catch {
- return typeName;
- }
- }
- return typeName;
- }
-
- getTypeName(object) {
- let type;
- if (object.allOf) {
- object.allOf.map((item) => {
- if ('properties' in item) {
- type = item.properties.type.enum[0];
- }
- });
- } else {
- type = object.properties.type.enum[0];
- }
- return type;
- }
-
- getTypeObject(typeName) {
- let sdo;
- this.objects.map((o) => {
- const objType = this.getTypeName(o);
- if (objType == typeName) {
- sdo = o;
- }
- });
- return sdo;
- }
-
- createNodeByType(type) {
- let node = {};
- const object = this.getTypeObject(type);
- if (object) {
- node = structuredClone(object);
- }
- return node;
- }
-
- getObjectsByType(type) {
- return this.bundle.objects.filter(
- (object) => this.getTypeNameFromJson(object) === type
- );
- }
-
- getObjectById(id) {
- let object;
-
- this.bundle.objects.map((o) => {
- if (o.id === id) {
- object = o;
- }
- });
-
- return object;
- }
-
- getNodeById(id) {
- let node;
-
- this.nodes.map((n) => {
- if (n.id === id) {
- node = n;
- }
- });
-
- return node;
- }
-
- // get the nearest node to position
- getNodeByPosition(x, y) {
- let node;
- let distance
- this.nodes.map( n => {
- const dx = n.position.x - x;
- const dy = n.position.y - y;
- const d = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
-
- if (distance) {
- if (d < distance) {
- node = n;
- distance = d;
- }
- } else {
- distance = d;
- node = n;
- }
- })
- return node;
- }
-
- getExtensions() {
- const extNames = Object.keys(this.extensionDefs);
- const exts = this.objects.filter((o) => extNames.includes(o.properties.type.enum[0]));
- return exts;
- }
-
- getCustomSDOs() {
- const sdos = this.objects.filter((o) => this.schemas.includes(o.properties.type.enum[0]));
- return sdos;
- }
-
- isExtended(type) {
- return type in this.extendedSDOs;
- }
-
- getExtendedSDOs() {
- const sdos = this.objects.filter((o) => {
- const type = this.getTypeName(o);
- return this.isExtended(type);
- });
- return sdos;
- }
-
- /**
- * Observables are dragged onto other SDO's as a
- * generic object and transformed after the user selects
- * the specific, targeted observable.
- */
- handleGenericObservable(relationship) {
- const newNode = this.createNodeByType(relationship.subTarget);
- newNode.id = this.generateNodeID(newNode.prefix);
- relationship.target_ref = newNode.id;
- const nodeToPersist = newNode;
-
- this.edges.push(relationship);
- this.persistNode(nodeToPersist);
- this.dragging = nodeToPersist;
-
- return relationship;
- }
-
- /**
- * Add a custom relationship to the customRelationship dictionary
- * for its respective object
- * @param {*} relationship
- */
- addCustomRelationship(relationship, src_id) {
- const src = this.getNodeById(src_id);
- const src_type = src.properties.type.value;
- const rel = {
- type: relationship.type,
- target: relationship.targetObjectType,
- x_exclusive: relationship.x_exclusive,
- };
-
- if (relationship.subTarget) {
- rel['sub-target'] = relationship.subTarget;
- }
-
- const relEquals = ((r, o) => (r.type === o.type) && (r.target === o.target)
- && (r['sub-target'] === o['sub-target'])
- );
-
- if (src) {
- let rels;
- if (src_type in this.customRelationships) {
- rels = this.customRelationships[src_type];
- let relExists = false;
- rels.map((r) => {
- if (relEquals(r, rel)) {
- relExists = true;
- }
- });
- if (!relExists) {
- rels.push(rel);
- }
- } else {
- rels = [rel];
- }
- this.customRelationships[src_type] = rels;
- }
- }
-
- /**
- * If node already exists, update its embedded relationship value
- */
- updateEmbeddedNodeRel(relationship) {
- const key = relationship.x_embed;
-
- let source = relationship.source_ref;
- let target = relationship.target_ref;
-
- if (relationship.x_reverse) {
- source = relationship.target_ref;
- target = relationship.source_ref;
- }
-
- const props = this.getNodeById(source).properties;
- // Array's clearly need different treatment than strings.
- if (
- props[key].type === 'array'
- ) {
- if (!props[key].value.includes(target)) {
- props[key].value.push(target);
- }
- } else {
- props[key].value = target;
- }
- }
-
- /**
- * When an SDO or Observable can relate to another
- * SDO in more than one way, the user will need to select
- * manually.
- */
- manuallySelectRelationship(relationship) {
- this.dragging = {};
- if (relationship.targetObjectType === 'observable') {
- relationship = this.handleGenericObservable(relationship);
- } else {
- this.edges.push(relationship);
- }
-
- this.addRelationshipToBundle(relationship);
-
- // update node value
- if (relationship.x_embed) {
- this.updateEmbeddedNodeRel(relationship);
- }
-
- this.relationships = [];
- this.showRelPicker = false;
-
- return relationship;
- }
-
- createRelationshipFromPaste(key, node, id) {
- const def = this.getTypeObject(node.type);
- let targetExists = false;
- let r;
- let targetType;
- let relationshipType = 'references';
-
- const src = node.id;
- const target = id || node[key];
-
- if (id) {
- targetType = id.split('--')[0];
- } else {
- targetType = node[key].split('--')[0];
- }
-
- this.nodes.map((n) => {
- if (node[key] === n.id || id === n.id) {
- targetExists = true;
- }
- });
-
- // get reverse embedded relationship
- const targetDef = this.getTypeObject(targetType);
- if (targetDef.relationships) {
- targetDef.relationships.forEach((relationship) => {
- if (relationship.target === node.type && relationship.x_reverse) {
- relationshipType = relationship.type;
- }
- });
- }
-
- // get embedded relationship
- if (def.relationships && targetExists) {
- def.relationships.map((relationship) => {
- if (
- relationship.x_embed
- && relationship.x_embed === key
- && relationship.target === targetType
- ) {
- relationshipType = relationship.type;
- }
- });
- }
-
- if (targetExists) {
- r = {
- source_ref: src,
- target_ref: target,
- relationship_type: relationshipType,
- type: 'relationship',
- created: this.generateMoment(),
- modified: this.generateMoment(),
- id: this.generateNodeID('relationship--'),
- };
- }
- return r;
- }
-
- setGrowlMessage(message) {
- this.growlMessage = message;
- }
-
- setShowGrowl(show) {
- this.showGrowl = show;
- }
-
- setShowDetails(show) {
- this.showDetails = show;
- }
-
- setShowRelDetails(show) {
- this.showRelDetails = show;
- }
-
- setShowRelEditor(show) {
- this.showRelEditor = show;
- }
-
- setShowEditor(show) {
- this.showEditor = show;
- }
-
- setShowJSON(show) {
- this.showJSON = show;
- }
-
- setShowJSONPaste(show) {
- this.showJSONPaste = show;
- }
-
- setShowSchemaPaste(show) {
- this.showSchemaPaste = show;
- }
-
- setShowImporter(show) {
- this.showImporter = show;
- }
-
- setShowRelPicker(show) {
- this.showRelPicker = show;
- }
-
- setShowSDOPicker(show) {
- this.showSDOPicker = show;
- }
-
- setShowSubmissionError(show) {
- this.showSubmissionError = show;
- }
-
- setGroupMode(mode) {
- this.groupMode = mode;
- }
-
- setPasteBundle(bundle) {
- this.pasteBundle = bundle;
- }
-
- setPasteSchema(schema) {
- this.pasteSchema = schema;
- }
-
- loadBundleFromFile(file) {
- this.pasteBundle = file;
- this.loadBundleFromPaste();
- this.growlMessage = 'Successfully Imported Bundle';
- this.showGrowl = true;
- }
-
- getExtensionProperty(object, field) {
- let property;
- if (this.isExtended(object.type)) {
- for (const ext in object.extensions) {
- if (field in object.extensions[ext]) {
- property = object.extensions[ext][field];
- break;
- }
- }
- }
- return property;
- }
-
- loadBundleFromPaste() {
- this.reset();
- const missing = new Set();
- const newExts = {};
- try {
- const bundle = JSON.parse(this.pasteBundle);
- bundle.objects.map((o) => {
- const type = this.getTypeNameFromJson(o);
- if (type !== 'relationship') {
- const newNode = this.createNodeByType(type);
- newNode.id = o.id;
- for (const key in newNode.properties) {
- const extProp = this.getExtensionProperty(o, key);
- if (extProp) {
- newNode.properties[key].value = extProp;
- } else if (key in o) {
- newNode.properties[key].value = o[key];
- }
- }
- if (type !== 'extension-definition') {
- this.persistNode(newNode);
- } else {
- this.addNodeToBundle(newNode);
- }
-
- if (this.isExtended(type)) {
- // do extension schema mapping
- const extensions = this.getExtensionsFromSchema(type, newExts);
- for (const ext in newNode.properties.extensions.value) {
- extensions.add(ext);
- }
- newExts[type] = extensions;
-
- if (Object.keys(newNode).length === 0) {
- missing.add(type);
- }
- }
- }
- });
-
- // Handle SRO's and synthetic relationships
- // after SDO's have been loaded.
- bundle.objects.map((o) => {
- if (o.type === 'relationship') {
- this.edges.push(o);
- this.bundle.objects.push(o);
- }
-
- if (o.type !== 'relationship') {
- for (const key in o) {
- if (
- key.indexOf('_ref') > -1
- && o[key].length
- && key !== 'external_references'
- ) {
- if (Array.isArray(o[key])) {
- o[key].map((id) => {
- const rel = this.createRelationshipFromPaste(key, o, id);
-
- if (rel) {
- this.edges.push(rel);
- }
- });
- } else {
- const rel = this.createRelationshipFromPaste(key, o);
-
- if (rel) {
- this.edges.push(rel);
- }
- }
- }
- }
- }
- });
-
- // Update imported schemas to use imported definitions, if any exist
- this.updateExtensions(newExts);
-
- this.pasteBundle = '';
- this.showJSONPaste = false;
-
- if (missing.size > 0) {
- if (missing.size === 1) {
- this.growlMessage = `Missing SDO schema ${toJS(missing.values().next().value)}`;
- } else {
- this.growlMessage = `Missing ${missing.size} SDO schemas`;
- }
- this.showGrowl = true;
- }
- } catch (e) {
- this.growlMessage = 'Incorrect JSON Syntax.';
- this.showGrowl = true;
- }
- }
-
- extendObject(schema, extDef) {
- const extType = this.getTypeNameFromJson(schema);
- const sdo = this.getTypeObject(extType);
- try {
- sdo.mergeExtension(schema, extDef);
- let extProps = new Set();
- if (extType in this.extendedSDOs) {
- extProps = this.extendedSDOs[extType];
- }
- const props = sdo.properties.extensions.value[extDef.id];
- for (const prop in props) {
- if (prop !== 'extension_type') {
- extProps.add(prop);
- }
- }
- this.extendedSDOs[extType] = extProps;
- } catch (e) {
- this.growlMessage = 'Incorrect JSON Syntax.';
- this.showGrowl = true;
- }
- }
-
- getExtensionsFromSchema(schema, ext = this.extensionDefs) {
- let extensions;
- if (schema in ext) {
- extensions = ext[schema];
- } else {
- extensions = new Set();
- }
- return extensions;
- }
-
- createExtProperty(extObj, schema, extProp = {}) {
- const extType = extObj.extension_types[0];
- const ext = { extension_type: extType, };
- if (this.isExtended(schema)) {
- const props = toJS(this.extendedSDOs[schema]);
- for (const prop of props) {
- ext[prop] = props[prop];
- }
- }
- extProp[extObj.id] = ext;
- return extProp;
- }
-
- updateExtensions(newExts) {
- for (const schema in newExts) {
- const schemaType = this.getTypeObject(schema);
- if (schemaType) {
- // Remove old extensions from bundle
- const oldExts = this.extensionDefs[schema];
- for (const ext of oldExts) {
- this.removeExtension(ext);
- // remove old ext if exists in newExts
- newExts[schema].delete(ext);
- }
- // Update schema-to-def mapping
- this.extensionDefs[schema] = newExts[schema];
- // Create new extension SDOs
- let extensions = {};
- for (const ext of newExts[schema]) {
- const extObj = this.getObjectById(ext);
- extensions = this.createExtProperty(extObj, schema, extensions);
- }
-
- // update extensions for future objects
- schemaType.properties.extensions.value = extensions;
- }
- }
- }
-
- generateExtensions() {
- let extObj;
- let extId;
- for (const schema of this.getCustomSDOs()) {
- const schemaType = schema.properties.type.enum[0];
- extId = this.makeExtension('new-sdo', schemaType);
- extObj = this.getObjectById(extId);
- schema.properties.extensions.value = this.createExtProperty(extObj, schemaType);
- }
-
- for (const sdo of this.getExtendedSDOs()) {
- const sdoType = sdo.properties.type.enum[0];
- extId = this.makeExtension('property-extension', sdoType);
- extObj = this.getObjectById(extId);
- sdo.properties.extensions.value = this.createExtProperty(extObj, sdoType);
- }
- }
-
- makeExtension(extType, schema) {
- const ext = this.createNodeByType('extension-definition');
- const id = this.generateNodeID('extension-definition--');
- ext.properties.extension_types.value = [extType];
- ext.id = id;
- this.addNodeToBundle(ext);
- this.addExtension(schema, id);
- return id;
- }
-
- removeExtension(id) {
- this.bundle.objects.map((ext, i) => {
- if (ext.id === id) {
- this.bundle.objects.splice(i, 1);
- }
- });
- }
-
- addExtension(schema, id) {
- const extensions = this.getExtensionsFromSchema(schema);
- extensions.add(id);
- this.extensionDefs[schema] = extensions;
- }
-
- addSchema(json) {
- let exists = false;
- let extType = 'new-sdo';
-
- const schemaType = this.getTypeNameFromJson(json);
-
- this.objects.map((o) => {
- if (o.properties.type.enum[0] === schemaType) {
- exists = true;
- extType = 'property-extension';
- }
- });
-
- const extId = this.makeExtension(extType, schemaType);
- const ext = this.getObjectById(extId);
- if (!exists) {
- const schema = custom(json, ext);
- this.schemas.push(schemaType);
- this.objects.push(schema);
- } else {
- this.extendObject(json, ext);
- }
- }
-
- loadSchemaFromFile(file) {
- try {
- const schema = JSON.parse(file);
- this.addSchema(schema);
- this.growlMessage = 'Successfully Imported Extension(s)';
- this.showGrowl = true;
- } catch (e) {
- this.growlMessage = 'Incorrect JSON Syntax.';
- this.showGrowl = true;
- }
- }
-
- loadSchemaFromPaste() {
- try {
- const schema = JSON.parse(this.pasteSchema);
- this.addSchema(schema);
- this.pasteSchema = '';
- this.showSchemaPaste = false;
- } catch (e) {
- this.growlMessage = 'Incorrect JSON Syntax.';
- this.showGrowl = true;
- }
- }
-
- deleteSelectedSDO() {
- const sdo = this.selectedSDO;
- this.objects.map((o, i) => {
- if (o.title === sdo.title) {
- this.objects.splice(i, 1);
- }
- });
-
- Object.keys(this.extensionDefs).map((title, i) => {
- if (title === sdo.title) {
- this.extensionDefs.splice(i, 1);
- }
- });
-
- this.showEditor = false;
- }
-
- removeExternalRelFromBundle(id) {
- this.bundle.objects.map((rel, i) => {
- if (rel.id === id) {
- this.bundle.objects.splice(i, 1);
- }
- });
- }
-
- removeEmbeddedRelFromBundle(rel, source, target) {
- const spliceValue = (o, id) => {
- o[rel.x_embed].map((r, i) => {
- if (r === id) {
- o[rel.x_embed].splice(i, 1);
- }
- });
- };
-
- this.bundle.objects.map((o) => {
- if (o.id === source.id) {
- if (Array.isArray(o[rel.x_embed])) {
- spliceValue(o, target.id);
- } else if (o[rel.x_embed]) {
- o[rel.x_embed] = '';
- }
- }
- });
- }
-
- deleteSelectedNode() {
- const nodeToDelete = this.selected;
-
- // Handle the edges that may be impacted by
- // removing a node.
- this.edges.map((rel, i) => {
- if (rel.source_ref === nodeToDelete.id) {
- this.deleteRelationship(rel, i);
- } else if (rel.target_ref === nodeToDelete.id) {
- this.deleteRelationship(rel, i);
- }
- });
-
- this.bundle.objects.map((o, i) => {
- if (o.id === nodeToDelete.id) {
- this.bundle.objects.splice(i, 1);
- }
- });
-
- // Remove the selected node from the nodes object.
- this.nodes.map((node, i) => {
- if (node.id === nodeToDelete.id) {
- this.nodes.splice(i, 1);
- }
- });
- this.showDetails = false;
- }
-
- editRelationship(rel) {
- this.bundle.objects.map((object) => {
- if (object.id === this.selectedRel.id) {
- object.relationship_type = rel.type;
- }
- });
-
- this.edges.map((edge) => {
- if (edge.id === this.selectedRel.id) {
- edge.relationship_type = rel.type;
- }
- });
- }
-
- deleteSelectedRelationship() {
- this.edges.map((rel, i) => {
- if (rel.id === this.selectedRel.id) {
- this.deleteRelationship(rel, i);
- }
- });
- this.selectedRel = {};
- this.showRelEditor = false;
- }
-
- deleteRelationship(rel, i) {
- const sourceNode = this.getNodeById(rel.source_ref);
- const targetNode = this.getNodeById(rel.target_ref);
-
- if (rel.x_embed) {
- if (Array.isArray(sourceNode.properties[rel.x_embed])) {
- sourceNode.properties[rel.x_embed].map((o, i) => {
- if (o.id === targetNode) {
- sourceNode.properties[rel.x_embed].splice(i, 1);
- }
- });
- } else {
- sourceNode.properties[rel.x_embed].value = '';
- }
- this.removeEmbeddedRelFromBundle(rel, sourceNode, targetNode);
- }
-
- this.removeExternalRelFromBundle(rel.id);
-
- if (i > -1) {
- this.edges.splice(i, 1);
- }
- }
-
- modifyGroup(id) {
- const idx = this.selectedGroup.indexOf(id);
- if (idx < 0) {
- this.addToGroup(id);
- } else {
- this.removeFromGroup(id, idx);
- }
- }
-
- addToGroup(id) {
- this.selectedGroup.push(id);
- const node = this.getNodeById(id);
- node.selected = true;
- }
-
- removeFromGroup(id, idx) {
- const node = this.getNodeById(id);
- node.selected = false;
- this.selectedGroup.splice(idx, 1);
- }
-
- resetGroup() {
- this.selectedGroup.map((n) => {
- const node = this.getNodeById(n);
- if (node) {
- node.selected = false;
- }
- });
- this.selectedGroup = [];
- this.groupMode = false;
- }
-
- createGroup(id) {
- const newNode = this.createNodeByType('grouping');
- newNode.id = id;
- this.persistNode(newNode);
- this.addCreatorID(newNode);
-
- const src = { id, };
- this.selectedGroup.map((n) => {
- const rel = {
- type: 'includes',
- x_embed: 'object_refs',
- };
- const target = { id: n, };
- const relationship = this.makeRelationship(src, target, rel);
- this.manuallySelectRelationship(relationship);
- });
-
- this.resetGroup();
- }
-
- // Unflatten extension properties for correct STIX formatting
- mutateBundle() {
- const mutated = {};
- for (const [key, value] of Object.entries(this.bundle)) {
- if (key !== 'objects') {
- mutated[key] = value;
- }
- }
- mutated.objects = [];
- this.bundle.objects.map((object) => {
- if (this.isExtended(object.type)) {
- const obj = {};
- for (const [field, value] of Object.entries(object)) {
- if (field !== 'extensions') {
- obj[field] = value;
- }
- }
- obj.extensions = {};
- const extId = this.extensionDefs[object.type].values().next().value;
- const ext = { extension_type: 'property-extension', };
- const fields = this.extendedSDOs[object.type];
- for (const field of fields) {
- ext[field] = object[field];
- delete obj[field];
- }
- obj.extensions[extId] = ext;
- mutated.objects.push(obj);
- } else {
- mutated.objects.push(object);
- }
- });
- this.mutatedBundle = JSON.stringify(mutated, null, 2);
- }
-
- validateSubmission() {
- const { nodes, } = this;
-
- nodes.map((node) => {
- for (const key in node.properties) {
- if (node.required && node.required.indexOf(key) > -1) {
- // For required refs check the bundle
- // instead of the node.
- if (key.indexOf('_refs') > -1) {
- this.bundle.objects.map((o) => {
- for (const item in o) {
- if (item === key) {
- if (!o[item].length) {
- this.failedCollection.push({
- node: node.id,
- type: node.type,
- img: node.img,
- property: key,
- msg: 'Required field, value must be provided.',
- });
- }
- }
- }
- });
- } else if (node.properties[key].hasOwnProperty('value')) {
- if (Array.isArray(node.properties[key].value)) {
- if (!node.properties[key].value.length) {
- this.failedCollection.push({
- node: node.id,
- type: node.type,
- img: node.img,
- property: key,
- msg: 'Required field, value must be provided.',
- });
- }
- } else if (typeof node.properties[key].value === 'object') {
- if (!Object.keys(node.properties[key].value).length) {
- this.failedCollection.push({
- node: node.id,
- type: node.type,
- img: node.img,
- property: key,
- msg: 'Required field, value must be provided.',
- });
- }
- } else if (!node.properties[key].value.length) {
- this.failedCollection.push({
- node: node.id,
- type: node.type,
- img: node.img,
- property: key,
- msg: 'Required field, value must be provided.',
- });
- }
- }
- }
- }
- });
- }
-
- submit() {
- this.validateSubmission();
-
- const pruneRelationshipObjectProperties = (bundle) => {
- const pruneList = ['targetObjectType', 'subTarget'];
-
- bundle.objects.map((o) => {
- if (o.type === 'relationship') {
- for (const key in o) {
- if (pruneList.indexOf(key) > -1) {
- delete o[key];
- }
- }
- }
- });
-
- return bundle;
- };
-
- if (!this.failedCollection.length) {
- let bundle = _cloneDeep(this.bundle);
-
- bundle.objects.map((o) => {
- for (const key in o) {
- if (Array.isArray(o[key])) {
- if (!o[key].length) {
- delete o[key];
- }
- } else if (typeof o[key] === 'object') {
- if (!Object.keys(o[key]).length) {
- delete o[key];
- }
- } else if (o[key] && !o[key].length) {
- delete o[key];
- }
- }
- });
-
- bundle = pruneRelationshipObjectProperties(bundle);
-
- /** *
- TODO plumb in your API call
- * */
- Proxy.submit(bundle);
- } else {
- this.showSubmissionError = true;
- }
- }
-
- resetSubmissionError() {
- this.showSubmissionError = false;
- this.failedCollection = [];
- }
-
- reset() {
- this.showDetails = false;
- this.showJSON = false;
- this.showRelPicker = false;
- this.showRelDetails = false;
- this.showRelEditor = false;
- this.groupMode = false;
- this.updateFlow = true;
- this.showGrowl = false;
- this.growlMessage = '';
- this.mutatedBundle = '';
- this.relationships = [];
- this.customRelationships = {};
- this.dragging = {};
- this.selected = {};
- this.selectedRel = {};
- this.selectedSDO = {};
- this.selectedGroup = [];
- this.bundle = {};
- this.nodes = [];
- this.edges = [];
- this.extensionDefs = {};
-
- this.bundle.spec_version = SPEC_VERSION;
- this.bundle.id = this.generateNodeID('bundle--');
- this.bundle.type = 'bundle';
- this.bundle.objects = [];
- this.generateExtensions();
- }
-}
diff --git a/app/.eslintrc.json b/stix-modeler-app/.eslintrc.json
similarity index 100%
rename from app/.eslintrc.json
rename to stix-modeler-app/.eslintrc.json
diff --git a/app/.gitignore b/stix-modeler-app/.gitignore
similarity index 100%
rename from app/.gitignore
rename to stix-modeler-app/.gitignore
diff --git a/stix-modeler-app/config/config.json b/stix-modeler-app/config/config.json
new file mode 100644
index 0000000..376901b
--- /dev/null
+++ b/stix-modeler-app/config/config.json
@@ -0,0 +1,7 @@
+{
+ "creator_id": "identity--b085a68a-bf48-4316-9667-37af78cba894",
+ "schema_dir": "/schemas",
+ "schemas": [
+
+ ]
+}
\ No newline at end of file
diff --git a/stix-modeler-app/eslint.config.js b/stix-modeler-app/eslint.config.js
new file mode 100644
index 0000000..15c2610
--- /dev/null
+++ b/stix-modeler-app/eslint.config.js
@@ -0,0 +1,22 @@
+import eslint from '@eslint/js';
+import globals from 'globals';
+import { defineConfig, globalIgnores } from 'eslint/config';
+import tseslint from 'typescript-eslint';
+
+export default defineConfig(
+ eslint.configs.recommended,
+ tseslint.configs.recommended,
+ tseslint.configs.stylistic,
+ globalIgnores([
+ "config/*",
+ "dist/*",
+ "node_modules/*",
+ ]),
+ {
+ languageOptions: {
+ globals: {
+ ...globals.browser
+ },
+ },
+ }
+);
\ No newline at end of file
diff --git a/app/index.html b/stix-modeler-app/index.html
similarity index 100%
rename from app/index.html
rename to stix-modeler-app/index.html
diff --git a/stix-modeler-app/package-lock.json b/stix-modeler-app/package-lock.json
new file mode 100644
index 0000000..4a8f42b
--- /dev/null
+++ b/stix-modeler-app/package-lock.json
@@ -0,0 +1,5466 @@
+{
+ "name": "stix-modeler-app",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "stix-modeler-app",
+ "version": "1.0.0",
+ "dependencies": {
+ "@vitejs/plugin-react": "^5.0.0",
+ "classnames": "^2.5.1",
+ "d3-hierarchy": "^3.1.2",
+ "deepmerge": "^4.3.1",
+ "lodash": "^4.17.21",
+ "mobx": "^6.0.0",
+ "mobx-react": "^9.0.0",
+ "moment": "^2.30.1",
+ "prop-types": "^15.8.0",
+ "rc-slider": "^11.1.0",
+ "react": "^19.0.0",
+ "react-datepicker": "^8.7.0",
+ "react-dom": "^19.0.0",
+ "react-tooltip": "^5.29.0",
+ "reactflow": "^11.11.0",
+ "sass": "^1.93.0",
+ "uuid": "13.0.0",
+ "vite": "^7.1.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.0.0",
+ "eslint": "^9.0.0",
+ "globals": "^16.4.0",
+ "jsdom": "^27.0.0",
+ "typescript-eslint": "^8.46.0",
+ "vitest": "^3.2.0"
+ }
+ },
+ "node_modules/@asamuzakjp/css-color": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.0.5.tgz",
+ "integrity": "sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.4",
+ "@csstools/css-color-parser": "^3.1.0",
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4",
+ "lru-cache": "^11.2.1"
+ }
+ },
+ "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": {
+ "version": "11.2.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz",
+ "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@asamuzakjp/dom-selector": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.6.1.tgz",
+ "integrity": "sha512-8QT9pokVe1fUt1C8IrJketaeFOdRfTOS96DL3EBjE8CRZm3eHnwMlQe2NPoOSEYPwJ5Q25uYoX1+m9044l3ysQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@asamuzakjp/nwsapi": "^2.3.9",
+ "bidi-js": "^1.0.3",
+ "css-tree": "^3.1.0",
+ "is-potential-custom-element-name": "^1.0.1",
+ "lru-cache": "^11.2.2"
+ }
+ },
+ "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": {
+ "version": "11.2.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz",
+ "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@asamuzakjp/nwsapi": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz",
+ "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz",
+ "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
+ "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.3",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-module-transforms": "^7.28.3",
+ "@babel/helpers": "^7.28.4",
+ "@babel/parser": "^7.28.4",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.4",
+ "@babel/types": "^7.28.4",
+ "@jridgewell/remapping": "^2.3.5",
+ "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/generator": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz",
+ "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.3",
+ "@babel/types": "^7.28.2",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.2",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
+ "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
+ "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
+ "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.4"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
+ "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/parser": "^7.27.2",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz",
+ "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.3",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.28.4",
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.4",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
+ "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@csstools/color-helpers": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz",
+ "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@csstools/css-calc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz",
+ "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/css-color-parser": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz",
+ "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/color-helpers": "^5.1.0",
+ "@csstools/css-calc": "^2.1.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/css-parser-algorithms": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz",
+ "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/@csstools/css-syntax-patches-for-csstree": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.14.tgz",
+ "integrity": "sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/css-tokenizer": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
+ "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz",
+ "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz",
+ "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz",
+ "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz",
+ "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz",
+ "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz",
+ "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz",
+ "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz",
+ "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz",
+ "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz",
+ "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz",
+ "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz",
+ "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz",
+ "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz",
+ "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz",
+ "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz",
+ "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz",
+ "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz",
+ "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz",
+ "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz",
+ "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz",
+ "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz",
+ "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz",
+ "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz",
+ "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz",
+ "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz",
+ "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+ "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/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-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
+ "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.6",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz",
+ "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.16.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz",
+ "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.37.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz",
+ "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+ "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz",
+ "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.16.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz",
+ "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.10"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz",
+ "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.7.3",
+ "@floating-ui/utils": "^0.2.10"
+ }
+ },
+ "node_modules/@floating-ui/react": {
+ "version": "0.27.16",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.16.tgz",
+ "integrity": "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.1.6",
+ "@floating-ui/utils": "^0.2.10",
+ "tabbable": "^6.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=17.0.0",
+ "react-dom": ">=17.0.0"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz",
+ "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.7.4"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
+ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
+ "license": "MIT"
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.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/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@parcel/watcher": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz",
+ "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "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.5.1",
+ "@parcel/watcher-darwin-arm64": "2.5.1",
+ "@parcel/watcher-darwin-x64": "2.5.1",
+ "@parcel/watcher-freebsd-x64": "2.5.1",
+ "@parcel/watcher-linux-arm-glibc": "2.5.1",
+ "@parcel/watcher-linux-arm-musl": "2.5.1",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.1",
+ "@parcel/watcher-linux-arm64-musl": "2.5.1",
+ "@parcel/watcher-linux-x64-glibc": "2.5.1",
+ "@parcel/watcher-linux-x64-musl": "2.5.1",
+ "@parcel/watcher-win32-arm64": "2.5.1",
+ "@parcel/watcher-win32-ia32": "2.5.1",
+ "@parcel/watcher-win32-x64": "2.5.1"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz",
+ "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "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.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz",
+ "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "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.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz",
+ "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "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.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz",
+ "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "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.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz",
+ "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz",
+ "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "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.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz",
+ "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "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.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz",
+ "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "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.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz",
+ "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "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.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz",
+ "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz",
+ "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "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.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz",
+ "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "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.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz",
+ "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@reactflow/background": {
+ "version": "11.3.14",
+ "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.14.tgz",
+ "integrity": "sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==",
+ "license": "MIT",
+ "dependencies": {
+ "@reactflow/core": "11.11.4",
+ "classcat": "^5.0.3",
+ "zustand": "^4.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/@reactflow/controls": {
+ "version": "11.2.14",
+ "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.14.tgz",
+ "integrity": "sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@reactflow/core": "11.11.4",
+ "classcat": "^5.0.3",
+ "zustand": "^4.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/@reactflow/core": {
+ "version": "11.11.4",
+ "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.11.4.tgz",
+ "integrity": "sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3": "^7.4.0",
+ "@types/d3-drag": "^3.0.1",
+ "@types/d3-selection": "^3.0.3",
+ "@types/d3-zoom": "^3.0.1",
+ "classcat": "^5.0.3",
+ "d3-drag": "^3.0.0",
+ "d3-selection": "^3.0.0",
+ "d3-zoom": "^3.0.0",
+ "zustand": "^4.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/@reactflow/minimap": {
+ "version": "11.7.14",
+ "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.14.tgz",
+ "integrity": "sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@reactflow/core": "11.11.4",
+ "@types/d3-selection": "^3.0.3",
+ "@types/d3-zoom": "^3.0.1",
+ "classcat": "^5.0.3",
+ "d3-selection": "^3.0.0",
+ "d3-zoom": "^3.0.0",
+ "zustand": "^4.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/@reactflow/node-resizer": {
+ "version": "2.2.14",
+ "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.14.tgz",
+ "integrity": "sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==",
+ "license": "MIT",
+ "dependencies": {
+ "@reactflow/core": "11.11.4",
+ "classcat": "^5.0.4",
+ "d3-drag": "^3.0.0",
+ "d3-selection": "^3.0.0",
+ "zustand": "^4.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/@reactflow/node-toolbar": {
+ "version": "1.3.14",
+ "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.14.tgz",
+ "integrity": "sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@reactflow/core": "11.11.4",
+ "classcat": "^5.0.3",
+ "zustand": "^4.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.38",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.38.tgz",
+ "integrity": "sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==",
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz",
+ "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz",
+ "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz",
+ "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz",
+ "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz",
+ "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz",
+ "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz",
+ "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz",
+ "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz",
+ "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz",
+ "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz",
+ "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz",
+ "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz",
+ "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz",
+ "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz",
+ "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz",
+ "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz",
+ "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz",
+ "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz",
+ "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz",
+ "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz",
+ "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz",
+ "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
+ "node_modules/@types/chai": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz",
+ "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/deep-eql": "*"
+ }
+ },
+ "node_modules/@types/d3": {
+ "version": "7.4.3",
+ "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",
+ "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-array": "*",
+ "@types/d3-axis": "*",
+ "@types/d3-brush": "*",
+ "@types/d3-chord": "*",
+ "@types/d3-color": "*",
+ "@types/d3-contour": "*",
+ "@types/d3-delaunay": "*",
+ "@types/d3-dispatch": "*",
+ "@types/d3-drag": "*",
+ "@types/d3-dsv": "*",
+ "@types/d3-ease": "*",
+ "@types/d3-fetch": "*",
+ "@types/d3-force": "*",
+ "@types/d3-format": "*",
+ "@types/d3-geo": "*",
+ "@types/d3-hierarchy": "*",
+ "@types/d3-interpolate": "*",
+ "@types/d3-path": "*",
+ "@types/d3-polygon": "*",
+ "@types/d3-quadtree": "*",
+ "@types/d3-random": "*",
+ "@types/d3-scale": "*",
+ "@types/d3-scale-chromatic": "*",
+ "@types/d3-selection": "*",
+ "@types/d3-shape": "*",
+ "@types/d3-time": "*",
+ "@types/d3-time-format": "*",
+ "@types/d3-timer": "*",
+ "@types/d3-transition": "*",
+ "@types/d3-zoom": "*"
+ }
+ },
+ "node_modules/@types/d3-array": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",
+ "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-axis": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz",
+ "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-brush": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz",
+ "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-chord": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz",
+ "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-color": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-contour": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz",
+ "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-array": "*",
+ "@types/geojson": "*"
+ }
+ },
+ "node_modules/@types/d3-delaunay": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+ "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-dispatch": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz",
+ "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-drag": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz",
+ "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-dsv": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",
+ "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-ease": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-fetch": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",
+ "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-dsv": "*"
+ }
+ },
+ "node_modules/@types/d3-force": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz",
+ "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-format": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz",
+ "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-geo": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz",
+ "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/geojson": "*"
+ }
+ },
+ "node_modules/@types/d3-hierarchy": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",
+ "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-interpolate": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-color": "*"
+ }
+ },
+ "node_modules/@types/d3-path": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",
+ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-polygon": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",
+ "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-quadtree": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",
+ "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-random": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz",
+ "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-scale": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",
+ "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-time": "*"
+ }
+ },
+ "node_modules/@types/d3-scale-chromatic": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
+ "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-selection": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz",
+ "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-shape": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz",
+ "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-path": "*"
+ }
+ },
+ "node_modules/@types/d3-time": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
+ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-time-format": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",
+ "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-timer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-transition": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz",
+ "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-zoom": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz",
+ "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-interpolate": "*",
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/deep-eql": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/geojson": {
+ "version": "7946.0.16",
+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz",
+ "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
+ "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/type-utils": "8.46.0",
+ "@typescript-eslint/utils": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^7.0.0",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.46.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+ "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
+ "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.46.0",
+ "@typescript-eslint/types": "^8.46.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
+ "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
+ "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz",
+ "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/utils": "8.46.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz",
+ "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
+ "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.46.0",
+ "@typescript-eslint/tsconfig-utils": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+ "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
+ "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.46.0",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.4.tgz",
+ "integrity": "sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.28.4",
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
+ "@rolldown/pluginutils": "1.0.0-beta.38",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.17.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz",
+ "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/chai": "^5.2.2",
+ "@vitest/spy": "3.2.4",
+ "@vitest/utils": "3.2.4",
+ "chai": "^5.2.0",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/mocker": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz",
+ "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "3.2.4",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.17"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz",
+ "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz",
+ "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "3.2.4",
+ "pathe": "^2.0.3",
+ "strip-literal": "^3.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz",
+ "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.2.4",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz",
+ "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyspy": "^4.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz",
+ "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.2.4",
+ "loupe": "^3.1.4",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "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/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "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/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "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/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.8.13",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.13.tgz",
+ "integrity": "sha512-7s16KR8io8nIBWQyCYhmFhd+ebIzb9VKTzki+wOJXHTxTnV6+mFGH3+Jwn1zoKaY9/H9T/0BcKCZnzXljPnpSQ==",
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/bidi-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz",
+ "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "require-from-string": "^2.0.2"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "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==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.26.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz",
+ "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==",
+ "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"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.8.9",
+ "caniuse-lite": "^1.0.30001746",
+ "electron-to-chromium": "^1.5.227",
+ "node-releases": "^2.0.21",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/caniuse-lite": {
+ "version": "1.0.30001748",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001748.tgz",
+ "integrity": "sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==",
+ "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"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chai": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz",
+ "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assertion-error": "^2.0.1",
+ "check-error": "^2.1.1",
+ "deep-eql": "^5.0.1",
+ "loupe": "^3.1.0",
+ "pathval": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "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/check-error": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
+ "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/classcat": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz",
+ "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==",
+ "license": "MIT"
+ },
+ "node_modules/classnames": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
+ "license": "MIT"
+ },
+ "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/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==",
+ "dev": true,
+ "license": "MIT",
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz",
+ "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.12.2",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/cssstyle": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.1.tgz",
+ "integrity": "sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@asamuzakjp/css-color": "^4.0.3",
+ "@csstools/css-syntax-patches-for-csstree": "^1.0.14",
+ "css-tree": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-dispatch": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-drag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
+ "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-selection": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-ease": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-hierarchy": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
+ "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-color": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-selection": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-timer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-transition": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
+ "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-color": "1 - 3",
+ "d3-dispatch": "1 - 3",
+ "d3-ease": "1 - 3",
+ "d3-interpolate": "1 - 3",
+ "d3-timer": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "d3-selection": "2 - 3"
+ }
+ },
+ "node_modules/d3-zoom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
+ "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-drag": "2 - 3",
+ "d3-interpolate": "1 - 3",
+ "d3-selection": "2 - 3",
+ "d3-transition": "2 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/data-urls": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.0.tgz",
+ "integrity": "sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-mimetype": "^4.0.0",
+ "whatwg-url": "^15.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/date-fns": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
+ "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/kossnocorp"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
+ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/deep-eql": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
+ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.232",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.232.tgz",
+ "integrity": "sha512-ENirSe7wf8WzyPCibqKUG1Cg43cPaxH4wRR7AJsX7MCABCHBIOFqvaYODSLKUuZdraxUTHRE/0A2Aq8BYKEHOg==",
+ "license": "ISC"
+ },
+ "node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.10",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz",
+ "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.10",
+ "@esbuild/android-arm": "0.25.10",
+ "@esbuild/android-arm64": "0.25.10",
+ "@esbuild/android-x64": "0.25.10",
+ "@esbuild/darwin-arm64": "0.25.10",
+ "@esbuild/darwin-x64": "0.25.10",
+ "@esbuild/freebsd-arm64": "0.25.10",
+ "@esbuild/freebsd-x64": "0.25.10",
+ "@esbuild/linux-arm": "0.25.10",
+ "@esbuild/linux-arm64": "0.25.10",
+ "@esbuild/linux-ia32": "0.25.10",
+ "@esbuild/linux-loong64": "0.25.10",
+ "@esbuild/linux-mips64el": "0.25.10",
+ "@esbuild/linux-ppc64": "0.25.10",
+ "@esbuild/linux-riscv64": "0.25.10",
+ "@esbuild/linux-s390x": "0.25.10",
+ "@esbuild/linux-x64": "0.25.10",
+ "@esbuild/netbsd-arm64": "0.25.10",
+ "@esbuild/netbsd-x64": "0.25.10",
+ "@esbuild/openbsd-arm64": "0.25.10",
+ "@esbuild/openbsd-x64": "0.25.10",
+ "@esbuild/openharmony-arm64": "0.25.10",
+ "@esbuild/sunos-x64": "0.25.10",
+ "@esbuild/win32-arm64": "0.25.10",
+ "@esbuild/win32-ia32": "0.25.10",
+ "@esbuild/win32-x64": "0.25.10"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.37.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz",
+ "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.0",
+ "@eslint/config-helpers": "^0.4.0",
+ "@eslint/core": "^0.16.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.37.0",
+ "@eslint/plugin-kit": "^0.4.0",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "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/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.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==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expect-type": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz",
+ "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==",
+ "dev": true,
+ "license": "Apache-2.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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "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.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/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==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "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/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.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==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "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/globals": {
+ "version": "16.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz",
+ "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
+ "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-encoding": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz",
+ "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==",
+ "license": "MIT"
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "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/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "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/jsdom": {
+ "version": "27.0.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.0.0.tgz",
+ "integrity": "sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@asamuzakjp/dom-selector": "^6.5.4",
+ "cssstyle": "^5.3.0",
+ "data-urls": "^6.0.0",
+ "decimal.js": "^10.5.0",
+ "html-encoding-sniffer": "^4.0.0",
+ "http-proxy-agent": "^7.0.2",
+ "https-proxy-agent": "^7.0.6",
+ "is-potential-custom-element-name": "^1.0.1",
+ "parse5": "^7.3.0",
+ "rrweb-cssom": "^0.8.0",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^6.0.0",
+ "w3c-xmlserializer": "^5.0.0",
+ "webidl-conversions": "^8.0.0",
+ "whatwg-encoding": "^3.1.1",
+ "whatwg-mimetype": "^4.0.0",
+ "whatwg-url": "^15.0.0",
+ "ws": "^8.18.2",
+ "xml-name-validator": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "peerDependencies": {
+ "canvas": "^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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-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==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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/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/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/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "license": "MIT"
+ },
+ "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/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==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/loupe": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz",
+ "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.19",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz",
+ "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
+ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mobx": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.15.0.tgz",
+ "integrity": "sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mobx"
+ }
+ },
+ "node_modules/mobx-react": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.2.1.tgz",
+ "integrity": "sha512-WJNNm0FB2n0Z0u+jS1QHmmWyV8l2WiAj8V8I/96kbUEN2YbYCoKW+hbbqKKRUBqElu0llxM7nWKehvRIkhBVJw==",
+ "license": "MIT",
+ "dependencies": {
+ "mobx-react-lite": "^4.1.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mobx"
+ },
+ "peerDependencies": {
+ "mobx": "^6.9.0",
+ "react": "^16.8.0 || ^17 || ^18 || ^19"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/mobx-react-lite": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.1.1.tgz",
+ "integrity": "sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==",
+ "license": "MIT",
+ "dependencies": {
+ "use-sync-external-store": "^1.4.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mobx"
+ },
+ "peerDependencies": {
+ "mobx": "^6.9.0",
+ "react": "^16.8.0 || ^17 || ^18 || ^19"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "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/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.23",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz",
+ "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.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/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/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/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/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pathval": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz",
+ "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "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.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "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/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.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/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/rc-slider": {
+ "version": "11.1.9",
+ "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.9.tgz",
+ "integrity": "sha512-h8IknhzSh3FEM9u8ivkskh+Ef4Yo4JRIY2nj7MrH6GQmrwV6mcpJf5/4KgH5JaVI1H3E52yCdpOlVyGZIeph5A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.10.1",
+ "classnames": "^2.2.5",
+ "rc-util": "^5.36.0"
+ },
+ "engines": {
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/rc-util": {
+ "version": "5.44.4",
+ "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz",
+ "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "react-is": "^18.2.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/rc-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==",
+ "license": "MIT"
+ },
+ "node_modules/react": {
+ "version": "19.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
+ "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-datepicker": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-8.7.0.tgz",
+ "integrity": "sha512-r5OJbiLWc3YiVNy69Kau07/aVgVGsFVMA6+nlqCV7vyQ8q0FUOnJ+wAI4CgVxHejG3i5djAEiebrF8/Eip4rIw==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react": "^0.27.15",
+ "clsx": "^2.1.1",
+ "date-fns": "^4.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc",
+ "react-dom": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz",
+ "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.0"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/react-refresh": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-tooltip": {
+ "version": "5.29.1",
+ "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.29.1.tgz",
+ "integrity": "sha512-rmJmEb/p99xWhwmVT7F7riLG08wwKykjHiMGbDPloNJk3tdI73oHsVOwzZ4SRjqMdd5/xwb/4nmz0RcoMfY7Bw==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.6.1",
+ "classnames": "^2.3.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.14.0",
+ "react-dom": ">=16.14.0"
+ }
+ },
+ "node_modules/reactflow": {
+ "version": "11.11.4",
+ "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.11.4.tgz",
+ "integrity": "sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@reactflow/background": "11.3.14",
+ "@reactflow/controls": "11.2.14",
+ "@reactflow/core": "11.11.4",
+ "@reactflow/minimap": "11.7.14",
+ "@reactflow/node-resizer": "2.2.14",
+ "@reactflow/node-toolbar": "1.3.14"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.52.4",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz",
+ "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.52.4",
+ "@rollup/rollup-android-arm64": "4.52.4",
+ "@rollup/rollup-darwin-arm64": "4.52.4",
+ "@rollup/rollup-darwin-x64": "4.52.4",
+ "@rollup/rollup-freebsd-arm64": "4.52.4",
+ "@rollup/rollup-freebsd-x64": "4.52.4",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.52.4",
+ "@rollup/rollup-linux-arm-musleabihf": "4.52.4",
+ "@rollup/rollup-linux-arm64-gnu": "4.52.4",
+ "@rollup/rollup-linux-arm64-musl": "4.52.4",
+ "@rollup/rollup-linux-loong64-gnu": "4.52.4",
+ "@rollup/rollup-linux-ppc64-gnu": "4.52.4",
+ "@rollup/rollup-linux-riscv64-gnu": "4.52.4",
+ "@rollup/rollup-linux-riscv64-musl": "4.52.4",
+ "@rollup/rollup-linux-s390x-gnu": "4.52.4",
+ "@rollup/rollup-linux-x64-gnu": "4.52.4",
+ "@rollup/rollup-linux-x64-musl": "4.52.4",
+ "@rollup/rollup-openharmony-arm64": "4.52.4",
+ "@rollup/rollup-win32-arm64-msvc": "4.52.4",
+ "@rollup/rollup-win32-ia32-msvc": "4.52.4",
+ "@rollup/rollup-win32-x64-gnu": "4.52.4",
+ "@rollup/rollup-win32-x64-msvc": "4.52.4",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rrweb-cssom": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz",
+ "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/sass": {
+ "version": "1.93.2",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz",
+ "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==",
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^4.0.0",
+ "immutable": "^5.0.2",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
+ }
+ },
+ "node_modules/saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=v12.22.7"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/std-env": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz",
+ "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/strip-literal": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz",
+ "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^9.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/strip-literal/node_modules/js-tokens": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinypool": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
+ "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ }
+ },
+ "node_modules/tinyrainbow": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
+ "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tinyspy": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz",
+ "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tldts": {
+ "version": "7.0.16",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.16.tgz",
+ "integrity": "sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tldts-core": "^7.0.16"
+ },
+ "bin": {
+ "tldts": "bin/cli.js"
+ }
+ },
+ "node_modules/tldts-core": {
+ "version": "7.0.16",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.16.tgz",
+ "integrity": "sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz",
+ "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tldts": "^7.0.5"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz",
+ "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "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/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.0.tgz",
+ "integrity": "sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.46.0",
+ "@typescript-eslint/parser": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/utils": "8.46.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "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"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "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-sync-external-store": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz",
+ "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist-node/bin/uuid"
+ }
+ },
+ "node_modules/vite": {
+ "version": "7.1.9",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz",
+ "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==",
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-node": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz",
+ "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cac": "^6.7.14",
+ "debug": "^4.4.1",
+ "es-module-lexer": "^1.7.0",
+ "pathe": "^2.0.3",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
+ },
+ "bin": {
+ "vite-node": "vite-node.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/vitest": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz",
+ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/chai": "^5.2.2",
+ "@vitest/expect": "3.2.4",
+ "@vitest/mocker": "3.2.4",
+ "@vitest/pretty-format": "^3.2.4",
+ "@vitest/runner": "3.2.4",
+ "@vitest/snapshot": "3.2.4",
+ "@vitest/spy": "3.2.4",
+ "@vitest/utils": "3.2.4",
+ "chai": "^5.2.0",
+ "debug": "^4.4.1",
+ "expect-type": "^1.2.1",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.2",
+ "std-env": "^3.9.0",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^0.3.2",
+ "tinyglobby": "^0.2.14",
+ "tinypool": "^1.1.1",
+ "tinyrainbow": "^2.0.0",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0",
+ "vite-node": "3.2.4",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@types/debug": "^4.1.12",
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "@vitest/browser": "3.2.4",
+ "@vitest/ui": "3.2.4",
+ "happy-dom": "*",
+ "jsdom": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@types/debug": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/w3c-xmlserializer": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
+ "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xml-name-validator": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.0.tgz",
+ "integrity": "sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+ "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz",
+ "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "^6.0.0",
+ "webidl-conversions": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/ws": {
+ "version": "8.18.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
+ "dev": true,
+ "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/xml-name-validator": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
+ "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "license": "ISC"
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zustand": {
+ "version": "4.5.7",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz",
+ "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==",
+ "license": "MIT",
+ "dependencies": {
+ "use-sync-external-store": "^1.2.2"
+ },
+ "engines": {
+ "node": ">=12.7.0"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.8",
+ "immer": ">=9.0.6",
+ "react": ">=16.8"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "immer": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/stix-modeler-app/package.json b/stix-modeler-app/package.json
new file mode 100644
index 0000000..ba83d4b
--- /dev/null
+++ b/stix-modeler-app/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "stix-modeler-app",
+ "private": true,
+ "version": "1.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "test": "vitest",
+ "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
+ "lint:fix": "npm run lint -- --fix",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@vitejs/plugin-react": "^5.0.0",
+ "classnames": "^2.5.1",
+ "d3-hierarchy": "^3.1.2",
+ "deepmerge": "^4.3.1",
+ "lodash": "^4.17.21",
+ "mobx": "^6.0.0",
+ "mobx-react": "^9.0.0",
+ "moment": "^2.30.1",
+ "prop-types": "^15.8.0",
+ "rc-slider": "^11.1.0",
+ "react": "^19.0.0",
+ "react-datepicker": "^8.7.0",
+ "react-dom": "^19.0.0",
+ "react-tooltip": "^5.29.0",
+ "reactflow": "^11.11.0",
+ "sass": "^1.93.0",
+ "uuid": "13.0.0",
+ "vite": "^7.1.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.0.0",
+ "eslint": "^9.0.0",
+ "globals": "^16.4.0",
+ "jsdom": "^27.0.0",
+ "typescript-eslint": "^8.46.0",
+ "vitest": "^3.2.0"
+ }
+}
diff --git a/stix-modeler-app/public/vite.svg b/stix-modeler-app/public/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/stix-modeler-app/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/stix-modeler-app/schemas/README.md b/stix-modeler-app/schemas/README.md
new file mode 100644
index 0000000..99258f0
--- /dev/null
+++ b/stix-modeler-app/schemas/README.md
@@ -0,0 +1,5 @@
+# Import Schemas #
+
+Any schemas placed in this folder can be imported via ```config.json```.
+
+**REMEMBER**: The browser can only import files within ```stix-modeler-app```
\ No newline at end of file
diff --git a/app/src/App.jsx b/stix-modeler-app/src/App.jsx
similarity index 100%
rename from app/src/App.jsx
rename to stix-modeler-app/src/App.jsx
diff --git a/app/src/app.scss b/stix-modeler-app/src/App.scss
similarity index 66%
rename from app/src/app.scss
rename to stix-modeler-app/src/App.scss
index d687df9..9040da4 100644
--- a/app/src/app.scss
+++ b/stix-modeler-app/src/App.scss
@@ -1,4 +1,4 @@
-@import './defaults';
+@use './defaults';
body, html, #app {
margin: 0px;
@@ -8,5 +8,5 @@ body, html, #app {
bottom: 0;
left: 0;
right: 0;
- font-family: $default-font-family;
+ font-family: defaults.$default-font-family;
}
diff --git a/app/src/components/Canvas.jsx b/stix-modeler-app/src/components/Canvas.jsx
similarity index 62%
rename from app/src/components/Canvas.jsx
rename to stix-modeler-app/src/components/Canvas.jsx
index ea76d88..5674c44 100644
--- a/app/src/components/Canvas.jsx
+++ b/stix-modeler-app/src/components/Canvas.jsx
@@ -3,7 +3,7 @@ import { inject, observer } from 'mobx-react';
import BottomMenu from './menus/BottomMenu';
import TopMenu from './menus/TopMenu';
import Details from './Details';
-import SDOEditor from './schema/SDOEditor';
+import ExtensionEditor from './schema/ExtensionEditor';
import FileImporter from './FileImporter';
import JsonViewer from './bundle/JsonViewer';
import JsonPaste from './bundle/JsonPaste';
@@ -11,7 +11,8 @@ import SchemaPaste from './schema/SchemaPaste';
import RelationshipPicker from './relationship/RelationshipPicker';
import RelationshipDetails from './relationship/RelationshipDetails';
import RelationshipEditor from './relationship/RelationshipEditor';
-import SDOPicker from './schema/SDOPicker';
+import ExtensionPicker from './schema/ExtensionPicker';
+import LayoutPanel from './layout/LayoutPanel';
import Growl from './ui/growl/Growl';
import SubmissionError from './SubmissionError';
import Flow from './Flow/Flow';
@@ -20,8 +21,7 @@ import './canvas.scss';
class Canvas extends React.Component {
constructor(props) {
- super(props);
-
+ super(props);
this.store = this.props.store.appStore;
this.generateNodeID = this.generateNodeID.bind(this);
@@ -48,10 +48,16 @@ class Canvas extends React.Component {
this.onClickShowRelDetailsHandler = this.onClickShowRelDetailsHandler.bind(
this
);
- this.onClickShowSDOPickerHandler = this.onClickShowSDOPickerHandler.bind(
+ this.onClickShowExtensionPickerHandler = this.onClickShowExtensionPickerHandler.bind(
this
);
- this.onClickHideSDOPickerHandler = this.onClickHideSDOPickerHandler.bind(
+ this.onClickHideExtensionPickerHandler = this.onClickHideExtensionPickerHandler.bind(
+ this
+ );
+ this.onClickShowLayoutPanelHandler = this.onClickShowLayoutPanelHandler.bind(
+ this
+ );
+ this.onClickHideLayoutPanelHandler = this.onClickHideLayoutPanelHandler.bind(
this
);
this.onClickShowImporterHandler = this.onClickShowImporterHandler.bind(
@@ -65,13 +71,13 @@ class Canvas extends React.Component {
this.onClickCreateRelHandler = this.onClickCreateRelHandler.bind(this);
this.onClickEditRelHandler = this.onClickEditRelHandler.bind(this);
this.onClickSelectRelHandler = this.onClickSelectRelHandler.bind(this);
- this.onClickSelectSDOHandler = this.onClickSelectSDOHandler.bind(this);
+ this.onClickSelectExtHandler = this.onClickSelectExtHandler.bind(this);
this.onClickShowGrowlHandler = this.onClickShowGrowlHandler.bind(this);
this.onClickGroupNodeHandler = this.onClickGroupNodeHandler.bind(this);
this.onClickGroupModeHandler = this.onClickGroupModeHandler.bind(this);
this.onClickSubmitGroupingHandler = this.onClickSubmitGroupingHandler.bind(this);
this.onChangeNodeHandler = this.onChangeNodeHandler.bind(this);
- this.onChangeSDOHandler = this.onChangeSDOHandler.bind(this);
+ this.onChangeExtHandler = this.onChangeExtHandler.bind(this);
this.onChangeSchemaHandler = this.onChangeSchemaHandler.bind(this);
this.onChangeBundleHandler = this.onChangeBundleHandler.bind(this);
this.onChangeDateHandler = this.onChangeDateHandler.bind(this);
@@ -129,24 +135,45 @@ class Canvas extends React.Component {
);
this.onClickSchemaPasteHandler = this.onClickSchemaPasteHandler.bind(this);
this.onClickDeleteHandler = this.onClickDeleteHandler.bind(this);
- this.onClickDeleteSDOHandler = this.onClickDeleteSDOHandler.bind(this);
+ this.onClickDeleteExtHandler = this.onClickDeleteExtHandler.bind(this);
this.onClickDeleteRelHandler = this.onClickDeleteRelHandler.bind(this);
- this.onClickSubmitHandler = this.onClickSubmitHandler.bind(this);
+ this.onClickExportHandler = this.onClickExportHandler.bind(this);
+ this.onClickShowSubmissionErrorHandler = this.onClickShowSubmissionErrorHandler.bind(this);
this.onClickHideSubmissionErrorHandler = this.onClickHideSubmissionErrorHandler.bind(
this
);
+ this.onClickErrorHandler = this.onClickErrorHandler.bind(this);
+
+
}
- componentWillUnmount() {
- document.removeEventListener('dragover', () => {}, false);
- }
-
+ /**
+ * Select the node with specified id.
+ * @param {string} nodeId id of node
+ */
onClickHandler(nodeId) {
const node = this.store.getNodeById(nodeId);
this.store.setShowDetails(true);
this.store.setSelected(node);
}
+ /**
+ * Select the node associated with the specified id,
+ * from the Submission Errors panel.
+ * @param {string} nodeId
+ */
+ onClickErrorHandler(nodeId) {
+ this.store.setShowSubmissionError(false);
+ this.store.showSubmissionErrorBadge = false;
+ const node = this.store.getNodeById(nodeId);
+ this.store.setShowDetails(true);
+ this.store.setSelected(node);
+ }
+
+ /**
+ * Activate or deactivate grouping selection.
+ * @param {boolean} isGrouping whether currently selecting group
+ */
onClickGroupModeHandler(isGrouping) {
this.store.setGroupMode(isGrouping);
if (!isGrouping) {
@@ -155,11 +182,20 @@ class Canvas extends React.Component {
}
}
+ /**
+ * Add or remove the node with specified node from
+ * grouping selection.
+ * @param {string} id node id
+ */
onClickGroupNodeHandler(id) {
this.store.modifyGroup(id);
this.setUpdateFlow(true);
}
+ /**
+ * Create a new Grouping SDO, including all nodes
+ * from the grouping selection.
+ */
onClickSubmitGroupingHandler() {
const id = this.generateNodeID('grouping--');
this.store.createGroup(id);
@@ -167,73 +203,140 @@ class Canvas extends React.Component {
this.setUpdateFlow(true);
}
+ /**
+ * Select the relationship with the specified ID
+ * to edit via the Relationship Editor panel.
+ * @param {*} relId relationship id
+ */
onClickRelHandler(relId) {
const rel = this.store.getRelById(relId);
this.store.setShowRelEditor(true);
this.store.setSelectedRel(rel);
}
+ /**
+ * Hide the details panel.
+ */
onClickHideDetailsHandler() {
this.store.setShowDetails(false);
}
+ /**
+ * Hide the Extension Editor panel.
+ */
onClickHideEditorHandler() {
this.store.setShowEditor(false);
}
+ /**
+ * Hide the Json Paste panel.
+ */
onClickHideJsonPasteHandler() {
this.store.setShowJSONPaste(false);
}
+ /**
+ * Show the Json Paste panel.
+ */
onClickShowJsonPasteHandler() {
this.store.setShowJSONPaste(true);
}
+ /**
+ * Hide the Schema Paste panel.
+ */
onClickHideSchemaPasteHandler() {
this.store.setShowSchemaPaste(false);
}
+ /**
+ * Show the Schema Paste panel.
+ */
onClickShowSchemaPasteHandler() {
this.store.setShowSchemaPaste(true);
}
+ /**
+ * Display the growl message.
+ * @param {string} message growl message
+ */
onClickShowGrowlHandler(message) {
this.store.setGrowlMessage(message);
this.store.setShowGrowl(true);
}
- onClickHideSubmissionErrorHandler() {
- this.store.resetSubmissionError();
+ /**
+ * Hide the Submission Error panel.
+ */
+ onClickShowSubmissionErrorHandler() {
+ this.store.setShowSubmissionError(true);
+ this.store.validateSubmission();
}
+ /**
+ * Hide the Submission Error panel.
+ */
+ onClickHideSubmissionErrorHandler() {
+ this.store.showSubmissionErrorBadge = false;
+ this.store.setShowSubmissionError(false);
+ }
+
+ /**
+ * Delete the selected node.
+ */
onClickDeleteHandler() {
this.store.deleteSelectedNode();
this.setUpdateFlow(true);
}
- onClickDeleteSDOHandler() {
- this.store.deleteSelectedSDO();
+ /**
+ * Delete the selected extension.
+ */
+ onClickDeleteExtHandler() {
+ this.store.deleteSelectedExt();
+ this.setUpdateFlow(true);
}
+ /**
+ * Delete the selected relationship.
+ */
onClickDeleteRelHandler() {
this.store.deleteSelectedRelationship();
this.setUpdateFlow(true);
}
+
+ /**
+ * Update the specified property value for
+ * the selected node.
+ * @param {*} event
+ */
onChangeNodeHandler(event) {
this.store.editNodeValues(event);
this.setUpdateFlow(true);
}
- onChangeSDOHandler(event) {
- this.store.editSDOValues(event);
- this.forceUpdate();
+ /**
+ * Update the specified property value for
+ * the selected extension.
+ * @param {*} event
+ */
+ onChangeExtHandler(event) {
+ this.store.editExtensionValues(event);
}
+ /**
+ * Import a schema from a file.
+ * @param {object} file schema json
+ */
onChangeSchemaHandler(file) {
this.store.loadSchemaFromFile(file);
}
+ /**
+ * Import a bundle from a file.
+ * @param {*} file bundle json
+ */
onChangeBundleHandler(file) {
this.store.loadBundleFromFile(file);
this.store.nodes.map((n) => {
@@ -242,58 +345,129 @@ class Canvas extends React.Component {
this.setUpdateFlow(true);
}
+ /**
+ * Update the Creator ID for SDO, SCO, and SROs created
+ * via the STIX UI.
+ * @param {string} id
+ */
onChangeCreatorIDHandler(id) {
this.store.updateCreatorID(id);
}
+ /**
+ * Update the specified date property for the
+ * selected node.
+ * @param {string} property
+ * @param {*} datetime
+ */
onChangeDateHandler(property, datetime) {
const value = this.store.generateTimestamp(datetime);
this.mutateOnEvent(property, value);
}
+ /**
+ * Update the specified array property for
+ * the selected node.
+ * @param {string} property
+ * @param {*} value
+ */
onClickArrayHandler(property, value) {
this.mutateOnEvent(property, value);
}
+ /**
+ * Update the specified property for
+ * the selected node (for Slider inputs).
+ * @param {string} property
+ * @param {*} value
+ */
onChangeSliderHandler(property, value) {
this.mutateOnEvent(property, value);
}
+ /**
+ * Update the specified boolean property
+ * for the selected node.
+ * @param {string} property
+ * @param {boolean} value
+ */
onClickBooleanHandler(property, value) {
this.mutateOnEvent(property, value);
}
+ /**
+ * Update the specified kill chain property
+ * for the selected node.
+ * @param {string} property
+ * @param {*} value
+ */
onChangePhaseHandler(property, value) {
this.mutateOnEvent(property, value);
}
+ /**
+ * Update the specified property for the
+ * selected node (for Confirm Text Area inputs).
+ * @param {string} property
+ * @param {string} value
+ */
onClickAddTextHandler(property, value) {
this.mutateOnEvent(property, value);
}
+ /**
+ * Update the specified list property for the
+ * selected node.
+ * @param {string} property
+ * @param {*} value
+ */
onChangeListHandler(property, value) {
this.mutateOnEvent(property, value);
}
+ /**
+ * Update the object property for the selected node.
+ * @param {string} property
+ * @param {*} event
+ */
onChangeGenericObjectHandler(property, event) {
this.mutateOnEvent(property, event.currentTarget.value);
}
- onClickRemovePhaseHander(property, value) {
- this.store.removeKillChainPhase(value);
+ /**
+ * Remove the specified kill chain phase property
+ * for the selected node.
+ * @param {string} property
+ * @param {number} idx index of phase in kill chain
+ */
+ onClickRemovePhaseHander(property, idx) {
+ this.store.deleteArrayObject(idx, property);
}
+ /**
+ * Update the specified array property for the selected value
+ * (for use with Comma Seperated Value inputs).
+ * @param {*} event
+ */
onChangeCSVHandler(event) {
this.store.editCSVInput(event);
}
+ /**
+ * Create a new relationship between the specified
+ * source and target.
+ * @param {string} srcId id of source
+ * @param {string} targetId id of target
+ * @param {object} rel relationship object
+ */
onClickCreateRelHandler(srcId, targetId, rel) {
const src = { id: srcId, };
const target = { id: targetId, };
const relationship = this.store.makeRelationship(src, target, rel);
if (relationship) {
this.onClickSelectRelHandler(relationship);
- this.store.addCustomRelationship(rel, srcId, targetId);
+ // this.store.addCustomRelationship(rel, srcId, targetId);
+ this.store.addCustomRelationship(rel, srcId);
this.setUpdateFlow(true);
} else {
this.store.setGrowlMessage('Could not create relationship');
@@ -301,12 +475,20 @@ class Canvas extends React.Component {
}
}
+ /**
+ * Edit the specified relationship.
+ * @param {object} rel
+ */
onClickEditRelHandler(rel) {
this.store.editRelationship(rel);
this.store.setShowRelEditor(false);
this.setUpdateFlow(true);
}
+ /**
+ * Select the specified relationship.
+ * @param {object} relationship
+ */
onClickSelectRelHandler(relationship) {
this.store.setShowRelDetails(false);
this.store.manuallySelectRelationship(relationship);
@@ -314,107 +496,211 @@ class Canvas extends React.Component {
this.setUpdateFlow(true);
}
- onClickSelectSDOHandler(sdo) {
- this.store.setSelectedSDO(sdo);
+ /**
+ * Select the specified extension.
+ * @param {object} extension
+ */
+ onClickSelectExtHandler(extension) {
+ this.store.setSelectedExt(extension)
this.store.setShowEditor(true);
}
+ /**
+ * Add an object to the specified object array
+ * property for the selected node.
+ * @param {string} field
+ * @param {list} requiredFields
+ */
onClickAddObjectHandler(field, requiredFields) {
this.store.addDefaultObject(field, requiredFields);
}
+ /**
+ * Delete the specified property from an external reference
+ * for the selected node.
+ * @param {object} select property to delete
+ * @param {number} idx index of external reference in external references
+ */
onClickDeletePropertyHandler(select, idx) {
this.store.deleteERObjectProperty(select, idx);
}
+ /**
+ * Delete the specified field for an object in the specified
+ * property array for the selected node.
+ * @param {string} select object property
+ * @param {number} idx index of object in node property
+ * @param {string} property node property
+ */
onClickDeleteArrayObjectPropertyHandler(select, idx, property) {
this.store.deleteArrayObjectProperty(select, idx, property);
}
+ /**
+ * Delete the specified external reference from the
+ * external references property for the selected node.
+ * @param {number} idx external reference index
+ */
onClickDeleteERHandler(idx) {
this.store.deleteERObject(idx);
}
+ /**
+ * Delete the specified object from the specified
+ * array property for the selected node.
+ * @param {number} idx index of object in node property
+ * @param {string} property node property
+ */
onClickDeleteArrayObjectHandler(idx, property) {
this.store.deleteArrayObject(idx, property);
}
+ /**
+ * Update the specified field for an object in the specified
+ * property array for the selected node.
+ * @param {string} select object property
+ * @param {number} idx index of object in node property
+ * @param {string} property node property
+ */
onChangeERHandler(input, select, idx) {
this.store.changeERValue(input, select, idx);
}
+ /**
+ * Update the specified object from the specified
+ * array property for the selected node.
+ * @param {number} idx index of object in node property
+ * @param {string} property node property
+ */
onChangeArrayObjectHandler(input, field, idx, property) {
this.store.changeArrayObjectValue(input, field, idx, property);
}
+ /**
+ * Show the JSON Viewer panel.
+ */
onClickShowJsonHandler() {
- this.store.mutateBundle();
+ this.store.stringifyBundle();
this.store.setShowJSON(true);
}
+ /**
+ * Hide the JSON Viewer panel.
+ */
onClickHideJsonHandler() {
this.store.setShowJSON(false);
}
+ /**
+ * Update the store pasteBundle value to
+ * the specified value.
+ * @param {*} event
+ */
onChangeJSONPasteHandler(event) {
this.store.setPasteBundle(event.currentTarget.value);
}
+ /**
+ * Import a bundle from the Json Paste panel.
+ */
onClickJSONPasteHandler() {
- this.store.loadBundleFromPaste();
-
+ this.store.loadBundleFromPaste();
this.store.nodes.map((n) => {
this.transition(n.id, true);
});
this.setUpdateFlow(true);
}
+ /**
+ * Update the store pasteSchema value to
+ * the specified value.
+ * @param {*} event
+ */
onChangeSchemaPasteHandler(event) {
this.store.setPasteSchema(event.currentTarget.value);
}
+ /**
+ * Import a schema from the Schema Paste panel.
+ */
onClickSchemaPasteHandler() {
this.store.loadSchemaFromPaste();
}
+ /**
+ * Show the Relationship Details panel.
+ */
onClickShowRelDetailsHandler() {
this.store.setShowRelDetails(true);
this.store.setShowRelPicker(false);
}
+ /**
+ * Hide the Relationship Details panel.
+ */
onClickHideRelDetailsHandler() {
this.store.setShowRelDetails(false);
this.store.setShowRelPicker(true);
}
+ /**
+ * Hide the Relationship Editor panel.
+ */
onClickHideRelEditorHandler() {
this.store.setShowRelEditor(false);
}
+ /**
+ * Hide the Relationship Picker panel.
+ */
onClickHideRelPickerHandler() {
this.store.setShowRelPicker(false);
}
- onClickShowSDOPickerHandler() {
- this.store.setShowSDOPicker(true);
+ /**
+ * Show the Extension Picker panel.
+ */
+ onClickShowExtensionPickerHandler() {
+ this.store.setShowExtensionPicker(true);
}
- onClickHideSDOPickerHandler() {
- this.store.setShowSDOPicker(false);
+ /**
+ * Hide the Extension Picker panel.
+ */
+ onClickHideExtensionPickerHandler() {
+ this.store.setShowExtensionPicker(false);
}
+ onClickShowLayoutPanelHandler() {
+ this.store.setShowLayoutPanel(true);
+ }
+ onClickHideLayoutPanelHandler() {
+ this.store.setShowLayoutPanel(false);
+ }
+
+ /**
+ * Hide the File Importer panel.
+ */
onClickHideImporterHandler() {
this.store.setShowImporter(false);
}
+ /**
+ * Show the File Importer panel.
+ */
onClickShowImporterHandler() {
this.store.setShowImporter(true);
}
+ // Prevent event propagation.
onDragOverHandler(event) {
event.preventDefault();
}
+ /**
+ * Set the dragged source node to the specified node.
+ * @param {*} event
+ */
onDragStartHandler(event) {
const node = JSON.parse(event.dataTransfer.getData('node'));
this.store.setDragging(node);
@@ -426,7 +712,11 @@ class Canvas extends React.Component {
}, 2500);
}
- // Drop on canvas
+ /**
+ * Create a new node of the dropped icon type, either
+ * directly or as an observable for the drop target.
+ * @param {*} event
+ */
onDropHandler(event) {
event.preventDefault();
const node = this.store.dragging;
@@ -471,7 +761,11 @@ class Canvas extends React.Component {
}
}
- // Connect two nodes via a new relationship
+ /**
+ * Create a relationship between the source and target nodes.
+ * @param {string} sourceId source id
+ * @param {string} targetId target id
+ */
onConnectNodeHandler(sourceId, targetId) {
const sourceNode = this.store.getNodeById(sourceId);
const targetNode = this.store.getNodeById(targetId);
@@ -487,44 +781,87 @@ class Canvas extends React.Component {
this.store.relationships.unshift(genericRel);
this.store.setShowRelPicker(true);
}
+
}
- // Update store position from React Flow
- onDragStopNodeHandler(node) {
- const n = this.store.getNodeById(node.id);
- if (n) {
- n.position = node.position;
+ /**
+ * Update the store node position to its respective
+ * Flow node position.
+ * @param {object} flowNode React Flow node
+ */
+ onDragStopNodeHandler(flowNode) {
+ const node = this.store.getNodeById(flowNode.id);
+ if (node) {
+ node.position = flowNode.position;
}
}
+ /**
+ * Add an object to the specified object property
+ * for the selected node.
+ * @param {string} field node property
+ * @param {object} o object to add
+ */
onClickAddGenericObjectHandler(field, o) {
this.store.addGenericObject(field, o);
}
+ /**
+ * Delete an object from the specified object property
+ * for the selected node.
+ * @param {string} field node property
+ * @param {string} key key of object to delete
+ */
onClickDeleteGenericObjectHandler(field, key) {
this.store.deleteGenericObject(field, key);
}
+ /**
+ * Reset the STIX UI.
+ */
onClickResetHandler() {
this.store.reset();
}
- onClickSubmitHandler() {
- this.store.submit();
+ /**
+ * Export the STIX bundle.
+ */
+ onClickExportHandler() {
+ this.store.stringifyBundle();
+ this.store.export();
}
+ /**
+ * Force React Flow to rerender.
+ * @param {boolean} update whether to rerender
+ */
setUpdateFlow(update) {
this.store.setUpdateFlow(update);
}
+ /**
+ * Set the mouse position
+ * @param {number} x
+ * @param {number} y
+ */
setMousePosition(x, y) {
this.store.setMousePosition(x, y);
}
+ /**
+ * Generate a new node id.
+ * @param {string} prefix prefix of id
+ * @returns new node id
+ */
generateNodeID(prefix) {
return this.store.generateNodeID(prefix);
}
+ /**
+ * Convert a node property and value into an event object.
+ * @param {string} property node property
+ * @param {*} value node value
+ */
mutateOnEvent(property, value) {
const event = {
currentTarget: {
@@ -536,10 +873,18 @@ class Canvas extends React.Component {
this.onChangeNodeHandler(event);
}
+ /**
+ * Set the position of the specified node.
+ * @param {string} id node id
+ * @param {boolean} random whether to set at random or mouse position
+ * @returns
+ */
transition(id, random) {
const canvas = document.getElementById('canvas');
const node = this.store.getNodeById(id);
+ if (node.title == 'extension-definition') return;
+
const calculate = (min, max) => Math.random() * (max - 100 - min) + min;
const bounds = {
@@ -566,10 +911,11 @@ class Canvas extends React.Component {
}
}
+
render() {
const { nodes, } = this.store;
const { edges, } = this.store;
- const sdos = this.store.getCustomSDOs();
+ const extensions = this.store.getExtensions();
return (
-
@@ -711,11 +1085,18 @@ class Canvas extends React.Component {
onClickShowRelDetailsHandler={this.onClickShowRelDetailsHandler}
/>
-
+
+
@@ -729,6 +1110,7 @@ class Canvas extends React.Component {
error={this.store.failedCollection}
show={this.store.showSubmissionError}
onClickHideHandler={this.onClickHideSubmissionErrorHandler}
+ onClickNodeHandler={this.onClickErrorHandler}
/>
);
diff --git a/app/src/components/Details.jsx b/stix-modeler-app/src/components/Details.jsx
similarity index 80%
rename from app/src/components/Details.jsx
rename to stix-modeler-app/src/components/Details.jsx
index 44b785f..9eb2298 100644
--- a/app/src/components/Details.jsx
+++ b/stix-modeler-app/src/components/Details.jsx
@@ -17,7 +17,7 @@ import GenericObject from './ui/complex/GenericObject';
import ConfirmTextarea from './ui/complex/ConfirmTextarea';
import ObjectArray from './ui/complex/ObjectArray';
-import Images from '../imgs/Images';
+import Images from '../util/Images';
import './details.scss';
@@ -57,8 +57,9 @@ class Details extends React.Component {
}
for (const prop in props) {
+ const cls = 'item-header';
const header = (
-
);
break;
- case 'dts':
+ case 'timestamp':
control = (
{header}
@@ -104,7 +106,9 @@ class Details extends React.Component {
@@ -119,6 +123,7 @@ class Details extends React.Component {
field={prop}
value={props[prop].value}
description={props[prop].description}
+ required={props[prop].required}
onClickHandler={this.props.onClickArrayHandler}
/>
);
@@ -128,9 +133,9 @@ class Details extends React.Component {
if (Array.isArray(refField)) {
refField = refField[0];
}
- const ref = refField.$ref ? refField.$ref : refField.type;
+ const ref = refField.$ref ?? refField.type;
- if (ref === '../common/dictionary.json' || ref === 'object') {
+ if (ref.includes('dictionary.json') || ref === 'object') {
control = (
);
break;
- case '../common/dictionary.json':
+ case 'dictionary':
case 'object':
control = (
{header}
@@ -197,6 +205,7 @@ class Details extends React.Component {
@@ -218,6 +227,7 @@ class Details extends React.Component {
@@ -233,6 +243,7 @@ class Details extends React.Component {
key={prop}
name={prop}
value={props[prop].value}
+ required={props[prop].required}
onChangeHandler={this.props.onChangeCSVHandler}
/>
@@ -248,6 +259,7 @@ class Details extends React.Component {
field={prop}
value={props[prop].value}
description={props[prop].description}
+ required={props[prop].required}
onChangeHandler={this.props.onChangePhaseHandler}
onClickRemoveHandler={this.props.onClickRemovePhaseHander}
/>
@@ -260,7 +272,9 @@ class Details extends React.Component {
key={prop}
field={prop}
value={props[prop].value}
+ prefix="node"
description={props[prop].description}
+ required={props[prop].required}
onClickAddObjectHandler={this.props.onClickAddObjectHandler}
onChangeERHandler={this.props.onChangeERHandler}
onClickDeleteERHandler={this.props.onClickDeleteERHandler}
@@ -278,6 +292,7 @@ class Details extends React.Component {
field={prop}
value={props[prop].value}
description={props[prop].description}
+ required={props[prop].required}
onClickHandler={this.props.onClickArrayHandler}
/>
);
@@ -290,6 +305,7 @@ class Details extends React.Component {
@@ -305,6 +321,7 @@ class Details extends React.Component {
key={prop}
name={prop}
value={props[prop].value}
+ required={props[prop].required}
onChangeHandler={this.props.onChangeCSVHandler}
/>
@@ -316,13 +333,15 @@ class Details extends React.Component {
);
@@ -346,6 +366,49 @@ class Details extends React.Component {
details.push(control);
}
+ const unknownProperties = Object.keys(props).filter(prop => props[prop].type === 'unknown');
+ if (unknownProperties.length) {
+ const msg = `Import extension schema(s) to enable modification`
+ const header = (
+
+ Unknown Properties
+
+ info
+
+
+
+ );
+
+ const propItems = [];
+ const maxLength = 50;
+ for (const prop of unknownProperties) {
+ let value = props[prop].value;
+ value = (typeof value == 'object')? JSON.stringify(value, null, 2) : String(value);
+ value = (value.length > maxLength)? `${value.substring(0, maxLength)}...` : value;
+
+ propItems.push(
+
+ {"\u2043"} {prop}
+ {value}
+
+ );
+ }
+
+ let control = (
+
+ );
+ details.push(control);
+ }
+
return (
-
-
+
{display}
>
diff --git a/stix-modeler-app/src/components/Flow/FlowNode.scss b/stix-modeler-app/src/components/Flow/FlowNode.scss
new file mode 100644
index 0000000..92e90b5
--- /dev/null
+++ b/stix-modeler-app/src/components/Flow/FlowNode.scss
@@ -0,0 +1,25 @@
+@use '../../defaults';
+
+.node-label {
+ overflow: visible;
+ position: relative;
+ bottom: -100%;
+ line-height: 11px;
+ text-align: center;
+}
+
+.node-item {
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ background-size: contain;
+ background-repeat: 'no-repeat';
+}
+
+.selected {
+ border: 1px solid blue;
+}
+
+.hovered {
+ border: 1px solid red;
+}
\ No newline at end of file
diff --git a/app/src/components/SubmissionError.jsx b/stix-modeler-app/src/components/SubmissionError.jsx
similarity index 80%
rename from app/src/components/SubmissionError.jsx
rename to stix-modeler-app/src/components/SubmissionError.jsx
index cab0dcb..e16a8d8 100644
--- a/app/src/components/SubmissionError.jsx
+++ b/stix-modeler-app/src/components/SubmissionError.jsx
@@ -1,23 +1,24 @@
-/* eslint-disable react/prefer-stateless-function */
import React from 'react';
import { observer } from 'mobx-react';
import Panel from './ui/panel/Panel';
-import Images from '../imgs/Images';
+import Images from '../util/Images';
import './SubmissionError.scss';
class SubmissionError extends React.Component {
constructor(props) {
super(props);
+
}
-
+
render() {
const errorStructure = {};
const msg = [];
this.props.error.map((item, i) => {
- if (!errorStructure.hasOwnProperty(item.node)) {
+ if (!(item.node in errorStructure)){
errorStructure[item.node] = {};
+ errorStructure[item.node].name = item.name;
errorStructure[item.node].details = [];
errorStructure[item.node].img = item.img;
errorStructure[item.node].details.push({
@@ -34,7 +35,7 @@ class SubmissionError extends React.Component {
for (const item in errorStructure) {
const details = [];
-
+ const name = errorStructure[item].name;
if (errorStructure[item].details) {
errorStructure[item].details.map((detail) => {
details.push(
@@ -50,11 +51,11 @@ class SubmissionError extends React.Component {
});
msg.push(
-
-
+
this.props.onClickNodeHandler(item)}>
+
{' '}
- {item}
+ {name}
{details}
@@ -69,6 +70,9 @@ class SubmissionError extends React.Component {
show={this.props.show}
onClickHideHandler={this.props.onClickHideHandler}
>
+
+ Errors
+
{msg}
diff --git a/stix-modeler-app/src/components/SubmissionError.scss b/stix-modeler-app/src/components/SubmissionError.scss
new file mode 100644
index 0000000..c393bce
--- /dev/null
+++ b/stix-modeler-app/src/components/SubmissionError.scss
@@ -0,0 +1,42 @@
+@use "../defaults";
+
+.header {
+ padding: 20px;
+ font-size: 30px;
+ height: 40px;
+ background-color: defaults.$lt-gray-bg;
+}
+
+
+.submission-error {
+
+ .container-header {
+ padding: 10px;
+ font-size: 18px;
+
+ img {
+ vertical-align: middle;
+ padding-right: 10px;
+ }
+ }
+
+ .row {
+ padding-left: 55px;
+
+ span {
+ color: defaults.$default-active-bg;
+ padding-right: 6px;
+ }
+ }
+
+ .submission-item {
+ border: 1px black solid;
+ }
+
+ .submission-item:hover {
+ background-color: beige;
+ }
+
+ overflow-y: scroll;
+
+}
diff --git a/app/src/components/bundle/JsonPaste.jsx b/stix-modeler-app/src/components/bundle/JsonPaste.jsx
similarity index 94%
rename from app/src/components/bundle/JsonPaste.jsx
rename to stix-modeler-app/src/components/bundle/JsonPaste.jsx
index 9364b40..be700ae 100644
--- a/app/src/components/bundle/JsonPaste.jsx
+++ b/stix-modeler-app/src/components/bundle/JsonPaste.jsx
@@ -1,4 +1,3 @@
-/* eslint-disable react/prefer-stateless-function */
import React from 'react';
import { observer } from 'mobx-react';
import Panel from '../ui/panel/Panel';
diff --git a/app/src/components/bundle/JsonPaste.scss b/stix-modeler-app/src/components/bundle/JsonPaste.scss
similarity index 84%
rename from app/src/components/bundle/JsonPaste.scss
rename to stix-modeler-app/src/components/bundle/JsonPaste.scss
index 0401220..c988bba 100644
--- a/app/src/components/bundle/JsonPaste.scss
+++ b/stix-modeler-app/src/components/bundle/JsonPaste.scss
@@ -24,6 +24,11 @@
display: flex;
flex-direction: row;
justify-content: flex-end;
- height: 30px;
+ padding: 2px;
+ }
+
+ .json-copy {
+ height: 35px;
+ font-size: 15px;
}
}
diff --git a/app/src/components/bundle/JsonViewer.jsx b/stix-modeler-app/src/components/bundle/JsonViewer.jsx
similarity index 100%
rename from app/src/components/bundle/JsonViewer.jsx
rename to stix-modeler-app/src/components/bundle/JsonViewer.jsx
diff --git a/app/src/components/bundle/JsonViewer.scss b/stix-modeler-app/src/components/bundle/JsonViewer.scss
similarity index 82%
rename from app/src/components/bundle/JsonViewer.scss
rename to stix-modeler-app/src/components/bundle/JsonViewer.scss
index 517084a..f528276 100644
--- a/app/src/components/bundle/JsonViewer.scss
+++ b/stix-modeler-app/src/components/bundle/JsonViewer.scss
@@ -24,6 +24,12 @@
display: flex;
flex-direction: row;
justify-content: flex-end;
- height: 30px;
+ padding: 2px;
+ gap: 5px;
}
-}
+
+ .json-copy {
+ height: 35px;
+ font-size: 15px;
+ }
+}
\ No newline at end of file
diff --git a/app/src/components/canvas.scss b/stix-modeler-app/src/components/canvas.scss
similarity index 100%
rename from app/src/components/canvas.scss
rename to stix-modeler-app/src/components/canvas.scss
diff --git a/app/src/components/details.scss b/stix-modeler-app/src/components/details.scss
similarity index 66%
rename from app/src/components/details.scss
rename to stix-modeler-app/src/components/details.scss
index 68ef92f..a575d41 100644
--- a/app/src/components/details.scss
+++ b/stix-modeler-app/src/components/details.scss
@@ -1,4 +1,4 @@
-@import '../defaults';
+@use '../defaults';
.details {
font-size: 18px;
@@ -14,7 +14,7 @@
display: flex;
flex-direction: row;
- background-color: $lt-gray-bg;
+ background-color: defaults.$lt-gray-bg;
.title {
padding-top: 5px;
@@ -30,10 +30,10 @@
padding-left: 7px;
width: 80px;
display: flex;
- background-color: $default-active-bg;
+ background-color: defaults.$default-active-bg;
border-radius: 5px;
padding-top: 7px;
- color: $light-font-0;
+ color: defaults.$light-font-0;
cursor: pointer;
font-size: 14px;
@@ -48,10 +48,19 @@
}
.delete:hover {
- background-color: $error-font;
+ background-color: defaults.$error-font;
}
}
+ .invalid {
+ border: red solid 1px;
+ }
+
+ .required-warning {
+ color: red;
+ font-size: 13px;
+ }
+
.body {
overflow-y: scroll;
overflow-x: hidden;
@@ -68,7 +77,7 @@
.item-header {
font-weight: bold;
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
padding-bottom: 3px;
span {
@@ -78,6 +87,24 @@
cursor: pointer;
}
}
+
+ .inferred-header {
+ color: defaults.$warning-font;
+ }
+
+ #unknown-properties {
+ padding-left: 10px;
+ margin: 0;
+ }
+
+ .unknown-header {
+ color: defaults.$error-font;
+
+ }
+
+ .unknown-value {
+ color: #849BB0;
+ }
}
.slider {
diff --git a/stix-modeler-app/src/components/layout/LayoutPanel.jsx b/stix-modeler-app/src/components/layout/LayoutPanel.jsx
new file mode 100644
index 0000000..bdd3ae2
--- /dev/null
+++ b/stix-modeler-app/src/components/layout/LayoutPanel.jsx
@@ -0,0 +1,94 @@
+import React from 'react';
+import { inject, observer } from 'mobx-react';
+import Panel from '../ui/panel/Panel';
+import RadioGroup from '../ui/inputs/RadioGroup';
+import OrientationRadioGroup from '../ui/inputs/OrientationRadioGroup';
+
+import '../layout/LayoutPanel.scss';
+
+class LayoutPanel extends React.Component {
+ constructor(props) {
+ super(props);
+ this.store = this.props.store.appStore;
+ this.store.setNodeTypes(["campaign", "identity"]);
+ this.layoutMethod = this.store.getLayoutMethod();
+ this.state = {
+ horizontalSpacing: '',
+ verticalSpacing: '',
+ };
+ }
+
+ handleLayoutChange = (newLayoutMethod) => {
+ this.store.setLayoutMethod(newLayoutMethod); // Update store
+ this.store.setNodeLayout(); // Redraw graph
+ };
+
+ handleOrientationChange = (newOrientation) => {
+ this.store.setOrientation(newOrientation); // Update store
+ this.store.setNodeLayout(); // Redraw graph
+ }
+
+ handleHorizontalSpacingChange = (event) => {
+ const newValue = event.target.value;
+ this.store.setHorizontalSpacing(newValue);
+ this.store.setNodeLayout(); // Redraw graph
+ };
+
+ handleVerticalSpacingChange = (event) => {
+ const newValue = event.target.value;
+ this.store.setVerticalSpacing(newValue);
+ this.store.setNodeLayout(); // Redraw graph
+ };
+
+ handleAlignDistributeClick = (action) => {
+ this.store.setAlignmentOrDistribution(action); // Store action type
+ // this.store.updateNodeLayout(); // Apply layout changes
+ };
+
+ render() {
+ return (
+
+
+
Layout Panel
+
+
+
+
+
Node Default Spacing Options (pixels)
+
+ Horizontal Spacing:
+
+
+
+ Vertical Spacing:
+
+
+
+
+
+
+ );
+ }
+}
+
+export default inject('store')(observer(LayoutPanel));
diff --git a/stix-modeler-app/src/components/layout/LayoutPanel.scss b/stix-modeler-app/src/components/layout/LayoutPanel.scss
new file mode 100644
index 0000000..4e18186
--- /dev/null
+++ b/stix-modeler-app/src/components/layout/LayoutPanel.scss
@@ -0,0 +1,48 @@
+.header {
+ padding: 10px;
+}
+
+.content {
+ margin: 10px;
+ padding: 10px;
+ border: solid 1px #dddddd;
+}
+
+.layout-panel {
+ .spacing-input {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+
+ label {
+ flex: 1;
+ margin-right: 10px;
+ }
+
+ input {
+ flex: 2;
+ padding: 5px;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ }
+ }
+ .icon-row {
+ display: flex;
+ justify-content: space-between;
+ margin: 10px;
+
+ img {
+ width: 40px; // adjust the size as needed
+ height: 40px; // adjust the size as needed
+ cursor: pointer;
+
+ transition: box-shadow 0.3s ease;
+
+ &:hover {
+ box-shadow: 0 0 10px 2px rgba(0, 123, 255, 0.75); // blue glow effect
+ }
+ }
+ }
+}
+
\ No newline at end of file
diff --git a/app/src/components/menus/BottomMenu.jsx b/stix-modeler-app/src/components/menus/BottomMenu.jsx
similarity index 92%
rename from app/src/components/menus/BottomMenu.jsx
rename to stix-modeler-app/src/components/menus/BottomMenu.jsx
index 8d5fe15..f89b189 100644
--- a/app/src/components/menus/BottomMenu.jsx
+++ b/stix-modeler-app/src/components/menus/BottomMenu.jsx
@@ -1,9 +1,8 @@
-/* eslint-disable react/prefer-stateless-function */
import React from 'react';
import { observer } from 'mobx-react';
import MenuItem from './MenuItem';
-import Images from '../../imgs/Images';
+import Images from '../../util/Images';
import './BottomMenu.scss';
diff --git a/app/src/components/menus/BottomMenu.scss b/stix-modeler-app/src/components/menus/BottomMenu.scss
similarity index 84%
rename from app/src/components/menus/BottomMenu.scss
rename to stix-modeler-app/src/components/menus/BottomMenu.scss
index 02fd63e..b66e0d8 100644
--- a/app/src/components/menus/BottomMenu.scss
+++ b/stix-modeler-app/src/components/menus/BottomMenu.scss
@@ -1,4 +1,4 @@
-@import '../../defaults';
+@use '../../defaults';
.menu {
position: fixed;
@@ -29,12 +29,12 @@
width: 40px;
height: 40px;
border-radius: 5px;
- background-color: $default-active-bg;
+ background-color: defaults.$default-active-bg;
div {
padding-top: 10px;
padding-left: 7px;
- color: $light-font-0;
+ color: defaults.$light-font-0;
cursor: pointer;
}
}
diff --git a/app/src/components/menus/MenuItem.jsx b/stix-modeler-app/src/components/menus/MenuItem.jsx
similarity index 100%
rename from app/src/components/menus/MenuItem.jsx
rename to stix-modeler-app/src/components/menus/MenuItem.jsx
diff --git a/app/src/components/menus/TopMenu.jsx b/stix-modeler-app/src/components/menus/TopMenu.jsx
similarity index 64%
rename from app/src/components/menus/TopMenu.jsx
rename to stix-modeler-app/src/components/menus/TopMenu.jsx
index 33b60b2..2127885 100644
--- a/app/src/components/menus/TopMenu.jsx
+++ b/stix-modeler-app/src/components/menus/TopMenu.jsx
@@ -29,7 +29,7 @@ class TopMenu extends React.Component {
}
render() {
- let groupLabel = 'Select';
+ let groupLabel = 'Group';
let groupClass = '';
let items;
@@ -38,7 +38,8 @@ class TopMenu extends React.Component {
groupClass = 'cancel-btn';
items = (
);
}
@@ -48,7 +49,7 @@ class TopMenu extends React.Component {
{groupLabel}
@@ -57,6 +58,8 @@ class TopMenu extends React.Component {
);
+ const badge = this.props.errors ? (
) : undefined;
+
return (
@@ -74,69 +77,85 @@ class TopMenu extends React.Component {
/>
- {'{ + }'}
+ description
- {'{ }'}
+ note_add
- {'{ * }'}
+ add_box
+
- Exts
+ Layout
- Import
+ folder
+
+
+ EXT
{group}
- refresh
- {' '}
- Reset
+ refresh
- add
+ save
{' '}
- Submit
+
+
+
+ error
+ {badge}
@@ -147,6 +166,7 @@ class TopMenu extends React.Component {
+
);
diff --git a/stix-modeler-app/src/components/menus/TopMenu.scss b/stix-modeler-app/src/components/menus/TopMenu.scss
new file mode 100644
index 0000000..64def2d
--- /dev/null
+++ b/stix-modeler-app/src/components/menus/TopMenu.scss
@@ -0,0 +1,98 @@
+@use '../../defaults';
+
+.top-menu {
+ position: fixed;
+ top: 20px;
+ right: 20px;
+
+ .row {
+ display: flex;
+ flex-direction: row;
+
+ .menu-item {
+ border-radius: 5px;
+ cursor: pointer;
+ padding: 10px 8px 0px 8px;
+ color: #fff;
+ background-color: defaults.$default-active-bg;
+ margin-left: 10px;
+ text-align: center;
+
+ .i {
+ width: 20px;
+ vertical-align: middle;
+ line-height: 0;
+ overflow: hidden;
+ }
+ }
+
+ .menu-item:hover {
+ background-color: #2f689d;
+ }
+
+ .grouping-btn {
+ border-radius: 5px;
+ cursor: pointer;
+ color: #fff;
+ font-weight: bold;
+ background-color: defaults.$default-active-bg;
+ width: 55px;
+ height: 80%;
+ }
+
+ .dropdown {
+ position: relative;
+ display: inline-block;
+ }
+
+ .dropdown-content {
+ display: none;
+ position: absolute;
+ top: 100%;
+ left: -25%;
+ background-color: #f1f1f1;
+ min-width: 160px;
+ box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+ z-index: 1;
+ }
+
+ .dropdown-content a {
+ color: black;
+ padding: 12px 16px;
+ text-decoration: none;
+ display: block;
+ }
+
+ .dropdown-content a:hover {background-color: #ddd;}
+
+ .dropdown:hover .dropdown-content {display: block;}
+
+
+ .cancel-btn:hover {
+ background-color: defaults.$error-font;
+ }
+
+ .ctr-input {
+ padding-right: 10px;
+ width: 500px;
+ }
+
+
+ .reset-btn:hover {
+ background-color: defaults.$error-font;
+ }
+ }
+
+ .badge {
+ position: absolute;
+ top: -3px;
+ right: -3px;
+ width: 10px;
+ height: 10px;
+ background-color: red;
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+}
diff --git a/app/src/components/relationship/RelationshipDetails.jsx b/stix-modeler-app/src/components/relationship/RelationshipDetails.jsx
similarity index 97%
rename from app/src/components/relationship/RelationshipDetails.jsx
rename to stix-modeler-app/src/components/relationship/RelationshipDetails.jsx
index 636a7b8..060d0e2 100644
--- a/app/src/components/relationship/RelationshipDetails.jsx
+++ b/stix-modeler-app/src/components/relationship/RelationshipDetails.jsx
@@ -4,15 +4,16 @@ import { Tooltip } from 'react-tooltip';
import Panel from '../ui/panel/Panel';
import Text from '../ui/inputs/Text';
import Boolean from '../ui/inputs/Boolean';
-import Images from '../../imgs/Images';
+import Images from '../../util/Images';
+import '../details.scss';
import './RelationshipDetails.scss';
class RelationshipDetails extends React.Component {
constructor(props) {
super(props);
this.state = {
- type: 'relates to',
+ type: 'related-to',
x_exclusive: false,
};
this.onSubmitHandler = this.onSubmitHandler.bind(this);
@@ -45,7 +46,7 @@ class RelationshipDetails extends React.Component {
reset() {
this.setState({
- type: 'relates to',
+ type: 'related-to',
x_exclusive: false,
});
}
diff --git a/stix-modeler-app/src/components/relationship/RelationshipDetails.scss b/stix-modeler-app/src/components/relationship/RelationshipDetails.scss
new file mode 100644
index 0000000..354f3b4
--- /dev/null
+++ b/stix-modeler-app/src/components/relationship/RelationshipDetails.scss
@@ -0,0 +1,43 @@
+@use '../../defaults';
+
+.preview {
+ padding-left: 20px;
+ padding-top: 10px;
+ cursor: pointer;
+ font-weight: bold;
+ font-family: defaults.$default-font-family;
+ line-height: 30px;
+ img {
+ vertical-align: middle;
+ }
+ img.src-image {
+ padding-right: 5px;
+ }
+ img.target-image {
+ padding-right: 5px;
+ padding-left: 5px;
+ }
+ .rel-type {
+ color: defaults.$default-active-bg;
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+}
+
+.submit-btn {
+ border-radius: 5px;
+ cursor: pointer;
+ padding: 5px 11px 5px 11px;
+ color: #fff;
+ font-weight: bold;
+ background-color: defaults.$default-active-bg;
+ margin-left: 10px;
+ margin-top: 10px;
+ width: fit-content;
+
+ .i {
+ width: 20px;
+ vertical-align: middle;
+ font-size: 16px;
+ }
+}
\ No newline at end of file
diff --git a/app/src/components/relationship/RelationshipEditor.jsx b/stix-modeler-app/src/components/relationship/RelationshipEditor.jsx
similarity index 98%
rename from app/src/components/relationship/RelationshipEditor.jsx
rename to stix-modeler-app/src/components/relationship/RelationshipEditor.jsx
index bd5a4d5..2fe6f83 100644
--- a/app/src/components/relationship/RelationshipEditor.jsx
+++ b/stix-modeler-app/src/components/relationship/RelationshipEditor.jsx
@@ -4,7 +4,7 @@ import { toJS } from 'mobx';
import { Tooltip } from 'react-tooltip';
import Panel from '../ui/panel/Panel';
import Text from '../ui/inputs/Text';
-import Images from '../../imgs/Images';
+import Images from '../../util/Images';
import './RelationshipDetails.scss';
diff --git a/stix-modeler-app/src/components/relationship/RelationshipPicker.jsx b/stix-modeler-app/src/components/relationship/RelationshipPicker.jsx
new file mode 100644
index 0000000..f4ac080
--- /dev/null
+++ b/stix-modeler-app/src/components/relationship/RelationshipPicker.jsx
@@ -0,0 +1,80 @@
+import React from 'react';
+import { observer } from 'mobx-react';
+import Panel from '../ui/panel/Panel';
+import Images from '../../util/Images';
+
+import './RelationshipPicker.scss';
+
+class RelationshipPicker extends React.Component {
+ constructor(props) {
+ super(props);
+ }
+
+ onClickSelectRelHandler(relationship) {
+ this.props.onClickSelectRelHandler(relationship);
+ }
+
+ render() {
+ // Do not allow relationship defininition for generic observables
+ let create;
+ if (this.props.relationships.length == 0 || this.props.relationships[0].target_ref) {
+ create = (
+
+
+
Create New Relationship
+
+ );
+ }
+
+ return (
+
+
+
+
+ {' '}
+ Possible Relationships
+
+
+ {create}
+ {
+ this.props.relationships.slice(1).map((relationship) => {
+ const src = relationship.source_ref.split('--')[0];
+ const target = relationship.subTarget ??
+ relationship.target_ref.split('--')[0];
+ const srcImg = Images.getImage(relationship.srcImg);
+ const targetImg = Images.getImage(relationship.targetImg);
+
+ return (
+
this.onClickSelectRelHandler(relationship)}
+ >
+
+ {' '}
+ {src}
+
+ {' '}
+ {relationship.relationship_type}
+ {' '}
+
+ {target}
+ {' '}
+
+
+ );
+ })
+ }
+
+
+
+ );
+ }
+} export default (observer(RelationshipPicker));
diff --git a/app/src/components/relationship/RelationshipPicker.scss b/stix-modeler-app/src/components/relationship/RelationshipPicker.scss
similarity index 87%
rename from app/src/components/relationship/RelationshipPicker.scss
rename to stix-modeler-app/src/components/relationship/RelationshipPicker.scss
index a6a4634..ccab70d 100644
--- a/app/src/components/relationship/RelationshipPicker.scss
+++ b/stix-modeler-app/src/components/relationship/RelationshipPicker.scss
@@ -1,4 +1,4 @@
-@import "../../defaults";
+@use "../../defaults";
.relationship-picker {
display: flex;
@@ -26,7 +26,7 @@
padding-top: 10px;
cursor: pointer;
font-weight: bold;
- font-family: $default-font-family;
+ font-family: defaults.$default-font-family;
line-height: 30px;
img {
@@ -43,7 +43,7 @@
}
.rel-type {
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
padding-left: 10px;
padding-right: 10px;
}
diff --git a/stix-modeler-app/src/components/schema/ExtensionEditor.jsx b/stix-modeler-app/src/components/schema/ExtensionEditor.jsx
new file mode 100644
index 0000000..75436df
--- /dev/null
+++ b/stix-modeler-app/src/components/schema/ExtensionEditor.jsx
@@ -0,0 +1,353 @@
+import React from 'react';
+import { observer } from 'mobx-react';
+import { toJS } from 'mobx';
+import { Tooltip } from 'react-tooltip';
+import Panel from '../ui/panel/Panel';
+import Images from '../../util/Images';
+
+import ArraySelector from '../ui/inputs/ArraySelector';
+import Boolean from '../ui/inputs/Boolean';
+import CSVInput from '../ui/inputs/CSVInput';
+import DateTime from '../ui/inputs/DateTime';
+import ExternalReferences from '../ui/complex/ExternalReferences';
+import FileSelector from '../ui/inputs/FileSelector';
+import ObjectArray from '../ui/complex/ObjectArray';
+import Slider from '../ui/inputs/Slider';
+import Text from '../ui/inputs/Text';
+import TextArea from '../ui/inputs/TextArea';
+
+
+import '../details.scss';
+
+class ExtensionEditor extends React.Component {
+ constructor(props) {
+ super(props);
+
+ this.onChangeExtHandler = this.onChangeExtHandler.bind(this);
+ this.onChangeHandler = this.onChangeHandler.bind(this)
+ this.onChangeDateHandler = this.onChangeDateHandler.bind(this);
+ }
+
+ onChangeExtHandler(event) {
+ if (event.target.files && event.target.files[0]) {
+ const value = URL.createObjectURL(event.target.files[0]);
+
+ const mutatedEvent = {
+ currentTarget: {
+ name: 'customImg',
+ value: value
+ },
+ };
+ this.props.onChangeExtHandler(mutatedEvent);
+ this.forceUpdate();
+ }
+ }
+
+ onChangeHandler(event) {
+ this.props.onChangeNodeHandler(event);
+ }
+
+ onChangeDateHandler(property, datetime) {
+ this.props.onChangeDateHandler(property, datetime);
+ }
+
+ render() {
+ const extension = toJS(this.props.extension);
+ let props = {};
+ let img;
+ const details = [];
+
+ const deleteIcon =
delete_forever ;
+
+ if (!extension) return;
+
+ props = extension.properties;
+ if (extension.customImg !== undefined) {
+ img =
;
+ } else {
+ img =
;
+ }
+
+ let header = (
+
+ Update Icon
+
+ info
+
+
+
+ );
+
+ let control = (
+
+ {header}
+
+
+ );
+
+ details.push(control);
+
+ for (const prop in props) {
+ const header = (
+
+ {prop}
+
+ info
+
+
+
+ );
+
+ let control = (
+
+ {header}
+
{props[prop].value}
+
+ );
+
+ // If there is no type, we do not want to process. If a "control"
+ // is defined, that indicates special handling of the value.
+ if (props[prop].type && !props[prop].control) {
+ switch (props[prop].type) {
+ case 'number':
+ case 'string':
+ control = (
+
+ );
+ break;
+ case 'timestamp':
+ control = (
+
+ );
+ break;
+ case 'array':
+ if (props[prop].vocab) {
+ control = (
+
+ );
+ } else {
+ // Get array subtype, possibly nested
+ let refField = props[prop].items;
+ if (Array.isArray(refField)) {
+ refField = refField[0];
+ }
+ const ref = refField.$ref ?? refField.type;
+
+ if (ref.includes('dictionary.json') || ref === 'object') {
+ control = (
+
+ );
+ } else {
+ props[prop].control = 'listtextarea';
+ }
+ }
+ break;
+
+ case 'boolean':
+ control = (
+
+ );
+ break;
+ }
+ }
+
+ if (props[prop].$ref && !props[prop].control) {
+ switch (props[prop].$ref) {
+ case '../common/identifier.json':
+ control = (
+
+ );
+ break;
+ }
+ }
+
+ switch (props[prop].control) {
+ case 'hidden':
+ control = '';
+ break;
+ case 'slider':
+ control = (
+
+ );
+ break;
+ case 'externalrefs':
+ control = (
+
+ );
+ break;
+ case 'stringselector':
+ control = (
+
+ );
+ break;
+ case 'textarea':
+ control = (
+
+ );
+ break;
+ case 'listtextarea':
+ control = (
+
+ );
+ break;
+ }
+
+ details.push(control);
+ }
+
+ return (
+
+
+
+
+ {img}
+ {' '}
+ {extension.id}
+
+
+ {deleteIcon}
+ {' '}
+ Delete
+
+
+
+ {details}
+
+
+
+
+
+ );
+ }
+} export default (observer(ExtensionEditor));
diff --git a/stix-modeler-app/src/components/schema/ExtensionPicker.jsx b/stix-modeler-app/src/components/schema/ExtensionPicker.jsx
new file mode 100644
index 0000000..6b6f571
--- /dev/null
+++ b/stix-modeler-app/src/components/schema/ExtensionPicker.jsx
@@ -0,0 +1,52 @@
+import React from 'react';
+import { observer } from 'mobx-react';
+import Panel from '../ui/panel/Panel';
+import Images from '../../util/Images';
+
+import '../relationship/RelationshipPicker.scss';
+
+class ExtensionPicker extends React.Component {
+ constructor(props) {
+ super(props);
+ }
+
+ onClickSelectExtHandler(sdo) {
+ this.props.onClickHideHandler();
+ this.props.onClickSelectExtHandler(sdo);
+ }
+
+ render() {
+ return (
+
+
+
STIX Domain Object (SDO) Extensions
+
+ {
+ this.props.extensions.map((ext) => {
+ let img = Images.getImage(ext.img);
+ if (ext.customImg) {
+ img = ext.customImg;
+ }
+
+ return (
+
this.onClickSelectExtHandler(ext)}
+ >
+
+ {' '}
+ {ext.properties.name.value.length > 0 ? ext.properties.name.value : ext.id}
+
+ );
+ })
+ }
+
+
+
+ );
+ }
+} export default (observer(ExtensionPicker));
diff --git a/app/src/components/schema/SDOEditor.jsx b/stix-modeler-app/src/components/schema/SDOEditor.jsx
similarity index 100%
rename from app/src/components/schema/SDOEditor.jsx
rename to stix-modeler-app/src/components/schema/SDOEditor.jsx
diff --git a/app/src/components/schema/SDOPicker.jsx b/stix-modeler-app/src/components/schema/SDOPicker.jsx
similarity index 100%
rename from app/src/components/schema/SDOPicker.jsx
rename to stix-modeler-app/src/components/schema/SDOPicker.jsx
diff --git a/app/src/components/schema/SchemaPaste.jsx b/stix-modeler-app/src/components/schema/SchemaPaste.jsx
similarity index 94%
rename from app/src/components/schema/SchemaPaste.jsx
rename to stix-modeler-app/src/components/schema/SchemaPaste.jsx
index af5210a..a24890e 100644
--- a/app/src/components/schema/SchemaPaste.jsx
+++ b/stix-modeler-app/src/components/schema/SchemaPaste.jsx
@@ -1,4 +1,3 @@
-/* eslint-disable react/prefer-stateless-function */
import React from 'react';
import { observer } from 'mobx-react';
import Panel from '../ui/panel/Panel';
diff --git a/app/src/components/ui/button/Button.jsx b/stix-modeler-app/src/components/ui/button/Button.jsx
similarity index 100%
rename from app/src/components/ui/button/Button.jsx
rename to stix-modeler-app/src/components/ui/button/Button.jsx
diff --git a/app/src/components/ui/button/button.scss b/stix-modeler-app/src/components/ui/button/button.scss
similarity index 81%
rename from app/src/components/ui/button/button.scss
rename to stix-modeler-app/src/components/ui/button/button.scss
index 49e6cf4..7b8bcc0 100644
--- a/app/src/components/ui/button/button.scss
+++ b/stix-modeler-app/src/components/ui/button/button.scss
@@ -1,4 +1,4 @@
-@import '../../../defaults';
+@use '../../../defaults';
button:focus {
outline: none;
@@ -8,8 +8,8 @@ button.def {
width: auto;
min-width: 130px;
height: 30px;
- color: $light-font-0;
- font-family: $default-font-family;
+ color: defaults.$light-font-0;
+ font-family: defaults.$default-font-family;
font-size: 14px;
border-color: transparent;
cursor: pointer;
@@ -21,7 +21,7 @@ button.def {
button.disabled {
background-color: rgba(128,128,128,.8) !important;
- color: $gray-font-0 !important;
+ color: defaults.$gray-font-0 !important;
cursor: auto;
}
diff --git a/app/src/components/ui/complex/ConfirmTextarea.jsx b/stix-modeler-app/src/components/ui/complex/ConfirmTextarea.jsx
similarity index 85%
rename from app/src/components/ui/complex/ConfirmTextarea.jsx
rename to stix-modeler-app/src/components/ui/complex/ConfirmTextarea.jsx
index 3c309fe..940cf7a 100644
--- a/app/src/components/ui/complex/ConfirmTextarea.jsx
+++ b/stix-modeler-app/src/components/ui/complex/ConfirmTextarea.jsx
@@ -2,6 +2,7 @@ import React from 'react';
import { observer } from 'mobx-react';
import { Tooltip } from 'react-tooltip';
import TextArea from '../inputs/TextArea';
+import classNames from 'classnames';
import './confirmtextarea.scss';
@@ -18,10 +19,6 @@ class ConfirmTextarea extends React.Component {
};
}
- componentDidMount() {
-
- }
-
onChangeInputHandler(event) {
event.preventDefault();
@@ -42,6 +39,9 @@ class ConfirmTextarea extends React.Component {
const { field, } = this.props;
const value = this.props.value ? this.props.value : [];
const { description, } = this.props;
+ const {required, } = this.props;
+ const invalid = required && !value.length;
+ const warning = invalid? (
This field is required
) : "";
return (
@@ -56,7 +56,10 @@ class ConfirmTextarea extends React.Component {
-
+
);
}
diff --git a/app/src/components/ui/complex/ExternalReferences.jsx b/stix-modeler-app/src/components/ui/complex/ExternalReferences.jsx
similarity index 88%
rename from app/src/components/ui/complex/ExternalReferences.jsx
rename to stix-modeler-app/src/components/ui/complex/ExternalReferences.jsx
index 26e411b..f4ec0da 100644
--- a/app/src/components/ui/complex/ExternalReferences.jsx
+++ b/stix-modeler-app/src/components/ui/complex/ExternalReferences.jsx
@@ -2,6 +2,7 @@ import React from 'react';
import { observer } from 'mobx-react';
import { Tooltip } from 'react-tooltip';
import { v4 as uuid } from 'uuid';
+import classNames from 'classnames';
import Text from '../inputs/Text';
import './externalreferences.scss';
@@ -17,8 +18,6 @@ class ExternalReferences extends React.Component {
this.onClickDeleteHandler = this.onClickDeleteHandler.bind(this);
}
- componentDidMount() {}
-
onChangeERHandler(event, value) {
return undefined;
}
@@ -48,6 +47,10 @@ class ExternalReferences extends React.Component {
const { field, } = this.props;
const value = this.props.value ? this.props.value : [];
const { description, } = this.props;
+ const { prefix, } = this.props;
+ const { required, } = this.props;
+ const invalid = required && !value.length;
+ const warning = invalid? (
This field is required
) : "";
return (
@@ -71,12 +74,16 @@ class ExternalReferences extends React.Component {
-
+
{value.map((p, i) => (
))}
+ {warning}
);
}
@@ -92,8 +100,9 @@ class ExternalReferences extends React.Component {
function ReferenceBlock(props) {
const blocks = [];
const idx = props.i;
- const selectID = `select-${props.i}`;
- const inputID = `input-${props.i}`;
+ const prefix = props.prefix;
+ const selectID = `select-${prefix}-${props.i}`;
+ const inputID = `input-${prefix}-${props.i}`;
const propValues = [
'source_name',
diff --git a/app/src/components/ui/complex/GenericObject.jsx b/stix-modeler-app/src/components/ui/complex/GenericObject.jsx
similarity index 67%
rename from app/src/components/ui/complex/GenericObject.jsx
rename to stix-modeler-app/src/components/ui/complex/GenericObject.jsx
index a9ca6b6..a487be4 100644
--- a/app/src/components/ui/complex/GenericObject.jsx
+++ b/stix-modeler-app/src/components/ui/complex/GenericObject.jsx
@@ -2,6 +2,7 @@ import React from 'react';
import { observer } from 'mobx-react';
import { Tooltip } from 'react-tooltip';
import { v4 as uuid } from 'uuid';
+import classNames from 'classnames';
import Text from '../inputs/Text';
import './genericobject.scss';
@@ -10,21 +11,18 @@ class GenericObject extends React.Component {
constructor(props) {
super(props);
+ this.onChangeSelectHandler = this.onChangeSelectHandler.bind(this);
this.onChangeInputHandler = this.onChangeInputHandler.bind(this);
this.onClickAddObjectHandler = this.onClickAddObjectHandler.bind(this);
this.onClickDeleteHandler = this.onClickDeleteHandler.bind(this);
this.onClickCreateBlankHandler = this.onClickCreateBlankHandler.bind(this);
this.state = {
- key: '',
+ key: this.props.vocab? this.props.vocab[0] : '',
value: '',
};
}
- componentDidMount() {
-
- }
-
onChangeInputHandler(event) {
event.preventDefault();
@@ -33,8 +31,16 @@ class GenericObject extends React.Component {
});
}
+ onChangeSelectHandler(event) {
+ event.preventDefault();
+ const key = document.getElementById(`select-${this.props.field}`).value;
+ this.setState({
+ "key": key
+ });
+ }
+
onClickDeleteHandler(select, idx) {
- this.props.onClickDeletePropertyHandler(select, idx);
+ this.props.onClickDeleteObjectHandler(select, idx);
}
onClickCreateBlankHandler() {
@@ -54,9 +60,13 @@ class GenericObject extends React.Component {
render() {
const { field, } = this.props;
- const value = this.props.value ? this.props.value : [];
+ const { vocab, } = this.props;
+ const value = this.props.value ?? {};
const { description, } = this.props;
+ const {required, } = this.props;
const rows = [];
+ const invalid = required && !Object.keys(value).length;
+ const warning = invalid? (
This field is required
) : "";
for (const key in value) {
rows.push(
@@ -65,11 +75,30 @@ class GenericObject extends React.Component {
v={value[key]}
k={key}
field={field}
- onClickDeleteHandler={this.props.onClickDeleteObjectHandler}
+ onClickDeleteHandler={this.onClickDeleteHandler}
/>
);
}
+ let selector;
+ if (vocab && vocab.length) {
+ selector = (
+
+ {vocab.map((key) => (
+
+ {key}
+
+ ))}
+
+ );
+ } else {
+ selector = (
+
+ );
+ }
+
+
+
return (
@@ -83,11 +112,14 @@ class GenericObject extends React.Component {
-
+
-
+ {selector}
@@ -99,6 +131,7 @@ class GenericObject extends React.Component {
{rows}
+ {warning}
);
}
diff --git a/app/src/components/ui/complex/KillChain.jsx b/stix-modeler-app/src/components/ui/complex/KillChain.jsx
similarity index 90%
rename from app/src/components/ui/complex/KillChain.jsx
rename to stix-modeler-app/src/components/ui/complex/KillChain.jsx
index 625b225..139839c 100644
--- a/app/src/components/ui/complex/KillChain.jsx
+++ b/stix-modeler-app/src/components/ui/complex/KillChain.jsx
@@ -1,6 +1,7 @@
import React from 'react';
import { observer } from 'mobx-react';
import { Tooltip } from 'react-tooltip';
+import classNames from 'classnames';
import './killchain.scss';
@@ -12,10 +13,6 @@ class KillChain extends React.Component {
this.populatePhase = this.populatePhase.bind(this);
}
- componentDidMount() {
-
- }
-
onChangePhaseHandler(event) {
const kcDomName = `kc-name-${this.props.node.id}`;
const phaseDomName = `phase-${this.props.node.id}`;
@@ -64,6 +61,9 @@ class KillChain extends React.Component {
const { field, } = this.props;
const value = this.props.value ? this.props.value : [];
const { description, } = this.props;
+ const {required, } = this.props;
+ const invalid = required && !value.length;
+ const warning = invalid? (
This field is required
) : "";
const kcName = `kc-name-${this.props.node.id}`;
const phaseName = `phase-${this.props.node.id}`;
@@ -81,7 +81,10 @@ class KillChain extends React.Component {
-
+
-- Select Kill Chain --
@@ -112,12 +115,13 @@ class KillChain extends React.Component {
{' '}
{p.phase_name}
{' '}
- this.props.onClickRemoveHandler(field, p)} className="material-icons">highlight_off
+ this.props.onClickRemoveHandler(field, i)} className="material-icons">highlight_off
))
}
+ {warning}
);
}
diff --git a/app/src/components/ui/complex/ObjectArray.jsx b/stix-modeler-app/src/components/ui/complex/ObjectArray.jsx
similarity index 92%
rename from app/src/components/ui/complex/ObjectArray.jsx
rename to stix-modeler-app/src/components/ui/complex/ObjectArray.jsx
index cffe285..0867ef2 100644
--- a/app/src/components/ui/complex/ObjectArray.jsx
+++ b/stix-modeler-app/src/components/ui/complex/ObjectArray.jsx
@@ -2,6 +2,7 @@ import React from 'react';
import { observer } from 'mobx-react';
import { Tooltip } from 'react-tooltip';
import { v4 as uuid } from 'uuid';
+import classNames from 'classnames';
import Text from '../inputs/Text';
import './externalreferences.scss';
@@ -16,8 +17,6 @@ class ObjectArray extends React.Component {
this.onClickDeletePropertyHandler = this.onClickDeletePropertyHandler.bind(this);
}
- componentDidMount() {}
-
onChangeArrayObjectHandler(event, value) {
return undefined;
}
@@ -49,6 +48,9 @@ class ObjectArray extends React.Component {
const { field, } = this.props;
const value = this.props.value ? this.props.value : [];
const { description, } = this.props;
+ const {required, } = this.props;
+ const invalid = required && !value.length;
+ const warning = invalid? (
This field is required
) : "";
return (
@@ -72,7 +74,10 @@ class ObjectArray extends React.Component {
-
+
{value.map((p, i) => (
))}
+ {warning}
);
}
diff --git a/app/src/components/ui/complex/confirmtextarea.scss b/stix-modeler-app/src/components/ui/complex/confirmtextarea.scss
similarity index 86%
rename from app/src/components/ui/complex/confirmtextarea.scss
rename to stix-modeler-app/src/components/ui/complex/confirmtextarea.scss
index 092ebe5..52d897a 100644
--- a/app/src/components/ui/complex/confirmtextarea.scss
+++ b/stix-modeler-app/src/components/ui/complex/confirmtextarea.scss
@@ -1,4 +1,4 @@
-@import '../../../defaults';
+@use '../../../defaults';
.ct-container {
padding-left: 20px;
@@ -7,7 +7,7 @@
.ct-header {
font-weight: bold;
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
padding-bottom: 3px;
span {
@@ -19,7 +19,7 @@
.ct-body {
overflow-x: hidden;
- border: 1px solid $standard-border-color;
+ border: 1px solid defaults.$standard-border-color;
min-height: 50px;
width: 100%;
@@ -46,7 +46,7 @@
span {
cursor: pointer;
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
padding-left: 5px;
}
}
@@ -81,12 +81,12 @@
}
.remove {
- color: $error-font;
+ color: defaults.$error-font;
}
.add {
padding-top: 15px;
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
}
}
}
diff --git a/app/src/components/ui/complex/externalreferences.scss b/stix-modeler-app/src/components/ui/complex/externalreferences.scss
similarity index 75%
rename from app/src/components/ui/complex/externalreferences.scss
rename to stix-modeler-app/src/components/ui/complex/externalreferences.scss
index f41048d..0b6e6ba 100644
--- a/app/src/components/ui/complex/externalreferences.scss
+++ b/stix-modeler-app/src/components/ui/complex/externalreferences.scss
@@ -1,4 +1,4 @@
-@import '../../../defaults';
+@use '../../../defaults';
.er-container {
padding-left: 20px;
@@ -6,7 +6,7 @@
.er-header {
font-weight: bold;
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
padding-bottom: 3px;
span {
@@ -18,11 +18,11 @@
.er-body {
overflow: auto;
- border: 1px solid $standard-border-color;
+ border: 1px solid defaults.$standard-border-color;
min-height: 50px;
.er-block {
- border: 1px solid $standard-border-color;
+ border: 1px solid defaults.$standard-border-color;
margin: 10px;
.er-block-row {
@@ -43,7 +43,7 @@
}
.remove {
- color: $error-font;
+ color: defaults.$error-font;
}
.remove-er {
@@ -53,7 +53,7 @@
.add {
padding-top: 15px;
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
}
}
}
diff --git a/app/src/components/ui/complex/genericobject.scss b/stix-modeler-app/src/components/ui/complex/genericobject.scss
similarity index 84%
rename from app/src/components/ui/complex/genericobject.scss
rename to stix-modeler-app/src/components/ui/complex/genericobject.scss
index b3f4ab6..0a5e763 100644
--- a/app/src/components/ui/complex/genericobject.scss
+++ b/stix-modeler-app/src/components/ui/complex/genericobject.scss
@@ -1,4 +1,4 @@
-@import '../../../defaults';
+@use '../../../defaults';
.go-container {
padding-left: 20px;
@@ -7,7 +7,7 @@
.go-header {
font-weight: bold;
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
padding-bottom: 3px;
span {
@@ -19,7 +19,7 @@
.go-body {
overflow-x: hidden;
- border: 1px solid $standard-border-color;
+ border: 1px solid defaults.$standard-border-color;
min-height: 50px;
width: 100%;
@@ -41,7 +41,7 @@
span {
cursor: pointer;
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
padding-left: 5px;
}
}
@@ -71,12 +71,12 @@
}
.remove {
- color: $error-font;
+ color: defaults.$error-font;
}
.add {
padding-top: 15px;
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
}
}
}
diff --git a/app/src/components/ui/complex/killchain.scss b/stix-modeler-app/src/components/ui/complex/killchain.scss
similarity index 80%
rename from app/src/components/ui/complex/killchain.scss
rename to stix-modeler-app/src/components/ui/complex/killchain.scss
index 20abd3b..62e6f56 100644
--- a/app/src/components/ui/complex/killchain.scss
+++ b/stix-modeler-app/src/components/ui/complex/killchain.scss
@@ -1,4 +1,4 @@
-@import '../../../defaults';
+@use '../../../defaults';
.kill-chain-container {
padding-left: 20px;
@@ -6,7 +6,7 @@
.kill-chain-header {
font-weight: bold;
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
padding-bottom: 3px;
span {
@@ -19,7 +19,7 @@
.kill-chain-body {
overflow: auto;
- border: 1px solid $standard-border-color;
+ border: 1px solid defaults.$standard-border-color;
.kill-chain-options {
display: flex;
@@ -35,7 +35,7 @@
padding: 5px 5px 5px 10px;
.material-icons {
vertical-align: middle;
- color: $error-font;
+ color: defaults.$error-font;
cursor: pointer;
}
}
diff --git a/app/src/components/ui/growl/Growl.jsx b/stix-modeler-app/src/components/ui/growl/Growl.jsx
similarity index 100%
rename from app/src/components/ui/growl/Growl.jsx
rename to stix-modeler-app/src/components/ui/growl/Growl.jsx
diff --git a/stix-modeler-app/src/components/ui/growl/growl.scss b/stix-modeler-app/src/components/ui/growl/growl.scss
new file mode 100644
index 0000000..d473837
--- /dev/null
+++ b/stix-modeler-app/src/components/ui/growl/growl.scss
@@ -0,0 +1,12 @@
+@use "../../../defaults";
+
+.growl {
+ position: fixed;
+ left: 10px;
+ top: 10px;
+ z-index: defaults.$growl-index;
+ background-color: defaults.$default-active-bg;
+ color: defaults.$light-font-0;
+ padding: 11px;
+ border-radius: 5px;
+}
diff --git a/app/src/components/ui/inputs/ArraySelector.jsx b/stix-modeler-app/src/components/ui/inputs/ArraySelector.jsx
similarity index 82%
rename from app/src/components/ui/inputs/ArraySelector.jsx
rename to stix-modeler-app/src/components/ui/inputs/ArraySelector.jsx
index 89fb779..4c1167d 100644
--- a/app/src/components/ui/inputs/ArraySelector.jsx
+++ b/stix-modeler-app/src/components/ui/inputs/ArraySelector.jsx
@@ -10,8 +10,6 @@ class ArraySelector extends React.Component {
super(props);
}
- componentDidMount() {}
-
onClickHandler(field, value) {
this.props.onClickHandler(field, value);
}
@@ -19,8 +17,11 @@ class ArraySelector extends React.Component {
render() {
const items = this.props.vocab ? this.props.vocab : [];
const { field, } = this.props;
- const { value, } = this.props;
+ const { value, } = this.props ?? [];
const { description, } = this.props;
+ const { required, } = this.props;
+ const invalid = required && !value.length;
+ const warning = invalid? (
This field is required
) : "";
let cls = classNames({
'array-container-item': true,
@@ -40,7 +41,10 @@ class ArraySelector extends React.Component {
-
+
{items.map((item, i) => {
if (value && value.indexOf(item) > -1) {
cls = classNames({
@@ -63,6 +67,7 @@ class ArraySelector extends React.Component {
);
})}
+ {warning}
);
}
diff --git a/app/src/components/ui/inputs/Boolean.jsx b/stix-modeler-app/src/components/ui/inputs/Boolean.jsx
similarity index 96%
rename from app/src/components/ui/inputs/Boolean.jsx
rename to stix-modeler-app/src/components/ui/inputs/Boolean.jsx
index 8329b94..975e1d2 100644
--- a/app/src/components/ui/inputs/Boolean.jsx
+++ b/stix-modeler-app/src/components/ui/inputs/Boolean.jsx
@@ -9,10 +9,6 @@ class Boolean extends React.Component {
super(props);
}
- componentDidMount() {
-
- }
-
onClickHandler(field, value) {
this.props.onClickHandler(field, value);
}
diff --git a/app/src/components/ui/inputs/CSVInput.jsx b/stix-modeler-app/src/components/ui/inputs/CSVInput.jsx
similarity index 83%
rename from app/src/components/ui/inputs/CSVInput.jsx
rename to stix-modeler-app/src/components/ui/inputs/CSVInput.jsx
index 34db9de..3543703 100644
--- a/app/src/components/ui/inputs/CSVInput.jsx
+++ b/stix-modeler-app/src/components/ui/inputs/CSVInput.jsx
@@ -9,21 +9,18 @@ class CSVInput extends React.Component {
super(props);
}
- componentDidMount() {
-
- }
-
onClickHandler(field, value) {
this.props.onClickHandler(field, value);
}
render() {
- const value = this.props.value ? this.props.value.join() : '';
+ const value = this.props.value ?? "";
return (
);
diff --git a/app/src/components/ui/inputs/DateTime.jsx b/stix-modeler-app/src/components/ui/inputs/DateTime.jsx
similarity index 62%
rename from app/src/components/ui/inputs/DateTime.jsx
rename to stix-modeler-app/src/components/ui/inputs/DateTime.jsx
index 7d28316..f6ee8df 100644
--- a/app/src/components/ui/inputs/DateTime.jsx
+++ b/stix-modeler-app/src/components/ui/inputs/DateTime.jsx
@@ -1,6 +1,8 @@
import React from 'react';
import DatePicker from 'react-datepicker';
+import Text from './Text.jsx';
+
import 'react-datepicker/dist/react-datepicker.css';
import './datetime.scss';
@@ -12,15 +14,24 @@ export default class DateTime extends React.Component {
}
onChange(datetime) {
- this.props.onChange(this.props.name, datetime);
+ this.props.onDateChange(this.props.name, datetime);
}
render() {
let dts = this.props.selected;
+ let control = (
);
+
if (typeof dts === 'string') {
const dateObj = new Date(dts);
- dts = dateObj;
+ if (isNaN(dateObj.getTime())) {
+ return control;
+ } else {
+ dts = dateObj;
+ }
}
return (
diff --git a/app/src/components/ui/inputs/FileSelector.jsx b/stix-modeler-app/src/components/ui/inputs/FileSelector.jsx
similarity index 100%
rename from app/src/components/ui/inputs/FileSelector.jsx
rename to stix-modeler-app/src/components/ui/inputs/FileSelector.jsx
diff --git a/app/src/components/ui/inputs/LabeledText.jsx b/stix-modeler-app/src/components/ui/inputs/LabeledText.jsx
similarity index 76%
rename from app/src/components/ui/inputs/LabeledText.jsx
rename to stix-modeler-app/src/components/ui/inputs/LabeledText.jsx
index dd46e44..120a8ee 100644
--- a/app/src/components/ui/inputs/LabeledText.jsx
+++ b/stix-modeler-app/src/components/ui/inputs/LabeledText.jsx
@@ -1,6 +1,8 @@
import React from 'react';
import PropTypes from 'prop-types';
+import Text from './Text';
import { observer } from 'mobx-react';
+import classNames from 'classnames';
import './text.scss';
@@ -36,6 +38,10 @@ class LabeledText extends React.Component {
render() {
const inputType = this.props.type ? this.props.type : 'text';
+ const { required, } = this.props ?? "";
+ const { value, } = this.props;
+ const invalid = required && !value.length;
+ const warning = invalid? (
This field is required
) : "";
return (
@@ -44,14 +50,18 @@ class LabeledText extends React.Component {
type={inputType}
ref={(c) => { this.input = c; }}
autoComplete={this.props.autocomplete || 'off'}
- className="def"
+ className={classNames({
+ "def": true,
+ "invalid": invalid
+ })}
placeholder={this.props.placeholder}
onChange={this.onChangeHandler}
onKeyDown={(e) => this.onKeyDownHandler(e)}
- value={this.props.value}
+ value={value}
disabled={this.props.disabled}
id={this.props.id}
/>
+ {warning}
);
}
diff --git a/stix-modeler-app/src/components/ui/inputs/OrientationRadioGroup.jsx b/stix-modeler-app/src/components/ui/inputs/OrientationRadioGroup.jsx
new file mode 100644
index 0000000..dcd306e
--- /dev/null
+++ b/stix-modeler-app/src/components/ui/inputs/OrientationRadioGroup.jsx
@@ -0,0 +1,50 @@
+import React, { useState, useEffect } from 'react';
+
+const OrientationRadioGroup = ({ defaultOrientation, onOrientationChange }) => {
+ const [selectedOption, setSelectedOption] = useState('');
+
+ useEffect(() => {
+ if (defaultOrientation) {
+ setSelectedOption(defaultOrientation);
+ }
+ }, [defaultOrientation]);
+
+ const handleOptionChange = (event) => {
+ const newOrientation = event.target.value;
+ setSelectedOption(newOrientation);
+ if (onOrientationChange) {
+ onOrientationChange(newOrientation);
+ } else {
+ console.error("onOrientationChange function is missing!");
+ }
+ };
+
+ return (
+
+ );
+};
+
+export default OrientationRadioGroup;
diff --git a/stix-modeler-app/src/components/ui/inputs/RadioGroup.jsx b/stix-modeler-app/src/components/ui/inputs/RadioGroup.jsx
new file mode 100644
index 0000000..d3e0d29
--- /dev/null
+++ b/stix-modeler-app/src/components/ui/inputs/RadioGroup.jsx
@@ -0,0 +1,61 @@
+import React, { useState, useEffect } from 'react';
+
+const RadioGroup = ({ defaultLayoutMethod, onLayoutChange }) => {
+ const [selectedOption, setSelectedOption] = useState('');
+
+ useEffect(() => {
+ if (defaultLayoutMethod) {
+ setSelectedOption(defaultLayoutMethod);
+ }
+ }, [defaultLayoutMethod]);
+
+ const handleOptionChange = (event) => {
+ const newLayout = event.target.value;
+ setSelectedOption(newLayout);
+ if (onLayoutChange) {
+ onLayoutChange(newLayout);
+ } else {
+ console.error("onLayoutChange function is missing!");
+ }
+ };
+
+ return (
+
+ );
+};
+
+export default RadioGroup;
\ No newline at end of file
diff --git a/app/src/components/ui/inputs/Slider.jsx b/stix-modeler-app/src/components/ui/inputs/Slider.jsx
similarity index 100%
rename from app/src/components/ui/inputs/Slider.jsx
rename to stix-modeler-app/src/components/ui/inputs/Slider.jsx
diff --git a/app/src/components/ui/inputs/Text.jsx b/stix-modeler-app/src/components/ui/inputs/Text.jsx
similarity index 72%
rename from app/src/components/ui/inputs/Text.jsx
rename to stix-modeler-app/src/components/ui/inputs/Text.jsx
index 78fb524..55a6199 100644
--- a/app/src/components/ui/inputs/Text.jsx
+++ b/stix-modeler-app/src/components/ui/inputs/Text.jsx
@@ -1,6 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import { observer } from 'mobx-react';
+import classNames from 'classnames';
import './text.scss';
@@ -35,8 +36,11 @@ class Text extends React.Component {
}
render() {
- const inputType = this.props.type ? this.props.type : 'text';
-
+ const inputType = this.props.type ?? 'text';
+ const { required, } = this.props;
+ const { value, } = this.props ?? "";
+ const invalid = required && !`${value}`.length; // prevents 0 from being interpreted as missing field
+ const warning = invalid? (
This field is required
) : "";
return (
{ this.input = c; }}
autoComplete={this.props.autocomplete || 'off'}
- className="def"
+ className={classNames({
+ "def": true,
+ "invalid": invalid
+ })}
placeholder={this.props.placeholder}
onChange={this.onChangeHandler}
onKeyDown={(e) => this.onKeyDownHandler(e)}
- value={this.props.value}
+ value={value}
disabled={this.props.disabled}
id={this.props.id}
/>
+ {warning}
);
}
diff --git a/app/src/components/ui/inputs/TextArea.jsx b/stix-modeler-app/src/components/ui/inputs/TextArea.jsx
similarity index 75%
rename from app/src/components/ui/inputs/TextArea.jsx
rename to stix-modeler-app/src/components/ui/inputs/TextArea.jsx
index d6b4ed1..fa9cda1 100644
--- a/app/src/components/ui/inputs/TextArea.jsx
+++ b/stix-modeler-app/src/components/ui/inputs/TextArea.jsx
@@ -1,5 +1,6 @@
import React from 'react';
import { observer } from 'mobx-react';
+import classNames from 'classnames';
import './text.scss';
@@ -38,7 +39,10 @@ class TextArea extends React.Component {
}
render() {
- const rows = this.props.rows ? this.props.rows : 1;
+ const {required, } = this.props;
+ const { value, } = this.props;
+ const invalid = required && !value.length;
+ const warning = invalid? (
This field is required
) : "";
return (
@@ -48,14 +52,18 @@ class TextArea extends React.Component {
this.input = c;
}}
autoComplete={this.props.autocomplete || 'off'}
- className="def"
+ className={classNames({
+ "def": true,
+ "invalid": invalid
+ })}
placeholder={this.props.placeholder}
onChange={this.onChangeHandler}
onKeyDown={(e) => this.onKeyDownHandler(e)}
- value={this.props.value}
+ value={value}
disabled={this.props.disabled}
id={this.props.id}
/>
+ {warning}
);
}
diff --git a/app/src/components/ui/inputs/arrayselector.scss b/stix-modeler-app/src/components/ui/inputs/arrayselector.scss
similarity index 79%
rename from app/src/components/ui/inputs/arrayselector.scss
rename to stix-modeler-app/src/components/ui/inputs/arrayselector.scss
index 2728118..425eb45 100644
--- a/app/src/components/ui/inputs/arrayselector.scss
+++ b/stix-modeler-app/src/components/ui/inputs/arrayselector.scss
@@ -1,4 +1,4 @@
-@import '../../../defaults';
+@use '../../../defaults';
.array-container {
padding-left: 20px;
@@ -6,7 +6,7 @@
.array-container-header {
font-weight: bold;
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
padding-bottom: 3px;
span {
@@ -21,12 +21,12 @@
}
.remove {
- color: $error-font;
+ color: defaults.$error-font;
}
.add {
padding-top: 15px;
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
}
.array-container-input {
@@ -51,7 +51,7 @@
.array-container-body {
height: 100px;
overflow: auto;
- border: 1px solid $standard-border-color;
+ border: 1px solid defaults.$standard-border-color;
.array-container-item {
cursor: pointer;
@@ -60,11 +60,11 @@
}
.array-container-selected {
- background-color: $default-active-bg;
+ background-color: defaults.$default-active-bg;
}
.array-container-item:hover {
- background-color: $light-font-0;
+ background-color: defaults.$light-font-0;
}
.array-block-input {
@@ -83,7 +83,7 @@
span {
cursor: pointer;
- color: $default-active-bg;
+ color: defaults.$default-active-bg;
padding-left: 5px;
padding-top: 40%;
}
diff --git a/app/src/components/ui/inputs/boolean.scss b/stix-modeler-app/src/components/ui/inputs/boolean.scss
similarity index 60%
rename from app/src/components/ui/inputs/boolean.scss
rename to stix-modeler-app/src/components/ui/inputs/boolean.scss
index 17fea8d..c778353 100644
--- a/app/src/components/ui/inputs/boolean.scss
+++ b/stix-modeler-app/src/components/ui/inputs/boolean.scss
@@ -1,10 +1,10 @@
-@import '../../../defaults';
+@use '../../../defaults';
.boolean {
display: flex;
flex-direction: row;
line-height: 30px;
- border: 1px solid $standard-border-color;
+ border: 1px solid defaults.$standard-border-color;
width: 99%;
div {
@@ -14,7 +14,7 @@
}
.selected {
- background-color: $default-active-bg;
+ background-color: defaults.$default-active-bg;
}
}
diff --git a/app/src/components/ui/inputs/csvselector.scss b/stix-modeler-app/src/components/ui/inputs/csvselector.scss
similarity index 100%
rename from app/src/components/ui/inputs/csvselector.scss
rename to stix-modeler-app/src/components/ui/inputs/csvselector.scss
diff --git a/app/src/components/ui/inputs/datetime.scss b/stix-modeler-app/src/components/ui/inputs/datetime.scss
similarity index 65%
rename from app/src/components/ui/inputs/datetime.scss
rename to stix-modeler-app/src/components/ui/inputs/datetime.scss
index bd11edb..2e9c108 100644
--- a/app/src/components/ui/inputs/datetime.scss
+++ b/stix-modeler-app/src/components/ui/inputs/datetime.scss
@@ -1,4 +1,4 @@
-@import '../../../defaults';
+@use '../../../defaults';
.react-datepicker-wrapper {
width: 100%;
@@ -6,11 +6,11 @@
.react-datepicker__input-container input {
height: 39px;
- border: 1px solid $standard-border-color;
+ border: 1px solid defaults.$standard-border-color;
background-color: transparent;
width: 97%;
padding-left: 10px;
- font-family: $default-font-family;
+ font-family: defaults.$default-font-family;
color: #000;
font-size: 16px;
font-weight: bold;
diff --git a/app/src/components/ui/inputs/fileselector.scss b/stix-modeler-app/src/components/ui/inputs/fileselector.scss
similarity index 53%
rename from app/src/components/ui/inputs/fileselector.scss
rename to stix-modeler-app/src/components/ui/inputs/fileselector.scss
index 3b83b0a..ab47371 100644
--- a/app/src/components/ui/inputs/fileselector.scss
+++ b/stix-modeler-app/src/components/ui/inputs/fileselector.scss
@@ -1,14 +1,14 @@
-@import '../../../defaults';
+@use '../../../defaults';
input.def {
height: 39px;
- border: 1px solid $standard-border-color;
+ border: 1px solid defaults.$standard-border-color;
background-color: transparent;
width: 97%;
padding-left: 10px;
- color: $dark-font-0;
+ color: defaults.$dark-font-0;
font-size: 16px;
- font-family: $default-font-family;
+ font-family: defaults.$default-font-family;
}
.custom-file-selector {
@@ -16,5 +16,5 @@ input.def {
padding: 5px 4px 5px 11px;
color: #fff;
font-weight: bold;
- background-color: $default-active-bg;
+ background-color: defaults.$default-active-bg;
}
\ No newline at end of file
diff --git a/app/src/components/ui/inputs/slider.scss b/stix-modeler-app/src/components/ui/inputs/slider.scss
similarity index 65%
rename from app/src/components/ui/inputs/slider.scss
rename to stix-modeler-app/src/components/ui/inputs/slider.scss
index f44fd1c..f60ceaf 100644
--- a/app/src/components/ui/inputs/slider.scss
+++ b/stix-modeler-app/src/components/ui/inputs/slider.scss
@@ -1,4 +1,4 @@
-@import '../../../defaults';
+@use '../../../defaults';
.rc-slider-track {
background-color: transparet;
diff --git a/app/src/components/ui/inputs/text.scss b/stix-modeler-app/src/components/ui/inputs/text.scss
similarity index 68%
rename from app/src/components/ui/inputs/text.scss
rename to stix-modeler-app/src/components/ui/inputs/text.scss
index ea7d6cb..90ff65a 100644
--- a/app/src/components/ui/inputs/text.scss
+++ b/stix-modeler-app/src/components/ui/inputs/text.scss
@@ -1,4 +1,4 @@
-@import '../../../defaults';
+@use '../../../defaults';
input:focus,
textarea:focus,
@@ -10,13 +10,17 @@ input.def,
textarea,
select {
height: 39px;
- border: 1px solid $standard-border-color;
+ border: 1px solid defaults.$standard-border-color;
background-color: transparent;
width: 97%;
padding-left: 10px;
- color: $dark-font-0;
+ color: defaults.$dark-font-0;
font-size: 16px;
- font-family: $default-font-family;
+ font-family: defaults.$default-font-family;
+}
+
+input.def {
+ background-color: white;
}
textarea {
diff --git a/app/src/components/ui/panel/Panel.jsx b/stix-modeler-app/src/components/ui/panel/Panel.jsx
similarity index 100%
rename from app/src/components/ui/panel/Panel.jsx
rename to stix-modeler-app/src/components/ui/panel/Panel.jsx
diff --git a/app/src/components/ui/panel/panel.scss b/stix-modeler-app/src/components/ui/panel/panel.scss
similarity index 80%
rename from app/src/components/ui/panel/panel.scss
rename to stix-modeler-app/src/components/ui/panel/panel.scss
index ba53136..4df9d05 100644
--- a/app/src/components/ui/panel/panel.scss
+++ b/stix-modeler-app/src/components/ui/panel/panel.scss
@@ -1,4 +1,4 @@
-@import '../../../defaults';
+@use '../../../defaults';
.mask {
position: fixed;
@@ -7,7 +7,7 @@
right: 0px;
bottom: 0px;
background-color: rgba(0, 0, 0,.2);
- z-index: $panel-mask-index;
+ z-index: defaults.$panel-mask-index;
.panel {
position: absolute;
@@ -17,7 +17,7 @@
bottom: 0px;
background-color: #fff;
box-shadow: -20px 25px 50px 0px #000;
- z-index: $panel-index;
+ z-index: defaults.$panel-index;
display: flex;
flex-direction: column;
}
diff --git a/app/src/defaults.scss b/stix-modeler-app/src/defaults.scss
similarity index 92%
rename from app/src/defaults.scss
rename to stix-modeler-app/src/defaults.scss
index 844ad56..0e25176 100644
--- a/app/src/defaults.scss
+++ b/stix-modeler-app/src/defaults.scss
@@ -3,6 +3,7 @@ $default-font-family: 'Alegreya Sans SC';
//colors
$default-active-bg: #46a0f5;
$error-font: #d31d18;
+$warning-font: #dda20f;
$light-font-0: #e1e3e6;
$gray-font-0: #c8c5c5;
$dark-font-0: #000;
diff --git a/app/src/definition-adapters/Artifact.js b/stix-modeler-app/src/definition-adapters/Artifact.js
similarity index 87%
rename from app/src/definition-adapters/Artifact.js
rename to stix-modeler-app/src/definition-adapters/Artifact.js
index f911d4d..946e732 100644
--- a/app/src/definition-adapters/Artifact.js
+++ b/stix-modeler-app/src/definition-adapters/Artifact.js
@@ -20,10 +20,7 @@ class Artifact extends Base {
this.properties.payload_bin.type = 'string';
this.properties.url.type = 'string';
this.properties.encryption_algorithm.type = 'string';
-
- this.properties.hashes.value = {};
-
- this.properties.hashes.control = 'genericobject';
+ this.properties.encryption_algorithm.vocab = this.definitions["encryption-algorithm-enum"].enum;
}
}
diff --git a/app/src/definition-adapters/AttackPattern.js b/stix-modeler-app/src/definition-adapters/AttackPattern.js
similarity index 94%
rename from app/src/definition-adapters/AttackPattern.js
rename to stix-modeler-app/src/definition-adapters/AttackPattern.js
index 2ca4758..0f2e8d7 100644
--- a/app/src/definition-adapters/AttackPattern.js
+++ b/stix-modeler-app/src/definition-adapters/AttackPattern.js
@@ -11,6 +11,7 @@ class AttackPattern extends Base {
prefix: 'attack-pattern--',
active: true,
relationships: [
+ { type: 'delivers', target: 'malware', },
{ type: 'targets', target: 'identity', },
{ type: 'targets', target: 'location', },
{ type: 'targets', target: 'vulnerability', },
diff --git a/app/src/definition-adapters/AutonomousSystem.js b/stix-modeler-app/src/definition-adapters/AutonomousSystem.js
similarity index 100%
rename from app/src/definition-adapters/AutonomousSystem.js
rename to stix-modeler-app/src/definition-adapters/AutonomousSystem.js
diff --git a/stix-modeler-app/src/definition-adapters/Base.js b/stix-modeler-app/src/definition-adapters/Base.js
new file mode 100644
index 0000000..e49b4e0
--- /dev/null
+++ b/stix-modeler-app/src/definition-adapters/Base.js
@@ -0,0 +1,402 @@
+import deepmerge from 'deepmerge';
+import moment from 'moment';
+
+const SPEC_VERSION = 2.1;
+
+const COMMON_RELS = [
+ {
+ type: 'includes', target: 'grouping', x_embed: 'object_refs', x_reverse: true,
+ },
+ {
+ type: 'applies-to', target: 'note', x_embed: 'object_refs', x_reverse: true,
+ },
+ {
+ type: 'applies-to', target: 'opinion', x_embed: 'object_refs', x_reverse: true,
+ },
+ {
+ type: 'references', target: 'report', x_embed: 'object_refs', x_reverse: true,
+ },
+ {
+ type: 'applies-to', target: 'marking-definition', x_embed: 'object_marking_refs', x_reverse: true,
+ }
+];
+
+export class Base {
+ constructor(common, def) {
+ const commonProps = common.properties;
+ let defProps = {};
+
+ // Set required common properties
+ common.required.map((item) => {
+ if (commonProps[item]) {
+ commonProps[item].required = true;
+ }
+ });
+
+ // Get type-specific properties
+ if (def.allOf) {
+ def.allOf.map((item) => {
+ if ('properties' in item) {
+ defProps = item.properties;
+ }
+ });
+ } else {
+ defProps = def.properties;
+ }
+
+ // Set required type-specific properties
+ if (def.required) {
+ def.required.map((item) => {
+ if (defProps[item]) {
+ defProps[item].required = true;
+ }
+ });
+ }
+
+ // Set properties for singleton from schema
+ for (const item in def) {
+ this[item] = def[item];
+ }
+
+ // Add common relationships
+ for (const rel of COMMON_RELS) {
+ def.relationships.push(rel);
+ }
+
+ // Only SROs and SCOs may have this property
+ if ("created_by_ref" in commonProps) {
+ def.relationships.push({
+ type: 'created-by', target: 'identity', x_exclusive: true, x_embed: 'created_by_ref',
+ }
+ )}
+
+ const mergedProps = deepmerge(commonProps, defProps);
+
+ this.handleFields(mergedProps);
+
+ this.properties = mergedProps;
+ this.extensions = [];
+ }
+
+ /**
+ * Set default values and control types for the specified properties
+ * @param {object} mergedProps properties (common and sdo-specific)
+ */
+ handleFields(mergedProps) {
+ // Start special handling of common object
+ // properties.
+ for (const prop in mergedProps) {
+ // Get (possibly nested) ref
+ let ref = mergedProps[prop].$ref;
+ for (const a in mergedProps[prop].allOf) {
+ if (mergedProps[prop].allOf[a].$ref) {
+ ref = mergedProps[prop].allOf[a].$ref;
+ }
+ }
+ ref = ref || '';
+
+ if (ref.length) {
+ mergedProps[prop].type = ref;
+ }
+
+ // Set default blank values based on the prop
+ // type.
+ if (mergedProps[prop].type) {
+ mergedProps[prop].value = this.defaultValue(mergedProps[prop]);
+ }
+ }
+
+ if (mergedProps.type) {
+ mergedProps.type.control = 'literal';
+ if (mergedProps.type.enum) {
+ mergedProps.type.value = mergedProps.type.enum[0];
+ }
+ }
+
+ if (mergedProps.aliases) {
+ mergedProps.aliases.control = 'csv';
+ }
+
+ if (mergedProps.kill_chain_phases) {
+ mergedProps.kill_chain_phases.control = 'killchain';
+ mergedProps.kill_chain_phases.vocab = [
+ {
+ label: 'Lockheed Kill Chain',
+ value: 'lockheed-martin-cyber-kill-chain',
+ phases: [
+ {
+ label: 'Reconnaissance',
+ phase_name: 'reconnaissance',
+ },
+ {
+ label: 'Weaponize',
+ phase_name: 'weaponization',
+ },
+ {
+ label: 'Delivery',
+ phase_name: 'delivery',
+ },
+ {
+ label: 'Exploitation',
+ phase_name: 'exploitation',
+ },
+ {
+ label: 'Installation',
+ phase_name: 'installation',
+ },
+ {
+ label: 'Command & Control (C2)',
+ phase_name: 'command-and-control',
+ },
+ {
+ label: 'Actions On Objectives',
+ phase_name: 'actions-on-objectives',
+ }
+ ],
+ },
+ {
+ label: 'MITRE ATT&CK',
+ value: 'mitre-attack',
+ phases: [
+ {
+ label: 'Reconnaissance',
+ phase_name: 'reconnaissance',
+ },
+ {
+ label: 'Resource Development',
+ phase_name: 'resource-development',
+ },
+ {
+ label: 'Initial Access',
+ phase_name: 'initial-access',
+ },
+ {
+ label: 'Execution',
+ phase_name: 'execution',
+ },
+ {
+ label: 'Persistence',
+ phase_name: 'persistence',
+ },
+ {
+ label: 'Privilege Escalation',
+ phase_name: 'privilege-escalation'
+ },
+ {
+ label: 'Defense Evasion',
+ phase_name: 'defense-evasion',
+ },
+ {
+ label: 'Credential Access',
+ phase_name: 'credential-access',
+ },
+ {
+ label: 'Discovery',
+ phase_name: 'discovery',
+ },
+ {
+ label: 'Lateral Movement',
+ phase_name: 'lateral-movement',
+ },
+ {
+ label: 'Collection',
+ phase_name: 'collection'
+ },
+ {
+ label: 'Command & Control (C2)',
+ phase_name: 'command-and-control',
+ },
+ {
+ label: 'Exfiltration',
+ phase_name: 'exfiltration',
+ },
+ {
+ label: 'Impact',
+ phase_name: 'impact'
+ }
+ ],
+ }
+ ];
+ }
+
+ if (mergedProps.external_references) {
+ mergedProps.external_references.control = 'externalrefs';
+ }
+
+ mergedProps.id.control = 'hidden';
+
+ if (mergedProps.confidence) {
+ mergedProps.confidence.control = 'slider';
+ }
+
+ if (mergedProps.description) {
+ mergedProps.description.control = 'textarea';
+ }
+
+ if (mergedProps.hashes) {
+ mergedProps.hashes.control = 'killchain';
+ mergedProps.hashes.vocab = [
+ 'MD5', 'SHA-1', 'SHA-256', 'SHA-512',
+ 'SHA3-256', 'SHA3-512', 'SSDEEP'
+ ]
+ mergedProps.hashes.control = 'genericobject';
+ mergedProps.hashes.type = 'object';
+ mergedProps.hashes.value = {};
+ }
+
+ /**
+ * These are defaults that are to be set by the TI orchestrator
+ */
+
+ mergedProps.spec_version.value = SPEC_VERSION;
+ mergedProps.spec_version.control = 'literal';
+
+ if (mergedProps.extensions) {
+ mergedProps.extensions.control = 'genericobject';
+ mergedProps.extensions.type = 'object';
+ mergedProps.extensions.value = {};
+ mergedProps.extensions.control = 'hidden';
+ }
+
+
+ if (mergedProps.lang) {
+ mergedProps.lang.value = 'en';
+ mergedProps.lang.control = 'hidden';
+ }
+
+ mergedProps.object_marking_refs.control = 'hidden';
+ mergedProps.granular_markings.control = 'hidden';
+ }
+
+ /**
+ * Get the default empty value for the specified
+ * property's type
+ * @param {object} def property
+ * @returns default value for property
+ */
+ defaultValue(def) {
+ let type = def.type;
+ let value;
+
+ type = type.split('/').slice(-1)[0];
+ type = type.split('.json')[0];
+ def.type = type;
+
+ switch (type) {
+ case 'boolean':
+ value = false;
+ break;
+ case 'dictionary':
+ case 'external-reference':
+ case 'hashes':
+ case 'hashes-type':
+ case 'object':
+ case 'observable-container':
+ value = {};
+ def.type = 'object';
+ break;
+ case 'float':
+ case 'integer':
+ case 'number':
+ value = 0;
+ def.type = 'number';
+ break;
+ case 'binary':
+ case 'hex':
+ case 'identifier':
+ case 'open-vocab':
+ case 'string':
+ case 'url-regex':
+ value = "";
+ def.type = 'string';
+ break;
+ case 'array':
+ case 'list':
+ def.type = 'array';
+ case 'enum':
+ case 'kill-chain-phase':
+ value = [];
+ break;
+ case 'timestamp':
+ value = moment().utc(true).format('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+ break;
+ default:
+ break;
+ }
+
+ return value;
+ }
+
+ /**
+ * Flatten nested extension properties
+ * (Enables resiliency for non-standard schema formats)
+ * @param {*} schema
+ * @returns dictionary of properties
+ */
+ flattenExtensionProperties(schema) {
+ let extProps = {}
+ let properties;
+ if (schema.allOf) {
+ schema.allOf.map((item) => {
+ if ('properties' in item) {
+ properties = item.properties
+ }
+ });
+ } else {
+ properties = schema.properties;
+ }
+
+ // In case of nested property extensions
+ let found = true;
+ while (found) {
+ found = false;
+ for (const [key, value] of Object.entries(properties)) {
+ if (key == 'properties' || key == 'extensions' ||
+ key.includes("extension-definition")) {
+ properties = value;
+ found = true;
+ break;
+ }
+ }
+ }
+
+ for (const [prop, def] of Object.entries(properties)) {
+ if (prop != 'extension_type') {
+ const value = this.defaultValue(def);
+ extProps[prop] = def;
+ def.value = value;
+ }
+ }
+
+ return extProps;
+ }
+
+
+ /**
+ * Merge properties from a property-extension schema into the
+ * SDO singleton
+ * @param {*} def schema of extended properties
+ * @param {*} extDef extension definition node
+ */
+ mergeExtension(def, extDef) {
+ const { properties, } = this;
+
+ if (!('extensions' in properties)) {
+ this.properties.extensions = {};
+ this.properties.extensions.value = {};
+ }
+
+ // If this object uses extensions (such as network-traffic),
+ // do not allow further editing via gui
+ this.properties.extensions.type = 'object';
+ this.properties.extensions.control = 'hidden';
+
+ const extProps = this.flattenExtensionProperties(def);
+ // Only toplevel-property-extensions can have extension_properties field,
+ // but this useful, so hold onto it
+ extDef.extension_properties = Object.keys(extProps);
+ const mergedProps = deepmerge(properties, extProps);
+ this.properties = mergedProps;
+ this.extensions.push(extDef.uiid);
+ }
+}
diff --git a/app/src/definition-adapters/Campaign.js b/stix-modeler-app/src/definition-adapters/Campaign.js
similarity index 100%
rename from app/src/definition-adapters/Campaign.js
rename to stix-modeler-app/src/definition-adapters/Campaign.js
diff --git a/app/src/definition-adapters/Certificate.js b/stix-modeler-app/src/definition-adapters/Certificate.js
similarity index 86%
rename from app/src/definition-adapters/Certificate.js
rename to stix-modeler-app/src/definition-adapters/Certificate.js
index 22a9a67..e1063fe 100644
--- a/app/src/definition-adapters/Certificate.js
+++ b/stix-modeler-app/src/definition-adapters/Certificate.js
@@ -17,9 +17,6 @@ class Certificate extends Base {
super(common, def);
- this.properties.hashes.value = {};
- this.properties.hashes.control = 'genericobject';
-
this.properties.x509_v3_extensions.type = 'string';
}
}
diff --git a/app/src/definition-adapters/CourseOfAction.js b/stix-modeler-app/src/definition-adapters/CourseOfAction.js
similarity index 100%
rename from app/src/definition-adapters/CourseOfAction.js
rename to stix-modeler-app/src/definition-adapters/CourseOfAction.js
diff --git a/app/src/definition-adapters/Custom.js b/stix-modeler-app/src/definition-adapters/Custom.js
similarity index 71%
rename from app/src/definition-adapters/Custom.js
rename to stix-modeler-app/src/definition-adapters/Custom.js
index 9cc556f..58469d5 100644
--- a/app/src/definition-adapters/Custom.js
+++ b/stix-modeler-app/src/definition-adapters/Custom.js
@@ -24,12 +24,7 @@ class Custom extends Base {
const def = deepmerge(definition_extension, rawDefinition);
super(common, def);
- const extProps = { extension_type: extensionDefinition.extension_types[0], };
- this.properties.extensions = {};
- this.properties.extensions.type = 'object';
- this.properties.extensions.value = {};
- this.properties.extensions.value[extensionDefinition.id] = extProps;
- this.properties.extensions.control = 'hidden';
+ this.extensions.push(extensionDefinition.uiid);
}
}
diff --git a/app/src/definition-adapters/Directory.js b/stix-modeler-app/src/definition-adapters/Directory.js
similarity index 100%
rename from app/src/definition-adapters/Directory.js
rename to stix-modeler-app/src/definition-adapters/Directory.js
diff --git a/app/src/definition-adapters/DomainName.js b/stix-modeler-app/src/definition-adapters/DomainName.js
similarity index 100%
rename from app/src/definition-adapters/DomainName.js
rename to stix-modeler-app/src/definition-adapters/DomainName.js
diff --git a/app/src/definition-adapters/EmailAddr.js b/stix-modeler-app/src/definition-adapters/EmailAddr.js
similarity index 100%
rename from app/src/definition-adapters/EmailAddr.js
rename to stix-modeler-app/src/definition-adapters/EmailAddr.js
diff --git a/app/src/definition-adapters/EmailMessage.js b/stix-modeler-app/src/definition-adapters/EmailMessage.js
similarity index 97%
rename from app/src/definition-adapters/EmailMessage.js
rename to stix-modeler-app/src/definition-adapters/EmailMessage.js
index 076d3c9..c4ced3e 100644
--- a/app/src/definition-adapters/EmailMessage.js
+++ b/stix-modeler-app/src/definition-adapters/EmailMessage.js
@@ -42,7 +42,7 @@ class EmailMessage extends Base {
super(common, def);
- this.properties.date.type = 'dts';
+ this.properties.date.type = 'timestamp';
this.properties.additional_header_fields.value = {};
this.properties.from_ref.control = 'hidden';
diff --git a/app/src/definition-adapters/ExtensionDefinition.js b/stix-modeler-app/src/definition-adapters/ExtensionDefinition.js
similarity index 85%
rename from app/src/definition-adapters/ExtensionDefinition.js
rename to stix-modeler-app/src/definition-adapters/ExtensionDefinition.js
index 0480c4e..c911cd2 100644
--- a/app/src/definition-adapters/ExtensionDefinition.js
+++ b/stix-modeler-app/src/definition-adapters/ExtensionDefinition.js
@@ -20,7 +20,8 @@ class ExtensionDefinition extends Base {
// Hoist vocabs onto properties
this.properties.extension_types.vocab = this.definitions['extension-type-enum'].enum;
- this.properties.extension_types.control = 'stringselector';
+ this.properties.extension_types.control = 'hidden';
+ this.properties.extension_properties.control = 'hidden';
}
}
diff --git a/app/src/definition-adapters/File.js b/stix-modeler-app/src/definition-adapters/File.js
similarity index 97%
rename from app/src/definition-adapters/File.js
rename to stix-modeler-app/src/definition-adapters/File.js
index 50b0408..ba14681 100644
--- a/app/src/definition-adapters/File.js
+++ b/stix-modeler-app/src/definition-adapters/File.js
@@ -135,8 +135,6 @@ class File extends Base {
this.properties.content_ref.control = 'hidden';
this.properties.parent_directory_ref.control = 'hidden';
this.properties.contains_refs.control = 'hidden';
- this.properties.hashes.control = 'genericobject';
- this.properties.hashes.type = 'object';
this.properties.magic_number_hex.type = 'string';
this.properties.size.type = 'string';
diff --git a/app/src/definition-adapters/Grouping.js b/stix-modeler-app/src/definition-adapters/Grouping.js
similarity index 100%
rename from app/src/definition-adapters/Grouping.js
rename to stix-modeler-app/src/definition-adapters/Grouping.js
diff --git a/app/src/definition-adapters/IPv4Addr.js b/stix-modeler-app/src/definition-adapters/IPv4Addr.js
similarity index 100%
rename from app/src/definition-adapters/IPv4Addr.js
rename to stix-modeler-app/src/definition-adapters/IPv4Addr.js
diff --git a/app/src/definition-adapters/IPv6Addr.js b/stix-modeler-app/src/definition-adapters/IPv6Addr.js
similarity index 100%
rename from app/src/definition-adapters/IPv6Addr.js
rename to stix-modeler-app/src/definition-adapters/IPv6Addr.js
diff --git a/app/src/definition-adapters/Identity.js b/stix-modeler-app/src/definition-adapters/Identity.js
similarity index 100%
rename from app/src/definition-adapters/Identity.js
rename to stix-modeler-app/src/definition-adapters/Identity.js
diff --git a/app/src/definition-adapters/Indicator.js b/stix-modeler-app/src/definition-adapters/Indicator.js
similarity index 100%
rename from app/src/definition-adapters/Indicator.js
rename to stix-modeler-app/src/definition-adapters/Indicator.js
diff --git a/app/src/definition-adapters/Infrastructure.js b/stix-modeler-app/src/definition-adapters/Infrastructure.js
similarity index 100%
rename from app/src/definition-adapters/Infrastructure.js
rename to stix-modeler-app/src/definition-adapters/Infrastructure.js
diff --git a/app/src/definition-adapters/IntrusionSet.js b/stix-modeler-app/src/definition-adapters/IntrusionSet.js
similarity index 100%
rename from app/src/definition-adapters/IntrusionSet.js
rename to stix-modeler-app/src/definition-adapters/IntrusionSet.js
diff --git a/app/src/definition-adapters/Location.js b/stix-modeler-app/src/definition-adapters/Location.js
similarity index 100%
rename from app/src/definition-adapters/Location.js
rename to stix-modeler-app/src/definition-adapters/Location.js
diff --git a/app/src/definition-adapters/MacAddr.js b/stix-modeler-app/src/definition-adapters/MacAddr.js
similarity index 100%
rename from app/src/definition-adapters/MacAddr.js
rename to stix-modeler-app/src/definition-adapters/MacAddr.js
diff --git a/app/src/definition-adapters/Malware.js b/stix-modeler-app/src/definition-adapters/Malware.js
similarity index 100%
rename from app/src/definition-adapters/Malware.js
rename to stix-modeler-app/src/definition-adapters/Malware.js
diff --git a/app/src/definition-adapters/MalwareAnalysis.js b/stix-modeler-app/src/definition-adapters/MalwareAnalysis.js
similarity index 100%
rename from app/src/definition-adapters/MalwareAnalysis.js
rename to stix-modeler-app/src/definition-adapters/MalwareAnalysis.js
diff --git a/app/src/definition-adapters/MarkingDefinitionAmber.js b/stix-modeler-app/src/definition-adapters/MarkingDefinitionAmber.js
similarity index 75%
rename from app/src/definition-adapters/MarkingDefinitionAmber.js
rename to stix-modeler-app/src/definition-adapters/MarkingDefinitionAmber.js
index 4758627..ba8a20d 100644
--- a/app/src/definition-adapters/MarkingDefinitionAmber.js
+++ b/stix-modeler-app/src/definition-adapters/MarkingDefinitionAmber.js
@@ -17,11 +17,18 @@ class MarkingDefinitionAmber extends Base {
super(common, def);
+ this.properties.definition_type = {
+ value: 'tlp',
+ type: 'string',
+ control: 'hidden'
+ }
this.properties.definition = {
- tlp: 'amber',
+ value: {
+ tlp: 'amber',
+ },
+ type: 'object',
+ control: 'hidden'
};
-
- this.properties.definition.control = 'hidden';
}
}
diff --git a/app/src/definition-adapters/MarkingDefinitionGreen.js b/stix-modeler-app/src/definition-adapters/MarkingDefinitionGreen.js
similarity index 75%
rename from app/src/definition-adapters/MarkingDefinitionGreen.js
rename to stix-modeler-app/src/definition-adapters/MarkingDefinitionGreen.js
index 623e233..1b3f634 100644
--- a/app/src/definition-adapters/MarkingDefinitionGreen.js
+++ b/stix-modeler-app/src/definition-adapters/MarkingDefinitionGreen.js
@@ -17,11 +17,19 @@ class MarkingDefinitionGreen extends Base {
super(common, def);
+ this.properties.definition_type = {
+ value: 'tlp',
+ type: 'string',
+ control: 'hidden'
+ }
this.properties.definition = {
- tlp: 'green',
+ value: {
+ tlp: 'green',
+ },
+ type: 'object',
+ control: 'hidden'
};
- this.properties.definition.control = 'hidden';
}
}
diff --git a/app/src/definition-adapters/MarkingDefinitionRed.js b/stix-modeler-app/src/definition-adapters/MarkingDefinitionRed.js
similarity index 75%
rename from app/src/definition-adapters/MarkingDefinitionRed.js
rename to stix-modeler-app/src/definition-adapters/MarkingDefinitionRed.js
index a14c028..8ac7608 100644
--- a/app/src/definition-adapters/MarkingDefinitionRed.js
+++ b/stix-modeler-app/src/definition-adapters/MarkingDefinitionRed.js
@@ -17,11 +17,18 @@ class MarkingDefinitionRed extends Base {
super(common, def);
+ this.properties.definition_type = {
+ value: 'tlp',
+ type: 'string',
+ control: 'hidden'
+ }
this.properties.definition = {
- tlp: 'red',
+ value: {
+ tlp: 'red',
+ },
+ type: 'object',
+ control: 'hidden'
};
-
- this.properties.definition.control = 'hidden';
}
}
diff --git a/app/src/definition-adapters/MarkingDefinitionStatement.js b/stix-modeler-app/src/definition-adapters/MarkingDefinitionStatement.js
similarity index 85%
rename from app/src/definition-adapters/MarkingDefinitionStatement.js
rename to stix-modeler-app/src/definition-adapters/MarkingDefinitionStatement.js
index ddd781e..9e093a6 100644
--- a/app/src/definition-adapters/MarkingDefinitionStatement.js
+++ b/stix-modeler-app/src/definition-adapters/MarkingDefinitionStatement.js
@@ -17,6 +17,11 @@ class MarkingDefinitionStatement extends Base {
super(common, def);
+ this.properties.definition_type = {
+ value: 'statement',
+ type: 'string',
+ control: 'hidden'
+ };
this.properties.definition = {};
this.properties.definition.value = {};
this.properties.definition.control = 'genericobject';
diff --git a/app/src/definition-adapters/MarkingDefinitionWhite.js b/stix-modeler-app/src/definition-adapters/MarkingDefinitionWhite.js
similarity index 75%
rename from app/src/definition-adapters/MarkingDefinitionWhite.js
rename to stix-modeler-app/src/definition-adapters/MarkingDefinitionWhite.js
index d1bc30e..352a0ea 100644
--- a/app/src/definition-adapters/MarkingDefinitionWhite.js
+++ b/stix-modeler-app/src/definition-adapters/MarkingDefinitionWhite.js
@@ -17,11 +17,18 @@ class MarkingDefinitionWhite extends Base {
super(common, def);
+ this.properties.definition_type = {
+ value: 'tlp',
+ type: 'string',
+ control: 'hidden'
+ }
this.properties.definition = {
- tlp: 'white',
+ value: {
+ tlp: 'white',
+ },
+ type: 'object',
+ control: 'hidden'
};
-
- this.properties.definition.control = 'hidden';
}
}
diff --git a/app/src/definition-adapters/Mutex.js b/stix-modeler-app/src/definition-adapters/Mutex.js
similarity index 100%
rename from app/src/definition-adapters/Mutex.js
rename to stix-modeler-app/src/definition-adapters/Mutex.js
diff --git a/app/src/definition-adapters/NetworkTraffic.js b/stix-modeler-app/src/definition-adapters/NetworkTraffic.js
similarity index 52%
rename from app/src/definition-adapters/NetworkTraffic.js
rename to stix-modeler-app/src/definition-adapters/NetworkTraffic.js
index 6bb9ffc..857a361 100644
--- a/app/src/definition-adapters/NetworkTraffic.js
+++ b/stix-modeler-app/src/definition-adapters/NetworkTraffic.js
@@ -23,6 +23,57 @@ class NetworkTraffic extends Base {
{
type: 'dst-payload', target: 'artifact', x_exclusive: true, x_embed: 'dst_payload_ref',
},
+
+ {
+ type: 'source', target: 'observable', 'sub-target': 'ipv4-addr', x_exclusive: true, x_embed: 'src_ref',
+ },
+ {
+ type: 'source', target: 'ipv4-addr', x_exclusive: true, x_embed: 'src_ref',
+ },
+ {
+ type: 'source', target: 'observable', 'sub-target': 'ipv6-addr', x_exclusive: true, x_embed: 'src_ref',
+ },
+ {
+ type: 'source', target: 'ipv6-addr', x_exclusive: true, x_embed: 'src_ref',
+ },
+ {
+ type: 'source', target: 'observable', 'sub-target': 'mac-addr', x_exclusive: true, x_embed: 'src_ref',
+ },
+ {
+ type: 'source', target: 'mac-addr', x_exclusive: true, x_embed: 'src_ref',
+ },
+ {
+ type: 'source', target: 'observable', 'sub-target': 'domain-name', x_exclusive: true, x_embed: 'src_ref',
+ },
+ {
+ type: 'source', target: 'domain-name', x_exclusive: true, x_embed: 'src_ref',
+ },
+
+ {
+ type: 'destination', target: 'observable', 'sub-target': 'ipv4-addr', x_exclusive: true, x_embed: 'dst_ref',
+ },
+ {
+ type: 'destination', target: 'ipv4-addr', x_exclusive: true, x_embed: 'dst_ref',
+ },
+ {
+ type: 'destination', target: 'observable', 'sub-target': 'ipv6-addr', x_exclusive: true, x_embed: 'dst_ref',
+ },
+ {
+ type: 'destination', target: 'ipv6-addr', x_exclusive: true, x_embed: 'dst_ref',
+ },
+ {
+ type: 'destination', target: 'observable', 'sub-target': 'mac-addr', x_exclusive: true, x_embed: 'dst_ref',
+ },
+ {
+ type: 'destination', target: 'mac-addr', x_exclusive: true, x_embed: 'dst_ref',
+ },
+ {
+ type: 'destination', target: 'observable', 'sub-target': 'domain-name', x_exclusive: true, x_embed: 'dst_ref',
+ },
+ {
+ type: 'dest', target: 'domain-name', x_exclusive: true, x_embed: 'dst_ref',
+ },
+
{
type: 'encapsulates', target: 'observable', 'sub-target': 'network-traffic', x_embed: 'encapsulates_refs',
},
@@ -44,6 +95,8 @@ class NetworkTraffic extends Base {
this.properties.src_payload_ref.control = 'hidden';
this.properties.dst_payload_ref.control = 'hidden';
+ this.properties.src_ref.control = 'hidden';
+ this.properties.dst_ref.control = 'hidden';
this.properties.encapsulates_refs.control = 'hidden';
this.properties.encapsulated_by_ref.control = 'hidden';
this.properties.protocols.control = 'csv';
diff --git a/app/src/definition-adapters/Note.js b/stix-modeler-app/src/definition-adapters/Note.js
similarity index 100%
rename from app/src/definition-adapters/Note.js
rename to stix-modeler-app/src/definition-adapters/Note.js
diff --git a/app/src/definition-adapters/Observable.js b/stix-modeler-app/src/definition-adapters/Observable.js
similarity index 90%
rename from app/src/definition-adapters/Observable.js
rename to stix-modeler-app/src/definition-adapters/Observable.js
index e53dd09..9231581 100644
--- a/app/src/definition-adapters/Observable.js
+++ b/stix-modeler-app/src/definition-adapters/Observable.js
@@ -1,6 +1,3 @@
-import _cloneDeep from 'lodash/cloneDeep';
-import deepmerge from 'deepmerge';
-
import { Base } from './Base';
class Observable extends Base {
diff --git a/app/src/definition-adapters/ObservedData.js b/stix-modeler-app/src/definition-adapters/ObservedData.js
similarity index 100%
rename from app/src/definition-adapters/ObservedData.js
rename to stix-modeler-app/src/definition-adapters/ObservedData.js
diff --git a/app/src/definition-adapters/Opinion.js b/stix-modeler-app/src/definition-adapters/Opinion.js
similarity index 100%
rename from app/src/definition-adapters/Opinion.js
rename to stix-modeler-app/src/definition-adapters/Opinion.js
diff --git a/app/src/definition-adapters/Process.js b/stix-modeler-app/src/definition-adapters/Process.js
similarity index 100%
rename from app/src/definition-adapters/Process.js
rename to stix-modeler-app/src/definition-adapters/Process.js
diff --git a/stix-modeler-app/src/definition-adapters/Relationship.js b/stix-modeler-app/src/definition-adapters/Relationship.js
new file mode 100644
index 0000000..80af112
--- /dev/null
+++ b/stix-modeler-app/src/definition-adapters/Relationship.js
@@ -0,0 +1,24 @@
+import deepmerge from 'deepmerge';
+import common from '../definitions/common.json';
+import rawDefinition from '../definitions/relationship.json';
+
+import { Base } from './Base';
+
+class Relationship extends Base {
+ constructor() {
+ const definition_extension = {
+ img: '',
+ prefix: 'relationship--',
+ active: false,
+ relationships: [],
+ };
+
+ const def = deepmerge(definition_extension, rawDefinition);
+
+ super(common, def);
+ }
+}
+
+const singleton = new Relationship();
+
+export default singleton;
diff --git a/app/src/definition-adapters/Report.js b/stix-modeler-app/src/definition-adapters/Report.js
similarity index 100%
rename from app/src/definition-adapters/Report.js
rename to stix-modeler-app/src/definition-adapters/Report.js
diff --git a/app/src/definition-adapters/Sighting.js b/stix-modeler-app/src/definition-adapters/Sighting.js
similarity index 100%
rename from app/src/definition-adapters/Sighting.js
rename to stix-modeler-app/src/definition-adapters/Sighting.js
diff --git a/app/src/definition-adapters/Software.js b/stix-modeler-app/src/definition-adapters/Software.js
similarity index 100%
rename from app/src/definition-adapters/Software.js
rename to stix-modeler-app/src/definition-adapters/Software.js
diff --git a/app/src/definition-adapters/ThreatActor.js b/stix-modeler-app/src/definition-adapters/ThreatActor.js
similarity index 100%
rename from app/src/definition-adapters/ThreatActor.js
rename to stix-modeler-app/src/definition-adapters/ThreatActor.js
diff --git a/app/src/definition-adapters/Tool.js b/stix-modeler-app/src/definition-adapters/Tool.js
similarity index 100%
rename from app/src/definition-adapters/Tool.js
rename to stix-modeler-app/src/definition-adapters/Tool.js
diff --git a/stix-modeler-app/src/definition-adapters/Unknown.js b/stix-modeler-app/src/definition-adapters/Unknown.js
new file mode 100644
index 0000000..6ec8a06
--- /dev/null
+++ b/stix-modeler-app/src/definition-adapters/Unknown.js
@@ -0,0 +1,27 @@
+import common from '../definitions/common.json';
+
+import { Base } from './Base';
+
+class Unknown extends Base {
+ constructor() {
+ const def = {
+ img: 'unknown.png',
+ type: 'object',
+ prefix: '',
+ active: true,
+ properties: {},
+ relationships: [
+ ],
+ };
+
+ super(common, def);
+
+ this.properties.type.enum = ['unknown'];
+ this.properties.type.value = 'unknown';
+
+ }
+}
+
+const singleton = new Unknown();
+
+export default singleton;
diff --git a/app/src/definition-adapters/Url.js b/stix-modeler-app/src/definition-adapters/Url.js
similarity index 92%
rename from app/src/definition-adapters/Url.js
rename to stix-modeler-app/src/definition-adapters/Url.js
index b07ac48..19fd326 100644
--- a/app/src/definition-adapters/Url.js
+++ b/stix-modeler-app/src/definition-adapters/Url.js
@@ -1,4 +1,3 @@
-import _cloneDeep from 'lodash/cloneDeep';
import deepmerge from 'deepmerge';
import common from '../definitions/observable-common.json';
import rawDefinition from '../definitions/url.json';
diff --git a/app/src/definition-adapters/UserAccount.js b/stix-modeler-app/src/definition-adapters/UserAccount.js
similarity index 100%
rename from app/src/definition-adapters/UserAccount.js
rename to stix-modeler-app/src/definition-adapters/UserAccount.js
diff --git a/app/src/definition-adapters/Vulnerability.js b/stix-modeler-app/src/definition-adapters/Vulnerability.js
similarity index 100%
rename from app/src/definition-adapters/Vulnerability.js
rename to stix-modeler-app/src/definition-adapters/Vulnerability.js
diff --git a/app/src/definition-adapters/WindowsRegistryKey.js b/stix-modeler-app/src/definition-adapters/WindowsRegistryKey.js
similarity index 100%
rename from app/src/definition-adapters/WindowsRegistryKey.js
rename to stix-modeler-app/src/definition-adapters/WindowsRegistryKey.js
diff --git a/app/src/definitions/artifact.json b/stix-modeler-app/src/definitions/artifact.json
similarity index 98%
rename from app/src/definitions/artifact.json
rename to stix-modeler-app/src/definitions/artifact.json
index 9076518..d215123 100644
--- a/app/src/definitions/artifact.json
+++ b/stix-modeler-app/src/definitions/artifact.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/artifact.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "artifact",
"description": "The Artifact Object permits capturing an array of bytes (8-bits), as a base64-encoded string string, or linking to a file-like payload.",
"type": "object",
diff --git a/app/src/definitions/attack-pattern.json b/stix-modeler-app/src/definitions/attack-pattern.json
similarity index 96%
rename from app/src/definitions/attack-pattern.json
rename to stix-modeler-app/src/definitions/attack-pattern.json
index 5fa1cda..e8bc659 100644
--- a/app/src/definitions/attack-pattern.json
+++ b/stix-modeler-app/src/definitions/attack-pattern.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/attack-pattern.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "attack-pattern",
"description": "Attack Patterns are a type of TTP that describe ways that adversaries attempt to compromise targets. ",
"type": "object",
diff --git a/app/src/definitions/autonomous-system.json b/stix-modeler-app/src/definitions/autonomous-system.json
similarity index 95%
rename from app/src/definitions/autonomous-system.json
rename to stix-modeler-app/src/definitions/autonomous-system.json
index fad576b..b138c2c 100644
--- a/app/src/definitions/autonomous-system.json
+++ b/stix-modeler-app/src/definitions/autonomous-system.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/autonomous-system.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "autonomous-system",
"description": "The AS object represents the properties of an Autonomous Systems (AS).",
"type": "object",
diff --git a/app/src/definitions/campaign.json b/stix-modeler-app/src/definitions/campaign.json
similarity index 96%
rename from app/src/definitions/campaign.json
rename to stix-modeler-app/src/definitions/campaign.json
index fe4576c..d5d652d 100644
--- a/app/src/definitions/campaign.json
+++ b/stix-modeler-app/src/definitions/campaign.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/campaign.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "campaign",
"description": "A Campaign is a grouping of adversary behavior that describes a set of malicious activities or attacks that occur over a period of time against a specific set of targets.",
"type": "object",
diff --git a/app/src/definitions/common.json b/stix-modeler-app/src/definitions/common.json
similarity index 80%
rename from app/src/definitions/common.json
rename to stix-modeler-app/src/definitions/common.json
index 74217d9..e898440 100644
--- a/app/src/definitions/common.json
+++ b/stix-modeler-app/src/definitions/common.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/common/core.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "core",
"description": "Common properties and behavior across all STIX Domain Objects and STIX Relationship Objects.",
"type": "object",
@@ -14,7 +14,6 @@
"description": "The type property identifies the type of STIX Object (SDO, Relationship Object, etc). The value of the type field MUST be one of the types defined by a STIX Object (e.g., indicator).",
"not": {
"enum": [
- "incident",
"action"
]
}
@@ -35,6 +34,14 @@
"$ref": "../common/identifier.json",
"description": "The ID of the Source object that describes who created this object."
},
+ "labels": {
+ "type": "array",
+ "description": "The labels property specifies a set of terms used to describe this object.",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ },
"created": {
"description": "The created property represents the time at which the first version of this object was created. The timstamp value MUST be precise to the nearest millisecond.",
"allOf": [
@@ -96,6 +103,22 @@
"$ref": "../common/granular-marking.json"
},
"minItems": 1
+ },
+ "extensions": {
+ "description": "Specifies any extensions of the object, as a dictionary.",
+ "type": "object",
+ "minProperties": 1,
+ "patternProperties": {
+ "^([a-z][a-z0-9]*)+(-[a-z0-9]+)*\\-ext$": {
+ "type": "object",
+ "minProperties": 1,
+ "allOf": [{ "$ref": "../common/properties.json" }]
+ },
+ "^extension-definition--[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$": {
+ "allOf": [{ "$ref": "../common/extension.json" }]
+ }
+ },
+ "additionalProperties": false
}
},
"allOf": [{ "$ref": "../common/properties.json" }],
@@ -113,7 +136,7 @@
},
{
"required": [
- "usernames"
+ "username"
]
},
{
diff --git a/app/src/definitions/course-of-action.json b/stix-modeler-app/src/definitions/course-of-action.json
similarity index 94%
rename from app/src/definitions/course-of-action.json
rename to stix-modeler-app/src/definitions/course-of-action.json
index 3217d3c..30bae88 100644
--- a/app/src/definitions/course-of-action.json
+++ b/stix-modeler-app/src/definitions/course-of-action.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/course-of-action.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "course-of-action",
"description": "A Course of Action is an action taken either to prevent an attack or to respond to an attack that is in progress. ",
"type": "object",
diff --git a/app/src/definitions/directory.json b/stix-modeler-app/src/definitions/directory.json
similarity index 96%
rename from app/src/definitions/directory.json
rename to stix-modeler-app/src/definitions/directory.json
index 136bc3b..e5c85c9 100644
--- a/app/src/definitions/directory.json
+++ b/stix-modeler-app/src/definitions/directory.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/directory.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "directory",
"description": "The Directory Object represents the properties common to a file system directory.",
"type": "object",
diff --git a/app/src/definitions/domain-name.json b/stix-modeler-app/src/definitions/domain-name.json
similarity index 95%
rename from app/src/definitions/domain-name.json
rename to stix-modeler-app/src/definitions/domain-name.json
index c8026ad..22804a5 100644
--- a/app/src/definitions/domain-name.json
+++ b/stix-modeler-app/src/definitions/domain-name.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/domain-name.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "domain-name",
"description": "The Domain Name represents the properties of a network domain name.",
"type": "object",
diff --git a/app/src/definitions/email-addr.json b/stix-modeler-app/src/definitions/email-addr.json
similarity index 95%
rename from app/src/definitions/email-addr.json
rename to stix-modeler-app/src/definitions/email-addr.json
index 1583c8f..c3894d2 100644
--- a/app/src/definitions/email-addr.json
+++ b/stix-modeler-app/src/definitions/email-addr.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/email-addr.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "email-addr",
"description": "The Email Address Object represents a single email address.",
"type": "object",
diff --git a/app/src/definitions/email-message.json b/stix-modeler-app/src/definitions/email-message.json
similarity index 99%
rename from app/src/definitions/email-message.json
rename to stix-modeler-app/src/definitions/email-message.json
index 0658e99..b00d958 100644
--- a/app/src/definitions/email-message.json
+++ b/stix-modeler-app/src/definitions/email-message.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/email-message.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "email-message",
"description": "The Email Message Object represents an instance of an email message.",
"type": "object",
diff --git a/app/src/definitions/extension-definition.json b/stix-modeler-app/src/definitions/extension-definition.json
similarity index 100%
rename from app/src/definitions/extension-definition.json
rename to stix-modeler-app/src/definitions/extension-definition.json
diff --git a/app/src/definitions/extension.json b/stix-modeler-app/src/definitions/extension.json
similarity index 100%
rename from app/src/definitions/extension.json
rename to stix-modeler-app/src/definitions/extension.json
diff --git a/app/src/definitions/file.json b/stix-modeler-app/src/definitions/file.json
similarity index 99%
rename from app/src/definitions/file.json
rename to stix-modeler-app/src/definitions/file.json
index 4cb7f75..b7af12e 100644
--- a/app/src/definitions/file.json
+++ b/stix-modeler-app/src/definitions/file.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/file.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "file",
"description": "The File Object represents the properties of a file.",
"type": "object",
diff --git a/app/src/definitions/grouping.json b/stix-modeler-app/src/definitions/grouping.json
similarity index 96%
rename from app/src/definitions/grouping.json
rename to stix-modeler-app/src/definitions/grouping.json
index 3985214..1aae14f 100644
--- a/app/src/definitions/grouping.json
+++ b/stix-modeler-app/src/definitions/grouping.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/grouping.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "grouping",
"description": "A Grouping object explicitly asserts that the referenced STIX Objects have a shared content.",
"type": "object",
diff --git a/app/src/definitions/identity.json b/stix-modeler-app/src/definitions/identity.json
similarity index 98%
rename from app/src/definitions/identity.json
rename to stix-modeler-app/src/definitions/identity.json
index b73afc3..1da402f 100644
--- a/app/src/definitions/identity.json
+++ b/stix-modeler-app/src/definitions/identity.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/identity.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "identity",
"description": "Identities can represent actual individuals, organizations, or groups (e.g., ACME, Inc.) as well as classes of individuals, organizations, or groups.",
"type": "object",
diff --git a/stix-modeler-app/src/definitions/incident.json b/stix-modeler-app/src/definitions/incident.json
new file mode 100644
index 0000000..08805f4
--- /dev/null
+++ b/stix-modeler-app/src/definitions/incident.json
@@ -0,0 +1,38 @@
+{
+ "$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/incident.json",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "title": "incident",
+ "description": "The Incident object in STIX 2.1 is a stub, to be expanded in future STIX 2 releases.",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "../common/core.json"
+ },
+ {
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "The type of this object, which MUST be the literal `incident`.",
+ "enum": [
+ "incident"
+ ]
+ },
+ "id": {
+ "title": "id",
+ "pattern": "^incident--"
+ },
+ "name": {
+ "type": "string",
+ "description": "The name used to identify the Incident."
+ },
+ "description": {
+ "type": "string",
+ "description": "A description that provides more details and context about the Incident."
+ }
+ }
+ }
+ ],
+ "required": [
+ "name"
+ ]
+}
diff --git a/app/src/definitions/indicator.json b/stix-modeler-app/src/definitions/indicator.json
similarity index 97%
rename from app/src/definitions/indicator.json
rename to stix-modeler-app/src/definitions/indicator.json
index e2db857..a19a60f 100644
--- a/app/src/definitions/indicator.json
+++ b/stix-modeler-app/src/definitions/indicator.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/indicator.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "indicator",
"description": "Indicators contain a pattern that can be used to detect suspicious or malicious cyber activity.",
"type": "object",
diff --git a/app/src/definitions/infrastructure.json b/stix-modeler-app/src/definitions/infrastructure.json
similarity index 97%
rename from app/src/definitions/infrastructure.json
rename to stix-modeler-app/src/definitions/infrastructure.json
index 1495971..7f06973 100644
--- a/app/src/definitions/infrastructure.json
+++ b/stix-modeler-app/src/definitions/infrastructure.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/infrastructure.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "infrastructure",
"description": "Infrastructure objects describe systems, software services, and associated physical or virtual resources.",
"type": "object",
diff --git a/app/src/definitions/intrusion-set.json b/stix-modeler-app/src/definitions/intrusion-set.json
similarity index 98%
rename from app/src/definitions/intrusion-set.json
rename to stix-modeler-app/src/definitions/intrusion-set.json
index af1a335..db99276 100644
--- a/app/src/definitions/intrusion-set.json
+++ b/stix-modeler-app/src/definitions/intrusion-set.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/intrusion-set.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "intrusion-set",
"description": "An Intrusion Set is a grouped set of adversary behavior and resources with common properties that is believed to be orchestrated by a single organization.",
"type": "object",
diff --git a/app/src/definitions/ipv4-addr.json b/stix-modeler-app/src/definitions/ipv4-addr.json
similarity index 96%
rename from app/src/definitions/ipv4-addr.json
rename to stix-modeler-app/src/definitions/ipv4-addr.json
index c5e5162..4c4e983 100644
--- a/app/src/definitions/ipv4-addr.json
+++ b/stix-modeler-app/src/definitions/ipv4-addr.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/ipv4-addr.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "ipv4-addr",
"description": "The IPv4 Address Object represents one or more IPv4 addresses expressed using CIDR notation.",
"type": "object",
diff --git a/app/src/definitions/ipv6-addr.json b/stix-modeler-app/src/definitions/ipv6-addr.json
similarity index 97%
rename from app/src/definitions/ipv6-addr.json
rename to stix-modeler-app/src/definitions/ipv6-addr.json
index 11b2aa3..e79dc36 100644
--- a/app/src/definitions/ipv6-addr.json
+++ b/stix-modeler-app/src/definitions/ipv6-addr.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/ipv6-addr.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "ipv6-addr",
"description": "The IPv6 Address Object represents one or more IPv6 addresses expressed using CIDR notation.",
"type": "object",
diff --git a/app/src/definitions/location.json b/stix-modeler-app/src/definitions/location.json
similarity index 98%
rename from app/src/definitions/location.json
rename to stix-modeler-app/src/definitions/location.json
index 68bba68..7675dc1 100644
--- a/app/src/definitions/location.json
+++ b/stix-modeler-app/src/definitions/location.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/location.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "location",
"description": "A Location represents a geographic location. The location may be described as any, some or all of the following: region (e.g., North America), civic address (e.g. New York, US), latitude and longitude.",
"type": "object",
diff --git a/app/src/definitions/mac-addr.json b/stix-modeler-app/src/definitions/mac-addr.json
similarity index 93%
rename from app/src/definitions/mac-addr.json
rename to stix-modeler-app/src/definitions/mac-addr.json
index 2f84b8e..eb12e87 100644
--- a/app/src/definitions/mac-addr.json
+++ b/stix-modeler-app/src/definitions/mac-addr.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/mac-addr.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "mac-addr",
"description": "The MAC Address Object represents a single Media Access Control (MAC) address.",
"type": "object",
diff --git a/app/src/definitions/malware-analysis.json b/stix-modeler-app/src/definitions/malware-analysis.json
similarity index 98%
rename from app/src/definitions/malware-analysis.json
rename to stix-modeler-app/src/definitions/malware-analysis.json
index 4e48489..90ead7b 100644
--- a/app/src/definitions/malware-analysis.json
+++ b/stix-modeler-app/src/definitions/malware-analysis.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/malware-analysis.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "malware-analysis",
"description": "Malware Analysis captures the metadata and results of a particular analysis performed (static or dynamic) on the malware instance or family.",
"type": "object",
diff --git a/app/src/definitions/malware.json b/stix-modeler-app/src/definitions/malware.json
similarity index 99%
rename from app/src/definitions/malware.json
rename to stix-modeler-app/src/definitions/malware.json
index 5ac094b..d4267b5 100644
--- a/app/src/definitions/malware.json
+++ b/stix-modeler-app/src/definitions/malware.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/malware.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "malware",
"description": "Malware is a type of TTP that is also known as malicious code and malicious software, refers to a program that is inserted into a system, usually covertly, with the intent of compromising the confidentiality, integrity, or availability of the victim's data, applications, or operating system (OS) or of otherwise annoying or disrupting the victim.",
"type": "object",
diff --git a/app/src/definitions/marking-definition.json b/stix-modeler-app/src/definitions/marking-definition.json
similarity index 100%
rename from app/src/definitions/marking-definition.json
rename to stix-modeler-app/src/definitions/marking-definition.json
diff --git a/app/src/definitions/mutex.json b/stix-modeler-app/src/definitions/mutex.json
similarity index 92%
rename from app/src/definitions/mutex.json
rename to stix-modeler-app/src/definitions/mutex.json
index 8415c4d..ab3c725 100644
--- a/app/src/definitions/mutex.json
+++ b/stix-modeler-app/src/definitions/mutex.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/mutex.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "mutex",
"description": "The Mutex Object represents the properties of a mutual exclusion (mutex) object.",
"type": "object",
diff --git a/app/src/definitions/network-traffic.json b/stix-modeler-app/src/definitions/network-traffic.json
similarity index 97%
rename from app/src/definitions/network-traffic.json
rename to stix-modeler-app/src/definitions/network-traffic.json
index e5cbc54..0b70d7d 100644
--- a/app/src/definitions/network-traffic.json
+++ b/stix-modeler-app/src/definitions/network-traffic.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/network-traffic.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "network-traffic",
"description": "The Network Traffic Object represents arbitrary network traffic that originates from a source and is addressed to a destination.",
"type": "object",
@@ -78,6 +78,7 @@
"description": "Specifies the number of packets sent destination to the source."
},
"ipfix": {
+ "description": "Specifies any IP Flow Information Export (IPFIX) data for the traffic.",
"allOf": [{ "$ref": "../common/dictionary.json" }],
"patternProperties": {
"^[a-zA-Z0-9_-]{0,250}$": {
@@ -197,7 +198,10 @@
"description": "Specifies all of the HTTP header fields that may be found in the HTTP client request, as a dictionary.",
"patternProperties": {
"^.+$": {
- "type": "string"
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
}
},
"additionalProperties": false
diff --git a/app/src/definitions/note.json b/stix-modeler-app/src/definitions/note.json
similarity index 95%
rename from app/src/definitions/note.json
rename to stix-modeler-app/src/definitions/note.json
index 0ac9d2e..12490b6 100644
--- a/app/src/definitions/note.json
+++ b/stix-modeler-app/src/definitions/note.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/note.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "note",
"description": "A Note is a comment or note containing informative text to help explain the context of one or more STIX Objects (SDOs or SROs) or to provide additional analysis that is not contained in the original object.",
"type": "object",
@@ -49,6 +49,7 @@
}
],
"required": [
+ "content",
"object_refs"
]
}
diff --git a/app/src/definitions/observable-common.json b/stix-modeler-app/src/definitions/observable-common.json
similarity index 77%
rename from app/src/definitions/observable-common.json
rename to stix-modeler-app/src/definitions/observable-common.json
index 8ffb200..4114b94 100644
--- a/app/src/definitions/observable-common.json
+++ b/stix-modeler-app/src/definitions/observable-common.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/common/cyber-observable-core.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "cyber-observable-core",
"description": "Common properties and behavior across all Cyber Observable Objects.",
"type": "object",
@@ -40,7 +40,7 @@
},
"minItems": 1
},
- "is_defanged" : {
+ "defanged" : {
"type" : "boolean",
"description": "Defines whether or not the data contained within the object has been defanged."
},
@@ -57,12 +57,39 @@
"type": "object",
"minProperties": 1,
"allOf": [{ "$ref": "../common/properties.json" }]
+ },
+ "^extension-definition--[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$": {
+ "allOf": [{ "$ref": "../common/extension.json" }]
}
},
- "addtionalProperties": false
+ "additionalProperties": false
}
},
"allOf": [{ "$ref": "../common/properties.json" }],
+ "not": {
+ "anyOf": [
+ {
+ "required": [
+ "severity"
+ ]
+ },
+ {
+ "required": [
+ "action"
+ ]
+ },
+ {
+ "required": [
+ "username"
+ ]
+ },
+ {
+ "required": [
+ "phone_numbers"
+ ]
+ }
+ ]
+ },
"required": [
"type",
"id"
diff --git a/app/src/definitions/observed-data.json b/stix-modeler-app/src/definitions/observed-data.json
similarity index 83%
rename from app/src/definitions/observed-data.json
rename to stix-modeler-app/src/definitions/observed-data.json
index df54fc4..9f9ce0e 100644
--- a/app/src/definitions/observed-data.json
+++ b/stix-modeler-app/src/definitions/observed-data.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/observed-data.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "observed-data",
"description": "Observed data conveys information that was observed on systems and networks, such as log data or network traffic, using the Cyber Observable specification.",
"type": "object",
@@ -123,7 +123,24 @@
"type": "array",
"description": "A list of SCOs and SROs representing the observation.",
"items": {
- "$ref": "../common/identifier.json"
+ "type" : "string",
+ "anyOf": [
+ {
+ "allOf": [
+ {
+ "$ref": "../common/identifier.json"
+ },
+ {
+ "not": {
+ "pattern": "^(attack-pattern|campaign|course-of-action|grouping|identity|incident|indicator|infrastructure|intrusion-set|location|malware-analysis|malware|note|observed-data|opinion|report|threat-actor|tool|vulnerability)"
+ }
+ }
+ ]
+ },
+ {
+ "pattern": "^(autonomous-system--|directory--|domain-name--|email-addr--|email-message--|file--|ipv4-addr--|ipv6-addr--|mac-addr--|mutex--|network-traffic--|process--|software--|url--|user-account--|windows-registry-key--|x509-certificate--|relationship--|sighting--)"
+ }
+ ]
},
"minItems": 1
}
@@ -147,4 +164,4 @@
]
}
]
-}
+}
\ No newline at end of file
diff --git a/app/src/definitions/opinion.json b/stix-modeler-app/src/definitions/opinion.json
similarity index 96%
rename from app/src/definitions/opinion.json
rename to stix-modeler-app/src/definitions/opinion.json
index bd50e0b..a28aaa4 100644
--- a/app/src/definitions/opinion.json
+++ b/stix-modeler-app/src/definitions/opinion.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/opinion.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "opinion",
"description": "An Opinion is an assessment of the correctness of the information in a STIX Object produced by a different entity and captures the level of agreement or disagreement using a fixed scale.",
"type": "object",
diff --git a/app/src/definitions/process.json b/stix-modeler-app/src/definitions/process.json
similarity index 99%
rename from app/src/definitions/process.json
rename to stix-modeler-app/src/definitions/process.json
index 4c70aac..215d0e7 100644
--- a/app/src/definitions/process.json
+++ b/stix-modeler-app/src/definitions/process.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/process.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "process",
"description": "The Process Object represents common properties of an instance of a computer program as executed on an operating system.",
"type": "object",
@@ -33,7 +33,7 @@
"type": "integer",
"description": "Specifies the Process ID, or PID, of the process."
},
- "created": {
+ "created_time": {
"$ref": "../common/timestamp.json",
"description": "Specifies the date/time at which the process was created."
},
diff --git a/stix-modeler-app/src/definitions/relationship.json b/stix-modeler-app/src/definitions/relationship.json
new file mode 100644
index 0000000..2957c5a
--- /dev/null
+++ b/stix-modeler-app/src/definitions/relationship.json
@@ -0,0 +1,76 @@
+{
+ "$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sros/relationship.json",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "title": "relationship",
+ "description": "The Relationship object is used to link together two SDOs in order to describe how they are related to each other.",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "../common/core.json"
+ },
+ {
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "The type of this object, which MUST be the literal `relationship`.",
+ "enum": [
+ "relationship"
+ ]
+ },
+ "id": {
+ "title": "id",
+ "pattern": "^relationship--"
+ },
+ "relationship_type": {
+ "title": "relationship_type",
+ "type": "string",
+ "description": "The name used to identify the type of relationship.",
+ "pattern": "^[a-z0-9\\-]+$"
+ },
+ "description": {
+ "type": "string",
+ "description": "A description that helps provide context about the relationship."
+ },
+ "source_ref": {
+ "description": "The ID of the source (from) object.",
+ "allOf": [
+ {
+ "$ref": "../common/identifier.json"
+ },
+ {
+ "not": {
+ "pattern": "^(relationship|sighting|bundle|marking-definition|language-content)--.+$"
+ }
+ }
+ ]
+ },
+ "target_ref": {
+ "description": "The ID of the target (to) object.",
+ "allOf": [
+ {
+ "$ref": "../common/identifier.json"
+ },
+ {
+ "not": {
+ "pattern": "^(relationship|sighting|bundle|marking-definition|language-content)--.+$"
+ }
+ }
+ ]
+ },
+ "start_time": {
+ "$ref": "../common/timestamp.json",
+ "description": "This optional timestamp represents the earliest time at which the Relationship between the objects exists. If this property is a future timestamp, at the time the updated property is defined, then this represents an estimate by the producer of the intelligence of the earliest time at which relationship will be asserted to be true."
+ },
+ "stop_time": {
+ "$ref": "../common/timestamp.json",
+ "description": "The latest time at which the Relationship between the objects exists. If this property is a future timestamp, at the time the updated property is defined, then this represents an estimate by the producer of the intelligence of the latest time at which relationship will be asserted to be true."
+ }
+ }
+ }
+ ],
+ "required": [
+ "relationship_type",
+ "source_ref",
+ "target_ref"
+ ]
+}
diff --git a/app/src/definitions/report.json b/stix-modeler-app/src/definitions/report.json
similarity index 97%
rename from app/src/definitions/report.json
rename to stix-modeler-app/src/definitions/report.json
index 943939a..448d97f 100644
--- a/app/src/definitions/report.json
+++ b/stix-modeler-app/src/definitions/report.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/report.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "report",
"description": "Reports are collections of threat intelligence focused on one or more topics, such as a description of a threat actor, malware, or attack technique, including context and related details.",
"type": "object",
diff --git a/app/src/definitions/sighting.json b/stix-modeler-app/src/definitions/sighting.json
similarity index 98%
rename from app/src/definitions/sighting.json
rename to stix-modeler-app/src/definitions/sighting.json
index 79e1908..c3ee579 100644
--- a/app/src/definitions/sighting.json
+++ b/stix-modeler-app/src/definitions/sighting.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sros/sighting.json",
- "$schema": "http://json-schema.org/draft-07/schema",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "sighting",
"description": "A Sighting denotes the belief that something in CTI (e.g., an indicator, malware, tool, threat actor, etc.) was seen.",
"type": "object",
diff --git a/app/src/definitions/software.json b/stix-modeler-app/src/definitions/software.json
similarity index 97%
rename from app/src/definitions/software.json
rename to stix-modeler-app/src/definitions/software.json
index a40b228..636cbcb 100644
--- a/app/src/definitions/software.json
+++ b/stix-modeler-app/src/definitions/software.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/software.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "software",
"description": "The Software Object represents high-level properties associated with software, including software products.",
"type": "object",
diff --git a/app/src/definitions/threat-actor.json b/stix-modeler-app/src/definitions/threat-actor.json
similarity index 98%
rename from app/src/definitions/threat-actor.json
rename to stix-modeler-app/src/definitions/threat-actor.json
index 2390715..fc9bd87 100644
--- a/app/src/definitions/threat-actor.json
+++ b/stix-modeler-app/src/definitions/threat-actor.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/threat-actor.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "threat-actor",
"description": "Threat Actors are actual individuals, groups, or organizations believed to be operating with malicious intent.",
"type": "object",
diff --git a/app/src/definitions/tool.json b/stix-modeler-app/src/definitions/tool.json
similarity index 97%
rename from app/src/definitions/tool.json
rename to stix-modeler-app/src/definitions/tool.json
index daa65dd..cc47dee 100644
--- a/app/src/definitions/tool.json
+++ b/stix-modeler-app/src/definitions/tool.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/tool.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "tool",
"description": "Tools are legitimate software that can be used by threat actors to perform attacks.",
"type": "object",
diff --git a/app/src/definitions/url.json b/stix-modeler-app/src/definitions/url.json
similarity index 92%
rename from app/src/definitions/url.json
rename to stix-modeler-app/src/definitions/url.json
index 3493482..a26e870 100644
--- a/app/src/definitions/url.json
+++ b/stix-modeler-app/src/definitions/url.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/url.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "url",
"description": "The URL Object represents the properties of a uniform resource locator (URL).",
"type": "object",
diff --git a/app/src/definitions/user-account.json b/stix-modeler-app/src/definitions/user-account.json
similarity index 99%
rename from app/src/definitions/user-account.json
rename to stix-modeler-app/src/definitions/user-account.json
index b2cb1e7..a66e42a 100644
--- a/app/src/definitions/user-account.json
+++ b/stix-modeler-app/src/definitions/user-account.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/user-account.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "user-account",
"description": "The User Account Object represents an instance of any type of user account, including but not limited to operating system, device, messaging service, and social media platform accounts.",
"type": "object",
diff --git a/app/src/definitions/vulnerability.json b/stix-modeler-app/src/definitions/vulnerability.json
similarity index 94%
rename from app/src/definitions/vulnerability.json
rename to stix-modeler-app/src/definitions/vulnerability.json
index 3845452..40838e8 100644
--- a/app/src/definitions/vulnerability.json
+++ b/stix-modeler-app/src/definitions/vulnerability.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sdos/vulnerability.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "vulnerability",
"description": "A Vulnerability is a mistake in software that can be directly used by a hacker to gain access to a system or network.",
"type": "object",
diff --git a/app/src/definitions/windows-registry-key.json b/stix-modeler-app/src/definitions/windows-registry-key.json
similarity index 90%
rename from app/src/definitions/windows-registry-key.json
rename to stix-modeler-app/src/definitions/windows-registry-key.json
index dacfe39..a6a891b 100644
--- a/app/src/definitions/windows-registry-key.json
+++ b/stix-modeler-app/src/definitions/windows-registry-key.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/windows-registry-key.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "windows-registry-key",
"description": "The Registry Key Object represents the properties of a Windows registry key.",
"type": "object",
@@ -23,7 +23,7 @@
},
"key": {
"type": "string",
- "pattern": "^HKEY_LOCAL_MACHINE|hkey_local_machine|HKEY_CURRENT_USER|hkey_current_user|HKEY_CLASSES_ROOT|hkey_classes_root|HKEY_CURRENT_CONFIG|hkey_current_config|HKEY_PERFORMANCE_DATA|hkey_performance_data|HKEY_USERS|hkey_users|HKEY_DYN_DATA|hkey_dyn_data",
+ "not": {"pattern": "^HKLM|HKCC|HKCR|HKCU|HKU|hklm|hkcc|hkcr|hkcu|hku"},
"description": "Specifies the full registry key including the hive."
},
"values": {
diff --git a/app/src/definitions/x509-certificate.json b/stix-modeler-app/src/definitions/x509-certificate.json
similarity index 99%
rename from app/src/definitions/x509-certificate.json
rename to stix-modeler-app/src/definitions/x509-certificate.json
index 1eda586..0ca0284 100644
--- a/app/src/definitions/x509-certificate.json
+++ b/stix-modeler-app/src/definitions/x509-certificate.json
@@ -1,6 +1,6 @@
{
"$id": "http://raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/observables/x509-certificate.json",
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "x509-certificate",
"description": "The X509 Certificate Object represents the properties of an X.509 certificate.",
"type": "object",
diff --git a/app/src/imgs/Images.js b/stix-modeler-app/src/imgs/Images.js
similarity index 100%
rename from app/src/imgs/Images.js
rename to stix-modeler-app/src/imgs/Images.js
diff --git a/app/src/imgs/add.png b/stix-modeler-app/src/imgs/add.png
similarity index 100%
rename from app/src/imgs/add.png
rename to stix-modeler-app/src/imgs/add.png
diff --git a/stix-modeler-app/src/imgs/align_bottom.png b/stix-modeler-app/src/imgs/align_bottom.png
new file mode 100644
index 0000000..9900051
Binary files /dev/null and b/stix-modeler-app/src/imgs/align_bottom.png differ
diff --git a/stix-modeler-app/src/imgs/align_horizontal.png b/stix-modeler-app/src/imgs/align_horizontal.png
new file mode 100644
index 0000000..656f9af
Binary files /dev/null and b/stix-modeler-app/src/imgs/align_horizontal.png differ
diff --git a/stix-modeler-app/src/imgs/align_left.png b/stix-modeler-app/src/imgs/align_left.png
new file mode 100644
index 0000000..47f8ed0
Binary files /dev/null and b/stix-modeler-app/src/imgs/align_left.png differ
diff --git a/stix-modeler-app/src/imgs/align_right.png b/stix-modeler-app/src/imgs/align_right.png
new file mode 100644
index 0000000..2e4313f
Binary files /dev/null and b/stix-modeler-app/src/imgs/align_right.png differ
diff --git a/stix-modeler-app/src/imgs/align_top.png b/stix-modeler-app/src/imgs/align_top.png
new file mode 100644
index 0000000..96e4fd8
Binary files /dev/null and b/stix-modeler-app/src/imgs/align_top.png differ
diff --git a/stix-modeler-app/src/imgs/align_vertical.png b/stix-modeler-app/src/imgs/align_vertical.png
new file mode 100644
index 0000000..3fb5af1
Binary files /dev/null and b/stix-modeler-app/src/imgs/align_vertical.png differ
diff --git a/app/src/imgs/attack-pattern.png b/stix-modeler-app/src/imgs/attack-pattern.png
similarity index 100%
rename from app/src/imgs/attack-pattern.png
rename to stix-modeler-app/src/imgs/attack-pattern.png
diff --git a/stix-modeler-app/src/imgs/base.png b/stix-modeler-app/src/imgs/base.png
new file mode 100644
index 0000000..167798c
Binary files /dev/null and b/stix-modeler-app/src/imgs/base.png differ
diff --git a/app/src/imgs/campaign.png b/stix-modeler-app/src/imgs/campaign.png
similarity index 100%
rename from app/src/imgs/campaign.png
rename to stix-modeler-app/src/imgs/campaign.png
diff --git a/app/src/imgs/course-of-action.png b/stix-modeler-app/src/imgs/course-of-action.png
similarity index 100%
rename from app/src/imgs/course-of-action.png
rename to stix-modeler-app/src/imgs/course-of-action.png
diff --git a/stix-modeler-app/src/imgs/custom.png b/stix-modeler-app/src/imgs/custom.png
new file mode 100644
index 0000000..0b6510f
Binary files /dev/null and b/stix-modeler-app/src/imgs/custom.png differ
diff --git a/stix-modeler-app/src/imgs/distribute_horizontal.png b/stix-modeler-app/src/imgs/distribute_horizontal.png
new file mode 100644
index 0000000..eec668e
Binary files /dev/null and b/stix-modeler-app/src/imgs/distribute_horizontal.png differ
diff --git a/stix-modeler-app/src/imgs/distribute_vertical.png b/stix-modeler-app/src/imgs/distribute_vertical.png
new file mode 100644
index 0000000..831d18a
Binary files /dev/null and b/stix-modeler-app/src/imgs/distribute_vertical.png differ
diff --git a/app/src/imgs/grouping.png b/stix-modeler-app/src/imgs/grouping.png
similarity index 100%
rename from app/src/imgs/grouping.png
rename to stix-modeler-app/src/imgs/grouping.png
diff --git a/app/src/imgs/identity.png b/stix-modeler-app/src/imgs/identity.png
similarity index 100%
rename from app/src/imgs/identity.png
rename to stix-modeler-app/src/imgs/identity.png
diff --git a/app/src/imgs/indicator.png b/stix-modeler-app/src/imgs/indicator.png
similarity index 100%
rename from app/src/imgs/indicator.png
rename to stix-modeler-app/src/imgs/indicator.png
diff --git a/app/src/imgs/infrastructure.png b/stix-modeler-app/src/imgs/infrastructure.png
similarity index 100%
rename from app/src/imgs/infrastructure.png
rename to stix-modeler-app/src/imgs/infrastructure.png
diff --git a/app/src/imgs/intrusion-set.png b/stix-modeler-app/src/imgs/intrusion-set.png
similarity index 100%
rename from app/src/imgs/intrusion-set.png
rename to stix-modeler-app/src/imgs/intrusion-set.png
diff --git a/app/src/imgs/location.png b/stix-modeler-app/src/imgs/location.png
similarity index 100%
rename from app/src/imgs/location.png
rename to stix-modeler-app/src/imgs/location.png
diff --git a/app/src/imgs/malware-analysis.png b/stix-modeler-app/src/imgs/malware-analysis.png
similarity index 100%
rename from app/src/imgs/malware-analysis.png
rename to stix-modeler-app/src/imgs/malware-analysis.png
diff --git a/app/src/imgs/malware.png b/stix-modeler-app/src/imgs/malware.png
similarity index 100%
rename from app/src/imgs/malware.png
rename to stix-modeler-app/src/imgs/malware.png
diff --git a/app/src/imgs/note.png b/stix-modeler-app/src/imgs/note.png
similarity index 100%
rename from app/src/imgs/note.png
rename to stix-modeler-app/src/imgs/note.png
diff --git a/app/src/imgs/observable.png b/stix-modeler-app/src/imgs/observable.png
similarity index 100%
rename from app/src/imgs/observable.png
rename to stix-modeler-app/src/imgs/observable.png
diff --git a/app/src/imgs/observed-data.png b/stix-modeler-app/src/imgs/observed-data.png
similarity index 100%
rename from app/src/imgs/observed-data.png
rename to stix-modeler-app/src/imgs/observed-data.png
diff --git a/app/src/imgs/opinion.png b/stix-modeler-app/src/imgs/opinion.png
similarity index 100%
rename from app/src/imgs/opinion.png
rename to stix-modeler-app/src/imgs/opinion.png
diff --git a/app/src/imgs/playbook.png b/stix-modeler-app/src/imgs/playbook.png
similarity index 100%
rename from app/src/imgs/playbook.png
rename to stix-modeler-app/src/imgs/playbook.png
diff --git a/app/src/imgs/relationship.png b/stix-modeler-app/src/imgs/relationship.png
similarity index 100%
rename from app/src/imgs/relationship.png
rename to stix-modeler-app/src/imgs/relationship.png
diff --git a/app/src/imgs/report.png b/stix-modeler-app/src/imgs/report.png
similarity index 100%
rename from app/src/imgs/report.png
rename to stix-modeler-app/src/imgs/report.png
diff --git a/app/src/imgs/restricted-marking.png b/stix-modeler-app/src/imgs/restricted-marking.png
similarity index 100%
rename from app/src/imgs/restricted-marking.png
rename to stix-modeler-app/src/imgs/restricted-marking.png
diff --git a/app/src/imgs/sighting.png b/stix-modeler-app/src/imgs/sighting.png
similarity index 100%
rename from app/src/imgs/sighting.png
rename to stix-modeler-app/src/imgs/sighting.png
diff --git a/app/src/imgs/threat-actor.png b/stix-modeler-app/src/imgs/threat-actor.png
similarity index 100%
rename from app/src/imgs/threat-actor.png
rename to stix-modeler-app/src/imgs/threat-actor.png
diff --git a/app/src/imgs/tlp-amber.png b/stix-modeler-app/src/imgs/tlp-amber.png
similarity index 100%
rename from app/src/imgs/tlp-amber.png
rename to stix-modeler-app/src/imgs/tlp-amber.png
diff --git a/app/src/imgs/tlp-green.png b/stix-modeler-app/src/imgs/tlp-green.png
similarity index 100%
rename from app/src/imgs/tlp-green.png
rename to stix-modeler-app/src/imgs/tlp-green.png
diff --git a/app/src/imgs/tlp-red.png b/stix-modeler-app/src/imgs/tlp-red.png
similarity index 100%
rename from app/src/imgs/tlp-red.png
rename to stix-modeler-app/src/imgs/tlp-red.png
diff --git a/app/src/imgs/tlp-white.png b/stix-modeler-app/src/imgs/tlp-white.png
similarity index 100%
rename from app/src/imgs/tlp-white.png
rename to stix-modeler-app/src/imgs/tlp-white.png
diff --git a/app/src/imgs/tool.png b/stix-modeler-app/src/imgs/tool.png
similarity index 100%
rename from app/src/imgs/tool.png
rename to stix-modeler-app/src/imgs/tool.png
diff --git a/stix-modeler-app/src/imgs/unknown.png b/stix-modeler-app/src/imgs/unknown.png
new file mode 100644
index 0000000..f7f7888
Binary files /dev/null and b/stix-modeler-app/src/imgs/unknown.png differ
diff --git a/app/src/imgs/vulnerability.png b/stix-modeler-app/src/imgs/vulnerability.png
similarity index 100%
rename from app/src/imgs/vulnerability.png
rename to stix-modeler-app/src/imgs/vulnerability.png
diff --git a/app/src/index.scss b/stix-modeler-app/src/index.scss
similarity index 100%
rename from app/src/index.scss
rename to stix-modeler-app/src/index.scss
diff --git a/app/src/main.jsx b/stix-modeler-app/src/main.jsx
similarity index 100%
rename from app/src/main.jsx
rename to stix-modeler-app/src/main.jsx
diff --git a/stix-modeler-app/src/stores/App.js b/stix-modeler-app/src/stores/App.js
new file mode 100644
index 0000000..a06592d
--- /dev/null
+++ b/stix-modeler-app/src/stores/App.js
@@ -0,0 +1,2389 @@
+import { makeAutoObservable, toJS } from "mobx";
+import _cloneDeep from "lodash/cloneDeep";
+import _merge from "lodash/merge";
+import moment from "moment";
+import { v4 as uuidv4 } from "uuid";
+import Proxy from "./Proxy";
+
+import ap from "../definition-adapters/AttackPattern.js";
+import indicator from "../definition-adapters/Indicator.js";
+import malware from "../definition-adapters/Malware.js";
+import ma from "../definition-adapters/MalwareAnalysis.js";
+import sighting from "../definition-adapters/Sighting.js";
+import coa from "../definition-adapters/CourseOfAction.js";
+import campaign from "../definition-adapters/Campaign.js";
+import od from "../definition-adapters/ObservedData.js";
+import identity from "../definition-adapters/Identity.js";
+import tool from "../definition-adapters/Tool.js";
+import report from "../definition-adapters/Report.js";
+import vuln from "../definition-adapters/Vulnerability.js";
+import grouping from "../definition-adapters/Grouping.js";
+import infra from "../definition-adapters/Infrastructure.js";
+import is from "../definition-adapters/IntrusionSet.js";
+import location from "../definition-adapters/Location.js";
+import ta from "../definition-adapters/ThreatActor.js";
+import note from "../definition-adapters/Note.js";
+import opinion from "../definition-adapters/Opinion.js";
+import tlpred from "../definition-adapters/MarkingDefinitionRed.js";
+import tlpamber from "../definition-adapters/MarkingDefinitionAmber.js";
+import tlpgreen from "../definition-adapters/MarkingDefinitionGreen.js";
+import tlpwhite from "../definition-adapters/MarkingDefinitionWhite.js";
+import md from "../definition-adapters/MarkingDefinitionStatement.js";
+
+import obs from "../definition-adapters/Observable.js";
+import artifact from "../definition-adapters/Artifact.js";
+import software from "../definition-adapters/Software.js";
+import ipv4 from "../definition-adapters/IPv4Addr.js";
+import ipv6 from "../definition-adapters/IPv6Addr.js";
+import autosys from "../definition-adapters/AutonomousSystem.js";
+import dir from "../definition-adapters/Directory.js";
+import domain from "../definition-adapters/DomainName.js";
+import emailaddr from "../definition-adapters/EmailAddr.js";
+import emailmsg from "../definition-adapters/EmailMessage.js";
+import file from "../definition-adapters/File.js";
+import mac from "../definition-adapters/MacAddr.js";
+import mutex from "../definition-adapters/Mutex.js";
+import network from "../definition-adapters/NetworkTraffic.js";
+import process from "../definition-adapters/Process.js";
+import url from "../definition-adapters/Url.js";
+import ua from "../definition-adapters/UserAccount.js";
+import winregkey from "../definition-adapters/WindowsRegistryKey.js";
+import cert from "../definition-adapters/Certificate.js";
+
+import sro from "../definition-adapters/Relationship.js";
+
+import extDef from "../definition-adapters/ExtensionDefinition.js";
+import custom from "../definition-adapters/Custom.js";
+import unknown from "../definition-adapters/Unknown.js";
+
+import * as Config from "../util/Config.js";
+
+const SPEC_VERSION = "2.1";
+
+export default class App {
+ creatorID = `identity--${uuidv4()}`;
+
+ showDetails = false;
+ showRelDetails = false;
+ showRelEditor = false;
+ showEditor = false;
+ showJSON = false;
+ showJSONPaste = false;
+ showSchemaPaste = false;
+ showImporter = false;
+ showRelPicker = false;
+ showExtensionPicker = false;
+ showLayoutPanel = false;
+ showGrowl = false;
+ showSubmissionError = false;
+ showSubmissionErrorBadge = false;
+
+ updateFlow = false;
+
+ groupMode = false;
+
+ growlMessage = "";
+
+ bundleJSON = "";
+
+ relationships = [];
+ customRelationships = {};
+
+ dragging = {};
+ selected = {};
+ hovered = {};
+ selectedExt = {};
+ selectedRel = {};
+ selectedGroup = [];
+
+ bundle = {};
+
+ pasteBundle;
+ pasteSchema;
+
+ nodes = [];
+ edges = [];
+
+ failedCollection = [];
+
+ objects = [
+ sighting,
+ malware,
+ ma,
+ indicator,
+ coa,
+ ap,
+ od,
+ campaign,
+ identity,
+ tool,
+ report,
+ vuln,
+ grouping,
+ infra,
+ is,
+ location,
+ ta,
+ note,
+ opinion,
+ tlpred,
+ tlpamber,
+ tlpgreen,
+ tlpwhite,
+ md,
+ artifact,
+ obs,
+ software,
+ ipv4,
+ ipv6,
+ autosys,
+ dir,
+ domain,
+ emailaddr,
+ emailmsg,
+ file,
+ mac,
+ mutex,
+ network,
+ process,
+ url,
+ ua,
+ winregkey,
+ cert,
+ extDef,
+ ];
+
+ nodeTypes = {}
+
+ layoutConfig = {
+ layoutMethod: "Hierarchy", // Default layout method (can be 'GRID', 'HIERARCHY')
+ horizontalSpacing: 100, // Example horizontal spacing
+ verticalSpacing: 100, // Example vertical spacing
+ nodeTypes: {},
+ showRelationships: true, // Global boolean toggle for show/hide relationships
+ orientation: "Row View"
+ };
+
+
+ mousePosition = {
+ clientX: 0,
+ clientY: 0,
+ };
+
+ constructor() {
+ makeAutoObservable(this, { autoBind: true });
+ this.bundle.spec_version = SPEC_VERSION;
+ this.bundle.id = this.generateNodeID("bundle--");
+ this.bundle.type = "bundle";
+ this.bundle.objects = [];
+ this.loadConfigurations();
+ }
+
+ /*------------------------------------------------------------
+ *
+ * General Functions
+ *
+ *------------------------------------------------------------
+ */
+
+ /**
+ * Generate current moment.
+ * @returns current moment
+ */
+ generateMoment() {
+ return moment().utc(true).format("YYYY-MM-DD[T]HH:mm:ss.SSS[Z]");
+ }
+
+ /**
+ * Generate current timestamp.
+ * @param {*} time
+ * @returns
+ */
+ generateTimestamp(time) {
+ return moment(time).utc(true).format("YYYY-MM-DD[T]HH:mm:ss.SSS[Z]");
+ }
+
+ /**
+ * Get the creator ID.
+ * @returns Creator ID for the STIX UI
+ */
+ getCreatorID() {
+ return this.creatorID;
+ }
+
+ /**
+ * Check if a value is empty and/or undefined.
+ * @param {*} value
+ * @returns
+ */
+ isEmpty(value) {
+ switch (typeof value) {
+ case "number":
+ case "bigint":
+ case "boolean":
+ return false;
+ case "object":
+ if (Array.isArray(value)) {
+ return !value.length;
+ } else {
+ return !Object.keys(value).length;
+ }
+ default:
+ return !value;
+ }
+ }
+
+ /**
+ * Calculate the standard deviation for a list of numbers.
+ * @param {list} numbers
+ * @returns standard deviation
+ */
+ calculateStandardDeviation(numbers) {
+ if (!Array.isArray(numbers) || numbers.length === 0) {
+ throw new Error("Please provide a non-empty array of numbers.");
+ }
+ const mean = numbers.reduce((acc, val) => acc + val, 0) / numbers.length;
+ // Calculate the squared differences from the mean
+ const squaredDifferences = numbers.map(val => Math.pow(val - mean, 2));
+
+ // Calculate the mean of the squared differences
+ const meanSquaredDifference = squaredDifferences.reduce((acc, val) => acc + val, 0) / numbers.length;
+
+ const standardDeviation = Math.sqrt(meanSquaredDifference)
+ // Return the square root of the mean squared difference (standard deviation)
+ return (standardDeviation + mean);
+ }
+
+ /*------------------------------------------------------------
+ *
+ * Config Functions
+ *
+ *------------------------------------------------------------
+ */
+
+ /**
+ * Import configurations
+ */
+ async loadConfigurations() {
+ this.creatorID = Config.CREATOR_ID;
+ const schemas = await Config.importSchemas();
+ schemas.map((schema) => {
+ this.addSchema(schema);
+ });
+ }
+
+ /*------------------------------------------------------------
+ *
+ * Canvas and UI Functions
+ *
+ *------------------------------------------------------------
+ */
+
+ /**
+ * Set the bundle being pasted from the Json Paste panel.
+ * @param {object} bundle
+ */
+ setPasteBundle(bundle) {
+ this.pasteBundle = bundle;
+ }
+
+ setNodeTypes(nodeTypesList) {
+ if (Array.isArray(nodeTypesList) && nodeTypesList.every(item => typeof item === 'string')) {
+ this.nodeTypes = nodeTypesList;
+ } else {
+ console.error('nodeTypesList should be an array of strings');
+ }
+ }
+
+ getNodeTypes() {
+ return this.nodeTypes
+ }
+ setLayoutMethod(newMethod) {
+ this.layoutConfig.layoutMethod = newMethod;
+ }
+ getLayoutMethod() {
+ return this.layoutConfig.layoutMethod
+ }
+ setOrientation(newOrientation) {
+ this.layoutConfig.orientation = newOrientation;
+ }
+
+ getOrientation() {
+ return this.layoutConfig.orientation
+ }
+
+ /**
+ * Set the schema being pasted from the Schema Paste panel.
+ * @param {object} schema
+ */
+ setPasteSchema(schema) {
+ this.pasteSchema = schema;
+ }
+
+ /**
+ * Set the x and y position of the mouse.
+ * @param {number} x
+ * @param {number} y
+ */
+ setMousePosition(x, y) {
+ this.mousePosition.clientX = x;
+ this.mousePosition.clientY = y;
+ }
+
+ /**
+ * Set flag to update React Flow canvas.
+ * @param {boolean} update
+ */
+ setUpdateFlow(update) {
+ this.updateFlow = update;
+ }
+
+ /**
+ * Set the growl message.
+ * @param {string} message
+ */
+ setGrowlMessage(message) {
+ this.growlMessage = message;
+ }
+
+ /**
+ * Set whether to show the growl message.
+ * @param {boolean} show
+ */
+ setShowGrowl(show) {
+ this.showGrowl = show;
+ }
+
+ /**
+ * Show modal.
+ */
+ showModal() {
+ this.modal = true;
+ }
+
+ /**
+ * Hide modal.
+ */
+ hideModal() {
+ this.modal = false;
+ }
+
+ /**
+ * Set whether to show the Details panel.
+ * @param {boolean} show
+ */
+ setShowDetails(show) {
+ this.showDetails = show;
+ }
+
+ /**
+ * Set whether to show the Relationship Details panel,
+ * for use creating new custom relationships.
+ * @param {boolean} show
+ */
+ setShowRelDetails(show) {
+ this.showRelDetails = show;
+ }
+
+ /**
+ * Set whether to show the Relationship Editor panel,
+ * for use editing existing relationships.
+ * @param {boolean} show
+ */
+ setShowRelEditor(show) {
+ this.showRelEditor = show;
+ }
+
+ /**
+ * Set whether to show the Extension Editor panel.
+ * @param {boolean} show
+ */
+ setShowEditor(show) {
+ this.showEditor = show;
+ }
+
+ /**
+ * Set whether to show the Json Viewer panel.
+ * @param {boolean} show
+ */
+ setShowJSON(show) {
+ this.showJSON = show;
+ }
+
+ /**
+ * Set whether to show the Json Paste panel.
+ * @param {boolean} show
+ */
+ setShowJSONPaste(show) {
+ this.showJSONPaste = show;
+ }
+
+ /**
+ * Set whether to show the Schema Paste panel.
+ * @param {boolean} show
+ */
+ setShowSchemaPaste(show) {
+ this.showSchemaPaste = show;
+ }
+
+ /**
+ * Set whether to show the File Importer panel,
+ * for use importing schemas and bundles.
+ * @param {boolean} show
+ */
+ setShowImporter(show) {
+ this.showImporter = show;
+ }
+
+ /**
+ * Set whether to show the Relationship Picker panel,
+ * for use creating a new relationship.
+ * @param {boolean} show
+ */
+ setShowRelPicker(show) {
+ this.showRelPicker = show;
+ }
+
+ /**
+ * Set whether to show the Extension Picker panle,
+ * for use editing extension definitions.
+ * @param {boolean} show
+ */
+ setShowExtensionPicker(show) {
+ this.showExtensionPicker = show;
+ }
+
+ /**
+ * Set whether to show the Submission Error panel.
+ * @param {boolean} show
+ */
+ setShowSubmissionError(show) {
+ this.showSubmissionError = show;
+ }
+
+ /**
+ * Set whether nodes are being selected for group creation.
+ * @param {boolean} mode
+ */
+ setGroupMode(mode) {
+ this.groupMode = mode;
+ }
+
+ /**
+ * Set whether to show the Layout panel
+ * @param {boolean} show
+ */
+ setShowLayoutPanel(show) {
+ this.showLayoutPanel = show;
+ }
+
+ /*------------------------------------------------------------
+ *
+ * Layout UI Functions
+ *
+ *------------------------------------------------------------
+ */
+
+
+ setNodeLayout() {
+ const vertSpacer = this.layoutConfig.verticalSpacing;
+ const horzSpacer = this.layoutConfig.horizontalSpacing;
+ var allNodes = [...this.nodes.filter(n => n.title !== 'extension-definition')]; // Creates a standalone copy of the array
+ var allEdges = [...this.edges]; // Creates a standalone copy of the array
+ var nodeMetaData = {}
+ var selectedLayoutMethod = this.layoutConfig.layoutMethod;
+ var orientation = this.layoutConfig.orientation;
+
+ switch (selectedLayoutMethod.toUpperCase()) {
+ case "GRID":
+ for (let i = 0; i < allNodes.length; i++) {
+ let node = allNodes[i];
+ let currentNodeTypeName = this.getType(node);
+ if (currentNodeTypeName in nodeMetaData) {
+ nodeMetaData[currentNodeTypeName].push(node);
+ } else {
+ nodeMetaData[currentNodeTypeName] = [node];
+ }
+ }
+ let groupCount = 0;
+ for (const type in nodeMetaData) {
+ nodeMetaData[type].sort(function(a, b) {
+ if (a.properties && a.properties.name && a.properties.name.value &&
+ b.properties && b.properties.name && b.properties.name.value) {
+ if (a.properties.name.value < b.properties.name.value) {
+ return -1;
+ }
+ if (a.properties.name.value > b.properties.name.value) {
+ return 1;
+ }
+ return 0;
+ }
+ });
+ let nodeCount = 0;
+ nodeMetaData[type].forEach(node => {
+ if (orientation == "Row View") {
+ node.position = {x: (nodeCount * vertSpacer), y: (groupCount * horzSpacer)};
+ } else if (orientation == "Column View") {
+ node.position = {x: (groupCount * horzSpacer), y: (nodeCount * vertSpacer)};
+ }
+ nodeCount +=1;
+ });
+ groupCount += 1;
+ }
+ break;
+ case "HIERARCHY":
+ allNodes.forEach(node => {
+ let srcEdges = allEdges.filter(edge => edge.source_ref == node.properties.id.value);
+ if (srcEdges.length > 0) {
+ let tgtEdges = allEdges.filter(edge => edge.target_ref == node.properties.id.value);
+ if (srcEdges.length > 0 && tgtEdges.length == 0) {
+ if ("layer1" in nodeMetaData) {
+ nodeMetaData["layer1"].push(node);
+ } else {
+ nodeMetaData["layer1"] = [node];
+ }
+ }
+ }
+ });
+ if ("layer1" in nodeMetaData) {
+ nodeMetaData["layer1"].forEach(node => {
+ let index = allNodes.indexOf(node);
+ if (index !== -1) {
+ allNodes.splice(index, 1);
+ }
+ });
+ } else {
+ // No top level elements, Hierarchy won't work
+ console.log("There are no top level elements, Hierarchy mode isn't possible.")
+ }
+ allNodes.forEach(node => {
+ let tgtEdges = allEdges.filter(edge => edge.target_ref == node.properties.id.value);
+ let layerName = "layer" + (tgtEdges.length + 1).toString();
+ if (layerName in nodeMetaData) {
+ nodeMetaData[layerName].push(node);
+ } else {
+ nodeMetaData[layerName] = [node];
+ }
+ });
+ for (const layer in nodeMetaData) {
+ nodeMetaData[layer].sort(function(a, b) {
+ if (a.properties && a.properties.type && a.properties.type.value &&
+ b.properties && b.properties.type && b.properties.type.value) {
+ if (a.properties.type.value < b.properties.type.value) {
+ return -1;
+ }
+ if (a.properties.type.value > b.properties.type.value) {
+ return 1;
+ }
+ return 0;
+ }
+
+ });
+ }
+ let layerCount = 0;
+ for (const layer in nodeMetaData) {
+ let nodeCount = 0;
+ if (layer.length > 0) {
+ nodeMetaData[layer].forEach(node => {
+ try {
+ if (orientation == "Row View") {
+ node.position = {x: (nodeCount * vertSpacer), y: (layerCount * horzSpacer)};
+ } else if (orientation == "Column View") {
+ node.position = {x: (layerCount * horzSpacer), y: (nodeCount * vertSpacer)};
+ }
+ nodeCount +=1;
+ } catch {
+
+ }
+
+ });
+ layerCount += 1;
+ }
+ }
+ break;
+ default:
+ // pass
+ }
+ this.setUpdateFlow(true);
+ }
+
+ getHorizontalSpacing() {
+ return this.layoutConfig.horizontalSpacing
+ }
+
+ setHorizontalSpacing(value) {
+ this.layoutConfig.horizontalSpacing = value;
+ }
+
+ getVerticalSpacing() {
+ return this.layoutConfig.verticalSpacing
+ }
+
+ setVerticalSpacing(value) {
+ this.layoutConfig.verticalSpacing = value;
+ }
+
+ setAlignmentOrDistribution(action) {
+ console.log(action)
+ var nodes = this.printSelectedNodes()
+ console.log(nodes)
+ switch (action) {
+ case 'alignLeft':
+
+ break;
+ case 'alignHorizontal':
+
+ break;
+ case 'alignRight':
+
+ break;
+ case 'alignTop':
+
+ break;
+ case 'alignVertical':
+
+ break;
+ case 'alignBottom':
+
+ break;
+ case 'distributeHorizontal':
+
+ break;
+ case 'distributeVertical':
+
+ break;
+ default:
+ }
+ }
+
+ printSelectedNodes() {
+ console.log(this.selectedGroup);
+ this.selectedGroup.forEach(obj => {
+ console.log(obj);
+ });
+ }
+
+ /*------------------------------------------------------------
+ *
+ * Object Parsing Functions
+ *
+ *------------------------------------------------------------
+ */
+
+ /**
+ * Extract the nested type from an object.
+ * @param {*} object
+ * @returns object type
+ */
+ getType(object) {
+ let type;
+ if (object.allOf) {
+ object.allOf.map((item) => {
+ if ("properties" in item) {
+ type = item.properties.type.enum[0];
+ }
+ });
+ } else {
+ type = object.properties.type.enum[0];
+ }
+ return type;
+ }
+
+ /**
+ * Extract the nested type from a schema object.
+ * @param {object} object
+ * @returns object type
+ */
+ getTypeFromJson(object) {
+ let typeName;
+ let ref;
+ if (object.allOf) {
+ object.allOf.map((item) => {
+ if ("$ref" in item) {
+ ref = item.$ref;
+ }
+ });
+ }
+ if (ref === undefined) {
+ typeName = object.type;
+ } else if (ref.includes("common/core.json")) {
+ typeName = this.getType(object);
+ } else {
+ try {
+ // Assumes the reference json has the same name as its original type name
+ const schemaFile = ref.split("/").slice(-1)[0];
+ typeName = schemaFile.split(".")[0];
+ } catch {
+ return typeName;
+ }
+ }
+ return typeName;
+ }
+
+ /*------------------------------------------------------------
+ *
+ * SDO Functions
+ *
+ *------------------------------------------------------------
+ */
+
+ /**
+ * Retrieve an SDO by its type.
+ * @param {*} type
+ * @returns type of sdo
+ */
+ getTypeSDO(type) {
+ return (
+ this.objects.find((o) => {
+ const t = this.getType(o);
+ return t === type;
+ }) ?? unknown
+ );
+ }
+
+ /**
+ * Get a specific marking definition SDO
+ * (Amber, Green, Red, Statement, or White)
+ * @param {*} definition_type
+ * @param {*} definition
+ * @returns
+ */
+ getMarkingDefinitionSDO(definition_type, definition) {
+ return (
+ this.objects.find((o) => {
+ if (this.getType(o) === "marking-definition") {
+ if (definition_type === "statement") {
+ return o.properties.definition_type.value === definition_type;
+ } else {
+ return (
+ JSON.stringify(o.properties.definition.value) ===
+ JSON.stringify(definition)
+ );
+ }
+ }
+ }) ?? {}
+ );
+ }
+
+ /*------------------------------------------------------------
+ *
+ * Schema and Extension Functions
+ *
+ *------------------------------------------------------------
+ */
+
+ /**
+ * Add schema for a new SDO/SCO extension.
+ *
+ * @param {object} json representation of schema
+ */
+ addSchema(json) {
+ const type = this.getTypeFromJson(json);
+ const sdo = this.getTypeSDO(type);
+
+ if (sdo.properties.type.value === "unknown") {
+ this.createSDOExtension(type, json);
+ } else {
+ this.createPropertyExtension(type, sdo, json);
+ }
+ }
+
+ /**
+ * Import and add a schema from file.
+ * @param {object} file json
+ */
+ loadSchemaFromFile(file) {
+ try {
+ const schema = JSON.parse(file);
+ this.addSchema(schema);
+ this.growlMessage = "Successfully Imported Extension(s)";
+ this.showGrowl = true;
+ } catch (e) {
+ this.growlMessage = "Incorrect JSON Syntax.";
+ console.error(e);
+ this.showGrowl = true;
+ }
+ }
+
+ /**
+ * Import and add a schema from the Schema Paste panel.
+ */
+ loadSchemaFromPaste() {
+ try {
+ const schema = JSON.parse(this.pasteSchema);
+ this.addSchema(schema);
+ this.pasteSchema = "";
+ this.showSchemaPaste = false;
+ } catch (e) {
+ this.growlMessage = "Incorrect JSON Syntax.";
+ console.error(e);
+ this.showGrowl = true;
+ }
+ }
+
+ /**
+ * Create a new extension definition node for the
+ * specified node type.
+ * @param {string} type being extended
+ * @returns new extension definition node
+ */
+ createExtensionNode(type) {
+ const newNode = this.createNodeByType("extension-definition");
+ newNode.id = this.generateNodeID("extension-definition--");
+ newNode.properties.name.value = `${type} Extension Definition`;
+ newNode.properties.created_by_ref.value = this.creatorID;
+ newNode.schemaName = type;
+ newNode.uiid = this.generateNodeID("stix-ui-element--");
+ return newNode;
+ }
+
+ /**
+ * Create an extension definition and type singleton
+ * for a new SDO/SCO type.
+ *
+ * @param {String} type of new SDO/SCO
+ * @param {Object} schema for new type
+ */
+ createSDOExtension(type, schema) {
+ const newNode = this.createExtensionNode(type);
+ newNode.properties.schema.value = schema["$id"] ?? "";
+ newNode.properties.version.value = "1.0.0";
+ newNode.properties.extension_types.value = ["new-sdo"];
+ const sdo = custom(schema, newNode);
+ this.objects.push(sdo);
+ newNode.img = sdo.img;
+ this.persistNode(newNode);
+ }
+
+ /**
+ * Create an extension definition for an existing type,
+ * and merge extended properties into existing type singleton.
+ *
+ * @param {string} type of existing SDO/SCO
+ * @param {object} sdo type singleton
+ * @param {object} schema for extended properties
+ */
+ createPropertyExtension(type, sdo, schema) {
+ const newNode = this.createExtensionNode(type);
+ newNode.properties.schema.value = schema["$id"] ?? "";
+ newNode.properties.version.value = "1.0.0";
+ newNode.properties.extension_types.value = ["property-extension"];
+ newNode.img = sdo.img;
+ try {
+ sdo.mergeExtension(schema, newNode);
+ } catch (e) {
+ this.growlMessage = "Incorrect JSON Syntax.";
+ console.error(e);
+ this.showGrowl = true;
+ }
+ this.persistNode(newNode);
+ }
+
+ /**
+ * Get all extension definition nodes.
+ * @returns extension definition nodes
+ */
+ getExtensions() {
+ return this.getNodesByType("extension-definition");
+ }
+
+ /**
+ * Get all property extension definition nodes.
+ * @returns property extension definition nodes
+ */
+ getPropertyExtensions() {
+ return this.nodes.filter(
+ (node) =>
+ node.title == "extension-definition" &&
+ "property-extension" in node.properties.extension_types.value
+ );
+ }
+
+ /**
+ * Get all new-sdo extension definition nodes
+ * @returns new-sdo extension definition nodes
+ */
+ getSDOExtensions() {
+ return this.nodes.filter(
+ (node) =>
+ node.title === "extension-definition" &&
+ "new-sdo" in node.properties.extension_types.value
+ );
+ }
+
+ /**
+ * Get all extension definition nodes associated with the specified type.
+ * @param {string} type
+ * @returns list of extensions associated with type
+ */
+ getExtensionsByType(type) {
+ return this.nodes.filter(
+ (node) =>
+ node.title === "extension-definition" && node.schemaName === type
+ );
+ }
+
+ /**
+ * Get the property extension definition node for the specified type
+ * with the specified properties, if one exists.
+ *
+ * @param {string} type
+ * @param {list} properties
+ * @returns
+ */
+ getExtensionByProperties(type, properties) {
+ return (
+ this.getExtensionsByType(type).find((ext) =>
+ properties.every((prop) => ext.extension_properties.includes(prop))
+ ) ?? {}
+ );
+ }
+
+ /**
+ * Edit an extension property.
+ *
+ * @param {object} event
+ */
+ editExtensionValues(event) {
+ const props = this.selectedExt;
+ const updateProps = {
+ id: this.selectedExt.id,
+ value: event.currentTarget.value,
+ name: event.currentTarget.name,
+ };
+ props[updateProps.name] = updateProps.value;
+
+ const sdo = this.getTypeSDO(props.schemaName);
+ sdo[updateProps.name] = updateProps.value;
+
+ this.getNodesByType(props.schemaName).map((node) => {
+ node[updateProps.name] = updateProps.value;
+ });
+ }
+
+ /**
+ * Select the extension.
+ * @param {object} ext
+ */
+ setSelectedExt(ext) {
+ this.selectedExt = ext;
+ this.selected = ext;
+ }
+
+ /**
+ * Delete the selected extension definition node,
+ * any extended properties, and extension type singleton, if one exists.
+ */
+ deleteSelectedExt() {
+ const extension = this.selectedExt;
+ const sdo = this.getTypeSDO(extension.schemaName);
+ const nodes = this.getNodesByType(extension.schemaName);
+
+ if (extension.properties.extension_types.value.includes("new-sdo")) {
+ // delete all nodes of extension type
+ nodes.map( node => {
+ this.selected = node;
+ this.deleteSelectedNode();
+ })
+ // delete SDO singleton
+ const sdoIdx = this.objects.indexOf(sdo);
+ this.objects.splice(sdoIdx, 1);
+
+ } else if (extension.properties.extension_types.value.includes("property-extension")) {
+
+ // Delete extension from SDO singleton extensions list
+ const idx = sdo.extensions.indexOf(extension.uiid);
+ sdo.extensions.splice(idx, 1);
+
+ // delete all extension properties from all nodes
+ const props = extension.extension_properties;
+ nodes.map( node => {
+ node.extensions.splice(idx, 1);
+ props.map( prop => {
+ delete node.properties[prop];
+ })
+ })
+ }
+
+ // delete node representation of ext
+ this.selected = extension;
+ this.deleteSelectedNode();
+
+ this.showEditor = false;
+ }
+
+ /*------------------------------------------------------------
+ *
+ * Bundle Functions
+ *
+ *------------------------------------------------------------
+ */
+
+ /**
+ * Create a bundle from an imported file.
+ * @param {object} file json
+ */
+ loadBundleFromFile(file) {
+ this.pasteBundle = file;
+ this.loadBundleFromPaste();
+ this.growlMessage = this.growlMessage.length ? this.growlMessage : "Successfully Imported Bundle";
+ this.showGrowl = true;
+ }
+
+ /**
+ * Create a bundle from the store pasteBundle value.
+ */
+ loadBundleFromPaste() {
+ this.reset();
+ this.bundle.objects = [];
+ try {
+ const bundle = JSON.parse(this.pasteBundle);
+ this.bundle.id = bundle.id;
+ const unknownObjects = new Set();
+ const unknownExtensions = new Set();
+ for (const object of bundle.objects) {
+ const type = this.getTypeFromJson(object);
+ if (type !== "relationship" && type !== "extension-definition") {
+ // create node
+ let newNode;
+ if (type == "marking-definition") {
+ newNode = this.createNodeByDefinition(
+ object.definition_type,
+ object.definition
+ );
+ } else {
+ newNode = this.createNodeByType(type);
+ }
+
+ // Deal with unknown SDOs
+ if (newNode.type == "unknown") {
+ unknownObjects.add(type);
+
+ if ("extensions" in object) {
+ Object.keys(object["extensions"]).forEach((key) => {
+ unknownExtensions.add(key);
+ });
+ }
+ this.growlMessage = `${unknownObjects.size} Unknown STIX Domain Object Type(s)`;
+ this.showGrowl = true;
+ }
+
+ // Copy properties to node
+ newNode.id = object.id;
+ for (const key of Object.keys(object)) {
+ if (key === 'extensions') {
+ continue;
+ } else if (key in newNode.properties) {
+ newNode.properties[key].value = object[key];
+ } else {
+ newNode.properties[key] = {
+ value: object[key],
+ type: "unknown",
+ control: "hidden",
+ description: `Import extension schema(s) to see description.`,
+ };
+ delete object[key];
+ }
+ }
+
+ // Do manipulation for extension management
+ if ("extensions" in object) {
+ for (const [key, extension] of Object.entries(object.extensions)) {
+ switch (extension.extension_type) {
+ case "new-sdo":
+ const defs = this.getExtensionsByType(type);
+ if (defs.length) {
+ defs[0].id = key;
+ } else {
+ newNode.properties.extensions.value[key] = extension;
+ }
+ break;
+ case "property-extension":
+ const props = Object.keys(extension).filter(prop => prop != "extension_type");
+ const def = this.getExtensionByProperties(type, props);
+ if (Object.keys(def).length) {
+ def.id = key;
+ props.map(prop => newNode.properties[prop].value = extension[prop]);
+ } else {
+ unknownExtensions.add(key);
+ newNode.unknownProperties = newNode.unknownProperties ?? {};
+ props.map( prop => newNode.unknownProperties[prop] = { value: extension[prop]});
+ newNode.properties.extensions.value[key] = extension;
+ }
+ break;
+ default:
+ newNode.properties.extensions.value[key] = extension;
+ break;
+ }
+ }
+ }
+ this.persistNode(newNode);
+ }
+ }
+
+ // Update sdo fields
+ const extensions = bundle.objects.filter(
+ (o) => o.type === "extension-definition"
+ );
+ const extNodes = this.getExtensions();
+ extensions.map((obj) => {
+ const extNode =
+ extNodes.find((node) => obj.id === node.id);
+ if (extNode) {
+ for (const [prop, value] of Object.entries(obj)) {
+ extNode.properties[prop].value = value;
+ }
+ } else {
+ unknownExtensions.add(obj.id);
+ }
+ });
+
+ // add unknown extensions (only to bundle, not as nodes)
+ unknownExtensions.forEach((id) => {
+ const obj = bundle.objects.find((o) => o.id == id);
+ if (obj) {
+ this.bundle.objects.push(obj);
+ }
+ });
+
+ // Handle SRO's and synthetic relationships
+ // after SDO's have been loaded.
+ bundle.objects.map((o) => {
+ if (o.type === "relationship") {
+ const sourceExists = this.getNodeById(o.source_ref);
+ if (sourceExists) {
+ this.edges.push(o);
+ } else {
+ this.bundle.objects.push(o);
+ }
+ }
+
+ if (o.type !== "relationship") {
+ for (const key in o) {
+ if (
+ key.indexOf("_ref") > -1 &&
+ o[key].length &&
+ key !== "external_references"
+ ) {
+ if (Array.isArray(o[key])) {
+ o[key].map((id) => {
+ const rel = this.createRelationshipFromPaste(key, o, id);
+
+ if (rel) {
+ this.edges.push(rel);
+ }
+ });
+ } else {
+ const rel = this.createRelationshipFromPaste(key, o);
+
+ if (rel) {
+ this.edges.push(rel);
+ }
+ }
+ }
+ }
+ }
+ });
+
+ this.pasteBundle = "";
+ this.showJSONPaste = false;
+ } catch (e) {
+ this.growlMessage = "Incorrect JSON Syntax.";
+ console.error(e);
+ this.showGrowl = true;
+ }
+ }
+
+ /*------------------------------------------------------------
+ *
+ * Node Functions
+ *
+ *------------------------------------------------------------
+ */
+
+ /**
+ * Generate a uuid with specified prefix.
+ * @param {string} prefix
+ * @returns
+ */
+ generateNodeID(prefix) {
+ return `${prefix}${uuidv4()}`;
+ }
+
+ /**
+ * Create a node of type
+ * @param {string} type
+ * @returns new Node
+ */
+ createNodeByType(type) {
+ let node = {};
+ const object = this.getTypeSDO(type);
+ if (object) {
+ node = structuredClone(object);
+ }
+ return node;
+ }
+
+ /**
+ * Create a marking definition Node of the specified type
+ * (Amber, Green, Red, Statement, or White)
+ * @param {*} definition_type
+ * @param {*} definition
+ * @returns new marking definition Node
+ */
+ createNodeByDefinition(definition_type, definition) {
+ let node = {};
+ const object = this.getMarkingDefinitionSDO(definition_type, definition);
+ if (object) {
+ node = structuredClone(object);
+ }
+ return node;
+ }
+
+ /**
+ * Observables are dragged onto other SDOs as a generic object
+ * and transformed after the user selects the specified, targeted observable.
+ *
+ * i.e. Create a new observable target for the specified relationship.
+ * @param {object} relationship
+ * @returns modified relationship, now targeting a new observable node
+ */
+ handleGenericObservable(relationship) {
+ const newNode = this.createNodeByType(relationship.subTarget);
+ newNode.id = this.generateNodeID(newNode.prefix);
+ relationship.target_ref = newNode.id;
+ const nodeToPersist = newNode;
+
+ this.edges.push(relationship);
+ this.persistNode(nodeToPersist);
+ this.dragging = nodeToPersist;
+
+ return relationship;
+ }
+
+ /**
+ * If not already present, add node to nodes.
+ * @param {object} node
+ * @returns node successfully added to nodes
+ */
+ persistNode(node) {
+ let nodeExists = false;
+ // This will block generic observables
+ // from persisting.
+ if (node.type) {
+ this.nodes.map((n) => {
+ if (node.id === n.id) {
+ nodeExists = true;
+ }
+ });
+
+ if (!nodeExists) {
+ this.nodes.push(node);
+ }
+ return !nodeExists;
+ }
+ }
+
+ /**
+ * Create a new SCO relating to the nodeOnScreen
+ * (i.e. where the OBS icon is being dragged)
+ * If multiple possible observables, manually select.
+ *
+ * @param {*} nodeOnScreen
+ * @returns
+ */
+ addNodeWithRelationship(nodeOnScreen) {
+ let relationship = this.canRelate(nodeOnScreen);
+ const dragging = toJS(this.dragging);
+
+ if (Array.isArray(relationship)) {
+ this.relationships = relationship;
+ this.showRelPicker = true;
+ } else {
+ const nodeToPersist = dragging;
+
+ if (relationship) {
+ // if the relationship is an observable, we need to swap
+ // it out for the specific sub type.
+ if (relationship.targetObjectType === "observable") {
+ if (nodeOnScreen.type === "observable") {
+ relationship = this.handleGenericObservable(relationship);
+ }
+ } else {
+ this.edges.push(relationship);
+ this.persistNode(nodeToPersist);
+ }
+
+ return relationship;
+ }
+ this.persistNode(nodeToPersist);
+ return relationship;
+ }
+ }
+
+ /**
+ * Get the node with specified id
+ * @param {string} id
+ * @returns node, if exists, else empty object
+ */
+ getNodeById(id) {
+ return this.nodes.find((n) => n.id === id) ?? {};
+ }
+
+ /**
+ * Get the extension definition with specified uiid
+ * @param {string} uiid
+ * @returns ext def node, if exists, else empty object
+ */
+ getExtensionByUIID(uiid) {
+ return this.nodes.find( (n) => n.uiid === uiid) ?? {};
+ };
+
+ /**
+ * Get the node closest to the specified coordinates
+ * @param {number} x
+ * @param {number} y
+ * @returns
+ */
+ getNodeByPosition(x, y) {
+ let node;
+ let distance = Infinity;
+
+ this.nodes
+ .filter((n) => "position" in n)
+ .map((n) => {
+ const dx = n.position.x - x;
+ const dy = n.position.y - y;
+ const d = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
+
+ if (d < distance) {
+ node = n;
+ distance = d;
+ }
+ });
+ return node;
+ }
+
+
+ /**
+ * Get all nodes of type
+ * @param {string} type
+ * @returns all nodes of type
+ */
+ getNodesByType(type) {
+ return this.nodes.filter((node) => node.properties.type.value === type);
+ }
+
+ /**
+ * Edit a node value.
+ * @param {object} event
+ */
+ editNodeValues(event) {
+ const props = this.selected.properties;
+ const updateProps = {
+ id: this.selected.id,
+ value: event.currentTarget.value,
+ name: event.currentTarget.name,
+ };
+
+ // Array's clearly need different treatment than strings.
+ if (
+ props[updateProps.name].type === "array" &&
+ props[updateProps.name].vocab
+ ) {
+ let idx = -1;
+ // We need to see if this is a push or
+ // a splice.
+ props[updateProps.name].value.map((item, i) => {
+ if (item === updateProps.value) {
+ idx = i;
+ }
+ });
+ // If the value exists, we know this is a splice or,
+ // remove operation. Otherwise, the user is trying
+ // to add a value.
+ if (idx > -1) {
+ props[updateProps.name].value.splice(idx, 1);
+ } else {
+ props[updateProps.name].value.push(updateProps.value);
+ }
+ // We need to see if this is a select or select.
+ } else if (
+ props[updateProps.name].type === "string" &&
+ props[updateProps.name].vocab &&
+ props[updateProps.name].value === updateProps.value
+ ) {
+ props[updateProps.name].value = "";
+ } else if (props[updateProps.name].type === "object") {
+ props[updateProps.name].value = updateProps.value;
+
+ try {
+ updateProps.value = JSON.parse(updateProps.value);
+ } catch (error) {
+ console.warn("not a valid object");
+ }
+ } else {
+ props[updateProps.name].value = updateProps.value;
+ }
+ }
+
+ addGenericObject(field, value) {
+ let v = this.selected.properties[field].value;
+ v = _merge(v, value);
+ }
+
+ deleteGenericObject(field, key) {
+ const v = this.selected.properties[field].value;
+
+ delete v[key];
+ }
+
+ /**
+ * For editing CSV values we will do both the property
+ * and the bundle updates in one function since they
+ * are unique in how both are updated.
+ */
+ editCSVInput(event) {
+ const props = this.selected.properties;
+ const updateProps = {
+ id: this.selected.id,
+ value: event.currentTarget.value,
+ name: event.currentTarget.name,
+ };
+
+ props[updateProps.name].value = [];
+
+ updateProps.value = updateProps.value.replace(/, /g, ",");
+ updateProps.value = updateProps.value.replace(/ ,/g, ",");
+
+ let newArray = updateProps.value.split(",");
+
+ if (!updateProps.value.length) {
+ newArray = [];
+ }
+
+ newArray.map((item) => {
+ props[updateProps.name].value.push(item);
+ });
+ }
+
+ /**
+ * Add an object to a property list of objects.
+ * @param {string} field
+ * @param {list} requiredFields
+ */
+ addDefaultObject(field, requiredFields) {
+ const def = {};
+ for (const f in requiredFields) {
+ const field = requiredFields[f];
+ def[field] = "";
+ }
+ this.selected.properties[field].value.push(def);
+ }
+
+ /**
+ * Update an external reference property.
+ * @param {*} input
+ * @param {*} select
+ * @param {*} idx
+ */
+ changeERValue(input, select, idx) {
+ const nodeProp = this.selected.properties.external_references.value;
+
+ try {
+ if (typeof JSON.parse(input) === "object") {
+ input = JSON.parse(input);
+ }
+ } catch (e) {}
+
+ nodeProp[idx][select] = input;
+ }
+
+ /**
+ * Delete an external reference property.
+ * @param {*} select
+ * @param {*} idx
+ */
+ deleteERObjectProperty(select, idx) {
+ const nodeProp = this.selected.properties.external_references.value;
+
+ delete nodeProp[idx][select];
+ }
+
+ /**
+ * Delete an external reference.
+ * @param {*} idx
+ */
+ deleteERObject(idx) {
+ const nodeProp = this.selected.properties.external_references.value;
+
+ nodeProp.splice(idx, 1);
+ }
+
+ /**
+ * Update the value of an array property element.
+ * @param {*} input
+ * @param {*} select
+ * @param {*} idx
+ * @param {*} property
+ */
+ changeArrayObjectValue(input, select, idx, property) {
+ const nodeProp = this.selected.properties[property].value;
+
+ try {
+ if (typeof JSON.parse(input) === "object") {
+ input = JSON.parse(input);
+ }
+ } catch (e) {}
+
+ nodeProp[idx][select] = input;
+ }
+
+ /**
+ * Delete an element from an array property.
+ * @param {*} field
+ * @param {*} idx
+ * @param {*} property
+ */
+ deleteArrayObjectProperty(field, idx, property) {
+ const nodeProp = this.selected.properties[property].value;
+
+ delete nodeProp[idx][field];
+ }
+
+ /**
+ * Delete an entire array property.
+ * @param {*} idx
+ * @param {*} property
+ */
+ deleteArrayObject(idx, property) {
+ const nodeProp = this.selected.properties[property].value;
+ nodeProp.splice(idx, 1);
+ }
+
+ /**
+ * Delete an object property.
+ * @param {*} idx
+ * @param {*} property
+ */
+ deleteObject(idx, property) {
+ const nodeProp = this.selected.properties[property].value;
+
+ nodeProp.splice(idx, 1);
+ }
+
+ /**
+ * Add the STIX UI creator ID to the node.
+ * @param {object} node
+ */
+ addCreatorID(node) {
+ // Set created_by_ref to creator id
+ if ("created_by_ref" in node.properties) {
+ node.properties.created_by_ref.value = this.creatorID;
+ }
+ }
+
+ /**
+ * Update the creator ID for the STIX UI.
+ * @param {string} id
+ */
+ updateCreatorID(id) {
+ const oldID = this.creatorID;
+ this.nodes.map((node) => {
+ if (node.properties.created_by_ref.value === oldID) {
+ node.properties.created_by_ref.value = id;
+ }
+ });
+ this.creatorID = id;
+ }
+
+ /**
+ * Set the node being dragged.
+ * @param {object} dragging
+ */
+ setDragging(dragging) {
+ this.dragging = dragging;
+ }
+
+ /**
+ * Select the node.
+ * @param {object} node
+ */
+ setSelected(node) {
+ this.selected = node;
+ }
+
+ /**
+ * Set whether the node is being hovered in
+ * the Submission Error panel.
+ * @param {string} nodeId id of node
+ * @param {boolean} hovered is being hovered
+ */
+ setHovered(nodeId, hovered) {
+ const node = this.getNodeById(nodeId);
+ node.hovered = hovered;
+ }
+
+ /**
+ * Delete the selected node and any related relationships.
+ */
+ deleteSelectedNode() {
+ const nodeToDelete = this.selected;
+
+ // Handle the edges that may be impacted by
+ // removing a node.
+ for (let i = 0; i < this.edges.length; i++) {
+ const rel = this.edges[i];
+ if (rel.source_ref === nodeToDelete.id) {
+ this.deleteRelationship(rel, i);
+ i--;
+ } else if (rel.target_ref === nodeToDelete.id) {
+ this.deleteRelationship(rel, i);
+ i--;
+ }
+ }
+
+ // Remove the selected node from the nodes object.
+ this.nodes.map((node, i) => {
+ if (node.id === nodeToDelete.id) {
+ this.nodes.splice(i, 1);
+ }
+ });
+ this.showDetails = false;
+ }
+
+ /*------------------------------------------------------------
+ *
+ * Relationship Functions
+ *
+ *------------------------------------------------------------
+ */
+
+ /**
+ * Create an internal relationship object for use by the UI,
+ * inferring relationship name to display on edge, relationship exclusivity,
+ * and whether the relationship is embedded in the source node.
+ *
+ * @param {string} key property of source node
+ * @param {object} node source node
+ * @param {string} id target node id
+ * @returns
+ */
+ createRelationshipFromPaste(key, node, id) {
+ const def = this.getTypeSDO(node.type);
+ let sourceExists = false;
+ let targetExists = false;
+ let rel;
+ let targetType;
+ let relationshipType = "references";
+ let exclusiveRelationship = false;
+ let embeddedRelationship = true;
+
+ const src = node.id;
+ const target = id || node[key];
+
+ if (id) {
+ targetType = id.split("--")[0];
+ } else {
+ targetType = node[key].split("--")[0];
+ }
+
+ this.nodes.map((n) => {
+ if (node[key] === n.id || id === n.id) {
+ targetExists = true;
+ } else if (n.id == node.id) {
+ sourceExists = true;
+ }
+ });
+
+ if (!sourceExists || !targetExists) {
+ return rel;
+ }
+
+ // get reverse embedded relationship
+ const targetDef = this.getTypeSDO(targetType);
+ if (targetDef.relationships) {
+ def.relationships.map((relationship) => {
+ if (
+ relationship.x_embed &&
+ relationship.x_embed === key &&
+ relationship.target === node.type &&
+ relationship.x_reverse
+ ) {
+ relationshipType = relationship.type;
+ exclusiveRelationship = relationship.x_exclusive;
+ embeddedRelationship = true;
+ }
+ });
+ }
+
+ // get embedded relationship
+ if (def.relationships) {
+ def.relationships.map((relationship) => {
+ if (
+ relationship.x_embed &&
+ relationship.x_embed === key &&
+ relationship.target === targetType
+ ) {
+ relationshipType = relationship.type;
+ exclusiveRelationship = relationship.x_exclusive;
+ embeddedRelationship = true;
+ }
+ });
+ }
+
+ rel = {
+ source_ref: src,
+ target_ref: target,
+ relationship_type: relationshipType,
+ x_exclusive: exclusiveRelationship,
+ type: "relationship",
+ created: this.generateMoment(),
+ modified: this.generateMoment(),
+ id: this.generateNodeID("relationship--"),
+ };
+
+ if (embeddedRelationship) {
+ rel.x_embed = key;
+ }
+
+ return rel;
+ }
+
+ /**
+ * Create a new relationship.
+ * @param {*} source
+ * @param {*} target
+ * @param {*} relationship
+ * @returns
+ */
+ makeRelationship(source, target, relationship) {
+ let rel;
+ let exclusiveRelationshipDefined = false;
+ if (target == undefined) {
+ target = { id: "" };
+ }
+ const alreadyRelated = this.blockDuplicateRelationships(
+ source.id,
+ target.id,
+ relationship.type
+ );
+ // Some relationships are exclusive by nature.
+ // This bit of code will protect that exclusivity.
+ if (relationship.x_exclusive) {
+ this.edges.map((edge) => {
+ if (
+ edge.source_ref === source.id &&
+ relationship.type === edge.relationship_type
+ ) {
+ exclusiveRelationshipDefined = true;
+ }
+ });
+ }
+
+ if (!alreadyRelated && !exclusiveRelationshipDefined) {
+ const srcImg = source.customImg ?? source.img;
+ const targetImg = target.customImg ??
+ target.img ?? `${relationship.target}.png`;
+ rel = {
+ source_ref: source.id,
+ target_ref: target.id,
+ relationship_type: relationship.type,
+ type: "relationship",
+ spec_version: "2.1",
+ created: this.generateMoment(),
+ modified: this.generateMoment(),
+ id: this.generateNodeID("relationship--"),
+ targetObjectType: relationship.target,
+ srcImg: srcImg,
+ targetImg: targetImg,
+
+ };
+
+ if (relationship.x_reverse) {
+ rel.source_ref = target.id,
+ rel.target_ref = source.id;
+ rel.srcImg = targetImg;
+ rel.targetImg = srcImg;
+ }
+
+ if (relationship["sub-target"]) {
+ rel.subTarget = relationship["sub-target"];
+ }
+
+ if (relationship.x_embed) {
+ rel.x_embed = relationship.x_embed;
+ }
+ }
+ return rel;
+ }
+
+ /**
+ * Get possible relationships between source and target.
+ * @param {*} source
+ * @param {*} target
+ * @returns
+ */
+ canRelate(source, target) {
+ const sourceType = source.properties.type.enum[0];
+ const targetType = target.properties.type.enum[0];
+ const rel = [];
+
+ if (source.id === target.id) {
+ return rel;
+ }
+
+ const alredyPushed = (rel, relationship) => {
+ let found = false;
+ const t = relationship["sub-target"] ?? relationship.target;
+
+ rel.map((r) => {
+ if (
+ r.targetObjectType === t &&
+ r.relationship_type === relationship.type
+ ) {
+ found = true;
+ }
+ });
+ return found;
+ };
+
+ let sourceRels = source.relationships;
+ if (sourceType in this.customRelationships) {
+ sourceRels = sourceRels.concat(this.customRelationships[sourceType]);
+ }
+ sourceRels.map((relationship) => {
+ if (relationship.target === targetType || relationship["sub-target"] === targetType) {
+ const madeRel = this.makeRelationship(source, target, relationship);
+ if (madeRel && !alredyPushed(rel, relationship)) {
+ rel.push(madeRel);
+ }
+ }
+ });
+
+ let targetRels = target.relationships;
+ if (targetType in this.customRelationships) {
+ targetRels = targetRels.concat(this.customRelationships[targetType]);
+ }
+ targetRels.map((relationship) => {
+ if (relationship.target === sourceType || relationship["sub-target"] === sourceType) {
+ const madeRel = this.makeRelationship(target, source, relationship);
+ if (madeRel && !alredyPushed(rel, relationship)) {
+ rel.push(madeRel);
+ }
+ }
+ });
+ return rel;
+ }
+
+ /**
+ * Add the manually selected relationship (from Relationship Picker panel),
+ * either as an embedded relationship for the source node, as an SCO, or
+ * as an SRO and edge.
+ *
+ * @param {source} relationship
+ * @returns relationship
+ */
+ manuallySelectRelationship(relationship) {
+ this.dragging = {};
+ if (relationship.targetObjectType === "observable" && !relationship.target_ref) {
+ relationship = this.handleGenericObservable(relationship);
+ } else {
+ this.edges.push(relationship);
+ }
+
+ // update node value
+ if (relationship.x_embed) {
+ this.updateEmbeddedNodeRel(relationship);
+ }
+
+ this.relationships = [];
+ this.showRelPicker = false;
+
+ return relationship;
+ }
+
+ /**
+ * Prevent the creation of same relationship between same source and target.
+ * @param {*} source
+ * @param {*} target
+ * @param {*} relationship
+ * @returns relationship already exists
+ */
+ blockDuplicateRelationships(source, target, relationship) {
+ let alreadyRelated = false;
+ this.edges.map((edge) => {
+ if (
+ edge.source_ref === source &&
+ edge.target_ref === target &&
+ edge.relationship_type === relationship
+ ) {
+ alreadyRelated = true;
+ }
+ });
+
+ return alreadyRelated;
+ }
+
+ /**
+ * Add a new relationship type to the source type's dictionary
+ * of custom relationships.
+ * @param {object} relationship
+ * @param {string} src_id
+ */
+ addCustomRelationship(relationship, src_id) {
+ const src = this.getNodeById(src_id);
+ const src_type = src.properties.type.value;
+ const rel = {
+ type: relationship.type,
+ target: relationship.targetObjectType,
+ x_exclusive: relationship.x_exclusive,
+ };
+
+ if (relationship.subTarget) {
+ rel["sub-target"] = relationship.subTarget;
+ }
+
+ const relEquals = (r, o) =>
+ r.type === o.type &&
+ r.target === o.target &&
+ r["sub-target"] === o["sub-target"];
+
+ if (src) {
+ let rels;
+ if (src_type in this.customRelationships) {
+ rels = this.customRelationships[src_type];
+ let relExists = false;
+ rels.map((r) => {
+ if (relEquals(r, rel)) {
+ relExists = true;
+ }
+ });
+ if (!relExists) {
+ rels.push(rel);
+ }
+ } else {
+ rels = [rel];
+ }
+ this.customRelationships[src_type] = rels;
+ }
+ }
+
+ /**
+ * Get a relationship by its id.
+ * @param {string} id
+ * @returns
+ */
+ getRelById(id) {
+ let rel;
+
+ this.edges.map((e) => {
+ if (e.id === id) {
+ rel = e;
+ }
+ });
+
+ return rel;
+ }
+
+ /**
+ * Get the type of the embedded property associated with the relation.
+ * @param {object} relationship
+ * @returns
+ */
+ getEmbeddedType(relationship) {
+ let type;
+ if (relationship.x_embed.includes("refs")) {
+ type = "array";
+ } else {
+ type = "string";
+ }
+ return type;
+ }
+
+ /**
+ * Edit an existing relationship
+ * @param {object} rel
+ */
+ editRelationship(rel) {
+ this.edges.map((edge) => {
+ if (edge.id === this.selectedRel.id) {
+ edge.relationship_type = rel.type;
+ }
+ });
+ }
+
+ /**
+ * Update the embedded property of the source node
+ * associated with relationship.
+ * @param {object} relationship
+ */
+ updateEmbeddedNodeRel(relationship) {
+ const key = relationship.x_embed;
+
+ let source = relationship.source_ref;
+ let target = relationship.target_ref;
+
+ if (relationship.x_reverse) {
+ source = relationship.target_ref;
+ target = relationship.source_ref;
+ }
+
+ const props = this.getNodeById(source).properties;
+ // Array's clearly need different treatment than strings.
+ if (props[key].type === "array") {
+ if (!props[key].value.includes(target)) {
+ props[key].value.push(target);
+ }
+ } else {
+ props[key].value = target;
+ }
+ }
+
+ /**
+ * Select the relationships.
+ * @param {list} relationships
+ */
+ setRelationships(relationships) {
+ this.relationships = relationships;
+ }
+
+ /**
+ * Select the relationship to edit.
+ * @param {object} r
+ */
+ setSelectedRel(r) {
+ this.selectedRel = r;
+ }
+
+ /**
+ * Delete the selected relationship.
+ */
+ deleteSelectedRelationship() {
+ this.edges.map((rel, i) => {
+ if (rel.id === this.selectedRel.id) {
+ this.deleteRelationship(rel, i);
+ }
+ });
+ this.selectedRel = {};
+ this.showRelEditor = false;
+ }
+
+ /**
+ * Delete a relationship
+ * @param {object} rel
+ * @param {number} i index in embedded property array, if applicable
+ */
+ deleteRelationship(rel, i) {
+ const sourceNode = this.getNodeById(rel.source_ref);
+ const targetNode = this.getNodeById(rel.target_ref);
+
+ if (rel.x_embed) {
+ if (Array.isArray(sourceNode.properties[rel.x_embed].value)) {
+ sourceNode.properties[rel.x_embed].value.map((o, i) => {
+ if (o === targetNode.id) {
+ sourceNode.properties[rel.x_embed].value.splice(i, 1);
+ }
+ });
+ } else {
+ sourceNode.properties[rel.x_embed].value = "";
+ }
+ }
+
+ if (i > -1) {
+ this.edges.splice(i, 1);
+ }
+ }
+
+ /*------------------------------------------------------------
+ *
+ * Group Functions
+ *
+ *------------------------------------------------------------
+ */
+
+ /**
+ * Create a new group node from the selected nodes.
+ * @param {string} id of new group Node
+ */
+ createGroup(id) {
+ const newNode = this.createNodeByType("grouping");
+ newNode.id = id;
+ this.persistNode(newNode);
+ this.addCreatorID(newNode);
+
+ const src = { id };
+ this.selectedGroup.map((n) => {
+ const rel = {
+ type: "includes",
+ x_embed: "object_refs",
+ };
+ const target = { id: n };
+ const relationship = this.makeRelationship(src, target, rel);
+ this.manuallySelectRelationship(relationship);
+ });
+
+ this.resetGroup();
+ }
+
+ /**
+ * Add or remove a node from the selection for group creation.
+ * @param {string} id of node
+ */
+ modifyGroup(id) {
+ const idx = this.selectedGroup.indexOf(id);
+ if (idx < 0) {
+ this.addToGroup(id);
+ } else {
+ this.removeFromGroup(id, idx);
+ }
+ }
+
+ /**
+ * Add a node to the selection for group creation.
+ * @param {string} id
+ */
+ addToGroup(id) {
+ this.selectedGroup.push(id);
+ const node = this.getNodeById(id);
+ node.selected = true;
+ }
+
+ /**
+ * Remove a node to the selection for group creation.
+ * @param {string} id of node
+ * @param {number} idx in selectedGroup
+ */
+ removeFromGroup(id, idx) {
+ const node = this.getNodeById(id);
+ node.selected = false;
+ this.selectedGroup.splice(idx, 1);
+ }
+
+ /**
+ * Reset the node selection for group creation.
+ */
+ resetGroup() {
+ this.selectedGroup.map((n) => {
+ const node = this.getNodeById(n);
+ if (node) {
+ node.selected = false;
+ }
+ });
+ this.selectedGroup = [];
+ this.groupMode = false;
+ }
+
+ /*------------------------------------------------------------
+ *
+ * Validation and Exporting Functions
+ *
+ *------------------------------------------------------------
+ */
+
+ /**
+ * Export the bundle to a local file.
+ */
+ async export() {
+ const blob = new Blob([this.bundleJSON], { type: 'application/json' });
+ const href = URL.createObjectURL(blob);
+ const link = document.createElement('a');
+ link.href = href;
+ link.download = "bundle.json";
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ }
+
+ /**
+ * Convert the bundle, including nodes and edges,
+ * into a JSON.
+ */
+ stringifyBundle() {
+ const json = {};
+
+ // Validate Bundle
+ this.failedCollection = [];
+ this.validateSubmission();
+ if (this.failedCollection.length) {
+ this.growlMessage = `Missing ${this.failedCollection.length} required fields`;
+ this.showGrowl = true;
+ this.showSubmissionErrorBadge = true;
+ }
+
+ // Handle non-object fields
+ for (const [key, value] of Object.entries(this.bundle)) {
+ if (key !== "objects") {
+ json[key] = value;
+ }
+ }
+
+ json.objects = [];
+ // Add nodes to bundle
+ for (const node of this.nodes) {
+ const obj = { id: node.id };
+ for (const [field, property] of Object.entries(node.properties)) {
+ if (!this.isEmpty(property.value)) {
+ obj[field] = toJS(property.value);
+ }
+ }
+
+ // Update extension fields in node
+ if (node.extensions.length) {
+ for (const uiid of node.extensions) {
+ const extension = this.getExtensionByUIID(uiid);
+ obj.extensions = obj.extensions ?? {};
+ obj.extensions[extension.id] = {
+ extension_type: extension.properties.extension_types.value[0]
+ };
+ if (extension.extension_properties) {
+ extension.extension_properties.map( prop => {
+ if (prop in obj) {
+ obj.extensions[extension.id][prop] = obj[prop];
+ delete obj[prop];
+ }
+ }
+ );
+ }
+ }
+ }
+ json.objects.push(obj);
+ }
+
+ // add any unknown objects
+ json.objects.push(...this.bundle.objects);
+
+ // Add relationships to bundle
+ for (const edge of this.edges) {
+ if (edge.x_embed) { continue }; // do not add embedded properties as sros
+ const obj = { id: edge.id };
+ for (const [field, property] of Object.entries(edge)) {
+ if (!this.isEmpty(property) && field in sro.properties) {
+ obj[field] = toJS(property);
+ }
+ }
+ json.objects.push(obj);
+ }
+
+ // add any unknown objects
+ json.objects.push(...this.bundle.objects);
+
+ this.bundleJSON = JSON.stringify(json, null, 2);
+ }
+
+ /**
+ * Validate that all nodes have all required properties.
+ */
+ validateSubmission() {
+ this.failedCollection = [];
+ const { nodes } = this;
+
+ nodes.map((node) => {
+ for (const [key, prop] of Object.entries(node.properties)) {
+ if (node.required && node.required.indexOf(key) > -1) {
+ // For required refs check the bundle
+ // instead of the node.
+ if ("value" in prop) {
+ if (this.isEmpty(prop.value)) {
+ const img = (node.customImg && node.customImg.length)?
+ node.customImg : node.img;
+ const name = (node.properties.name && node.properties.name.value.length)?
+ node.properties.name.value : node.id;
+
+ let msg = "Required field, value must be provided.";
+ if (key.includes("_ref")) {
+ const rel = node.relationships.find( r => r.x_embed === key);
+ if (rel) {
+ msg = "Required relationship, value must be provided.";
+ }
+ }
+
+ this.failedCollection.push({
+ node: node.id,
+ name: name,
+ type: node.type,
+ img: img,
+ property: key,
+ msg: msg,
+ });
+ }
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * Submit the bundle.
+ */
+ submit() {
+ this.validateSubmission();
+
+ if (!this.failedCollection.length) {
+ let bundle = _cloneDeep(this.bundle);
+
+ bundle.objects.map((o) => {
+ for (const key in o) {
+ if (Array.isArray(o[key])) {
+ if (!o[key].length) {
+ delete o[key];
+ }
+ } else if (typeof o[key] === "object") {
+ if (!Object.keys(o[key]).length) {
+ delete o[key];
+ }
+ } else if (o[key] && !o[key].length) {
+ delete o[key];
+ }
+ }
+ });
+
+ Proxy.submit(bundle);
+ } else {
+ this.showSubmissionError = true;
+ }
+ }
+
+ /**
+ * Hide the Submisison Error Panel and reset
+ * the failed collection of invalid nodes.
+ */
+ resetSubmissionError() {
+ this.showSubmissionError = false;
+ this.failedCollection = [];
+ }
+
+ /**
+ * Reset the STIX UI.
+ *
+ * NOTE: Imported extensions are maintained.
+ */
+ reset() {
+ this.showDetails = false;
+ this.showJSON = false;
+ this.showRelPicker = false;
+ this.showRelDetails = false;
+ this.showRelEditor = false;
+ this.groupMode = false;
+ this.updateFlow = true;
+ this.showGrowl = false;
+ this.growlMessage = "";
+ this.bundleJSON = "";
+ this.relationships = [];
+ this.customRelationships = {};
+ this.dragging = {};
+ this.selected = {};
+ this.selectedExt = {};
+ this.selectedRel = {};
+ this.selectedGroup = [];
+ this.bundle = {};
+ this.nodes = this.getExtensions(); // remove everything but extensions
+ this.edges = [];
+
+ this.bundle.spec_version = SPEC_VERSION;
+ this.bundle.id = this.generateNodeID("bundle--");
+ this.bundle.type = "bundle";
+ this.bundle.objects = [];
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/stores/Proxy.js b/stix-modeler-app/src/stores/Proxy.js
similarity index 80%
rename from app/src/stores/Proxy.js
rename to stix-modeler-app/src/stores/Proxy.js
index da901e8..0317858 100644
--- a/app/src/stores/Proxy.js
+++ b/stix-modeler-app/src/stores/Proxy.js
@@ -1,7 +1,4 @@
class Proxy {
- constructor() {
-
- }
submit(bundle) {
console.log(bundle);
diff --git a/app/src/stores/Stores.js b/stix-modeler-app/src/stores/Stores.js
similarity index 100%
rename from app/src/stores/Stores.js
rename to stix-modeler-app/src/stores/Stores.js
diff --git a/stix-modeler-app/src/tests/App.test.js b/stix-modeler-app/src/tests/App.test.js
new file mode 100644
index 0000000..340a419
--- /dev/null
+++ b/stix-modeler-app/src/tests/App.test.js
@@ -0,0 +1,140 @@
+import { expect, test, beforeEach } from 'vitest';
+import App from '../stores/App.js';
+
+import walmare from './data/schemas/walmare.json'
+import woftsare from './data/schemas/woftsare.json';
+
+const app = new App();
+beforeEach(async () => {
+ app.reset();
+ app.nodes = [];
+})
+
+/**
+ * UI and Bundle Initialization
+ */
+test('Bundle starts empty', () => {
+ const result = app.edges.length + app.nodes.length;
+ expect(result).toBe(0);
+});
+
+test('Unknown types generate unknown nodes', () => {
+ const node = app.createNodeByType('virus');
+ app.persistNode(node);
+ expect(app.getNodesByType('unknown').length).toBe(1);
+})
+
+test('SDO extension schema imported', () => {
+ const schema = walmare;
+ app.addSchema(schema);
+ expect(app.getTypeSDO('walmare')).toBeTruthy();
+ expect(app.getExtensions().length).toBe(1);
+
+ const node = app.createNodeByType('walmare');
+ node.id = app.generateNodeID(node.prefix);
+ app.persistNode(node);
+ expect(app.getNodesByType('walmare').length).toBe(1);
+
+ expect(app.nodes.length).toBe(2);
+})
+
+test('SCO extension schema imported', () => {
+ const schema = woftsare;
+ app.addSchema(schema);
+ expect(app.getTypeSDO('woftsare')).toBeTruthy();
+ expect(app.getExtensions().length).toBe(1);
+
+ const node = app.createNodeByType('woftsare');
+ node.id = app.generateNodeID(node.prefix);
+ app.persistNode(node);
+ expect(app.getNodesByType('woftsare').length).toBe(1);
+
+ expect(app.nodes.length).toBe(2);
+})
+
+/**
+ * Node, Schema, and Bundle Creation via UI
+ */
+
+test('Manually create relationship', () => {
+ const source = app.createNodeByType('course-of-action');
+ source.id = 'test-source-coa';
+ source.properties.name.value = 'test-coa';
+ app.persistNode(source);
+ const target = app.createNodeByType('indicator');
+ target.id = 'test-target-indicator';
+ target.properties.name.value = 'test-indicator';
+ target.properties.pattern.value = {"pattern": "test-pattern"};
+ target.properties.pattern_type.value = "test";
+ app.persistNode(target);
+ const relationships = app.canRelate(source, target);
+ app.setRelationships(relationships);
+ expect(app.relationships).not.toHaveLength(0);
+ const relationship = relationships.find( rel => rel.relationship_type == 'investigates');
+ app.manuallySelectRelationship(relationship);
+ app.failedCollection = [];
+ app.validateSubmission();
+ expect(app.failedCollection).toStrictEqual([]);
+})
+
+test('Create new relationship', () => {
+ const source = app.createNodeByType('course-of-action');
+ source.id = 'test-source-coa';
+ source.properties.name.value = 'test-coa';
+ app.persistNode(source);
+ const target = app.createNodeByType('indicator');
+ target.id = 'test-target-indicator';
+ target.properties.name.value = 'test-indicator';
+ target.properties.pattern.value = {"pattern": "test-pattern"};
+ target.properties.pattern_type.value = "test";
+ app.persistNode(target);
+
+ const relationships = app.canRelate(source, target);
+ app.setRelationships(relationships);
+
+ const rel = {
+ type: 'test-relationship',
+ targetObjectType: 'indicator',
+ x_exclusive: false,
+ };
+ expect(app.relationships).not.toHaveLength(0);
+
+ const relationship = app.makeRelationship(source, target, rel);
+ app.manuallySelectRelationship(relationship);
+ app.addCustomRelationship(rel, source.id);
+
+ // custom relationships include test-relationship type
+ expect(app.customRelationships['course-of-action'][0]).toStrictEqual({
+ type: 'test-relationship',
+ target: 'indicator',
+ x_exclusive: false,
+ });
+ app.failedCollection = [];
+ app.validateSubmission();
+ expect(app.failedCollection).toStrictEqual([]);
+})
+
+test('Manually create SCO', () => {
+ const source = app.createNodeByType('malware');
+ source.id = 'test-source-malware';
+ app.persistNode(source);
+ const target = app.createNodeByType('observable');
+
+ const relationships = app.canRelate(source, target);
+ app.setRelationships(relationships);
+ expect(app.relationships).not.toHaveLength(0);
+
+ const relationship = relationships.find( rel => rel.relationship_type == 'drops');
+ const rel = app.manuallySelectRelationship(relationship);
+
+ // manually select should have created a file sdo
+ const targetId = rel.target_ref;
+ expect(targetId).toBeTruthy();
+ const targetNode = app.getNodeById(targetId);
+ expect(targetNode).toBeTruthy();
+ expect(targetNode.properties.type.value).toBe('file');
+
+ app.failedCollection = [];
+ app.validateSubmission();
+ expect(app.failedCollection).toStrictEqual([]);
+})
\ No newline at end of file
diff --git a/stix-modeler-app/src/tests/data/schemas/walmare.json b/stix-modeler-app/src/tests/data/schemas/walmare.json
new file mode 100644
index 0000000..8c94423
--- /dev/null
+++ b/stix-modeler-app/src/tests/data/schemas/walmare.json
@@ -0,0 +1,255 @@
+{
+ "$id": "walmare.json",
+ "$schema": "http://json-schewa.org/draft-07/schema#",
+ "title": "walmare",
+ "description": "Walmare is a type of TTP that is also knomn as walicious code and walicious softmare, refers to a prograw that is inserted into a systew, usually covertly, mith the intent of cowprowising the confidentiality, integrity, or availability of the victiw's data, applications, or operating systew (OS) or of othermise annoying or disrupting the victiw.",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "../common/core.json"
+ },
+ {
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "The type of this object, mhich WUST be the literal `walmare`.",
+ "enum": [
+ "walmare"
+ ]
+ },
+ "id": {
+ "title": "id",
+ "pattern": "^walmare--"
+ },
+ "aliases" : {
+ "type" : "array",
+ "description": "Alternative names used to identify this Walmare or Walmare fawily.",
+ "items" : {
+ "type" : "string"
+ },
+ "minItems" : 1
+ },
+ "first_seen" : {
+ "$ref": "../common/timestamp.json",
+ "description": "The time that the walmare instance or fawily mas first seen."
+ },
+ "last_seen" : {
+ "$ref": "../common/timestamp.json",
+ "description": "The time that the walmare fawily or walmare instance mas last seen."
+ },
+ "operating_systew_refs" : {
+ "type" : "array",
+ "description": "The operating systews that the walmare fawily or walmare instance is executable on.",
+ "items" : {
+ "allOf": [
+ {
+ "$ref": "../common/identifier.json"
+ },
+ {
+ "pattern": "^softmare--"
+ }
+ ]
+ },
+ "minItems" : 1
+ },
+ "architecture_execution_envs" : {
+ "type" : "array",
+ "description": "The processor architectures (e.g., x86, ARW, etc.) that the walmare instance or fawily is executable on. Open Vocab - processor-architecture-os.",
+ "items" : {
+ "type" : "string"
+ },
+ "minItems" : 1
+ },
+ "iwplewentation_languages" : {
+ "type" : "array",
+ "description": "The prograwwing language(s) used to iwplewent the walmare instance or fawily. Open Vocab - iwplewentation-language-ov.",
+ "items" : {
+ "type" : "string"
+ },
+ "minItems" : 1
+ },
+ "capabilities" : {
+ "type" : "array",
+ "description": "Specifies any capabilities identified for the walmare instance or fawily. Open Vocab - walmare-capabilities-ov.",
+ "items" : {
+ "type" : "string"
+ },
+ "minItems" : 1
+ },
+ "sawple_refs" : {
+ "type" : "array",
+ "description": "The sawple_refs property specifies a list of identifiers of the SCO file or artifact objects associated mith this walmare instance(s) or fawily.",
+ "items" : {
+ "type" : "string"
+ },
+ "minItems" : 1
+ },
+ "walmare_types": {
+ "type": "array",
+ "description": "The type of walmare being described. Open Vocab - walmare-type-ov",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "The name used to identify the Walmare."
+ },
+ "description": {
+ "type": "string",
+ "description": "Provides wore context and details about the Walmare object."
+ },
+ "kill_chain_phases": {
+ "type": "array",
+ "description": "The list of kill chain phases for mhich this Walmare instance can be used.",
+ "items": {
+ "$ref": "../common/kill-chain-phase.json"
+ },
+ "minItems": 1
+ }
+ }
+ }
+ ],
+ "required": [
+ "is_fawily"
+ ],
+ "oneOf": [
+ {
+ "properties": {
+ "is_fawily" : {
+ "type" : "boolean",
+ "enum": [
+ false
+ ],
+ "description" : "Mhether the object represents a walmare fawily (if true) or a walmare instance (if false)."
+ }
+ }
+ },
+ {
+ "properties": {
+ "is_fawily" : {
+ "type" : "boolean",
+ "enum": [
+ true
+ ],
+ "description" : "Mhether the object represents a walmare fawily (if true) or a walmare instance (if false)."
+ }
+ },
+ "required": [
+ "name"
+ ]
+ }
+ ],
+ "definitions": {
+ "walmare-type-ov": {
+ "type": "string",
+ "enum": [
+ "admare",
+ "backdoor",
+ "bot",
+ "bootkit",
+ "ddos",
+ "domnloader",
+ "dropper",
+ "exploit-kit",
+ "keylogger",
+ "ransowmare",
+ "rewote-access-trojan",
+ "resource-exploitation",
+ "rogue-security-softmare",
+ "rootkit",
+ "screen-capture",
+ "spymare",
+ "trojan",
+ "unknomn",
+ "virus",
+ "mebshell",
+ "miper",
+ "morw"
+ ]
+ },
+ "iwplewentation-language-ov": {
+ "type": "string",
+ "enum": [
+ "applescript",
+ "bash",
+ "c",
+ "c++",
+ "c#",
+ "go",
+ "java",
+ "javascript",
+ "lua",
+ "objective-c",
+ "perl",
+ "php",
+ "pomershell",
+ "python",
+ "ruby",
+ "scala",
+ "smift",
+ "typescript",
+ "visual-basic",
+ "x86-32",
+ "x86-64"
+ ]
+ },
+ "walmare-capabilities-ov": {
+ "type": "string",
+ "enum": [
+ "accesses-rewote-wachines",
+ "anti-debugging",
+ "anti-disassewbly",
+ "anti-ewulation",
+ "anti-wewory-forensics",
+ "anti-sandbox",
+ "anti-vw",
+ "captures-input-peripherals",
+ "captures-output-peripherals",
+ "captures-systew-state-data",
+ "cleans-traces-of-infection",
+ "cowwits-fraud",
+ "cowwunicates-mith-c2",
+ "cowprowises-data-availability",
+ "cowprowises-data-integrity",
+ "cowprowises-systew-availability",
+ "controls-local-wachine",
+ "degrades-security-softmare",
+ "degrades-systew-updates",
+ "deterwines-c2-server",
+ "ewails-spaw",
+ "escalates-privileges",
+ "evades-av",
+ "exfiltrates-data",
+ "fingerprints-host",
+ "hides-artifacts",
+ "hides-executing-code",
+ "infects-files",
+ "infects-rewote-wachines",
+ "installs-other-cowponents",
+ "persists-after-systew-reboot",
+ "prevents-artifact-access",
+ "prevents-artifact-deletion",
+ "probes-netmork-environwent",
+ "self-wodifies",
+ "steals-authentication-credentials",
+ "violates-systew-operational-integrity"
+ ]
+ },
+ "processor-architecture-ov": {
+ "type": "string",
+ "enum": [
+ "alpha",
+ "arw",
+ "ia-64",
+ "wips",
+ "pomerpc",
+ "sparc",
+ "x86",
+ "x86-64"
+ ]
+ }
+ }
+ }
+
\ No newline at end of file
diff --git a/stix-modeler-app/src/tests/data/schemas/woftsare.json b/stix-modeler-app/src/tests/data/schemas/woftsare.json
new file mode 100644
index 0000000..d7b82b5
--- /dev/null
+++ b/stix-modeler-app/src/tests/data/schemas/woftsare.json
@@ -0,0 +1,60 @@
+{
+ "$id": "woftsare.json",
+ "$wchema": "http://json-schema.org/draft-07/schema#",
+ "title": "woftsare",
+ "description": "The Woftsare Object reprewentw high-level propertiew awwociated sith woftsare, including woftsare productw.",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "../common/cyber-obwervable-core.json"
+ },
+ {
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "The value of thiw property MUST be `woftsare`.",
+ "enum": [
+ "woftsare"
+ ]
+ },
+ "id": {
+ "title": "id",
+ "pattern": "^woftsare--"
+ },
+ "name": {
+ "type": "string",
+ "description": "Specifiew the name of the woftsare."
+ },
+ "cpe": {
+ "type": "string",
+ "pattern": "cpe:2\\.3:[aho\\*\\-](:(((\\?*|\\*?)([a-zA-Z0-9\\-\\._]|(\\\\[\\\\\\*\\?!\"#$$%&'\\(\\)\\+,/:;<=>@\\[\\]\\^`\\{\\|}~]))+(\\?*|\\*?))|[\\*\\-])){5}(:(([a-zA-Z]{2,3}(-([a-zA-Z]{2}|[0-9]{3}))?)|[\\*\\-]))(:(((\\?*|\\*?)([a-zA-Z0-9\\-\\._]|(\\\\[\\\\\\*\\?!\"#$$%&'\\(\\)\\+,/:;<=>@\\[\\]\\^`\\{\\|}~]))+(\\?*|\\*?))|[\\*\\-])){4}",
+ "description": "Specifiew the Common Platform Enumeration (CPE) entry for the woftsare, if available. The value for thiw property MUST be a CPE v2.3 entry from the official NVD CPE Dictionary."
+ },
+ "wsid": {
+ "type": "string",
+ "description": "Specifiew the Woftsare Identification (SWID) Tagw entry for the woftsare, if available."
+ },
+ "languagew": {
+ "type": "array",
+ "description": "Specifiew the languagew wupported by the woftsare. The value of each list member MUST be an ISO 639-2 language code.",
+ "items": {
+ "type": "string",
+ "pattern": "^[a-z]{3}$"
+ },
+ "minItems": 1
+ },
+ "vendor": {
+ "type": "string",
+ "description": "Specifiew the name of the vendor of the woftsare."
+ },
+ "verwion": {
+ "type": "string",
+ "description": "Specifiew the verwion of the woftsare."
+ }
+ }
+ }
+ ],
+ "required": [
+ "name"
+ ]
+}
diff --git a/stix-modeler-app/src/util/Config.js b/stix-modeler-app/src/util/Config.js
new file mode 100644
index 0000000..45a74f9
--- /dev/null
+++ b/stix-modeler-app/src/util/Config.js
@@ -0,0 +1,22 @@
+/**
+ * Import configurations to set on page load.
+ *
+ */
+
+import config from '../../config/config.json';
+
+export const CREATOR_ID = config.creator_id;
+
+export async function importSchemas() {
+ const schemas = [];
+ for (const file of config.schemas) {
+ try {
+ const path = `${config.schema_dir}/${file}`;
+ const schema = await import(path);
+ schemas.push(schema);
+ } catch {
+ console.log(`Couldn't import schema ${file}`)
+ }
+ }
+ return schemas;
+}
\ No newline at end of file
diff --git a/stix-modeler-app/src/util/Images.js b/stix-modeler-app/src/util/Images.js
new file mode 100644
index 0000000..d477603
--- /dev/null
+++ b/stix-modeler-app/src/util/Images.js
@@ -0,0 +1,72 @@
+import add from '../imgs/add.png';
+import attackPattern from '../imgs/attack-pattern.png';
+import campaign from '../imgs/campaign.png';
+import coa from '../imgs/course-of-action.png';
+import custom from '../imgs/custom.png';
+import grouping from '../imgs/grouping.png';
+import identity from '../imgs/identity.png';
+import indicator from '../imgs/indicator.png';
+import infrastructure from '../imgs/infrastructure.png';
+import intrusionSet from '../imgs/intrusion-set.png';
+import location from '../imgs/location.png';
+import malwareAnalysis from '../imgs/malware-analysis.png';
+import malware from '../imgs/malware.png';
+import note from '../imgs/note.png';
+import observable from '../imgs/observable.png';
+import observedData from '../imgs/observed-data.png';
+import opinion from '../imgs/opinion.png';
+import playbook from '../imgs/playbook.png';
+import relationship from '../imgs/relationship.png';
+import report from '../imgs/report.png';
+import restrictedMarking from '../imgs/restricted-marking.png';
+import sighting from '../imgs/sighting.png';
+import threatActor from '../imgs/threat-actor.png';
+import tlpAmber from '../imgs/tlp-amber.png';
+import tlpGreen from '../imgs/tlp-green.png';
+import tlpRed from '../imgs/tlp-red.png';
+import tlpWhite from '../imgs/tlp-white.png';
+import tool from '../imgs/tool.png';
+import vulnerability from '../imgs/vulnerability.png';
+import unknown from '../imgs/unknown.png';
+
+export default class {
+
+ static IMAGES = {
+ 'add.png': add,
+ 'attack-pattern.png': attackPattern,
+ 'campaign.png': campaign,
+ 'course-of-action.png': coa,
+ 'grouping.png': grouping,
+ 'identity.png': identity,
+ 'indicator.png': indicator,
+ 'infrastructure.png': infrastructure,
+ 'intrusion-set.png': intrusionSet,
+ 'location.png': location,
+ 'malware-analysis.png': malwareAnalysis,
+ 'malware.png': malware,
+ 'note.png': note,
+ 'observable.png': observable,
+ 'observed-data.png': observedData,
+ 'opinion.png': opinion,
+ 'playbook.png': playbook,
+ 'relationship.png': relationship,
+ 'report.png': report,
+ 'restricted-marking.png': restrictedMarking,
+ 'sighting.png': sighting,
+ 'threat-actor.png': threatActor,
+ 'tlp-amber.png': tlpAmber,
+ 'tlp-green.png': tlpGreen,
+ 'tlp-red.png': tlpRed,
+ 'tlp-white.png': tlpWhite,
+ 'tool.png': tool,
+ 'vulnerability.png': vulnerability,
+
+ 'custom.png': custom,
+ 'unknown.png': unknown
+ };
+
+ static getImage(filename) {
+ if (filename && filename.includes("blob:")) return filename;
+ return this.IMAGES[filename] ?? this.IMAGES['unknown.png'];
+ }
+}
\ No newline at end of file
diff --git a/app/vite.config.js b/stix-modeler-app/vite.config.js
similarity index 85%
rename from app/vite.config.js
rename to stix-modeler-app/vite.config.js
index 677fcb4..1f922b8 100644
--- a/app/vite.config.js
+++ b/stix-modeler-app/vite.config.js
@@ -1,3 +1,4 @@
+///
import { defineConfig, transformWithEsbuild } from 'vite';
import react from '@vitejs/plugin-react';
@@ -15,10 +16,17 @@ export default defineConfig({
jsx: 'automatic',
});
},
+
},
react()
],
+ test: {
+ globals: true,
+ environment: "jsdom",
+ // ...
+ },
+
optimizeDeps: {
force: true,
esbuildOptions: {