From e99d308fb46f407d2b5f48e7dc6d7df1cc4cec89 Mon Sep 17 00:00:00 2001 From: Brien Colwell Date: Sun, 21 Sep 2025 22:49:16 -0500 Subject: [PATCH] update nginx to be host network aware --- app.old/.eslintrc.json | 3 - app.old/.gitignore | 36 - app.old/.npmrc | 1 - app.old/Dockerfile | 41 - app.old/Makefile | 29 - app.old/README.md | 55 - app.old/index.html | 9 - app.old/next.config.js | 7 - app.old/nginx/nginx.conf.j2 | 74 - app.old/package-lock.json | 4683 ----------------- app.old/package.json | 38 - app.old/postcss.config.js | 6 - app.old/public/account_icon.svg | 13 - app.old/public/bringyour-logo.webp | Bin 29508 -> 0 bytes app.old/public/bringyour_logo_full.png | Bin 41990 -> 0 bytes app.old/public/devices_icon.svg | 22 - app.old/public/provide_icon.svg | 11 - .../app/(pages)/account/add-balance/page.tsx | 171 - app.old/src/app/(pages)/account/loading.tsx | 10 - app.old/src/app/(pages)/account/page.tsx | 62 - .../src/app/(pages)/components/Sidebar.tsx | 284 - .../(pages)/devices/add/components/Poll.tsx | 87 - app.old/src/app/(pages)/devices/add/page.tsx | 120 - .../devices/components/DeviceDetail.tsx | 325 -- .../(pages)/devices/components/DeviceList.tsx | 254 - .../(pages)/devices/components/PollShare.tsx | 158 - .../devices/components/ShareDeviceDialog.tsx | 90 - app.old/src/app/(pages)/devices/loading.tsx | 10 - app.old/src/app/(pages)/devices/page.tsx | 19 - app.old/src/app/(pages)/ffdevices/loading.tsx | 10 - app.old/src/app/(pages)/ffdevices/page.tsx | 77 - app.old/src/app/(pages)/layout.tsx | 16 - .../provide/components/ActivityWidget.tsx | 83 - .../app/(pages)/provide/components/Chart.tsx | 174 - .../components/DeviceDetailSidebar.tsx | 245 - .../provide/components/DevicesTable.tsx | 232 - .../provide/components/UptimeWidget.tsx | 153 - app.old/src/app/(pages)/provide/loading.tsx | 21 - app.old/src/app/(pages)/provide/page.tsx | 191 - app.old/src/app/_lib/api.ts | 241 - .../src/app/_lib/components/Breadcrumbs.tsx | 26 - app.old/src/app/_lib/components/Button.tsx | 62 - .../_lib/components/ConfirmDeleteModal.tsx | 77 - .../app/_lib/components/LoadingSpinner.tsx | 61 - app.old/src/app/_lib/types.ts | 209 - app.old/src/app/_lib/utils.ts | 75 - app.old/src/app/apple-icon.png | Bin 11371 -> 0 bytes app.old/src/app/error.tsx | 32 - app.old/src/app/favicon.png | Bin 15162 -> 0 bytes app.old/src/app/favicon.svg | 13 - app.old/src/app/global-error.tsx | 19 - app.old/src/app/globals.css | 49 - app.old/src/app/icon1.svg | 13 - app.old/src/app/icon2.png | Bin 15162 -> 0 bytes app.old/src/app/icon3.png | Bin 13911 -> 0 bytes app.old/src/app/icon4.png | Bin 9731 -> 0 bytes app.old/src/app/icon5.png | Bin 1970 -> 0 bytes app.old/src/app/layout.tsx | 71 - app.old/src/app/page.tsx | 7 - app.old/tailwind.config.ts | 38 - app.old/tsconfig.json | 44 - app/Dockerfile | 5 +- app/Makefile | 11 +- app/go.mod | 7 + app/main.go | 22 + legal/Makefile | 6 - nginx/gen.py | 9 - nginx/mime.types | 100 - Dockerfile => web/Dockerfile | 7 +- Makefile => web/Makefile | 25 +- .../.well-known/assetlinks.json | 0 .../bringyour.com}/.well-known/pgp-key.txt | 0 .../bringyour.com}/.well-known/privacy.txt | 0 .../bringyour.com}/.well-known/security.txt | 0 .../bringyour.com}/apple-touch-icon.png | Bin .../bringyour.com}/blog/index.html.j2 | 0 .../bringyour.com}/blog/visual/index.html.j2 | 0 .../blog/visual/vis/client2vis/client2vis.js | 0 .../visual/vis/client2vis/export-high.json | 0 .../visual/vis/client2vis/export-low.json | 0 .../visual/vis/client2vis/export-med.json | 0 .../visual/vis/client2vis/index-high.html | 0 .../blog/visual/vis/client2vis/index-low.html | 0 .../blog/visual/vis/client2vis/index-med.html | 0 .../blog/visual/vis/client2vis/index.html | 0 .../visual/vis/client2vis/libraries/p5.min.js | 0 .../visual/vis/client2vis/sketch.properties | 0 .../blog/visual/vis/latencymap/index.html | 0 .../blog/visual/vis/latencymap/latencymap.js | 0 .../visual/vis/latencymap/libraries/p5.min.js | 0 .../visual/vis/latencymap/sketch.properties | 0 .../blog/visual/vis/linpath/index.html | 0 .../visual/vis/linpath/libraries/p5.min.js | 0 .../blog/visual/vis/linpath/linpath.js | 0 .../blog/visual/vis/linpath/sketch.properties | 0 .../bringyour.com}/blog/visual/visual.md | 0 .../bringyour.com}/client.js | 0 .../bringyour.com}/connect.js | 0 .../bringyour.com}/connect_mock.js | 0 .../bringyour.com}/favicon-128.png | Bin .../bringyour.com}/favicon-180.png | Bin .../bringyour.com}/favicon-32.png | Bin .../bringyour.com}/favicon.png | Bin .../bringyour.com}/favicon.svg | 0 {bringyour.com => web/bringyour.com}/flag.js | 0 .../bringyour.com}/footer.js | 0 {bringyour.com => web/bringyour.com}/gen.py | 0 .../bringyour.com}/index.html.j2 | 0 .../lib-ur/bootstrap.bundle.min.js | 0 .../bringyour.com}/lib-ur/c.js | 0 .../bringyour.com}/lib-ur/connect-button.js | 0 .../bringyour.com}/lib-ur/connect.js | 0 .../lib/bootstrap.bundle.min.js | 0 .../bringyour.com}/lib/d3.min.js | 0 .../bringyour.com}/lib/jquery.min.js | 0 .../bringyour.com}/lib/p5.min.js | 0 .../bringyour.com}/lib/widgetbot.min.js | 0 {bringyour.com => web/bringyour.com}/logo.js | 0 .../bringyour.com}/manifest.json | 0 .../res-ur/images/icon-192x192.png | Bin .../bringyour.com}/res-ur/images/icon.png | Bin .../bringyour.com}/res-ur/images/icon.svg | 0 .../res-ur/videos/solana_urnetwork_final.mp4 | 0 .../videos/solana_urnetwork_web_comp1.mp4 | 0 .../res/css-ur/bootstrap.min.css | 0 .../bringyour.com}/res/css-ur/connect.css | 0 .../bringyour.com}/res/css/bootstrap.min.css | 0 .../bringyour.com}/res/css/connect.css | 0 .../bringyour.com}/res/css/main.css | 0 .../bringyour.com}/res/css/stats.css | 0 .../res/emails/bringyour-wordmark-bg-240.jpg | Bin .../res/emails/ur-welcome-header-1080.jpg | Bin .../res/emails/ur-welcome-header.png | Bin .../res/emails/ur-wordmark-bg-240.jpg | Bin .../res/emails/ur-wordmark-black.svg | 0 .../res/emails/ur-wordmark-white.svg | 0 .../res/emails/urnetwork-bars.gif | Bin .../res/emails/urnetwork-goodbye-vpn.gif | Bin .../res/emails/urnetwork-notavpn.gif | Bin .../res/emails/urnetwork-spin.gif | Bin .../res/emails/welcome-header-1080.jpg | Bin .../res/emails/welcome-header-1080.webp | Bin .../res/fonts/Arkitech-Light.ttf | Bin .../res/fonts/Arkitech-Light.woff | Bin .../res/fonts/Arkitech-Light.woff2 | Bin .../res/fonts/Arkitech-Medium.ttf | Bin .../res/fonts/Arkitech-Medium.woff | Bin .../res/fonts/Arkitech-Medium.woff2 | Bin .../res/fonts/Barlow-Light.woff2 | Bin .../res/fonts/Barlow-Medium.woff2 | Bin .../res/fonts/Barlow-Regular.woff2 | Bin .../res/fonts/Barlow-Thin.woff2 | Bin .../res/fonts/Gravity/ABCGravity-Extended.otf | Bin .../fonts/Gravity/ABCGravity-Extended.woff | Bin .../fonts/Gravity/ABCGravity-Extended.woff2 | Bin .../Gravity/ABCGravity-ExtraCondensed.otf | Bin .../Gravity/ABCGravity-ExtraCondensed.woff | Bin .../Gravity/ABCGravity-ExtraCondensed.woff2 | Bin .../fonts/Material-Symbols-Outlined-400.woff2 | Bin .../res/fonts/Noto-Sans-Latin-100.woff2 | Bin .../res/fonts/Noto-Sans-Latin-200.woff2 | Bin .../res/fonts/Noto-Sans-Latin-300.woff2 | Bin .../res/fonts/Noto-Sans-Latin-400.woff2 | Bin .../res/fonts/Noto-Sans-Latin-500.woff2 | Bin .../res/fonts/Noto-Sans-Latin-600.woff2 | Bin .../res/fonts/Noto-Sans-Latin-700.woff2 | Bin .../res/fonts/Noto-Sans-Latin-800.woff2 | Bin .../res/fonts/Noto-Sans-LatinExt-100.woff2 | Bin .../res/fonts/Noto-Sans-LatinExt-200.woff2 | Bin .../res/fonts/Noto-Sans-LatinExt-300.woff2 | Bin .../res/fonts/Noto-Sans-LatinExt-400.woff2 | Bin .../res/fonts/Noto-Sans-LatinExt-500.woff2 | Bin .../res/fonts/Noto-Sans-LatinExt-600.woff2 | Bin .../res/fonts/Noto-Sans-LatinExt-700.woff2 | Bin .../res/fonts/Noto-Sans-LatinExt-800.woff2 | Bin .../res/fonts/PPNeueBit/PPNeueBit-Bold.eot | Bin .../res/fonts/PPNeueBit/PPNeueBit-Bold.otf | Bin .../res/fonts/PPNeueBit/PPNeueBit-Bold.ttf | Bin .../res/fonts/PPNeueBit/PPNeueBit-Bold.woff | Bin .../res/fonts/PPNeueBit/PPNeueBit-Bold.woff2 | Bin .../res/fonts/PPNeueBit/PPNeueBit-Regular.eot | Bin .../res/fonts/PPNeueBit/PPNeueBit-Regular.otf | Bin .../res/fonts/PPNeueBit/PPNeueBit-Regular.ttf | Bin .../fonts/PPNeueBit/PPNeueBit-Regular.woff | Bin .../fonts/PPNeueBit/PPNeueBit-Regular.woff2 | Bin .../res/fonts/PPNeueMontreal/Icon\r" | 0 .../PPNeueMontreal/PPNeueMontreal-Bold.otf | Bin .../PPNeueMontreal/PPNeueMontreal-Bold.ttf | Bin .../PPNeueMontreal/PPNeueMontreal-Bold.woff | Bin .../PPNeueMontreal/PPNeueMontreal-Bold.woff2 | Bin .../PPNeueMontreal/PPNeueMontreal-Regular.otf | Bin .../PPNeueMontreal/PPNeueMontreal-Regular.ttf | Bin .../PPNeueMontreal-Regular.woff | Bin .../PPNeueMontreal-Regular.woff2 | Bin .../res/fonts/Pacifico-Latin-400.woff2 | Bin .../res/fonts/Pacifico-LatinExt-400.woff2 | Bin .../bringyour.com}/res/fonts/arkitech.css | 0 .../bringyour.com}/res/fonts/barlow.css | 0 .../bringyour.com}/res/fonts/gravity.css | 0 .../res/fonts/material-symbols-outlined.css | 0 .../bringyour.com}/res/fonts/noto-sans.css | 0 .../bringyour.com}/res/fonts/pacifico.css | 0 .../bringyour.com}/res/fonts/pp-neue-bit.css | 0 .../res/fonts/pp-neue-montreal.css | 0 .../bringyour.com}/res/images/1TiB.png | Bin .../bringyour.com}/res/images/2TiB.png | Bin .../bringyour.com}/res/images/300GiB.png | Bin .../res/images/Company100TiB.png | Bin .../res/images/Company10TiB.png | Bin .../images/URnetwork-logo-black-400-80.svg | 0 .../bringyour.com}/res/images/arrow-back.svg | 0 .../bringyour.com}/res/images/bg-0.png | Bin .../bringyour.com}/res/images/bg-1.png | Bin .../bringyour.com}/res/images/bg-2.png | Bin .../res/images/bringyour-wordmark-260.svg | 0 .../res/images/bringyour-wordmark-340-80.svg | 0 .../res/images/bringyour-wordmark-sq-260.png | Bin .../res/images/bringyour-wordmark-white.png | Bin .../res/images/bringyour-wordmark.png | Bin .../bringyour.com}/res/images/by.svg | 0 .../bringyour.com}/res/images/cat6-wc.jpg | Bin .../bringyour.com}/res/images/cat6.afphoto | Bin .../bringyour.com}/res/images/cat6.jpg | Bin .../bringyour.com}/res/images/favicon.svg | 0 .../bringyour.com}/res/images/ff-extended.svg | 0 .../res/images/ip-connected.svg | 0 .../res/images/ip-disconnected.svg | 0 .../res/images/ip-inevaluation.svg | 0 .../bringyour.com}/res/images/ip-pulse.svg | 0 .../bringyour.com}/res/images/lagdev.svg | 0 .../res/images/logo-placeholder.png | Bin .../res/images/pack-2-alpha.png | Bin .../res/images/pack-2-alpha.webp | Bin .../bringyour.com}/res/images/pack-2.png | Bin .../bringyour.com}/res/images/pack-2.webp | Bin .../bringyour.com}/res/images/pack.jpg | Bin .../bringyour.com}/res/images/pack.png | Bin .../res/images/provided-extended.svg | 0 .../bringyour.com}/res/images/provided.svg | 0 .../bringyour.com}/res/images/reviews-g2.png | Bin .../bringyour.com}/res/images/s-discord.png | Bin .../bringyour.com}/res/images/s-github.png | Bin .../bringyour.com}/res/images/s-linkedin.png | Bin .../bringyour.com}/res/images/s-twitter.png | Bin .../bringyour.com}/res/images/s-youtube.png | Bin .../bringyour.com}/res/images/s2-discord.svg | 0 .../bringyour.com}/res/images/s2-github.svg | 0 .../bringyour.com}/res/images/s2-linkedin.svg | 0 .../bringyour.com}/res/images/s2-reddit.svg | 0 .../bringyour.com}/res/images/s2-youtube.svg | 0 .../res/images/share-private-2-alpha.png | Bin .../res/images/share-private-2-alpha.webp | Bin .../res/images/share-private-2.png | Bin .../res/images/share-private-2.webp | Bin .../res/images/share-private.jpg | Bin .../res/images/share-private.png | Bin .../res/images/share-public-2-alpha.png | Bin .../res/images/share-public-2-alpha.webp | Bin .../res/images/share-public-2.png | Bin .../res/images/share-public-2.webp | Bin .../res/images/share-public.jpg | Bin .../res/images/share-public.png | Bin .../res/images/signup-redeem.svg | 0 .../res/images/store-app-dark.png | Bin .../res/images/store-app-dark.svg | 0 .../bringyour.com}/res/images/store-app.svg | 0 .../bringyour.com}/res/images/store-ms.svg | 0 .../bringyour.com}/res/images/store-play.png | Bin .../bringyour.com}/res/images/superfast.svg | 0 .../bringyour.com}/res/images/ur-sq.webp | Bin .../bringyour.com}/res/images/ur.svg | 0 .../res/images/use-cases-2-alpha.png | Bin .../res/images/use-cases-2-alpha.webp | Bin .../bringyour.com}/res/images/use-cases-2.png | Bin .../res/images/use-cases-2.webp | Bin .../bringyour.com}/res/images/use-cases.jpg | Bin .../bringyour.com}/res/images/use-cases.png | Bin .../bringyour.com}/res/images/world-sq.png | Bin .../bringyour.com}/res/images/world.png | Bin .../bringyour.com}/res/images/world2.png | Bin .../bringyour.com}/res/images/world3.png | Bin .../bringyour.com}/robots.txt | 0 .../bringyour.com}/sitemap.txt | 0 .../bringyour.com}/sketch_220813c.js | 0 .../bringyour.com}/sketch_220824a.js | 0 {bringyour.com => web/bringyour.com}/stats.js | 0 .../bringyour.com}/stats_mock.js | 0 .../bringyour.com}/window.js | 0 .../components}/whereami/.gitignore | 0 .../components}/whereami/index/.gitignore | 0 .../components}/whereami/index/index.templ | 0 .../components}/whereami/index/index_templ.go | 0 .../components}/whereami/index/transform.go | 0 .../whereami/my-ip-info/.gitignore | 0 .../components}/whereami/my-ip-info/README.md | 0 .../whereami/my-ip-info/generate.go | 0 .../whereami/my-ip-info/package-lock.json | 0 .../whereami/my-ip-info/package.json | 0 .../whereami/my-ip-info/postcss.config.js | 0 .../whereami/my-ip-info/src/App.css | 0 .../whereami/my-ip-info/src/App.jsx | 0 .../my-ip-info/src/GridComparison.jsx | 0 .../whereami/my-ip-info/src/SingleVersion.jsx | 0 .../my-ip-info/src/assets/crossed-cloud.svg | 0 .../whereami/my-ip-info/src/assets/solid.svg | 0 .../my-ip-info/src/assets/thumbsup.svg | 0 .../my-ip-info/src/assets/warning.svg | 0 .../src/components/NotSupported.jsx | 0 .../my-ip-info/src/components/Privacy.jsx | 0 .../src/components/PrivacySingle.jsx | 0 .../src/components/landmarks-single/index.jsx | 0 .../landmarks-single/measure-rtts.js | 0 .../src/components/landmarks/index.jsx | 0 .../src/components/landmarks/measure-rtts.js | 0 .../src/components/spinner/index.jsx | 0 .../my-ip-info/src/globe/GlobeComponent.jsx | 0 .../src/globe/data/world-110m.v1.json | 0 .../whereami/my-ip-info/src/index.css | 0 .../whereami/my-ip-info/tailwind.config.js | 0 .../whereami/my-ip-info/vite.config.js | 0 .../whereami/my-ip-widget/.gitignore | 0 .../whereami/my-ip-widget/README.md | 0 .../whereami/my-ip-widget/generate.go | 0 .../whereami/my-ip-widget/package-lock.json | 0 .../whereami/my-ip-widget/package.json | 0 .../whereami/my-ip-widget/postcss.config.js | 0 .../whereami/my-ip-widget/src/Widget.css | 0 .../whereami/my-ip-widget/src/Widget.jsx | 0 .../my-ip-widget/src/components/dot/index.jsx | 0 .../src/components/spinner/index.jsx | 0 .../whereami/my-ip-widget/src/index.css | 0 .../whereami/my-ip-widget/tailwind.config.js | 0 .../whereami/my-ip-widget/vite.config.js | 0 .../whereami/static/connect-bundle-2.js | 0 web/go.mod | 7 + web/main.go | 22 + {nginx-local => web/nginx-local}/gen.py | 0 {app.old/nginx => web/nginx-local}/mime.types | 0 .../nginx-local}/nginx.conf.j2 | 0 {app.old => web}/nginx/gen.py | 0 {nginx-local => web/nginx}/mime.types | 0 {nginx => web/nginx}/nginx.conf.j2 | 0 .../ur.io}/.well-known/assetlinks.json | 0 .../ur.io}/.well-known/manifest.json | 0 {ur.io => web/ur.io}/.well-known/pgp-key.txt | 0 {ur.io => web/ur.io}/.well-known/privacy.txt | 0 {ur.io => web/ur.io}/.well-known/security.txt | 0 347 files changed, 91 insertions(+), 8987 deletions(-) delete mode 100644 app.old/.eslintrc.json delete mode 100644 app.old/.gitignore delete mode 100644 app.old/.npmrc delete mode 100644 app.old/Dockerfile delete mode 100644 app.old/Makefile delete mode 100644 app.old/README.md delete mode 100644 app.old/index.html delete mode 100644 app.old/next.config.js delete mode 100644 app.old/nginx/nginx.conf.j2 delete mode 100644 app.old/package-lock.json delete mode 100644 app.old/package.json delete mode 100644 app.old/postcss.config.js delete mode 100644 app.old/public/account_icon.svg delete mode 100644 app.old/public/bringyour-logo.webp delete mode 100644 app.old/public/bringyour_logo_full.png delete mode 100644 app.old/public/devices_icon.svg delete mode 100644 app.old/public/provide_icon.svg delete mode 100644 app.old/src/app/(pages)/account/add-balance/page.tsx delete mode 100644 app.old/src/app/(pages)/account/loading.tsx delete mode 100644 app.old/src/app/(pages)/account/page.tsx delete mode 100644 app.old/src/app/(pages)/components/Sidebar.tsx delete mode 100644 app.old/src/app/(pages)/devices/add/components/Poll.tsx delete mode 100644 app.old/src/app/(pages)/devices/add/page.tsx delete mode 100644 app.old/src/app/(pages)/devices/components/DeviceDetail.tsx delete mode 100644 app.old/src/app/(pages)/devices/components/DeviceList.tsx delete mode 100644 app.old/src/app/(pages)/devices/components/PollShare.tsx delete mode 100644 app.old/src/app/(pages)/devices/components/ShareDeviceDialog.tsx delete mode 100644 app.old/src/app/(pages)/devices/loading.tsx delete mode 100644 app.old/src/app/(pages)/devices/page.tsx delete mode 100644 app.old/src/app/(pages)/ffdevices/loading.tsx delete mode 100644 app.old/src/app/(pages)/ffdevices/page.tsx delete mode 100644 app.old/src/app/(pages)/layout.tsx delete mode 100644 app.old/src/app/(pages)/provide/components/ActivityWidget.tsx delete mode 100644 app.old/src/app/(pages)/provide/components/Chart.tsx delete mode 100644 app.old/src/app/(pages)/provide/components/DeviceDetailSidebar.tsx delete mode 100644 app.old/src/app/(pages)/provide/components/DevicesTable.tsx delete mode 100644 app.old/src/app/(pages)/provide/components/UptimeWidget.tsx delete mode 100644 app.old/src/app/(pages)/provide/loading.tsx delete mode 100644 app.old/src/app/(pages)/provide/page.tsx delete mode 100644 app.old/src/app/_lib/api.ts delete mode 100644 app.old/src/app/_lib/components/Breadcrumbs.tsx delete mode 100644 app.old/src/app/_lib/components/Button.tsx delete mode 100644 app.old/src/app/_lib/components/ConfirmDeleteModal.tsx delete mode 100644 app.old/src/app/_lib/components/LoadingSpinner.tsx delete mode 100644 app.old/src/app/_lib/types.ts delete mode 100644 app.old/src/app/_lib/utils.ts delete mode 100644 app.old/src/app/apple-icon.png delete mode 100644 app.old/src/app/error.tsx delete mode 100644 app.old/src/app/favicon.png delete mode 100644 app.old/src/app/favicon.svg delete mode 100644 app.old/src/app/global-error.tsx delete mode 100644 app.old/src/app/globals.css delete mode 100644 app.old/src/app/icon1.svg delete mode 100644 app.old/src/app/icon2.png delete mode 100644 app.old/src/app/icon3.png delete mode 100644 app.old/src/app/icon4.png delete mode 100644 app.old/src/app/icon5.png delete mode 100644 app.old/src/app/layout.tsx delete mode 100644 app.old/src/app/page.tsx delete mode 100644 app.old/tailwind.config.ts delete mode 100644 app.old/tsconfig.json create mode 100644 app/go.mod create mode 100644 app/main.go delete mode 100644 legal/Makefile delete mode 100644 nginx/gen.py delete mode 100644 nginx/mime.types rename Dockerfile => web/Dockerfile (89%) rename Makefile => web/Makefile (74%) rename {bringyour.com => web/bringyour.com}/.well-known/assetlinks.json (100%) rename {bringyour.com => web/bringyour.com}/.well-known/pgp-key.txt (100%) rename {bringyour.com => web/bringyour.com}/.well-known/privacy.txt (100%) rename {bringyour.com => web/bringyour.com}/.well-known/security.txt (100%) rename {bringyour.com => web/bringyour.com}/apple-touch-icon.png (100%) rename {bringyour.com => web/bringyour.com}/blog/index.html.j2 (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/index.html.j2 (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/client2vis/client2vis.js (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/client2vis/export-high.json (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/client2vis/export-low.json (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/client2vis/export-med.json (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/client2vis/index-high.html (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/client2vis/index-low.html (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/client2vis/index-med.html (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/client2vis/index.html (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/client2vis/libraries/p5.min.js (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/client2vis/sketch.properties (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/latencymap/index.html (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/latencymap/latencymap.js (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/latencymap/libraries/p5.min.js (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/latencymap/sketch.properties (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/linpath/index.html (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/linpath/libraries/p5.min.js (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/linpath/linpath.js (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/vis/linpath/sketch.properties (100%) rename {bringyour.com => web/bringyour.com}/blog/visual/visual.md (100%) rename {bringyour.com => web/bringyour.com}/client.js (100%) rename {bringyour.com => web/bringyour.com}/connect.js (100%) rename {bringyour.com => web/bringyour.com}/connect_mock.js (100%) rename {bringyour.com => web/bringyour.com}/favicon-128.png (100%) rename {bringyour.com => web/bringyour.com}/favicon-180.png (100%) rename {bringyour.com => web/bringyour.com}/favicon-32.png (100%) rename {bringyour.com => web/bringyour.com}/favicon.png (100%) rename {bringyour.com => web/bringyour.com}/favicon.svg (100%) rename {bringyour.com => web/bringyour.com}/flag.js (100%) rename {bringyour.com => web/bringyour.com}/footer.js (100%) rename {bringyour.com => web/bringyour.com}/gen.py (100%) rename {bringyour.com => web/bringyour.com}/index.html.j2 (100%) rename {bringyour.com => web/bringyour.com}/lib-ur/bootstrap.bundle.min.js (100%) rename {bringyour.com => web/bringyour.com}/lib-ur/c.js (100%) rename {bringyour.com => web/bringyour.com}/lib-ur/connect-button.js (100%) rename {bringyour.com => web/bringyour.com}/lib-ur/connect.js (100%) rename {bringyour.com => web/bringyour.com}/lib/bootstrap.bundle.min.js (100%) rename {bringyour.com => web/bringyour.com}/lib/d3.min.js (100%) rename {bringyour.com => web/bringyour.com}/lib/jquery.min.js (100%) rename {bringyour.com => web/bringyour.com}/lib/p5.min.js (100%) rename {bringyour.com => web/bringyour.com}/lib/widgetbot.min.js (100%) rename {bringyour.com => web/bringyour.com}/logo.js (100%) rename {bringyour.com => web/bringyour.com}/manifest.json (100%) rename {bringyour.com => web/bringyour.com}/res-ur/images/icon-192x192.png (100%) rename {bringyour.com => web/bringyour.com}/res-ur/images/icon.png (100%) rename {bringyour.com => web/bringyour.com}/res-ur/images/icon.svg (100%) rename {bringyour.com => web/bringyour.com}/res-ur/videos/solana_urnetwork_final.mp4 (100%) rename {bringyour.com => web/bringyour.com}/res-ur/videos/solana_urnetwork_web_comp1.mp4 (100%) rename {bringyour.com => web/bringyour.com}/res/css-ur/bootstrap.min.css (100%) rename {bringyour.com => web/bringyour.com}/res/css-ur/connect.css (100%) rename {bringyour.com => web/bringyour.com}/res/css/bootstrap.min.css (100%) rename {bringyour.com => web/bringyour.com}/res/css/connect.css (100%) rename {bringyour.com => web/bringyour.com}/res/css/main.css (100%) rename {bringyour.com => web/bringyour.com}/res/css/stats.css (100%) rename {bringyour.com => web/bringyour.com}/res/emails/bringyour-wordmark-bg-240.jpg (100%) rename {bringyour.com => web/bringyour.com}/res/emails/ur-welcome-header-1080.jpg (100%) rename {bringyour.com => web/bringyour.com}/res/emails/ur-welcome-header.png (100%) rename {bringyour.com => web/bringyour.com}/res/emails/ur-wordmark-bg-240.jpg (100%) rename {bringyour.com => web/bringyour.com}/res/emails/ur-wordmark-black.svg (100%) rename {bringyour.com => web/bringyour.com}/res/emails/ur-wordmark-white.svg (100%) rename {bringyour.com => web/bringyour.com}/res/emails/urnetwork-bars.gif (100%) rename {bringyour.com => web/bringyour.com}/res/emails/urnetwork-goodbye-vpn.gif (100%) rename {bringyour.com => web/bringyour.com}/res/emails/urnetwork-notavpn.gif (100%) rename {bringyour.com => web/bringyour.com}/res/emails/urnetwork-spin.gif (100%) rename {bringyour.com => web/bringyour.com}/res/emails/welcome-header-1080.jpg (100%) rename {bringyour.com => web/bringyour.com}/res/emails/welcome-header-1080.webp (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Arkitech-Light.ttf (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Arkitech-Light.woff (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Arkitech-Light.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Arkitech-Medium.ttf (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Arkitech-Medium.woff (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Arkitech-Medium.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Barlow-Light.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Barlow-Medium.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Barlow-Regular.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Barlow-Thin.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Gravity/ABCGravity-Extended.otf (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Gravity/ABCGravity-Extended.woff (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Gravity/ABCGravity-Extended.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Gravity/ABCGravity-ExtraCondensed.otf (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Material-Symbols-Outlined-400.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-Latin-100.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-Latin-200.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-Latin-300.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-Latin-400.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-Latin-500.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-Latin-600.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-Latin-700.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-Latin-800.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-LatinExt-100.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-LatinExt-200.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-LatinExt-300.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-LatinExt-400.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-LatinExt-500.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-LatinExt-600.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-LatinExt-700.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Noto-Sans-LatinExt-800.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueBit/PPNeueBit-Bold.eot (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueBit/PPNeueBit-Bold.otf (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueBit/PPNeueBit-Bold.ttf (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueBit/PPNeueBit-Bold.woff (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueBit/PPNeueBit-Bold.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueBit/PPNeueBit-Regular.eot (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueBit/PPNeueBit-Regular.otf (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueBit/PPNeueBit-Regular.ttf (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueBit/PPNeueBit-Regular.woff (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueBit/PPNeueBit-Regular.woff2 (100%) rename "bringyour.com/res/fonts/PPNeueMontreal/Icon\r" => "web/bringyour.com/res/fonts/PPNeueMontreal/Icon\r" (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.otf (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.ttf (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.otf (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.ttf (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Pacifico-Latin-400.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/Pacifico-LatinExt-400.woff2 (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/arkitech.css (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/barlow.css (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/gravity.css (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/material-symbols-outlined.css (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/noto-sans.css (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/pacifico.css (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/pp-neue-bit.css (100%) rename {bringyour.com => web/bringyour.com}/res/fonts/pp-neue-montreal.css (100%) rename {bringyour.com => web/bringyour.com}/res/images/1TiB.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/2TiB.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/300GiB.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/Company100TiB.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/Company10TiB.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/URnetwork-logo-black-400-80.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/arrow-back.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/bg-0.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/bg-1.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/bg-2.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/bringyour-wordmark-260.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/bringyour-wordmark-340-80.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/bringyour-wordmark-sq-260.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/bringyour-wordmark-white.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/bringyour-wordmark.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/by.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/cat6-wc.jpg (100%) rename {bringyour.com => web/bringyour.com}/res/images/cat6.afphoto (100%) rename {bringyour.com => web/bringyour.com}/res/images/cat6.jpg (100%) rename {bringyour.com => web/bringyour.com}/res/images/favicon.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/ff-extended.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/ip-connected.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/ip-disconnected.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/ip-inevaluation.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/ip-pulse.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/lagdev.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/logo-placeholder.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/pack-2-alpha.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/pack-2-alpha.webp (100%) rename {bringyour.com => web/bringyour.com}/res/images/pack-2.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/pack-2.webp (100%) rename {bringyour.com => web/bringyour.com}/res/images/pack.jpg (100%) rename {bringyour.com => web/bringyour.com}/res/images/pack.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/provided-extended.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/provided.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/reviews-g2.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/s-discord.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/s-github.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/s-linkedin.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/s-twitter.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/s-youtube.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/s2-discord.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/s2-github.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/s2-linkedin.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/s2-reddit.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/s2-youtube.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/share-private-2-alpha.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/share-private-2-alpha.webp (100%) rename {bringyour.com => web/bringyour.com}/res/images/share-private-2.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/share-private-2.webp (100%) rename {bringyour.com => web/bringyour.com}/res/images/share-private.jpg (100%) rename {bringyour.com => web/bringyour.com}/res/images/share-private.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/share-public-2-alpha.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/share-public-2-alpha.webp (100%) rename {bringyour.com => web/bringyour.com}/res/images/share-public-2.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/share-public-2.webp (100%) rename {bringyour.com => web/bringyour.com}/res/images/share-public.jpg (100%) rename {bringyour.com => web/bringyour.com}/res/images/share-public.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/signup-redeem.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/store-app-dark.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/store-app-dark.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/store-app.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/store-ms.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/store-play.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/superfast.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/ur-sq.webp (100%) rename {bringyour.com => web/bringyour.com}/res/images/ur.svg (100%) rename {bringyour.com => web/bringyour.com}/res/images/use-cases-2-alpha.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/use-cases-2-alpha.webp (100%) rename {bringyour.com => web/bringyour.com}/res/images/use-cases-2.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/use-cases-2.webp (100%) rename {bringyour.com => web/bringyour.com}/res/images/use-cases.jpg (100%) rename {bringyour.com => web/bringyour.com}/res/images/use-cases.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/world-sq.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/world.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/world2.png (100%) rename {bringyour.com => web/bringyour.com}/res/images/world3.png (100%) rename {bringyour.com => web/bringyour.com}/robots.txt (100%) rename {bringyour.com => web/bringyour.com}/sitemap.txt (100%) rename {bringyour.com => web/bringyour.com}/sketch_220813c.js (100%) rename {bringyour.com => web/bringyour.com}/sketch_220824a.js (100%) rename {bringyour.com => web/bringyour.com}/stats.js (100%) rename {bringyour.com => web/bringyour.com}/stats_mock.js (100%) rename {bringyour.com => web/bringyour.com}/window.js (100%) rename {components => web/components}/whereami/.gitignore (100%) rename {components => web/components}/whereami/index/.gitignore (100%) rename {components => web/components}/whereami/index/index.templ (100%) rename {components => web/components}/whereami/index/index_templ.go (100%) rename {components => web/components}/whereami/index/transform.go (100%) rename {components => web/components}/whereami/my-ip-info/.gitignore (100%) rename {components => web/components}/whereami/my-ip-info/README.md (100%) rename {components => web/components}/whereami/my-ip-info/generate.go (100%) rename {components => web/components}/whereami/my-ip-info/package-lock.json (100%) rename {components => web/components}/whereami/my-ip-info/package.json (100%) rename {components => web/components}/whereami/my-ip-info/postcss.config.js (100%) rename {components => web/components}/whereami/my-ip-info/src/App.css (100%) rename {components => web/components}/whereami/my-ip-info/src/App.jsx (100%) rename {components => web/components}/whereami/my-ip-info/src/GridComparison.jsx (100%) rename {components => web/components}/whereami/my-ip-info/src/SingleVersion.jsx (100%) rename {components => web/components}/whereami/my-ip-info/src/assets/crossed-cloud.svg (100%) rename {components => web/components}/whereami/my-ip-info/src/assets/solid.svg (100%) rename {components => web/components}/whereami/my-ip-info/src/assets/thumbsup.svg (100%) rename {components => web/components}/whereami/my-ip-info/src/assets/warning.svg (100%) rename {components => web/components}/whereami/my-ip-info/src/components/NotSupported.jsx (100%) rename {components => web/components}/whereami/my-ip-info/src/components/Privacy.jsx (100%) rename {components => web/components}/whereami/my-ip-info/src/components/PrivacySingle.jsx (100%) rename {components => web/components}/whereami/my-ip-info/src/components/landmarks-single/index.jsx (100%) rename {components => web/components}/whereami/my-ip-info/src/components/landmarks-single/measure-rtts.js (100%) rename {components => web/components}/whereami/my-ip-info/src/components/landmarks/index.jsx (100%) rename {components => web/components}/whereami/my-ip-info/src/components/landmarks/measure-rtts.js (100%) rename {components => web/components}/whereami/my-ip-info/src/components/spinner/index.jsx (100%) rename {components => web/components}/whereami/my-ip-info/src/globe/GlobeComponent.jsx (100%) rename {components => web/components}/whereami/my-ip-info/src/globe/data/world-110m.v1.json (100%) rename {components => web/components}/whereami/my-ip-info/src/index.css (100%) rename {components => web/components}/whereami/my-ip-info/tailwind.config.js (100%) rename {components => web/components}/whereami/my-ip-info/vite.config.js (100%) rename {components => web/components}/whereami/my-ip-widget/.gitignore (100%) rename {components => web/components}/whereami/my-ip-widget/README.md (100%) rename {components => web/components}/whereami/my-ip-widget/generate.go (100%) rename {components => web/components}/whereami/my-ip-widget/package-lock.json (100%) rename {components => web/components}/whereami/my-ip-widget/package.json (100%) rename {components => web/components}/whereami/my-ip-widget/postcss.config.js (100%) rename {components => web/components}/whereami/my-ip-widget/src/Widget.css (100%) rename {components => web/components}/whereami/my-ip-widget/src/Widget.jsx (100%) rename {components => web/components}/whereami/my-ip-widget/src/components/dot/index.jsx (100%) rename {components => web/components}/whereami/my-ip-widget/src/components/spinner/index.jsx (100%) rename {components => web/components}/whereami/my-ip-widget/src/index.css (100%) rename {components => web/components}/whereami/my-ip-widget/tailwind.config.js (100%) rename {components => web/components}/whereami/my-ip-widget/vite.config.js (100%) rename {components => web/components}/whereami/static/connect-bundle-2.js (100%) create mode 100644 web/go.mod create mode 100644 web/main.go rename {nginx-local => web/nginx-local}/gen.py (100%) rename {app.old/nginx => web/nginx-local}/mime.types (100%) rename {nginx-local => web/nginx-local}/nginx.conf.j2 (100%) rename {app.old => web}/nginx/gen.py (100%) rename {nginx-local => web/nginx}/mime.types (100%) rename {nginx => web/nginx}/nginx.conf.j2 (100%) rename {ur.io => web/ur.io}/.well-known/assetlinks.json (100%) rename {ur.io => web/ur.io}/.well-known/manifest.json (100%) rename {ur.io => web/ur.io}/.well-known/pgp-key.txt (100%) rename {ur.io => web/ur.io}/.well-known/privacy.txt (100%) rename {ur.io => web/ur.io}/.well-known/security.txt (100%) diff --git a/app.old/.eslintrc.json b/app.old/.eslintrc.json deleted file mode 100644 index 0ad09f5..0000000 --- a/app.old/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["next/babel","next/core-web-vitals"] -} diff --git a/app.old/.gitignore b/app.old/.gitignore deleted file mode 100644 index fd3dbb5..0000000 --- a/app.old/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts diff --git a/app.old/.npmrc b/app.old/.npmrc deleted file mode 100644 index b6f27f1..0000000 --- a/app.old/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict=true diff --git a/app.old/Dockerfile b/app.old/Dockerfile deleted file mode 100644 index 8a34308..0000000 --- a/app.old/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -FROM ubuntu:22.04 -# see https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ - -ARG warp_env -ENV WARP_ENV=$warp_env - -# use the latest stable nginx -# https://nginx.org/en/CHANGES -RUN apt-get update && apt-get install -y \ - curl \ - gnupg2 \ - ca-certificates \ - lsb-release \ - ubuntu-keyring - -RUN curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ - | tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null - -RUN echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \ -http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \ - | tee /etc/apt/sources.list.d/nginx.list - -RUN apt-get update && apt-get install -y \ - nginx \ - openssl - -# RUN rm -rf /var/lib/apt/sources.list.d/* - -# print the nginx version -RUN nginx -V - -ADD nginx/build/ /etc/nginx/ -ADD build /www/app - -COPY build/${WARP_ENV}/status.json /srv/warp/status/status.json - -EXPOSE 80 - -# see https://ubuntu.com/blog/avoiding-dropped-connections-in-nginx-containers-with-stopsignal-sigquit -STOPSIGNAL SIGQUIT -CMD ["nginx", "-g", "daemon off;"] diff --git a/app.old/Makefile b/app.old/Makefile deleted file mode 100644 index e30d365..0000000 --- a/app.old/Makefile +++ /dev/null @@ -1,29 +0,0 @@ - -NODE_VERSION := v20.10.0 - -all: clean build - -clean: - rm -rf build - -webpack: - # Outputs build artifacts to ./build - . ${NVM_DIR}/nvm.sh && \ - nvm exec ${NODE_VERSION} npm ci && \ - nvm exec ${NODE_VERSION} npm run build - # FIXME - # nvm exec ${NODE_VERSION} npm audit && \ - -warp_build: - $(MAKE) webpack - python ../webgen/webgen.py clean nginx/gen.py - python ../webgen/webgen.py build nginx/gen.py - mkdir -p build/${WARP_ENV} - echo "{\"version\":\"${WARP_VERSION}\",\"status\":\"ok\"}" > build/${WARP_ENV}/status.json - docker buildx build --progress plain \ - --build-arg warp_env=${WARP_ENV} \ - --platform linux/arm64/v8,linux/amd64 \ - -t ${WARP_DOCKER_NAMESPACE}/${WARP_DOCKER_IMAGE}:${WARP_DOCKER_VERSION} \ - --no-cache \ - --push \ - . diff --git a/app.old/README.md b/app.old/README.md deleted file mode 100644 index 7a61fcd..0000000 --- a/app.old/README.md +++ /dev/null @@ -1,55 +0,0 @@ -This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). - -## Getting Started - -To start the development server, use: - -```bash -npm run dev -``` - -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -## API server - -On production, the API server is https://api.bringyour.com. However, if you try to communicate with this API when running locally, you will run into a CORS error. - -To solve this problem, the development build is configured to communicate with http://test.bringyour.com, which proxies through to https://api.bringyour.com. To make this setup work, you will need to the following: - -1. To `/etc/hosts` add: -``` -127.0.0.1 test.bringyour.com -``` - -1. Run an nginx server locally with the following config: -``` -http { - server { - listen 80; - listen 443; - server_name test.bringyour.com; - - location / { - proxy_set_header Referer https://bringyour.com; - proxy_set_header Origin https://bringyour.com; - proxy_pass https://api.bringyour.com; - proxy_hide_header 'access-control-allow-origin'; - add_header Access-Control-Allow-Origin http://localhost:3000; - } - } -} -``` - -## Building for production - -To create a production build use: - -```bash -make build -``` -or -``` -npm run build -``` - -The build artifacts will be saved in the `web/app/build/` directory. \ No newline at end of file diff --git a/app.old/index.html b/app.old/index.html deleted file mode 100644 index f9c2d62..0000000 --- a/app.old/index.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - BringYour - - - Manage Your Network - - \ No newline at end of file diff --git a/app.old/next.config.js b/app.old/next.config.js deleted file mode 100644 index 612ff2e..0000000 --- a/app.old/next.config.js +++ /dev/null @@ -1,7 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - distDir: 'build', - output: 'export', -} - -module.exports = nextConfig diff --git a/app.old/nginx/nginx.conf.j2 b/app.old/nginx/nginx.conf.j2 deleted file mode 100644 index 4612f62..0000000 --- a/app.old/nginx/nginx.conf.j2 +++ /dev/null @@ -1,74 +0,0 @@ - -user www-data; -pid /run/nginx.pid; -include /etc/nginx/modules-enabled/*.conf; - - -# target concurrent users (from sites.yml): 589824 -# https://www.nginx.com/blog/tuning-nginx/ -worker_processes auto; -events { - worker_connections 8192; - multi_accept on; -} - - -http { - ## - # Basic Settings - ## - - sendfile on; - # minimize latency - tcp_nodelay on; - tcp_nopush off; - types_hash_max_size 2048; - server_tokens off; - - include /etc/nginx/mime.types; - default_type application/octet-stream; - - ## - # Logging Settings - ## - - access_log /dev/stdout; - error_log stderr; - - ## - # Gzip Settings - ## - - gzip on; - - - server { - listen 80 default_server; - - absolute_redirect off; - - location =/status { - alias /srv/warp/status/status.json; - add_header 'Content-Type' 'application/json'; - } - location / { - try_files $uri $uri.html $uri/ =404; - alias /www/app/; - - add_header 'Cache-Control' 'no-cache'; - add_header 'Last-Modified' '{{ http_last_modified }}'; - add_header 'ETag' '"{{ http_etag }}"'; - } - # app resources are content addressed, meaning the name changes when the content changes - # use a separate location block per rec in "if is evil" - # https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ - location ~ \.(js|css)$ { - try_files $uri =404; - alias /www/app/; - - add_header 'Cache-Control' 'max-age=86400'; - add_header 'Last-Modified' '{{ http_last_modified }}'; - add_header 'ETag' '"{{ http_etag }}"'; - } - } -} diff --git a/app.old/package-lock.json b/app.old/package-lock.json deleted file mode 100644 index f1ef366..0000000 --- a/app.old/package-lock.json +++ /dev/null @@ -1,4683 +0,0 @@ -{ - "name": "bringyour-app", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "bringyour-app", - "version": "0.1.0", - "dependencies": { - "@headlessui/react": "^1.7.17", - "@headlessui/tailwindcss": "^0.2.0", - "@heroicons/react": "^2.1.1", - "@tanstack/react-query": "^5.14.2", - "heroicons": "^2.1.1", - "moment": "^2.30.1", - "next": "14.0.4", - "react": "^18", - "react-dom": "^18", - "recharts": "^2.10.3" - }, - "devDependencies": { - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "eslint": "^8", - "eslint-config-next": "14.0.4", - "postcss": "^8", - "tailwindcss": "^3.3.0", - "typescript": "^5" - }, - "engines": { - "node": ">= 20.10.0" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@headlessui/react": { - "version": "1.7.17", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.17.tgz", - "integrity": "sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==", - "dependencies": { - "client-only": "^0.0.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18" - } - }, - "node_modules/@headlessui/tailwindcss": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@headlessui/tailwindcss/-/tailwindcss-0.2.0.tgz", - "integrity": "sha512-fpL830Fln1SykOCboExsWr3JIVeQKieLJ3XytLe/tt1A0XzqUthOftDmjcCYLW62w7mQI7wXcoPXr3tZ9QfGxw==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "tailwindcss": "^3.0" - } - }, - "node_modules/@heroicons/react": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.1.tgz", - "integrity": "sha512-JyyN9Lo66kirbCMuMMRPtJxtKJoIsXKS569ebHGGRKbl8s4CtUfLnyKJxteA+vIKySocO4s1SkTkGS4xtG/yEA==", - "peerDependencies": { - "react": ">= 16" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "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/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@next/env": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.4.tgz", - "integrity": "sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.4.tgz", - "integrity": "sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ==", - "dev": true, - "dependencies": { - "glob": "7.1.7" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz", - "integrity": "sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz", - "integrity": "sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz", - "integrity": "sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz", - "integrity": "sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz", - "integrity": "sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz", - "integrity": "sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz", - "integrity": "sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz", - "integrity": "sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz", - "integrity": "sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.1.tgz", - "integrity": "sha512-UY+FGM/2jjMkzQLn8pxcHGMaVLh9aEitG3zY2CiY7XHdLiz3bZOwa6oDxNqEMv7zZkV+cj5DOdz0cQ1BP5Hjgw==", - "dev": true - }, - "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.14.2.tgz", - "integrity": "sha512-QmoJvC72sSWs3hgGis8JdmlDvqLfYGWUK4UG6OR9Q6t28JMN9m2FDwKPqoSJ9YVocELCSjMt/FGjEiLfk8000Q==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.14.2.tgz", - "integrity": "sha512-SbOzV7UBW8ED3tOnyn6kqNGscnOAfoxShYlbvaQo/5528mDZKpvrwoL/1du1/ukSC6RMAiKmx95SrYqlwPzWDw==", - "dependencies": { - "@tanstack/query-core": "5.14.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz", - "integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.45", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", - "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.18", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", - "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "dev": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.15.0.tgz", - "integrity": "sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.15.0", - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/typescript-estree": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz", - "integrity": "sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.15.0.tgz", - "integrity": "sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz", - "integrity": "sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz", - "integrity": "sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.15.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "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/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-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.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "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/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001570", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", - "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "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/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "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==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "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/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/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/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/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-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" - }, - "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/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "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/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "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-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "dependencies": { - "@babel/runtime": "^7.1.2" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.614", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz", - "integrity": "sha512-X4ze/9Sc3QWs6h92yerwqv7aB/uU8vCjZcrMjA8N9R1pjMFRe44dLsck5FzLilOYvcXuDn93B+bpGYyufc70gQ==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "dev": true, - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.0.4.tgz", - "integrity": "sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ==", - "dev": true, - "dependencies": { - "@next/eslint-plugin-next": "14.0.4", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "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/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-equals": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", - "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-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==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "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==", - "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.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.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/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/heroicons": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/heroicons/-/heroicons-2.1.1.tgz", - "integrity": "sha512-54kHbrxsTyAJJU7z07XN1OrVBX8ogN/tbclP8Doxk0X4IQmR6LEhLzJBkFK9Yc814NoXG6ZJBh9Bi/qvauzjfA==" - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "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/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==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.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==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.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-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "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/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "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/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/next": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/next/-/next-14.0.4.tgz", - "integrity": "sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==", - "dependencies": { - "@next/env": "14.0.4", - "@swc/helpers": "0.5.2", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.0.4", - "@next/swc-darwin-x64": "14.0.4", - "@next/swc-linux-arm64-gnu": "14.0.4", - "@next/swc-linux-arm64-musl": "14.0.4", - "@next/swc-linux-x64-gnu": "14.0.4", - "@next/swc-linux-x64-musl": "14.0.4", - "@next/swc-win32-arm64-msvc": "14.0.4", - "@next/swc-win32-ia32-msvc": "14.0.4", - "@next/swc-win32-x64-msvc": "14.0.4" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "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==" - }, - "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==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", - "engines": { - "node": ">=14" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "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==" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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/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-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-smooth": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.5.tgz", - "integrity": "sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==", - "dependencies": { - "fast-equals": "^5.0.0", - "react-transition-group": "2.9.0" - }, - "peerDependencies": { - "prop-types": "^15.6.0", - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-transition-group": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", - "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", - "dependencies": { - "dom-helpers": "^3.4.0", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0", - "react-dom": ">=15.0.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recharts": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.10.3.tgz", - "integrity": "sha512-G4J96fKTZdfFQd6aQnZjo2nVNdXhp+uuLb00+cBTGLo85pChvm1+E67K3wBOHDE/77spcYb2Cy9gYWVqiZvQCg==", - "dependencies": { - "clsx": "^2.0.0", - "eventemitter3": "^4.0.1", - "lodash": "^4.17.19", - "react-is": "^16.10.2", - "react-smooth": "^2.0.5", - "recharts-scale": "^0.4.4", - "tiny-invariant": "^1.3.1", - "victory-vendor": "^36.6.8" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "prop-types": "^15.6.0", - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/recharts-scale": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", - "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", - "dependencies": { - "decimal.js-light": "^2.4.1" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "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-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "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/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.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/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/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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz", - "integrity": "sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "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/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/victory-vendor": { - "version": "36.7.0", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.7.0.tgz", - "integrity": "sha512-nqYuTkLSdTTeACyXcCLbL7rl0y6jpzLPtTNGOtSnajdR+xxMxBdjMxDjfNJNlhR+ZU8vbXz+QejntcbY7h9/ZA==", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, - "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/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "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/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "engines": { - "node": ">= 14" - } - }, - "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" - } - } - } -} diff --git a/app.old/package.json b/app.old/package.json deleted file mode 100644 index 96aeead..0000000 --- a/app.old/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "bringyour-app", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "NEXT_PUBLIC_API_URL=http://test.bringyour.com/ next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "engines": { - "node": ">= 20.10.0" - }, - "engineStrict": true, - "dependencies": { - "@headlessui/react": "^1.7.17", - "@headlessui/tailwindcss": "^0.2.0", - "@heroicons/react": "^2.1.1", - "@tanstack/react-query": "^5.14.2", - "heroicons": "^2.1.1", - "moment": "^2.30.1", - "next": "14.0.4", - "react": "^18", - "react-dom": "^18", - "recharts": "^2.10.3" - }, - "devDependencies": { - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "eslint": "^8", - "eslint-config-next": "14.0.4", - "postcss": "^8", - "tailwindcss": "^3.3.0", - "typescript": "^5" - } -} diff --git a/app.old/postcss.config.js b/app.old/postcss.config.js deleted file mode 100644 index 33ad091..0000000 --- a/app.old/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/app.old/public/account_icon.svg b/app.old/public/account_icon.svg deleted file mode 100644 index 492f4d9..0000000 --- a/app.old/public/account_icon.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - Container - - - - - - - - - - \ No newline at end of file diff --git a/app.old/public/bringyour-logo.webp b/app.old/public/bringyour-logo.webp deleted file mode 100644 index 243109f90b3ef0e9d87bda41470375ee7dd7b22b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29508 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�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 diff --git a/app.old/public/devices_icon.svg b/app.old/public/devices_icon.svg deleted file mode 100644 index 918d8fd..0000000 --- a/app.old/public/devices_icon.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - Container - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app.old/public/provide_icon.svg b/app.old/public/provide_icon.svg deleted file mode 100644 index 52fff4f..0000000 --- a/app.old/public/provide_icon.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - Container - - - - - - - - \ No newline at end of file diff --git a/app.old/src/app/(pages)/account/add-balance/page.tsx b/app.old/src/app/(pages)/account/add-balance/page.tsx deleted file mode 100644 index c366d18..0000000 --- a/app.old/src/app/(pages)/account/add-balance/page.tsx +++ /dev/null @@ -1,171 +0,0 @@ -"use client"; - -import { - postSubscriptionCheckBalanceCode, - postSubscriptionRedeemBalanceCode, -} from "@/app/_lib/api"; -import { Breadcrumbs } from "@/app/_lib/components/Breadcrumbs"; -import Button from "@/app/_lib/components/Button"; -import { prettyPrintByteCount } from "@/app/_lib/utils"; -import { - CheckBadgeIcon, - CheckCircleIcon, - ExclamationCircleIcon, -} from "@heroicons/react/24/solid"; -import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { useSearchParams } from "next/navigation"; -import { useState } from "react"; - -export default function Page() { - const queryClient = useQueryClient(); - const queryParams = useSearchParams(); - const paramCode = queryParams.get("redeem-balance-code") || ""; - - const [code, setCode] = useState(paramCode); - const [isCodeTouched, setIsCodeTouched] = useState( - Boolean(paramCode) - ); - const [isCodeValid, setIsCodeValid] = useState(Boolean(paramCode)); - const [codeErrorMessage, setCodeErrorMessage] = useState(); - - const validateCodeAsync = async (code: string) => { - try { - const result = await postSubscriptionCheckBalanceCode({ - secret: code, - }); - - if (result.balance) { - setIsCodeValid(true); - setCodeErrorMessage(undefined); - } else { - setIsCodeValid(false); - setCodeErrorMessage( - result.error?.message || "This code is not valid, or has expired" - ); - } - return result; - } catch (error) { - setIsCodeValid(false); - setCodeErrorMessage("Sorry, we're unable to check if the code is valid"); - } - return null; - }; - - const handleOnChange = async (event: React.ChangeEvent) => { - const code = event.target.value; - setCode(code); - - if (!code || code == "" || code == undefined) { - setIsCodeValid(false); - setCodeErrorMessage("Please enter a code"); - } else { - setIsCodeValid(true); - setCodeErrorMessage(undefined); - } - }; - - const shouldShowError = codeErrorMessage && isCodeTouched; - - const { data: redeemBalanceResult, mutateAsync: mutateRedeemBalanceAsync } = - useMutation({ - mutationKey: ["subscription", "redeem", "code", code], - mutationFn: (code: string) => - postSubscriptionRedeemBalanceCode({ secret: code }), - onSuccess: () => { - queryClient.invalidateQueries({ - queryKey: ["subscription", "balance"], - }); - }, - }); - - const handleSubmitCode = async ( - event: React.MouseEvent - ) => { - event.preventDefault(); - if (!code) { - return; - } - const result = await validateCodeAsync(code); - - if (!result || result.error || !result.balance) { - return; - } - await mutateRedeemBalanceAsync(code); - }; - - return ( -
- -

