From e63dad2106b30ce99a25ab0f5073d0c7e19492c4 Mon Sep 17 00:00:00 2001 From: Uncle Fatso Date: Mon, 23 Dec 2024 15:01:54 +0300 Subject: [PATCH] initial commit for public repo Signed-off-by: Uncle Fatso --- .env.template | 1 + .eslintrc.json | 40 + .gitignore | 5 + .nvmrc | 1 + .prettierrc | 4 + assets/favicon.svg | 5 + assets/index.html | 46 + assets/meta-image.png | Bin 0 -> 221756 bytes assets/mock.image.js | 3 + assets/mock.style.js | 2 + images.d.ts | 3 + jest.config.js | 11 + package-lock.json | 16809 ++++++++++++++++ package.json | 69 + setupJest.js | 9 + src/App.css | 52 + src/App.test.tsx | 11 + src/App.tsx | 236 + src/Connection.ts | 540 + src/assets/ghost-logo.svg | 1 + src/assets/inner-circle.svg | 42 + src/assets/inner-circle_old.svg | 16 + src/assets/outer-circle.svg | 43 + src/assets/world-map.svg | 1 + src/common/SortedCollection.ts | 240 + src/common/common.test.ts | 83 + src/common/feed.ts | 243 + src/common/helpers.ts | 82 + src/common/id.ts | 9 + src/common/index.ts | 11 + src/common/iterators.ts | 84 + src/common/stringify.ts | 8 + src/common/types.ts | 122 + src/components/Ago.tsx | 100 + src/components/Chain/Chain.css | 34 + src/components/Chain/Chain.tsx | 110 + src/components/Chain/Header.css | 42 + src/components/Chain/Header.tsx | 100 + src/components/Chain/Tab.css | 24 + src/components/Chain/Tab.tsx | 35 + src/components/Chain/index.ts | 3 + src/components/Filter.css | 38 + src/components/Filter.tsx | 129 + src/components/Icon.css | 15 + src/components/Icon.tsx | 73 + .../List/Column/BlockHashColumn.tsx | 46 + .../List/Column/BlockNumberColumn.tsx | 27 + .../List/Column/BlockPropagationColumn.tsx | 31 + .../List/Column/BlockTimeColumn.tsx | 30 + src/components/List/Column/Column.css | 42 + src/components/List/Column/Column.tsx | 113 + .../List/Column/CpuArchitectureColumn.tsx | 26 + src/components/List/Column/CpuColumn.tsx | 26 + src/components/List/Column/CpuCoresColumn.tsx | 26 + src/components/List/Column/DownloadColumn.tsx | 45 + .../List/Column/FinalizedBlockColumn.tsx | 27 + .../List/Column/FinalizedHashColumn.tsx | 47 + .../List/Column/IsVirtualMachineColumn.tsx | 27 + .../List/Column/LastBlockColumn.tsx | 32 + .../List/Column/LinuxDistroColumn.tsx | 27 + .../List/Column/LinuxKernelColumn.tsx | 26 + src/components/List/Column/LocationColumn.tsx | 37 + src/components/List/Column/MemoryColumn.tsx | 26 + src/components/List/Column/NameColumn.tsx | 29 + .../List/Column/NetworkIdColumn.tsx | 50 + .../List/Column/OperatingSystemColumn.tsx | 26 + src/components/List/Column/PeersColumn.tsx | 26 + .../List/Column/StateCacheColumn.tsx | 45 + src/components/List/Column/TxsColumn.tsx | 26 + src/components/List/Column/UploadColumn.tsx | 45 + src/components/List/Column/UptimeColumn.tsx | 32 + .../List/Column/ValidatorColumn.tsx | 49 + src/components/List/Column/VersionColumn.tsx | 26 + src/components/List/Column/index.ts | 27 + src/components/List/List.css | 30 + src/components/List/List.tsx | 205 + src/components/List/Row.css | 27 + src/components/List/Row.tsx | 116 + src/components/List/THead.css | 24 + src/components/List/THead.tsx | 48 + src/components/List/THeadCell.tsx | 63 + src/components/List/index.ts | 5 + src/components/Map/Location.css | 156 + src/components/Map/Location.tsx | 167 + src/components/Map/Map.css | 18 + src/components/Map/Map.tsx | 164 + src/components/Map/index.ts | 2 + src/components/Sparkline.css | 18 + src/components/Sparkline.tsx | 101 + src/components/Stats/Stats.css | 56 + src/components/Stats/Stats.tsx | 189 + src/components/Stats/index.ts | 1 + src/components/Tile.css | 43 + src/components/Tile.tsx | 17 + src/components/Tooltip.css | 80 + src/components/Tooltip.tsx | 96 + src/components/Truncate.tsx | 30 + src/components/index.ts | 11 + src/icons/alert.svg | 1 + src/icons/archive.svg | 1 + src/icons/arrow-down.svg | 1 + src/icons/arrow-left.svg | 1 + src/icons/arrow-right.svg | 1 + src/icons/arrow-small-down.svg | 1 + src/icons/arrow-small-left.svg | 1 + src/icons/arrow-small-right.svg | 1 + src/icons/arrow-small-up.svg | 1 + src/icons/arrow-up.svg | 1 + src/icons/assets.d.ts | 17 + src/icons/beaker.svg | 1 + src/icons/bell.svg | 1 + src/icons/book.svg | 1 + src/icons/bookmark.svg | 1 + src/icons/briefcase.svg | 1 + src/icons/broadcast.svg | 1 + src/icons/browser.svg | 1 + src/icons/bug.svg | 1 + src/icons/calendar.svg | 1 + src/icons/check-square-regular.svg | 1 + src/icons/check-square-solid.svg | 1 + src/icons/check.svg | 1 + src/icons/checklist.svg | 1 + src/icons/chevron-down.svg | 1 + src/icons/chevron-left.svg | 1 + src/icons/chevron-right.svg | 1 + src/icons/chevron-up.svg | 1 + src/icons/circle-regular.svg | 1 + src/icons/circle-slash.svg | 1 + src/icons/circle-solid.svg | 1 + src/icons/circuit-board.svg | 1 + src/icons/clippy.svg | 1 + src/icons/clock.svg | 1 + src/icons/cloud-download.svg | 1 + src/icons/cloud-upload.svg | 1 + src/icons/code.svg | 1 + src/icons/comment-discussion.svg | 1 + src/icons/comment.svg | 1 + src/icons/credit-card.svg | 1 + src/icons/cube-alt.svg | 1 + src/icons/cube.svg | 1 + src/icons/dashboard.svg | 1 + src/icons/database.svg | 1 + src/icons/desktop-download.svg | 1 + src/icons/device-camera-video.svg | 1 + src/icons/device-camera.svg | 1 + src/icons/device-desktop.svg | 1 + src/icons/device-mobile.svg | 1 + src/icons/diff-added.svg | 1 + src/icons/diff-ignored.svg | 1 + src/icons/diff-modified.svg | 1 + src/icons/diff-removed.svg | 1 + src/icons/diff-renamed.svg | 1 + src/icons/diff.svg | 1 + src/icons/ellipsis-v-solid.svg | 1 + src/icons/ellipsis.svg | 1 + src/icons/eye.svg | 1 + src/icons/file-binary.svg | 1 + src/icons/file-code.svg | 1 + src/icons/file-directory.svg | 1 + src/icons/file-media.svg | 1 + src/icons/file-pdf.svg | 1 + src/icons/file-submodule.svg | 1 + src/icons/file-symlink-directory.svg | 1 + src/icons/file-symlink-file.svg | 1 + src/icons/file-zip.svg | 1 + src/icons/file.svg | 1 + src/icons/finalized.svg | 9 + src/icons/fingerprint.svg | 1 + src/icons/flame.svg | 1 + src/icons/fold.svg | 1 + src/icons/gear.svg | 1 + src/icons/ghost-logo.svg | 1 + src/icons/gift.svg | 1 + src/icons/gist-secret.svg | 1 + src/icons/gist.svg | 1 + src/icons/git-branch.svg | 1 + src/icons/git-commit.svg | 1 + src/icons/git-compare.svg | 1 + src/icons/git-merge.svg | 1 + src/icons/git-pull-request.svg | 1 + src/icons/globe-solid.svg | 1 + src/icons/globe.svg | 1 + src/icons/grabber.svg | 1 + src/icons/graph.svg | 1 + src/icons/hatching.svg | 76 + src/icons/heart.svg | 1 + src/icons/history.svg | 1 + src/icons/home.svg | 1 + src/icons/horizontal-rule.svg | 1 + src/icons/hubot.svg | 1 + src/icons/inbox.svg | 1 + src/icons/info.svg | 1 + src/icons/issue-closed.svg | 1 + src/icons/issue-opened.svg | 1 + src/icons/issue-reopened.svg | 1 + src/icons/italic.svg | 1 + src/icons/jersey.svg | 1 + src/icons/kebab-horizontal.svg | 1 + src/icons/kebab-vertical.svg | 1 + src/icons/key.svg | 1 + src/icons/keyboard.svg | 1 + src/icons/law.svg | 1 + src/icons/light-bulb.svg | 1 + src/icons/link-external.svg | 1 + src/icons/link.svg | 1 + src/icons/list-alt-regular.svg | 1 + src/icons/list-ordered.svg | 1 + src/icons/list-unordered.svg | 1 + src/icons/location.svg | 1 + src/icons/lock.svg | 1 + src/icons/logo-gist.svg | 1 + src/icons/logo-github.svg | 1 + src/icons/mail-read.svg | 1 + src/icons/mail.svg | 1 + src/icons/map-marked-alt-solid.svg | 1 + src/icons/map-marker-alt-solid.svg | 1 + src/icons/map-pin-solid.svg | 1 + src/icons/mark-github.svg | 1 + src/icons/markdown.svg | 1 + src/icons/megaphone.svg | 1 + src/icons/memory-solid.svg | 1 + src/icons/mention.svg | 1 + src/icons/microchip-solid.svg | 1 + src/icons/milestone.svg | 1 + src/icons/mirror.svg | 1 + src/icons/mortar-board.svg | 1 + src/icons/mute.svg | 1 + src/icons/network.svg | 1 + src/icons/no-newline.svg | 1 + src/icons/note.svg | 1 + src/icons/octoface.svg | 1 + src/icons/organization.svg | 1 + src/icons/package.svg | 1 + src/icons/paintcan.svg | 1 + src/icons/pencil.svg | 1 + src/icons/person.svg | 1 + src/icons/pin.svg | 1 + src/icons/plug.svg | 1 + src/icons/plus-small.svg | 1 + src/icons/plus.svg | 1 + src/icons/polkadot-js.svg | 1 + src/icons/primitive-dot.svg | 1 + src/icons/primitive-square.svg | 1 + src/icons/project.svg | 1 + src/icons/pulse.svg | 1 + src/icons/question-solid.svg | 1 + src/icons/question.svg | 1 + src/icons/quote.svg | 1 + src/icons/radio-tower.svg | 1 + src/icons/reply.svg | 1 + src/icons/repo-clone.svg | 1 + src/icons/repo-force-push.svg | 1 + src/icons/repo-forked.svg | 1 + src/icons/repo-pull.svg | 1 + src/icons/repo-push.svg | 1 + src/icons/repo.svg | 1 + src/icons/report.svg | 1 + src/icons/rocket.svg | 1 + src/icons/rss.svg | 1 + src/icons/ruby.svg | 1 + src/icons/screen-full.svg | 1 + src/icons/screen-normal.svg | 1 + src/icons/search.svg | 1 + src/icons/server.svg | 1 + src/icons/settings.svg | 1 + src/icons/shield.svg | 1 + src/icons/sign-in.svg | 1 + src/icons/sign-out.svg | 1 + src/icons/smiley.svg | 1 + src/icons/square-regular.svg | 1 + src/icons/square-solid.svg | 1 + src/icons/squirrel.svg | 1 + src/icons/star.svg | 1 + src/icons/stop.svg | 1 + src/icons/sync.svg | 1 + src/icons/tag.svg | 1 + src/icons/tasklist.svg | 1 + src/icons/telescope.svg | 1 + src/icons/terminal.svg | 1 + src/icons/text-size.svg | 1 + src/icons/three-bars.svg | 1 + src/icons/thumbsdown.svg | 1 + src/icons/thumbsup.svg | 1 + src/icons/tools.svg | 1 + src/icons/trashcan.svg | 1 + src/icons/triangle-down.svg | 1 + src/icons/triangle-left.svg | 1 + src/icons/triangle-right.svg | 1 + src/icons/triangle-up.svg | 1 + src/icons/turingnetwork.svg | 76 + src/icons/unfold.svg | 1 + src/icons/unmute.svg | 1 + src/icons/unverified.svg | 1 + src/icons/verified.svg | 1 + src/icons/versions.svg | 1 + src/icons/watch.svg | 1 + src/icons/x.svg | 1 + src/icons/zap.svg | 1 + src/index.css | 10 + src/index.tsx | 15 + src/persist/Persistent.ts | 51 + src/persist/PersistentObject.ts | 23 + src/persist/PersistentSet.ts | 35 + src/persist/index.ts | 3 + src/state.ts | 328 + src/utils.ts | 113 + tsconfig.json | 29 + webpack.config.js | 52 + 308 files changed, 23277 insertions(+) create mode 100644 .env.template create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 .prettierrc create mode 100644 assets/favicon.svg create mode 100644 assets/index.html create mode 100644 assets/meta-image.png create mode 100644 assets/mock.image.js create mode 100644 assets/mock.style.js create mode 100644 images.d.ts create mode 100644 jest.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 setupJest.js create mode 100644 src/App.css create mode 100644 src/App.test.tsx create mode 100644 src/App.tsx create mode 100644 src/Connection.ts create mode 100644 src/assets/ghost-logo.svg create mode 100644 src/assets/inner-circle.svg create mode 100644 src/assets/inner-circle_old.svg create mode 100644 src/assets/outer-circle.svg create mode 100644 src/assets/world-map.svg create mode 100644 src/common/SortedCollection.ts create mode 100644 src/common/common.test.ts create mode 100644 src/common/feed.ts create mode 100644 src/common/helpers.ts create mode 100644 src/common/id.ts create mode 100644 src/common/index.ts create mode 100644 src/common/iterators.ts create mode 100644 src/common/stringify.ts create mode 100644 src/common/types.ts create mode 100644 src/components/Ago.tsx create mode 100644 src/components/Chain/Chain.css create mode 100644 src/components/Chain/Chain.tsx create mode 100644 src/components/Chain/Header.css create mode 100644 src/components/Chain/Header.tsx create mode 100644 src/components/Chain/Tab.css create mode 100644 src/components/Chain/Tab.tsx create mode 100644 src/components/Chain/index.ts create mode 100644 src/components/Filter.css create mode 100644 src/components/Filter.tsx create mode 100644 src/components/Icon.css create mode 100644 src/components/Icon.tsx create mode 100644 src/components/List/Column/BlockHashColumn.tsx create mode 100644 src/components/List/Column/BlockNumberColumn.tsx create mode 100644 src/components/List/Column/BlockPropagationColumn.tsx create mode 100644 src/components/List/Column/BlockTimeColumn.tsx create mode 100644 src/components/List/Column/Column.css create mode 100644 src/components/List/Column/Column.tsx create mode 100644 src/components/List/Column/CpuArchitectureColumn.tsx create mode 100644 src/components/List/Column/CpuColumn.tsx create mode 100644 src/components/List/Column/CpuCoresColumn.tsx create mode 100644 src/components/List/Column/DownloadColumn.tsx create mode 100644 src/components/List/Column/FinalizedBlockColumn.tsx create mode 100644 src/components/List/Column/FinalizedHashColumn.tsx create mode 100644 src/components/List/Column/IsVirtualMachineColumn.tsx create mode 100644 src/components/List/Column/LastBlockColumn.tsx create mode 100644 src/components/List/Column/LinuxDistroColumn.tsx create mode 100644 src/components/List/Column/LinuxKernelColumn.tsx create mode 100644 src/components/List/Column/LocationColumn.tsx create mode 100644 src/components/List/Column/MemoryColumn.tsx create mode 100644 src/components/List/Column/NameColumn.tsx create mode 100644 src/components/List/Column/NetworkIdColumn.tsx create mode 100644 src/components/List/Column/OperatingSystemColumn.tsx create mode 100644 src/components/List/Column/PeersColumn.tsx create mode 100644 src/components/List/Column/StateCacheColumn.tsx create mode 100644 src/components/List/Column/TxsColumn.tsx create mode 100644 src/components/List/Column/UploadColumn.tsx create mode 100644 src/components/List/Column/UptimeColumn.tsx create mode 100644 src/components/List/Column/ValidatorColumn.tsx create mode 100644 src/components/List/Column/VersionColumn.tsx create mode 100644 src/components/List/Column/index.ts create mode 100644 src/components/List/List.css create mode 100644 src/components/List/List.tsx create mode 100644 src/components/List/Row.css create mode 100644 src/components/List/Row.tsx create mode 100644 src/components/List/THead.css create mode 100644 src/components/List/THead.tsx create mode 100644 src/components/List/THeadCell.tsx create mode 100644 src/components/List/index.ts create mode 100644 src/components/Map/Location.css create mode 100644 src/components/Map/Location.tsx create mode 100644 src/components/Map/Map.css create mode 100644 src/components/Map/Map.tsx create mode 100644 src/components/Map/index.ts create mode 100644 src/components/Sparkline.css create mode 100644 src/components/Sparkline.tsx create mode 100644 src/components/Stats/Stats.css create mode 100644 src/components/Stats/Stats.tsx create mode 100644 src/components/Stats/index.ts create mode 100644 src/components/Tile.css create mode 100644 src/components/Tile.tsx create mode 100644 src/components/Tooltip.css create mode 100644 src/components/Tooltip.tsx create mode 100644 src/components/Truncate.tsx create mode 100644 src/components/index.ts create mode 100644 src/icons/alert.svg create mode 100644 src/icons/archive.svg create mode 100644 src/icons/arrow-down.svg create mode 100644 src/icons/arrow-left.svg create mode 100644 src/icons/arrow-right.svg create mode 100644 src/icons/arrow-small-down.svg create mode 100644 src/icons/arrow-small-left.svg create mode 100644 src/icons/arrow-small-right.svg create mode 100644 src/icons/arrow-small-up.svg create mode 100644 src/icons/arrow-up.svg create mode 100644 src/icons/assets.d.ts create mode 100644 src/icons/beaker.svg create mode 100644 src/icons/bell.svg create mode 100644 src/icons/book.svg create mode 100644 src/icons/bookmark.svg create mode 100644 src/icons/briefcase.svg create mode 100644 src/icons/broadcast.svg create mode 100644 src/icons/browser.svg create mode 100644 src/icons/bug.svg create mode 100644 src/icons/calendar.svg create mode 100644 src/icons/check-square-regular.svg create mode 100644 src/icons/check-square-solid.svg create mode 100644 src/icons/check.svg create mode 100644 src/icons/checklist.svg create mode 100644 src/icons/chevron-down.svg create mode 100644 src/icons/chevron-left.svg create mode 100644 src/icons/chevron-right.svg create mode 100644 src/icons/chevron-up.svg create mode 100644 src/icons/circle-regular.svg create mode 100644 src/icons/circle-slash.svg create mode 100644 src/icons/circle-solid.svg create mode 100644 src/icons/circuit-board.svg create mode 100644 src/icons/clippy.svg create mode 100644 src/icons/clock.svg create mode 100644 src/icons/cloud-download.svg create mode 100644 src/icons/cloud-upload.svg create mode 100644 src/icons/code.svg create mode 100644 src/icons/comment-discussion.svg create mode 100644 src/icons/comment.svg create mode 100644 src/icons/credit-card.svg create mode 100644 src/icons/cube-alt.svg create mode 100644 src/icons/cube.svg create mode 100644 src/icons/dashboard.svg create mode 100644 src/icons/database.svg create mode 100644 src/icons/desktop-download.svg create mode 100644 src/icons/device-camera-video.svg create mode 100644 src/icons/device-camera.svg create mode 100644 src/icons/device-desktop.svg create mode 100644 src/icons/device-mobile.svg create mode 100644 src/icons/diff-added.svg create mode 100644 src/icons/diff-ignored.svg create mode 100644 src/icons/diff-modified.svg create mode 100644 src/icons/diff-removed.svg create mode 100644 src/icons/diff-renamed.svg create mode 100644 src/icons/diff.svg create mode 100644 src/icons/ellipsis-v-solid.svg create mode 100644 src/icons/ellipsis.svg create mode 100644 src/icons/eye.svg create mode 100644 src/icons/file-binary.svg create mode 100644 src/icons/file-code.svg create mode 100644 src/icons/file-directory.svg create mode 100644 src/icons/file-media.svg create mode 100644 src/icons/file-pdf.svg create mode 100644 src/icons/file-submodule.svg create mode 100644 src/icons/file-symlink-directory.svg create mode 100644 src/icons/file-symlink-file.svg create mode 100644 src/icons/file-zip.svg create mode 100644 src/icons/file.svg create mode 100644 src/icons/finalized.svg create mode 100644 src/icons/fingerprint.svg create mode 100644 src/icons/flame.svg create mode 100644 src/icons/fold.svg create mode 100644 src/icons/gear.svg create mode 100644 src/icons/ghost-logo.svg create mode 100644 src/icons/gift.svg create mode 100644 src/icons/gist-secret.svg create mode 100644 src/icons/gist.svg create mode 100644 src/icons/git-branch.svg create mode 100644 src/icons/git-commit.svg create mode 100644 src/icons/git-compare.svg create mode 100644 src/icons/git-merge.svg create mode 100644 src/icons/git-pull-request.svg create mode 100644 src/icons/globe-solid.svg create mode 100644 src/icons/globe.svg create mode 100644 src/icons/grabber.svg create mode 100644 src/icons/graph.svg create mode 100644 src/icons/hatching.svg create mode 100644 src/icons/heart.svg create mode 100644 src/icons/history.svg create mode 100644 src/icons/home.svg create mode 100644 src/icons/horizontal-rule.svg create mode 100644 src/icons/hubot.svg create mode 100644 src/icons/inbox.svg create mode 100644 src/icons/info.svg create mode 100644 src/icons/issue-closed.svg create mode 100644 src/icons/issue-opened.svg create mode 100644 src/icons/issue-reopened.svg create mode 100644 src/icons/italic.svg create mode 100644 src/icons/jersey.svg create mode 100644 src/icons/kebab-horizontal.svg create mode 100644 src/icons/kebab-vertical.svg create mode 100644 src/icons/key.svg create mode 100644 src/icons/keyboard.svg create mode 100644 src/icons/law.svg create mode 100644 src/icons/light-bulb.svg create mode 100644 src/icons/link-external.svg create mode 100644 src/icons/link.svg create mode 100644 src/icons/list-alt-regular.svg create mode 100644 src/icons/list-ordered.svg create mode 100644 src/icons/list-unordered.svg create mode 100644 src/icons/location.svg create mode 100644 src/icons/lock.svg create mode 100644 src/icons/logo-gist.svg create mode 100644 src/icons/logo-github.svg create mode 100644 src/icons/mail-read.svg create mode 100644 src/icons/mail.svg create mode 100644 src/icons/map-marked-alt-solid.svg create mode 100644 src/icons/map-marker-alt-solid.svg create mode 100644 src/icons/map-pin-solid.svg create mode 100644 src/icons/mark-github.svg create mode 100644 src/icons/markdown.svg create mode 100644 src/icons/megaphone.svg create mode 100644 src/icons/memory-solid.svg create mode 100644 src/icons/mention.svg create mode 100644 src/icons/microchip-solid.svg create mode 100644 src/icons/milestone.svg create mode 100644 src/icons/mirror.svg create mode 100644 src/icons/mortar-board.svg create mode 100644 src/icons/mute.svg create mode 100644 src/icons/network.svg create mode 100644 src/icons/no-newline.svg create mode 100644 src/icons/note.svg create mode 100644 src/icons/octoface.svg create mode 100644 src/icons/organization.svg create mode 100644 src/icons/package.svg create mode 100644 src/icons/paintcan.svg create mode 100644 src/icons/pencil.svg create mode 100644 src/icons/person.svg create mode 100644 src/icons/pin.svg create mode 100644 src/icons/plug.svg create mode 100644 src/icons/plus-small.svg create mode 100644 src/icons/plus.svg create mode 100644 src/icons/polkadot-js.svg create mode 100644 src/icons/primitive-dot.svg create mode 100644 src/icons/primitive-square.svg create mode 100644 src/icons/project.svg create mode 100644 src/icons/pulse.svg create mode 100644 src/icons/question-solid.svg create mode 100644 src/icons/question.svg create mode 100644 src/icons/quote.svg create mode 100644 src/icons/radio-tower.svg create mode 100644 src/icons/reply.svg create mode 100644 src/icons/repo-clone.svg create mode 100644 src/icons/repo-force-push.svg create mode 100644 src/icons/repo-forked.svg create mode 100644 src/icons/repo-pull.svg create mode 100644 src/icons/repo-push.svg create mode 100644 src/icons/repo.svg create mode 100644 src/icons/report.svg create mode 100644 src/icons/rocket.svg create mode 100644 src/icons/rss.svg create mode 100644 src/icons/ruby.svg create mode 100644 src/icons/screen-full.svg create mode 100644 src/icons/screen-normal.svg create mode 100644 src/icons/search.svg create mode 100644 src/icons/server.svg create mode 100644 src/icons/settings.svg create mode 100644 src/icons/shield.svg create mode 100644 src/icons/sign-in.svg create mode 100644 src/icons/sign-out.svg create mode 100644 src/icons/smiley.svg create mode 100644 src/icons/square-regular.svg create mode 100644 src/icons/square-solid.svg create mode 100644 src/icons/squirrel.svg create mode 100644 src/icons/star.svg create mode 100644 src/icons/stop.svg create mode 100644 src/icons/sync.svg create mode 100644 src/icons/tag.svg create mode 100644 src/icons/tasklist.svg create mode 100644 src/icons/telescope.svg create mode 100644 src/icons/terminal.svg create mode 100644 src/icons/text-size.svg create mode 100644 src/icons/three-bars.svg create mode 100644 src/icons/thumbsdown.svg create mode 100644 src/icons/thumbsup.svg create mode 100644 src/icons/tools.svg create mode 100644 src/icons/trashcan.svg create mode 100644 src/icons/triangle-down.svg create mode 100644 src/icons/triangle-left.svg create mode 100644 src/icons/triangle-right.svg create mode 100644 src/icons/triangle-up.svg create mode 100644 src/icons/turingnetwork.svg create mode 100644 src/icons/unfold.svg create mode 100644 src/icons/unmute.svg create mode 100644 src/icons/unverified.svg create mode 100644 src/icons/verified.svg create mode 100644 src/icons/versions.svg create mode 100644 src/icons/watch.svg create mode 100644 src/icons/x.svg create mode 100644 src/icons/zap.svg create mode 100644 src/index.css create mode 100644 src/index.tsx create mode 100644 src/persist/Persistent.ts create mode 100644 src/persist/PersistentObject.ts create mode 100644 src/persist/PersistentSet.ts create mode 100644 src/persist/index.ts create mode 100644 src/state.ts create mode 100644 src/utils.ts create mode 100644 tsconfig.json create mode 100644 webpack.config.js diff --git a/.env.template b/.env.template new file mode 100644 index 0000000..9688ffb --- /dev/null +++ b/.env.template @@ -0,0 +1 @@ +REACT_APP_TRACKING_ID= diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..4bd1454 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,40 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react/jsx-runtime", + "plugin:react/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": 12, + "sourceType": "module" + }, + "plugins": ["react", "react-hooks", "@typescript-eslint"], + "rules": { + "no-console": 0, + "no-empty": 0, + "no-bitwise": 0, + "quotes": [1, "single"], + "jsx-quotes": [1, "prefer-double"], + "semi": [1, "always"], + "@typescript-eslint/prefer-as-const": 1, + "@typescript-eslint/no-namespace": 1, + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_" + } + ] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b7dfdc9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.env +.nyc +.nyc_output +node_modules/ +build/ diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..8351c19 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +14 diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..650cb88 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "semi": true +} diff --git a/assets/favicon.svg b/assets/favicon.svg new file mode 100644 index 0000000..b16d3e3 --- /dev/null +++ b/assets/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/index.html b/assets/index.html new file mode 100644 index 0000000..7226798 --- /dev/null +++ b/assets/index.html @@ -0,0 +1,46 @@ + + + + + + + Ghost Telemetry + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/assets/meta-image.png b/assets/meta-image.png new file mode 100644 index 0000000000000000000000000000000000000000..c51d14979e67d9b24e4562f64d0a20afd507d278 GIT binary patch literal 221756 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
2{lVzZLvLSJ1S)iP`@U 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/setupJest.js'], + moduleNameMapper: { + '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': + '/assets/mock.image.js', + '\\.(css|less|scss|sass)$': '/assets/mock.style.js', + }, +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d9740ad --- /dev/null +++ b/package-lock.json @@ -0,0 +1,16809 @@ +{ + "name": "ghost-telemetry-frontend", + "version": "0.1.5", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "ghost-telemetry-frontend", + "version": "0.1.5", + "license": "GPL-3.0", + "dependencies": { + "@polkadot/util-crypto": "^10.1.7", + "dotenv-webpack": "^8.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-ga4": "^2.1.0" + }, + "devDependencies": { + "@types/jest": "29.4.0", + "@types/node": "^16.11.58", + "@types/react": "^18.0.18", + "@types/react-dom": "^18.0.6", + "@types/react-measure": "^2.0.6", + "@typescript-eslint/eslint-plugin": "^5.49.0", + "@typescript-eslint/parser": "^5.49.0", + "css-loader": "^6.7.3", + "eslint": "^8.23.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.31.8", + "eslint-plugin-react-hooks": "^4.6.0", + "html-webpack-plugin": "^5.5.0", + "jest": "^29.4.0", + "jest-environment-jsdom": "^29.4.0", + "prettier": "^2.0.5", + "style-loader": "^3.3.1", + "ts-jest": "29.0.5", + "ts-loader": "^9.4.2", + "typescript": "^4.9.4", + "webpack": "^5.76.0", + "webpack-cli": "^5.0.1", + "webpack-dev-server": "^4.11.1", + "whatwg-fetch": "^3.6.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/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/@babel/code-frame/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/@babel/code-frame/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/@babel/code-frame/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/@babel/code-frame/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/@babel/code-frame/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/@babel/code-frame/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/@babel/compat-data": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "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/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/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/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/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/@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.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "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.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "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/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@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.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/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/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", + "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.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/@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.4.0.tgz", + "integrity": "sha512-xpXud7e/8zo4syxQlAMDz+EQiFsf8/zXDPslBYm+UaSJ5uGTKQHhbSHfECp7Fw1trQtopjYumeved0n3waijhQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.4.0", + "jest-util": "^29.4.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.4.0.tgz", + "integrity": "sha512-E7oCMcENobBFwQXYjnN2IsuUSpRo5jSv7VYk6O9GyQ5kVAfVSS8819I4W5iCCYvqD6+1TzyzLpeEdZEik81kNw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.4.0", + "@jest/reporters": "^29.4.0", + "@jest/test-result": "^29.4.0", + "@jest/transform": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.4.0", + "jest-config": "^29.4.0", + "jest-haste-map": "^29.4.0", + "jest-message-util": "^29.4.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.4.0", + "jest-resolve-dependencies": "^29.4.0", + "jest-runner": "^29.4.0", + "jest-runtime": "^29.4.0", + "jest-snapshot": "^29.4.0", + "jest-util": "^29.4.0", + "jest-validate": "^29.4.0", + "jest-watcher": "^29.4.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.4.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.4.0.tgz", + "integrity": "sha512-ocl1VGDcZHfHnYLTqkBY7yXme1bF4x0BevJ9wb6y0sLOSyBCpp8L5fEASChB+wU53WMrIK6kBfGt+ZYoM2kcdw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "jest-mock": "^29.4.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.4.0.tgz", + "integrity": "sha512-IiDZYQ/Oi94aBT0nKKKRvNsB5JTyHoGb+G3SiGoDxz90JfL7SLx/z5IjB0fzBRzy7aLFQOCbVJlaC2fIgU6Y9Q==", + "dev": true, + "dependencies": { + "expect": "^29.4.0", + "jest-snapshot": "^29.4.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.4.0.tgz", + "integrity": "sha512-w/JzTYIqjmPFIM5OOQHF9CawFx2daw1256Nzj4ZqWX96qRKbCq9WYRVqdySBKHHzuvsXLyTDIF6y61FUyrhmwg==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.4.0.tgz", + "integrity": "sha512-8sitzN2QrhDwEwH3kKcMMgrv/UIkmm9AUgHixmn4L++GQ0CqVTIztm3YmaIQooLmW3O4GhizNTTCyq3iLbWcMw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.4.0", + "jest-mock": "^29.4.0", + "jest-util": "^29.4.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.4.0.tgz", + "integrity": "sha512-Q64ZRgGMVL40RcYTfD2GvyjK7vJLPSIvi8Yp3usGPNPQ3SCW+UCY9KEH6+sVtBo8LzhcjtCXuZEd7avnj/T0mQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.0", + "@jest/expect": "^29.4.0", + "@jest/types": "^29.4.0", + "jest-mock": "^29.4.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.4.0.tgz", + "integrity": "sha512-FjJwrD1XOQq/AXKrvnOSf0RgAs6ziUuGKx8+/R53Jscc629JIhg7/m241gf1shUm/fKKxoHd7aCexcg7kxvkWQ==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.4.0", + "@jest/test-result": "^29.4.0", + "@jest/transform": "^29.4.0", + "@jest/types": "^29.4.0", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.4.0", + "jest-util": "^29.4.0", + "jest-worker": "^29.4.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.0.tgz", + "integrity": "sha512-dICMQ+Q4W0QVMsaQzWlA1FVQhKNz7QcDCOGtbk1GCAd0Lai+wdkQvfmQwL4MjGumineh1xz+6M5oMj3rfWS02A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.4.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@jest/schemas": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.0.tgz", + "integrity": "sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.4.0.tgz", + "integrity": "sha512-EtRklzjpddZU/aBVxJqqejfzfOcnehmjNXufs6u6qwd05kkhXpAPhZdt8bLlQd7cA2nD+JqZQ5Dx9NX5Jh6mjA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.4.0.tgz", + "integrity": "sha512-pEwIgdfvEgF2lBOYX3DVn3SrvsAZ9FXCHw7+C6Qz87HnoDGQwbAselhWLhpgbxDjs6RC9QUJpFnrLmM5uwZV+g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.4.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.0.tgz", + "integrity": "sha512-hDjw3jz4GnvbyLMgcFpC9/34QcUhVIzJkBqz7o+3AhgfhGRzGuQppuLf5r/q7lDAAyJ6jzL+SFG7JGsScHOcLQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.4.0", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.0", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.4.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.0.tgz", + "integrity": "sha512-1S2Dt5uQp7R0bGY/L2BpuwCSji7v12kY3o8zqwlkbYBmOY956SKk+zOWqmfhHSINegiAVqOXydAYuWpzX6TYsQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "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==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "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/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@noble/secp256k1": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz", + "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "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/@polkadot/networks": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-10.1.7.tgz", + "integrity": "sha512-ol864SZ/GwAF72GQOPRy+Y9r6NtgJJjMBlDLESvV5VK64eEB0MRSSyiOdd7y/4SumR9crrrNimx3ynACFgxZ8A==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@polkadot/util": "10.1.7", + "@substrate/ss58-registry": "^1.28.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/util": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-10.1.7.tgz", + "integrity": "sha512-s7gDLdNb4HUpoe3faXwoO6HwiUp8pi66voYKiUYRh1kEtW1o9vGBgyZPHPGC/FBgILzTJKii/9XxnSex60zBTA==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@polkadot/x-bigint": "10.1.7", + "@polkadot/x-global": "10.1.7", + "@polkadot/x-textdecoder": "10.1.7", + "@polkadot/x-textencoder": "10.1.7", + "@types/bn.js": "^5.1.1", + "bn.js": "^5.2.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/util-crypto": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-10.1.7.tgz", + "integrity": "sha512-zGmSU7a0wdWfpDtfc+Q7fUuW+extu9o1Uh4JpkuwwZ/dxmyW5xlfqVsIScM1pdPyjJsyamX8KwsKiVsW4slasg==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.6.3", + "@polkadot/networks": "10.1.7", + "@polkadot/util": "10.1.7", + "@polkadot/wasm-crypto": "^6.3.1", + "@polkadot/x-bigint": "10.1.7", + "@polkadot/x-randomvalues": "10.1.7", + "@scure/base": "1.1.1", + "ed2curve": "^0.3.0", + "tweetnacl": "^1.0.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@polkadot/util": "10.1.7" + } + }, + "node_modules/@polkadot/wasm-bridge": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-bridge/-/wasm-bridge-6.3.1.tgz", + "integrity": "sha512-1TYkHsb9AEFhU9uZj3biEnN2yKQNzdrwSjiTvfCYnt97pnEkKsZI6cku+YPZQv5w/x9CQa5Yua9e2DVVZSivGA==", + "dependencies": { + "@babel/runtime": "^7.18.9" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" + } + }, + "node_modules/@polkadot/wasm-crypto": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto/-/wasm-crypto-6.3.1.tgz", + "integrity": "sha512-OO8h0qeVkqp4xYZaRVl4iuWOEtq282pNBHDKb6SOJuI2g59eWGcKh4EQU9Me2VP6qzojIqptrkrVt7KQXC68gA==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@polkadot/wasm-bridge": "6.3.1", + "@polkadot/wasm-crypto-asmjs": "6.3.1", + "@polkadot/wasm-crypto-init": "6.3.1", + "@polkadot/wasm-crypto-wasm": "6.3.1", + "@polkadot/wasm-util": "6.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" + } + }, + "node_modules/@polkadot/wasm-crypto-asmjs": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-6.3.1.tgz", + "integrity": "sha512-zbombRfA5v/mUWQQhgg2YwaxhRmxRIrvskw65x+lruax3b6xPBFDs7yplopiJU3r8h2pTgQvX/DUksvqz2TCRQ==", + "dependencies": { + "@babel/runtime": "^7.18.9" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/wasm-crypto-init": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-init/-/wasm-crypto-init-6.3.1.tgz", + "integrity": "sha512-9yaUBcu+snwjJLmPPGl3cyGRQ1afyFGm16qzTM0sgG/ZCfUlK4uk8KWZe+sBUKgoxb2oXY7Y4WklKgQI1YBdfw==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@polkadot/wasm-bridge": "6.3.1", + "@polkadot/wasm-crypto-asmjs": "6.3.1", + "@polkadot/wasm-crypto-wasm": "6.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" + } + }, + "node_modules/@polkadot/wasm-crypto-wasm": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-6.3.1.tgz", + "integrity": "sha512-idSlzKGVzCfeCMRHsacRvqwojSaTadFxL/Dbls4z1thvfa3U9Ku0d2qVtlwg7Hj+tYWDiuP8Kygs+6bQwfs0XA==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@polkadot/wasm-util": "6.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/wasm-util": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-util/-/wasm-util-6.3.1.tgz", + "integrity": "sha512-12oAv5J7Yoc9m6jixrSaQCxpOkWOyzHx3DMC8qmLjRiwdBWxqLmImOVRVnFsbaxqSbhBIHRuJphVxWE+GZETDg==", + "dependencies": { + "@babel/runtime": "^7.18.9" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/x-bigint": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-10.1.7.tgz", + "integrity": "sha512-uaClHpI6cnDumIfejUKvNTkB43JleEb0V6OIufDKJ/e1aCLE3f/Ws9ggwL8ea05lQP5k5xqOzbPdizi/UvrgKQ==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@polkadot/x-global": "10.1.7" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/x-global": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-10.1.7.tgz", + "integrity": "sha512-k2ZUZyBVgDnP/Ysxapa0mthn63j6gsN2V0kZejEQPyOfCHtQQkse3jFvAWdslpWoR8j2k8SN5O6reHc0F4f7mA==", + "dependencies": { + "@babel/runtime": "^7.18.9" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/x-randomvalues": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-10.1.7.tgz", + "integrity": "sha512-3er4UYOlozLGgFYWwcbmcFslmO8m82u4cAGR4AaEag0VdV7jLO/M5lTmivT/3rtLSww6sjkEfr522GM2Q5lmFg==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@polkadot/x-global": "10.1.7" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/x-textdecoder": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-10.1.7.tgz", + "integrity": "sha512-iAFOHludmZFOyVL8sQFv4TDqbcqQU5gwwYv74duTA+WQBgbSITJrBahSCV/rXOjUqds9pzQO3qBFzziznNnkiQ==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@polkadot/x-global": "10.1.7" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@polkadot/x-textencoder": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-10.1.7.tgz", + "integrity": "sha512-GzjaWZDbgzZ0IQT60xuZ7cZ0wnlNVYMqpfI9KvBc58X9dPI3TIMwzbXDVzZzpjY1SAqJGs4hJse9HMWZazfhew==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@polkadot/x-global": "10.1.7" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@sinclair/typebox": { + "version": "0.25.21", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.21.tgz", + "integrity": "sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@substrate/ss58-registry": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.29.0.tgz", + "integrity": "sha512-KTqwZgTjtWPhCAUJJx9qswP/p9cRKUU9GOHYUDKNdISFDiFafWmpI54JHfYLkgjvkSKEUgRZnvLpe0LMF1fXvw==" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "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.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "node_modules/@types/express": { + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.16.tgz", + "integrity": "sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.31", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.4.0.tgz", + "integrity": "sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "16.11.58", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.58.tgz", + "integrity": "sha512-uMVxJ111wpHzkx/vshZFb6Qni3BOMnlWLq7q9jrwej7Yw/KvjsEbpxCCxw+hLKxexFMc8YmpG8J9tnEe/rKsIg==" + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.0.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.18.tgz", + "integrity": "sha512-6hI08umYs6NaiHFEEGioXnxJ+oEhY3eRz8VCUaudZmGdtvPviCJB8mgaMxaDWAdPSYd4eFavrPk2QIolwbLYrg==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", + "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-measure": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/react-measure/-/react-measure-2.0.8.tgz", + "integrity": "sha512-Pu4/hQ/1AKVN6efoawtcM+l376WYOI8e1fiM6ir4pdLkHilDCkJLjUGvAm0mWKJ0GE6hzu55yCrcJ/xNyEdFwA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.20", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.20.tgz", + "integrity": "sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.49.0.tgz", + "integrity": "sha512-IhxabIpcf++TBaBa1h7jtOWyon80SXPRLDq0dVz5SLFC/eW6tofkw/O7Ar3lkx5z5U6wzbKDrl2larprp5kk5Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/type-utils": "5.49.0", + "@typescript-eslint/utils": "5.49.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.49.0.tgz", + "integrity": "sha512-veDlZN9mUhGqU31Qiv2qEp+XrJj5fgZpJ8PW30sHU+j/8/e5ruAhLaVDAeznS7A7i4ucb/s8IozpDtt9NqCkZg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/typescript-estree": "5.49.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz", + "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.49.0.tgz", + "integrity": "sha512-eUgLTYq0tR0FGU5g1YHm4rt5H/+V2IPVkP0cBmbhRyEmyGe4XvJ2YJ6sYTmONfjmdMqyMLad7SB8GvblbeESZA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.49.0", + "@typescript-eslint/utils": "5.49.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz", + "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz", + "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.49.0.tgz", + "integrity": "sha512-cPJue/4Si25FViIb74sHCLtM4nTSBXtLx1d3/QT6mirQ/c65bV8arBEebBJJizfq8W2YyMoPI/WWPFWitmNqnQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/typescript-estree": "5.49.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz", + "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.49.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", + "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", + "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "peerDependencies": { + "acorn": "^8" + } + }, + "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/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.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==", + "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/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "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": "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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "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/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.4.0.tgz", + "integrity": "sha512-M61cGPg4JBashDvIzKoIV/y95mSF6x3ome7CMEaszUTHD4uo6dtC6Nln+fvRTspYNtwy8lDHl5lmoTBSNY/a+g==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.4.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.4.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.0.tgz", + "integrity": "sha512-a/sZRLQJEmsmejQ2rPEUe35nO1+C9dc9O1gplH1SXmJxveQSRUYdBk8yGZG/VOUuZs1u2aHZJusEGoRMbhhwCg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.4.0.tgz", + "integrity": "sha512-fUB9vZflUSM3dO/6M2TCAepTzvA4VkOvl67PjErcrQMGt9Eve7uazaeyCZ2th3UtI7ljpiBJES0F7A1vBRsLZA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.4.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", + "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "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/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camel-case/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001687", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "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/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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.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" + }, + "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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "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/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/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "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/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "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/css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "dev": true + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": 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.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "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/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-defaults": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-2.0.2.tgz", + "integrity": "sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==", + "license": "MIT", + "dependencies": { + "dotenv": "^8.2.0" + } + }, + "node_modules/dotenv-webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-8.1.0.tgz", + "integrity": "sha512-owK1JcsPkIobeqjVrk6h7jPED/W6ZpdFsMPR+5ursB7/SdgDyO+VzAU+szK8C8u3qUhtENyYnj8eyXMR5kkGag==", + "license": "MIT", + "dependencies": { + "dotenv-defaults": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "webpack": "^4 || ^5" + } + }, + "node_modules/ed2curve": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.3.0.tgz", + "integrity": "sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ==", + "dependencies": { + "tweetnacl": "1.x.x" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.246", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.246.tgz", + "integrity": "sha512-/wFCHUE+Hocqr/LlVGsuKLIw4P2lBWwFIDcNMDpJGzyIysQV4aycpoOitAs32FT94EHKnNqDR/CVZJFbXEufJA==" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.2", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "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/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", + "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.1", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", + "ajv": "^6.10.0", + "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.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^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.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "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-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.31.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", + "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.7" + }, + "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/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-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/espree": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "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==", + "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==", + "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/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.4.0.tgz", + "integrity": "sha512-pzaAwjBgLEVxBh6ZHiqb9Wv3JYuv6m8ntgtY7a48nS+2KbX0EJkPS3FQlKiTZNcqzqJHNyQsfjqN60w1hPUBfQ==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.4.0", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.4.0", + "jest-message-util": "^29.4.0", + "jest-util": "^29.4.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-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, + "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==" + }, + "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/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "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.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "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-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "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/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "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.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "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.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "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==", + "dev": true, + "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.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "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-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "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==", + "dev": true, + "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-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.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 + }, + "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-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "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-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-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "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/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/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/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.4.0.tgz", + "integrity": "sha512-Zfd4UzNxPkSoHRBkg225rBjQNa6pVqbh20MGniAzwaOzYLd+pQUcAwH+WPxSXxKFs+QWYfPYIq9hIVSmdVQmPA==", + "dev": true, + "dependencies": { + "@jest/core": "^29.4.0", + "@jest/types": "^29.4.0", + "import-local": "^3.0.2", + "jest-cli": "^29.4.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.4.0.tgz", + "integrity": "sha512-rnI1oPxgFghoz32Y8eZsGJMjW54UlqT17ycQeCEktcxxwqqKdlj9afl8LNeO0Pbu+h2JQHThQP0BzS67eTRx4w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.4.0.tgz", + "integrity": "sha512-/pFBaCeLzCavRWyz14JwFgpZgPpEZdS6nPnREhczbHl2wy2UezvYcVp5akVFfUmBaA4ThAUp0I8cpgkbuNOm3g==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.0", + "@jest/expect": "^29.4.0", + "@jest/test-result": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.4.0", + "jest-matcher-utils": "^29.4.0", + "jest-message-util": "^29.4.0", + "jest-runtime": "^29.4.0", + "jest-snapshot": "^29.4.0", + "jest-util": "^29.4.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.4.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.4.0.tgz", + "integrity": "sha512-YUkICcxjUd864VOzbfQEi2qd2hIIOd9bRF7LJUNyhWb3Khh3YKrbY0LWwoZZ4WkvukiNdvQu0Z4s6zLsY4hYfg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.4.0", + "@jest/test-result": "^29.4.0", + "@jest/types": "^29.4.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.4.0", + "jest-util": "^29.4.0", + "jest-validate": "^29.4.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.4.0.tgz", + "integrity": "sha512-jtgd72nN4Mob4Oego3N/pLRVfR2ui1hv+yO6xR/SUi5G7NtZ/grr95BJ1qRSDYZshuA0Jw57fnttZHZKb04+CA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.4.0", + "@jest/types": "^29.4.0", + "babel-jest": "^29.4.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.4.0", + "jest-environment-node": "^29.4.0", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.4.0", + "jest-runner": "^29.4.0", + "jest-util": "^29.4.0", + "jest-validate": "^29.4.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.4.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.4.0.tgz", + "integrity": "sha512-s8KNvFx8YgdQ4fn2YLDQ7N6kmVOP68dUDVJrCHNsTc3UM5jcmyyFeYKL8EPWBQbJ0o0VvDGbWp8oYQ1nsnqnWw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.4.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.4.0.tgz", + "integrity": "sha512-LTOvB8JDVFjrwXItyQiyLuDYy5PMApGLLzbfIYR79QLpeohS0bcS6j2HjlWuRGSM8QQQyp+ico59Blv+Jx3fMw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.4.0", + "pretty-format": "^29.4.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.4.0.tgz", + "integrity": "sha512-z1tB/qtReousDnU695K38ZzoR6B3dRXazwgyhTHzMviSC2T3KmVy0T722fZxR2q3x/Jvv85JxU/2xs8kwX394w==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.0", + "@jest/fake-timers": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.4.0", + "jest-util": "^29.4.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.4.0.tgz", + "integrity": "sha512-WVveE3fYSH6FhDtZdvXhFKeLsDRItlQgnij+HQv6ZKxTdT1DB5O0sHXKCEC3K5mHraMs1Kzn4ch9jXC7H4L4wA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.0", + "@jest/fake-timers": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "jest-mock": "^29.4.0", + "jest-util": "^29.4.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.0.tgz", + "integrity": "sha512-m/pIEfoK0HoJz4c9bkgS5F9CXN2AM22eaSmUcmqTpadRlNVBOJE2CwkgaUzbrNn5MuAqTV1IPVYwWwjHNnk8eA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.4.0", + "jest-worker": "^29.4.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.0.tgz", + "integrity": "sha512-dICMQ+Q4W0QVMsaQzWlA1FVQhKNz7QcDCOGtbk1GCAd0Lai+wdkQvfmQwL4MjGumineh1xz+6M5oMj3rfWS02A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.4.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.4.0.tgz", + "integrity": "sha512-fEGHS6ijzgSv5exABkCecMHNmyHcV52+l39ZsxuwfxmQMp43KBWJn2/Fwg8/l4jTI9uOY9jv8z1dXGgL0PHFjA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.4.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.4.0.tgz", + "integrity": "sha512-pU4OjBn96rDdRIaPUImbPiO2ETyRVzkA1EZVu9AxBDv/XPDJ7JWfkb6IiDT5jwgicaPHMrB/fhVa6qjG6potfA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.4.0", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.4.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.4.0.tgz", + "integrity": "sha512-0FvobqymmhE9pDEifvIcni9GeoKLol8eZspzH5u41g1wxYtLS60a9joT95dzzoCgrKRidNz64eaAXyzaULV8og==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.4.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.4.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.4.0.tgz", + "integrity": "sha512-+ShT5i+hcu/OFQRV0f/V/YtwpdFcHg64JZ9A8b40JueP+X9HNrZAYGdkupGIzsUK8AucecxCt4wKauMchxubLQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.0", + "@types/node": "*", + "jest-util": "^29.4.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.4.0.tgz", + "integrity": "sha512-g7k7l53T+uC9Dp1mbHyDNkcCt0PMku6Wcfpr1kcMLwOHmM3vucKjSM5+DSa1r4vlDZojh8XH039J3z4FKmtTSw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.4.0", + "jest-validate": "^29.4.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.0.tgz", + "integrity": "sha512-hxfC84trREyULSj1Cm+fMjnudrrI2dVQ04COjZRcjCZ97boJlPtfJ+qrl/pN7YXS2fnu3wTHEc3LO094pngL6A==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.4.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.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/jest-runner": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.4.0.tgz", + "integrity": "sha512-4zpcv0NOiJleqT0NAs8YcVbK8MhVRc58CBBn9b0Exc8VPU9GKI+DbzDUZqJYdkJhJSZFy2862l/F6hAqIow1hg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.4.0", + "@jest/environment": "^29.4.0", + "@jest/test-result": "^29.4.0", + "@jest/transform": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.4.0", + "jest-haste-map": "^29.4.0", + "jest-leak-detector": "^29.4.0", + "jest-message-util": "^29.4.0", + "jest-resolve": "^29.4.0", + "jest-runtime": "^29.4.0", + "jest-util": "^29.4.0", + "jest-watcher": "^29.4.0", + "jest-worker": "^29.4.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-worker": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.0.tgz", + "integrity": "sha512-dICMQ+Q4W0QVMsaQzWlA1FVQhKNz7QcDCOGtbk1GCAd0Lai+wdkQvfmQwL4MjGumineh1xz+6M5oMj3rfWS02A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.4.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-runtime": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.4.0.tgz", + "integrity": "sha512-2zumwaGXsIuSF92Ui5Pn5hZV9r7AHMclfBLikrXSq87/lHea9anQ+mC+Cjz/DYTbf/JMjlK1sjZRh8K3yYNvWg==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.0", + "@jest/fake-timers": "^29.4.0", + "@jest/globals": "^29.4.0", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.4.0", + "@jest/transform": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.0", + "jest-message-util": "^29.4.0", + "jest-mock": "^29.4.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.4.0", + "jest-snapshot": "^29.4.0", + "jest-util": "^29.4.0", + "semver": "^7.3.5", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.4.0.tgz", + "integrity": "sha512-UnK3MhdEWrQ2J6MnlKe51tvN5FjRUBQnO4m1LPlDx61or3w9+cP/U0x9eicutgunu/QzE4WC82jj6CiGIAFYzw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.4.0", + "@jest/transform": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.4.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.4.0", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.4.0", + "jest-matcher-utils": "^29.4.0", + "jest-message-util": "^29.4.0", + "jest-util": "^29.4.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.4.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.0.tgz", + "integrity": "sha512-lCCwlze7UEV8TpR9ArS8w0cTbcMry5tlBkg7QSc5og5kNyV59dnY2aKHu5fY2k5aDJMQpCUGpvL2w6ZU44lveA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.4.0.tgz", + "integrity": "sha512-EXS7u594nX3aAPBnARxBdJ1eZ1cByV6MWrK0Qpt9lt/BcY0p0yYGp/EGJ8GhdLDQh+RFf8qMt2wzbbVzpj5+Vg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "leven": "^3.1.0", + "pretty-format": "^29.4.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.4.0.tgz", + "integrity": "sha512-PnnfLygNKelWOJwpAYlcsQjB+OxRRdckD0qiGmYng4Hkz1ZwK3jvCaJJYiywz2msQn4rBNLdriasJtv7YpWHpA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.4.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=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/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "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==" + }, + "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.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "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==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "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/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lower-case/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/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/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", + "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "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/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/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "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/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/no-case/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", + "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "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.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "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.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "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.3" + }, + "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/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/param-case/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "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/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "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/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "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.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "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/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.0.tgz", + "integrity": "sha512-J+EVUPXIBHCdWAbvGBwXs0mk3ljGppoh/076g1S8qYS8nVG4u/yrhMvyTFHYYYKWnDdgRLExx0vA7pzxVGdlNw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/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==", + "dev": true + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "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/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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-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-ga4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-ga4/-/react-ga4-2.1.0.tgz", + "integrity": "sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ==", + "license": "MIT" + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rechoir/node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.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/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/resolve.exports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.0.tgz", + "integrity": "sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "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/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-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "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/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "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.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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 + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "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/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-jest": { + "version": "29.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-loader": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "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-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "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/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", + "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "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==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.76.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", + "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", + "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.1", + "colorette": "^2.0.14", + "commander": "^9.4.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/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, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", + "dev": true + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", + "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "dev": true, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "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 + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "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" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "requires": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/compat-data": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "dev": true + }, + "@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "requires": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "dependencies": { + "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, + "requires": { + "yallist": "^3.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "@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 + }, + "@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, + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@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, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@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, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@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 + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "dev": true, + "requires": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" + } + }, + "@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/runtime": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@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.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "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 + } + } + }, + "@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", + "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.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" + } + }, + "@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true + }, + "@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 + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.4.0.tgz", + "integrity": "sha512-xpXud7e/8zo4syxQlAMDz+EQiFsf8/zXDPslBYm+UaSJ5uGTKQHhbSHfECp7Fw1trQtopjYumeved0n3waijhQ==", + "dev": true, + "requires": { + "@jest/types": "^29.4.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.4.0", + "jest-util": "^29.4.0", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.4.0.tgz", + "integrity": "sha512-E7oCMcENobBFwQXYjnN2IsuUSpRo5jSv7VYk6O9GyQ5kVAfVSS8819I4W5iCCYvqD6+1TzyzLpeEdZEik81kNw==", + "dev": true, + "requires": { + "@jest/console": "^29.4.0", + "@jest/reporters": "^29.4.0", + "@jest/test-result": "^29.4.0", + "@jest/transform": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.4.0", + "jest-config": "^29.4.0", + "jest-haste-map": "^29.4.0", + "jest-message-util": "^29.4.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.4.0", + "jest-resolve-dependencies": "^29.4.0", + "jest-runner": "^29.4.0", + "jest-runtime": "^29.4.0", + "jest-snapshot": "^29.4.0", + "jest-util": "^29.4.0", + "jest-validate": "^29.4.0", + "jest-watcher": "^29.4.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.4.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.4.0.tgz", + "integrity": "sha512-ocl1VGDcZHfHnYLTqkBY7yXme1bF4x0BevJ9wb6y0sLOSyBCpp8L5fEASChB+wU53WMrIK6kBfGt+ZYoM2kcdw==", + "dev": true, + "requires": { + "@jest/fake-timers": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "jest-mock": "^29.4.0" + } + }, + "@jest/expect": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.4.0.tgz", + "integrity": "sha512-IiDZYQ/Oi94aBT0nKKKRvNsB5JTyHoGb+G3SiGoDxz90JfL7SLx/z5IjB0fzBRzy7aLFQOCbVJlaC2fIgU6Y9Q==", + "dev": true, + "requires": { + "expect": "^29.4.0", + "jest-snapshot": "^29.4.0" + } + }, + "@jest/expect-utils": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.4.0.tgz", + "integrity": "sha512-w/JzTYIqjmPFIM5OOQHF9CawFx2daw1256Nzj4ZqWX96qRKbCq9WYRVqdySBKHHzuvsXLyTDIF6y61FUyrhmwg==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0" + } + }, + "@jest/fake-timers": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.4.0.tgz", + "integrity": "sha512-8sitzN2QrhDwEwH3kKcMMgrv/UIkmm9AUgHixmn4L++GQ0CqVTIztm3YmaIQooLmW3O4GhizNTTCyq3iLbWcMw==", + "dev": true, + "requires": { + "@jest/types": "^29.4.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.4.0", + "jest-mock": "^29.4.0", + "jest-util": "^29.4.0" + } + }, + "@jest/globals": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.4.0.tgz", + "integrity": "sha512-Q64ZRgGMVL40RcYTfD2GvyjK7vJLPSIvi8Yp3usGPNPQ3SCW+UCY9KEH6+sVtBo8LzhcjtCXuZEd7avnj/T0mQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.4.0", + "@jest/expect": "^29.4.0", + "@jest/types": "^29.4.0", + "jest-mock": "^29.4.0" + } + }, + "@jest/reporters": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.4.0.tgz", + "integrity": "sha512-FjJwrD1XOQq/AXKrvnOSf0RgAs6ziUuGKx8+/R53Jscc629JIhg7/m241gf1shUm/fKKxoHd7aCexcg7kxvkWQ==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.4.0", + "@jest/test-result": "^29.4.0", + "@jest/transform": "^29.4.0", + "@jest/types": "^29.4.0", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.4.0", + "jest-util": "^29.4.0", + "jest-worker": "^29.4.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "jest-worker": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.0.tgz", + "integrity": "sha512-dICMQ+Q4W0QVMsaQzWlA1FVQhKNz7QcDCOGtbk1GCAd0Lai+wdkQvfmQwL4MjGumineh1xz+6M5oMj3rfWS02A==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.4.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/schemas": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.0.tgz", + "integrity": "sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.25.16" + } + }, + "@jest/source-map": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.4.0.tgz", + "integrity": "sha512-EtRklzjpddZU/aBVxJqqejfzfOcnehmjNXufs6u6qwd05kkhXpAPhZdt8bLlQd7cA2nD+JqZQ5Dx9NX5Jh6mjA==", + "dev": true, + "requires": { + "@jest/console": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.4.0.tgz", + "integrity": "sha512-pEwIgdfvEgF2lBOYX3DVn3SrvsAZ9FXCHw7+C6Qz87HnoDGQwbAselhWLhpgbxDjs6RC9QUJpFnrLmM5uwZV+g==", + "dev": true, + "requires": { + "@jest/test-result": "^29.4.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.0", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.0.tgz", + "integrity": "sha512-hDjw3jz4GnvbyLMgcFpC9/34QcUhVIzJkBqz7o+3AhgfhGRzGuQppuLf5r/q7lDAAyJ6jzL+SFG7JGsScHOcLQ==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.4.0", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.0", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.4.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.0" + } + }, + "@jest/types": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.0.tgz", + "integrity": "sha512-1S2Dt5uQp7R0bGY/L2BpuwCSji7v12kY3o8zqwlkbYBmOY956SKk+zOWqmfhHSINegiAVqOXydAYuWpzX6TYsQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.4.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@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==" + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==" + }, + "@noble/secp256k1": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz", + "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==" + }, + "@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, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@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 + }, + "@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, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@polkadot/networks": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-10.1.7.tgz", + "integrity": "sha512-ol864SZ/GwAF72GQOPRy+Y9r6NtgJJjMBlDLESvV5VK64eEB0MRSSyiOdd7y/4SumR9crrrNimx3ynACFgxZ8A==", + "requires": { + "@babel/runtime": "^7.18.9", + "@polkadot/util": "10.1.7", + "@substrate/ss58-registry": "^1.28.0" + } + }, + "@polkadot/util": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-10.1.7.tgz", + "integrity": "sha512-s7gDLdNb4HUpoe3faXwoO6HwiUp8pi66voYKiUYRh1kEtW1o9vGBgyZPHPGC/FBgILzTJKii/9XxnSex60zBTA==", + "requires": { + "@babel/runtime": "^7.18.9", + "@polkadot/x-bigint": "10.1.7", + "@polkadot/x-global": "10.1.7", + "@polkadot/x-textdecoder": "10.1.7", + "@polkadot/x-textencoder": "10.1.7", + "@types/bn.js": "^5.1.1", + "bn.js": "^5.2.1" + } + }, + "@polkadot/util-crypto": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-10.1.7.tgz", + "integrity": "sha512-zGmSU7a0wdWfpDtfc+Q7fUuW+extu9o1Uh4JpkuwwZ/dxmyW5xlfqVsIScM1pdPyjJsyamX8KwsKiVsW4slasg==", + "requires": { + "@babel/runtime": "^7.18.9", + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.6.3", + "@polkadot/networks": "10.1.7", + "@polkadot/util": "10.1.7", + "@polkadot/wasm-crypto": "^6.3.1", + "@polkadot/x-bigint": "10.1.7", + "@polkadot/x-randomvalues": "10.1.7", + "@scure/base": "1.1.1", + "ed2curve": "^0.3.0", + "tweetnacl": "^1.0.3" + } + }, + "@polkadot/wasm-bridge": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-bridge/-/wasm-bridge-6.3.1.tgz", + "integrity": "sha512-1TYkHsb9AEFhU9uZj3biEnN2yKQNzdrwSjiTvfCYnt97pnEkKsZI6cku+YPZQv5w/x9CQa5Yua9e2DVVZSivGA==", + "requires": { + "@babel/runtime": "^7.18.9" + } + }, + "@polkadot/wasm-crypto": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto/-/wasm-crypto-6.3.1.tgz", + "integrity": "sha512-OO8h0qeVkqp4xYZaRVl4iuWOEtq282pNBHDKb6SOJuI2g59eWGcKh4EQU9Me2VP6qzojIqptrkrVt7KQXC68gA==", + "requires": { + "@babel/runtime": "^7.18.9", + "@polkadot/wasm-bridge": "6.3.1", + "@polkadot/wasm-crypto-asmjs": "6.3.1", + "@polkadot/wasm-crypto-init": "6.3.1", + "@polkadot/wasm-crypto-wasm": "6.3.1", + "@polkadot/wasm-util": "6.3.1" + } + }, + "@polkadot/wasm-crypto-asmjs": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-6.3.1.tgz", + "integrity": "sha512-zbombRfA5v/mUWQQhgg2YwaxhRmxRIrvskw65x+lruax3b6xPBFDs7yplopiJU3r8h2pTgQvX/DUksvqz2TCRQ==", + "requires": { + "@babel/runtime": "^7.18.9" + } + }, + "@polkadot/wasm-crypto-init": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-init/-/wasm-crypto-init-6.3.1.tgz", + "integrity": "sha512-9yaUBcu+snwjJLmPPGl3cyGRQ1afyFGm16qzTM0sgG/ZCfUlK4uk8KWZe+sBUKgoxb2oXY7Y4WklKgQI1YBdfw==", + "requires": { + "@babel/runtime": "^7.18.9", + "@polkadot/wasm-bridge": "6.3.1", + "@polkadot/wasm-crypto-asmjs": "6.3.1", + "@polkadot/wasm-crypto-wasm": "6.3.1" + } + }, + "@polkadot/wasm-crypto-wasm": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-6.3.1.tgz", + "integrity": "sha512-idSlzKGVzCfeCMRHsacRvqwojSaTadFxL/Dbls4z1thvfa3U9Ku0d2qVtlwg7Hj+tYWDiuP8Kygs+6bQwfs0XA==", + "requires": { + "@babel/runtime": "^7.18.9", + "@polkadot/wasm-util": "6.3.1" + } + }, + "@polkadot/wasm-util": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-util/-/wasm-util-6.3.1.tgz", + "integrity": "sha512-12oAv5J7Yoc9m6jixrSaQCxpOkWOyzHx3DMC8qmLjRiwdBWxqLmImOVRVnFsbaxqSbhBIHRuJphVxWE+GZETDg==", + "requires": { + "@babel/runtime": "^7.18.9" + } + }, + "@polkadot/x-bigint": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-10.1.7.tgz", + "integrity": "sha512-uaClHpI6cnDumIfejUKvNTkB43JleEb0V6OIufDKJ/e1aCLE3f/Ws9ggwL8ea05lQP5k5xqOzbPdizi/UvrgKQ==", + "requires": { + "@babel/runtime": "^7.18.9", + "@polkadot/x-global": "10.1.7" + } + }, + "@polkadot/x-global": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-10.1.7.tgz", + "integrity": "sha512-k2ZUZyBVgDnP/Ysxapa0mthn63j6gsN2V0kZejEQPyOfCHtQQkse3jFvAWdslpWoR8j2k8SN5O6reHc0F4f7mA==", + "requires": { + "@babel/runtime": "^7.18.9" + } + }, + "@polkadot/x-randomvalues": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-10.1.7.tgz", + "integrity": "sha512-3er4UYOlozLGgFYWwcbmcFslmO8m82u4cAGR4AaEag0VdV7jLO/M5lTmivT/3rtLSww6sjkEfr522GM2Q5lmFg==", + "requires": { + "@babel/runtime": "^7.18.9", + "@polkadot/x-global": "10.1.7" + } + }, + "@polkadot/x-textdecoder": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-10.1.7.tgz", + "integrity": "sha512-iAFOHludmZFOyVL8sQFv4TDqbcqQU5gwwYv74duTA+WQBgbSITJrBahSCV/rXOjUqds9pzQO3qBFzziznNnkiQ==", + "requires": { + "@babel/runtime": "^7.18.9", + "@polkadot/x-global": "10.1.7" + } + }, + "@polkadot/x-textencoder": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-10.1.7.tgz", + "integrity": "sha512-GzjaWZDbgzZ0IQT60xuZ7cZ0wnlNVYMqpfI9KvBc58X9dPI3TIMwzbXDVzZzpjY1SAqJGs4hJse9HMWZazfhew==", + "requires": { + "@babel/runtime": "^7.18.9", + "@polkadot/x-global": "10.1.7" + } + }, + "@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==" + }, + "@sinclair/typebox": { + "version": "0.25.21", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.21.tgz", + "integrity": "sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g==", + "dev": true + }, + "@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^2.0.0" + } + }, + "@substrate/ss58-registry": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.29.0.tgz", + "integrity": "sha512-KTqwZgTjtWPhCAUJJx9qswP/p9cRKUU9GOHYUDKNdISFDiFafWmpI54JHfYLkgjvkSKEUgRZnvLpe0LMF1fXvw==" + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "requires": { + "@types/node": "*" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/eslint": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "@types/express": { + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.16.tgz", + "integrity": "sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.31", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.4.0.tgz", + "integrity": "sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "@types/node": { + "version": "16.11.58", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.58.tgz", + "integrity": "sha512-uMVxJ111wpHzkx/vshZFb6Qni3BOMnlWLq7q9jrwej7Yw/KvjsEbpxCCxw+hLKxexFMc8YmpG8J9tnEe/rKsIg==" + }, + "@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/react": { + "version": "18.0.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.18.tgz", + "integrity": "sha512-6hI08umYs6NaiHFEEGioXnxJ+oEhY3eRz8VCUaudZmGdtvPviCJB8mgaMxaDWAdPSYd4eFavrPk2QIolwbLYrg==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", + "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-measure": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/react-measure/-/react-measure-2.0.8.tgz", + "integrity": "sha512-Pu4/hQ/1AKVN6efoawtcM+l376WYOI8e1fiM6ir4pdLkHilDCkJLjUGvAm0mWKJ0GE6hzu55yCrcJ/xNyEdFwA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "dev": true + }, + "@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "17.0.20", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.20.tgz", + "integrity": "sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.49.0.tgz", + "integrity": "sha512-IhxabIpcf++TBaBa1h7jtOWyon80SXPRLDq0dVz5SLFC/eW6tofkw/O7Ar3lkx5z5U6wzbKDrl2larprp5kk5Q==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/type-utils": "5.49.0", + "@typescript-eslint/utils": "5.49.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.49.0.tgz", + "integrity": "sha512-veDlZN9mUhGqU31Qiv2qEp+XrJj5fgZpJ8PW30sHU+j/8/e5ruAhLaVDAeznS7A7i4ucb/s8IozpDtt9NqCkZg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/typescript-estree": "5.49.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz", + "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.49.0.tgz", + "integrity": "sha512-eUgLTYq0tR0FGU5g1YHm4rt5H/+V2IPVkP0cBmbhRyEmyGe4XvJ2YJ6sYTmONfjmdMqyMLad7SB8GvblbeESZA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.49.0", + "@typescript-eslint/utils": "5.49.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz", + "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz", + "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.49.0.tgz", + "integrity": "sha512-cPJue/4Si25FViIb74sHCLtM4nTSBXtLx1d3/QT6mirQ/c65bV8arBEebBJJizfq8W2YyMoPI/WWPFWitmNqnQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/typescript-estree": "5.49.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz", + "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.49.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", + "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "dev": true, + "requires": {} + }, + "@webpack-cli/serve": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", + "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + }, + "acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "requires": {} + }, + "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, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "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 + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-includes": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.flatmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "babel-jest": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.4.0.tgz", + "integrity": "sha512-M61cGPg4JBashDvIzKoIV/y95mSF6x3ome7CMEaszUTHD4uo6dtC6Nln+fvRTspYNtwy8lDHl5lmoTBSNY/a+g==", + "dev": true, + "requires": { + "@jest/transform": "^29.4.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.4.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.0.tgz", + "integrity": "sha512-a/sZRLQJEmsmejQ2rPEUe35nO1+C9dc9O1gplH1SXmJxveQSRUYdBk8yGZG/VOUuZs1u2aHZJusEGoRMbhhwCg==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.4.0.tgz", + "integrity": "sha512-fUB9vZflUSM3dO/6M2TCAepTzvA4VkOvl67PjErcrQMGt9Eve7uazaeyCZ2th3UtI7ljpiBJES0F7A1vBRsLZA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^29.4.0", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "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 + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "bonjour-service": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", + "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", + "dev": true, + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "requires": { + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001687", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "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, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + }, + "ci-info": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "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 + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "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, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "dev": true + }, + "data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "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 + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "requires": { + "webidl-conversions": "^7.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } + } + }, + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" + }, + "dotenv-defaults": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-2.0.2.tgz", + "integrity": "sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==", + "requires": { + "dotenv": "^8.2.0" + } + }, + "dotenv-webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-8.1.0.tgz", + "integrity": "sha512-owK1JcsPkIobeqjVrk6h7jPED/W6ZpdFsMPR+5ursB7/SdgDyO+VzAU+szK8C8u3qUhtENyYnj8eyXMR5kkGag==", + "requires": { + "dotenv-defaults": "^2.0.2" + } + }, + "ed2curve": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.3.0.tgz", + "integrity": "sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ==", + "requires": { + "tweetnacl": "1.x.x" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.246", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.246.tgz", + "integrity": "sha512-/wFCHUE+Hocqr/LlVGsuKLIw4P2lBWwFIDcNMDpJGzyIysQV4aycpoOitAs32FT94EHKnNqDR/CVZJFbXEufJA==" + }, + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.2", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "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 + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", + "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.3.1", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", + "ajv": "^6.10.0", + "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.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^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.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.31.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", + "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.7" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "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, + "requires": {} + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.4.0.tgz", + "integrity": "sha512-pzaAwjBgLEVxBh6ZHiqb9Wv3JYuv6m8ntgtY7a48nS+2KbX0EJkPS3FQlKiTZNcqzqJHNyQsfjqN60w1hPUBfQ==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.4.0", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.4.0", + "jest-message-util": "^29.4.0", + "jest-util": "^29.4.0" + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "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==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "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, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "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==" + }, + "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 + }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "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, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "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==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "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, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "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 + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "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 + }, + "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 + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "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 + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "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, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "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, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "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==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "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, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "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 + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "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, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "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, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.4.0.tgz", + "integrity": "sha512-Zfd4UzNxPkSoHRBkg225rBjQNa6pVqbh20MGniAzwaOzYLd+pQUcAwH+WPxSXxKFs+QWYfPYIq9hIVSmdVQmPA==", + "dev": true, + "requires": { + "@jest/core": "^29.4.0", + "@jest/types": "^29.4.0", + "import-local": "^3.0.2", + "jest-cli": "^29.4.0" + } + }, + "jest-changed-files": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.4.0.tgz", + "integrity": "sha512-rnI1oPxgFghoz32Y8eZsGJMjW54UlqT17ycQeCEktcxxwqqKdlj9afl8LNeO0Pbu+h2JQHThQP0BzS67eTRx4w==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + } + }, + "jest-circus": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.4.0.tgz", + "integrity": "sha512-/pFBaCeLzCavRWyz14JwFgpZgPpEZdS6nPnREhczbHl2wy2UezvYcVp5akVFfUmBaA4ThAUp0I8cpgkbuNOm3g==", + "dev": true, + "requires": { + "@jest/environment": "^29.4.0", + "@jest/expect": "^29.4.0", + "@jest/test-result": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.4.0", + "jest-matcher-utils": "^29.4.0", + "jest-message-util": "^29.4.0", + "jest-runtime": "^29.4.0", + "jest-snapshot": "^29.4.0", + "jest-util": "^29.4.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.4.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-cli": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.4.0.tgz", + "integrity": "sha512-YUkICcxjUd864VOzbfQEi2qd2hIIOd9bRF7LJUNyhWb3Khh3YKrbY0LWwoZZ4WkvukiNdvQu0Z4s6zLsY4hYfg==", + "dev": true, + "requires": { + "@jest/core": "^29.4.0", + "@jest/test-result": "^29.4.0", + "@jest/types": "^29.4.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.4.0", + "jest-util": "^29.4.0", + "jest-validate": "^29.4.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + }, + "jest-config": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.4.0.tgz", + "integrity": "sha512-jtgd72nN4Mob4Oego3N/pLRVfR2ui1hv+yO6xR/SUi5G7NtZ/grr95BJ1qRSDYZshuA0Jw57fnttZHZKb04+CA==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.4.0", + "@jest/types": "^29.4.0", + "babel-jest": "^29.4.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.4.0", + "jest-environment-node": "^29.4.0", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.4.0", + "jest-runner": "^29.4.0", + "jest-util": "^29.4.0", + "jest-validate": "^29.4.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.4.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + } + }, + "jest-diff": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.4.0.tgz", + "integrity": "sha512-s8KNvFx8YgdQ4fn2YLDQ7N6kmVOP68dUDVJrCHNsTc3UM5jcmyyFeYKL8EPWBQbJ0o0VvDGbWp8oYQ1nsnqnWw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.4.0" + } + }, + "jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.4.0.tgz", + "integrity": "sha512-LTOvB8JDVFjrwXItyQiyLuDYy5PMApGLLzbfIYR79QLpeohS0bcS6j2HjlWuRGSM8QQQyp+ico59Blv+Jx3fMw==", + "dev": true, + "requires": { + "@jest/types": "^29.4.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.4.0", + "pretty-format": "^29.4.0" + } + }, + "jest-environment-jsdom": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.4.0.tgz", + "integrity": "sha512-z1tB/qtReousDnU695K38ZzoR6B3dRXazwgyhTHzMviSC2T3KmVy0T722fZxR2q3x/Jvv85JxU/2xs8kwX394w==", + "dev": true, + "requires": { + "@jest/environment": "^29.4.0", + "@jest/fake-timers": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.4.0", + "jest-util": "^29.4.0", + "jsdom": "^20.0.0" + } + }, + "jest-environment-node": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.4.0.tgz", + "integrity": "sha512-WVveE3fYSH6FhDtZdvXhFKeLsDRItlQgnij+HQv6ZKxTdT1DB5O0sHXKCEC3K5mHraMs1Kzn4ch9jXC7H4L4wA==", + "dev": true, + "requires": { + "@jest/environment": "^29.4.0", + "@jest/fake-timers": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "jest-mock": "^29.4.0", + "jest-util": "^29.4.0" + } + }, + "jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true + }, + "jest-haste-map": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.0.tgz", + "integrity": "sha512-m/pIEfoK0HoJz4c9bkgS5F9CXN2AM22eaSmUcmqTpadRlNVBOJE2CwkgaUzbrNn5MuAqTV1IPVYwWwjHNnk8eA==", + "dev": true, + "requires": { + "@jest/types": "^29.4.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.4.0", + "jest-worker": "^29.4.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "dependencies": { + "jest-worker": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.0.tgz", + "integrity": "sha512-dICMQ+Q4W0QVMsaQzWlA1FVQhKNz7QcDCOGtbk1GCAd0Lai+wdkQvfmQwL4MjGumineh1xz+6M5oMj3rfWS02A==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.4.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.4.0.tgz", + "integrity": "sha512-fEGHS6ijzgSv5exABkCecMHNmyHcV52+l39ZsxuwfxmQMp43KBWJn2/Fwg8/l4jTI9uOY9jv8z1dXGgL0PHFjA==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.4.0" + } + }, + "jest-matcher-utils": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.4.0.tgz", + "integrity": "sha512-pU4OjBn96rDdRIaPUImbPiO2ETyRVzkA1EZVu9AxBDv/XPDJ7JWfkb6IiDT5jwgicaPHMrB/fhVa6qjG6potfA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.4.0", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.4.0" + } + }, + "jest-message-util": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.4.0.tgz", + "integrity": "sha512-0FvobqymmhE9pDEifvIcni9GeoKLol8eZspzH5u41g1wxYtLS60a9joT95dzzoCgrKRidNz64eaAXyzaULV8og==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.4.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.4.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.4.0.tgz", + "integrity": "sha512-+ShT5i+hcu/OFQRV0f/V/YtwpdFcHg64JZ9A8b40JueP+X9HNrZAYGdkupGIzsUK8AucecxCt4wKauMchxubLQ==", + "dev": true, + "requires": { + "@jest/types": "^29.4.0", + "@types/node": "*", + "jest-util": "^29.4.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "dev": true + }, + "jest-resolve": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.4.0.tgz", + "integrity": "sha512-g7k7l53T+uC9Dp1mbHyDNkcCt0PMku6Wcfpr1kcMLwOHmM3vucKjSM5+DSa1r4vlDZojh8XH039J3z4FKmtTSw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.4.0", + "jest-validate": "^29.4.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "dependencies": { + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.0.tgz", + "integrity": "sha512-hxfC84trREyULSj1Cm+fMjnudrrI2dVQ04COjZRcjCZ97boJlPtfJ+qrl/pN7YXS2fnu3wTHEc3LO094pngL6A==", + "dev": true, + "requires": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.4.0" + } + }, + "jest-runner": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.4.0.tgz", + "integrity": "sha512-4zpcv0NOiJleqT0NAs8YcVbK8MhVRc58CBBn9b0Exc8VPU9GKI+DbzDUZqJYdkJhJSZFy2862l/F6hAqIow1hg==", + "dev": true, + "requires": { + "@jest/console": "^29.4.0", + "@jest/environment": "^29.4.0", + "@jest/test-result": "^29.4.0", + "@jest/transform": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.4.0", + "jest-haste-map": "^29.4.0", + "jest-leak-detector": "^29.4.0", + "jest-message-util": "^29.4.0", + "jest-resolve": "^29.4.0", + "jest-runtime": "^29.4.0", + "jest-util": "^29.4.0", + "jest-watcher": "^29.4.0", + "jest-worker": "^29.4.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "dependencies": { + "jest-worker": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.0.tgz", + "integrity": "sha512-dICMQ+Q4W0QVMsaQzWlA1FVQhKNz7QcDCOGtbk1GCAd0Lai+wdkQvfmQwL4MjGumineh1xz+6M5oMj3rfWS02A==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.4.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.4.0.tgz", + "integrity": "sha512-2zumwaGXsIuSF92Ui5Pn5hZV9r7AHMclfBLikrXSq87/lHea9anQ+mC+Cjz/DYTbf/JMjlK1sjZRh8K3yYNvWg==", + "dev": true, + "requires": { + "@jest/environment": "^29.4.0", + "@jest/fake-timers": "^29.4.0", + "@jest/globals": "^29.4.0", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.4.0", + "@jest/transform": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.0", + "jest-message-util": "^29.4.0", + "jest-mock": "^29.4.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.4.0", + "jest-snapshot": "^29.4.0", + "jest-util": "^29.4.0", + "semver": "^7.3.5", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + } + }, + "jest-snapshot": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.4.0.tgz", + "integrity": "sha512-UnK3MhdEWrQ2J6MnlKe51tvN5FjRUBQnO4m1LPlDx61or3w9+cP/U0x9eicutgunu/QzE4WC82jj6CiGIAFYzw==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.4.0", + "@jest/transform": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.4.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.4.0", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.4.0", + "jest-matcher-utils": "^29.4.0", + "jest-message-util": "^29.4.0", + "jest-util": "^29.4.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.4.0", + "semver": "^7.3.5" + } + }, + "jest-util": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.0.tgz", + "integrity": "sha512-lCCwlze7UEV8TpR9ArS8w0cTbcMry5tlBkg7QSc5og5kNyV59dnY2aKHu5fY2k5aDJMQpCUGpvL2w6ZU44lveA==", + "dev": true, + "requires": { + "@jest/types": "^29.4.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.4.0.tgz", + "integrity": "sha512-EXS7u594nX3aAPBnARxBdJ1eZ1cByV6MWrK0Qpt9lt/BcY0p0yYGp/EGJ8GhdLDQh+RFf8qMt2wzbbVzpj5+Vg==", + "dev": true, + "requires": { + "@jest/types": "^29.4.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "leven": "^3.1.0", + "pretty-format": "^29.4.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.4.0.tgz", + "integrity": "sha512-PnnfLygNKelWOJwpAYlcsQjB+OxRRdckD0qiGmYng4Hkz1ZwK3jvCaJJYiywz2msQn4rBNLdriasJtv7YpWHpA==", + "dev": true, + "requires": { + "@jest/test-result": "^29.4.0", + "@jest/types": "^29.4.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.4.0", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "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, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "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==" + }, + "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 + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "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, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + }, + "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, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "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 + }, + "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==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memfs": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", + "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "dev": true, + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "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 + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "nwsapi": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", + "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", + "dev": true + }, + "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==", + "dev": true + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "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 + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "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, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "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.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-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, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } + } + }, + "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, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + }, + "dependencies": { + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } + } + }, + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "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 + }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "pretty-format": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.0.tgz", + "integrity": "sha512-J+EVUPXIBHCdWAbvGBwXs0mk3ljGppoh/076g1S8qYS8nVG4u/yrhMvyTFHYYYKWnDdgRLExx0vA7pzxVGdlNw==", + "dev": true, + "requires": { + "@jest/schemas": "^29.4.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "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 + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + } + } + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "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==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-ga4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-ga4/-/react-ga4-2.1.0.tgz", + "integrity": "sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ==" + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "requires": { + "resolve": "^1.20.0" + }, + "dependencies": { + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "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 + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "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 + }, + "resolve.exports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.0.tgz", + "integrity": "sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==", + "dev": true + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "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, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "requires": { + "node-forge": "^1" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "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, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "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 + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "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, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "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 + }, + "style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "dev": true, + "requires": {} + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + }, + "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 + }, + "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 + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, + "terser": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "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 + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "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 + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "ts-jest": { + "version": "29.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + } + }, + "ts-loader": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "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, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "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 + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true + }, + "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, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", + "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + } + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "requires": { + "xml-name-validator": "^4.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true + }, + "webpack": { + "version": "5.76.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", + "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + } + }, + "webpack-cli": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", + "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.1", + "colorette": "^2.0.14", + "commander": "^9.4.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + }, + "dependencies": { + "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, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", + "dev": true + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "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, + "requires": { + "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" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "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 + }, + "write-file-atomic": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", + "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9d02116 --- /dev/null +++ b/package.json @@ -0,0 +1,69 @@ +{ + "name": "ghost-telemetry-frontend", + "version": "0.1.5", + "author": "Uncle f4tso ", + "license": "GPL-3.0", + "description": "Ghost Telemetry frontend", + "scripts": { + "start": "webpack serve --mode=development", + "build": "webpack --mode=production", + "test": "jest", + "pretty:check": "prettier --check src/**/*.{ts,tsx}", + "pretty:fix": "prettier --write src", + "clean": "rm -rf node_modules build ./tmp/env-config.js report*.json npm-error.log", + "lint": "eslint src" + }, + "dependencies": { + "@polkadot/util-crypto": "^10.1.7", + "dotenv-webpack": "^8.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-ga4": "^2.1.0" + }, + "devDependencies": { + "@types/jest": "29.4.0", + "@types/node": "^16.11.58", + "@types/react": "^18.0.18", + "@types/react-dom": "^18.0.6", + "@types/react-measure": "^2.0.6", + "@typescript-eslint/eslint-plugin": "^5.49.0", + "@typescript-eslint/parser": "^5.49.0", + "css-loader": "^6.7.3", + "eslint": "^8.23.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.31.8", + "eslint-plugin-react-hooks": "^4.6.0", + "html-webpack-plugin": "^5.5.0", + "jest": "^29.4.0", + "jest-environment-jsdom": "^29.4.0", + "prettier": "^2.0.5", + "style-loader": "^3.3.1", + "ts-jest": "29.0.5", + "ts-loader": "^9.4.2", + "typescript": "^4.9.4", + "webpack": "^5.76.0", + "webpack-cli": "^5.0.1", + "webpack-dev-server": "^4.11.1", + "whatwg-fetch": "^3.6.2" + }, + "lint-staged": { + "src/**/*.{ts,tsx,json,css}": [ + "pretty:fix" + ] + }, + "browserslist": { + "production": [ + "chrome >= 67", + "edge >= 79", + "firefox >= 68", + "opera >= 54", + "safari >= 14" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/setupJest.js b/setupJest.js new file mode 100644 index 0000000..bf1ed65 --- /dev/null +++ b/setupJest.js @@ -0,0 +1,9 @@ +// This file runs some code before a jest test. + +// polyfill TextEncoder/TextDecoder since they aren't in jsdom: +const { TextEncoder, TextDecoder } = require('util'); +global.TextEncoder = TextEncoder; +global.TextDecoder = TextDecoder; + +// polyfill fetch since it's not in jsdom: +require('whatwg-fetch'); diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..3df102e --- /dev/null +++ b/src/App.css @@ -0,0 +1,52 @@ +.App { + text-align: left; + font-family: 'Ubuntu', sans-serif; + font-size: 16px; + min-width: 1350px; +} + +.App-no-telemetry { + height: 100vh; + min-width: 0px; + font-size: 56px; + text-align: center; + color: #fff; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.App-no-telemetry-spinner { + position: relative; + width: 100%; + height: 300px; + min-height: 240px; +} + +.App-no-telemetry-spinner > img { + width: 300px; + height: 300px; + min-height: 240px; + min-width: 240px; + left: 50%; + position: absolute; +} + +.App-no-telemetry-spinner > img:nth-of-type(1) { + animation: spin-clockwise 7s linear infinite; +} + +.App-no-telemetry-spinner > img:nth-of-type(2) { + animation: spin-anticlockwise 7s linear infinite; +} + +@keyframes spin-clockwise { + 0% { transform: translateX(-50%) rotate(0deg); } + 100% { transform: translateX(-50%) rotate(360deg); } +} + +@keyframes spin-anticlockwise { + 0% { transform: translateX(-50%) rotate(360deg); } + 100% { transform: translateX(-50%) rotate(0deg); } +} diff --git a/src/App.test.tsx b/src/App.test.tsx new file mode 100644 index 0000000..2b4f8b5 --- /dev/null +++ b/src/App.test.tsx @@ -0,0 +1,11 @@ +import * as React from 'react'; +import { createRoot } from 'react-dom/client'; +import App from './App'; + +describe('App.tsx', () => { + it('renders without crashing', () => { + const div = document.createElement('div'); + const root = createRoot(div); + root.render(); + }); +}); diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..d84b2f0 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,236 @@ +import * as React from 'react'; +import { Types, SortedCollection, Maybe, Compare } from './common'; +import { Chain, Ago } from './components'; +import { Row, Column } from './components/List'; +import { Connection } from './Connection'; +import { Persistent, PersistentObject, PersistentSet } from './persist'; +import { + bindState, + State, + Update, + Node, + ChainData, + comparePinnedChains, + StateSettings, +} from './state'; +import { getHashData } from './utils'; + +import innerCircleIcon from './assets/inner-circle.svg'; +import outerCircleIcon from './assets/outer-circle.svg'; + +import './App.css'; + +export default class App extends React.Component { + private chainsCache: ChainData[] = []; + // Custom state for finer control over updates + private readonly appState: Readonly; + private readonly appUpdate: Update; + private readonly settings: PersistentObject; + private readonly pins: PersistentSet; + private readonly sortBy: Persistent>; + private readonly connection: Promise; + + constructor(props: Record) { + super(props); + + //todo! Check what's important to set to true, false + this.settings = new PersistentObject( + 'settings', + { + validator: true, + location: true, + implementation: true, + networkId: true, + peers: true, + txs: true, + upload: false, + download: false, + stateCacheSize: false, + dbCacheSize: false, + diskRead: false, + diskWrite: false, + blocknumber: true, + blockhash: true, + finalized: false, + finalizedhash: false, + blocktime: true, + blockpropagation: true, + blocklasttime: false, + uptime: false, + version: false, + target_os: false, + target_arch: false, + cpu: false, + cpu_hashrate_score: true, + cpu_vendor: true, + core_count: false, + mem: true, + memory: false, + linux_distro: false, + linux_kernel: false, + memory_memcpy_score: true, + disk_sequential_write_score: true, + disk_random_write_score: true, + is_virtual_machine: false, + }, + (settings) => { + const selectedColumns = this.selectedColumns(settings); + + this.sortBy.set(null); + this.appUpdate({ settings, selectedColumns, sortBy: null }); + } + ); + + this.pins = new PersistentSet('pinned_names', (pins) => { + const { nodes } = this.appState; + + nodes.mutEachAndSort((node) => node.setPinned(pins.has(node.name))); + + this.appUpdate({ nodes, pins }); + }); + + this.sortBy = new Persistent>('sortBy', null, (sortBy) => { + const compare = this.getComparator(sortBy); + + this.appState.nodes.setComparator(compare); + this.appUpdate({ sortBy }); + }); + + const { tab = '' } = getHashData(); + + this.appUpdate = bindState(this, { + status: 'offline', + best: 0 as Types.BlockNumber, + finalized: 0 as Types.BlockNumber, + blockTimestamp: 0 as Types.Timestamp, + blockAverage: null, + timeDiff: 0 as Types.Milliseconds, + subscribed: null, + chains: new Map(), + nodes: new SortedCollection(Node.compare), + settings: this.settings.raw(), + pins: this.pins.get(), + sortBy: this.sortBy.get(), + selectedColumns: this.selectedColumns(this.settings.raw()), + tab, + chainStats: null, + }); + this.appState = this.appUpdate({}); + + const comparator = this.getComparator(this.sortBy.get()); + + this.appState.nodes.setComparator(comparator); + this.connection = Connection.create( + this.pins, + this.appState, + this.appUpdate + ); + + setInterval(() => (this.chainsCache = []), 10000); + } + + public render() { + const { timeDiff, subscribed, status, tab } = this.appState; + const chains = this.chains(); + const subscribedData = subscribed + ? this.appState.chains.get(subscribed) + : null; + + Ago.timeDiff = timeDiff; + + if (chains.length === 0) { + return ( +
+
+ + +
+
+ Waiting for Ghosties… +
+
+ ); + } + + return ( +
+ +
+ ); + } + + public componentDidMount() { + window.addEventListener('hashchange', this.onHashChange); + } + + public componentWillUnmount() { + window.removeEventListener('hashchange', this.onHashChange); + } + + private onHashChange = () => { + const { tab = '' } = getHashData(); + + this.appUpdate({ tab }); + }; + + private chains(): ChainData[] { + if (this.chainsCache.length === this.appState.chains.size) { + return this.chainsCache; + } + + this.chainsCache = Array.from(this.appState.chains.values()).sort( + (a, b) => { + const pinned = comparePinnedChains(a.genesisHash, b.genesisHash); + + if (pinned !== 0) { + return pinned; + } + + return b.nodeCount - a.nodeCount; + } + ); + + return this.chainsCache; + } + + private selectedColumns(settings: StateSettings): Column[] { + return Row.columns.filter( + ({ setting }) => setting == null || settings[setting] + ); + } + + private getComparator(sortBy: Maybe): Compare { + const columns = this.appState.selectedColumns; + + if (sortBy != null) { + const [index, rev] = sortBy < 0 ? [~sortBy, -1] : [sortBy, 1]; + const column = columns[index]; + + if (column != null && column.sortBy) { + const key = column.sortBy; + + return (a, b) => { + const aKey = key(a); + const bKey = key(b); + + if (aKey < bKey) { + return -1 * rev; + } else if (aKey > bKey) { + return 1 * rev; + } else { + return Node.compare(a, b); + } + }; + } + } + + return Node.compare; + } +} diff --git a/src/Connection.ts b/src/Connection.ts new file mode 100644 index 0000000..32d8e68 --- /dev/null +++ b/src/Connection.ts @@ -0,0 +1,540 @@ +import { VERSION, timestamp, FeedMessage, Types, Maybe, sleep } from './common'; +import { State, Update, Node, ChainData, PINNED_CHAINS } from './state'; +import { PersistentSet } from './persist'; +import { getHashData, setHashData } from './utils'; +import { ACTIONS } from './common/feed'; +import { + Column, + LocationColumn, + PeersColumn, + TxsColumn, + FinalizedBlockColumn, + FinalizedHashColumn, + UploadColumn, + DownloadColumn, + StateCacheColumn, +} from './components/List'; + +const CONNECTION_TIMEOUT_BASE = (1000 * 5) as Types.Milliseconds; // 5 seconds +const CONNECTION_TIMEOUT_MAX = (1000 * 60 * 5) as Types.Milliseconds; // 5 minutes +const MESSAGE_TIMEOUT = (1000 * 60) as Types.Milliseconds; // 60 seconds + +declare global { + interface Window { + process_env: string; + } +} + +export class Connection { + public static async create( + pins: PersistentSet, + appState: Readonly, + appUpdate: Update + ): Promise { + return new Connection(await Connection.socket(), appState, appUpdate, pins); + } + + private static readonly utf8decoder = new TextDecoder('utf-8'); + private static readonly address = Connection.getAddress(); + + private static getAddress(): string { + const ENV_URL = 'SUBSTRATE_TELEMETRY_URL'; + + // If env_config.js is generated and loaded in, it'll set this variable. + // This is set up in the Dockerfile. Otherwise, we just connect to a + // default URL. + if (window.process_env?.[ENV_URL]) { + return window.process_env[ENV_URL] as string; + } + + if (window.location.protocol === 'https:') { + return `wss://${window.location.hostname}/feed/`; + } + + return 'ws://127.0.0.1:8000/feed'; + } + + private static async socket(): Promise { + let socket = await Connection.trySocket(); + let timeout = CONNECTION_TIMEOUT_BASE; + + while (!socket) { + await sleep(timeout); + + timeout = Math.min( + timeout * 2, + CONNECTION_TIMEOUT_MAX + ) as Types.Milliseconds; + socket = await Connection.trySocket(); + } + + return socket; + } + + private static async trySocket(): Promise> { + return new Promise>((resolve) => { + function clean() { + socket.removeEventListener('open', onSuccess); + socket.removeEventListener('close', onFailure); + socket.removeEventListener('error', onFailure); + } + + function onSuccess() { + clean(); + resolve(socket); + } + + function onFailure() { + clean(); + resolve(null); + } + const socket = new WebSocket(Connection.address); + + socket.binaryType = 'arraybuffer'; + socket.addEventListener('open', onSuccess); + socket.addEventListener('error', onFailure); + socket.addEventListener('close', onFailure); + }); + } + + // timer which will force a reconnection if no message is seen for a while + private messageTimeout: Maybe = null; + // id sent to the backend used to pair responses + private pingId = 0; + // timeout handler for ping messages + private pingTimeout: NodeJS.Timer; + // timestamp at which the last ping has been sent + private pingSent: Maybe = null; + // chain label to resubsribe to on reconnect + private resubscribeTo: Maybe = getHashData().chain; + + constructor( + private socket: WebSocket, + private readonly appState: Readonly, + private readonly appUpdate: Update, + private readonly pins: PersistentSet + ) { + this.bindSocket(); + } + + public subscribe(chain: Types.GenesisHash) { + if ( + this.appState.subscribed != null && + this.appState.subscribed !== chain + ) { + this.appUpdate({ + tab: 'list', + }); + setHashData({ chain, tab: 'list' }); + } else { + setHashData({ chain }); + } + + this.socket.send(`subscribe:${chain}`); + } + + private handleMessages = (messages: FeedMessage.Message[]) => { + this.messageTimeout?.reset(); + const { nodes, chains, sortBy, selectedColumns } = this.appState; + const nodesStateRef = nodes.ref; + + let sortByColumn: Maybe = null; + + if (sortBy != null) { + sortByColumn = + sortBy < 0 ? selectedColumns[~sortBy] : selectedColumns[sortBy]; + } + + for (const message of messages) { + switch (message.action) { + case ACTIONS.FeedVersion: { + if (message.payload !== VERSION) { + return this.newVersion(); + } + + break; + } + + case ACTIONS.BestBlock: { + const [best, blockTimestamp, blockAverage] = message.payload; + + nodes.mutEach((node) => node.newBestBlock()); + + this.appUpdate({ best, blockTimestamp, blockAverage }); + + break; + } + + case ACTIONS.BestFinalized: { + const [finalized /*, hash */] = message.payload; + + this.appUpdate({ finalized }); + + break; + } + + case ACTIONS.AddedNode: { + const [ + id, + nodeDetails, + nodeStats, + nodeIO, + nodeHardware, + blockDetails, + location, + startupTime, + ] = message.payload; + const pinned = this.pins.has(nodeDetails[0]); + const node = new Node( + pinned, + id, + nodeDetails, + nodeStats, + nodeIO, + nodeHardware, + blockDetails, + location, + startupTime + ); + + nodes.add(node); + + break; + } + + case ACTIONS.RemovedNode: { + const id = message.payload; + + nodes.remove(id); + + break; + } + + case ACTIONS.StaleNode: { + const id = message.payload; + + nodes.mutAndSort(id, (node) => node.setStale(true)); + + break; + } + + case ACTIONS.LocatedNode: { + const [id, lat, lon, city] = message.payload; + + nodes.mutAndMaybeSort( + id, + (node) => node.updateLocation([lat, lon, city]), + sortByColumn === LocationColumn + ); + + break; + } + + case ACTIONS.ImportedBlock: { + const [id, blockDetails] = message.payload; + + nodes.mutAndSort(id, (node) => node.updateBlock(blockDetails)); + + break; + } + + case ACTIONS.FinalizedBlock: { + const [id, height, hash] = message.payload; + + nodes.mutAndMaybeSort( + id, + (node) => node.updateFinalized(height, hash), + sortByColumn === FinalizedBlockColumn || + sortByColumn === FinalizedHashColumn + ); + + break; + } + + case ACTIONS.NodeStats: { + const [id, nodeStats] = message.payload; + nodes.mutAndMaybeSort( + id, + (node) => node.updateStats(nodeStats), + sortByColumn === PeersColumn || sortByColumn === TxsColumn + ); + + break; + } + + case ACTIONS.NodeHardware: { + const [id, nodeHardware] = message.payload; + + nodes.mutAndMaybeSort( + id, + (node) => node.updateHardware(nodeHardware), + sortByColumn === UploadColumn || sortByColumn === DownloadColumn + ); + + break; + } + + case ACTIONS.NodeIO: { + const [id, nodeIO] = message.payload; + + nodes.mutAndMaybeSort( + id, + (node) => node.updateIO(nodeIO), + sortByColumn === StateCacheColumn + ); + + break; + } + + case ACTIONS.TimeSync: { + this.appUpdate({ + timeDiff: (timestamp() - message.payload) as Types.Milliseconds, + }); + + break; + } + + case ACTIONS.AddedChain: { + const [label, genesisHash, nodeCount] = message.payload; + const chain = chains.get(genesisHash); + + if (chain) { + chain.nodeCount = nodeCount; + } else { + chains.set(genesisHash, { label, genesisHash, nodeCount }); + } + + this.appUpdate({ chains }); + + break; + } + + case ACTIONS.RemovedChain: { + chains.delete(message.payload); + + if (this.appState.subscribed === message.payload) { + nodes.clear(); + this.appUpdate({ subscribed: null, nodes, chains }); + } + + break; + } + + case ACTIONS.SubscribedTo: { + nodes.clear(); + + this.appUpdate({ subscribed: message.payload, nodes }); + + break; + } + + case ACTIONS.UnsubscribedFrom: { + if (this.appState.subscribed === message.payload) { + nodes.clear(); + + this.appUpdate({ subscribed: null, nodes }); + } + + break; + } + + case ACTIONS.Pong: { + this.pong(Number(message.payload)); + + break; + } + + case ACTIONS.ChainStatsUpdate: { + this.appUpdate({ chainStats: message.payload }); + break; + } + + default: { + break; + } + } + } + + if (nodes.hasChangedSince(nodesStateRef)) { + this.appUpdate({ nodes }); + } + + this.autoSubscribe(); + }; + + private bindSocket() { + console.log('Connected'); + // Disconnect if no messages are received in 60s: + this.messageTimeout = resettableTimeout( + this.handleDisconnect, + MESSAGE_TIMEOUT + ); + // Ping periodically to keep the above happy even if no other data is coming in: + this.ping(); + + if (this.appState) { + const { nodes } = this.appState; + nodes.clear(); + } + + this.appUpdate({ + status: 'online', + }); + + if (this.appState.subscribed) { + this.resubscribeTo = this.appState.subscribed; + this.appUpdate({ subscribed: null }); + } + + this.socket.addEventListener('message', this.handleFeedData); + this.socket.addEventListener('close', this.handleDisconnect); + this.socket.addEventListener('error', this.handleDisconnect); + } + + private ping = () => { + if (this.pingSent) { + this.handleDisconnect(); + return; + } + + this.pingId += 1; + this.pingSent = timestamp(); + this.socket.send(`ping:${this.pingId}`); + }; + + private pong(id: number) { + if (!this.pingSent) { + console.error('Received a pong without sending a ping first'); + + this.handleDisconnect(); + return; + } + + if (id !== this.pingId) { + console.error('pingId differs'); + + this.handleDisconnect(); + } + + const latency = timestamp() - this.pingSent; + console.log(`Ping latency: ${latency}ms`); + + this.pingSent = null; + + // Schedule a new ping to be sent at least 30s after the last one: + this.pingTimeout = setTimeout( + this.ping, + Math.max(0, MESSAGE_TIMEOUT / 2 - latency) + ); + } + + private newVersion() { + this.appUpdate({ status: 'upgrade-requested' }); + this.clean(); + + // Force reload from the server + setTimeout(() => window.location.reload(), 3000); + } + + private clean() { + clearTimeout(this.pingTimeout); + this.pingSent = null; + this.messageTimeout?.cancel(); + this.messageTimeout = null; + + this.socket.removeEventListener('message', this.handleFeedData); + this.socket.removeEventListener('close', this.handleDisconnect); + this.socket.removeEventListener('error', this.handleDisconnect); + } + + private handleFeedData = (event: MessageEvent) => { + let data: FeedMessage.Data; + + if (typeof event.data === 'string') { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + data = event.data as any as FeedMessage.Data; + } else { + const u8aData = new Uint8Array(event.data); + + // Future-proofing for when we switch to binary feed + if (u8aData[0] === 0x00) { + return this.newVersion(); + } + + const str = Connection.utf8decoder.decode(event.data); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + data = str as any as FeedMessage.Data; + } + + this.handleMessages(FeedMessage.deserialize(data)); + }; + + private autoSubscribe() { + const { subscribed, chains } = this.appState; + const { resubscribeTo } = this; + + if (subscribed) { + return; + } + + if (resubscribeTo) { + if (chains.has(resubscribeTo)) { + this.subscribe(resubscribeTo); + return; + } + } + + let topChain: Maybe = null; + + for (const chain of chains.values()) { + if (PINNED_CHAINS[chain.genesisHash] === 1) { + topChain = chain; + break; + } + + if (!topChain || chain.nodeCount > topChain.nodeCount) { + topChain = chain; + } + } + + if (topChain) { + this.subscribe(topChain.genesisHash); + } + } + + private handleDisconnect = async () => { + console.warn('Disconnecting; will attempt reconnect'); + this.appUpdate({ status: 'offline' }); + this.clean(); + this.socket.close(); + this.socket = await Connection.socket(); + this.bindSocket(); + }; +} + +/** + * Fire a function if the timer runs out. You can reset it, or + * cancel it to prevent the function from being fired. + * + * @param onExpired + * @param timeoutMs + * @returns + */ +function resettableTimeout( + onExpired: () => void, + timeoutMs: Types.Milliseconds +) { + let timer = setTimeout(onExpired, timeoutMs); + + return { + reset() { + clearTimeout(timer); + timer = setTimeout(onExpired, timeoutMs); + }, + cancel() { + clearTimeout(timer); + }, + }; +} +type ResettableTimeout = ReturnType; diff --git a/src/assets/ghost-logo.svg b/src/assets/ghost-logo.svg new file mode 100644 index 0000000..5522afe --- /dev/null +++ b/src/assets/ghost-logo.svg @@ -0,0 +1 @@ + diff --git a/src/assets/inner-circle.svg b/src/assets/inner-circle.svg new file mode 100644 index 0000000..3cdb1c6 --- /dev/null +++ b/src/assets/inner-circle.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/inner-circle_old.svg b/src/assets/inner-circle_old.svg new file mode 100644 index 0000000..2839b90 --- /dev/null +++ b/src/assets/inner-circle_old.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/outer-circle.svg b/src/assets/outer-circle.svg new file mode 100644 index 0000000..f6a3353 --- /dev/null +++ b/src/assets/outer-circle.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/world-map.svg b/src/assets/world-map.svg new file mode 100644 index 0000000..ed543ad --- /dev/null +++ b/src/assets/world-map.svg @@ -0,0 +1 @@ + diff --git a/src/common/SortedCollection.ts b/src/common/SortedCollection.ts new file mode 100644 index 0000000..d4546c2 --- /dev/null +++ b/src/common/SortedCollection.ts @@ -0,0 +1,240 @@ +import { Maybe, Opaque } from './helpers'; + +export type Compare = (a: T, b: T) => number; + +export function sortedInsert( + item: T, + into: Array, + compare: Compare +): number { + if (into.length === 0) { + into.push(item); + + return 0; + } + + let min = 0; + let max = into.length - 1; + + while (min !== max) { + const guess = ((min + max) / 2) | 0; + + if (compare(item, into[guess]) < 0) { + max = Math.max(min, guess - 1); + } else { + min = Math.min(max, guess + 1); + } + } + + const insert = compare(item, into[min]) <= 0 ? min : min + 1; + + into.splice(insert, 0, item); + + return insert; +} + +export function sortedIndexOf( + item: T, + within: Array, + compare: Compare +): number { + if (within.length === 0) { + return -1; + } + + let min = 0; + let max = within.length - 1; + + while (min !== max) { + const guess = ((min + max) / 2) | 0; + const other = within[guess]; + + if (item === other) { + return guess; + } + + const result = compare(item, other); + + if (result < 0) { + max = Math.max(min, guess - 1); + } else if (result > 0) { + min = Math.min(max, guess + 1); + } else { + // Equal sort value, but different reference, do value search from min + return within.indexOf(item, min); + } + } + + if (item === within[min]) { + return min; + } + + return -1; +} + +type StateRef = Opaque; + +interface Focus { + start: number; + end: number; +} + +export class SortedCollection { + // Comparator function used to sort the collection + private compare: Compare; + // Mapping item `id` to the `Item`, this uses array as a structure with + // the assumption that `id`s provided are increments from `0`, and that + // vacant `id`s will be re-used in the future. + private map = Array>(); + // Actual sorted list of `Item`s. + private list = Array(); + // Internal tracker for changes, this number increments whenever the + // order of the **focused** elements in the collection changes + private changeRef = 0; + // Marks the range of indicies that are focused for tracking. + // **Note:** `start` is inclusive, while `end` is exclusive (much like + // `Array.slice()`). + private focus: Focus = { start: 0, end: 0 }; + + constructor(compare: Compare) { + this.compare = compare; + } + + public setComparator(compare: Compare) { + this.compare = compare; + this.list = this.map.filter((item) => item != null) as Item[]; + this.list.sort(compare); + this.changeRef += 1; + } + + public add(item: Item) { + if (this.map.length <= item.id) { + // Grow map if item.id would be out of scope + this.map = this.map.concat( + Array>(Math.max(10, 1 + item.id - this.map.length)) + ); + } + + // Remove old item if overriding + this.remove(item.id); + + this.map[item.id] = item; + + const index = sortedInsert(item, this.list, this.compare); + + if (index < this.focus.end) { + this.changeRef += 1; + } + } + + public remove(id: number) { + const item = this.map[id]; + + if (!item) { + return; + } + + const index = sortedIndexOf(item, this.list, this.compare); + this.list.splice(index, 1); + this.map[id] = null; + + if (index < this.focus.end) { + this.changeRef += 1; + } + } + + public get(id: number): Maybe { + return this.map[id]; + } + + public sorted(): Array { + return this.list; + } + + public mut(id: number, mutator: (item: Item) => void) { + const item = this.map[id]; + + if (!item) { + return; + } + + const index = sortedIndexOf(item, this.list, this.compare); + + mutator(item); + + if (index >= this.focus.start && index < this.focus.end) { + this.changeRef += 1; + } + } + + public mutAndSort(id: number, mutator: (item: Item) => void) { + const item = this.map[id]; + + if (!item) { + return; + } + + const index = sortedIndexOf(item, this.list, this.compare); + + mutator(item); + + this.list.splice(index, 1); + + const newIndex = sortedInsert(item, this.list, this.compare); + + if (newIndex !== index) { + const outOfFocus = + (index < this.focus.start && newIndex < this.focus.start) || + (index >= this.focus.end && newIndex >= this.focus.end); + + if (!outOfFocus) { + this.changeRef += 1; + } + } + } + + public mutAndMaybeSort( + id: number, + mutator: (item: Item) => void, + sort: boolean + ) { + if (sort) { + this.mutAndSort(id, mutator); + } else { + this.mut(id, mutator); + } + } + + public mutEach(mutator: (item: Item) => void) { + this.list.forEach(mutator); + } + + public mutEachAndSort(mutator: (item: Item) => void) { + this.list.forEach(mutator); + this.list.sort(this.compare); + this.changeRef += 1; + } + + public clear() { + this.map = []; + this.list = []; + + this.changeRef += 1; + } + + // Set a new `Focus`. Any changes to the order of items within the `Focus` + // will increment `changeRef`. + public setFocus(start: number, end: number) { + this.focus = { start, end }; + } + + // Get the reference to current ordering state of focused items. + public get ref(): StateRef { + return this.changeRef as StateRef; + } + + // Check if order of focused items has changed since obtaining a `ref`. + public hasChangedSince(ref: StateRef): boolean { + return this.changeRef > ref; + } +} diff --git a/src/common/common.test.ts b/src/common/common.test.ts new file mode 100644 index 0000000..37631fe --- /dev/null +++ b/src/common/common.test.ts @@ -0,0 +1,83 @@ +import { sortedInsert, sortedIndexOf } from '.'; + +describe('sortedInsert', () => { + it('inserts a value in the correct place', () => { + function assertInsert(item: number, into: number[], equals: number[]) { + const cmp = (a: number, b: number) => a - b; + sortedInsert(item, into, cmp); + expect(into).toStrictEqual(equals); + } + + assertInsert(1, [2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9]); + assertInsert(2, [1, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9]); + assertInsert(3, [1, 2, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9]); + assertInsert(4, [1, 2, 3, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9]); + assertInsert(5, [1, 2, 3, 4, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9]); + assertInsert(6, [1, 2, 3, 4, 5, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9]); + assertInsert(7, [1, 2, 3, 4, 5, 6, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9]); + assertInsert(8, [1, 2, 3, 4, 5, 6, 7, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9]); + assertInsert(9, [1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7, 8, 9]); + }); + + it('fuzz tests insert as expected', () => { + const cmp = (a: number, b: number) => a - b; + const scramble = () => Math.random() - 0.5; + const sorted = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + + for (let i = 0; i < 50; i++) { + const scrambled = sorted.sort(scramble); + const resorted: number[] = []; + + for (const item of scrambled) { + sortedInsert(item, resorted, cmp); + } + + expect(resorted).toStrictEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]); + } + }); + + it('indexes', () => { + const cmp = (a: number, b: number) => a - b; + const into: number[] = []; + + expect(sortedInsert(5, into, cmp)).toStrictEqual(0); + expect(into).toStrictEqual([5]); + expect(sortedInsert(1, into, cmp)).toStrictEqual(0); + expect(into).toStrictEqual([1, 5]); + expect(sortedInsert(9, into, cmp)).toStrictEqual(2); + expect(into).toStrictEqual([1, 5, 9]); + expect(sortedInsert(3, into, cmp)).toStrictEqual(1); + expect(into).toStrictEqual([1, 3, 5, 9]); + expect(sortedInsert(7, into, cmp)).toStrictEqual(3); + expect(into).toStrictEqual([1, 3, 5, 7, 9]); + expect(sortedInsert(4, into, cmp)).toStrictEqual(2); + expect(into).toStrictEqual([1, 3, 4, 5, 7, 9]); + expect(sortedInsert(6, into, cmp)).toStrictEqual(4); + expect(into).toStrictEqual([1, 3, 4, 5, 6, 7, 9]); + expect(sortedInsert(2, into, cmp)).toStrictEqual(1); + expect(into).toStrictEqual([1, 2, 3, 4, 5, 6, 7, 9]); + expect(sortedInsert(8, into, cmp)).toStrictEqual(7); + expect(into).toStrictEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]); + }); + + it('sortedIndexOf', () => { + type ValueObj = { + value: number; + }; + const cmp = (a: ValueObj, b: ValueObj) => a.value - b.value; + const array: Array = []; + + for (let i = 1; i <= 1000; i++) { + array.push({ value: i >> 1 }); + } + + for (let i = 0; i < 50; i++) { + const index = (Math.random() * 1000) | 0; + const item = array[index]; + + expect(sortedIndexOf(item, array, cmp)).toStrictEqual( + array.indexOf(item) + ); + } + }); +}); diff --git a/src/common/feed.ts b/src/common/feed.ts new file mode 100644 index 0000000..4f4e0ee --- /dev/null +++ b/src/common/feed.ts @@ -0,0 +1,243 @@ +import { Maybe } from './helpers'; +import { stringify, parse, Stringified } from './stringify'; +import { + FeedVersion, + Address, + Latitude, + Longitude, + City, + NodeId, + NodeCount, + NodeDetails, + NodeStats, + NodeIO, + NodeHardware, + NodeLocation, + BlockNumber, + BlockHash, + BlockDetails, + Timestamp, + Milliseconds, + ChainLabel, + GenesisHash, + AuthoritySetInfo, + ChainStats, +} from './types'; + +export const ACTIONS = { + FeedVersion: 0x00 as const, + BestBlock: 0x01 as const, + BestFinalized: 0x02 as const, + AddedNode: 0x03 as const, + RemovedNode: 0x04 as const, + LocatedNode: 0x05 as const, + ImportedBlock: 0x06 as const, + FinalizedBlock: 0x07 as const, + NodeStats: 0x08 as const, + NodeHardware: 0x09 as const, + TimeSync: 0x0a as const, + AddedChain: 0x0b as const, + RemovedChain: 0x0c as const, + SubscribedTo: 0x0d as const, + UnsubscribedFrom: 0x0e as const, + Pong: 0x0f as const, + AfgFinalized: 0x10 as const, + AfgReceivedPrevote: 0x11 as const, + AfgReceivedPrecommit: 0x12 as const, + AfgAuthoritySet: 0x13 as const, + StaleNode: 0x14 as const, + NodeIO: 0x15 as const, + ChainStatsUpdate: 0x16 as const, +}; + +export type Action = typeof ACTIONS[keyof typeof ACTIONS]; +export type Payload = Message['payload']; + +interface MessageBase { + action: Action; +} + +interface FeedVersionMessage extends MessageBase { + action: typeof ACTIONS.FeedVersion; + payload: FeedVersion; +} + +interface BestBlockMessage extends MessageBase { + action: typeof ACTIONS.BestBlock; + payload: [BlockNumber, Timestamp, Maybe]; +} + +interface BestFinalizedBlockMessage extends MessageBase { + action: typeof ACTIONS.BestFinalized; + payload: [BlockNumber, BlockHash]; +} + +interface AddedNodeMessage extends MessageBase { + action: typeof ACTIONS.AddedNode; + payload: [ + NodeId, + NodeDetails, + NodeStats, + NodeIO, + NodeHardware, + BlockDetails, + Maybe, + Maybe + ]; +} + +interface RemovedNodeMessage extends MessageBase { + action: typeof ACTIONS.RemovedNode; + payload: NodeId; +} + +interface LocatedNodeMessage extends MessageBase { + action: typeof ACTIONS.LocatedNode; + payload: [NodeId, Latitude, Longitude, City]; +} + +interface ImportedBlockMessage extends MessageBase { + action: typeof ACTIONS.ImportedBlock; + payload: [NodeId, BlockDetails]; +} + +interface FinalizedBlockMessage extends MessageBase { + action: typeof ACTIONS.FinalizedBlock; + payload: [NodeId, BlockNumber, BlockHash]; +} + +interface NodeStatsMessage extends MessageBase { + action: typeof ACTIONS.NodeStats; + payload: [NodeId, NodeStats]; +} + +interface NodeHardwareMessage extends MessageBase { + action: typeof ACTIONS.NodeHardware; + payload: [NodeId, NodeHardware]; +} + +interface NodeIOMessage extends MessageBase { + action: typeof ACTIONS.NodeIO; + payload: [NodeId, NodeIO]; +} + +interface TimeSyncMessage extends MessageBase { + action: typeof ACTIONS.TimeSync; + payload: Timestamp; +} + +interface AddedChainMessage extends MessageBase { + action: typeof ACTIONS.AddedChain; + payload: [ChainLabel, GenesisHash, NodeCount]; +} + +interface RemovedChainMessage extends MessageBase { + action: typeof ACTIONS.RemovedChain; + payload: GenesisHash; +} + +interface SubscribedToMessage extends MessageBase { + action: typeof ACTIONS.SubscribedTo; + payload: GenesisHash; +} + +interface UnsubscribedFromMessage extends MessageBase { + action: typeof ACTIONS.UnsubscribedFrom; + payload: GenesisHash; +} + +interface PongMessage extends MessageBase { + action: typeof ACTIONS.Pong; + payload: string; // just echo whatever `ping` sent +} + +interface AfgFinalizedMessage extends MessageBase { + action: typeof ACTIONS.AfgFinalized; + payload: [Address, BlockNumber, BlockHash]; +} + +interface AfgAuthoritySet extends MessageBase { + action: typeof ACTIONS.AfgAuthoritySet; + payload: AuthoritySetInfo; +} + +interface AfgReceivedPrecommit extends MessageBase { + action: typeof ACTIONS.AfgReceivedPrecommit; + payload: [Address, BlockNumber, BlockHash, Address]; +} + +interface AfgReceivedPrevote extends MessageBase { + action: typeof ACTIONS.AfgReceivedPrevote; + payload: [Address, BlockNumber, BlockHash, Address]; +} + +interface StaleNodeMessage extends MessageBase { + action: typeof ACTIONS.StaleNode; + payload: NodeId; +} + +interface ChainStatsUpdate extends MessageBase { + action: typeof ACTIONS.ChainStatsUpdate; + payload: ChainStats; +} + +export type Message = + | FeedVersionMessage + | BestBlockMessage + | BestFinalizedBlockMessage + | AddedNodeMessage + | RemovedNodeMessage + | LocatedNodeMessage + | ImportedBlockMessage + | FinalizedBlockMessage + | NodeStatsMessage + | NodeHardwareMessage + | TimeSyncMessage + | AddedChainMessage + | RemovedChainMessage + | SubscribedToMessage + | UnsubscribedFromMessage + | AfgFinalizedMessage + | AfgReceivedPrevote + | AfgReceivedPrecommit + | AfgAuthoritySet + | StaleNodeMessage + | PongMessage + | NodeIOMessage + | ChainStatsUpdate; + + +export type SquashedMessages = Array; +export type Data = Stringified; + +export function serialize(messages: Array): Data { + const squashed: SquashedMessages = new Array(messages.length * 2); + let index = 0; + + messages.forEach((message) => { + const { action, payload } = message; + + squashed[index++] = action; + squashed[index++] = payload; + }); + + return stringify(squashed); +} + +export function deserialize(data: Data): Array { + const json = parse(data); + + if (!Array.isArray(json) || json.length === 0 || json.length % 2 !== 0) { + throw new Error('Invalid FeedMessage.Data'); + } + + const messages = new Array(json.length / 2); + + for (const index of messages.keys()) { + const [action, payload] = json.slice(index * 2); + + messages[index] = { action, payload } as Message; + } + + return messages; +} diff --git a/src/common/helpers.ts b/src/common/helpers.ts new file mode 100644 index 0000000..0c1b330 --- /dev/null +++ b/src/common/helpers.ts @@ -0,0 +1,82 @@ +import { Milliseconds, Timestamp } from './types'; + +export abstract class PhantomData