Add balance

- - {true && ( -
{}}> -
-
- -
- setIsCodeTouched(true)} - placeholder="e.g. 249384883cf27ff2d844f379610da79e" - className={`w-full block rounded-md bg-transparent py-2 px-2 pr-12 text-gray-900 placeholder:text-gray-400 ring-1 ring-gray-400 sm:text-sm sm:leading-6 ${ - shouldShowError ? "ring-red-500" : "" - }`} - /> -
- {shouldShowError && ( -
-
- {shouldShowError && ( -
-

{codeErrorMessage}

-
- )} -
- -
- {redeemBalanceResult && redeemBalanceResult.transfer_balance && ( -
-

Success!

- -

- {prettyPrintByteCount( - redeemBalanceResult.transfer_balance?.balance_byte_count! - )}{" "} - was added to your balance -

-
- )} -
- )} -
- ); -} diff --git a/app.old/src/app/(pages)/account/loading.tsx b/app.old/src/app/(pages)/account/loading.tsx deleted file mode 100644 index cd0008b..0000000 --- a/app.old/src/app/(pages)/account/loading.tsx +++ /dev/null @@ -1,10 +0,0 @@ -export default function Loading() { - return ( - <> -
-
-
-
- - ); -} diff --git a/app.old/src/app/(pages)/account/page.tsx b/app.old/src/app/(pages)/account/page.tsx deleted file mode 100644 index 74f2552..0000000 --- a/app.old/src/app/(pages)/account/page.tsx +++ /dev/null @@ -1,62 +0,0 @@ -"use client"; - -import { getSubscriptionBalance } from "@/app/_lib/api"; -import { useQuery } from "@tanstack/react-query"; -import Loading from "./loading"; -import Link from "next/link"; -import { prettyPrintByteCount } from "@/app/_lib/utils"; - -export default function Page() { - const { isPending, data: result } = useQuery({ - queryKey: ["subscription", "balance"], - queryFn: async () => await getSubscriptionBalance(), - }); - - const currentSubscription = result?.current_subscription; - const wallet = result?.wallet_info; - - return ( - <> -
-
-

Account

-
- - {isPending && } - - {!isPending && ( -
-
-
-

Subscriptions

-
- - - -
-

- Transfer balance:{" "} - {prettyPrintByteCount(result?.balance_byte_count!)} -

- {!currentSubscription &&

No current subscriptions found

} - {currentSubscription &&

{currentSubscription.plan}

} -
- -
-

Wallet

- {!wallet &&

No wallet found

} - {wallet && ( - <> -

- Balance:{" "} - {wallet.balance_usdc_nano_cents / 1_000_000_000} USDC -

- - )} -
-
- )} -
- - ); -} diff --git a/app.old/src/app/(pages)/components/Sidebar.tsx b/app.old/src/app/(pages)/components/Sidebar.tsx deleted file mode 100644 index 9146aa1..0000000 --- a/app.old/src/app/(pages)/components/Sidebar.tsx +++ /dev/null @@ -1,284 +0,0 @@ -"use client"; - -import Link from "next/link"; -import { Bars3Icon, XMarkIcon } from "@heroicons/react/24/outline"; -import { redirect, usePathname } from "next/navigation"; -import { Fragment, useEffect, useState } from "react"; -import { Dialog, Transition } from "@headlessui/react"; -import { useQuery } from "@tanstack/react-query"; -import { - getJwt, - getLoginUrl, - getSubscriptionBalance, - removeJwt, -} from "@/app/_lib/api"; -import { classNames, prettyPrintByteCount } from "@/app/_lib/utils"; - -const navigation = [ - { - name: "Devices", - href: "/devices", - icon: "/devices_icon.svg", - bg_color: "bg-[#2B3A82] hover:bg-[#2E3E9F]", - }, - { - name: "Provide", - href: "/provide", - icon: "/provide_icon.svg", - bg_color: "bg-[#1E644E] hover:bg-[#24775B]", - }, - { - name: "Account", - href: "/account", - icon: "/account_icon.svg", - bg_color: "bg-[#5A4E53] hover:bg-[#73636A]", - }, -]; - -// Copied from web/bringyour.com/client.js -// see https://stackoverflow.com/questions/38552003/how-to-decode-jwt-token-in-javascript-without-using-a-library -function parseJwt(jwt: string) { - var base64Url = jwt.split(".")[1]; - var base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/"); - var jsonPayload = decodeURIComponent( - window - .atob(base64) - .split("") - .map(function (c) { - return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2); - }) - .join("") - ); - - return JSON.parse(jsonPayload); -} - -function SidebarContent() { - const [networkName, setNetworkName] = useState(null); - - const { isPending, data: subscriptionBalanceResult } = useQuery({ - queryKey: ["subscription", "balance"], - queryFn: async () => await getSubscriptionBalance(), - }); - - const wallet = subscriptionBalanceResult?.wallet_info; - - useEffect(() => { - const jwt = getJwt(); - const networkAddon = jwt ? parseJwt(jwt)?.network_name : null; - setNetworkName(networkAddon ? `${networkAddon}.bringyour.network` : null); - }, []); - - const signOut = () => { - removeJwt(); - redirect(getLoginUrl()); - }; - - return ( -
-
- BringYour logo -
- -
- {networkName &&

{networkName}

} - { - !networkName && ( -
- ) /* Stops subsequent content from jumping up and down */ - } -
- -
- {isPending && ( -
- )} - - {!isPending && ( - <> -

- {prettyPrintByteCount( - subscriptionBalanceResult?.balance_byte_count! - )} -

- -

- add balance -

- - - )} -
- -
- {isPending && ( -
- )} - - {!isPending && ( - <> -

- {( - wallet && wallet.balance_usdc_nano_cents / 1_000_000_000 - )?.toPrecision(3) || "-"}{" "} - USDC -

- {!wallet && ( -

- No wallet found -

- )} - {wallet && ( -

- earn by providing -

- )} - - )} -
- -
-

- Manage your network -

- -
- -
- -
- signOut()}> - Sign out - -

- - Terms - -  |  - - Privacy - -  |  - - VDP - -

-

Copyright 2024 BringYour, Inc.

-
-
- ); -} - -export default function Sidebar() { - const pathname = usePathname().split("?")[0]; - const [sidebarOpen, setSidebarOpen] = useState(false); - - return ( - <> - {/* Modal popup menu for mobile */} -
- - - -
- - -
- - - -
- -
-
- -
-
-
-
-
-
- - {/* Desktop sidebar */} - - - {/* Collapsed mobile sidebar */} -
- - -
- BringYour -
-
- - ); -} diff --git a/app.old/src/app/(pages)/devices/add/components/Poll.tsx b/app.old/src/app/(pages)/devices/add/components/Poll.tsx deleted file mode 100644 index 2e42dba..0000000 --- a/app.old/src/app/(pages)/devices/add/components/Poll.tsx +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Function to poll an endpoint every 2 seconds - * - * Todo(Awais): This can probably be factored out into a separate, reusable polling - * component. - */ - -import { postDeviceAdoptStatus, postDeviceShareStatus } from "@/app/_lib/api"; -import PulseLoader from "@/app/_lib/components/LoadingSpinner"; -import { DeviceAddResult } from "@/app/_lib/types"; -import { CheckBadgeIcon } from "@heroicons/react/24/solid"; -import { useQuery } from "@tanstack/react-query"; -import { useState } from "react"; - -const POLLING_INTERVAL = 2000; // milliseconds - -type PollProps = { - result: DeviceAddResult; -}; - -export default function Poll({ result }: PollProps) { - const [isPolling, setIsPolling] = useState(true); - - const codeType = result.code_type; - const code = result.code; - - const pollingFunction = () => { - if (codeType == "share") return postDeviceShareStatus; - else if (codeType == "adopt") return postDeviceAdoptStatus; - else throw new Error(`Uknown code_type: ${codeType}`); - }; - - const { - isLoading, - data: deviceShareStatus, - isError, - } = useQuery({ - queryKey: ["device", codeType, "status", code], - queryFn: async () => pollingFunction()({ share_code: code }), - enabled: isPolling, - refetchInterval: (query) => { - if ((!query.state.data || query.state.data?.pending) && isPolling) { - return POLLING_INTERVAL; - } - - // Success! We're no longer pending - setIsPolling(false); - return false; - }, - }); - - const ErrorState = () => ( -
-

Sorry, something went wrong

-
- ); - - const PendingState = () => ( -
-

{`Waiting for ${codeType} confirmation`}

- -

- You may leave this page. The device will show as pending in your devices - list until it is confirmed. -

-
- ); - - const SuccessState = () => ( -
-

Success!

-

New device added

- -

- Your new device is viewable in the devices list -

-
- ); - - return ( - <> - {isError && } - {(isLoading || isPolling) && } - {deviceShareStatus && !deviceShareStatus.pending && } - - ); -} diff --git a/app.old/src/app/(pages)/devices/add/page.tsx b/app.old/src/app/(pages)/devices/add/page.tsx deleted file mode 100644 index 4e34ea3..0000000 --- a/app.old/src/app/(pages)/devices/add/page.tsx +++ /dev/null @@ -1,120 +0,0 @@ -"use client"; - -import { postDeviceAdd } from "@/app/_lib/api"; -import { Breadcrumbs } from "@/app/_lib/components/Breadcrumbs"; -import Button from "@/app/_lib/components/Button"; -import { useMutation } from "@tanstack/react-query"; -import { useSearchParams } from "next/navigation"; -import React, { useEffect, useState } from "react"; -import Poll from "./components/Poll"; - -export default function Page() { - // If there were moore fields, I would use a library like Formik for error handling - const queryParams = useSearchParams(); - const [code, setCode] = useState(queryParams.get("code") || ""); - const [isCodeTouched, setIsCodeTouched] = useState(false); - const [codeErrorMessage, setCodeErrorMessage] = useState(); - - const validateCode = (code: string | undefined) => { - if (!code || code == "" || code == undefined) { - setCodeErrorMessage("Please enter a code"); - } else { - setCodeErrorMessage(undefined); - } - }; - - const handleOnChange = (event: React.ChangeEvent) => { - setCode(event.target.value); - validateCode(event.target.value); - }; - - const { - data: deviceAddResult, - isError, - mutateAsync, - } = useMutation({ - mutationFn: async (code: string) => await postDeviceAdd({ code: code }), - }); - - const handleAddDevice = async ( - event: React.MouseEvent - ): Promise => { - event.preventDefault(); - const result = await mutateAsync(code); - if (result.error) { - setCodeErrorMessage(result.error.message); - } - }; - - const hasError = codeErrorMessage !== undefined; - const shouldShowCodeError = codeErrorMessage !== undefined && isCodeTouched; - - useEffect(() => { - validateCode(code); - }, []); - - return ( - <> -
- -

Add a new device

- - {isError && ( -
-

Sorry, something went wrong...

-
- )} - - {deviceAddResult && !deviceAddResult.error && ( - - )} - - {(!deviceAddResult || deviceAddResult.error) && ( -
{}}> -
-
- - setIsCodeTouched(true)} - placeholder="e.g. 249384883cf27ff2d844f379610da79e" - className={`w-full block rounded-md bg-transparent py-2 px-2 text-gray-900 placeholder:text-gray-400 ring-1 ring-gray-400 sm:text-sm sm:leading-6 ${ - shouldShowCodeError ? "ring-red-500" : "" - }`} - > - {shouldShowCodeError && ( -
-

{codeErrorMessage}

-
- )} -
- -
-
- )} -
- - ); -} diff --git a/app.old/src/app/(pages)/devices/components/DeviceDetail.tsx b/app.old/src/app/(pages)/devices/components/DeviceDetail.tsx deleted file mode 100644 index 5d290dd..0000000 --- a/app.old/src/app/(pages)/devices/components/DeviceDetail.tsx +++ /dev/null @@ -1,325 +0,0 @@ -"use client"; - -import { - getDeviceAssociations, - getNetworkClients, - postDeviceConfirmShare, - postDeviceCreateShareCode, - postDeviceRemoveAssociation, - postRemoveNetworkClient, -} from "@/app/_lib/api"; -import { Breadcrumbs } from "@/app/_lib/components/Breadcrumbs"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import Loading from "../loading"; -import Button from "@/app/_lib/components/Button"; -import { useState } from "react"; -import { ConfirmDeleteModal } from "@/app/_lib/components/ConfirmDeleteModal"; -import { redirect, useRouter } from "next/navigation"; -import ShareDeviceDialog from "./ShareDeviceDialog"; - -type DeviceDetailProps = { - clientId: string; -}; - -export default function DeviceDetail({ clientId }: DeviceDetailProps) { - const queryClient = useQueryClient(); - const router = useRouter(); - - const [networkToRemove, setNetworkToRemove] = useState<{ - code: string; - network_name?: string; - }>(); - const [showDeleteDeviceModal, setShowDeleteDeviceModal] = useState(false); - const [showShareDeviceModal, setShowShareDeviceModal] = useState(false); - - const { isPending: isClientsPending, data: clients } = useQuery({ - queryKey: ["network", "clients"], - queryFn: async () => (await getNetworkClients()).clients, - }); - - const { isPending: isAssociationsPending, data: associations } = useQuery({ - queryKey: ["device", "associations"], - queryFn: getDeviceAssociations, - }); - - const outgoingSharedDevices = associations?.outgoing_shared_devices; - const client = clients?.filter((client) => client.client_id == clientId)[0]; - - if (!isClientsPending && !client) { - return ( -
- - -
-

{clientId}

-

No device found.

-
-
- ); - } - - const getOutgoingNetworks = (clientId: string) => { - return outgoingSharedDevices?.filter( - (device) => device.client_id == clientId - ); - }; - - const { - data: shareCodeResult, - mutateAsync: mutateDeviceCreateShareCodeAsync, - } = useMutation({ - mutationKey: ["device", "create", "share", "code", clientId], - mutationFn: async () => { - return await postDeviceCreateShareCode({ - client_id: clientId, - device_name: clientId, // Todo(awais): There must be a better device name? - }); - }, - onSettled: (data) => - queryClient.invalidateQueries({ queryKey: ["device", "associations"] }), - }); - - const { mutateAsync: mutateConfirmShareAsync } = useMutation({ - mutationKey: ["device", "confirm", "share"], - mutationFn: async ({ - code, - associated_network_name, - }: { - code: string; - associated_network_name: string | null; - }) => - await postDeviceConfirmShare({ - share_code: code, - associated_network_name, - }), - onSettled: (data) => - queryClient.invalidateQueries({ queryKey: ["device", "associations"] }), - }); - - const { mutateAsync: mutateRemoveAssociationAsync } = useMutation({ - mutationKey: ["device", "remove", "association"], - mutationFn: async (code: string) => - await postDeviceRemoveAssociation({ code }), - onSettled: (data) => - queryClient.invalidateQueries({ queryKey: ["device", "associations"] }), - }); - - const { mutateAsync: mutateRemoveNetworkClientAsync } = useMutation({ - mutationKey: ["remove", "network", "client"], - mutationFn: async (clientId: string) => - await postRemoveNetworkClient({ client_id: clientId }), - onSettled: () => - queryClient.invalidateQueries({ queryKey: ["network", "clients"] }), - }); - - const handleConfirmShare = async ( - code: string, - associated_network_name: string - ) => { - await mutateConfirmShareAsync({ - code: code, - associated_network_name: associated_network_name, - }); - }; - - const handleShareDevice = async ( - event: React.MouseEvent - ) => { - await mutateDeviceCreateShareCodeAsync(); - setShowShareDeviceModal(true); - }; - - const handleConfirmCancel = async (code: string) => { - await mutateRemoveAssociationAsync(code); - }; - - const handleRemoveAssociation = async (code: string) => { - await mutateRemoveAssociationAsync(code); - }; - - const handleRemoveNetworkClient = async (clientId: string) => { - await mutateRemoveNetworkClientAsync(clientId); - }; - - return ( - <> - {networkToRemove && ( - { - if (!value) { - setNetworkToRemove(undefined); - } - }} - onConfirm={async () => - await handleRemoveAssociation(networkToRemove.code) - } - > -

- Are you sure you want to stop sharing with{" "} - {networkToRemove.network_name}? -

-

You won't be able to undo this action.

-
- )} - - {shareCodeResult && showShareDeviceModal && ( - - )} - - { - await handleRemoveNetworkClient(clientId); - router.push("/devices"); - }} - > -

- Are you sure you want to delete{" "} - {clientId}? -

-

You won't be able to undo this action.

-
- -
- - -
-

{clientId}

- {isClientsPending && ( -
- )} - {!isClientsPending && client && ( -

{client.description}

- )} -
-
-

Shared with

-
- -
- - {(isClientsPending || isAssociationsPending) && } - - {!isClientsPending && !isAssociationsPending && ( - <> - {(!getOutgoingNetworks(clientId) || - getOutgoingNetworks(clientId)?.length == 0) && ( -
-

Not shared with any networks

-
- )} - - {(getOutgoingNetworks(clientId)?.length || 0) > 0 && ( -
- {getOutgoingNetworks(clientId)?.map((network) => ( -
- {network.pending && !network.network_name && ( - <> -

- Code generated:{" "} - {network.code} -

-
-
- -
- - )} - - {network.pending && network.network_name && ( - <> -

- Shared with {network.network_name}{" "} - {network.pending && "(awaiting confirmation)"} -

-
- -
- - -
- - )} - {!network.pending && ( - <> -

- Shared with {network.network_name}{" "} - {network.pending && "(awaiting confirmation)"} -

-
- -
- -
- - )} -
- ))} -
- )} - -
- -
- - )} -
- - ); -} diff --git a/app.old/src/app/(pages)/devices/components/DeviceList.tsx b/app.old/src/app/(pages)/devices/components/DeviceList.tsx deleted file mode 100644 index ae902c8..0000000 --- a/app.old/src/app/(pages)/devices/components/DeviceList.tsx +++ /dev/null @@ -1,254 +0,0 @@ -"use client"; - -import { DevicePhoneMobileIcon } from "@heroicons/react/24/outline"; -import { PlusIcon } from "@heroicons/react/24/solid"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import Loading from "../loading"; -import { - getDeviceAssociations, - getNetworkClients, - postDeviceRemoveAssociation, -} from "@lib/api"; -import Link from "next/link"; -import { useState } from "react"; -import { ConfirmDeleteModal } from "@/app/_lib/components/ConfirmDeleteModal"; - -const PAGE_SIZE = 3; - -export default function DeviceList() { - const queryClient = useQueryClient(); - - const [deviceToRemove, setDeviceToRemove] = useState<{ - code: string; - client_id: string; - }>(); - const [numItemsToShow, setNumItemsToShow] = useState(PAGE_SIZE); - - const { isPending: isClientsPending, data: clients } = useQuery({ - queryKey: ["network", "clients"], - queryFn: async () => (await getNetworkClients()).clients, - }); - - const { isPending: isAssociationsPending, data: associations } = useQuery({ - queryKey: ["device", "associations"], - queryFn: getDeviceAssociations, - }); - - const pendingAdoptionDevices = associations?.pending_adoption_devices; - const incomingSharedDevices = associations?.incoming_shared_devices; - const outgoingSharedDevices = associations?.outgoing_shared_devices; - - const isPending = isClientsPending || isAssociationsPending; - - const numItems = () => { - return (clients?.length || 0) + (pendingAdoptionDevices?.length || 0); - }; - - /** - * The number of networks this device is shared with - */ - const getNumOutgoingNetworks = (clientId: string) => { - const networks = outgoingSharedDevices?.filter( - (device) => device.client_id == clientId && !!device.network_name - ); - const numNetworks = networks?.length || 0; - - if (numNetworks == 1) { - return "1 network"; - } - - return `${numNetworks} networks`; - }; - - const { - data: removeAssociationResult, - mutateAsync: mutateRemoveAssociationAsync, - } = useMutation({ - mutationKey: ["device", "remove", "association"], - mutationFn: async (code: string) => - await postDeviceRemoveAssociation({ code }), - onSettled: (data) => - queryClient.invalidateQueries({ queryKey: ["device", "associations"] }), - }); - - const handleRemoveAssociation = async (code: string) => { - await mutateRemoveAssociationAsync(code); - }; - - return ( - <> - {deviceToRemove && ( - { - if (!value) { - setDeviceToRemove(undefined); - } - }} - onConfirm={async () => - await handleRemoveAssociation(deviceToRemove.code) - } - > -

- Are you sure you want to remove device{" "} - {deviceToRemove.client_id}? -

-

You won't be able to undo this action.

-
- )} - -
-
-

Your Devices

- - - -
- - {isPending && } - - {!isPending && ( - <> -
- {clients?.length == 0 && ( -
No devices found
- )} - - {clients?.slice(0, numItemsToShow)?.map((client) => { - return ( - -
-
-
- -
- -
-

- {client.client_id} -

-

- {client.description} -

-
-
-
-
- - {/* Outoing shared devices */} -
-

- Shared with - {getNumOutgoingNetworks(client.client_id)} -

-
-
- - ); - })} - - {pendingAdoptionDevices - ?.slice(0, numItemsToShow - (clients?.length || 0)) - ?.map((device) => { - return ( -
-
-
- -
-
-

- {device.client_id} -

-
-
-
- -
-
-
-

Waiting for confirmation

-
-
- ); - })} - - {PAGE_SIZE < numItems() && numItemsToShow < numItems() && ( -
setNumItemsToShow(999)} - > -

Show more

-
- )} - - {PAGE_SIZE < numItems() && numItemsToShow > numItems() && ( -
setNumItemsToShow(PAGE_SIZE)} - > -

Show less

-
- )} -
- - )} - -