{ + public __PHANTOM__: P; +} + +export type Opaque = T & PhantomData

; + +export type Maybe = T | null | undefined; + +export function sleep(time: Milliseconds): Promise { + return new Promise((resolve) => { + setTimeout(() => resolve(), time); + }); +} + +export const timestamp = Date.now as () => Timestamp; + +export class NumStats { + private readonly stack: Array; + private readonly history: number; + private index = 0; + + constructor(history: number) { + if (history < 1) { + throw new Error('Must track at least one number'); + } + + this.history = history; + this.stack = new Array(history); + } + + public push(val: T) { + this.stack[this.index++ % this.history] = val; + } + + public average(): T { + if (this.index === 0) { + return 0 as T; + } + + const list = this.nonEmpty(); + let sum = 0; + + for (const n of list as Array) { + sum += n; + } + + return (sum / list.length) as T; + } + + public averageWithoutExtremes(extremes: number): T { + if (this.index === 0) { + return 0 as T; + } + + const list = this.nonEmpty(); + const count = list.length - extremes * 2; + + if (count < 1) { + // Not enough entries to remove desired number of extremes, + // fall back to regular average + return this.average(); + } + + let sum = 0; + + for (const n of [...list] + .sort((a, b) => a - b) + .slice(extremes, -extremes)) { + sum += n; + } + + return (sum / count) as T; + } + + private nonEmpty(): Readonly> { + return this.index < this.history + ? this.stack.slice(0, this.index) + : this.stack; + } +} diff --git a/src/common/id.ts b/src/common/id.ts new file mode 100644 index 0000000..a6ffc0e --- /dev/null +++ b/src/common/id.ts @@ -0,0 +1,9 @@ +import { Opaque } from './helpers'; + +export type Id = Opaque; + +export function idGenerator>(): () => I { + let current = 0; + + return () => current++ as I; +} diff --git a/src/common/index.ts b/src/common/index.ts new file mode 100644 index 0000000..4bb9754 --- /dev/null +++ b/src/common/index.ts @@ -0,0 +1,11 @@ +export * from './helpers'; +export * from './id'; +export * from './stringify'; +export * from './SortedCollection'; + +import * as Types from './types'; +import * as FeedMessage from './feed'; + +export { Types, FeedMessage }; + +export const VERSION: Types.FeedVersion = 32 as Types.FeedVersion; diff --git a/src/common/iterators.ts b/src/common/iterators.ts new file mode 100644 index 0000000..7509c7c --- /dev/null +++ b/src/common/iterators.ts @@ -0,0 +1,84 @@ +export function* map( + iter: IterableIterator, + fn: (item: T) => U +): IterableIterator { + for (const item of iter) { + yield fn(item); + } +} + +export function* chain( + a: IterableIterator, + b: IterableIterator +): IterableIterator { + yield* a; + yield* b; +} + +export function* zip( + a: IterableIterator, + b: IterableIterator +): IterableIterator<[T, U]> { + let itemA = a.next(); + let itemB = b.next(); + + while (!itemA.done && !itemB.done) { + yield [itemA.value, itemB.value]; + + itemA = a.next(); + itemB = b.next(); + } +} + +export function* take( + iter: IterableIterator, + n: number +): IterableIterator { + for (const item of iter) { + if (n-- === 0) { + return; + } + + yield item; + } +} + +export function skip( + iter: IterableIterator, + n: number +): IterableIterator { + while (n-- !== 0 && !iter.next().done) {} + + return iter; +} + +export function reduce( + iter: IterableIterator, + fn: (accu: R, item: T) => R, + accumulator: R +): R { + for (const item of iter) { + accumulator = fn(accumulator, item); + } + + return accumulator; +} + +export function join( + iter: IterableIterator<{ toString: () => string }>, + glue: string +): string { + const first = iter.next(); + + if (first.done) { + return ''; + } + + let result = first.value.toString(); + + for (const item of iter) { + result += glue + item; + } + + return result; +} diff --git a/src/common/stringify.ts b/src/common/stringify.ts new file mode 100644 index 0000000..06787b6 --- /dev/null +++ b/src/common/stringify.ts @@ -0,0 +1,8 @@ +export abstract class Stringified { + public __PHANTOM__: T; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const parse = JSON.parse as any as (val: Stringified) => T; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const stringify = JSON.stringify as any as (val: T) => Stringified; diff --git a/src/common/types.ts b/src/common/types.ts new file mode 100644 index 0000000..b3bcfdb --- /dev/null +++ b/src/common/types.ts @@ -0,0 +1,122 @@ +import { Opaque, Maybe } from './helpers'; +import { Id } from './id'; + +export type FeedVersion = Opaque; +export type ChainLabel = Opaque; +export type GenesisHash = Opaque; +export type FeedId = Id<'Feed'>; +export type NodeId = Id<'Node'>; +export type NodeName = Opaque; +export type NodeImplementation = Opaque; +export type NodeVersion = Opaque; +export type OperatingSystem = Opaque; +export type CpuArchitecture = Opaque; +export type Cpu = string; +export type CpuCores = number; +export type TargetEnv = string; +export type Memory = number; +export type VirtualMachine = boolean; +export type LinuxKernel = string; +export type LinuxDistro = string; +export type BlockNumber = Opaque; +export type BlockHash = Opaque; +export type Address = Opaque; +export type Milliseconds = Opaque; +export type Timestamp = Opaque; +export type PropagationTime = Opaque; +export type NodeCount = Opaque; +export type PeerCount = Opaque; +export type TransactionCount = Opaque; +export type Latitude = Opaque; +export type Longitude = Opaque; +export type City = Opaque; +export type MemoryUse = Opaque; +export type CPUUse = Opaque; +export type Bytes = Opaque; +export type BytesPerSecond = Opaque; +export type NetworkId = Opaque; + +export type NodeSysInfo = { + cpu: string; + memory: number; + core_count: number; + linux_kernel: string; + linux_distro: string; + is_virtual_machine: boolean; +}; + +export type BlockDetails = [ + BlockNumber, + BlockHash, + Milliseconds, + Timestamp, + Maybe +]; +export type NodeDetails = [ + NodeName, + NodeImplementation, + NodeVersion, + Maybe

, + Maybe, + OperatingSystem, + CpuArchitecture, + TargetEnv, + undefined, + NodeSysInfo +]; + +export type NodeStats = [PeerCount, TransactionCount]; +export type NodeIO = [Array]; +export type NodeHardware = [ + Array, + Array, + Array +]; +export type NodeLocation = [Latitude, Longitude, City]; + +export interface Authority { + Address: Address; + NodeId: Maybe; + Name: Maybe; +} +export declare type Authorities = Array
; +export declare type AuthoritySetId = Opaque; +export declare type AuthoritySetInfo = [ + AuthoritySetId, + Authorities, + Address, + BlockNumber, + BlockHash +]; +export declare type Precommit = Opaque; +export declare type Prevote = Opaque; +export declare type Finalized = Opaque; +export declare type ImplicitPrecommit = Opaque; +export declare type ImplicitPrevote = Opaque; +export declare type ImplicitFinalized = Opaque; +export declare type ImplicitPointer = Opaque; + +export type Ranking = { + list: Array<[T, number]>; + other: number; + unknown: number; +}; + +export type Range = [number, number | null]; + +export type ChainStats = { + version: Maybe>; + target_os: Maybe>; + target_arch: Maybe>; + cpu: Maybe>; + core_count: Maybe>; + memory: Maybe>; + is_virtual_machine: Maybe>; + linux_distro: Maybe>; + linux_kernel: Maybe>; + cpu_hashrate_score: Maybe>; + memory_memcpy_score: Maybe>; + disk_sequential_write_score: Maybe>; + disk_random_write_score: Maybe>; + cpu_vendor: Maybe>; +}; diff --git a/src/components/Ago.tsx b/src/components/Ago.tsx new file mode 100644 index 0000000..0bb3a2f --- /dev/null +++ b/src/components/Ago.tsx @@ -0,0 +1,100 @@ +import * as React from 'react'; +import './Tile.css'; +import { timestamp, Types } from '../common'; + +interface AgoProps { + when: Types.Timestamp; + justTime?: boolean; +} + +interface AgoState { + now: Types.Timestamp; +} + +const tickers = new Map void>(); + +function tick() { + const now = timestamp(); + + for (const ticker of tickers.values()) { + ticker(now); + } + + setTimeout(tick, 100); +} + +tick(); + +export class Ago extends React.Component { + public static timeDiff = 0 as Types.Milliseconds; + + public state: AgoState; + + private agoStr: string; + + constructor(props: AgoProps) { + super(props); + + this.state = { + now: (timestamp() - Ago.timeDiff) as Types.Timestamp, + }; + this.agoStr = this.stringify(props.when, this.state.now); + } + + public shouldComponentUpdate(nextProps: AgoProps, nextState: AgoState) { + const nextAgoStr = this.stringify(nextProps.when, nextState.now); + + if (this.agoStr !== nextAgoStr) { + this.agoStr = nextAgoStr; + return true; + } + + return false; + } + + public componentDidMount() { + tickers.set(this, (now) => { + this.setState({ + now: (now - Ago.timeDiff) as Types.Timestamp, + }); + }); + } + + public componentWillUnmount() { + tickers.delete(this); + } + + public render() { + if (this.props.when === 0) { + return -; + } + + return ( + {this.agoStr} + ); + } + + private stringify(when: number, now: number): string { + const ago = Math.max(now - when, 0) / 1000; + + let agoStr: string; + + if (ago < 10) { + agoStr = `${ago.toFixed(1)}s`; + } else if (ago < 60) { + agoStr = `${ago | 0}s`; + } else if (ago < 3600) { + agoStr = `${(ago / 60) | 0}m`; + } else if (ago < 3600 * 24) { + agoStr = `${(ago / 3600) | 0}h`; + } else { + agoStr = `${(ago / (3600 * 24)) | 0}d`; + } + + if (this.props.justTime !== true) { + agoStr += ' ago'; + } + + return agoStr; + } +} diff --git a/src/components/Chain/Chain.css b/src/components/Chain/Chain.css new file mode 100644 index 0000000..20bdcb0 --- /dev/null +++ b/src/components/Chain/Chain.css @@ -0,0 +1,34 @@ +.Chain-content-container { + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 148px; +} + +.Chain-content { + width: 100%; + min-width: 1350px; + min-height: 100%; + background: linear-gradient(90deg, rgba(28,54,100,1) 0%, rgba(45,87,132,1) 100%); + color: #fff; + box-shadow: rgba(0, 0, 0, 0.5) 0 3px 30px; +} + +.Chain-line-separator { + width: 100%; + min-width: 1350px; + height: 40px; + background: #f2e370; + color: #000; + font-size: 15px; + font-weight: 600; + display: flex; + justify-content: center; + align-items: center; +} + +.Chain-line-separator > a { + color: #1f4671; + cursor: pointer; +} diff --git a/src/components/Chain/Chain.tsx b/src/components/Chain/Chain.tsx new file mode 100644 index 0000000..7c1fef0 --- /dev/null +++ b/src/components/Chain/Chain.tsx @@ -0,0 +1,110 @@ +import * as React from 'react'; +import { Connection } from '../../Connection'; +import { Types, Maybe } from '../../common'; +import { + State as AppState, + Update as AppUpdate, + StateSettings, +} from '../../state'; +import { getHashData } from '../../utils'; +import { Header } from './'; +import { List, WorldMap, Stats } from '../'; +import { Persistent, PersistentObject, PersistentSet } from '../../persist'; + +import './Chain.css'; + +export type ChainDisplay = 'list' | 'map' | 'settings' | 'consensus' | 'stats'; + +interface ChainProps { + appState: Readonly; + appUpdate: AppUpdate; + connection: Promise; + settings: PersistentObject; + pins: PersistentSet; + sortBy: Persistent>; +} + +interface ChainState { + display: ChainDisplay; +} + +export class Chain extends React.Component { + constructor(props: ChainProps) { + super(props); + + let display: ChainDisplay = 'map'; + + switch (getHashData().tab) { + case 'list': + display = 'list'; + break; + case 'settings': + display = 'settings'; + break; + } + + this.state = { + display, + }; + } + + public render() { + const { appState } = this.props; + const { best, finalized, blockTimestamp, blockAverage, nodes } = appState; + const { display: currentTab } = this.state; + + return ( + + ); + } + + private renderContent() { + const { display } = this.state; + + const { appState, appUpdate, pins, sortBy } = this.props; + + if (display === 'list') { + return ( + + ); + } + + if (display === 'map') { + return ; + } + + if (display === 'stats') { + return ; + } + + throw new Error('invalid `display`: ${display}'); + } + + private setDisplay = (display: ChainDisplay) => { + this.setState({ display }); + }; +} diff --git a/src/components/Chain/Header.css b/src/components/Chain/Header.css new file mode 100644 index 0000000..d8a9ffd --- /dev/null +++ b/src/components/Chain/Header.css @@ -0,0 +1,42 @@ +.Header { + background: linear-gradient(90deg, rgba(28,54,100,1) 0%, rgba(45,87,132,1) 100%); +} + +.Header-container { + margin: 0 5% 0; + min-width: 1222px; + width: 90%; + height: 108px; + display: flex; + justify-content: space-between; + align-items: center; +} + +.Header-container > *:hover { + color: #f2e370; +} + +.Header-logo { + width: 150px; + height: 100%; +} + +.Header-logo > svg { + width: 100%; + height: 100%; + color: #fff; + cursor: pointer; +} + +.Header-logo > svg:hover { + color: #f2e370; +} + +.Header-tabs { + height: 95%; + text-align: right; + display: flex; + flex-direction: column; + justify-content: space-around; + align-items: center; +} diff --git a/src/components/Chain/Header.tsx b/src/components/Chain/Header.tsx new file mode 100644 index 0000000..6e32779 --- /dev/null +++ b/src/components/Chain/Header.tsx @@ -0,0 +1,100 @@ +import * as React from 'react'; +import { Types, Maybe } from '../../common'; +import { formatNumber, secondsWithPrecision } from '../../utils'; +import { Tab, ChainDisplay } from './'; +import { Tile, Ago, Icon } from '../'; + +import blockIcon from '../../icons/cube.svg'; +import finalizedIcon from '../../icons/cube-alt.svg'; +import blockTimeIcon from '../../icons/history.svg'; +import lastTimeIcon from '../../icons/watch.svg'; +import listIcon from '../../icons/list-alt-regular.svg'; +import worldIcon from '../../icons/location.svg'; +import settingsIcon from '../../icons/settings.svg'; +import statsIcon from '../../icons/graph.svg'; +import ghostLogoIcon from '../../icons/ghost-logo.svg'; + +import './Header.css'; + +interface HeaderProps { + nodesLength: number; + best: Types.BlockNumber; + finalized: Types.BlockNumber; + blockTimestamp: Types.Timestamp; + blockAverage: Maybe; + currentTab: ChainDisplay; + setDisplay: (display: ChainDisplay) => void; +} + +export class Header extends React.Component { + public shouldComponentUpdate(nextProps: HeaderProps) { + return ( + this.props.nodesLength !== nextProps.nodesLength || + this.props.best !== nextProps.best || + this.props.finalized !== nextProps.finalized || + this.props.blockTimestamp !== nextProps.blockTimestamp || + this.props.blockAverage !== nextProps.blockAverage || + this.props.currentTab !== nextProps.currentTab + ); + } + + public render() { + const { nodesLength, best, finalized, blockTimestamp, blockAverage } = this.props; + const { currentTab, setDisplay } = this.props; + + return ( +
+
+
window.open("https://ghostchain.io/", "_blank")}> + +
+
+ + #{formatNumber(best)} + + + #{formatNumber(finalized)} + + + {blockAverage == null + ? '-' + : secondsWithPrecision(blockAverage / 1000)} + + + + + + {nodesLength} + +
+
+ + + +
+
+
+ ); + } +} diff --git a/src/components/Chain/Tab.css b/src/components/Chain/Tab.css new file mode 100644 index 0000000..9cd451e --- /dev/null +++ b/src/components/Chain/Tab.css @@ -0,0 +1,24 @@ +.Chain-Tab { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: 18px; + line-height: 20px; + height: 32px; + width: 32px; + color: #fff; + cursor: pointer; + border-radius: 40px; + box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.2); +} + +.Chain-Tab:hover { + background: #50759e; +} + +.Chain-Tab-on, +.Chain-Tab-on:hover { + background: #f2e370; + color: #1f4671; +} diff --git a/src/components/Chain/Tab.tsx b/src/components/Chain/Tab.tsx new file mode 100644 index 0000000..edee891 --- /dev/null +++ b/src/components/Chain/Tab.tsx @@ -0,0 +1,35 @@ +import * as React from 'react'; +import { ChainDisplay } from './'; +import { Icon } from '../'; +import { setHashData } from '../../utils'; + +import './Tab.css'; + +interface TabProps { + label: string; + icon: string; + display: ChainDisplay; + current: string; + tab: string; + setDisplay: (display: ChainDisplay) => void; +} + +export class Tab extends React.Component { + public render() { + const { label, icon, display, current } = this.props; + const highlight = display === current; + const className = highlight ? 'Chain-Tab-on Chain-Tab' : 'Chain-Tab'; + + return ( +
+ +
+ ); + } + + private onClick = () => { + const { tab, display, setDisplay } = this.props; + setHashData({ tab }); + setDisplay(display); + }; +} diff --git a/src/components/Chain/index.ts b/src/components/Chain/index.ts new file mode 100644 index 0000000..0ef537f --- /dev/null +++ b/src/components/Chain/index.ts @@ -0,0 +1,3 @@ +export * from './Chain'; +export * from './Tab'; +export * from './Header'; diff --git a/src/components/Filter.css b/src/components/Filter.css new file mode 100644 index 0000000..70b2f4e --- /dev/null +++ b/src/components/Filter.css @@ -0,0 +1,38 @@ +.Filter { + position: fixed; + z-index: 100; + bottom: 20px; + left: 50%; + width: 400px; + font-size: 30px; + margin-left: -210px; + padding: 10px 10px 10px 60px; + border-radius: 4px; + background: #111; + color: #fff; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.5); +} + +.Filter-hidden { + bottom: -300px; +} + +.Filter input { + padding: 0; + margin: 0; + border: none; + outline: none; + width: 350px; + font-size: 30px; + background: #111; + color: #fff; + font-family: 'Ubuntu', sans-serif; + font-weight: 300; +} + +.Filter .Icon { + position: absolute; + left: 13px; + top: 17px; + font-size: 30px; +} diff --git a/src/components/Filter.tsx b/src/components/Filter.tsx new file mode 100644 index 0000000..6418e5b --- /dev/null +++ b/src/components/Filter.tsx @@ -0,0 +1,129 @@ +import * as React from 'react'; +import { Maybe } from '../common'; +import { Node } from '../state'; +import { Icon } from './'; + +import searchIcon from '../icons/search.svg'; + +import './Filter.css'; + +interface FilterProps { + onChange: (value: Maybe<(node: Node) => boolean>) => void; +} + +interface FilterState { + value: string; +} + +const ESCAPE_KEY = 27; + +export class Filter extends React.Component { + public state = { + value: '', + }; + + private filterInput: HTMLInputElement; + + public componentDidMount() { + window.addEventListener('keyup', this.onWindowKeyUp); + } + + public componentWillUnmount() { + window.removeEventListener('keyup', this.onWindowKeyUp); + } + + public shouldComponentUpdate( + nextProps: FilterProps, + nextState: FilterState + ): boolean { + return ( + this.props.onChange !== nextProps.onChange || + this.state.value !== nextState.value + ); + } + + public render() { + const { value } = this.state; + + let className = 'Filter'; + + if (value === '') { + className += ' Filter-hidden'; + } + + return ( +
+ + +
+ ); + } + + private setValue(value: string) { + this.setState({ value }); + + this.props.onChange(this.getNodeFilter(value)); + } + + private onRef = (el: HTMLInputElement) => { + this.filterInput = el; + }; + + private onChange = () => { + this.setValue(this.filterInput.value); + }; + + private onKeyUp = (event: React.KeyboardEvent) => { + event.stopPropagation(); + + if (event.keyCode === ESCAPE_KEY) { + this.setValue(''); + } + }; + + private onWindowKeyUp = (event: KeyboardEvent) => { + // Ignore if control key is being pressed + if (event.ctrlKey) { + return; + } + // Ignore events dispatched to other elements that want to use it + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if (['INPUT', 'TEXTAREA'].includes((event.target as any)?.tagName)) { + return; + } + + const { value } = this.state; + const key = event.key; + + const escape = value && event.keyCode === ESCAPE_KEY; + const singleChar = value === '' && key.length === 1; + + if (escape) { + this.setValue(''); + } else if (singleChar) { + this.setValue(key); + this.filterInput.focus(); + } + }; + + private getNodeFilter(value: string): Maybe<(node: Node) => boolean> { + if (value === '') { + return null; + } + + const filter = value.toLowerCase(); + + return ({ name, city }) => { + const matchesName = name.toLowerCase().indexOf(filter) !== -1; + const matchesCity = + city != null && city.toLowerCase().indexOf(filter) !== -1; + + return matchesName || matchesCity; + }; + } +} diff --git a/src/components/Icon.css b/src/components/Icon.css new file mode 100644 index 0000000..6f882f0 --- /dev/null +++ b/src/components/Icon.css @@ -0,0 +1,15 @@ +.Icon { + fill: currentColor; + height: 1em; + width: 1em; + text-align: center; + line-height: 1em; + vertical-align: middle; + display: inline-block; +} + +.Icon svg, +.Icon-symbol-root symbol { + width: 1em; + height: 1em; +} diff --git a/src/components/Icon.tsx b/src/components/Icon.tsx new file mode 100644 index 0000000..cc7b558 --- /dev/null +++ b/src/components/Icon.tsx @@ -0,0 +1,73 @@ +import * as React from 'react'; +import './Icon.css'; +import { getSVGShadowRoot, W3SVG } from '../utils'; + +interface IconProps { + src: string; + className?: string; + onClick?: () => void; +} + +const symbols = new Map(); + +let symbolId = 0; + +// Lazily render the icon in the DOM, so that we can referenced +// it by id using shadow DOM. +function renderShadowIcon(src: string): string { + let symbol = symbols.get(src); + + if (!symbol) { + symbol = `icon${symbolId}`; + symbolId += 1; + + symbols.set(src, symbol); + + fetch(src).then(async (response) => { + const html = await response.text(); + const temp = document.createElement('div'); + + temp.innerHTML = html; + + const tempSVG = temp.querySelector('svg') as SVGSVGElement; + const symEl = document.createElementNS(W3SVG, 'symbol'); + const viewBox = tempSVG.getAttribute('viewBox'); + + symEl.setAttribute('id', symbol as string); + if (viewBox) { + symEl.setAttribute('viewBox', viewBox); + } + + for (const child of Array.from(tempSVG.childNodes)) { + symEl.appendChild(child); + } + + getSVGShadowRoot().appendChild(symEl); + }); + } + + return symbol; +} + +export class Icon extends React.Component { + public props: IconProps; + + public shouldComponentUpdate(nextProps: IconProps) { + return ( + this.props.src !== nextProps.src || + this.props.className !== nextProps.className + ); + } + + public render() { + const { className, onClick, src } = this.props; + const symbol = renderShadowIcon(src); + + // Use `href` for a shadow DOM reference to the rendered icon + return ( + + + + ); + } +} diff --git a/src/components/List/Column/BlockHashColumn.tsx b/src/components/List/Column/BlockHashColumn.tsx new file mode 100644 index 0000000..5a8d515 --- /dev/null +++ b/src/components/List/Column/BlockHashColumn.tsx @@ -0,0 +1,46 @@ +import * as React from 'react'; +import { Maybe } from '../../../common'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import { Truncate, Tooltip, TooltipCopyCallback } from '../../'; +import icon from '../../../icons/file-binary.svg'; + +export class BlockHashColumn extends React.Component { + public static readonly label = 'Block Hash'; + public static readonly icon = icon; + public static readonly width = 154; + public static readonly setting = 'blockhash'; + public static readonly sortBy = ({ hash }: Node) => hash || ''; + + private data: Maybe; + private copy: Maybe; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.hash; + } + + render() { + const { hash } = this.props.node; + + this.data = hash; + + return ( + + + + + ); + } + + private onCopy = (copy: TooltipCopyCallback) => { + this.copy = copy; + }; + + private onClick = (event: React.MouseEvent) => { + event.stopPropagation(); + + if (this.copy != null) { + this.copy(); + } + }; +} diff --git a/src/components/List/Column/BlockNumberColumn.tsx b/src/components/List/Column/BlockNumberColumn.tsx new file mode 100644 index 0000000..b6b0746 --- /dev/null +++ b/src/components/List/Column/BlockNumberColumn.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import { formatNumber } from '../../../utils'; +import icon from '../../../icons/cube.svg'; + +export class BlockNumberColumn extends React.Component { + public static readonly label = 'Block'; + public static readonly icon = icon; + public static readonly width = 88; + public static readonly setting = 'blocknumber'; + public static readonly sortBy = ({ height }: Node) => height; + + private data = 0; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.height; + } + + render() { + const { height } = this.props.node; + + this.data = height; + + return {`#${formatNumber(height)}`}; + } +} diff --git a/src/components/List/Column/BlockPropagationColumn.tsx b/src/components/List/Column/BlockPropagationColumn.tsx new file mode 100644 index 0000000..c539a41 --- /dev/null +++ b/src/components/List/Column/BlockPropagationColumn.tsx @@ -0,0 +1,31 @@ +import * as React from 'react'; +import { Maybe } from '../../../common'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import { milliOrSecond } from '../../../utils'; +import icon from '../../../icons/dashboard.svg'; + +export class BlockPropagationColumn extends React.Component { + public static readonly label = 'Block Propagation Time'; + public static readonly icon = icon; + public static readonly width = 58; + public static readonly setting = 'blockpropagation'; + public static readonly sortBy = ({ propagationTime }: Node) => + propagationTime == null ? Infinity : propagationTime; + + private data: Maybe; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.propagationTime; + } + + render() { + const { propagationTime } = this.props.node; + const print = + propagationTime == null ? '∞' : milliOrSecond(propagationTime); + + this.data = propagationTime; + + return {print}; + } +} diff --git a/src/components/List/Column/BlockTimeColumn.tsx b/src/components/List/Column/BlockTimeColumn.tsx new file mode 100644 index 0000000..edb90a9 --- /dev/null +++ b/src/components/List/Column/BlockTimeColumn.tsx @@ -0,0 +1,30 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import { secondsWithPrecision } from '../../../utils'; +import icon from '../../../icons/history.svg'; + +export class BlockTimeColumn extends React.Component { + public static readonly label = 'Block Time'; + public static readonly icon = icon; + public static readonly width = 80; + public static readonly setting = 'blocktime'; + public static readonly sortBy = ({ blockTime }: Node) => + blockTime == null ? Infinity : blockTime; + + private data = 0; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.blockTime; + } + + render() { + const { blockTime } = this.props.node; + + this.data = blockTime; + + return ( + {`${secondsWithPrecision(blockTime / 1000)}`} + ); + } +} diff --git a/src/components/List/Column/Column.css b/src/components/List/Column/Column.css new file mode 100644 index 0000000..48f4da9 --- /dev/null +++ b/src/components/List/Column/Column.css @@ -0,0 +1,42 @@ +.Column { + text-align: left; + padding: 6px 13px; + height: 19px; + position: relative; + white-space: nowrap; +} + +.Column-truncate { + position: absolute; + left: 0; + right: 0; + top: 0; + padding: 6px 13px; + overflow: hidden; + text-overflow: ellipsis; +} + +.Column-Tooltip { + position: initial !important; + padding: inherit !important; +} + +.Column-validator { + display: block; + width: 16px; + height: 16px; + cursor: pointer; +} + +.Column-validator:hover { + transform: scale(2); +} + +.Column--a { + color: inherit; + text-decoration: none; +} + +.Column--a:hover { + text-decoration: underline; +} diff --git a/src/components/List/Column/Column.tsx b/src/components/List/Column/Column.tsx new file mode 100644 index 0000000..0ea5daa --- /dev/null +++ b/src/components/List/Column/Column.tsx @@ -0,0 +1,113 @@ +import { Types, Maybe, timestamp } from '../../../common'; +import { Node } from '../../../state'; + +import './Column.css'; + +import { + NameColumn, + ValidatorColumn, + LocationColumn, + NetworkIdColumn, + PeersColumn, + TxsColumn, + UploadColumn, + DownloadColumn, + StateCacheColumn, + BlockNumberColumn, + BlockHashColumn, + FinalizedBlockColumn, + FinalizedHashColumn, + BlockTimeColumn, + BlockPropagationColumn, + LastBlockColumn, + UptimeColumn, + CpuArchitectureColumn, //extra columns added + CpuColumn, + CpuCoresColumn, + LinuxKernelColumn, + IsVirtualMachineColumn, + MemoryColumn, + OperatingSystemColumn, + VersionColumn, + LinuxDistroColumn, +} from './'; + +export type Column = + | typeof NameColumn + | typeof ValidatorColumn + | typeof LocationColumn + | typeof NetworkIdColumn + | typeof PeersColumn + | typeof TxsColumn + | typeof UploadColumn + | typeof DownloadColumn + | typeof StateCacheColumn + | typeof BlockNumberColumn + | typeof BlockHashColumn + | typeof FinalizedBlockColumn + | typeof FinalizedHashColumn + | typeof BlockTimeColumn + | typeof BlockPropagationColumn + | typeof LastBlockColumn + | typeof UptimeColumn + | typeof CpuArchitectureColumn + | typeof CpuColumn + | typeof CpuCoresColumn + | typeof LinuxDistroColumn + | typeof LinuxKernelColumn + | typeof IsVirtualMachineColumn + | typeof MemoryColumn + | typeof OperatingSystemColumn + | typeof VersionColumn; + +export interface ColumnProps { + node: Node; +} + +export function formatBytes( + bytes: number, + stamp: Maybe +): string { + const ago = stamp ? ` (${formatStamp(stamp)})` : ''; + + if (bytes >= 1024 * 1024 * 1024) { + return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB${ago}`; + } else if (bytes >= 1024 * 1024) { + return `${(bytes / (1024 * 1024)).toFixed(1)} MB${ago}`; + } else if (bytes >= 1000) { + return `${(bytes / 1024).toFixed(1)} kB${ago}`; + } else { + return `${bytes} B${ago}`; + } +} + +export function formatBandwidth( + bps: number, + stamp: Maybe +): string { + const ago = stamp ? ` (${formatStamp(stamp)})` : ''; + + if (bps >= 1024 * 1024) { + return `${(bps / (1024 * 1024)).toFixed(1)} MB/s${ago}`; + } else if (bps >= 1000) { + return `${(bps / 1024).toFixed(1)} kB/s${ago}`; + } else { + return `${bps | 0} B/s${ago}`; + } +} + +export const BANDWIDTH_SCALE = 1024 * 1024; + +function formatStamp(stamp: Types.Timestamp): string { + const passed = ((timestamp() - stamp) / 1000) | 0; + + const hours = (passed / 3600) | 0; + const minutes = ((passed % 3600) / 60) | 0; + const seconds = passed % 60 | 0; + + return hours + ? `${hours}h ago` + : minutes + ? `${minutes}m ago` + : `${seconds}s ago`; +} diff --git a/src/components/List/Column/CpuArchitectureColumn.tsx b/src/components/List/Column/CpuArchitectureColumn.tsx new file mode 100644 index 0000000..bc7a7e1 --- /dev/null +++ b/src/components/List/Column/CpuArchitectureColumn.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import icon from '../../../icons/file-binary.svg'; + +export class CpuArchitectureColumn extends React.Component { + public static readonly label = 'CPU Architecture'; + public static readonly icon = icon; + public static readonly width = 154; + public static readonly setting = 'target_arch'; + public static readonly sortBy = ({ target_arch }: Node) => target_arch || ''; + + private data: string; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.hash; + } + + render() { + const { target_arch } = this.props.node; + + this.data = target_arch; + + return {target_arch || '-'}; + } +} diff --git a/src/components/List/Column/CpuColumn.tsx b/src/components/List/Column/CpuColumn.tsx new file mode 100644 index 0000000..5841353 --- /dev/null +++ b/src/components/List/Column/CpuColumn.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import icon from '../../../icons/file-binary.svg'; + +export class CpuColumn extends React.Component { + public static readonly label = 'CPU Column'; + public static readonly icon = icon; + public static readonly width = 154; + public static readonly setting = 'cpu'; + public static readonly sortBy = ({ cpu }: Node) => cpu || 0; + + private data: string; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.cpu; + } + + render() { + const { cpu } = this.props.node; + + this.data = cpu; + + return {cpu || '-'}; + } +} diff --git a/src/components/List/Column/CpuCoresColumn.tsx b/src/components/List/Column/CpuCoresColumn.tsx new file mode 100644 index 0000000..50bd552 --- /dev/null +++ b/src/components/List/Column/CpuCoresColumn.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import icon from '../../../icons/file-binary.svg'; + +export class CpuCoresColumn extends React.Component { + public static readonly label = 'CPU Cores'; + public static readonly icon = icon; + public static readonly width = 154; + public static readonly setting = 'core_count'; + public static readonly sortBy = ({ core_count }: Node) => core_count || 0; + + private data: number; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.core_count; + } + + render() { + const { core_count } = this.props.node; + + this.data = core_count; + + return {core_count || '-'}; + } +} diff --git a/src/components/List/Column/DownloadColumn.tsx b/src/components/List/Column/DownloadColumn.tsx new file mode 100644 index 0000000..937b32e --- /dev/null +++ b/src/components/List/Column/DownloadColumn.tsx @@ -0,0 +1,45 @@ +import * as React from 'react'; +import { ColumnProps, formatBandwidth, BANDWIDTH_SCALE } from './'; +import { Node } from '../../../state'; +import { Sparkline } from '../../'; +import icon from '../../../icons/cloud-download.svg'; + +export class DownloadColumn extends React.Component { + public static readonly label = 'Download Bandwidth'; + public static readonly icon = icon; + public static readonly width = 40; + public static readonly setting = 'download'; + public static readonly sortBy = ({ download }: Node) => + download.length < 3 ? 0 : download[download.length - 1]; + + private data: Array = []; + + public shouldComponentUpdate(nextProps: ColumnProps) { + // Diffing by ref, as data is an immutable array + return this.data !== nextProps.node.download; + } + + render() { + const { download, chartstamps } = this.props.node; + + this.data = download; + + if (download.length < 3) { + return -; + } + + return ( + + + + ); + } +} diff --git a/src/components/List/Column/FinalizedBlockColumn.tsx b/src/components/List/Column/FinalizedBlockColumn.tsx new file mode 100644 index 0000000..81dfe0d --- /dev/null +++ b/src/components/List/Column/FinalizedBlockColumn.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import { formatNumber } from '../../../utils'; +import icon from '../../../icons/cube-alt.svg'; + +export class FinalizedBlockColumn extends React.Component { + public static readonly label = 'Finalized Block'; + public static readonly icon = icon; + public static readonly width = 88; + public static readonly setting = 'finalized'; + public static readonly sortBy = ({ finalized }: Node) => finalized || 0; + + private data = 0; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.finalized; + } + + render() { + const { finalized } = this.props.node; + + this.data = finalized; + + return {`#${formatNumber(finalized)}`}; + } +} diff --git a/src/components/List/Column/FinalizedHashColumn.tsx b/src/components/List/Column/FinalizedHashColumn.tsx new file mode 100644 index 0000000..785b0b7 --- /dev/null +++ b/src/components/List/Column/FinalizedHashColumn.tsx @@ -0,0 +1,47 @@ +import * as React from 'react'; +import { Maybe } from '../../../common'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import { Truncate, Tooltip, TooltipCopyCallback } from '../../'; +import icon from '../../../icons/file-binary.svg'; + +export class FinalizedHashColumn extends React.Component { + public static readonly label = 'Finalized Block Hash'; + public static readonly icon = icon; + public static readonly width = 154; + public static readonly setting = 'finalizedhash'; + public static readonly sortBy = ({ finalizedHash }: Node) => + finalizedHash || ''; + + private data: Maybe; + private copy: Maybe; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.finalizedHash; + } + + render() { + const { finalizedHash } = this.props.node; + + this.data = finalizedHash; + + return ( + + + + + ); + } + + private onCopy = (copy: TooltipCopyCallback) => { + this.copy = copy; + }; + + private onClick = (event: React.MouseEvent) => { + event.stopPropagation(); + + if (this.copy != null) { + this.copy(); + } + }; +} diff --git a/src/components/List/Column/IsVirtualMachineColumn.tsx b/src/components/List/Column/IsVirtualMachineColumn.tsx new file mode 100644 index 0000000..94d1722 --- /dev/null +++ b/src/components/List/Column/IsVirtualMachineColumn.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import icon from '../../../icons/file-binary.svg'; + +export class IsVirtualMachineColumn extends React.Component { + public static readonly label = 'Virtual Machine'; + public static readonly icon = icon; + public static readonly width = 154; + public static readonly setting = 'is_virtual_machine'; + public static readonly sortBy = ({ is_virtual_machine }: Node) => + is_virtual_machine || false; + + private data: boolean; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.is_virtual_machine; + } + + render() { + const { is_virtual_machine } = this.props.node; + + this.data = is_virtual_machine; + + return {is_virtual_machine ? 'Yes' : 'No'}; + } +} diff --git a/src/components/List/Column/LastBlockColumn.tsx b/src/components/List/Column/LastBlockColumn.tsx new file mode 100644 index 0000000..3232c75 --- /dev/null +++ b/src/components/List/Column/LastBlockColumn.tsx @@ -0,0 +1,32 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import { Ago } from '../../'; +import icon from '../../../icons/watch.svg'; + +export class LastBlockColumn extends React.Component { + public static readonly label = 'Last Block Time'; + public static readonly icon = icon; + public static readonly width = 100; + public static readonly setting = 'blocklasttime'; + public static readonly sortBy = ({ blockTimestamp }: Node) => + blockTimestamp || 0; + + private data = 0; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.blockTimestamp; + } + + render() { + const { blockTimestamp } = this.props.node; + + this.data = blockTimestamp; + + return ( + + + + ); + } +} diff --git a/src/components/List/Column/LinuxDistroColumn.tsx b/src/components/List/Column/LinuxDistroColumn.tsx new file mode 100644 index 0000000..27a7f91 --- /dev/null +++ b/src/components/List/Column/LinuxDistroColumn.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import icon from '../../../icons/file-binary.svg'; + +export class LinuxDistroColumn extends React.Component { + public static readonly label = 'Linux Distro'; + public static readonly icon = icon; + public static readonly width = 154; + public static readonly setting = 'linux_distro'; + public static readonly sortBy = ({ linux_distro }: Node) => + linux_distro || ''; + + private data: string; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.linux_distro; + } + + render() { + const { linux_distro } = this.props.node; + + this.data = linux_distro; + + return {linux_distro || '-'}; + } +} diff --git a/src/components/List/Column/LinuxKernelColumn.tsx b/src/components/List/Column/LinuxKernelColumn.tsx new file mode 100644 index 0000000..851dd46 --- /dev/null +++ b/src/components/List/Column/LinuxKernelColumn.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import icon from '../../../icons/file-binary.svg'; + +export class LinuxKernelColumn extends React.Component { + public static readonly label = 'Linux Kernel'; + public static readonly icon = icon; + public static readonly width = 154; + public static readonly setting = 'linux_kernel'; + public static readonly sortBy = ({ linux_kernel }: Node) => linux_kernel || 0; + + private data: string; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.linux_kernel; + } + + render() { + const { linux_kernel } = this.props.node; + + this.data = linux_kernel; + + return {linux_kernel || '-'}; + } +} diff --git a/src/components/List/Column/LocationColumn.tsx b/src/components/List/Column/LocationColumn.tsx new file mode 100644 index 0000000..c4dd9f1 --- /dev/null +++ b/src/components/List/Column/LocationColumn.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import { Maybe } from '../../../common'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import { Truncate, Tooltip } from '../../'; +import icon from '../../../icons/location.svg'; + +export class LocationColumn extends React.Component { + public static readonly label = 'Location'; + public static readonly icon = icon; + public static readonly width = 140; + public static readonly setting = 'location'; + public static readonly sortBy = ({ city }: Node) => city || ''; + + private data: Maybe; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.city; + } + + render() { + const { city } = this.props.node; + + this.data = city; + + if (!city) { + return -; + } + + return ( + + + + + ); + } +} diff --git a/src/components/List/Column/MemoryColumn.tsx b/src/components/List/Column/MemoryColumn.tsx new file mode 100644 index 0000000..ce1a23d --- /dev/null +++ b/src/components/List/Column/MemoryColumn.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import icon from '../../../icons/file-binary.svg'; + +export class MemoryColumn extends React.Component { + public static readonly label = 'memory'; + public static readonly icon = icon; + public static readonly width = 154; + public static readonly setting = 'memory'; + public static readonly sortBy = ({ memory }: Node) => memory || ''; + + private data: number; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.memory; + } + + render() { + const { memory } = this.props.node; + + this.data = memory; + + return {memory || '-'}; + } +} diff --git a/src/components/List/Column/NameColumn.tsx b/src/components/List/Column/NameColumn.tsx new file mode 100644 index 0000000..f3819e4 --- /dev/null +++ b/src/components/List/Column/NameColumn.tsx @@ -0,0 +1,29 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import { Truncate, Tooltip } from '../../'; +import icon from '../../../icons/server.svg'; + +export class NameColumn extends React.Component { + public static readonly label = 'Node'; + public static readonly icon = icon; + public static readonly setting = null; + public static readonly width = null; + public static readonly sortBy = ({ sortableName }: Node) => sortableName; + + public shouldComponentUpdate(nextProps: ColumnProps) { + // Node name only changes when the node does + return this.props.node !== nextProps.node; + } + + render() { + const { name } = this.props.node; + + return ( + + + + + ); + } +} diff --git a/src/components/List/Column/NetworkIdColumn.tsx b/src/components/List/Column/NetworkIdColumn.tsx new file mode 100644 index 0000000..332812d --- /dev/null +++ b/src/components/List/Column/NetworkIdColumn.tsx @@ -0,0 +1,50 @@ +import * as React from 'react'; +import { Maybe } from '../../../common'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import { Tooltip, TooltipCopyCallback } from '../../'; +import icon from '../../../icons/fingerprint.svg'; + +export class NetworkIdColumn extends React.Component { + public static readonly label = 'Network ID'; + public static readonly icon = icon; + public static readonly width = 90; + public static readonly setting = 'networkId'; + public static readonly sortBy = ({ networkId }: Node) => networkId || ''; + + private data: Maybe; + private copy: Maybe; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.networkId; + } + + render() { + const { networkId } = this.props.node; + + this.data = networkId; + + if (!networkId) { + return -; + } + + return ( + + + {networkId} + + ); + } + + private onCopy = (copy: TooltipCopyCallback) => { + this.copy = copy; + }; + + private onClick = (event: React.MouseEvent) => { + event.stopPropagation(); + + if (this.copy != null) { + this.copy(); + } + }; +} diff --git a/src/components/List/Column/OperatingSystemColumn.tsx b/src/components/List/Column/OperatingSystemColumn.tsx new file mode 100644 index 0000000..e7097fe --- /dev/null +++ b/src/components/List/Column/OperatingSystemColumn.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import icon from '../../../icons/file-binary.svg'; + +export class OperatingSystemColumn extends React.Component { + public static readonly label = 'OS'; + public static readonly icon = icon; + public static readonly width = 154; + public static readonly setting = 'target_os'; + public static readonly sortBy = ({ target_os }: Node) => target_os || ''; + + private data: string; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.hash; + } + + render() { + const { target_os } = this.props.node; + + this.data = target_os; + + return {target_os || '-'}; + } +} diff --git a/src/components/List/Column/PeersColumn.tsx b/src/components/List/Column/PeersColumn.tsx new file mode 100644 index 0000000..9ebd3b4 --- /dev/null +++ b/src/components/List/Column/PeersColumn.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import icon from '../../../icons/broadcast.svg'; + +export class PeersColumn extends React.Component { + public static readonly label = 'Peer Count'; + public static readonly icon = icon; + public static readonly width = 26; + public static readonly setting = 'peers'; + public static readonly sortBy = ({ peers }: Node) => peers; + + private data = 0; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.peers; + } + + render() { + const { peers } = this.props.node; + + this.data = peers; + + return {peers}; + } +} diff --git a/src/components/List/Column/StateCacheColumn.tsx b/src/components/List/Column/StateCacheColumn.tsx new file mode 100644 index 0000000..c4ab783 --- /dev/null +++ b/src/components/List/Column/StateCacheColumn.tsx @@ -0,0 +1,45 @@ +import * as React from 'react'; +import { ColumnProps, formatBytes, BANDWIDTH_SCALE } from './'; +import { Node } from '../../../state'; +import { Sparkline } from '../../'; +import icon from '../../../icons/git-branch.svg'; + +export class StateCacheColumn extends React.Component { + public static readonly label = 'State Cache Size'; + public static readonly icon = icon; + public static readonly width = 40; + public static readonly setting = 'stateCacheSize'; + public static readonly sortBy = ({ stateCacheSize }: Node) => + stateCacheSize.length < 3 ? 0 : stateCacheSize[stateCacheSize.length - 1]; + + private data: Array = []; + + public shouldComponentUpdate(nextProps: ColumnProps) { + // Diffing by ref, as data is an immutable array + return this.data !== nextProps.node.stateCacheSize; + } + + render() { + const { stateCacheSize, chartstamps } = this.props.node; + + this.data = stateCacheSize; + + if (stateCacheSize.length < 3) { + return -; + } + + return ( + + + + ); + } +} diff --git a/src/components/List/Column/TxsColumn.tsx b/src/components/List/Column/TxsColumn.tsx new file mode 100644 index 0000000..6f85a98 --- /dev/null +++ b/src/components/List/Column/TxsColumn.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import icon from '../../../icons/inbox.svg'; + +export class TxsColumn extends React.Component { + public static readonly label = 'Transactions in Queue'; + public static readonly icon = icon; + public static readonly width = 26; + public static readonly setting = 'txs'; + public static readonly sortBy = ({ txs }: Node) => txs; + + private data = 0; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.txs; + } + + render() { + const { txs } = this.props.node; + + this.data = txs; + + return {txs}; + } +} diff --git a/src/components/List/Column/UploadColumn.tsx b/src/components/List/Column/UploadColumn.tsx new file mode 100644 index 0000000..6eced19 --- /dev/null +++ b/src/components/List/Column/UploadColumn.tsx @@ -0,0 +1,45 @@ +import * as React from 'react'; +import { ColumnProps, formatBandwidth, BANDWIDTH_SCALE } from './'; +import { Node } from '../../../state'; +import { Sparkline } from '../../'; +import icon from '../../../icons/cloud-upload.svg'; + +export class UploadColumn extends React.Component { + public static readonly label = 'Upload Bandwidth'; + public static readonly icon = icon; + public static readonly width = 40; + public static readonly setting = 'upload'; + public static readonly sortBy = ({ upload }: Node) => + upload.length < 3 ? 0 : upload[upload.length - 1]; + + private data: Array = []; + + public shouldComponentUpdate(nextProps: ColumnProps) { + // Diffing by ref, as data is an immutable array + return this.data !== nextProps.node.upload; + } + + render() { + const { upload, chartstamps } = this.props.node; + + this.data = upload; + + if (upload.length < 3) { + return -; + } + + return ( + + + + ); + } +} diff --git a/src/components/List/Column/UptimeColumn.tsx b/src/components/List/Column/UptimeColumn.tsx new file mode 100644 index 0000000..a43bc9e --- /dev/null +++ b/src/components/List/Column/UptimeColumn.tsx @@ -0,0 +1,32 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import { Ago } from '../../'; +import icon from '../../../icons/pulse.svg'; + +export class UptimeColumn extends React.Component { + public static readonly label = 'Node Uptime'; + public static readonly icon = icon; + public static readonly width = 58; + public static readonly setting = 'uptime'; + public static readonly sortBy = ({ startupTime }: Node) => startupTime || 0; + + public shouldComponentUpdate(nextProps: ColumnProps) { + // Uptime only changes when the node does + return this.props.node !== nextProps.node; + } + + render() { + const { startupTime } = this.props.node; + + if (!startupTime) { + return -; + } + + return ( + + + + ); + } +} diff --git a/src/components/List/Column/ValidatorColumn.tsx b/src/components/List/Column/ValidatorColumn.tsx new file mode 100644 index 0000000..a328ccc --- /dev/null +++ b/src/components/List/Column/ValidatorColumn.tsx @@ -0,0 +1,49 @@ +import * as React from 'react'; +import { Maybe } from '../../../common'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import { Tooltip, TooltipCopyCallback } from '../../'; +import icon from '../../../icons/shield.svg'; + +export class ValidatorColumn extends React.Component { + public static readonly label = 'Validator'; + public static readonly icon = icon; + public static readonly width = 16; + public static readonly setting = 'validator'; + public static readonly sortBy = ({ validator }: Node) => validator || ''; + + private data: Maybe; + private copy: Maybe; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.validator; + } + + render() { + const { validator } = this.props.node; + + this.data = validator; + + if (!validator) { + return -; + } + + return ( + + + + ); + } + + private onCopy = (copy: TooltipCopyCallback) => { + this.copy = copy; + }; + + private onClick = (event: React.MouseEvent) => { + event.stopPropagation(); + + if (this.copy != null) { + this.copy(); + } + }; +} diff --git a/src/components/List/Column/VersionColumn.tsx b/src/components/List/Column/VersionColumn.tsx new file mode 100644 index 0000000..522235c --- /dev/null +++ b/src/components/List/Column/VersionColumn.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { ColumnProps } from './'; +import { Node } from '../../../state'; +import icon from '../../../icons/file-binary.svg'; + +export class VersionColumn extends React.Component { + public static readonly label = 'version'; + public static readonly icon = icon; + public static readonly width = 154; + public static readonly setting = 'version'; + public static readonly sortBy = ({ version }: Node) => version || ''; + + private data: string; + + public shouldComponentUpdate(nextProps: ColumnProps) { + return this.data !== nextProps.node.version; + } + + render() { + const { version } = this.props.node; + + this.data = version; + + return {version || '-'}; + } +} diff --git a/src/components/List/Column/index.ts b/src/components/List/Column/index.ts new file mode 100644 index 0000000..07933a8 --- /dev/null +++ b/src/components/List/Column/index.ts @@ -0,0 +1,27 @@ +export * from './Column'; +export * from './NameColumn'; +export * from './ValidatorColumn'; +export * from './LocationColumn'; +export * from './NetworkIdColumn'; +export * from './PeersColumn'; +export * from './TxsColumn'; +export * from './UploadColumn'; +export * from './DownloadColumn'; +export * from './StateCacheColumn'; +export * from './BlockNumberColumn'; +export * from './BlockHashColumn'; +export * from './FinalizedBlockColumn'; +export * from './FinalizedHashColumn'; +export * from './BlockTimeColumn'; +export * from './BlockPropagationColumn'; +export * from './LastBlockColumn'; +export * from './UptimeColumn'; +export * from './CpuArchitectureColumn'; +export * from './CpuCoresColumn'; +export * from './LinuxDistroColumn'; +export * from './IsVirtualMachineColumn'; +export * from './MemoryColumn'; +export * from './CpuColumn'; +export * from './OperatingSystemColumn'; +export * from './VersionColumn'; +export * from './LinuxKernelColumn'; diff --git a/src/components/List/List.css b/src/components/List/List.css new file mode 100644 index 0000000..d93f515 --- /dev/null +++ b/src/components/List/List.css @@ -0,0 +1,30 @@ +.List-container { + background-color: #345987; + height: 100%; + min-height: calc(100vh - 148px); +} + +.List { + /* Prevents the list from auto-scrolling while cascading node + * updates on new block, which helps with performance. */ + overflow-anchor: none; +} + +.List-no-nodes { + font-size: 30px; + padding-top: 20vh; + text-align: center; + font-weight: 300; +} + +.List-padding { + padding: 0; + margin: 0; +} + +.List--table { + width: 100%; + background-color: #345987; + border-spacing: 0; + font-family: 'Ubuntu', sans-serif; +} diff --git a/src/components/List/List.tsx b/src/components/List/List.tsx new file mode 100644 index 0000000..9d233b4 --- /dev/null +++ b/src/components/List/List.tsx @@ -0,0 +1,205 @@ +import * as React from 'react'; +import ReactGA from "react-ga4"; + +import { Types, Maybe } from '../../common'; +import { Filter } from '../'; +import { State as AppState, Update as AppUpdate, Node } from '../../state'; +import { Row, THead } from './'; +import { Persistent, PersistentSet } from '../../persist'; +import { viewport } from '../../utils'; + +const HEADER = 148; +const TH_HEIGHT = 35; +const TR_HEIGHT = 31; +const ROW_MARGIN = 5; + +import './List.css'; + +interface ListProps { + appState: Readonly; + appUpdate: AppUpdate; + pins: PersistentSet; + sortBy: Persistent>; +} + +// Helper for readability, used as `key` prop for each `Row` +// of the `List`, so that we can maximize re-using DOM elements. +type Key = number; + +export class List extends React.Component { + public state = { + filter: null, + viewportHeight: viewport().height, + }; + + private listStart = 0; + private listEnd = 0; + private relativeTop = -1; + private nextKey: Key = 0; + private previousKeys = new Map(); + + public componentDidMount() { + ReactGA.send({ hitType: "pageview", page: "/list" }); + this.onScroll(); + + window.addEventListener('resize', this.onResize); + window.addEventListener('scroll', this.onScroll); + } + + public componentWillUnmount() { + window.removeEventListener('resize', this.onResize); + window.removeEventListener('scroll', this.onScroll); + } + + public render() { + const { pins, sortBy, appState } = this.props; + const { selectedColumns } = appState; + const { filter } = this.state; + + let nodes = appState.nodes.sorted(); + + if (filter != null) { + nodes = nodes.filter(filter); + + if (nodes.length === 0) { + return ( + +
+ ¯\_(ツ)_/¯ +
+ Nothing matches +
+ +
+ ); + } + // With filter present, we can no longer guarantee that focus corresponds + // to rendering view, so we put the whole list in focus + appState.nodes.setFocus(0, nodes.length); + } else { + appState.nodes.setFocus(this.listStart, this.listEnd); + } + + const height = TH_HEIGHT + nodes.length * TR_HEIGHT; + const top = this.listStart * TR_HEIGHT; + + nodes = nodes.slice(this.listStart, this.listEnd); + + const keys = this.recalculateKeys(nodes); + + return ( +
+
+ + + + + {nodes.map((node, i) => ( + + ))} + +
+
+ +
+ ); + } + + // Get an array of keys for each `Node` in viewport in order. + // + // * If a `Node` was previously rendered, it will keep its `Key`. + // + // * If a `Node` is new to the viewport, it will get a `Key` of + // another `Node` that was removed from the viewport, or a new one. + private recalculateKeys(nodes: Array): Array { + // First we find all keys for `Node`s which didn't change from + // last render. + const keptKeys: Array> = nodes.map(({ id }) => { + const key = this.previousKeys.get(id); + + if (key != null) { + this.previousKeys.delete(id); + } + + return key; + }); + + // Array of all unused keys + const unusedKeys = Array.from(this.previousKeys.values()); + let search = 0; + + // Clear the map so we can set new values + this.previousKeys.clear(); + + // Filling in blanks and re-populate previousKeys + return keptKeys.map((key: Maybe, i) => { + const id = nodes[i].id; + + // `Node` was previously in viewport + if (key != null) { + this.previousKeys.set(id, key); + + return key; + } + + // Recycle the next unused key + if (search < unusedKeys.length) { + const unused = unusedKeys[search++]; + this.previousKeys.set(id, unused); + + return unused; + } + + // No unused keys left, generate a new key + const newKey = this.nextKey++; + this.previousKeys.set(id, newKey); + + return newKey; + }); + } + + private onScroll = () => { + const relativeTop = divisibleBy( + window.scrollY - (HEADER + TR_HEIGHT), + TR_HEIGHT * ROW_MARGIN + ); + + if (this.relativeTop === relativeTop) { + return; + } + + this.relativeTop = relativeTop; + + const { viewportHeight } = this.state; + const top = Math.max(relativeTop, 0); + const height = + relativeTop < 0 ? viewportHeight + relativeTop : viewportHeight; + const listStart = Math.max(((top / TR_HEIGHT) | 0) - ROW_MARGIN, 0); + const listEnd = listStart + ROW_MARGIN * 2 + Math.ceil(height / TR_HEIGHT); + + if (listStart !== this.listStart || listEnd !== this.listEnd) { + this.listStart = listStart; + this.listEnd = listEnd; + this.props.appUpdate({}); + } + }; + + private onResize = () => { + const viewportHeight = viewport().height; + + this.setState({ viewportHeight }); + }; + + private onFilterChange = (filter: Maybe<(node: Node) => boolean>) => { + this.setState({ filter }); + }; +} + +function divisibleBy(n: number, dividor: number): number { + return n - (n % dividor); +} diff --git a/src/components/List/Row.css b/src/components/List/Row.css new file mode 100644 index 0000000..5e50302 --- /dev/null +++ b/src/components/List/Row.css @@ -0,0 +1,27 @@ +.Row { + color: #fff; + cursor: pointer; +} + +.Row-pinned td:first-child { + border-left: 5px solid #F2E370; + padding-left: 10px; +} + +.Row-pinned td:last-child { + border-right: 5px solid #F2E370; + padding-right: 10px; +} + +.Row-pinned { + color: #f2e370 !important; +} + +.Row-stale { + color: #fff; +} + +.Row:hover { + background-color: #1b3563; + color: #fff; +} diff --git a/src/components/List/Row.tsx b/src/components/List/Row.tsx new file mode 100644 index 0000000..7dfa6fe --- /dev/null +++ b/src/components/List/Row.tsx @@ -0,0 +1,116 @@ +import * as React from 'react'; +import { Types } from '../../common'; +import { Node } from '../../state'; +import { PersistentSet } from '../../persist'; +import { + Column, + NameColumn, + LocationColumn, + NetworkIdColumn, + PeersColumn, + TxsColumn, + UploadColumn, + DownloadColumn, + StateCacheColumn, + BlockNumberColumn, + BlockHashColumn, + FinalizedBlockColumn, + FinalizedHashColumn, + BlockTimeColumn, + BlockPropagationColumn, + LastBlockColumn, + UptimeColumn, + CpuArchitectureColumn, + CpuColumn, + CpuCoresColumn, + MemoryColumn, + OperatingSystemColumn, + VersionColumn, + IsVirtualMachineColumn, + LinuxDistroColumn, + LinuxKernelColumn, +} from './'; + +import './Row.css'; + +interface RowProps { + node: Node; + pins: PersistentSet; + columns: Column[]; +} + +interface RowState { + update: number; +} + +export class Row extends React.Component { + public static readonly columns: Column[] = [ + NameColumn, + LocationColumn, + NetworkIdColumn, + PeersColumn, + TxsColumn, + UploadColumn, + DownloadColumn, + StateCacheColumn, + BlockNumberColumn, + BlockHashColumn, + FinalizedBlockColumn, + FinalizedHashColumn, + BlockTimeColumn, + BlockPropagationColumn, + LastBlockColumn, + UptimeColumn, + VersionColumn, + OperatingSystemColumn, + CpuArchitectureColumn, + CpuColumn, + CpuCoresColumn, + MemoryColumn, + LinuxDistroColumn, + LinuxKernelColumn, + IsVirtualMachineColumn, + ]; + private renderedChangeRef = 0; + + public shouldComponentUpdate(nextProps: RowProps): boolean { + return ( + this.props.node.id !== nextProps.node.id || + this.renderedChangeRef !== nextProps.node.changeRef + ); + } + + public render() { + const { node, columns } = this.props; + + this.renderedChangeRef = node.changeRef; + + let className = 'Row'; + + if (node.pinned) { + className += ' Row-pinned'; + } + + if (node.stale) { + className += ' Row-stale'; + } + + return ( + + {columns.map((col, index) => + React.createElement(col, { node, key: index }) + )} + + ); + } + + public toggle = () => { + const { pins, node } = this.props; + + if (node.pinned) { + pins.delete(node.name); + } else { + pins.add(node.name); + } + }; +} diff --git a/src/components/List/THead.css b/src/components/List/THead.css new file mode 100644 index 0000000..f9aafda --- /dev/null +++ b/src/components/List/THead.css @@ -0,0 +1,24 @@ +.THead { + background: #50759e; +} + +.THeadCell { + text-align: left; + padding: 8px 13px; + height: 23px; +} + +.THeadCell-sortable { + cursor: pointer; +} + +.THeadCell-sorted { + cursor: pointer; + background: #345b87; + color: #fff; +} + +.THeadCell-container { + position: relative; + display: inline-block; +} diff --git a/src/components/List/THead.tsx b/src/components/List/THead.tsx new file mode 100644 index 0000000..c4ed9c4 --- /dev/null +++ b/src/components/List/THead.tsx @@ -0,0 +1,48 @@ +import * as React from 'react'; +import { Maybe } from '../../common'; +import { Column, THeadCell } from './'; +import { Persistent } from '../../persist'; + +import './THead.css'; + +interface THeadProps { + columns: Column[]; + sortBy: Persistent>; +} + +export class THead extends React.Component { + private sortBy: Maybe; + + constructor(props: THeadProps) { + super(props); + + this.sortBy = props.sortBy.get(); + } + + public shouldComponentUpdate(nextProps: THeadProps) { + return this.sortBy !== nextProps.sortBy.get(); + } + + public render() { + const { columns, sortBy } = this.props; + const last = columns.length - 1; + + this.sortBy = sortBy.get(); + + return ( + + + {columns.map((col, index) => ( + + ))} + + + ); + } +} diff --git a/src/components/List/THeadCell.tsx b/src/components/List/THeadCell.tsx new file mode 100644 index 0000000..1e0def4 --- /dev/null +++ b/src/components/List/THeadCell.tsx @@ -0,0 +1,63 @@ +import * as React from 'react'; +import { Maybe } from '../../common'; +import { Column } from './'; +import { Icon, Tooltip } from '../'; +import { Persistent } from '../../persist'; + +import sortAscIcon from '../../icons/triangle-up.svg'; +import sortDescIcon from '../../icons/triangle-down.svg'; + +interface THeadCellProps { + column: Column; + index: number; + last: number; + sortBy: Persistent>; +} + +export class THeadCell extends React.Component { + public render() { + const { column, index, last } = this.props; + const { icon, width, label } = column; + const position = index === 0 ? 'left' : index === last ? 'right' : 'center'; + + const sortBy = this.props.sortBy.get(); + const className = + column.sortBy == null + ? 'THeadCell' + : sortBy === index || sortBy === ~index + ? 'THeadCell THeadCell-sorted' + : 'THeadCell THeadCell-sortable'; + const i = + sortBy === index ? sortAscIcon : sortBy === ~index ? sortDescIcon : icon; + + return ( + + + + + + + ); + } + + private toggleSort = () => { + const { index, sortBy, column } = this.props; + const sortByRaw = sortBy.get(); + + if (column.sortBy == null) { + return; + } + + if (sortByRaw === index) { + sortBy.set(~index); + } else if (sortByRaw === ~index) { + sortBy.set(null); + } else { + sortBy.set(index); + } + }; +} diff --git a/src/components/List/index.ts b/src/components/List/index.ts new file mode 100644 index 0000000..b187e98 --- /dev/null +++ b/src/components/List/index.ts @@ -0,0 +1,5 @@ +export * from './Column'; +export * from './List'; +export * from './Row'; +export * from './THeadCell'; +export * from './THead'; diff --git a/src/components/Map/Location.css b/src/components/Map/Location.css new file mode 100644 index 0000000..44570ea --- /dev/null +++ b/src/components/Map/Location.css @@ -0,0 +1,156 @@ +.Location, .Validator-Location { + width: 6px; + height: 6px; + background: transparent; + border: 2px solid #f2e370; + border-radius: 6px; + margin-left: -4px; + margin-top: -4px; + position: absolute; + top: 50%; + left: 50%; + cursor: pointer; + z-index: 2; + transition: border-color 0.25s linear, + width 0.25s linear, + height 0.25s linear, + background 0.25s linear; +} + +.Validator-Location { + border: 2px solid #60c45b; +} + +.Location-dimmed { + z-index: 1; + border-color: #fff8c5; +} + +.Location-dimmed-validator { + z-index: 1; + border-color: #b9ecb6; +} + +.Location-ping { + pointer-events: none; + position: absolute; + display: none; +} + +.Location-synced { + z-index: 3; + border-color: #f2e370; +} + +.Location-synced-validator { + z-index: 3; + border-color: #60C45B; +} + +.Location-synced .Location-ping { + border: 1px solid #f2e370; + border-radius: 30px; + display: block; + animation: ping 1s forwards; +} + +.Location-synced-validator .Location-ping { + border: 1px solid #60C45B; + border-radius: 30px; + display: block; + animation: ping-validator 1s forwards; +} + +.Location:hover, .Validator-Location:hover { + z-index: 4; + border-color: #fff; + width: 7px; + height: 7px; + background: #fff; +} + +.Location-details { + min-width: 335px; + position: absolute; + font-family: 'Ubuntu', sans-serif; + background: #50759e; + border: 1px solid #fff; + border-radius: 5px; + color: #fff; + box-shadow: 0 3px 20px rgba(0, 0, 0, 0.5); +} + +.Location-quarter0 .Location-details { + left: 16px; + top: -4px; +} + +.Location-quarter1 .Location-details { + right: 16px; + top: -4px; +} + +.Location-quarter2 .Location-details { + left: 16px; + bottom: -4px; +} + +.Location-quarter3 .Location-details { + right: 16px; + bottom: -4px; +} + +.Location-details td { + text-align: left; + padding: 0.5em 1em; +} + +.Location-details td:nth-child(odd) { + width: 16px; + text-align: center; + padding-right: 0.2em; +} + +.Location-details td:nth-child(even) { + padding-left: 0.2em; +} + +@keyframes ping { + from { + left: -1px; + top: -1px; + width: 6px; + height: 6px; + border-width: 1px; + border-color: rgba(242, 227, 112, 1); + } + + to { + left: -18px; + top: -18px; + width: 40px; + height: 40px; + border-width: 1px; + border-color: rgba(242, 227, 112, 0); + } +} + +@keyframes ping-validator { + from { + left: -1px; + top: -1px; + width: 6px; + height: 6px; + border-width: 1px; + border-color: rgba(96, 196, 91, 1); + } + + to { + left: -18px; + top: -18px; + width: 40px; + height: 40px; + border-width: 1px; + border-color: rgba(96, 196, 91, 0); + } +} diff --git a/src/components/Map/Location.tsx b/src/components/Map/Location.tsx new file mode 100644 index 0000000..e676272 --- /dev/null +++ b/src/components/Map/Location.tsx @@ -0,0 +1,167 @@ +import * as React from 'react'; +import { + formatNumber, + trimHash, + milliOrSecond, + secondsWithPrecision, +} from '../../utils'; +import { Ago, Icon } from '../'; +import { Node } from '../../state'; + +import nodeIcon from '../../icons/server.svg'; +import nodeTypeIcon from '../../icons/terminal.svg'; +import nodeLocationIcon from '../../icons/location.svg'; +import blockIcon from '../../icons/package.svg'; +import blockHashIcon from '../../icons/file-binary.svg'; +import blockTimeIcon from '../../icons/history.svg'; +import propagationTimeIcon from '../../icons/dashboard.svg'; +import lastTimeIcon from '../../icons/watch.svg'; + +import './Location.css'; + +export type LocationQuarter = 0 | 1 | 2 | 3; + +export interface LocationOffsets { + leftOffset: number; + topOffset: number; +} + +interface LocationProps { + node: Node; + position: LocationPosition; + focused: boolean; +} + +export interface LocationPosition { + left: number; + top: number; + quarter: LocationQuarter; +} + +interface LocationState { + hover: boolean; +} + +export class Location extends React.Component { + public readonly state = { hover: false }; + + public render() { + const { node, position, focused } = this.props; + const { left, top, quarter } = position; + const { height, propagationTime, city } = node; + + if (!city) { + return null; + } + + let className = `Location Location-quarter${quarter}`; + + if (focused) { + if (propagationTime != null) { + className += ' Location-synced'; + } else if (height % 2 === 1) { + className += ' Location-odd'; + } + } else { + className += ' Location-dimmed'; + } + + if (node.validator) { + className = `Validator-${className}-validator`; + } + + return ( +
+ {this.state.hover ? this.renderDetails() : null} +
+
+ ); + } + + private renderDetails() { + const { + name, + implementation, + version, + validator, + height, + hash, + blockTime, + blockTimestamp, + propagationTime, + city, + } = this.props.node; + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + {name}
+ + + {implementation} v{version} +
+ + {city}
+ + #{formatNumber(height)}
+ + {trimHash(hash, 20)}
+ + + {secondsWithPrecision(blockTime / 1000)} + + + + {propagationTime == null ? '∞' : milliOrSecond(propagationTime)} + + + + +
+ ); + } + + private onMouseOver = () => { + this.setState({ hover: true }); + }; + + private onMouseOut = () => { + this.setState({ hover: false }); + }; +} diff --git a/src/components/Map/Map.css b/src/components/Map/Map.css new file mode 100644 index 0000000..4cd2762 --- /dev/null +++ b/src/components/Map/Map.css @@ -0,0 +1,18 @@ +.Map-container { + background: linear-gradient(90deg, rgba(28,54,100,1) 0%, rgba(45,87,132,1) 100%); +} + +.Map { + background: url('../../assets/world-map.svg') no-repeat; + background-size: contain; +} + +.Map-container, .Map { + min-width: 1350px; + background-position: center; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} diff --git a/src/components/Map/Map.tsx b/src/components/Map/Map.tsx new file mode 100644 index 0000000..6f55279 --- /dev/null +++ b/src/components/Map/Map.tsx @@ -0,0 +1,164 @@ +import * as React from 'react'; +import ReactGA from "react-ga4"; + +import { Types, Maybe } from '../../common'; +import { Filter } from '../'; +import { State as AppState, Node } from '../../state'; +import { Location, LocationQuarter, LocationPosition, LocationOffsets } from './'; +import { viewport } from '../../utils'; + +const MAP_RATIO = 800 / 350; +const MAP_HEIGHT_ADJUST = 400 / 350; +const HEADER = 148; + +import './Map.css'; + +interface MapProps { + appState: Readonly; +} + +interface MapState { + filter: Maybe<(node: Node) => boolean>; + width: number; + height: number; + top: number; + left: number; +} + +export class WorldMap extends React.Component { + public state: MapState = { + filter: null, + width: 0, + height: 0, + top: 0, + left: 0, + }; + + public offsets: Map = new Map(); + + public usedLeftPositions: Set = new Set(); + public usedTopPositions: Set = new Set(); + + public componentDidMount() { + ReactGA.send({ hitType: "pageview", page: "/map" }); + this.onResize(); + + window.addEventListener('resize', this.onResize); + } + + public componentWillUnmount() { + window.removeEventListener('resize', this.onResize); + } + + public render() { + const { appState } = this.props; + const { filter } = this.state; + const nodes = appState.nodes.sorted(); + + return ( +
+
+ {nodes.map(node => { + const { lat, lon } = node; + + const focused = filter == null || filter(node); + + if (lat == null || lon == null) { + // Skip nodes with unknown location + return null; + } + + const position = this.pixelPosition(node.networkId, lat, lon); + + return ( + + ); + })} +
+ +
+ ); + } + + private pixelPosition( + id: Maybe, + lat: Types.Latitude, + lon: Types.Longitude, + ): LocationPosition { + const { state, offsets, usedLeftPositions, usedTopPositions } = this; + + // Longitude ranges -180 (west) to +180 (east) + // Latitude ranges +90 (north) to -90 (south) + let left = Math.round(((180 + lon) / 360) * state.width + state.left); + let top = Math.round( + ((90 - lat) / 180) * state.height * MAP_HEIGHT_ADJUST + state.top + ); + + let quarter: LocationQuarter = 0; + + if (lon > 0) { + quarter = (quarter | 1) as LocationQuarter; + } + + if (lat < 0) { + quarter = (quarter | 2) as LocationQuarter; + } + + let topOffset = 0; + let leftOffset = 0; + + id = id!; + const maybeOffsets = offsets.get(id); + if (maybeOffsets) { + topOffset = maybeOffsets.topOffset; + leftOffset = maybeOffsets.leftOffset; + } else if (usedLeftPositions.has(left) && usedTopPositions.has(top)) { + topOffset = Math.floor(Math.random() * 12) - 6; + leftOffset = Math.floor(Math.random() * 12) - 6; + } + + left += leftOffset; + top += topOffset; + + offsets.set(id, { leftOffset, topOffset }); + usedLeftPositions.add(left); + usedTopPositions.add(top); + + return { left, top, quarter }; + } + + private onResize: () => void = () => { + const vp = viewport(); + + vp.width = Math.max(1350, vp.width); + vp.height -= HEADER; + + const ratio = vp.width / vp.height; + + let top = 0; + let left = 0; + let width = 0; + let height = 0; + + if (ratio >= MAP_RATIO) { + width = Math.round(vp.height * MAP_RATIO); + height = Math.round(vp.height); + left = (vp.width - width) / 2; + } else { + width = Math.round(vp.width); + height = Math.round(vp.width / MAP_RATIO); + top = (vp.height - height) / 2; + } + + this.setState({ top, left, width, height }); + }; + + private onFilterChange = (filter: Maybe<(node: Node) => boolean>) => { + this.setState({ filter }); + }; +} diff --git a/src/components/Map/index.ts b/src/components/Map/index.ts new file mode 100644 index 0000000..602baea --- /dev/null +++ b/src/components/Map/index.ts @@ -0,0 +1,2 @@ +export * from './Map'; +export * from './Location'; diff --git a/src/components/Sparkline.css b/src/components/Sparkline.css new file mode 100644 index 0000000..71f2e94 --- /dev/null +++ b/src/components/Sparkline.css @@ -0,0 +1,18 @@ +.Sparkline { + fill: currentcolor; + fill-opacity: 0.35; + stroke: currentcolor; + margin: 0 -1px -3px -1px; +} + +.Sparkline path { + pointer-events: none; +} + +.Sparkline .Sparkline-cursor { + display: none; +} + +.Sparkline:hover .Sparkline-cursor { + display: initial; +} diff --git a/src/components/Sparkline.tsx b/src/components/Sparkline.tsx new file mode 100644 index 0000000..55de907 --- /dev/null +++ b/src/components/Sparkline.tsx @@ -0,0 +1,101 @@ +import * as React from 'react'; +import { Types, Maybe } from '../common'; +import { Tooltip, TooltipUpdateCallback } from './'; + +import './Sparkline.css'; + +interface SparklineProps { + stroke: number; + width: number; + height: number; + values: number[]; + stamps?: Types.Timestamp[]; + minScale?: number; + format?: (value: number, stamp: Maybe) => string; +} + +export class Sparkline extends React.Component { + private cursor: SVGPathElement; + private update: TooltipUpdateCallback; + + public shouldComponentUpdate(nextProps: SparklineProps): boolean { + const { stroke, width, height, format, values } = this.props; + + return ( + values !== nextProps.values || + stroke !== nextProps.stroke || + width !== nextProps.width || + height !== nextProps.height || + format !== nextProps.format + ); + } + + public render() { + const { stroke, width, height, minScale, values } = this.props; + const padding = stroke / 2; + const paddedHeight = height - padding; + const paddedWidth = width - 2; + + const max = Math.max(minScale || 0, ...values); + const offset = paddedWidth / (values.length - 1); + + let path = ''; + + values.forEach((value, index) => { + const x = 1 + index * offset; + const y = padding + (1 - value / max) * paddedHeight; + + if (path) { + path += ` L ${x} ${y}`; + } else { + path = `${x} ${y}`; + } + }); + + return ( + <> + + + + + + + + ); + } + + private onRef = (cursor: SVGPathElement) => { + this.cursor = cursor; + }; + + private onTooltipInit = (update: TooltipUpdateCallback) => { + this.update = update; + }; + + private onMouseMove = ( + event: React.MouseEvent + ) => { + const { width, height, values, format, stamps } = this.props; + const offset = (width - 2) / (values.length - 1); + const cur = + Math.round((event.nativeEvent.offsetX - 1 - offset / 2) / offset) | 0; + + this.cursor.setAttribute('d', `M ${1 + offset * cur} 0 V ${height}`); + + const str = format + ? format(values[cur], stamps ? stamps[cur] : null) + : `${values[cur]}`; + this.update(str); + }; + + private onMouseLeave = () => { + this.cursor.removeAttribute('d'); + }; +} diff --git a/src/components/Stats/Stats.css b/src/components/Stats/Stats.css new file mode 100644 index 0000000..94b96b8 --- /dev/null +++ b/src/components/Stats/Stats.css @@ -0,0 +1,56 @@ +.Stats { + text-align: center; + padding-top: 2.5rem; + padding-bottom: 0.1rem; +} + +.Stats-category { + text-align: left; + background-color: #345987; + margin-bottom: 2.5rem; + padding: 1rem; +} + +.Stats-category table { + color: #fff; + width: 100%; + table-layout: fixed; + border-collapse: collapse; +} + +.Stats-category tbody > tr:nth-child(odd) { + background-color: #50759f; +} + +.Stats-percent { + width: 6em; + text-align: right; + padding-left: 0.5rem; + padding-right: 1rem; +} + +.Stats-count { + width: 6.5em; + text-align: right; + padding-right: 1.5rem; + border-right: 1px solid #fff; +} + +.Stats-value { + padding-left: 2rem; +} + +th.Stats-value { + padding-left: 1rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.Stats-category td { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.Stats-unknown { + opacity: 0.5; +} diff --git a/src/components/Stats/Stats.tsx b/src/components/Stats/Stats.tsx new file mode 100644 index 0000000..2794cbd --- /dev/null +++ b/src/components/Stats/Stats.tsx @@ -0,0 +1,189 @@ +import * as React from 'react'; +import ReactGA from "react-ga4"; + +import { Maybe } from '../../common'; +import { State as AppState } from '../../state'; +import { Ranking, Range } from '../../common/types'; + +import './Stats.css'; + +interface StatsProps { + appState: Readonly; +} + +function displayPercentage(percent: number): string { + return (Math.round(percent * 100) / 100).toFixed(2); +} + +function generateRankingTable( + key: string, + label: string, + format: (value: T) => string, + ranking: Ranking +) { + let total = ranking.other + ranking.unknown; + ranking.list.forEach(([_, count]) => { + total += count; + }); + + if (ranking.unknown === total) { + return null; + } + + const entries: React.ReactNode[] = []; + ranking.list.forEach(([value, count]) => { + const percent = displayPercentage((count / total) * 100); + const index = entries.length; + entries.push( + + {percent}% + {count} + {format(value)} + + ); + }); + + if (ranking.other > 0) { + const percent = displayPercentage((ranking.other / total) * 100); + entries.push( + + {percent}% + {ranking.other} + Other + + ); + } + + if (ranking.unknown > 0) { + const percent = displayPercentage((ranking.unknown / total) * 100); + entries.push( + + {percent}% + {ranking.unknown} + Unknown + + ); + } + + return ( +
+ + + + + + + {entries} +
+ + {label}
+
+ ); +} + +function identity(value: string | number): string { + return value + ''; +} + +function formatMemory(value: Range): string { + const [min, max] = value; + if (min === 0) { + return 'Less than ' + max + ' GB'; + } + if (max === null) { + return 'At least ' + min + ' GB'; + } + return min + ' GB'; +} + +function formatYesNo(value: boolean): string { + if (value) { + return 'Yes'; + } else { + return 'No'; + } +} + +function formatScore(value: Range): string { + const [min, max] = value; + if (max === null) { + return 'More than ' + (min / 100).toFixed(1) + 'x'; + } + if (min === 0) { + return 'Less than ' + (max / 100).toFixed(1) + 'x'; + } + if (min <= 100 && max >= 100) { + return 'Baseline'; + } + return (min / 100).toFixed(1) + 'x'; +} + +export class Stats extends React.Component { + public componentDidMount() { + ReactGA.send({ hitType: "pageview", page: "/stats" }); + } + + public render() { + const { appState } = this.props; + + const children: React.ReactNode[] = []; + function add( + key: string, + label: string, + format: (value: T) => string, + ranking: Maybe> + ) { + if (ranking) { + const child = generateRankingTable(key, label, format, ranking); + if (child !== null) { + children.push(child); + } + } + } + + const stats = appState.chainStats; + if (stats) { + add('version', 'Version', identity, stats.version); + add('target_os', 'Operating System', identity, stats.target_os); + add('target_arch', 'CPU Architecture', identity, stats.target_arch); + add('cpu', 'CPU', identity, stats.cpu); + add('core_count', 'CPU Cores', identity, stats.core_count); + add('cpu_vendor', 'CPU Vendor', identity, stats.cpu_vendor); + add('memory', 'Memory', formatMemory, stats.memory); + add( + 'is_virtual_machine', + 'Is Virtual Machine?', + formatYesNo, + stats.is_virtual_machine + ); + add('linux_distro', 'Linux Distribution', identity, stats.linux_distro); + add('linux_kernel', 'Linux Kernel', identity, stats.linux_kernel); + add( + 'cpu_hashrate_score', + 'CPU Speed', + formatScore, + stats.cpu_hashrate_score + ); + add( + 'memory_memcpy_score', + 'Memory Speed', + formatScore, + stats.memory_memcpy_score + ); + add( + 'disk_sequential_write_score', + 'Disk Speed (sequential writes)', + formatScore, + stats.disk_sequential_write_score + ); + add( + 'disk_random_write_score', + 'Disk Speed (random writes)', + formatScore, + stats.disk_random_write_score + ); + } + + return
{children}
; + } +} diff --git a/src/components/Stats/index.ts b/src/components/Stats/index.ts new file mode 100644 index 0000000..c1e298a --- /dev/null +++ b/src/components/Stats/index.ts @@ -0,0 +1 @@ +export * from './Stats'; diff --git a/src/components/Tile.css b/src/components/Tile.css new file mode 100644 index 0000000..b1be428 --- /dev/null +++ b/src/components/Tile.css @@ -0,0 +1,43 @@ +.Tile { + font-size: 2.5em; + text-align: left; + width: 208px; + height: 100px; + display: inline-block; + position: relative; + color: #fff; + cursor: pointer; +} + +.Tile:hover { + color: #f2e370; +} + +.Tile-label { + position: absolute; + top: 24px; + left: 50px; + right: 0; + font-size: 0.4em; + text-transform: uppercase; +} + +.Tile-content { + position: absolute; + bottom: 16px; + left: 50px; + right: 0; + font-weight: 300; + font-size: 0.75em; +} + +.Tile .Icon { + position: absolute; + left: 20px; + top: 15px; + font-size: 0.8em; + padding: 0.1em; + border-radius: 1.25em; + border: 2px solid #e6007a; + color: #e6007a; +} diff --git a/src/components/Tile.tsx b/src/components/Tile.tsx new file mode 100644 index 0000000..de6ba2e --- /dev/null +++ b/src/components/Tile.tsx @@ -0,0 +1,17 @@ +import * as React from 'react'; +import './Tile.css'; +import { Icon } from './Icon'; + +interface TileProps { + title: string; + children?: React.ReactNode; +} + +export function Tile(props: TileProps) { + return ( +
+ {props.title} + {props.children} +
+ ); +} diff --git a/src/components/Tooltip.css b/src/components/Tooltip.css new file mode 100644 index 0000000..97bc1ee --- /dev/null +++ b/src/components/Tooltip.css @@ -0,0 +1,80 @@ +.Tooltip { + background: #000; + color: #fff; + font-family: 'Ubuntu', sans-serif; + font-size: 13px; + font-weight: 400; + padding: 3px 5px; + border-radius: 2px; + background: #1b3563; + position: absolute; + white-space: nowrap; + top: -32px; + left: 50%; + transform: translateX(-50%); + display: none; + box-shadow: 0 3px 20px rgba(255, 255, 255, 0.2); + pointer-events: none; + transition: color 0.15s ease-in-out; +} + +.Tooltip::after { + content: ' '; + width: 0; + height: 0; + display: block; + position: absolute; + left: 50%; + bottom: -6px; + margin-left: -6px; + border-top: 6px #1b3563 solid; + border-left: 6px transparent solid; + border-right: 6px transparent solid; + pointer-events: none; +} + +.Tooltip-left { + left: 10px; + transform: none; +} + +.Tooltip-left::after { + left: 3px; + margin: 0; +} + +.Tooltip-right { + left: initial; + right: 10px; + transform: none; +} + +.Tooltip-right::after { + left: initial; + right: 3px; + margin: 0; +} + +.Tooltip.Tooltip-copied { + color: #fff; +} + +.Tooltip-container { + position: relative; +} + +.Tooltip-container-inline { + display: inline-block; +} + +.Tooltip-container-inline .Tooltip-left { + left: 0; +} + +.Tooltip-container-inline .Tooltip-right { + right: 0; +} + +:hover > .Tooltip { + display: block; +} diff --git a/src/components/Tooltip.tsx b/src/components/Tooltip.tsx new file mode 100644 index 0000000..3012e3c --- /dev/null +++ b/src/components/Tooltip.tsx @@ -0,0 +1,96 @@ +import * as React from 'react'; +import { Maybe } from '../common'; + +import './Tooltip.css'; + +interface TooltipProps { + text: string; + copy?: (cb: TooltipCopyCallback) => void; + position?: 'left' | 'right' | 'center'; + onInit?: (update: TooltipUpdateCallback) => void; +} + +export type TooltipUpdateCallback = (text: string) => void; +export type TooltipCopyCallback = Maybe<() => void>; + +function copyToClipboard(text: string) { + const el = document.createElement('textarea'); + el.value = text; + document.body.appendChild(el); + el.select(); + document.execCommand('copy'); + document.body.removeChild(el); +} + +export function Tooltip({ + text, + position, + copy, + onInit, +}: TooltipProps): JSX.Element { + const [copied, setCopied] = React.useState(false); + const [timer, setTimer] = React.useState(null); + const el = React.useRef(null); + + const update = React.useCallback( + (newText: string) => { + if (el.current) { + el.current.textContent = newText; + } + }, + [el] + ); + + function restore() { + setCopied(false); + setTimer(null); + } + + function onClick() { + copyToClipboard(text); + + if (timer) { + clearTimeout(timer); + } + + setCopied(true); + + setTimer(setTimeout(restore, 2000)); + } + + React.useEffect(() => { + if (onInit) { + onInit(update); + } + + if (copy) { + copy(onClick); + } + + return () => { + if (timer) { + clearTimeout(timer); + } + + if (copy) { + copy(null); + } + }; + }, []); + + let tooltipClass = 'Tooltip'; + + if (position && position !== 'center') { + tooltipClass += ` Tooltip-${position}`; + } + + if (copied) { + tooltipClass += ' Tooltip-copied'; + } + + return ( +
+ {copied ? 'Copied to clipboard!' : text} +
+ ); +} diff --git a/src/components/Truncate.tsx b/src/components/Truncate.tsx new file mode 100644 index 0000000..0167c64 --- /dev/null +++ b/src/components/Truncate.tsx @@ -0,0 +1,30 @@ +import * as React from 'react'; + +interface TruncateProps { + text: string; + chars?: number; +} + +export class Truncate extends React.Component { + public shouldComponentUpdate(nextProps: TruncateProps): boolean { + return this.props.text !== nextProps.text; + } + + public render() { + const { text, chars } = this.props; + + if (!text) { + return '-'; + } + + if (chars != null && text.length <= chars) { + return text; + } + + return chars ? ( + `${text.substr(0, chars - 1)}…` + ) : ( +
{text}
+ ); + } +} diff --git a/src/components/index.ts b/src/components/index.ts new file mode 100644 index 0000000..3d37ddd --- /dev/null +++ b/src/components/index.ts @@ -0,0 +1,11 @@ +export * from './Chain'; +export * from './List'; +export * from './Map'; +export * from './Stats'; +export * from './Icon'; +export * from './Tile'; +export * from './Ago'; +export * from './Sparkline'; +export * from './Truncate'; +export * from './Tooltip'; +export * from './Filter'; diff --git a/src/icons/alert.svg b/src/icons/alert.svg new file mode 100644 index 0000000..ca50ea8 --- /dev/null +++ b/src/icons/alert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/archive.svg b/src/icons/archive.svg new file mode 100644 index 0000000..d1eaa21 --- /dev/null +++ b/src/icons/archive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/arrow-down.svg b/src/icons/arrow-down.svg new file mode 100644 index 0000000..c1acf0a --- /dev/null +++ b/src/icons/arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/arrow-left.svg b/src/icons/arrow-left.svg new file mode 100644 index 0000000..f3cda4f --- /dev/null +++ b/src/icons/arrow-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/arrow-right.svg b/src/icons/arrow-right.svg new file mode 100644 index 0000000..04a4fbf --- /dev/null +++ b/src/icons/arrow-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/arrow-small-down.svg b/src/icons/arrow-small-down.svg new file mode 100644 index 0000000..57c1ee8 --- /dev/null +++ b/src/icons/arrow-small-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/arrow-small-left.svg b/src/icons/arrow-small-left.svg new file mode 100644 index 0000000..9fa227e --- /dev/null +++ b/src/icons/arrow-small-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/arrow-small-right.svg b/src/icons/arrow-small-right.svg new file mode 100644 index 0000000..bca6847 --- /dev/null +++ b/src/icons/arrow-small-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/arrow-small-up.svg b/src/icons/arrow-small-up.svg new file mode 100644 index 0000000..6c132f1 --- /dev/null +++ b/src/icons/arrow-small-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/arrow-up.svg b/src/icons/arrow-up.svg new file mode 100644 index 0000000..63be890 --- /dev/null +++ b/src/icons/arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/assets.d.ts b/src/icons/assets.d.ts new file mode 100644 index 0000000..d9087db --- /dev/null +++ b/src/icons/assets.d.ts @@ -0,0 +1,17 @@ +// Source code for the Substrate Telemetry Server. +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +declare module '*.svg'; diff --git a/src/icons/beaker.svg b/src/icons/beaker.svg new file mode 100644 index 0000000..0997bb0 --- /dev/null +++ b/src/icons/beaker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/bell.svg b/src/icons/bell.svg new file mode 100644 index 0000000..171f84f --- /dev/null +++ b/src/icons/bell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/book.svg b/src/icons/book.svg new file mode 100644 index 0000000..d21fa56 --- /dev/null +++ b/src/icons/book.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/bookmark.svg b/src/icons/bookmark.svg new file mode 100644 index 0000000..de64157 --- /dev/null +++ b/src/icons/bookmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/briefcase.svg b/src/icons/briefcase.svg new file mode 100644 index 0000000..5104b81 --- /dev/null +++ b/src/icons/briefcase.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/broadcast.svg b/src/icons/broadcast.svg new file mode 100644 index 0000000..ddc1458 --- /dev/null +++ b/src/icons/broadcast.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/browser.svg b/src/icons/browser.svg new file mode 100644 index 0000000..00f512a --- /dev/null +++ b/src/icons/browser.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/bug.svg b/src/icons/bug.svg new file mode 100644 index 0000000..7518829 --- /dev/null +++ b/src/icons/bug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/calendar.svg b/src/icons/calendar.svg new file mode 100644 index 0000000..fede886 --- /dev/null +++ b/src/icons/calendar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/check-square-regular.svg b/src/icons/check-square-regular.svg new file mode 100644 index 0000000..eb02d8b --- /dev/null +++ b/src/icons/check-square-regular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/check-square-solid.svg b/src/icons/check-square-solid.svg new file mode 100644 index 0000000..56e75ac --- /dev/null +++ b/src/icons/check-square-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/check.svg b/src/icons/check.svg new file mode 100644 index 0000000..2df5dee --- /dev/null +++ b/src/icons/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/checklist.svg b/src/icons/checklist.svg new file mode 100644 index 0000000..671aa3b --- /dev/null +++ b/src/icons/checklist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/chevron-down.svg b/src/icons/chevron-down.svg new file mode 100644 index 0000000..32eab7b --- /dev/null +++ b/src/icons/chevron-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/chevron-left.svg b/src/icons/chevron-left.svg new file mode 100644 index 0000000..680c9a0 --- /dev/null +++ b/src/icons/chevron-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/chevron-right.svg b/src/icons/chevron-right.svg new file mode 100644 index 0000000..a5dadc6 --- /dev/null +++ b/src/icons/chevron-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/chevron-up.svg b/src/icons/chevron-up.svg new file mode 100644 index 0000000..19db9dd --- /dev/null +++ b/src/icons/chevron-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/circle-regular.svg b/src/icons/circle-regular.svg new file mode 100644 index 0000000..dee554d --- /dev/null +++ b/src/icons/circle-regular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/circle-slash.svg b/src/icons/circle-slash.svg new file mode 100644 index 0000000..edfb3d8 --- /dev/null +++ b/src/icons/circle-slash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/circle-solid.svg b/src/icons/circle-solid.svg new file mode 100644 index 0000000..2f60c78 --- /dev/null +++ b/src/icons/circle-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/circuit-board.svg b/src/icons/circuit-board.svg new file mode 100644 index 0000000..f9a4c7e --- /dev/null +++ b/src/icons/circuit-board.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/clippy.svg b/src/icons/clippy.svg new file mode 100644 index 0000000..9cb6337 --- /dev/null +++ b/src/icons/clippy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/clock.svg b/src/icons/clock.svg new file mode 100644 index 0000000..4bb89e0 --- /dev/null +++ b/src/icons/clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/cloud-download.svg b/src/icons/cloud-download.svg new file mode 100644 index 0000000..8cc3d0f --- /dev/null +++ b/src/icons/cloud-download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/cloud-upload.svg b/src/icons/cloud-upload.svg new file mode 100644 index 0000000..c17e1d3 --- /dev/null +++ b/src/icons/cloud-upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/code.svg b/src/icons/code.svg new file mode 100644 index 0000000..6e6560e --- /dev/null +++ b/src/icons/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/comment-discussion.svg b/src/icons/comment-discussion.svg new file mode 100644 index 0000000..c155b88 --- /dev/null +++ b/src/icons/comment-discussion.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/comment.svg b/src/icons/comment.svg new file mode 100644 index 0000000..2c6d88c --- /dev/null +++ b/src/icons/comment.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/credit-card.svg b/src/icons/credit-card.svg new file mode 100644 index 0000000..7da9f29 --- /dev/null +++ b/src/icons/credit-card.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/cube-alt.svg b/src/icons/cube-alt.svg new file mode 100644 index 0000000..268492e --- /dev/null +++ b/src/icons/cube-alt.svg @@ -0,0 +1 @@ + diff --git a/src/icons/cube.svg b/src/icons/cube.svg new file mode 100644 index 0000000..4c23a8b --- /dev/null +++ b/src/icons/cube.svg @@ -0,0 +1 @@ + diff --git a/src/icons/dashboard.svg b/src/icons/dashboard.svg new file mode 100644 index 0000000..dad1fd7 --- /dev/null +++ b/src/icons/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/database.svg b/src/icons/database.svg new file mode 100644 index 0000000..e686d98 --- /dev/null +++ b/src/icons/database.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/desktop-download.svg b/src/icons/desktop-download.svg new file mode 100644 index 0000000..74b2c7d --- /dev/null +++ b/src/icons/desktop-download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/device-camera-video.svg b/src/icons/device-camera-video.svg new file mode 100644 index 0000000..dc0e55e --- /dev/null +++ b/src/icons/device-camera-video.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/device-camera.svg b/src/icons/device-camera.svg new file mode 100644 index 0000000..609be0e --- /dev/null +++ b/src/icons/device-camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/device-desktop.svg b/src/icons/device-desktop.svg new file mode 100644 index 0000000..3671fd0 --- /dev/null +++ b/src/icons/device-desktop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/device-mobile.svg b/src/icons/device-mobile.svg new file mode 100644 index 0000000..84559ca --- /dev/null +++ b/src/icons/device-mobile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/diff-added.svg b/src/icons/diff-added.svg new file mode 100644 index 0000000..8394151 --- /dev/null +++ b/src/icons/diff-added.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/diff-ignored.svg b/src/icons/diff-ignored.svg new file mode 100644 index 0000000..eaa2bee --- /dev/null +++ b/src/icons/diff-ignored.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/diff-modified.svg b/src/icons/diff-modified.svg new file mode 100644 index 0000000..6a17dc3 --- /dev/null +++ b/src/icons/diff-modified.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/diff-removed.svg b/src/icons/diff-removed.svg new file mode 100644 index 0000000..2dfe2a1 --- /dev/null +++ b/src/icons/diff-removed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/diff-renamed.svg b/src/icons/diff-renamed.svg new file mode 100644 index 0000000..c1f0982 --- /dev/null +++ b/src/icons/diff-renamed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/diff.svg b/src/icons/diff.svg new file mode 100644 index 0000000..cbaa51f --- /dev/null +++ b/src/icons/diff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/ellipsis-v-solid.svg b/src/icons/ellipsis-v-solid.svg new file mode 100644 index 0000000..10cbd55 --- /dev/null +++ b/src/icons/ellipsis-v-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/ellipsis.svg b/src/icons/ellipsis.svg new file mode 100644 index 0000000..7d4b9d8 --- /dev/null +++ b/src/icons/ellipsis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/eye.svg b/src/icons/eye.svg new file mode 100644 index 0000000..4f43a09 --- /dev/null +++ b/src/icons/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/file-binary.svg b/src/icons/file-binary.svg new file mode 100644 index 0000000..93d0f54 --- /dev/null +++ b/src/icons/file-binary.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/file-code.svg b/src/icons/file-code.svg new file mode 100644 index 0000000..5b4b199 --- /dev/null +++ b/src/icons/file-code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/file-directory.svg b/src/icons/file-directory.svg new file mode 100644 index 0000000..4bf1f1c --- /dev/null +++ b/src/icons/file-directory.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/file-media.svg b/src/icons/file-media.svg new file mode 100644 index 0000000..018e533 --- /dev/null +++ b/src/icons/file-media.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/file-pdf.svg b/src/icons/file-pdf.svg new file mode 100644 index 0000000..1b1703e --- /dev/null +++ b/src/icons/file-pdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/file-submodule.svg b/src/icons/file-submodule.svg new file mode 100644 index 0000000..355a905 --- /dev/null +++ b/src/icons/file-submodule.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/file-symlink-directory.svg b/src/icons/file-symlink-directory.svg new file mode 100644 index 0000000..4b6263a --- /dev/null +++ b/src/icons/file-symlink-directory.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/file-symlink-file.svg b/src/icons/file-symlink-file.svg new file mode 100644 index 0000000..b2aaf24 --- /dev/null +++ b/src/icons/file-symlink-file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/file-zip.svg b/src/icons/file-zip.svg new file mode 100644 index 0000000..e2bb5b0 --- /dev/null +++ b/src/icons/file-zip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/file.svg b/src/icons/file.svg new file mode 100644 index 0000000..0997406 --- /dev/null +++ b/src/icons/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/finalized.svg b/src/icons/finalized.svg new file mode 100644 index 0000000..8b7228b --- /dev/null +++ b/src/icons/finalized.svg @@ -0,0 +1,9 @@ + + + diff --git a/src/icons/fingerprint.svg b/src/icons/fingerprint.svg new file mode 100644 index 0000000..b289079 --- /dev/null +++ b/src/icons/fingerprint.svg @@ -0,0 +1 @@ + diff --git a/src/icons/flame.svg b/src/icons/flame.svg new file mode 100644 index 0000000..1fcb94b --- /dev/null +++ b/src/icons/flame.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/fold.svg b/src/icons/fold.svg new file mode 100644 index 0000000..1b0b399 --- /dev/null +++ b/src/icons/fold.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/gear.svg b/src/icons/gear.svg new file mode 100644 index 0000000..bf82007 --- /dev/null +++ b/src/icons/gear.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/ghost-logo.svg b/src/icons/ghost-logo.svg new file mode 100644 index 0000000..1b73934 --- /dev/null +++ b/src/icons/ghost-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/gift.svg b/src/icons/gift.svg new file mode 100644 index 0000000..4539ce6 --- /dev/null +++ b/src/icons/gift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/gist-secret.svg b/src/icons/gist-secret.svg new file mode 100644 index 0000000..6495281 --- /dev/null +++ b/src/icons/gist-secret.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/gist.svg b/src/icons/gist.svg new file mode 100644 index 0000000..9584460 --- /dev/null +++ b/src/icons/gist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/git-branch.svg b/src/icons/git-branch.svg new file mode 100644 index 0000000..21ca8d8 --- /dev/null +++ b/src/icons/git-branch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/git-commit.svg b/src/icons/git-commit.svg new file mode 100644 index 0000000..3cc2e82 --- /dev/null +++ b/src/icons/git-commit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/git-compare.svg b/src/icons/git-compare.svg new file mode 100644 index 0000000..4737499 --- /dev/null +++ b/src/icons/git-compare.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/git-merge.svg b/src/icons/git-merge.svg new file mode 100644 index 0000000..63c43f7 --- /dev/null +++ b/src/icons/git-merge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/git-pull-request.svg b/src/icons/git-pull-request.svg new file mode 100644 index 0000000..4f59759 --- /dev/null +++ b/src/icons/git-pull-request.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/globe-solid.svg b/src/icons/globe-solid.svg new file mode 100644 index 0000000..d63f003 --- /dev/null +++ b/src/icons/globe-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/globe.svg b/src/icons/globe.svg new file mode 100644 index 0000000..990554c --- /dev/null +++ b/src/icons/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/grabber.svg b/src/icons/grabber.svg new file mode 100644 index 0000000..1a41fd0 --- /dev/null +++ b/src/icons/grabber.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/graph.svg b/src/icons/graph.svg new file mode 100644 index 0000000..cd3909e --- /dev/null +++ b/src/icons/graph.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/hatching.svg b/src/icons/hatching.svg new file mode 100644 index 0000000..51c218a --- /dev/null +++ b/src/icons/hatching.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + diff --git a/src/icons/heart.svg b/src/icons/heart.svg new file mode 100644 index 0000000..e9407b5 --- /dev/null +++ b/src/icons/heart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/history.svg b/src/icons/history.svg new file mode 100644 index 0000000..ee4d9fb --- /dev/null +++ b/src/icons/history.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/home.svg b/src/icons/home.svg new file mode 100644 index 0000000..f3d3138 --- /dev/null +++ b/src/icons/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/horizontal-rule.svg b/src/icons/horizontal-rule.svg new file mode 100644 index 0000000..9a05c30 --- /dev/null +++ b/src/icons/horizontal-rule.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/hubot.svg b/src/icons/hubot.svg new file mode 100644 index 0000000..fea9f4b --- /dev/null +++ b/src/icons/hubot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/inbox.svg b/src/icons/inbox.svg new file mode 100644 index 0000000..f9cfec2 --- /dev/null +++ b/src/icons/inbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/info.svg b/src/icons/info.svg new file mode 100644 index 0000000..26db463 --- /dev/null +++ b/src/icons/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/issue-closed.svg b/src/icons/issue-closed.svg new file mode 100644 index 0000000..0a7819a --- /dev/null +++ b/src/icons/issue-closed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/issue-opened.svg b/src/icons/issue-opened.svg new file mode 100644 index 0000000..a88cbcc --- /dev/null +++ b/src/icons/issue-opened.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/issue-reopened.svg b/src/icons/issue-reopened.svg new file mode 100644 index 0000000..789e18b --- /dev/null +++ b/src/icons/issue-reopened.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/italic.svg b/src/icons/italic.svg new file mode 100644 index 0000000..51d65f1 --- /dev/null +++ b/src/icons/italic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/jersey.svg b/src/icons/jersey.svg new file mode 100644 index 0000000..776e456 --- /dev/null +++ b/src/icons/jersey.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/kebab-horizontal.svg b/src/icons/kebab-horizontal.svg new file mode 100644 index 0000000..7c472d3 --- /dev/null +++ b/src/icons/kebab-horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/kebab-vertical.svg b/src/icons/kebab-vertical.svg new file mode 100644 index 0000000..2aaee60 --- /dev/null +++ b/src/icons/kebab-vertical.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/key.svg b/src/icons/key.svg new file mode 100644 index 0000000..ac8badc --- /dev/null +++ b/src/icons/key.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/keyboard.svg b/src/icons/keyboard.svg new file mode 100644 index 0000000..89712ad --- /dev/null +++ b/src/icons/keyboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/law.svg b/src/icons/law.svg new file mode 100644 index 0000000..5ccc464 --- /dev/null +++ b/src/icons/law.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/light-bulb.svg b/src/icons/light-bulb.svg new file mode 100644 index 0000000..d2ff74c --- /dev/null +++ b/src/icons/light-bulb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/link-external.svg b/src/icons/link-external.svg new file mode 100644 index 0000000..70b569d --- /dev/null +++ b/src/icons/link-external.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/link.svg b/src/icons/link.svg new file mode 100644 index 0000000..820aef7 --- /dev/null +++ b/src/icons/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/list-alt-regular.svg b/src/icons/list-alt-regular.svg new file mode 100644 index 0000000..87b9178 --- /dev/null +++ b/src/icons/list-alt-regular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/list-ordered.svg b/src/icons/list-ordered.svg new file mode 100644 index 0000000..c0e8304 --- /dev/null +++ b/src/icons/list-ordered.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/list-unordered.svg b/src/icons/list-unordered.svg new file mode 100644 index 0000000..0b43536 --- /dev/null +++ b/src/icons/list-unordered.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/location.svg b/src/icons/location.svg new file mode 100644 index 0000000..f6372a3 --- /dev/null +++ b/src/icons/location.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/lock.svg b/src/icons/lock.svg new file mode 100644 index 0000000..5587064 --- /dev/null +++ b/src/icons/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/logo-gist.svg b/src/icons/logo-gist.svg new file mode 100644 index 0000000..29f2213 --- /dev/null +++ b/src/icons/logo-gist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/logo-github.svg b/src/icons/logo-github.svg new file mode 100644 index 0000000..0da3476 --- /dev/null +++ b/src/icons/logo-github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/mail-read.svg b/src/icons/mail-read.svg new file mode 100644 index 0000000..bf4deaf --- /dev/null +++ b/src/icons/mail-read.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/mail.svg b/src/icons/mail.svg new file mode 100644 index 0000000..9fca68b --- /dev/null +++ b/src/icons/mail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/map-marked-alt-solid.svg b/src/icons/map-marked-alt-solid.svg new file mode 100644 index 0000000..62a7fd6 --- /dev/null +++ b/src/icons/map-marked-alt-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/map-marker-alt-solid.svg b/src/icons/map-marker-alt-solid.svg new file mode 100644 index 0000000..b45b113 --- /dev/null +++ b/src/icons/map-marker-alt-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/map-pin-solid.svg b/src/icons/map-pin-solid.svg new file mode 100644 index 0000000..1cef484 --- /dev/null +++ b/src/icons/map-pin-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/mark-github.svg b/src/icons/mark-github.svg new file mode 100644 index 0000000..af1bfa1 --- /dev/null +++ b/src/icons/mark-github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/markdown.svg b/src/icons/markdown.svg new file mode 100644 index 0000000..999110e --- /dev/null +++ b/src/icons/markdown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/megaphone.svg b/src/icons/megaphone.svg new file mode 100644 index 0000000..a62f82d --- /dev/null +++ b/src/icons/megaphone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/memory-solid.svg b/src/icons/memory-solid.svg new file mode 100644 index 0000000..00d18a8 --- /dev/null +++ b/src/icons/memory-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/mention.svg b/src/icons/mention.svg new file mode 100644 index 0000000..c09499b --- /dev/null +++ b/src/icons/mention.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/microchip-solid.svg b/src/icons/microchip-solid.svg new file mode 100644 index 0000000..8b5f050 --- /dev/null +++ b/src/icons/microchip-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/milestone.svg b/src/icons/milestone.svg new file mode 100644 index 0000000..803465b --- /dev/null +++ b/src/icons/milestone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/mirror.svg b/src/icons/mirror.svg new file mode 100644 index 0000000..76e0c37 --- /dev/null +++ b/src/icons/mirror.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/mortar-board.svg b/src/icons/mortar-board.svg new file mode 100644 index 0000000..869f9ae --- /dev/null +++ b/src/icons/mortar-board.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/mute.svg b/src/icons/mute.svg new file mode 100644 index 0000000..e448808 --- /dev/null +++ b/src/icons/mute.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/network.svg b/src/icons/network.svg new file mode 100644 index 0000000..0452c14 --- /dev/null +++ b/src/icons/network.svg @@ -0,0 +1 @@ + diff --git a/src/icons/no-newline.svg b/src/icons/no-newline.svg new file mode 100644 index 0000000..2a8fb94 --- /dev/null +++ b/src/icons/no-newline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/note.svg b/src/icons/note.svg new file mode 100644 index 0000000..cbf7963 --- /dev/null +++ b/src/icons/note.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/octoface.svg b/src/icons/octoface.svg new file mode 100644 index 0000000..bb1a40d --- /dev/null +++ b/src/icons/octoface.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/organization.svg b/src/icons/organization.svg new file mode 100644 index 0000000..6bf4ae9 --- /dev/null +++ b/src/icons/organization.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/package.svg b/src/icons/package.svg new file mode 100644 index 0000000..2db0351 --- /dev/null +++ b/src/icons/package.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/paintcan.svg b/src/icons/paintcan.svg new file mode 100644 index 0000000..08b4a4b --- /dev/null +++ b/src/icons/paintcan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/pencil.svg b/src/icons/pencil.svg new file mode 100644 index 0000000..8702f4d --- /dev/null +++ b/src/icons/pencil.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/person.svg b/src/icons/person.svg new file mode 100644 index 0000000..5871e2f --- /dev/null +++ b/src/icons/person.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/pin.svg b/src/icons/pin.svg new file mode 100644 index 0000000..95405c5 --- /dev/null +++ b/src/icons/pin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/plug.svg b/src/icons/plug.svg new file mode 100644 index 0000000..42865d5 --- /dev/null +++ b/src/icons/plug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/plus-small.svg b/src/icons/plus-small.svg new file mode 100644 index 0000000..5e093a4 --- /dev/null +++ b/src/icons/plus-small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/plus.svg b/src/icons/plus.svg new file mode 100644 index 0000000..23c27d8 --- /dev/null +++ b/src/icons/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/polkadot-js.svg b/src/icons/polkadot-js.svg new file mode 100644 index 0000000..6913710 --- /dev/null +++ b/src/icons/polkadot-js.svg @@ -0,0 +1 @@ + diff --git a/src/icons/primitive-dot.svg b/src/icons/primitive-dot.svg new file mode 100644 index 0000000..6f465da --- /dev/null +++ b/src/icons/primitive-dot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/primitive-square.svg b/src/icons/primitive-square.svg new file mode 100644 index 0000000..9d4058b --- /dev/null +++ b/src/icons/primitive-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/project.svg b/src/icons/project.svg new file mode 100644 index 0000000..a728f74 --- /dev/null +++ b/src/icons/project.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/pulse.svg b/src/icons/pulse.svg new file mode 100644 index 0000000..4ec57ba --- /dev/null +++ b/src/icons/pulse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/question-solid.svg b/src/icons/question-solid.svg new file mode 100644 index 0000000..003cd55 --- /dev/null +++ b/src/icons/question-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/question.svg b/src/icons/question.svg new file mode 100644 index 0000000..a6fc753 --- /dev/null +++ b/src/icons/question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/quote.svg b/src/icons/quote.svg new file mode 100644 index 0000000..da5c2b2 --- /dev/null +++ b/src/icons/quote.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/radio-tower.svg b/src/icons/radio-tower.svg new file mode 100644 index 0000000..f89a705 --- /dev/null +++ b/src/icons/radio-tower.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/reply.svg b/src/icons/reply.svg new file mode 100644 index 0000000..12717db --- /dev/null +++ b/src/icons/reply.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/repo-clone.svg b/src/icons/repo-clone.svg new file mode 100644 index 0000000..32b86e8 --- /dev/null +++ b/src/icons/repo-clone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/repo-force-push.svg b/src/icons/repo-force-push.svg new file mode 100644 index 0000000..0aece33 --- /dev/null +++ b/src/icons/repo-force-push.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/repo-forked.svg b/src/icons/repo-forked.svg new file mode 100644 index 0000000..cc5e46a --- /dev/null +++ b/src/icons/repo-forked.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/repo-pull.svg b/src/icons/repo-pull.svg new file mode 100644 index 0000000..dfe8e6c --- /dev/null +++ b/src/icons/repo-pull.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/repo-push.svg b/src/icons/repo-push.svg new file mode 100644 index 0000000..408dca6 --- /dev/null +++ b/src/icons/repo-push.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/repo.svg b/src/icons/repo.svg new file mode 100644 index 0000000..e653d4e --- /dev/null +++ b/src/icons/repo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/report.svg b/src/icons/report.svg new file mode 100644 index 0000000..3f93ee4 --- /dev/null +++ b/src/icons/report.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/rocket.svg b/src/icons/rocket.svg new file mode 100644 index 0000000..98303f8 --- /dev/null +++ b/src/icons/rocket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/rss.svg b/src/icons/rss.svg new file mode 100644 index 0000000..3b2705d --- /dev/null +++ b/src/icons/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/ruby.svg b/src/icons/ruby.svg new file mode 100644 index 0000000..8463908 --- /dev/null +++ b/src/icons/ruby.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/screen-full.svg b/src/icons/screen-full.svg new file mode 100644 index 0000000..e78d371 --- /dev/null +++ b/src/icons/screen-full.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/screen-normal.svg b/src/icons/screen-normal.svg new file mode 100644 index 0000000..a884713 --- /dev/null +++ b/src/icons/screen-normal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/search.svg b/src/icons/search.svg new file mode 100644 index 0000000..d0304b6 --- /dev/null +++ b/src/icons/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/server.svg b/src/icons/server.svg new file mode 100644 index 0000000..78bc79f --- /dev/null +++ b/src/icons/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/settings.svg b/src/icons/settings.svg new file mode 100644 index 0000000..f22b92e --- /dev/null +++ b/src/icons/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/shield.svg b/src/icons/shield.svg new file mode 100644 index 0000000..087a969 --- /dev/null +++ b/src/icons/shield.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/sign-in.svg b/src/icons/sign-in.svg new file mode 100644 index 0000000..91560c6 --- /dev/null +++ b/src/icons/sign-in.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/sign-out.svg b/src/icons/sign-out.svg new file mode 100644 index 0000000..e54ca58 --- /dev/null +++ b/src/icons/sign-out.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/smiley.svg b/src/icons/smiley.svg new file mode 100644 index 0000000..0d93af5 --- /dev/null +++ b/src/icons/smiley.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/square-regular.svg b/src/icons/square-regular.svg new file mode 100644 index 0000000..5b7501f --- /dev/null +++ b/src/icons/square-regular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/square-solid.svg b/src/icons/square-solid.svg new file mode 100644 index 0000000..6455b3d --- /dev/null +++ b/src/icons/square-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/squirrel.svg b/src/icons/squirrel.svg new file mode 100644 index 0000000..3e5b51b --- /dev/null +++ b/src/icons/squirrel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/star.svg b/src/icons/star.svg new file mode 100644 index 0000000..9444880 --- /dev/null +++ b/src/icons/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/stop.svg b/src/icons/stop.svg new file mode 100644 index 0000000..6ae8523 --- /dev/null +++ b/src/icons/stop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/sync.svg b/src/icons/sync.svg new file mode 100644 index 0000000..692349a --- /dev/null +++ b/src/icons/sync.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/tag.svg b/src/icons/tag.svg new file mode 100644 index 0000000..5d2144e --- /dev/null +++ b/src/icons/tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/tasklist.svg b/src/icons/tasklist.svg new file mode 100644 index 0000000..a0bd560 --- /dev/null +++ b/src/icons/tasklist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/telescope.svg b/src/icons/telescope.svg new file mode 100644 index 0000000..95047dc --- /dev/null +++ b/src/icons/telescope.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/terminal.svg b/src/icons/terminal.svg new file mode 100644 index 0000000..d6072fc --- /dev/null +++ b/src/icons/terminal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/text-size.svg b/src/icons/text-size.svg new file mode 100644 index 0000000..f83a5f9 --- /dev/null +++ b/src/icons/text-size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/three-bars.svg b/src/icons/three-bars.svg new file mode 100644 index 0000000..bb3b2c8 --- /dev/null +++ b/src/icons/three-bars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/thumbsdown.svg b/src/icons/thumbsdown.svg new file mode 100644 index 0000000..091e2f9 --- /dev/null +++ b/src/icons/thumbsdown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/thumbsup.svg b/src/icons/thumbsup.svg new file mode 100644 index 0000000..746c1e9 --- /dev/null +++ b/src/icons/thumbsup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/tools.svg b/src/icons/tools.svg new file mode 100644 index 0000000..67a5984 --- /dev/null +++ b/src/icons/tools.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/trashcan.svg b/src/icons/trashcan.svg new file mode 100644 index 0000000..3d8c051 --- /dev/null +++ b/src/icons/trashcan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/triangle-down.svg b/src/icons/triangle-down.svg new file mode 100644 index 0000000..faa8896 --- /dev/null +++ b/src/icons/triangle-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/triangle-left.svg b/src/icons/triangle-left.svg new file mode 100644 index 0000000..8762036 --- /dev/null +++ b/src/icons/triangle-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/triangle-right.svg b/src/icons/triangle-right.svg new file mode 100644 index 0000000..59c2ac6 --- /dev/null +++ b/src/icons/triangle-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/triangle-up.svg b/src/icons/triangle-up.svg new file mode 100644 index 0000000..98d0654 --- /dev/null +++ b/src/icons/triangle-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/turingnetwork.svg b/src/icons/turingnetwork.svg new file mode 100644 index 0000000..f9b8de2 --- /dev/null +++ b/src/icons/turingnetwork.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/icons/unfold.svg b/src/icons/unfold.svg new file mode 100644 index 0000000..ab04339 --- /dev/null +++ b/src/icons/unfold.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/unmute.svg b/src/icons/unmute.svg new file mode 100644 index 0000000..5d9a978 --- /dev/null +++ b/src/icons/unmute.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/unverified.svg b/src/icons/unverified.svg new file mode 100644 index 0000000..e55595c --- /dev/null +++ b/src/icons/unverified.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/verified.svg b/src/icons/verified.svg new file mode 100644 index 0000000..3a2e01d --- /dev/null +++ b/src/icons/verified.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/versions.svg b/src/icons/versions.svg new file mode 100644 index 0000000..274bbdb --- /dev/null +++ b/src/icons/versions.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/watch.svg b/src/icons/watch.svg new file mode 100644 index 0000000..45b2499 --- /dev/null +++ b/src/icons/watch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/x.svg b/src/icons/x.svg new file mode 100644 index 0000000..e377314 --- /dev/null +++ b/src/icons/x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/zap.svg b/src/icons/zap.svg new file mode 100644 index 0000000..e778194 --- /dev/null +++ b/src/icons/zap.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..b83f270 --- /dev/null +++ b/src/index.css @@ -0,0 +1,10 @@ +* { + /* Use "standard"/common sense heights/widths (ie they include padding+border) */ + box-sizing: border-box; +} + +body { + margin: 0; + padding: 0; + font-family: 'Ubuntu', sans-serif; +} diff --git a/src/index.tsx b/src/index.tsx new file mode 100644 index 0000000..d99702f --- /dev/null +++ b/src/index.tsx @@ -0,0 +1,15 @@ +import * as React from 'react'; +import { createRoot } from 'react-dom/client'; +import ReactGA from "react-ga4"; +import App from './App'; +import './index.css'; + +const TRACKING_ID: string = process.env.REACT_APP_TRACKING_ID || ''; + +if (TRACKING_ID) { + ReactGA.initialize(TRACKING_ID); +} + +const container = document.getElementById('root') as HTMLElement; +const root = createRoot(container); +root.render(); diff --git a/src/persist/Persistent.ts b/src/persist/Persistent.ts new file mode 100644 index 0000000..7de7dea --- /dev/null +++ b/src/persist/Persistent.ts @@ -0,0 +1,51 @@ +import { parse, Stringified, stringify, Maybe } from '../common'; + +export class Persistent { + private readonly onChange: (value: Data) => void; + private readonly key: string; + private value: Data; + + constructor( + key: string, + initial: Data, + onChange: (value: Readonly) => void + ) { + this.key = key; + this.onChange = onChange; + + const stored = window.localStorage.getItem(key) as Maybe>; + + if (stored) { + try { + this.value = parse(stored); + } catch (err) { + this.value = initial; + } + } else { + this.value = initial; + } + + window.addEventListener('storage', (event) => { + if (event.key === this.key) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this.value = parse(event.newValue as any as Stringified); + + this.onChange(this.value); + } + }); + } + + public get(): Readonly { + return this.value; + } + + public set(value: Data) { + this.value = value; + window.localStorage.setItem( + this.key, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + stringify(this.value) as any as string + ); + this.onChange(this.value); + } +} diff --git a/src/persist/PersistentObject.ts b/src/persist/PersistentObject.ts new file mode 100644 index 0000000..83b974f --- /dev/null +++ b/src/persist/PersistentObject.ts @@ -0,0 +1,23 @@ +import { Persistent } from './'; + +export class PersistentObject { + private readonly inner: Persistent; + + constructor(key: string, initial: Data, onChange: (value: Data) => void) { + this.inner = new Persistent(key, initial, onChange); + } + + public raw(): Readonly { + return this.inner.get(); + } + + public get(key: K): Data[K] { + return this.inner.get()[key]; + } + + public set(key: K, value: Data[K]) { + const data: Data = Object.assign({}, this.raw()); + data[key] = value; + this.inner.set(data); + } +} diff --git a/src/persist/PersistentSet.ts b/src/persist/PersistentSet.ts new file mode 100644 index 0000000..a89a6cc --- /dev/null +++ b/src/persist/PersistentSet.ts @@ -0,0 +1,35 @@ +import { Persistent } from './'; + +export class PersistentSet { + private readonly inner: Persistent; + private value: Set; + + constructor(key: string, onChange: (value: Set) => void) { + this.inner = new Persistent(key, [], (raw: Readonly) => + onChange((this.value = new Set(raw as Item[]))) + ); + this.value = new Set(this.inner.get() as Item[]); + } + + public get(): Set { + return this.value; + } + + public add(item: Item) { + this.value.add(item); + this.inner.set(Array.from(this.value)); + } + + public delete(item: Item) { + this.value.delete(item); + this.inner.set(Array.from(this.value)); + } + + public clear() { + this.inner.set([]); + } + + public has(item: Item): boolean { + return this.value.has(item); + } +} diff --git a/src/persist/index.ts b/src/persist/index.ts new file mode 100644 index 0000000..8d05b8d --- /dev/null +++ b/src/persist/index.ts @@ -0,0 +1,3 @@ +export * from './Persistent'; +export * from './PersistentObject'; +export * from './PersistentSet'; diff --git a/src/state.ts b/src/state.ts new file mode 100644 index 0000000..5ed26c1 --- /dev/null +++ b/src/state.ts @@ -0,0 +1,328 @@ +import * as React from 'react'; +import { Types, Maybe, SortedCollection } from './common'; +import { Column } from './components/List'; + +export const PINNED_CHAINS = { + // casper v0.0.2 + '0x7657c8c868863dea692178d462fe9018ac8f1e16f51be31eea8f29274d85525b': 1, +}; + +export function comparePinnedChains(a: string, b: string) { + const aWeight: number = (PINNED_CHAINS as any)[a] || 1024; + const bWeight: number = (PINNED_CHAINS as any)[b] || 1024; + + return aWeight - bWeight; +} + +export class Node { + public static compare(a: Node, b: Node): number { + if (a.pinned === b.pinned && a.stale === b.stale) { + if (a.height === b.height) { + const aPropagation = + a.propagationTime == null ? Infinity : (a.propagationTime as number); + const bPropagation = + b.propagationTime == null ? Infinity : (b.propagationTime as number); + + // Ascending sort by propagation time + return aPropagation - bPropagation; + } + } else { + const bSort = (b.pinned ? -2 : 0) + +b.stale; + const aSort = (a.pinned ? -2 : 0) + +a.stale; + + return aSort - bSort; + } + + // Descending sort by block number + return b.height - a.height; + } + + public readonly id: Types.NodeId; + public readonly name: Types.NodeName; + public readonly implementation: Types.NodeImplementation; + public readonly version: Types.NodeVersion; + public readonly validator: Maybe; + public readonly networkId: Maybe; + public readonly startupTime: Maybe; + public readonly target_os: Types.OperatingSystem; + public readonly target_arch: Types.CpuArchitecture; + public readonly target_env: Types.TargetEnv; + public readonly sysInfo: Types.NodeSysInfo; + + public readonly cpu: Types.Cpu; + public readonly memory: Types.Memory; + public readonly core_count: Types.CpuCores; + public readonly linux_kernel: Types.LinuxKernel; + public readonly linux_distro: Types.LinuxDistro; + public readonly is_virtual_machine: Types.VirtualMachine; + + public readonly sortableName: string; + public readonly sortableVersion: number; + + public stale: boolean; + public pinned: boolean; + public peers: Types.PeerCount; + public txs: Types.TransactionCount; + public upload: Types.BytesPerSecond[]; + public download: Types.BytesPerSecond[]; + public stateCacheSize: Types.Bytes[]; + public chartstamps: Types.Timestamp[]; + + public height: Types.BlockNumber; + public hash: Types.BlockHash; + public blockTime: Types.Milliseconds; + public blockTimestamp: Types.Timestamp; + public propagationTime: Maybe; + + public finalized = 0 as Types.BlockNumber; + public finalizedHash = '' as Types.BlockHash; + + public lat: Maybe; + public lon: Maybe; + public city: Maybe; + + private _changeRef = 0; + private readonly subscriptionsConsensus = new Set<(node: Node) => void>(); + + constructor( + pinned: boolean, + id: Types.NodeId, + nodeDetails: Types.NodeDetails, + nodeStats: Types.NodeStats, + nodeIO: Types.NodeIO, + nodeHardware: Types.NodeHardware, + blockDetails: Types.BlockDetails, + location: Maybe, + startupTime: Maybe + ) { + const [ + name, + implementation, + version, + validator, + networkId, + target_os, + target_arch, + target_env, + customNullField, + sysInfo, + ] = nodeDetails; //step 4 + + this.pinned = pinned; + + this.id = id; + this.name = name; + this.implementation = implementation; + this.version = version; + this.validator = validator; + this.networkId = networkId; + this.startupTime = startupTime; + this.target_os = target_os; + this.target_arch = target_arch; + this.target_env = target_env; + this.sysInfo = { + cpu: sysInfo?.cpu ?? '', // Default value or some global constant + memory: sysInfo?.memory ?? 0, + core_count: sysInfo?.core_count ?? 0, + linux_kernel: sysInfo?.linux_kernel ?? '', + linux_distro: sysInfo?.linux_distro ?? '', + is_virtual_machine: sysInfo?.is_virtual_machine ?? false, + }; + + this.cpu = sysInfo && sysInfo.cpu ? sysInfo.cpu : ''; + this.memory = sysInfo && sysInfo.memory ? Number(sysInfo.memory) : 0; + this.core_count = + sysInfo && sysInfo.core_count ? Number(sysInfo.core_count) : 0; + this.linux_kernel = + sysInfo && sysInfo.linux_kernel ? sysInfo.linux_kernel : ''; + this.linux_distro = + sysInfo && sysInfo.linux_distro ? sysInfo.linux_distro : ''; + this.is_virtual_machine = + sysInfo && sysInfo.is_virtual_machine + ? Boolean(sysInfo.is_virtual_machine) + : false; + + const [major = 0, minor = 0, patch = 0] = (version || '0.0.0') + .split('.') + .map((n) => parseInt(n, 10) | 0); + + this.sortableName = name.toLocaleLowerCase(); + this.sortableVersion = (major * 1000 + minor * 100 + patch) | 0; + + this.updateStats(nodeStats); + this.updateIO(nodeIO); + this.updateHardware(nodeHardware); + this.updateBlock(blockDetails); + + if (location) { + this.updateLocation(location); + } + } + + public updateStats(stats: Types.NodeStats) { + const [peers, txs] = stats; + + this.peers = peers; + this.txs = txs; + + this.trigger(); + } + + public updateIO(io: Types.NodeIO) { + const [stateCacheSize] = io; + + this.stateCacheSize = stateCacheSize; + + this.trigger(); + } + + public updateHardware(hardware: Types.NodeHardware) { + const [upload, download, chartstamps] = hardware; + + this.upload = upload; + this.download = download; + this.chartstamps = chartstamps; + + this.trigger(); + } + + public updateBlock(block: Types.BlockDetails) { + const [height, hash, blockTime, blockTimestamp, propagationTime] = block; + + this.height = height; + this.hash = hash; + this.blockTime = blockTime; + this.blockTimestamp = blockTimestamp; + this.propagationTime = propagationTime; + this.stale = false; + + this.trigger(); + } + + public updateFinalized(height: Types.BlockNumber, hash: Types.BlockHash) { + this.finalized = height; + this.finalizedHash = hash; + } + + public updateLocation(location: Types.NodeLocation) { + const [lat, lon, city] = location; + + this.lat = lat; + this.lon = lon; + this.city = city; + + this.trigger(); + } + + public newBestBlock() { + if (this.propagationTime != null) { + this.propagationTime = null; + this.trigger(); + } + } + + public setPinned(pinned: boolean) { + if (this.pinned !== pinned) { + this.pinned = pinned; + this.trigger(); + } + } + + public setStale(stale: boolean) { + if (this.stale !== stale) { + this.stale = stale; + this.trigger(); + } + } + + public get changeRef(): number { + return this._changeRef; + } + + private trigger() { + this._changeRef += 1; + } +} + +export function bindState(bind: React.Component, state: State): Update { + let isUpdating = false; + + return (changes) => { + // Apply new changes to the state immediately + Object.assign(state, changes); + + // Trigger React update on next animation frame only once + if (!isUpdating) { + isUpdating = true; + + window.requestAnimationFrame(() => { + bind.forceUpdate(); + isUpdating = false; + }); + } + + return state; + }; +} + +export interface StateSettings { + location: boolean; + validator: boolean; + implementation: boolean; + networkId: boolean; + peers: boolean; + txs: boolean; + upload: boolean; + download: boolean; + stateCacheSize: boolean; + blocknumber: boolean; + blockhash: boolean; + finalized: boolean; + finalizedhash: boolean; + blocktime: boolean; + blockpropagation: boolean; + blocklasttime: boolean; + uptime: boolean; + version: boolean; + target_os: boolean; + target_arch: boolean; + cpu: boolean; + core_count: boolean; + memory: boolean; + is_virtual_machine: boolean; + linux_distro: boolean; + linux_kernel: boolean; + cpu_hashrate_score: boolean; + memory_memcpy_score: boolean; + disk_sequential_write_score: boolean; + disk_random_write_score: boolean; + cpu_vendor: boolean; +} + +export interface State { + status: 'online' | 'offline' | 'upgrade-requested'; + best: Types.BlockNumber; + finalized: Types.BlockNumber; + tab: string; + blockTimestamp: Types.Timestamp; + blockAverage: Maybe; + timeDiff: Types.Milliseconds; + subscribed: Maybe; + chains: Map; + nodes: SortedCollection; + settings: Readonly; + pins: Readonly>; + sortBy: Readonly>; + selectedColumns: Column[]; + chainStats: Maybe; +} + +export type Update = ( + changes: Pick +) => Readonly; + +export interface ChainData { + label: Types.ChainLabel; + genesisHash: Types.GenesisHash; + nodeCount: Types.NodeCount; +} diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..f6b3770 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,113 @@ +import { Types } from './common'; + +export interface Viewport { + width: number; + height: number; +} + +export function viewport(): Viewport { + const width = Math.min( + document.documentElement.clientWidth, + window.innerWidth || 0 + ); + const height = Math.min( + document.documentElement.clientHeight, + window.innerHeight || 0 + ); + + return { width, height }; +} + +export function formatNumber(num: number): string { + const input = num.toString(); + + let output = ''; + let length = input.length; + + while (length > 3) { + output = ',' + input.substr(length - 3, 3) + output; + length -= 3; + } + + output = input.substr(0, length) + output; + + return output; +} + +export function trimHash(hash: string, length: number): string { + if (hash.length < length) { + return hash; + } + + const side = ((length - 2) / 2) | 0; + + return hash.substr(0, side) + '..' + hash.substr(-side, side); +} + +export function milliOrSecond( + num: Types.Milliseconds | Types.PropagationTime +): string { + if (num < 10000) { + return `${num}ms`; + } + + return `${(num / 1000) | 0}s`; +} + +export function secondsWithPrecision(num: number): string { + const intString = (num | 0).toString(); + const intDigits = intString.length; + + switch (intDigits) { + case 1: + return num.toFixed(3) + 's'; + case 2: + return num.toFixed(2) + 's'; + case 3: + return num.toFixed(1) + 's'; + default: + return intString + 's'; + } +} + +export interface HashData { + tab?: string; + chain?: Types.GenesisHash; +} + +export function getHashData(): HashData { + const { hash } = window.location; + + if (hash[0] !== '#') { + return {}; + } + + const [tab, rawChain] = hash.substr(1).split('/'); + const chain = decodeURIComponent(rawChain) as Types.GenesisHash; + + return { tab, chain }; +} + +export function setHashData(val: HashData) { + const update = Object.assign(getHashData(), val); + + const { tab = '', chain = '' } = update; + + window.location.hash = `#${tab}/${encodeURIComponent(chain)}`; +} + +let root: null | SVGSVGElement = null; +export const W3SVG = 'http://www.w3.org/2000/svg'; + +// Get a root node where we all SVG symbols can be stored +// see: Icon.tsx +export function getSVGShadowRoot(): SVGSVGElement { + if (!root) { + root = document.createElementNS(W3SVG, 'svg'); + root.setAttribute('style', 'display: none;'); + + document.body.appendChild(root); + } + + return root; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..057f86f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "outDir": "./build/", + "module": "es2020", + "target": "es2015", + "lib": ["dom", "dom.iterable", "esnext"], + "sourceMap": true, + "allowJs": false, + "jsx": "react", + "rootDir": "src", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "noEmitOnError": false, + "pretty": true, + "forceConsistentCasingInFileNames": true, + "noErrorTruncation": true, + "noImplicitReturns": true, + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "suppressImplicitAnyIndexErrors": true, + "resolveJsonModule": true, + "noUnusedParameters": true, + "skipLibCheck": true + }, + "exclude": ["node_modules", "build"], + "include": ["src", "declarations/**/*.d.ts"] +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..f02b5fe --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,52 @@ +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const Dotenv = require('dotenv-webpack'); + +module.exports = { + entry: './src/index.tsx', + devtool: 'inline-source-map', + module: { + rules: [ + { + // Allow 'import * from "./foo.tsx"' + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/, + }, + { + // allow 'import "foo.css"' and '@import "foo.css" in css files + test: /\.css$/i, + use: ['style-loader', 'css-loader'], + generator: { filename: 'styles/[name].[contenthash][ext]' }, + }, + { + // allow 'import Icon from "./icon.png"' + test: /\.(png|svg|jpg|jpeg|gif)$/i, + type: 'asset/resource', + generator: { filename: 'images/[name].[contenthash][ext]' }, + }, + { + // allow CSS @url('./my-font.woff2')" style font loading + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/resource', + generator: { filename: 'fonts/[name].[contenthash][ext]' }, + }, + ], + }, + plugins: [ + new Dotenv(), + // Use our index.html as a starting point (to add script links etc to) + // and make sure to use/copy over the favicon too. + new HtmlWebpackPlugin({ + template: './assets/index.html', + }), + ], + resolve: { + extensions: ['.tsx', '.ts', '.js'], + }, + output: { + filename: 'main.[contenthash].js', + path: path.resolve(__dirname, 'build'), + clean: true, + }, +};