Devices shared with you

- {isAssociationsPending && } - {!isAssociationsPending && ( -
- {!incomingSharedDevices || - (incomingSharedDevices.length == 0 && ( -

No shared devices found

- ))} - {incomingSharedDevices?.map((device) => ( -
-
-
- -
-
-

- {device.client_id} -

-
-
-
- -
-
-
- {device.pending && ( -

Waiting for confirmation from {device.network_name}

- )} - {!device.pending &&

Shared by {device.network_name}

} -
-
- ))} -
- )} -
- - ); -} diff --git a/app.old/src/app/(pages)/devices/components/PollShare.tsx b/app.old/src/app/(pages)/devices/components/PollShare.tsx deleted file mode 100644 index b669ac0..0000000 --- a/app.old/src/app/(pages)/devices/components/PollShare.tsx +++ /dev/null @@ -1,158 +0,0 @@ -/** - * Function to poll an endpoint every 2 seconds - * - * Todo(Awais): This component can probably be merged with Poll.tsx. Not doing - * that now since it's only used in two places, but another polling use case - * would warrant factoring out the common code. - */ - -import { - postDeviceConfirmShare, - postDeviceRemoveAssociation, - postDeviceShareStatus, -} from "@/app/_lib/api"; -import Button from "@/app/_lib/components/Button"; -import PulseLoader from "@/app/_lib/components/LoadingSpinner"; -import { CheckBadgeIcon } from "@heroicons/react/24/solid"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { useState } from "react"; - -const POLLING_INTERVAL = 2000; // milliseconds - -type PollShareProps = { - code: string; - setIsModalOpen: (value: boolean) => void; -}; - -export default function PollShare({ code, setIsModalOpen }: PollShareProps) { - const queryClient = useQueryClient(); - const [isPolling, setIsPolling] = useState(true); - - const { - isLoading, - data: deviceShareStatus, - isError, - } = useQuery({ - queryKey: ["device", "share", "status", code], - queryFn: async () => postDeviceShareStatus({ share_code: code }), - enabled: isPolling, - refetchInterval: (query) => { - if ( - (!query.state.data || !query.state.data?.associated_network_name) && - isPolling - ) { - return POLLING_INTERVAL; - } - - // Success! We're no longer pending - setIsPolling(false); - return false; - }, - }); - - const { data: confirmShareResult, mutateAsync: mutateConfirmShareAsync } = - useMutation({ - mutationKey: ["device", "confirm", "share", code], - mutationFn: async ({ - code, - associated_network_name, - }: { - code: string; - associated_network_name: string | null; - }) => - await postDeviceConfirmShare({ - share_code: code, - associated_network_name, - }), - onSettled: (data) => - queryClient.invalidateQueries({ queryKey: ["device", "associations"] }), - }); - - const { mutateAsync: mutateRemoveAssociationAsync } = useMutation({ - mutationKey: ["device", "remove", "association"], - mutationFn: async (code: string) => - await postDeviceRemoveAssociation({ code }), - onSettled: (data) => - queryClient.invalidateQueries({ queryKey: ["device", "associations"] }), - }); - - const handleConfirmShare = async ( - event: React.MouseEvent - ) => { - if (!deviceShareStatus?.associated_network_name) { - alert("Sorry, something went wrong with the confirmation."); - return; - } - // Todo(Awais): This mutation seems to be triggering a re-render - // which is why the loading spinner on the button is not working. - await mutateConfirmShareAsync({ - code, - associated_network_name: deviceShareStatus?.associated_network_name, - }); - }; - - const handleCancelShare = async ( - event: React.MouseEvent - ) => { - await mutateRemoveAssociationAsync(code); - setIsModalOpen(false); - }; - - const ErrorState = () => ( -
-

Sorry, something went wrong

-
- ); - - const PendingState = () => ( -
-

- Waiting for code to be shared... -

- -
- ); - - const AwaitConfirmationState = () => ( -
- - -
- ); - - const ConfirmedState = () => { - return ( -
-

Success!

- -

- Your device is now shared with{" "} - {confirmShareResult?.associated_network_name} -

-
- ); - }; - - return ( - <> - {isError && } - {(isLoading || isPolling) && } - {deviceShareStatus && - deviceShareStatus.associated_network_name && - !confirmShareResult && } - {confirmShareResult && } - - ); -} diff --git a/app.old/src/app/(pages)/devices/components/ShareDeviceDialog.tsx b/app.old/src/app/(pages)/devices/components/ShareDeviceDialog.tsx deleted file mode 100644 index 14e2588..0000000 --- a/app.old/src/app/(pages)/devices/components/ShareDeviceDialog.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import { - getDeviceShareCodeQR, - postDeviceCreateShareCode, -} from "@/app/_lib/api"; -import { Client, DeviceCreateShareCodeResult } from "@/app/_lib/types"; -import { Dialog } from "@headlessui/react"; -import { XMarkIcon } from "@heroicons/react/24/outline"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { useEffect } from "react"; -import PollShare from "./PollShare"; - -type ShareDeviceDialogProps = { - clientId: string; - shareCodeResult: DeviceCreateShareCodeResult; - isOpen: boolean; - setIsOpen: (value: boolean) => void; -}; - -export default function ShareDeviceDialog({ - clientId, - shareCodeResult, - isOpen, - setIsOpen, -}: ShareDeviceDialogProps) { - const { data: qrCodeURL, isPending: isQrImagePending } = useQuery({ - queryKey: ["share", "code", "qr", shareCodeResult?.share_code], - queryFn: async () => { - return await getDeviceShareCodeQR(shareCodeResult?.share_code || ""); - }, - }); - - return ( - setIsOpen(false)} - className="relative z-50" - > - {/* The backdrop, rendered as a fixed sibling to the panel container */} - - ); -} diff --git a/app.old/src/app/(pages)/devices/loading.tsx b/app.old/src/app/(pages)/devices/loading.tsx deleted file mode 100644 index cd0008b..0000000 --- a/app.old/src/app/(pages)/devices/loading.tsx +++ /dev/null @@ -1,10 +0,0 @@ -export default function Loading() { - return ( - <> -
-
-
-
- - ); -} diff --git a/app.old/src/app/(pages)/devices/page.tsx b/app.old/src/app/(pages)/devices/page.tsx deleted file mode 100644 index 3850b62..0000000 --- a/app.old/src/app/(pages)/devices/page.tsx +++ /dev/null @@ -1,19 +0,0 @@ -"use client"; - -import { useSearchParams } from "next/navigation"; -import DeviceDetail from "./components/DeviceDetail"; -import DeviceList from "./components/DeviceList"; - -export default function Page() { - // This is somewhat of a hack. NextJS static sites don't like dynamic URLS so instead of - // /devices/[client_id] we use the route /devices?client_id=[client_id] to show the client - // detail page - const queryParams = useSearchParams(); - const clientId = queryParams.get("client_id"); - - if (clientId) { - return ; - } - - return ; -} diff --git a/app.old/src/app/(pages)/ffdevices/loading.tsx b/app.old/src/app/(pages)/ffdevices/loading.tsx deleted file mode 100644 index cd0008b..0000000 --- a/app.old/src/app/(pages)/ffdevices/loading.tsx +++ /dev/null @@ -1,10 +0,0 @@ -export default function Loading() { - return ( - <> -
-
-
-
- - ); -} diff --git a/app.old/src/app/(pages)/ffdevices/page.tsx b/app.old/src/app/(pages)/ffdevices/page.tsx deleted file mode 100644 index cc55d8f..0000000 --- a/app.old/src/app/(pages)/ffdevices/page.tsx +++ /dev/null @@ -1,77 +0,0 @@ -"use client"; - -import { DevicePhoneMobileIcon } from "@heroicons/react/24/outline"; -import { useQuery } from "@tanstack/react-query"; -import Loading from "./loading"; -import { getNetworkClients } from "@lib/api"; - -export default function Page() { - const { isPending, data: clients } = useQuery({ - queryKey: ["network", "ffclients"], - queryFn: async () => { - const allClients = (await getNetworkClients()).clients; - return allClients.filter((client) => client.provide_mode == 2); - }, - }); - - return ( - <> -
-
-

Friends and Family Devices

-
- - {isPending && } - - {!isPending && ( - <> -
- {clients?.length == 0 && ( -
No devices found
- )} - - {clients?.map((client) => { - return ( -
-
- -
-
-

- {client.client_id} -

-

- {client.description} -

-
- -
-
- {client.connections && client.connections.length > 0 && ( - <> -
-
Connected
- - )} - {!client.connections && ( - <> -
-
- Disconnected -
- - )} -
-
- ); - })} -
- - )} -
- - ); -} diff --git a/app.old/src/app/(pages)/layout.tsx b/app.old/src/app/(pages)/layout.tsx deleted file mode 100644 index d983331..0000000 --- a/app.old/src/app/(pages)/layout.tsx +++ /dev/null @@ -1,16 +0,0 @@ -"use client"; - -import Sidebar from "./components/Sidebar"; - -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}) { - return ( - <> - -
{children}
- - ); -} diff --git a/app.old/src/app/(pages)/provide/components/ActivityWidget.tsx b/app.old/src/app/(pages)/provide/components/ActivityWidget.tsx deleted file mode 100644 index 9bdd9bd..0000000 --- a/app.old/src/app/(pages)/provide/components/ActivityWidget.tsx +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Shows a github-like 'contributions' chart. - * - * A 1-d array of boxes where a more saturated colour indicates more activity - * on that day. - */ - -import { TimeseriesEntry } from "@/app/_lib/types"; -import moment from "moment"; -import { useState } from "react"; - -// How many days of data do we want to show in this widget? -export const NUM_DAYS = 7; - -type ActivityWidgetProps = { - data: TimeseriesEntry[]; - maxValue?: number; // Use this to set the 'max' value across multiple ActivityWidget instances -}; - -export default function ActivityWidget({ - data, - maxValue, -}: ActivityWidgetProps) { - const [tooltipEntry, setTooltipEntry] = useState(); - - if (!data || data.length == 0) { - return ( -
- {Array(NUM_DAYS) - .fill(0) - .map(() => ( -
- ))} -
- ); - } - - const max = maxValue || Math.max(...data.map((entry) => Number(entry.value))); - - const calculateColor = (value: number) => { - const normedValue = value / max; - const maxLightness = 0.4; // lightness for the largest value - const minLightness = 0.9; // lightness for the smallest value - const lightnessPercentage = - 100 * (normedValue * (maxLightness - minLightness) + minLightness); - - return `hsl(225, 70%, ${lightnessPercentage}%)`; - }; - - return ( -
- {data.map((entry) => ( -
setTooltipEntry(entry)} - onMouseLeave={() => setTooltipEntry(undefined)} - > - {tooltipEntry && tooltipEntry.date === entry.date && ( -
-
-

{moment(tooltipEntry.date).format("YYYY-MM-DD")}

-

- Data:{" "} - {typeof tooltipEntry.value == "number" - ? tooltipEntry.value.toPrecision(4) - : tooltipEntry.value}{" "} - GiB -

-
-
- )} -
- ))} -
- ); -} diff --git a/app.old/src/app/(pages)/provide/components/Chart.tsx b/app.old/src/app/(pages)/provide/components/Chart.tsx deleted file mode 100644 index dc94f46..0000000 --- a/app.old/src/app/(pages)/provide/components/Chart.tsx +++ /dev/null @@ -1,174 +0,0 @@ -import { - ResponsiveContainer, - XAxis, - BarChart as ReBarChart, - AreaChart, - Area, - Bar, - Tooltip, - TooltipProps, -} from "recharts"; -import { - ValueType, - NameType, -} from "recharts/types/component/DefaultTooltipContent"; -import moment from "moment"; -import { Dispatch, SetStateAction, useState } from "react"; -import { Timeseries } from "@/app/_lib/types"; -import { formatTimeseriesData } from "@/app/_lib/utils"; - -type BarChartProps = { - name: string; - pre_unit?: string; - unit?: string; - data: Timeseries; - syncId?: string; - tooltipStyle?: "normal" | "simple"; - showTooltip?: boolean; - setShowTooltip?: Dispatch>; -}; - -export function BarChart({ - name, - pre_unit, - unit, - data, - syncId, - tooltipStyle = "normal", - showTooltip, - setShowTooltip, -}: BarChartProps) { - const [tooltipPostion, setTooltipPosition] = useState({ x: 0, y: 0 }); - const [_isTooltipVisible, _setIsTooltipVisible] = useState(false); - const isTooltipVisible = showTooltip || _isTooltipVisible; - const setIsTooltipVisible = setShowTooltip || _setIsTooltipVisible; - - const formattedData = formatTimeseriesData(data); - - const formatDate = (date: string): string => { - return moment(date).format("MMM Do"); - }; - - const CustomTooltip = ({ - active, - payload, - label, - }: TooltipProps) => { - if (active && payload && payload.length) { - return ( -
-
-

{label}

-
-

- {name} -   - - {pre_unit} - {typeof payload[0].value == "number" - ? payload[0].value.toPrecision(4) - : payload[0].value} - {" "} - {unit} -

-
-
-
- ); - } - }; - - const SimpleTooltip = ({ - active, - payload, - label, - }: TooltipProps) => { - if (active && payload && payload.length) { - return ( -
-
-

{label}

-
-

- {name} -   - - {pre_unit} - {typeof payload[0].value == "number" - ? payload[0].value.toPrecision(4) - : payload[0].value} - {" "} - {unit} -

-
-
-
- ); - } - }; - - return ( - <> - - - : - } - isAnimationActive={false} - allowEscapeViewBox={{ x: true, y: true }} - /> - { - setIsTooltipVisible(true); - }} - onMouseLeave={() => setIsTooltipVisible(false)} - cursor="pointer" - /> - - - - - ); -} -type PlainAreaChartProps = { - data: Timeseries; - color?: string; -}; - -export function PlainAreaChart({ - data, - color = "#d1d5db", -}: PlainAreaChartProps) { - const formattedData = formatTimeseriesData(data); - - return ( - <> - - - - - - - ); -} diff --git a/app.old/src/app/(pages)/provide/components/DeviceDetailSidebar.tsx b/app.old/src/app/(pages)/provide/components/DeviceDetailSidebar.tsx deleted file mode 100644 index cff5005..0000000 --- a/app.old/src/app/(pages)/provide/components/DeviceDetailSidebar.tsx +++ /dev/null @@ -1,245 +0,0 @@ -import { postStatsProviderLast90 } from "@/app/_lib/api"; -import { ClientTransferData, Provider24h } from "@/app/_lib/types"; -import { Popover, Tab, Transition } from "@headlessui/react"; -import { DevicePhoneMobileIcon, XMarkIcon } from "@heroicons/react/24/outline"; -import { useQuery } from "@tanstack/react-query"; -import { BarChart } from "./Chart"; -import { ChartBarIcon } from "@heroicons/react/24/solid"; -import UptimeWidget from "./UptimeWidget"; -import ActivityWidget, { NUM_DAYS } from "./ActivityWidget"; -import { formatTimeseriesData } from "@/app/_lib/utils"; -import { useState } from "react"; - -type ChartItem = { - name: string; - key: string; - pre_unit?: string; - unit?: string; -}; - -const charts: Array = [ - { - name: "Data", - key: "transfer_data", - unit: "GiB", - }, - { - name: "Income", - key: "payout", - pre_unit: "$", - }, - { - name: "Uptime", - key: "uptime", - unit: "hours", - }, - { - name: "Searches", - key: "search_interest", - }, - { - name: "Devices", - key: "clients", - }, -]; - -type DeviceDetailSidebarProps = { - selectedProvider: Provider24h | undefined; - setSelectedProvider: CallableFunction; -}; - -export default function DeviceDetailSidebar({ - selectedProvider, - setSelectedProvider, -}: DeviceDetailSidebarProps) { - const [showTooltip, setShowTooltip] = useState(false); - - const { isPending, data: provider } = useQuery({ - queryKey: ["stats", "provider-last-90", selectedProvider?.client_id], - queryFn: async () => - await postStatsProviderLast90({ - client_id: selectedProvider?.client_id || "", - }), - enabled: !!selectedProvider, - }); - - const isOpen = selectedProvider != null; - - const getFormattedActivityData = (client: ClientTransferData) => { - return formatTimeseriesData(client.transfer_data).slice(-NUM_DAYS); - }; - - /** Find the max transfer data value across all connected devices */ - const getMaxTransferData = (clientDetails: ClientTransferData[]) => { - const aggregate = clientDetails.flatMap((clientDetail) => - formatTimeseriesData(clientDetail.transfer_data).slice(-NUM_DAYS) - ); - return Math.max(...aggregate.map((entry) => Number(entry.value))); - }; - - return ( - - - - -
-
- setSelectedProvider(null)} - /> -
- - {isPending && ( - <> -
- - )} - - {!isPending && provider && ( -
- {/* Title (device name) */} -
-

- {selectedProvider?.client_id} -

-

- Created on {provider?.created_time} -

-
- {/* Tab bar */} -
- - - -
- -

Charts

-
-
- -
- -

Connections

-
-
-
- - {/* Charts tab */} - -
- {/* Uptime graphic */} -
-

- Uptime (past 24 hours) -

-
- -
-
- {/* Charts */} -
-

- Past 90 days -

-
- {charts.map((chart) => ( -
- {/*
*/} - {/* - - */} -
- {chart.name} -
- -
- ))} -
-
-
- - - {/* Connections tab */} - - {/* Connections table */} -
-

- Connected devices -

- - - - {provider.client_details?.length == 0 && ( - - - - )} - {provider?.client_details.map((client) => ( - - - - - ))} - -
- No devices found -
- {client.client_id} - - -
-
-
- - -
- )} -
- - - - - ); -} diff --git a/app.old/src/app/(pages)/provide/components/DevicesTable.tsx b/app.old/src/app/(pages)/provide/components/DevicesTable.tsx deleted file mode 100644 index 65b2d43..0000000 --- a/app.old/src/app/(pages)/provide/components/DevicesTable.tsx +++ /dev/null @@ -1,232 +0,0 @@ -import { NetworkClientsResult, Provider24h } from "@/app/_lib/types"; -import { classNames } from "@/app/_lib/utils"; -import { Switch } from "@headlessui/react"; -import DeviceDetailSidebar from "./DeviceDetailSidebar"; -import { useState } from "react"; -import UptimeWidget from "./UptimeWidget"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { - getNetworkClients, - getStatsProviders, - postDeviceSetProvide, -} from "@/app/_lib/api"; - -const PROVIDE_MODE_FRIENDS_AND_FAMILY = 2; -const PROVIDE_MODE_PUBLIC = 3; - -type DevicesTableProps = {}; -type DeviceSetPayload = { - client_id: string; - provide_mode: number; -}; - -export default function DevicesTable({}: DevicesTableProps) { - const queryClient = useQueryClient(); - const [selectedProvider, setSelectedProvider] = useState< - Provider24h | undefined - >(); - - // Network requests - const { isPending: isDevicesPending, data: devices } = useQuery({ - queryKey: ["stats", "providers"], - queryFn: getStatsProviders, - }); - const providers = devices?.providers; - - const { isPending: isNetworkDevicesPending, data: clients } = useQuery({ - queryKey: ["network", "clients"], - queryFn: getNetworkClients, - }); - - const mutation = useMutation({ - mutationFn: ({ client_id, provide_mode }: DeviceSetPayload) => - postDeviceSetProvide({ - client_id: client_id, - provide_mode: provide_mode, - }), - onMutate: async ({ client_id, provide_mode }: DeviceSetPayload) => { - // Implement optimistic updates for 'provide' toggle - // https://tanstack.com/query/v4/docs/react/guides/optimistic-updates - await queryClient.cancelQueries({ queryKey: ["network", "clients"] }); - const previousNetworkClientsResult = queryClient.getQueryData([ - "network", - "clients", - ]); - queryClient.setQueryData( - ["network", "clients"], - (oldResult: NetworkClientsResult) => { - const clients = oldResult.clients; - const index = clients.findIndex( - (client) => client.client_id == client_id - ); - - if (~index) { - clients[index] = { - ...clients[index], - provide_mode: provide_mode, - }; - } - - return { clients: clients }; - } - ); - return { previousNetworkClientsResult }; - }, - onError: (err, newClient, context) => { - // Fallback to previous result on error - queryClient.setQueryData( - ["network", "clients"], - context?.previousNetworkClientsResult - ); - alert( - `Sorry, can't turn provide ${ - newClient.provide_mode == PROVIDE_MODE_PUBLIC ? "on" : "off" - } for device: ${newClient.client_id}` - ); - }, - onSettled: () => { - // Trigger a refetch of the network devices query - queryClient.invalidateQueries({ queryKey: ["network", "clients"] }); - }, - }); - - const handleProvideToggle = ( - provider: Provider24h, - setProvideOn: boolean - ) => { - const newProvideMode = setProvideOn - ? PROVIDE_MODE_PUBLIC - : PROVIDE_MODE_FRIENDS_AND_FAMILY; - mutation.mutate({ - client_id: provider.client_id, - provide_mode: newProvideMode, - }); - }; - - const getClient = (clientId: string) => { - const client = clients?.clients?.find( - (client) => clientId == client.client_id - ); - if (!client) { - return null; - } - return client; - }; - - const isProviding = (clientId: string) => { - const client = getClient(clientId); - return client?.provide_mode == PROVIDE_MODE_PUBLIC; - }; - - const getNumConnections = (clientId: string) => { - const client = getClient(clientId); - return client?.connections?.length || 0; - }; - - if (isDevicesPending) { - return
; - } - - return ( - <> - -
- - - - - - - - - - - {providers?.map((provider) => ( - { - setSelectedProvider(provider); - }} - > - - - - - - - - ))} - -
- - - Data transferred - - Income - - Uptime - - Search interest -
- {provider.client_id} - -
- {isNetworkDevicesPending && ( - <> -
- - )} - - {!isNetworkDevicesPending && ( - <> - event.stopPropagation()} - onChange={(newState) => - handleProvideToggle(provider, newState) - } - className={classNames( - isProviding(provider.client_id) - ? "bg-green-600" - : "bg-gray-200", - "relative inline-flex h-4 w-7 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none" - )} - > - Use setting - -

- {getNumConnections(provider.client_id)} -  connections -

- - )} -
-
- {provider.transfer_data_last_24h.toPrecision(4)}{" "} - GiB - - ${provider.payout_last_24h.toPrecision(4)} - -
- -
-
- {provider.search_interest_last_24h} -
-
- - ); -} diff --git a/app.old/src/app/(pages)/provide/components/UptimeWidget.tsx b/app.old/src/app/(pages)/provide/components/UptimeWidget.tsx deleted file mode 100644 index c316d3a..0000000 --- a/app.old/src/app/(pages)/provide/components/UptimeWidget.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import { zip } from "@/app/_lib/utils"; -import moment from "moment"; -import { useEffect, useRef, useState } from "react"; - -type UptimeWidgetProps = { - data: { - event_time: string; - connected: boolean; - }[]; -}; - -type UptimeSegment = { - start_string: string; - end_string: string; - start_date: number; - end_date: number; - connected: boolean; -}; - -export default function UptimeWidget({ data }: UptimeWidgetProps) { - // Scale factor to convert between dates, and pixel widths - const [scaleFactor, setScaleFactor] = useState(); - const [svgWidth, setSvgWidth] = useState(); - const [svgHeight, setSvgHeight] = useState(); - const [tooltipSegment, setTooltipSegment] = useState(); - const [showNullTooltip, setShowNullTooltip] = useState(false); - - const divRef = useRef(null); - const segments = zip( - data.slice(0, data.length - 1), - data.slice(1, data.length) - ).map(([start, end]) => { - return { - start_string: start.event_time, - end_string: end.event_time, - start_date: Date.parse(start.event_time), - end_date: Date.parse(end.event_time), - connected: start.connected, - }; - }); - - const firstEntry = segments[0]; - const lastEntry = segments.slice(-1)[0]; - - useEffect(() => { - const width = divRef.current?.clientWidth; - if (width) { - setSvgWidth(width); - setScaleFactor(width / (lastEntry.end_date - firstEntry.start_date)); - } - setSvgHeight(divRef.current?.clientHeight); - }, []); - - if (!data || data.length == 0) { - return ( -
setShowNullTooltip(true)} - onMouseLeave={() => setShowNullTooltip(false)} - > -
-
-

No uptime data found.

-
-
-
- ); - } - - const showTooltip = (segment: UptimeSegment) => { - setTooltipSegment(segment); - }; - const hideTooltip = () => { - setTooltipSegment(undefined); - }; - - return ( -
- {tooltipSegment && scaleFactor && ( -
- {tooltipSegment && ( -
-

- {moment(tooltipSegment.start_string).format("YYYY-MM-DD H:mm")} - {" - "} - {moment(tooltipSegment.end_string).format("H:mm")} -

- {tooltipSegment.connected && ( -

- Connected for{" "} - {moment(tooltipSegment.end_string).diff( - moment(tooltipSegment.start_string), - "minutes" - )}{" "} - minutes. -

- )} - {!tooltipSegment.connected && ( -

- Disconnected for{" "} - {moment(tooltipSegment.end_string).diff( - moment(tooltipSegment.start_string), - "minutes" - )}{" "} - minutes. -

- )} -
- )} -
- )} - - {scaleFactor && - segments.map((segment) => ( - showTooltip(segment)} - onMouseLeave={() => hideTooltip()} - /> - ))} - -
- ); -} diff --git a/app.old/src/app/(pages)/provide/loading.tsx b/app.old/src/app/(pages)/provide/loading.tsx deleted file mode 100644 index 6df12d1..0000000 --- a/app.old/src/app/(pages)/provide/loading.tsx +++ /dev/null @@ -1,21 +0,0 @@ -export default function Loading() { - return ( - <> -
-
-
- {Array(5) - .fill(0) - .map((item, index) => ( -
- ))} -
-
-
-
- - ); -} diff --git a/app.old/src/app/(pages)/provide/page.tsx b/app.old/src/app/(pages)/provide/page.tsx deleted file mode 100644 index 1df8a43..0000000 --- a/app.old/src/app/(pages)/provide/page.tsx +++ /dev/null @@ -1,191 +0,0 @@ -"use client"; - -import { useQuery } from "@tanstack/react-query"; -import Loading from "./loading"; -import { getStatsProviders, getStatsProvidersOverviewLast90 } from "@lib/api"; -import { useState } from "react"; -import { ChevronDownIcon } from "@heroicons/react/20/solid"; -import { Listbox } from "@headlessui/react"; -import { BarChart, PlainAreaChart } from "./components/Chart"; -import DevicesTable from "./components/DevicesTable"; -import { debug } from "console"; - -type HeaderItem = { - name: string; - key: string; - pre_unit?: string; - unit?: string; - helpText?: string; -}; - -const headerItems: Array = [ - { - name: "Data transferred", - key: "transfer_data", - unit: "GiB", - }, - { - name: "Income", - key: "payout", - pre_unit: "$", - }, - { - name: "Uptime", - key: "uptime", - unit: "hours", - }, - { - name: "Searches", - key: "search_interest", - }, - { - name: "Devices", - key: "clients", - }, -]; - -export default function Page() { - const [selectedStat, setSelectedStat] = useState(headerItems[0]); - - const { isPending: isOverviewPending, data: stats } = useQuery({ - queryKey: ["stats", "providers", "overviewLast90"], - queryFn: getStatsProvidersOverviewLast90, - }); - - const getStatToday = (key: string) => { - if (stats && stats[key]) { - const mostRecentDate = Object.keys(stats[key]).toReversed()[0]; - return stats[key][mostRecentDate]?.toPrecision(4); - } - return ""; - }; - - const getStatAllTime = (key: string) => { - if (stats && stats[key]) { - return stats[key]; - } - return []; - }; - - return ( - <> -
-
-

Provide

-
- - {isOverviewPending && } - - {!isOverviewPending && ( -
- {/* Header showing stats */} -
-

- Past 24 hours -

-
- {headerItems.map((item) => { - return ( -
{ - setSelectedStat(item); - }} - className={`w-1/5 flex flex-col gap-0 border rounded-md overflow-hidden cursor-pointer hover:border-indigo-600 shadow-md ${ - selectedStat.key == item.key - ? "border-indigo-600 border-2" - : "border-gray-300" - }`} - > -
-

- {item.name} -

-

- - {item.pre_unit} - {getStatToday(item.key)} - {" "} - - {item.unit} - -

-
-
- -
-
- ); - })} -
-
- - {/* 90 Day chart */} -
-

- Past 90 days -

-
- - {/* Dropdown in the top left of the chart */} - - -

{selectedStat.name}

- -
- - {headerItems.map((item) => ( - - {item.name} - - ))} - -
-
-
-
-

Devices

- -
-
- )} -
- - ); -} diff --git a/app.old/src/app/_lib/api.ts b/app.old/src/app/_lib/api.ts deleted file mode 100644 index 94c6356..0000000 --- a/app.old/src/app/_lib/api.ts +++ /dev/null @@ -1,241 +0,0 @@ -/** - * All code that makes calls to the BringYour API lives in this file. - */ - -import { redirect } from "next/navigation"; -import { - AuthCodeLoginResult, - DeviceAddResult, - DeviceAdoptStatusResult, - DeviceAssociationsResult, - DeviceConfirmShareResult, - DeviceCreateShareCodeResult, - DeviceRemoveAssociationResult, - DeviceSetProvideResult, - DeviceShareStatusResult, - NetworkClientsResult, - RemoveNetworkClientResult, - StatsProviderLast90, - StatsProviders, - StatsProvidersOverviewLast90Result, - SubscriptionBalanceResult, - SubscriptionCheckBalanceCodeResult, - SubscriptionRedeemBalanceCodeResult, -} from "./types"; - -const API_URL = process.env.NEXT_PUBLIC_API_URL || "https://api.bringyour.com/"; -export const LOGIN_URL = "https://bringyour.com?auth"; - -export function getLoginUrl() { - if (!window || !window.location) { - return LOGIN_URL; - } - - const encodedRedirectUri = encodeURI(window.location.href); - return `${LOGIN_URL}&redirect-uri-after-auth=${encodedRedirectUri}`; -} - -export function getJwt() { - if (typeof localStorage == "undefined") { - return null; - } - return localStorage.getItem("byJwt"); -} - -export function removeJwt() { - if (typeof localStorage == "undefined") { - return; - } - - localStorage.removeItem("byJwt"); -} - -/** - * A GET request with authentication and error handling - */ -async function makeGetRequest(endpoint: string) { - const byJwt = getJwt(); - const response = await fetch(`${API_URL}${endpoint}`, { - headers: { - Authorization: `Bearer ${byJwt}`, - }, - }); - - if (!response.ok) { - if ([401, 403].includes(response.status)) { - // Unauthorized. User needs to refresh JWT token - removeJwt(); - redirect(LOGIN_URL); - } - - // Todo(awais): Improve error handling on network requests - throw new Error("Failed to fetch"); - } - - const result = await response.json(); - - if (result.error && result.error.message) { - const errorMessage: any = result.error.message; - alert(`Sorry, there was a problem:\n${errorMessage}`); - } - - return Promise.resolve(result); -} - -/** - * A POST request with authentication and error handling - */ -async function makePostRequest(endpoint: string, body: object) { - const byJwt = getJwt(); - const response = await fetch(`${API_URL}${endpoint}`, { - method: "POST", - headers: { - Authorization: `Bearer ${byJwt}`, - }, - body: JSON.stringify(body), - }); - - if (!response.ok) { - throw new Error("Post request failed"); - } - - const result = await response.json(); - - if (result.error && result.error.message) { - const errorMessage: any = result.error.message; - alert(`Sorry, there was a problem:\n${errorMessage}`); - } - - return Promise.resolve(result); -} - -/** - * Similar to a GET request, however this returns a Blob() object instead - * of parsing the response as json. - */ -async function makeResourceRequest(endpoint: string) { - const byJwt = getJwt(); - const response = await fetch(`${API_URL}${endpoint}`, { - headers: { - Authorization: `Bearer ${byJwt}`, - }, - }); - - return response.blob(); -} - -/** - * Swap authorization code for an access token (JWT) - */ -export async function postAuthCodeLogin( - auth: string -): Promise { - const response = await fetch(`${API_URL}auth/code-login`, { - method: "POST", - body: JSON.stringify({ auth_code: auth }), - }); - - if (!response.ok) { - if (response.status >= 400 && response.status < 500) { - throw new Error("API rejected the access token"); - } - throw new Error("Failed to log in."); - } - return await response.json(); -} - -export async function getNetworkClients(): Promise { - return makeGetRequest("network/clients"); -} - -export async function getSubscriptionBalance(): Promise { - return makeGetRequest("subscription/balance"); -} - -export async function getStatsProvidersOverviewLast90(): Promise { - return makeGetRequest("stats/providers-overview-last-90"); -} - -export async function getStatsProviders(): Promise { - return makeGetRequest("stats/providers"); -} - -export async function postStatsProviderLast90(body: { - client_id: string; -}): Promise { - return makePostRequest("stats/provider-last-90", body); -} - -export async function postRemoveNetworkClient(body: { - client_id: string; -}): Promise { - return makePostRequest("network/remove-client", body); -} - -export async function postDeviceSetProvide(body: { - client_id: string; - provide_mode: number; -}): Promise { - return makePostRequest("device/set-provide", body); -} - -export async function postDeviceAdd(body: { - code: string; -}): Promise { - return makePostRequest("device/add", body); -} - -export async function postDeviceCreateShareCode(body: { - client_id: string; - device_name: string; -}): Promise { - return makePostRequest("device/create-share-code", body); -} - -export async function getDeviceShareCodeQR(share_code: string) { - const imgData = await makeResourceRequest( - `device/share-code/${share_code}/qr.png` - ); - return URL.createObjectURL(imgData); -} - -export async function postDeviceShareStatus(body: { - share_code: string; -}): Promise { - return makePostRequest("device/share-status", body); -} - -export async function postDeviceConfirmShare(body: { - share_code: string; - associated_network_name: string | null; -}): Promise { - return makePostRequest("device/confirm-share", body); -} - -export async function postDeviceAdoptStatus(body: { - share_code: string; -}): Promise { - return makePostRequest("device/adopt-status", body); -} - -export async function getDeviceAssociations(): Promise { - return makeGetRequest("device/associations"); -} - -export async function postDeviceRemoveAssociation(body: { - code: string; -}): Promise { - return makePostRequest("device/remove-association", body); -} - -export async function postSubscriptionCheckBalanceCode(body: { - secret: string; -}): Promise { - return makePostRequest("subscription/check-balance-code", body); -} - -export async function postSubscriptionRedeemBalanceCode(body: { - secret: string; -}): Promise { - return makePostRequest("subscription/redeem-balance-code", body); -} diff --git a/app.old/src/app/_lib/components/Breadcrumbs.tsx b/app.old/src/app/_lib/components/Breadcrumbs.tsx deleted file mode 100644 index 46e5631..0000000 --- a/app.old/src/app/_lib/components/Breadcrumbs.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { ChevronLeftIcon } from "@heroicons/react/24/outline"; -import React from "react"; - -export type BreadcrumbItem = { - title: string; - url: string; -}; - -export function Breadcrumbs({ items }: { items: BreadcrumbItem[] }) { - return ( -
- {items.map((item, index) => ( - - {index != 0 &&
/
} -
- {index == 0 && } - {item.title} -
-
- ))} -
- ); -} diff --git a/app.old/src/app/_lib/components/Button.tsx b/app.old/src/app/_lib/components/Button.tsx deleted file mode 100644 index 0d2eb61..0000000 --- a/app.old/src/app/_lib/components/Button.tsx +++ /dev/null @@ -1,62 +0,0 @@ -// Async button; shows a loading spinner while query is running - -import React, { useState } from "react"; - -function SmallSpinner() { - return ( -
- - Loading... -
- ); -} - -export type ButtonProps = { - onClick?: (event: React.MouseEvent) => Promise; - className?: string; - disabled?: boolean; - children: React.ReactNode; -}; - -export default function Button({ - onClick, - className = "", - disabled = false, - children, -}: ButtonProps) { - const [isLoading, setIsLoading] = useState(false); - - const handleClick = async (event: React.MouseEvent) => { - setIsLoading(true); - if (!!onClick) { - await onClick(event); - } - setIsLoading(false); - }; - - return ( - - ); -} diff --git a/app.old/src/app/_lib/components/ConfirmDeleteModal.tsx b/app.old/src/app/_lib/components/ConfirmDeleteModal.tsx deleted file mode 100644 index 07f5755..0000000 --- a/app.old/src/app/_lib/components/ConfirmDeleteModal.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { Dialog } from "@headlessui/react"; -import { ExclamationTriangleIcon, XMarkIcon } from "@heroicons/react/24/solid"; -import Button from "./Button"; - -type ConfirmDeleteModalProps = { - isOpen: boolean; - setIsOpen: (value: boolean) => void; - onConfirm: any; - children: React.ReactNode; -}; - -export function ConfirmDeleteModal({ - isOpen, - setIsOpen, - onConfirm, - children, -}: ConfirmDeleteModalProps) { - const handleCancelClicked = async ( - event: React.MouseEvent - ) => { - setIsOpen(false); - }; - - const handleConfirmClicked = async ( - event: React.MouseEvent - ) => { - await onConfirm(); - await new Promise((resolve) => - setTimeout(() => resolve(setIsOpen(false)), 500) - ); - }; - - return ( - setIsOpen(false)} - > - {/* The backdrop, rendered as a fixed sibling to the panel container */} - - ); -} diff --git a/app.old/src/app/_lib/components/LoadingSpinner.tsx b/app.old/src/app/_lib/components/LoadingSpinner.tsx deleted file mode 100644 index fa4e1e2..0000000 --- a/app.old/src/app/_lib/components/LoadingSpinner.tsx +++ /dev/null @@ -1,61 +0,0 @@ -// Code pulled from https://github.com/davidhu2000/react-spinners/blob/main/src/PulseLoader.tsx -// with some modifications to make it tailwind-appropriate. - -import * as React from "react"; - -const createAnimation = ( - loaderName: string, - frames: string, - suffix: string -): string => { - const animationName = `react-spinners-${loaderName}-${suffix}`; - - if (typeof window == "undefined" || !window.document) { - return animationName; - } - - const styleEl = document.createElement("style"); - document.head.appendChild(styleEl); - const styleSheet = styleEl.sheet; - - const keyFrames = ` - @keyframes ${animationName} { - ${frames} - } - `; - - if (styleSheet) { - styleSheet.insertRule(keyFrames, 0); - } - - return animationName; -}; - -const pulse = createAnimation( - "PulseLoader", - "0% {transform: scale(1); opacity: 1} 45% {transform: scale(0.1); opacity: 0.7} 80% {transform: scale(1); opacity: 1}", - "pulse" -); - -function PulseLoader({ className }: { className: string }): JSX.Element | null { - const style = (i: number): React.CSSProperties => { - return { - animation: `${pulse} ${1.5}s ${ - i * 0.2 - }s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08)`, - animationFillMode: "both", - }; - }; - - const dotClassName = "bg-[#2B3A82] w-4 h-4 mx-1 rounded-full inline-block"; - - return ( -
- - - -
- ); -} - -export default PulseLoader; diff --git a/app.old/src/app/_lib/types.ts b/app.old/src/app/_lib/types.ts deleted file mode 100644 index ae89097..0000000 --- a/app.old/src/app/_lib/types.ts +++ /dev/null @@ -1,209 +0,0 @@ -export type AuthCodeLoginResult = { - by_jwt: string; - error?: { - message: string; - }; -}; - -export type Client = { - client_id: string; - description: string; - device_spec: string; - network_id: string; - connections: object[]; - provide_mode: number; -}; - -export type NetworkClientsResult = { - clients: Array; -}; - -type WalletInfo = { - wallet_id: string; - token_id: string; - blockchain: string; - blockchain_symbol: string; - create_date: string; - balance_usdc_nano_cents: 0; - address: string; -}; - -type SubscriptionInfo = { - subscription_id: string; - store: string; - plan: string; -}; - -export type SubscriptionBalanceResult = { - balance_byte_count: number; - current_subscription: SubscriptionInfo; - active_transfer_balances: Array; - pending_payout_usd_nano_cents: number; - wallet_info: WalletInfo; - update_time: string; -}; - -// The key is technically a string representing a date, but can't type that. -export type Timeseries = { [key: string]: string | number }; - -export type TimeseriesEntry = { - date: string; - value: string | number; -}; - -export type Provider24h = { - client_id: string; - connected: boolean; - connected_events_last_24h: { - event_time: string; - connected: boolean; - }[]; - uptime_last_24h: number; - transfer_data_last_24h: number; - payout_last_24h: number; - search_interest_last_24h: number; - contracts_last_24h: number; - clients_last_24h: number; -}; - -export type StatsProviders = { - created_time: string; - providers: Provider24h[]; -}; - -export type StatsProvidersOverviewLast90Result = { - [index: string]: any; - lookback: number; - created_time: string; - uptime: Timeseries; - transfer_data: Timeseries; - payout: Timeseries; - search_interest: Timeseries; - contracts: Timeseries; - clients: Timeseries; -}; - -export type ClientTransferData = { - client_id: string; - transfer_data: Timeseries; -}; - -export type StatsProviderLast90 = { - [index: string]: any; - lookback: number; - created_time: string; - uptime: Timeseries; - transfer_data: Timeseries; - payout: Timeseries; - search_interest: Timeseries; - contracts: Timeseries; - clients: Timeseries; - client_details: ClientTransferData[]; -}; - -export type RemoveNetworkClientResult = { - error?: { - message: string; - }; -}; - -export type DeviceSetProvideResult = { - provide_mode: number; - error?: { - message: string; - }; -}; - -export type DeviceAddResult = { - code_type: string; // share | adopt - code: string; - network_name: string; - client_id: string; - error?: { - message: string; - }; -}; - -export type DeviceCreateShareCodeResult = { - share_code: string; - error?: { - message: string; - }; -}; - -export type DeviceShareStatusResult = { - pending: boolean; - associated_network_name: string; - error?: { - message: string; - }; -}; - -export type DeviceConfirmShareResult = { - complete: boolean; - associated_network_name: string; - error?: { - message: string; - }; -}; - -export type DeviceAdoptStatusResult = { - pending: boolean; - associated_network_name: string; - error?: { - message: string; - }; -}; - -export type DeviceAssociationsResult = { - pending_adoption_devices: { - code: string; - device_name: string; - client_id: string; - }[]; - incoming_shared_devices: { - pending: boolean; - code: string; - device_name: string; - client_id: string; - network_name: string; - }[]; - outgoing_shared_devices: { - pending: boolean; - code: string; - device_name: string; - client_id: string; - network_name?: string; - }[]; -}; - -export type DeviceRemoveAssociationResult = { - client_id: string; - network_name: string; - error?: { - message: string; - }; -}; - -export type SubscriptionCheckBalanceCodeResult = { - balance?: { - start_time: string; - end_time: string; - balance_byte_count: number; - }; - error?: { - message: string; - }; -}; - -export type SubscriptionRedeemBalanceCodeResult = { - transfer_balance?: { - transfer_balance_id: string; - start_time: string; - end_time: string; - balance_byte_count: number; - }; - error?: { - message: string; - }; -}; diff --git a/app.old/src/app/_lib/utils.ts b/app.old/src/app/_lib/utils.ts deleted file mode 100644 index 5e60457..0000000 --- a/app.old/src/app/_lib/utils.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Timeseries, TimeseriesEntry } from "./types"; - -export function classNames(...classes: string[]) { - return classes.filter(Boolean).join(" "); -} - -/** Combine two arrays of the same length together into an array of 2-tuples. - * - * E.g. zip([a, b, c], [1, 2, 3]) = [(a, 1), (b, 2), (c, 3)] - */ -export function zip(a: Array, b: Array) { - return a.map((k, i) => [k, b[i]]); -} - -/** - * Take timeseries data as it arrives from the API: - * { - * "yyyy-mm-dd1": 0, - * "yyyy-mm-dd2": 0, - * } - * - * and convert it into the format required by the charting library: - * [ - * { - * date: "yyyy-mm-dd", - * value: 0, - * }, - * ] - * - * This function also sorts the data chronologically by date. - */ -export function formatTimeseriesData(data: Timeseries): TimeseriesEntry[] { - return Object.entries(data) - .map(([key, value]) => ({ - date: key, - value: value, - })) - .toSorted((a, b) => { - const dateA = Date.parse(a.date); - const dateB = Date.parse(b.date); - - if (dateA == dateB) { - return 0; - } else if (dateA > dateB) { - return 1; - } else { - return -1; - } - }); -} - -/** - * This function is from: https://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript - */ -export function prettyPrintByteCount(byteCount: number, decimals = 0) { - if (!+byteCount) return "0 Bytes"; - - const k = 1024; - const dm = decimals < 0 ? 0 : decimals; - const sizes = [ - "Bytes", - "KiB", - "MiB", - "GiB", - "TiB", - "PiB", - "EiB", - "ZiB", - "YiB", - ]; - - const i = Math.floor(Math.log(byteCount) / Math.log(k)); - - return `${parseFloat((byteCount / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`; -} diff --git a/app.old/src/app/apple-icon.png b/app.old/src/app/apple-icon.png deleted file mode 100644 index 408c8aa09bb53cf13eeeeeacf0a9ed1e61bb0952..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11371 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 diff --git a/app.old/src/app/error.tsx b/app.old/src/app/error.tsx deleted file mode 100644 index ce0a63e..0000000 --- a/app.old/src/app/error.tsx +++ /dev/null @@ -1,32 +0,0 @@ -"use client"; - -import { useEffect } from "react"; - -// Todo: Make a real error page that actually looks like there was an error -export default function Error({ - error, - reset, -}: { - error: Error & { digest?: string }; - reset: () => void; -}) { - useEffect(() => { - // Log the error to an error reporting service - console.error(error); - }, [error]); - - return ( -
-

Sorry, something went wrong!

- -
- ); -} diff --git a/app.old/src/app/favicon.png b/app.old/src/app/favicon.png deleted file mode 100644 index 5141653b40730a9b440ff7b806cbb0d40f356fb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15162 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 S&-_<|DkGsNUMFfC^8WxNBmdk0 diff --git a/app.old/src/app/favicon.svg b/app.old/src/app/favicon.svg deleted file mode 100644 index bca38c3..0000000 --- a/app.old/src/app/favicon.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - Favicon - - - - - - - - - - \ No newline at end of file diff --git a/app.old/src/app/global-error.tsx b/app.old/src/app/global-error.tsx deleted file mode 100644 index 01fe25b..0000000 --- a/app.old/src/app/global-error.tsx +++ /dev/null @@ -1,19 +0,0 @@ -"use client"; - -// Todo: Create a real global error page... -export default function GlobalError({ - error, - reset, -}: { - error: Error & { digest?: string }; - reset: () => void; -}) { - return ( - - -

Sorry, something went wrong!

- - - - ); -} diff --git a/app.old/src/app/globals.css b/app.old/src/app/globals.css deleted file mode 100644 index 8868b08..0000000 --- a/app.old/src/app/globals.css +++ /dev/null @@ -1,49 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -:root { - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - } -} - -body { - @apply text-gray-900; -} - -h1 { - @apply text-4xl font-semibold; -} - -h2 { - @apply text-xl font-semibold; -} - -a { - @apply hover:underline; -} - -th { - font-weight: inherit; -} - -.card { - @apply border border-gray-300 bg-gray-100 rounded-md p-4 cursor-pointer hover:border-primary transition-all duration-150 hover:scale-[1.02]; -} - -.button { - @apply cursor-pointer py-2 px-4 rounded-md active:translate-y-0.5; -} - -.btn-primary { - @apply bg-primary hover:bg-primary-semidark border border-primary-semidark text-white disabled:bg-gray-400 disabled:border-none; -} diff --git a/app.old/src/app/icon1.svg b/app.old/src/app/icon1.svg deleted file mode 100644 index bca38c3..0000000 --- a/app.old/src/app/icon1.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - Favicon - - - - - - - - - - \ No newline at end of file diff --git a/app.old/src/app/icon2.png b/app.old/src/app/icon2.png deleted file mode 100644 index 5141653b40730a9b440ff7b806cbb0d40f356fb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15162 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 S&-_<|DkGsNUMFfC^8WxNBmdk0 diff --git a/app.old/src/app/icon3.png b/app.old/src/app/icon3.png deleted file mode 100644 index 3f2366781dc7b86f9bdeda3c841633831be88aca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13911 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

1yvnY-ctx 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 Tajm`oHE2nQ%8FDA>HqydsnSf~ diff --git a/app.old/src/app/icon4.png b/app.old/src/app/icon4.png deleted file mode 100644 index bb4d613f1adc21414a240e38a30217de216fdb30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9731 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 diff --git a/app.old/src/app/icon5.png b/app.old/src/app/icon5.png deleted file mode 100644 index 5db7d9d08479f13dc68f9681b6943a273bc56fc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1970 zcmV;j2Tk~iP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$`97#k$R9FeMR|{~HRTlozrVS;u z6tGXADUXUmsR+vAz;;?)pd%DT#K8e~aaLqt9d`j&*6l2cj*5>(Stw-~M;%ZR71ZjM z6$MO-j;7(mZYkaCd+vGMbN+kJJ@-U~8w4VX zWz~GfMU0af(|yPT+I*5`aeg&#u~=w8M_&k z;OZqZHxL=?h@5t%T;>Q{v4$p6AgaLxY#<{4lyR0qZsXnl*ULb|w}96zi&fD;=1idA zuRwB^!h{(o7#H)g7{i5%0N8mBEB%vkOt>;A21V6wz~&h-%A} za+xF69y~8tAkMr()(iV}JBa=ao1h6*q2L26D4+$~}C;3DRpXa0K1b#diF7(fZ58+D!DFBX0Y|DBdPdPN7lFvP3 zhEf*J88r?xECpyj9WDu;ulM=aLNX=xeqZ>9*moqh`;SGDP~gXR^Up_gB4@+k#|Vv&U6VUeKa#8+^3bs}fU zn$ROt;I{h*?0nRmyAmbp^x3XpS$aqSPJ1U3Qgy)!q4XUOqiN-CJTf5# zbD~bd)gOz#I0I((mSgc4Evg@WolEhPp*FsmE@KGPY85&aIMT?QwhpA{G@I;yd$W*2gkrsHtlPCS;F$3=wDV#&a|?8k8^Z#y2!n1}5b zKEy%8(SV(w(AV`!-~t*49B^49rk}>!qDg;cq!)(n3FUOn`?K&T@2A9739L5^)gv)Tay#j__Gd53Mjc5YSm+iqd!$nM6x(a#usl0eQDk^P~ z@{1gV-Q9zaTfdR!E>}O^*xmxZium(79b#jJ%K+%rOo|?kQ&)yb^OvK`)QTVXZ$qlS zl1uNeQEjin=)M@Fw^&iJuSk-Q&s~J%TV~*iv0gOu)hc?f5p(YuiTvCVNb~AYS#LmA zvjzJ;GNIMr#L5+E;a@KtmJV8qxlEw>`!Y0q^AR^aAz6#K#G8=4cr`{%;AX@JT!bV? zdp>A~o6B)9j850!>Ge8HoiZ$#EoiwE3yK|z22ufTXD^w~pQ4fjMYQs*C1h-@;tJ_i z==mAlTxvz>oxNo%Jy`rM)tu`ZsE~f8fl)kwGB8hcLW4J-EGRYnn=(rmQn~r;fO!O} zvCAOomNa}EK|^8-U!n!zSC+xoEN&I_U@$jz7BaQzc(!&IoZiqQ3DzgRmd{l0z=+rc zEFC*HSQJigRWzs^k%m#UOM}8Gi=M`RQAoe7*hEH$MWJJJb<>|tzb<|KmsiRa@*sxr z5qOtF+5{GeZ8^y(KlEX7ivlBxk(%4^!qK^yI(#BxqtvLjUBscb|K zW*L}@&iKyYuMY`8sBsWEJPh8Jv*3!uj2CL(!cp@{xclXb8Lf)KtWi_3DSH)ej*s}3 zT)!AbCp?7aQg0kM{pbh3vV_+ { - /** - * Route the user to the correct place, depending on whether they are logged in (i.e. have a - * JWT token in localstorage), or have provided an ?auth_code= URL parameter. - * - * If the user has a JWT token, and provides a new ?auth_code=, use the code to fetch a new JWT. - */ - if (!authParam && !isLoggedIn) { - // User needs to log in - redirect(getLoginUrl()); - } - - if (!authParam && isLoggedIn && pathname == "/") { - redirect("/devices"); - } - - if (!authParam) { - return; - } - - async function handleAuthParam(authParam: string) { - try { - const result = await postAuthCodeLogin(authParam); - localStorage.setItem("byJwt", result.by_jwt); - } catch (e: any) { - alert("Failed to log in. Please try again."); - removeJwt(); - router.push(getLoginUrl()); - } - } - handleAuthParam(authParam); - - router.push(`${pathname}?${queryParamsWithoutAuth}`); - }, [authParam]); - - // Set up Tanstack Query - const queryClient = new QueryClient(); - - return ( - - BringYour Manage Your Network - - {children} - - - ); -} diff --git a/app.old/src/app/page.tsx b/app.old/src/app/page.tsx deleted file mode 100644 index 77f0434..0000000 --- a/app.old/src/app/page.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function Page() { - return ( - <> -

- - ); -} diff --git a/app.old/tailwind.config.ts b/app.old/tailwind.config.ts deleted file mode 100644 index 0d05d9c..0000000 --- a/app.old/tailwind.config.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { Config } from "tailwindcss"; - -const config: Config = { - content: [ - "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", - "./src/components/**/*.{js,ts,jsx,tsx,mdx}", - "./src/app/**/*.{js,ts,jsx,tsx,mdx}", - ], - darkMode: "class", - theme: { - extend: { - colors: { - ok: "#15cd72", - danger: "#CD4439", - primary: { - DEFAULT: "#1D3150", - semidark: "#1a2c48", - dark: "#172740", - }, - secondary: { - DEFAULT: "#A5ACB9", - }, - devicesBlue: "#2B3A82", - provideGreen: "#1E644E", - accountBrown: "#5A4E53", - }, - spacing: { - "76": "19rem", - }, - width: { - "112": "28rem", - "128": "32rem", - }, - }, - }, - plugins: [require("@headlessui/tailwindcss")], -}; -export default config; diff --git a/app.old/tsconfig.json b/app.old/tsconfig.json deleted file mode 100644 index f7300b8..0000000 --- a/app.old/tsconfig.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": [ - "./src/*" - ], - "@lib/*": [ - "./src/app/_lib/*" - ] - } - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - "build/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/app/Dockerfile b/app/Dockerfile index f6b1f20..7422a67 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -1,6 +1,7 @@ FROM ubuntu:22.04 # see https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ +ARG TARGETPLATFORM ARG warp_env ENV WARP_ENV=$warp_env @@ -34,8 +35,8 @@ ADD dist /www/app COPY build/${WARP_ENV}/status.json /srv/warp/status/status.json -EXPOSE 80 +COPY build/$TARGETPLATFORM/app /usr/local/sbin/app # see https://ubuntu.com/blog/avoiding-dropped-connections-in-nginx-containers-with-stopsignal-sigquit STOPSIGNAL SIGQUIT -CMD ["nginx", "-g", "daemon off;"] +CMD ["/usr/local/sbin/app"] diff --git a/app/Makefile b/app/Makefile index d284df6..4048481 100644 --- a/app/Makefile +++ b/app/Makefile @@ -1,7 +1,12 @@ NODE_VERSION := v22.14.0 -all: clean build +all: init clean build + +init: + pip install -r ../requirements.txt + go clean -cache + go clean -modcache clean: rm -rf build @@ -18,6 +23,10 @@ build: $(MAKE) webpack python ../webgen/webgen.py clean nginx/gen.py python ../webgen/webgen.py build nginx/gen.py + env GOOS=linux GOARCH=arm64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/linux/arm64/ + env GOOS=linux GOARCH=amd64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/linux/amd64/ + env GOOS=darwin GOARCH=arm64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/darwin/arm64/ + env GOOS=darwin GOARCH=amd64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/darwin/amd64/ warp_build: $(MAKE) all diff --git a/app/go.mod b/app/go.mod new file mode 100644 index 0000000..6d4e12a --- /dev/null +++ b/app/go.mod @@ -0,0 +1,7 @@ +module github.com/urnetwork/web/app + +go 1.24.0 + +require github.com/urnetwork/warp v0.0.0 + +replace github.com/urnetwork/warp => ../../warp diff --git a/app/main.go b/app/main.go new file mode 100644 index 0000000..9e24bed --- /dev/null +++ b/app/main.go @@ -0,0 +1,22 @@ +package main + +import ( + "os" + + "github.com/urnetwork/warp" +) + +// this value is set via the linker, e.g. +// -ldflags "-X main.Version=$WARP_VERSION-$WARP_VERSION_CODE" +var Version string + +func main() { + configPath := "/etc/nginx/nginx.conf" + convertedConfigPath := "/etc/nginx/nginx_host.conf" + + err, exitCode := warp.Nginx(configPath, convertedConfigPath) + if err != nil { + panic(err) + } + os.Exit(exitCode) +} diff --git a/legal/Makefile b/legal/Makefile deleted file mode 100644 index 7d68076..0000000 --- a/legal/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# convert the master docx to a markdown that can be hand edited to clean up -# pandoc -f docx -t markdown BringYour\ Privacy\ Policy\ -\ v1.docx -o export2/privacyout.md - -# convert the markdown to a clean html -# pandoc -f markdown -t html terms.md -o build/terms.html - diff --git a/nginx/gen.py b/nginx/gen.py deleted file mode 100644 index 9409c46..0000000 --- a/nginx/gen.py +++ /dev/null @@ -1,9 +0,0 @@ -import uuid -import time -from datetime import datetime, timezone - -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified -http_last_modified = datetime.now(timezone.utc).strftime("%a, %d %b %Y %H:%M:%S %Z") - -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag -http_etag = uuid.uuid1().hex diff --git a/nginx/mime.types b/nginx/mime.types deleted file mode 100644 index c21a0d8..0000000 --- a/nginx/mime.types +++ /dev/null @@ -1,100 +0,0 @@ - -types { - text/html html htm shtml; - text/css css; - text/xml xml; - image/gif gif; - image/jpeg jpeg jpg; - application/javascript js; - application/atom+xml atom; - application/rss+xml rss; - - text/mathml mml; - text/plain txt; - text/vnd.sun.j2me.app-descriptor jad; - text/vnd.wap.wml wml; - text/x-component htc; - - image/avif avif; - image/png png; - image/svg+xml svg svgz; - image/tiff tif tiff; - image/vnd.wap.wbmp wbmp; - image/webp webp; - image/x-icon ico; - image/x-jng jng; - image/x-ms-bmp bmp; - - font/woff woff; - font/woff2 woff2; - font/ttf ttf; - - application/java-archive jar war ear; - application/json json; - application/mac-binhex40 hqx; - application/msword doc; - application/pdf pdf; - application/postscript ps eps ai; - application/rtf rtf; - application/vnd.apple.mpegurl m3u8; - application/vnd.google-earth.kml+xml kml; - application/vnd.google-earth.kmz kmz; - application/vnd.ms-excel xls; - application/vnd.ms-fontobject eot; - application/vnd.ms-powerpoint ppt; - application/vnd.oasis.opendocument.graphics odg; - application/vnd.oasis.opendocument.presentation odp; - application/vnd.oasis.opendocument.spreadsheet ods; - application/vnd.oasis.opendocument.text odt; - application/vnd.openxmlformats-officedocument.presentationml.presentation - pptx; - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet - xlsx; - application/vnd.openxmlformats-officedocument.wordprocessingml.document - docx; - application/vnd.wap.wmlc wmlc; - application/wasm wasm; - application/x-7z-compressed 7z; - application/x-cocoa cco; - application/x-java-archive-diff jardiff; - application/x-java-jnlp-file jnlp; - application/x-makeself run; - application/x-perl pl pm; - application/x-pilot prc pdb; - application/x-rar-compressed rar; - application/x-redhat-package-manager rpm; - application/x-sea sea; - application/x-shockwave-flash swf; - application/x-stuffit sit; - application/x-tcl tcl tk; - application/x-x509-ca-cert der pem crt; - application/x-xpinstall xpi; - application/xhtml+xml xhtml; - application/xspf+xml xspf; - application/zip zip; - - application/octet-stream bin exe dll; - application/octet-stream deb; - application/octet-stream dmg; - application/octet-stream iso img; - application/octet-stream msi msp msm; - - audio/midi mid midi kar; - audio/mpeg mp3; - audio/ogg ogg; - audio/x-m4a m4a; - audio/x-realaudio ra; - - video/3gpp 3gpp 3gp; - video/mp2t ts; - video/mp4 mp4; - video/mpeg mpeg mpg; - video/quicktime mov; - video/webm webm; - video/x-flv flv; - video/x-m4v m4v; - video/x-mng mng; - video/x-ms-asf asx asf; - video/x-ms-wmv wmv; - video/x-msvideo avi; -} diff --git a/Dockerfile b/web/Dockerfile similarity index 89% rename from Dockerfile rename to web/Dockerfile index 52a31ef..42e1f55 100644 --- a/Dockerfile +++ b/web/Dockerfile @@ -1,6 +1,7 @@ FROM ubuntu:22.04 # see https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ +ARG TARGETPLATFORM ARG warp_env ENV WARP_ENV=$warp_env @@ -30,7 +31,7 @@ RUN apt-get update && apt-get install -y \ RUN nginx -V ADD nginx/build/ /etc/nginx/ -ADD bringyour.com/build /www/bringyour.com +ADD ../bringyour.com/build /www/bringyour.com # make sure all static files can be read RUN find /www/bringyour.com -type d -exec chmod ugo=rx {} + @@ -38,8 +39,8 @@ RUN find /www/bringyour.com -type f -exec chmod ugo=r {} + COPY build/${WARP_ENV}/status.json /srv/warp/status/status.json -EXPOSE 80 +COPY build/$TARGETPLATFORM/web /usr/local/sbin/web # see https://ubuntu.com/blog/avoiding-dropped-connections-in-nginx-containers-with-stopsignal-sigquit STOPSIGNAL SIGQUIT -CMD ["nginx", "-g", "daemon off;"] +CMD ["/usr/local/sbin/web"] diff --git a/Makefile b/web/Makefile similarity index 74% rename from Makefile rename to web/Makefile index 01e91be..eed5b6b 100644 --- a/Makefile +++ b/web/Makefile @@ -1,12 +1,11 @@ NODE_VERSION := v20.10.0 - all: init clean build gen_components # brew install pandoc init: - pip install -r requirements.txt + pip install -r ../requirements.txt (. ${NVM_DIR}/nvm.sh && \ nvm install ${NODE_VERSION} && \ nvm exec ${NODE_VERSION} npm install html-validate -g && \ @@ -14,13 +13,17 @@ init: nvm exec ${NODE_VERSION} npm install uglify-js -g && \ nvm exec ${NODE_VERSION} npm install clean-css-cli -g && \ nvm exec ${NODE_VERSION} npm install purgecss -g) + go clean -cache + go clean -modcache clean: - python webgen/webgen.py clean bringyour.com/gen.py + python ../webgen/webgen.py clean bringyour.com/gen.py rm -rf build build: - python webgen/webgen.py build bringyour.com/gen.py + (. ${NVM_DIR}/nvm.sh && \ + nvm use ${NODE_VERSION} && \ + python ../webgen/webgen.py build bringyour.com/gen.py) # generate the api docs into the latest build npx -y @redocly/cli build-docs ${BRINGYOUR_HOME}/connect/api/bringyour.yml -o bringyour.com/build/api.html # npx -y @redocly/cli build-docs ${BRINGYOUR_HOME}/connect/api/gpt.yml -o bringyour.com/build/gpt.html @@ -29,12 +32,16 @@ build: pandoc -f markdown -t plain ${BRINGYOUR_HOME}/docs/legal/terms.md -o bringyour.com/build/terms.txt pandoc -f markdown -t plain ${BRINGYOUR_HOME}/docs/legal/vdp.md -o bringyour.com/build/vdp.txt # include altstore - cp -r altstore bringyour.com/build/altstore + cp -r ../altstore bringyour.com/build/altstore + env GOOS=linux GOARCH=arm64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/linux/arm64/ + env GOOS=linux GOARCH=amd64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/linux/amd64/ + env GOOS=darwin GOARCH=arm64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/darwin/arm64/ + env GOOS=darwin GOARCH=amd64 go build -ldflags "-X main.Version=${WARP_VERSION}" -o build/darwin/amd64/ warp_build: $(MAKE) all - python webgen/webgen.py clean nginx/gen.py - python webgen/webgen.py build nginx/gen.py + python ../webgen/webgen.py clean nginx/gen.py + python ../webgen/webgen.py build nginx/gen.py mkdir -p build/${WARP_ENV} echo "{\"version\":\"${WARP_VERSION}\",\"status\":\"ok\"}" > build/${WARP_ENV}/status.json @@ -80,8 +87,8 @@ local_routing_off: run_local: $(MAKE) build - python webgen/webgen.py clean nginx-local/gen.py - python webgen/webgen.py build nginx-local/gen.py + python ../webgen/webgen.py clean nginx-local/gen.py + python ../webgen/webgen.py build nginx-local/gen.py mkdir nginx-local/build/log $(MAKE) local_routing_on trap "$(MAKE) local_routing_off" EXIT && $(MAKE) run_local_nginx diff --git a/bringyour.com/.well-known/assetlinks.json b/web/bringyour.com/.well-known/assetlinks.json similarity index 100% rename from bringyour.com/.well-known/assetlinks.json rename to web/bringyour.com/.well-known/assetlinks.json diff --git a/bringyour.com/.well-known/pgp-key.txt b/web/bringyour.com/.well-known/pgp-key.txt similarity index 100% rename from bringyour.com/.well-known/pgp-key.txt rename to web/bringyour.com/.well-known/pgp-key.txt diff --git a/bringyour.com/.well-known/privacy.txt b/web/bringyour.com/.well-known/privacy.txt similarity index 100% rename from bringyour.com/.well-known/privacy.txt rename to web/bringyour.com/.well-known/privacy.txt diff --git a/bringyour.com/.well-known/security.txt b/web/bringyour.com/.well-known/security.txt similarity index 100% rename from bringyour.com/.well-known/security.txt rename to web/bringyour.com/.well-known/security.txt diff --git a/bringyour.com/apple-touch-icon.png b/web/bringyour.com/apple-touch-icon.png similarity index 100% rename from bringyour.com/apple-touch-icon.png rename to web/bringyour.com/apple-touch-icon.png diff --git a/bringyour.com/blog/index.html.j2 b/web/bringyour.com/blog/index.html.j2 similarity index 100% rename from bringyour.com/blog/index.html.j2 rename to web/bringyour.com/blog/index.html.j2 diff --git a/bringyour.com/blog/visual/index.html.j2 b/web/bringyour.com/blog/visual/index.html.j2 similarity index 100% rename from bringyour.com/blog/visual/index.html.j2 rename to web/bringyour.com/blog/visual/index.html.j2 diff --git a/bringyour.com/blog/visual/vis/client2vis/client2vis.js b/web/bringyour.com/blog/visual/vis/client2vis/client2vis.js similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/client2vis.js rename to web/bringyour.com/blog/visual/vis/client2vis/client2vis.js diff --git a/bringyour.com/blog/visual/vis/client2vis/export-high.json b/web/bringyour.com/blog/visual/vis/client2vis/export-high.json similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/export-high.json rename to web/bringyour.com/blog/visual/vis/client2vis/export-high.json diff --git a/bringyour.com/blog/visual/vis/client2vis/export-low.json b/web/bringyour.com/blog/visual/vis/client2vis/export-low.json similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/export-low.json rename to web/bringyour.com/blog/visual/vis/client2vis/export-low.json diff --git a/bringyour.com/blog/visual/vis/client2vis/export-med.json b/web/bringyour.com/blog/visual/vis/client2vis/export-med.json similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/export-med.json rename to web/bringyour.com/blog/visual/vis/client2vis/export-med.json diff --git a/bringyour.com/blog/visual/vis/client2vis/index-high.html b/web/bringyour.com/blog/visual/vis/client2vis/index-high.html similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/index-high.html rename to web/bringyour.com/blog/visual/vis/client2vis/index-high.html diff --git a/bringyour.com/blog/visual/vis/client2vis/index-low.html b/web/bringyour.com/blog/visual/vis/client2vis/index-low.html similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/index-low.html rename to web/bringyour.com/blog/visual/vis/client2vis/index-low.html diff --git a/bringyour.com/blog/visual/vis/client2vis/index-med.html b/web/bringyour.com/blog/visual/vis/client2vis/index-med.html similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/index-med.html rename to web/bringyour.com/blog/visual/vis/client2vis/index-med.html diff --git a/bringyour.com/blog/visual/vis/client2vis/index.html b/web/bringyour.com/blog/visual/vis/client2vis/index.html similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/index.html rename to web/bringyour.com/blog/visual/vis/client2vis/index.html diff --git a/bringyour.com/blog/visual/vis/client2vis/libraries/p5.min.js b/web/bringyour.com/blog/visual/vis/client2vis/libraries/p5.min.js similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/libraries/p5.min.js rename to web/bringyour.com/blog/visual/vis/client2vis/libraries/p5.min.js diff --git a/bringyour.com/blog/visual/vis/client2vis/sketch.properties b/web/bringyour.com/blog/visual/vis/client2vis/sketch.properties similarity index 100% rename from bringyour.com/blog/visual/vis/client2vis/sketch.properties rename to web/bringyour.com/blog/visual/vis/client2vis/sketch.properties diff --git a/bringyour.com/blog/visual/vis/latencymap/index.html b/web/bringyour.com/blog/visual/vis/latencymap/index.html similarity index 100% rename from bringyour.com/blog/visual/vis/latencymap/index.html rename to web/bringyour.com/blog/visual/vis/latencymap/index.html diff --git a/bringyour.com/blog/visual/vis/latencymap/latencymap.js b/web/bringyour.com/blog/visual/vis/latencymap/latencymap.js similarity index 100% rename from bringyour.com/blog/visual/vis/latencymap/latencymap.js rename to web/bringyour.com/blog/visual/vis/latencymap/latencymap.js diff --git a/bringyour.com/blog/visual/vis/latencymap/libraries/p5.min.js b/web/bringyour.com/blog/visual/vis/latencymap/libraries/p5.min.js similarity index 100% rename from bringyour.com/blog/visual/vis/latencymap/libraries/p5.min.js rename to web/bringyour.com/blog/visual/vis/latencymap/libraries/p5.min.js diff --git a/bringyour.com/blog/visual/vis/latencymap/sketch.properties b/web/bringyour.com/blog/visual/vis/latencymap/sketch.properties similarity index 100% rename from bringyour.com/blog/visual/vis/latencymap/sketch.properties rename to web/bringyour.com/blog/visual/vis/latencymap/sketch.properties diff --git a/bringyour.com/blog/visual/vis/linpath/index.html b/web/bringyour.com/blog/visual/vis/linpath/index.html similarity index 100% rename from bringyour.com/blog/visual/vis/linpath/index.html rename to web/bringyour.com/blog/visual/vis/linpath/index.html diff --git a/bringyour.com/blog/visual/vis/linpath/libraries/p5.min.js b/web/bringyour.com/blog/visual/vis/linpath/libraries/p5.min.js similarity index 100% rename from bringyour.com/blog/visual/vis/linpath/libraries/p5.min.js rename to web/bringyour.com/blog/visual/vis/linpath/libraries/p5.min.js diff --git a/bringyour.com/blog/visual/vis/linpath/linpath.js b/web/bringyour.com/blog/visual/vis/linpath/linpath.js similarity index 100% rename from bringyour.com/blog/visual/vis/linpath/linpath.js rename to web/bringyour.com/blog/visual/vis/linpath/linpath.js diff --git a/bringyour.com/blog/visual/vis/linpath/sketch.properties b/web/bringyour.com/blog/visual/vis/linpath/sketch.properties similarity index 100% rename from bringyour.com/blog/visual/vis/linpath/sketch.properties rename to web/bringyour.com/blog/visual/vis/linpath/sketch.properties diff --git a/bringyour.com/blog/visual/visual.md b/web/bringyour.com/blog/visual/visual.md similarity index 100% rename from bringyour.com/blog/visual/visual.md rename to web/bringyour.com/blog/visual/visual.md diff --git a/bringyour.com/client.js b/web/bringyour.com/client.js similarity index 100% rename from bringyour.com/client.js rename to web/bringyour.com/client.js diff --git a/bringyour.com/connect.js b/web/bringyour.com/connect.js similarity index 100% rename from bringyour.com/connect.js rename to web/bringyour.com/connect.js diff --git a/bringyour.com/connect_mock.js b/web/bringyour.com/connect_mock.js similarity index 100% rename from bringyour.com/connect_mock.js rename to web/bringyour.com/connect_mock.js diff --git a/bringyour.com/favicon-128.png b/web/bringyour.com/favicon-128.png similarity index 100% rename from bringyour.com/favicon-128.png rename to web/bringyour.com/favicon-128.png diff --git a/bringyour.com/favicon-180.png b/web/bringyour.com/favicon-180.png similarity index 100% rename from bringyour.com/favicon-180.png rename to web/bringyour.com/favicon-180.png diff --git a/bringyour.com/favicon-32.png b/web/bringyour.com/favicon-32.png similarity index 100% rename from bringyour.com/favicon-32.png rename to web/bringyour.com/favicon-32.png diff --git a/bringyour.com/favicon.png b/web/bringyour.com/favicon.png similarity index 100% rename from bringyour.com/favicon.png rename to web/bringyour.com/favicon.png diff --git a/bringyour.com/favicon.svg b/web/bringyour.com/favicon.svg similarity index 100% rename from bringyour.com/favicon.svg rename to web/bringyour.com/favicon.svg diff --git a/bringyour.com/flag.js b/web/bringyour.com/flag.js similarity index 100% rename from bringyour.com/flag.js rename to web/bringyour.com/flag.js diff --git a/bringyour.com/footer.js b/web/bringyour.com/footer.js similarity index 100% rename from bringyour.com/footer.js rename to web/bringyour.com/footer.js diff --git a/bringyour.com/gen.py b/web/bringyour.com/gen.py similarity index 100% rename from bringyour.com/gen.py rename to web/bringyour.com/gen.py diff --git a/bringyour.com/index.html.j2 b/web/bringyour.com/index.html.j2 similarity index 100% rename from bringyour.com/index.html.j2 rename to web/bringyour.com/index.html.j2 diff --git a/bringyour.com/lib-ur/bootstrap.bundle.min.js b/web/bringyour.com/lib-ur/bootstrap.bundle.min.js similarity index 100% rename from bringyour.com/lib-ur/bootstrap.bundle.min.js rename to web/bringyour.com/lib-ur/bootstrap.bundle.min.js diff --git a/bringyour.com/lib-ur/c.js b/web/bringyour.com/lib-ur/c.js similarity index 100% rename from bringyour.com/lib-ur/c.js rename to web/bringyour.com/lib-ur/c.js diff --git a/bringyour.com/lib-ur/connect-button.js b/web/bringyour.com/lib-ur/connect-button.js similarity index 100% rename from bringyour.com/lib-ur/connect-button.js rename to web/bringyour.com/lib-ur/connect-button.js diff --git a/bringyour.com/lib-ur/connect.js b/web/bringyour.com/lib-ur/connect.js similarity index 100% rename from bringyour.com/lib-ur/connect.js rename to web/bringyour.com/lib-ur/connect.js diff --git a/bringyour.com/lib/bootstrap.bundle.min.js b/web/bringyour.com/lib/bootstrap.bundle.min.js similarity index 100% rename from bringyour.com/lib/bootstrap.bundle.min.js rename to web/bringyour.com/lib/bootstrap.bundle.min.js diff --git a/bringyour.com/lib/d3.min.js b/web/bringyour.com/lib/d3.min.js similarity index 100% rename from bringyour.com/lib/d3.min.js rename to web/bringyour.com/lib/d3.min.js diff --git a/bringyour.com/lib/jquery.min.js b/web/bringyour.com/lib/jquery.min.js similarity index 100% rename from bringyour.com/lib/jquery.min.js rename to web/bringyour.com/lib/jquery.min.js diff --git a/bringyour.com/lib/p5.min.js b/web/bringyour.com/lib/p5.min.js similarity index 100% rename from bringyour.com/lib/p5.min.js rename to web/bringyour.com/lib/p5.min.js diff --git a/bringyour.com/lib/widgetbot.min.js b/web/bringyour.com/lib/widgetbot.min.js similarity index 100% rename from bringyour.com/lib/widgetbot.min.js rename to web/bringyour.com/lib/widgetbot.min.js diff --git a/bringyour.com/logo.js b/web/bringyour.com/logo.js similarity index 100% rename from bringyour.com/logo.js rename to web/bringyour.com/logo.js diff --git a/bringyour.com/manifest.json b/web/bringyour.com/manifest.json similarity index 100% rename from bringyour.com/manifest.json rename to web/bringyour.com/manifest.json diff --git a/bringyour.com/res-ur/images/icon-192x192.png b/web/bringyour.com/res-ur/images/icon-192x192.png similarity index 100% rename from bringyour.com/res-ur/images/icon-192x192.png rename to web/bringyour.com/res-ur/images/icon-192x192.png diff --git a/bringyour.com/res-ur/images/icon.png b/web/bringyour.com/res-ur/images/icon.png similarity index 100% rename from bringyour.com/res-ur/images/icon.png rename to web/bringyour.com/res-ur/images/icon.png diff --git a/bringyour.com/res-ur/images/icon.svg b/web/bringyour.com/res-ur/images/icon.svg similarity index 100% rename from bringyour.com/res-ur/images/icon.svg rename to web/bringyour.com/res-ur/images/icon.svg diff --git a/bringyour.com/res-ur/videos/solana_urnetwork_final.mp4 b/web/bringyour.com/res-ur/videos/solana_urnetwork_final.mp4 similarity index 100% rename from bringyour.com/res-ur/videos/solana_urnetwork_final.mp4 rename to web/bringyour.com/res-ur/videos/solana_urnetwork_final.mp4 diff --git a/bringyour.com/res-ur/videos/solana_urnetwork_web_comp1.mp4 b/web/bringyour.com/res-ur/videos/solana_urnetwork_web_comp1.mp4 similarity index 100% rename from bringyour.com/res-ur/videos/solana_urnetwork_web_comp1.mp4 rename to web/bringyour.com/res-ur/videos/solana_urnetwork_web_comp1.mp4 diff --git a/bringyour.com/res/css-ur/bootstrap.min.css b/web/bringyour.com/res/css-ur/bootstrap.min.css similarity index 100% rename from bringyour.com/res/css-ur/bootstrap.min.css rename to web/bringyour.com/res/css-ur/bootstrap.min.css diff --git a/bringyour.com/res/css-ur/connect.css b/web/bringyour.com/res/css-ur/connect.css similarity index 100% rename from bringyour.com/res/css-ur/connect.css rename to web/bringyour.com/res/css-ur/connect.css diff --git a/bringyour.com/res/css/bootstrap.min.css b/web/bringyour.com/res/css/bootstrap.min.css similarity index 100% rename from bringyour.com/res/css/bootstrap.min.css rename to web/bringyour.com/res/css/bootstrap.min.css diff --git a/bringyour.com/res/css/connect.css b/web/bringyour.com/res/css/connect.css similarity index 100% rename from bringyour.com/res/css/connect.css rename to web/bringyour.com/res/css/connect.css diff --git a/bringyour.com/res/css/main.css b/web/bringyour.com/res/css/main.css similarity index 100% rename from bringyour.com/res/css/main.css rename to web/bringyour.com/res/css/main.css diff --git a/bringyour.com/res/css/stats.css b/web/bringyour.com/res/css/stats.css similarity index 100% rename from bringyour.com/res/css/stats.css rename to web/bringyour.com/res/css/stats.css diff --git a/bringyour.com/res/emails/bringyour-wordmark-bg-240.jpg b/web/bringyour.com/res/emails/bringyour-wordmark-bg-240.jpg similarity index 100% rename from bringyour.com/res/emails/bringyour-wordmark-bg-240.jpg rename to web/bringyour.com/res/emails/bringyour-wordmark-bg-240.jpg diff --git a/bringyour.com/res/emails/ur-welcome-header-1080.jpg b/web/bringyour.com/res/emails/ur-welcome-header-1080.jpg similarity index 100% rename from bringyour.com/res/emails/ur-welcome-header-1080.jpg rename to web/bringyour.com/res/emails/ur-welcome-header-1080.jpg diff --git a/bringyour.com/res/emails/ur-welcome-header.png b/web/bringyour.com/res/emails/ur-welcome-header.png similarity index 100% rename from bringyour.com/res/emails/ur-welcome-header.png rename to web/bringyour.com/res/emails/ur-welcome-header.png diff --git a/bringyour.com/res/emails/ur-wordmark-bg-240.jpg b/web/bringyour.com/res/emails/ur-wordmark-bg-240.jpg similarity index 100% rename from bringyour.com/res/emails/ur-wordmark-bg-240.jpg rename to web/bringyour.com/res/emails/ur-wordmark-bg-240.jpg diff --git a/bringyour.com/res/emails/ur-wordmark-black.svg b/web/bringyour.com/res/emails/ur-wordmark-black.svg similarity index 100% rename from bringyour.com/res/emails/ur-wordmark-black.svg rename to web/bringyour.com/res/emails/ur-wordmark-black.svg diff --git a/bringyour.com/res/emails/ur-wordmark-white.svg b/web/bringyour.com/res/emails/ur-wordmark-white.svg similarity index 100% rename from bringyour.com/res/emails/ur-wordmark-white.svg rename to web/bringyour.com/res/emails/ur-wordmark-white.svg diff --git a/bringyour.com/res/emails/urnetwork-bars.gif b/web/bringyour.com/res/emails/urnetwork-bars.gif similarity index 100% rename from bringyour.com/res/emails/urnetwork-bars.gif rename to web/bringyour.com/res/emails/urnetwork-bars.gif diff --git a/bringyour.com/res/emails/urnetwork-goodbye-vpn.gif b/web/bringyour.com/res/emails/urnetwork-goodbye-vpn.gif similarity index 100% rename from bringyour.com/res/emails/urnetwork-goodbye-vpn.gif rename to web/bringyour.com/res/emails/urnetwork-goodbye-vpn.gif diff --git a/bringyour.com/res/emails/urnetwork-notavpn.gif b/web/bringyour.com/res/emails/urnetwork-notavpn.gif similarity index 100% rename from bringyour.com/res/emails/urnetwork-notavpn.gif rename to web/bringyour.com/res/emails/urnetwork-notavpn.gif diff --git a/bringyour.com/res/emails/urnetwork-spin.gif b/web/bringyour.com/res/emails/urnetwork-spin.gif similarity index 100% rename from bringyour.com/res/emails/urnetwork-spin.gif rename to web/bringyour.com/res/emails/urnetwork-spin.gif diff --git a/bringyour.com/res/emails/welcome-header-1080.jpg b/web/bringyour.com/res/emails/welcome-header-1080.jpg similarity index 100% rename from bringyour.com/res/emails/welcome-header-1080.jpg rename to web/bringyour.com/res/emails/welcome-header-1080.jpg diff --git a/bringyour.com/res/emails/welcome-header-1080.webp b/web/bringyour.com/res/emails/welcome-header-1080.webp similarity index 100% rename from bringyour.com/res/emails/welcome-header-1080.webp rename to web/bringyour.com/res/emails/welcome-header-1080.webp diff --git a/bringyour.com/res/fonts/Arkitech-Light.ttf b/web/bringyour.com/res/fonts/Arkitech-Light.ttf similarity index 100% rename from bringyour.com/res/fonts/Arkitech-Light.ttf rename to web/bringyour.com/res/fonts/Arkitech-Light.ttf diff --git a/bringyour.com/res/fonts/Arkitech-Light.woff b/web/bringyour.com/res/fonts/Arkitech-Light.woff similarity index 100% rename from bringyour.com/res/fonts/Arkitech-Light.woff rename to web/bringyour.com/res/fonts/Arkitech-Light.woff diff --git a/bringyour.com/res/fonts/Arkitech-Light.woff2 b/web/bringyour.com/res/fonts/Arkitech-Light.woff2 similarity index 100% rename from bringyour.com/res/fonts/Arkitech-Light.woff2 rename to web/bringyour.com/res/fonts/Arkitech-Light.woff2 diff --git a/bringyour.com/res/fonts/Arkitech-Medium.ttf b/web/bringyour.com/res/fonts/Arkitech-Medium.ttf similarity index 100% rename from bringyour.com/res/fonts/Arkitech-Medium.ttf rename to web/bringyour.com/res/fonts/Arkitech-Medium.ttf diff --git a/bringyour.com/res/fonts/Arkitech-Medium.woff b/web/bringyour.com/res/fonts/Arkitech-Medium.woff similarity index 100% rename from bringyour.com/res/fonts/Arkitech-Medium.woff rename to web/bringyour.com/res/fonts/Arkitech-Medium.woff diff --git a/bringyour.com/res/fonts/Arkitech-Medium.woff2 b/web/bringyour.com/res/fonts/Arkitech-Medium.woff2 similarity index 100% rename from bringyour.com/res/fonts/Arkitech-Medium.woff2 rename to web/bringyour.com/res/fonts/Arkitech-Medium.woff2 diff --git a/bringyour.com/res/fonts/Barlow-Light.woff2 b/web/bringyour.com/res/fonts/Barlow-Light.woff2 similarity index 100% rename from bringyour.com/res/fonts/Barlow-Light.woff2 rename to web/bringyour.com/res/fonts/Barlow-Light.woff2 diff --git a/bringyour.com/res/fonts/Barlow-Medium.woff2 b/web/bringyour.com/res/fonts/Barlow-Medium.woff2 similarity index 100% rename from bringyour.com/res/fonts/Barlow-Medium.woff2 rename to web/bringyour.com/res/fonts/Barlow-Medium.woff2 diff --git a/bringyour.com/res/fonts/Barlow-Regular.woff2 b/web/bringyour.com/res/fonts/Barlow-Regular.woff2 similarity index 100% rename from bringyour.com/res/fonts/Barlow-Regular.woff2 rename to web/bringyour.com/res/fonts/Barlow-Regular.woff2 diff --git a/bringyour.com/res/fonts/Barlow-Thin.woff2 b/web/bringyour.com/res/fonts/Barlow-Thin.woff2 similarity index 100% rename from bringyour.com/res/fonts/Barlow-Thin.woff2 rename to web/bringyour.com/res/fonts/Barlow-Thin.woff2 diff --git a/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.otf b/web/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.otf similarity index 100% rename from bringyour.com/res/fonts/Gravity/ABCGravity-Extended.otf rename to web/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.otf diff --git a/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff b/web/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff similarity index 100% rename from bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff rename to web/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff diff --git a/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff2 b/web/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff2 similarity index 100% rename from bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff2 rename to web/bringyour.com/res/fonts/Gravity/ABCGravity-Extended.woff2 diff --git a/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.otf b/web/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.otf similarity index 100% rename from bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.otf rename to web/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.otf diff --git a/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff b/web/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff similarity index 100% rename from bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff rename to web/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff diff --git a/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff2 b/web/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff2 similarity index 100% rename from bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff2 rename to web/bringyour.com/res/fonts/Gravity/ABCGravity-ExtraCondensed.woff2 diff --git a/bringyour.com/res/fonts/Material-Symbols-Outlined-400.woff2 b/web/bringyour.com/res/fonts/Material-Symbols-Outlined-400.woff2 similarity index 100% rename from bringyour.com/res/fonts/Material-Symbols-Outlined-400.woff2 rename to web/bringyour.com/res/fonts/Material-Symbols-Outlined-400.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-100.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-100.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-100.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-100.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-200.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-200.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-200.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-200.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-300.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-300.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-300.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-300.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-400.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-400.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-400.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-400.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-500.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-500.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-500.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-500.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-600.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-600.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-600.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-600.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-700.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-700.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-700.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-700.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-Latin-800.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-Latin-800.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-Latin-800.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-Latin-800.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-100.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-100.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-100.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-100.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-200.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-200.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-200.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-200.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-300.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-300.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-300.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-300.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-400.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-400.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-400.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-400.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-500.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-500.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-500.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-500.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-600.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-600.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-600.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-600.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-700.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-700.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-700.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-700.woff2 diff --git a/bringyour.com/res/fonts/Noto-Sans-LatinExt-800.woff2 b/web/bringyour.com/res/fonts/Noto-Sans-LatinExt-800.woff2 similarity index 100% rename from bringyour.com/res/fonts/Noto-Sans-LatinExt-800.woff2 rename to web/bringyour.com/res/fonts/Noto-Sans-LatinExt-800.woff2 diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.eot b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.eot similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.eot rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.eot diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.otf b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.otf similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.otf rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.otf diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.ttf b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.ttf similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.ttf rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.ttf diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff2 b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff2 similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff2 rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Bold.woff2 diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.eot b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.eot similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.eot rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.eot diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.otf b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.otf similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.otf rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.otf diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.ttf b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.ttf similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.ttf rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.ttf diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff diff --git a/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff2 b/web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff2 similarity index 100% rename from bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff2 rename to web/bringyour.com/res/fonts/PPNeueBit/PPNeueBit-Regular.woff2 diff --git "a/bringyour.com/res/fonts/PPNeueMontreal/Icon\r" "b/web/bringyour.com/res/fonts/PPNeueMontreal/Icon\r" similarity index 100% rename from "bringyour.com/res/fonts/PPNeueMontreal/Icon\r" rename to "web/bringyour.com/res/fonts/PPNeueMontreal/Icon\r" diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.otf b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.otf similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.otf rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.otf diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.ttf b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.ttf similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.ttf rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.ttf diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff2 b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff2 similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff2 rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Bold.woff2 diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.otf b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.otf similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.otf rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.otf diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.ttf b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.ttf similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.ttf rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.ttf diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff diff --git a/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff2 b/web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff2 similarity index 100% rename from bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff2 rename to web/bringyour.com/res/fonts/PPNeueMontreal/PPNeueMontreal-Regular.woff2 diff --git a/bringyour.com/res/fonts/Pacifico-Latin-400.woff2 b/web/bringyour.com/res/fonts/Pacifico-Latin-400.woff2 similarity index 100% rename from bringyour.com/res/fonts/Pacifico-Latin-400.woff2 rename to web/bringyour.com/res/fonts/Pacifico-Latin-400.woff2 diff --git a/bringyour.com/res/fonts/Pacifico-LatinExt-400.woff2 b/web/bringyour.com/res/fonts/Pacifico-LatinExt-400.woff2 similarity index 100% rename from bringyour.com/res/fonts/Pacifico-LatinExt-400.woff2 rename to web/bringyour.com/res/fonts/Pacifico-LatinExt-400.woff2 diff --git a/bringyour.com/res/fonts/arkitech.css b/web/bringyour.com/res/fonts/arkitech.css similarity index 100% rename from bringyour.com/res/fonts/arkitech.css rename to web/bringyour.com/res/fonts/arkitech.css diff --git a/bringyour.com/res/fonts/barlow.css b/web/bringyour.com/res/fonts/barlow.css similarity index 100% rename from bringyour.com/res/fonts/barlow.css rename to web/bringyour.com/res/fonts/barlow.css diff --git a/bringyour.com/res/fonts/gravity.css b/web/bringyour.com/res/fonts/gravity.css similarity index 100% rename from bringyour.com/res/fonts/gravity.css rename to web/bringyour.com/res/fonts/gravity.css diff --git a/bringyour.com/res/fonts/material-symbols-outlined.css b/web/bringyour.com/res/fonts/material-symbols-outlined.css similarity index 100% rename from bringyour.com/res/fonts/material-symbols-outlined.css rename to web/bringyour.com/res/fonts/material-symbols-outlined.css diff --git a/bringyour.com/res/fonts/noto-sans.css b/web/bringyour.com/res/fonts/noto-sans.css similarity index 100% rename from bringyour.com/res/fonts/noto-sans.css rename to web/bringyour.com/res/fonts/noto-sans.css diff --git a/bringyour.com/res/fonts/pacifico.css b/web/bringyour.com/res/fonts/pacifico.css similarity index 100% rename from bringyour.com/res/fonts/pacifico.css rename to web/bringyour.com/res/fonts/pacifico.css diff --git a/bringyour.com/res/fonts/pp-neue-bit.css b/web/bringyour.com/res/fonts/pp-neue-bit.css similarity index 100% rename from bringyour.com/res/fonts/pp-neue-bit.css rename to web/bringyour.com/res/fonts/pp-neue-bit.css diff --git a/bringyour.com/res/fonts/pp-neue-montreal.css b/web/bringyour.com/res/fonts/pp-neue-montreal.css similarity index 100% rename from bringyour.com/res/fonts/pp-neue-montreal.css rename to web/bringyour.com/res/fonts/pp-neue-montreal.css diff --git a/bringyour.com/res/images/1TiB.png b/web/bringyour.com/res/images/1TiB.png similarity index 100% rename from bringyour.com/res/images/1TiB.png rename to web/bringyour.com/res/images/1TiB.png diff --git a/bringyour.com/res/images/2TiB.png b/web/bringyour.com/res/images/2TiB.png similarity index 100% rename from bringyour.com/res/images/2TiB.png rename to web/bringyour.com/res/images/2TiB.png diff --git a/bringyour.com/res/images/300GiB.png b/web/bringyour.com/res/images/300GiB.png similarity index 100% rename from bringyour.com/res/images/300GiB.png rename to web/bringyour.com/res/images/300GiB.png diff --git a/bringyour.com/res/images/Company100TiB.png b/web/bringyour.com/res/images/Company100TiB.png similarity index 100% rename from bringyour.com/res/images/Company100TiB.png rename to web/bringyour.com/res/images/Company100TiB.png diff --git a/bringyour.com/res/images/Company10TiB.png b/web/bringyour.com/res/images/Company10TiB.png similarity index 100% rename from bringyour.com/res/images/Company10TiB.png rename to web/bringyour.com/res/images/Company10TiB.png diff --git a/bringyour.com/res/images/URnetwork-logo-black-400-80.svg b/web/bringyour.com/res/images/URnetwork-logo-black-400-80.svg similarity index 100% rename from bringyour.com/res/images/URnetwork-logo-black-400-80.svg rename to web/bringyour.com/res/images/URnetwork-logo-black-400-80.svg diff --git a/bringyour.com/res/images/arrow-back.svg b/web/bringyour.com/res/images/arrow-back.svg similarity index 100% rename from bringyour.com/res/images/arrow-back.svg rename to web/bringyour.com/res/images/arrow-back.svg diff --git a/bringyour.com/res/images/bg-0.png b/web/bringyour.com/res/images/bg-0.png similarity index 100% rename from bringyour.com/res/images/bg-0.png rename to web/bringyour.com/res/images/bg-0.png diff --git a/bringyour.com/res/images/bg-1.png b/web/bringyour.com/res/images/bg-1.png similarity index 100% rename from bringyour.com/res/images/bg-1.png rename to web/bringyour.com/res/images/bg-1.png diff --git a/bringyour.com/res/images/bg-2.png b/web/bringyour.com/res/images/bg-2.png similarity index 100% rename from bringyour.com/res/images/bg-2.png rename to web/bringyour.com/res/images/bg-2.png diff --git a/bringyour.com/res/images/bringyour-wordmark-260.svg b/web/bringyour.com/res/images/bringyour-wordmark-260.svg similarity index 100% rename from bringyour.com/res/images/bringyour-wordmark-260.svg rename to web/bringyour.com/res/images/bringyour-wordmark-260.svg diff --git a/bringyour.com/res/images/bringyour-wordmark-340-80.svg b/web/bringyour.com/res/images/bringyour-wordmark-340-80.svg similarity index 100% rename from bringyour.com/res/images/bringyour-wordmark-340-80.svg rename to web/bringyour.com/res/images/bringyour-wordmark-340-80.svg diff --git a/bringyour.com/res/images/bringyour-wordmark-sq-260.png b/web/bringyour.com/res/images/bringyour-wordmark-sq-260.png similarity index 100% rename from bringyour.com/res/images/bringyour-wordmark-sq-260.png rename to web/bringyour.com/res/images/bringyour-wordmark-sq-260.png diff --git a/bringyour.com/res/images/bringyour-wordmark-white.png b/web/bringyour.com/res/images/bringyour-wordmark-white.png similarity index 100% rename from bringyour.com/res/images/bringyour-wordmark-white.png rename to web/bringyour.com/res/images/bringyour-wordmark-white.png diff --git a/bringyour.com/res/images/bringyour-wordmark.png b/web/bringyour.com/res/images/bringyour-wordmark.png similarity index 100% rename from bringyour.com/res/images/bringyour-wordmark.png rename to web/bringyour.com/res/images/bringyour-wordmark.png diff --git a/bringyour.com/res/images/by.svg b/web/bringyour.com/res/images/by.svg similarity index 100% rename from bringyour.com/res/images/by.svg rename to web/bringyour.com/res/images/by.svg diff --git a/bringyour.com/res/images/cat6-wc.jpg b/web/bringyour.com/res/images/cat6-wc.jpg similarity index 100% rename from bringyour.com/res/images/cat6-wc.jpg rename to web/bringyour.com/res/images/cat6-wc.jpg diff --git a/bringyour.com/res/images/cat6.afphoto b/web/bringyour.com/res/images/cat6.afphoto similarity index 100% rename from bringyour.com/res/images/cat6.afphoto rename to web/bringyour.com/res/images/cat6.afphoto diff --git a/bringyour.com/res/images/cat6.jpg b/web/bringyour.com/res/images/cat6.jpg similarity index 100% rename from bringyour.com/res/images/cat6.jpg rename to web/bringyour.com/res/images/cat6.jpg diff --git a/bringyour.com/res/images/favicon.svg b/web/bringyour.com/res/images/favicon.svg similarity index 100% rename from bringyour.com/res/images/favicon.svg rename to web/bringyour.com/res/images/favicon.svg diff --git a/bringyour.com/res/images/ff-extended.svg b/web/bringyour.com/res/images/ff-extended.svg similarity index 100% rename from bringyour.com/res/images/ff-extended.svg rename to web/bringyour.com/res/images/ff-extended.svg diff --git a/bringyour.com/res/images/ip-connected.svg b/web/bringyour.com/res/images/ip-connected.svg similarity index 100% rename from bringyour.com/res/images/ip-connected.svg rename to web/bringyour.com/res/images/ip-connected.svg diff --git a/bringyour.com/res/images/ip-disconnected.svg b/web/bringyour.com/res/images/ip-disconnected.svg similarity index 100% rename from bringyour.com/res/images/ip-disconnected.svg rename to web/bringyour.com/res/images/ip-disconnected.svg diff --git a/bringyour.com/res/images/ip-inevaluation.svg b/web/bringyour.com/res/images/ip-inevaluation.svg similarity index 100% rename from bringyour.com/res/images/ip-inevaluation.svg rename to web/bringyour.com/res/images/ip-inevaluation.svg diff --git a/bringyour.com/res/images/ip-pulse.svg b/web/bringyour.com/res/images/ip-pulse.svg similarity index 100% rename from bringyour.com/res/images/ip-pulse.svg rename to web/bringyour.com/res/images/ip-pulse.svg diff --git a/bringyour.com/res/images/lagdev.svg b/web/bringyour.com/res/images/lagdev.svg similarity index 100% rename from bringyour.com/res/images/lagdev.svg rename to web/bringyour.com/res/images/lagdev.svg diff --git a/bringyour.com/res/images/logo-placeholder.png b/web/bringyour.com/res/images/logo-placeholder.png similarity index 100% rename from bringyour.com/res/images/logo-placeholder.png rename to web/bringyour.com/res/images/logo-placeholder.png diff --git a/bringyour.com/res/images/pack-2-alpha.png b/web/bringyour.com/res/images/pack-2-alpha.png similarity index 100% rename from bringyour.com/res/images/pack-2-alpha.png rename to web/bringyour.com/res/images/pack-2-alpha.png diff --git a/bringyour.com/res/images/pack-2-alpha.webp b/web/bringyour.com/res/images/pack-2-alpha.webp similarity index 100% rename from bringyour.com/res/images/pack-2-alpha.webp rename to web/bringyour.com/res/images/pack-2-alpha.webp diff --git a/bringyour.com/res/images/pack-2.png b/web/bringyour.com/res/images/pack-2.png similarity index 100% rename from bringyour.com/res/images/pack-2.png rename to web/bringyour.com/res/images/pack-2.png diff --git a/bringyour.com/res/images/pack-2.webp b/web/bringyour.com/res/images/pack-2.webp similarity index 100% rename from bringyour.com/res/images/pack-2.webp rename to web/bringyour.com/res/images/pack-2.webp diff --git a/bringyour.com/res/images/pack.jpg b/web/bringyour.com/res/images/pack.jpg similarity index 100% rename from bringyour.com/res/images/pack.jpg rename to web/bringyour.com/res/images/pack.jpg diff --git a/bringyour.com/res/images/pack.png b/web/bringyour.com/res/images/pack.png similarity index 100% rename from bringyour.com/res/images/pack.png rename to web/bringyour.com/res/images/pack.png diff --git a/bringyour.com/res/images/provided-extended.svg b/web/bringyour.com/res/images/provided-extended.svg similarity index 100% rename from bringyour.com/res/images/provided-extended.svg rename to web/bringyour.com/res/images/provided-extended.svg diff --git a/bringyour.com/res/images/provided.svg b/web/bringyour.com/res/images/provided.svg similarity index 100% rename from bringyour.com/res/images/provided.svg rename to web/bringyour.com/res/images/provided.svg diff --git a/bringyour.com/res/images/reviews-g2.png b/web/bringyour.com/res/images/reviews-g2.png similarity index 100% rename from bringyour.com/res/images/reviews-g2.png rename to web/bringyour.com/res/images/reviews-g2.png diff --git a/bringyour.com/res/images/s-discord.png b/web/bringyour.com/res/images/s-discord.png similarity index 100% rename from bringyour.com/res/images/s-discord.png rename to web/bringyour.com/res/images/s-discord.png diff --git a/bringyour.com/res/images/s-github.png b/web/bringyour.com/res/images/s-github.png similarity index 100% rename from bringyour.com/res/images/s-github.png rename to web/bringyour.com/res/images/s-github.png diff --git a/bringyour.com/res/images/s-linkedin.png b/web/bringyour.com/res/images/s-linkedin.png similarity index 100% rename from bringyour.com/res/images/s-linkedin.png rename to web/bringyour.com/res/images/s-linkedin.png diff --git a/bringyour.com/res/images/s-twitter.png b/web/bringyour.com/res/images/s-twitter.png similarity index 100% rename from bringyour.com/res/images/s-twitter.png rename to web/bringyour.com/res/images/s-twitter.png diff --git a/bringyour.com/res/images/s-youtube.png b/web/bringyour.com/res/images/s-youtube.png similarity index 100% rename from bringyour.com/res/images/s-youtube.png rename to web/bringyour.com/res/images/s-youtube.png diff --git a/bringyour.com/res/images/s2-discord.svg b/web/bringyour.com/res/images/s2-discord.svg similarity index 100% rename from bringyour.com/res/images/s2-discord.svg rename to web/bringyour.com/res/images/s2-discord.svg diff --git a/bringyour.com/res/images/s2-github.svg b/web/bringyour.com/res/images/s2-github.svg similarity index 100% rename from bringyour.com/res/images/s2-github.svg rename to web/bringyour.com/res/images/s2-github.svg diff --git a/bringyour.com/res/images/s2-linkedin.svg b/web/bringyour.com/res/images/s2-linkedin.svg similarity index 100% rename from bringyour.com/res/images/s2-linkedin.svg rename to web/bringyour.com/res/images/s2-linkedin.svg diff --git a/bringyour.com/res/images/s2-reddit.svg b/web/bringyour.com/res/images/s2-reddit.svg similarity index 100% rename from bringyour.com/res/images/s2-reddit.svg rename to web/bringyour.com/res/images/s2-reddit.svg diff --git a/bringyour.com/res/images/s2-youtube.svg b/web/bringyour.com/res/images/s2-youtube.svg similarity index 100% rename from bringyour.com/res/images/s2-youtube.svg rename to web/bringyour.com/res/images/s2-youtube.svg diff --git a/bringyour.com/res/images/share-private-2-alpha.png b/web/bringyour.com/res/images/share-private-2-alpha.png similarity index 100% rename from bringyour.com/res/images/share-private-2-alpha.png rename to web/bringyour.com/res/images/share-private-2-alpha.png diff --git a/bringyour.com/res/images/share-private-2-alpha.webp b/web/bringyour.com/res/images/share-private-2-alpha.webp similarity index 100% rename from bringyour.com/res/images/share-private-2-alpha.webp rename to web/bringyour.com/res/images/share-private-2-alpha.webp diff --git a/bringyour.com/res/images/share-private-2.png b/web/bringyour.com/res/images/share-private-2.png similarity index 100% rename from bringyour.com/res/images/share-private-2.png rename to web/bringyour.com/res/images/share-private-2.png diff --git a/bringyour.com/res/images/share-private-2.webp b/web/bringyour.com/res/images/share-private-2.webp similarity index 100% rename from bringyour.com/res/images/share-private-2.webp rename to web/bringyour.com/res/images/share-private-2.webp diff --git a/bringyour.com/res/images/share-private.jpg b/web/bringyour.com/res/images/share-private.jpg similarity index 100% rename from bringyour.com/res/images/share-private.jpg rename to web/bringyour.com/res/images/share-private.jpg diff --git a/bringyour.com/res/images/share-private.png b/web/bringyour.com/res/images/share-private.png similarity index 100% rename from bringyour.com/res/images/share-private.png rename to web/bringyour.com/res/images/share-private.png diff --git a/bringyour.com/res/images/share-public-2-alpha.png b/web/bringyour.com/res/images/share-public-2-alpha.png similarity index 100% rename from bringyour.com/res/images/share-public-2-alpha.png rename to web/bringyour.com/res/images/share-public-2-alpha.png diff --git a/bringyour.com/res/images/share-public-2-alpha.webp b/web/bringyour.com/res/images/share-public-2-alpha.webp similarity index 100% rename from bringyour.com/res/images/share-public-2-alpha.webp rename to web/bringyour.com/res/images/share-public-2-alpha.webp diff --git a/bringyour.com/res/images/share-public-2.png b/web/bringyour.com/res/images/share-public-2.png similarity index 100% rename from bringyour.com/res/images/share-public-2.png rename to web/bringyour.com/res/images/share-public-2.png diff --git a/bringyour.com/res/images/share-public-2.webp b/web/bringyour.com/res/images/share-public-2.webp similarity index 100% rename from bringyour.com/res/images/share-public-2.webp rename to web/bringyour.com/res/images/share-public-2.webp diff --git a/bringyour.com/res/images/share-public.jpg b/web/bringyour.com/res/images/share-public.jpg similarity index 100% rename from bringyour.com/res/images/share-public.jpg rename to web/bringyour.com/res/images/share-public.jpg diff --git a/bringyour.com/res/images/share-public.png b/web/bringyour.com/res/images/share-public.png similarity index 100% rename from bringyour.com/res/images/share-public.png rename to web/bringyour.com/res/images/share-public.png diff --git a/bringyour.com/res/images/signup-redeem.svg b/web/bringyour.com/res/images/signup-redeem.svg similarity index 100% rename from bringyour.com/res/images/signup-redeem.svg rename to web/bringyour.com/res/images/signup-redeem.svg diff --git a/bringyour.com/res/images/store-app-dark.png b/web/bringyour.com/res/images/store-app-dark.png similarity index 100% rename from bringyour.com/res/images/store-app-dark.png rename to web/bringyour.com/res/images/store-app-dark.png diff --git a/bringyour.com/res/images/store-app-dark.svg b/web/bringyour.com/res/images/store-app-dark.svg similarity index 100% rename from bringyour.com/res/images/store-app-dark.svg rename to web/bringyour.com/res/images/store-app-dark.svg diff --git a/bringyour.com/res/images/store-app.svg b/web/bringyour.com/res/images/store-app.svg similarity index 100% rename from bringyour.com/res/images/store-app.svg rename to web/bringyour.com/res/images/store-app.svg diff --git a/bringyour.com/res/images/store-ms.svg b/web/bringyour.com/res/images/store-ms.svg similarity index 100% rename from bringyour.com/res/images/store-ms.svg rename to web/bringyour.com/res/images/store-ms.svg diff --git a/bringyour.com/res/images/store-play.png b/web/bringyour.com/res/images/store-play.png similarity index 100% rename from bringyour.com/res/images/store-play.png rename to web/bringyour.com/res/images/store-play.png diff --git a/bringyour.com/res/images/superfast.svg b/web/bringyour.com/res/images/superfast.svg similarity index 100% rename from bringyour.com/res/images/superfast.svg rename to web/bringyour.com/res/images/superfast.svg diff --git a/bringyour.com/res/images/ur-sq.webp b/web/bringyour.com/res/images/ur-sq.webp similarity index 100% rename from bringyour.com/res/images/ur-sq.webp rename to web/bringyour.com/res/images/ur-sq.webp diff --git a/bringyour.com/res/images/ur.svg b/web/bringyour.com/res/images/ur.svg similarity index 100% rename from bringyour.com/res/images/ur.svg rename to web/bringyour.com/res/images/ur.svg diff --git a/bringyour.com/res/images/use-cases-2-alpha.png b/web/bringyour.com/res/images/use-cases-2-alpha.png similarity index 100% rename from bringyour.com/res/images/use-cases-2-alpha.png rename to web/bringyour.com/res/images/use-cases-2-alpha.png diff --git a/bringyour.com/res/images/use-cases-2-alpha.webp b/web/bringyour.com/res/images/use-cases-2-alpha.webp similarity index 100% rename from bringyour.com/res/images/use-cases-2-alpha.webp rename to web/bringyour.com/res/images/use-cases-2-alpha.webp diff --git a/bringyour.com/res/images/use-cases-2.png b/web/bringyour.com/res/images/use-cases-2.png similarity index 100% rename from bringyour.com/res/images/use-cases-2.png rename to web/bringyour.com/res/images/use-cases-2.png diff --git a/bringyour.com/res/images/use-cases-2.webp b/web/bringyour.com/res/images/use-cases-2.webp similarity index 100% rename from bringyour.com/res/images/use-cases-2.webp rename to web/bringyour.com/res/images/use-cases-2.webp diff --git a/bringyour.com/res/images/use-cases.jpg b/web/bringyour.com/res/images/use-cases.jpg similarity index 100% rename from bringyour.com/res/images/use-cases.jpg rename to web/bringyour.com/res/images/use-cases.jpg diff --git a/bringyour.com/res/images/use-cases.png b/web/bringyour.com/res/images/use-cases.png similarity index 100% rename from bringyour.com/res/images/use-cases.png rename to web/bringyour.com/res/images/use-cases.png diff --git a/bringyour.com/res/images/world-sq.png b/web/bringyour.com/res/images/world-sq.png similarity index 100% rename from bringyour.com/res/images/world-sq.png rename to web/bringyour.com/res/images/world-sq.png diff --git a/bringyour.com/res/images/world.png b/web/bringyour.com/res/images/world.png similarity index 100% rename from bringyour.com/res/images/world.png rename to web/bringyour.com/res/images/world.png diff --git a/bringyour.com/res/images/world2.png b/web/bringyour.com/res/images/world2.png similarity index 100% rename from bringyour.com/res/images/world2.png rename to web/bringyour.com/res/images/world2.png diff --git a/bringyour.com/res/images/world3.png b/web/bringyour.com/res/images/world3.png similarity index 100% rename from bringyour.com/res/images/world3.png rename to web/bringyour.com/res/images/world3.png diff --git a/bringyour.com/robots.txt b/web/bringyour.com/robots.txt similarity index 100% rename from bringyour.com/robots.txt rename to web/bringyour.com/robots.txt diff --git a/bringyour.com/sitemap.txt b/web/bringyour.com/sitemap.txt similarity index 100% rename from bringyour.com/sitemap.txt rename to web/bringyour.com/sitemap.txt diff --git a/bringyour.com/sketch_220813c.js b/web/bringyour.com/sketch_220813c.js similarity index 100% rename from bringyour.com/sketch_220813c.js rename to web/bringyour.com/sketch_220813c.js diff --git a/bringyour.com/sketch_220824a.js b/web/bringyour.com/sketch_220824a.js similarity index 100% rename from bringyour.com/sketch_220824a.js rename to web/bringyour.com/sketch_220824a.js diff --git a/bringyour.com/stats.js b/web/bringyour.com/stats.js similarity index 100% rename from bringyour.com/stats.js rename to web/bringyour.com/stats.js diff --git a/bringyour.com/stats_mock.js b/web/bringyour.com/stats_mock.js similarity index 100% rename from bringyour.com/stats_mock.js rename to web/bringyour.com/stats_mock.js diff --git a/bringyour.com/window.js b/web/bringyour.com/window.js similarity index 100% rename from bringyour.com/window.js rename to web/bringyour.com/window.js diff --git a/components/whereami/.gitignore b/web/components/whereami/.gitignore similarity index 100% rename from components/whereami/.gitignore rename to web/components/whereami/.gitignore diff --git a/components/whereami/index/.gitignore b/web/components/whereami/index/.gitignore similarity index 100% rename from components/whereami/index/.gitignore rename to web/components/whereami/index/.gitignore diff --git a/components/whereami/index/index.templ b/web/components/whereami/index/index.templ similarity index 100% rename from components/whereami/index/index.templ rename to web/components/whereami/index/index.templ diff --git a/components/whereami/index/index_templ.go b/web/components/whereami/index/index_templ.go similarity index 100% rename from components/whereami/index/index_templ.go rename to web/components/whereami/index/index_templ.go diff --git a/components/whereami/index/transform.go b/web/components/whereami/index/transform.go similarity index 100% rename from components/whereami/index/transform.go rename to web/components/whereami/index/transform.go diff --git a/components/whereami/my-ip-info/.gitignore b/web/components/whereami/my-ip-info/.gitignore similarity index 100% rename from components/whereami/my-ip-info/.gitignore rename to web/components/whereami/my-ip-info/.gitignore diff --git a/components/whereami/my-ip-info/README.md b/web/components/whereami/my-ip-info/README.md similarity index 100% rename from components/whereami/my-ip-info/README.md rename to web/components/whereami/my-ip-info/README.md diff --git a/components/whereami/my-ip-info/generate.go b/web/components/whereami/my-ip-info/generate.go similarity index 100% rename from components/whereami/my-ip-info/generate.go rename to web/components/whereami/my-ip-info/generate.go diff --git a/components/whereami/my-ip-info/package-lock.json b/web/components/whereami/my-ip-info/package-lock.json similarity index 100% rename from components/whereami/my-ip-info/package-lock.json rename to web/components/whereami/my-ip-info/package-lock.json diff --git a/components/whereami/my-ip-info/package.json b/web/components/whereami/my-ip-info/package.json similarity index 100% rename from components/whereami/my-ip-info/package.json rename to web/components/whereami/my-ip-info/package.json diff --git a/components/whereami/my-ip-info/postcss.config.js b/web/components/whereami/my-ip-info/postcss.config.js similarity index 100% rename from components/whereami/my-ip-info/postcss.config.js rename to web/components/whereami/my-ip-info/postcss.config.js diff --git a/components/whereami/my-ip-info/src/App.css b/web/components/whereami/my-ip-info/src/App.css similarity index 100% rename from components/whereami/my-ip-info/src/App.css rename to web/components/whereami/my-ip-info/src/App.css diff --git a/components/whereami/my-ip-info/src/App.jsx b/web/components/whereami/my-ip-info/src/App.jsx similarity index 100% rename from components/whereami/my-ip-info/src/App.jsx rename to web/components/whereami/my-ip-info/src/App.jsx diff --git a/components/whereami/my-ip-info/src/GridComparison.jsx b/web/components/whereami/my-ip-info/src/GridComparison.jsx similarity index 100% rename from components/whereami/my-ip-info/src/GridComparison.jsx rename to web/components/whereami/my-ip-info/src/GridComparison.jsx diff --git a/components/whereami/my-ip-info/src/SingleVersion.jsx b/web/components/whereami/my-ip-info/src/SingleVersion.jsx similarity index 100% rename from components/whereami/my-ip-info/src/SingleVersion.jsx rename to web/components/whereami/my-ip-info/src/SingleVersion.jsx diff --git a/components/whereami/my-ip-info/src/assets/crossed-cloud.svg b/web/components/whereami/my-ip-info/src/assets/crossed-cloud.svg similarity index 100% rename from components/whereami/my-ip-info/src/assets/crossed-cloud.svg rename to web/components/whereami/my-ip-info/src/assets/crossed-cloud.svg diff --git a/components/whereami/my-ip-info/src/assets/solid.svg b/web/components/whereami/my-ip-info/src/assets/solid.svg similarity index 100% rename from components/whereami/my-ip-info/src/assets/solid.svg rename to web/components/whereami/my-ip-info/src/assets/solid.svg diff --git a/components/whereami/my-ip-info/src/assets/thumbsup.svg b/web/components/whereami/my-ip-info/src/assets/thumbsup.svg similarity index 100% rename from components/whereami/my-ip-info/src/assets/thumbsup.svg rename to web/components/whereami/my-ip-info/src/assets/thumbsup.svg diff --git a/components/whereami/my-ip-info/src/assets/warning.svg b/web/components/whereami/my-ip-info/src/assets/warning.svg similarity index 100% rename from components/whereami/my-ip-info/src/assets/warning.svg rename to web/components/whereami/my-ip-info/src/assets/warning.svg diff --git a/components/whereami/my-ip-info/src/components/NotSupported.jsx b/web/components/whereami/my-ip-info/src/components/NotSupported.jsx similarity index 100% rename from components/whereami/my-ip-info/src/components/NotSupported.jsx rename to web/components/whereami/my-ip-info/src/components/NotSupported.jsx diff --git a/components/whereami/my-ip-info/src/components/Privacy.jsx b/web/components/whereami/my-ip-info/src/components/Privacy.jsx similarity index 100% rename from components/whereami/my-ip-info/src/components/Privacy.jsx rename to web/components/whereami/my-ip-info/src/components/Privacy.jsx diff --git a/components/whereami/my-ip-info/src/components/PrivacySingle.jsx b/web/components/whereami/my-ip-info/src/components/PrivacySingle.jsx similarity index 100% rename from components/whereami/my-ip-info/src/components/PrivacySingle.jsx rename to web/components/whereami/my-ip-info/src/components/PrivacySingle.jsx diff --git a/components/whereami/my-ip-info/src/components/landmarks-single/index.jsx b/web/components/whereami/my-ip-info/src/components/landmarks-single/index.jsx similarity index 100% rename from components/whereami/my-ip-info/src/components/landmarks-single/index.jsx rename to web/components/whereami/my-ip-info/src/components/landmarks-single/index.jsx diff --git a/components/whereami/my-ip-info/src/components/landmarks-single/measure-rtts.js b/web/components/whereami/my-ip-info/src/components/landmarks-single/measure-rtts.js similarity index 100% rename from components/whereami/my-ip-info/src/components/landmarks-single/measure-rtts.js rename to web/components/whereami/my-ip-info/src/components/landmarks-single/measure-rtts.js diff --git a/components/whereami/my-ip-info/src/components/landmarks/index.jsx b/web/components/whereami/my-ip-info/src/components/landmarks/index.jsx similarity index 100% rename from components/whereami/my-ip-info/src/components/landmarks/index.jsx rename to web/components/whereami/my-ip-info/src/components/landmarks/index.jsx diff --git a/components/whereami/my-ip-info/src/components/landmarks/measure-rtts.js b/web/components/whereami/my-ip-info/src/components/landmarks/measure-rtts.js similarity index 100% rename from components/whereami/my-ip-info/src/components/landmarks/measure-rtts.js rename to web/components/whereami/my-ip-info/src/components/landmarks/measure-rtts.js diff --git a/components/whereami/my-ip-info/src/components/spinner/index.jsx b/web/components/whereami/my-ip-info/src/components/spinner/index.jsx similarity index 100% rename from components/whereami/my-ip-info/src/components/spinner/index.jsx rename to web/components/whereami/my-ip-info/src/components/spinner/index.jsx diff --git a/components/whereami/my-ip-info/src/globe/GlobeComponent.jsx b/web/components/whereami/my-ip-info/src/globe/GlobeComponent.jsx similarity index 100% rename from components/whereami/my-ip-info/src/globe/GlobeComponent.jsx rename to web/components/whereami/my-ip-info/src/globe/GlobeComponent.jsx diff --git a/components/whereami/my-ip-info/src/globe/data/world-110m.v1.json b/web/components/whereami/my-ip-info/src/globe/data/world-110m.v1.json similarity index 100% rename from components/whereami/my-ip-info/src/globe/data/world-110m.v1.json rename to web/components/whereami/my-ip-info/src/globe/data/world-110m.v1.json diff --git a/components/whereami/my-ip-info/src/index.css b/web/components/whereami/my-ip-info/src/index.css similarity index 100% rename from components/whereami/my-ip-info/src/index.css rename to web/components/whereami/my-ip-info/src/index.css diff --git a/components/whereami/my-ip-info/tailwind.config.js b/web/components/whereami/my-ip-info/tailwind.config.js similarity index 100% rename from components/whereami/my-ip-info/tailwind.config.js rename to web/components/whereami/my-ip-info/tailwind.config.js diff --git a/components/whereami/my-ip-info/vite.config.js b/web/components/whereami/my-ip-info/vite.config.js similarity index 100% rename from components/whereami/my-ip-info/vite.config.js rename to web/components/whereami/my-ip-info/vite.config.js diff --git a/components/whereami/my-ip-widget/.gitignore b/web/components/whereami/my-ip-widget/.gitignore similarity index 100% rename from components/whereami/my-ip-widget/.gitignore rename to web/components/whereami/my-ip-widget/.gitignore diff --git a/components/whereami/my-ip-widget/README.md b/web/components/whereami/my-ip-widget/README.md similarity index 100% rename from components/whereami/my-ip-widget/README.md rename to web/components/whereami/my-ip-widget/README.md diff --git a/components/whereami/my-ip-widget/generate.go b/web/components/whereami/my-ip-widget/generate.go similarity index 100% rename from components/whereami/my-ip-widget/generate.go rename to web/components/whereami/my-ip-widget/generate.go diff --git a/components/whereami/my-ip-widget/package-lock.json b/web/components/whereami/my-ip-widget/package-lock.json similarity index 100% rename from components/whereami/my-ip-widget/package-lock.json rename to web/components/whereami/my-ip-widget/package-lock.json diff --git a/components/whereami/my-ip-widget/package.json b/web/components/whereami/my-ip-widget/package.json similarity index 100% rename from components/whereami/my-ip-widget/package.json rename to web/components/whereami/my-ip-widget/package.json diff --git a/components/whereami/my-ip-widget/postcss.config.js b/web/components/whereami/my-ip-widget/postcss.config.js similarity index 100% rename from components/whereami/my-ip-widget/postcss.config.js rename to web/components/whereami/my-ip-widget/postcss.config.js diff --git a/components/whereami/my-ip-widget/src/Widget.css b/web/components/whereami/my-ip-widget/src/Widget.css similarity index 100% rename from components/whereami/my-ip-widget/src/Widget.css rename to web/components/whereami/my-ip-widget/src/Widget.css diff --git a/components/whereami/my-ip-widget/src/Widget.jsx b/web/components/whereami/my-ip-widget/src/Widget.jsx similarity index 100% rename from components/whereami/my-ip-widget/src/Widget.jsx rename to web/components/whereami/my-ip-widget/src/Widget.jsx diff --git a/components/whereami/my-ip-widget/src/components/dot/index.jsx b/web/components/whereami/my-ip-widget/src/components/dot/index.jsx similarity index 100% rename from components/whereami/my-ip-widget/src/components/dot/index.jsx rename to web/components/whereami/my-ip-widget/src/components/dot/index.jsx diff --git a/components/whereami/my-ip-widget/src/components/spinner/index.jsx b/web/components/whereami/my-ip-widget/src/components/spinner/index.jsx similarity index 100% rename from components/whereami/my-ip-widget/src/components/spinner/index.jsx rename to web/components/whereami/my-ip-widget/src/components/spinner/index.jsx diff --git a/components/whereami/my-ip-widget/src/index.css b/web/components/whereami/my-ip-widget/src/index.css similarity index 100% rename from components/whereami/my-ip-widget/src/index.css rename to web/components/whereami/my-ip-widget/src/index.css diff --git a/components/whereami/my-ip-widget/tailwind.config.js b/web/components/whereami/my-ip-widget/tailwind.config.js similarity index 100% rename from components/whereami/my-ip-widget/tailwind.config.js rename to web/components/whereami/my-ip-widget/tailwind.config.js diff --git a/components/whereami/my-ip-widget/vite.config.js b/web/components/whereami/my-ip-widget/vite.config.js similarity index 100% rename from components/whereami/my-ip-widget/vite.config.js rename to web/components/whereami/my-ip-widget/vite.config.js diff --git a/components/whereami/static/connect-bundle-2.js b/web/components/whereami/static/connect-bundle-2.js similarity index 100% rename from components/whereami/static/connect-bundle-2.js rename to web/components/whereami/static/connect-bundle-2.js diff --git a/web/go.mod b/web/go.mod new file mode 100644 index 0000000..ac5d855 --- /dev/null +++ b/web/go.mod @@ -0,0 +1,7 @@ +module github.com/urnetwork/web/web + +go 1.24.0 + +require github.com/urnetwork/warp v0.0.0 + +replace github.com/urnetwork/warp => ../../warp diff --git a/web/main.go b/web/main.go new file mode 100644 index 0000000..9e24bed --- /dev/null +++ b/web/main.go @@ -0,0 +1,22 @@ +package main + +import ( + "os" + + "github.com/urnetwork/warp" +) + +// this value is set via the linker, e.g. +// -ldflags "-X main.Version=$WARP_VERSION-$WARP_VERSION_CODE" +var Version string + +func main() { + configPath := "/etc/nginx/nginx.conf" + convertedConfigPath := "/etc/nginx/nginx_host.conf" + + err, exitCode := warp.Nginx(configPath, convertedConfigPath) + if err != nil { + panic(err) + } + os.Exit(exitCode) +} diff --git a/nginx-local/gen.py b/web/nginx-local/gen.py similarity index 100% rename from nginx-local/gen.py rename to web/nginx-local/gen.py diff --git a/app.old/nginx/mime.types b/web/nginx-local/mime.types similarity index 100% rename from app.old/nginx/mime.types rename to web/nginx-local/mime.types diff --git a/nginx-local/nginx.conf.j2 b/web/nginx-local/nginx.conf.j2 similarity index 100% rename from nginx-local/nginx.conf.j2 rename to web/nginx-local/nginx.conf.j2 diff --git a/app.old/nginx/gen.py b/web/nginx/gen.py similarity index 100% rename from app.old/nginx/gen.py rename to web/nginx/gen.py diff --git a/nginx-local/mime.types b/web/nginx/mime.types similarity index 100% rename from nginx-local/mime.types rename to web/nginx/mime.types diff --git a/nginx/nginx.conf.j2 b/web/nginx/nginx.conf.j2 similarity index 100% rename from nginx/nginx.conf.j2 rename to web/nginx/nginx.conf.j2 diff --git a/ur.io/.well-known/assetlinks.json b/web/ur.io/.well-known/assetlinks.json similarity index 100% rename from ur.io/.well-known/assetlinks.json rename to web/ur.io/.well-known/assetlinks.json diff --git a/ur.io/.well-known/manifest.json b/web/ur.io/.well-known/manifest.json similarity index 100% rename from ur.io/.well-known/manifest.json rename to web/ur.io/.well-known/manifest.json diff --git a/ur.io/.well-known/pgp-key.txt b/web/ur.io/.well-known/pgp-key.txt similarity index 100% rename from ur.io/.well-known/pgp-key.txt rename to web/ur.io/.well-known/pgp-key.txt diff --git a/ur.io/.well-known/privacy.txt b/web/ur.io/.well-known/privacy.txt similarity index 100% rename from ur.io/.well-known/privacy.txt rename to web/ur.io/.well-known/privacy.txt diff --git a/ur.io/.well-known/security.txt b/web/ur.io/.well-known/security.txt similarity index 100% rename from ur.io/.well-known/security.txt rename to web/ur.io/.well-known/security.txt