From 6b79b89dc0152d2e124e009fd1b0b1cd04ce7f72 Mon Sep 17 00:00:00 2001 From: QuentinHsu Date: Fri, 4 Apr 2025 12:00:38 +0800 Subject: [PATCH 1/2] style(web): format code --- web/.prettierrc.mjs | 2 +- web/pnpm-lock.yaml | 2633 +++++++++++++---- web/src/App.js | 46 +- web/src/components/ChannelsTable.js | 682 +++-- web/src/components/Footer.js | 16 +- web/src/components/HeaderBar.js | 261 +- web/src/components/LoginForm.js | 33 +- web/src/components/LogsTable.js | 516 ++-- web/src/components/MjLogsTable.js | 28 +- web/src/components/ModelPricing.js | 125 +- web/src/components/ModelSetting.js | 7 +- web/src/components/OAuth2Callback.js | 94 +- web/src/components/OIDCIcon.js | 46 +- web/src/components/OperationSetting.js | 11 +- web/src/components/OtherSetting.js | 75 +- web/src/components/PageLayout.js | 124 +- web/src/components/PersonalSetting.js | 324 +- web/src/components/RateLimitSetting.js | 5 +- web/src/components/RedemptionsTable.js | 92 +- web/src/components/RegisterForm.js | 93 +- web/src/components/SiderBar.js | 114 +- web/src/components/SystemSetting.js | 306 +- web/src/components/TaskLogsTable.js | 824 +++--- web/src/components/TokensTable.js | 88 +- web/src/components/UsersTable.js | 50 +- web/src/components/custom/TextInput.js | 15 +- web/src/components/custom/TextNumberInput.js | 6 +- web/src/components/fetchTokenKeys.js | 6 +- web/src/components/utils.js | 7 +- web/src/constants/channel.constants.js | 40 +- web/src/context/Style/index.js | 30 +- web/src/helpers/api.js | 8 +- web/src/helpers/other.js | 14 +- web/src/helpers/render.js | 569 ++-- web/src/helpers/utils.js | 7 +- web/src/i18n/i18n.js | 12 +- web/src/i18n/locales/en.json | 2 +- web/src/i18n/locales/zh.json | 2 +- web/src/index.css | 69 +- web/src/index.js | 2 +- web/src/pages/Channel/EditChannel.js | 378 +-- web/src/pages/Channel/EditTagModal.js | 118 +- web/src/pages/Channel/index.js | 8 +- web/src/pages/Chat/index.js | 44 +- web/src/pages/Chat2Link/index.js | 4 +- web/src/pages/Detail/index.js | 157 +- web/src/pages/Home/index.js | 36 +- web/src/pages/Playground/Playground.js | 255 +- web/src/pages/Redemption/EditRedemption.js | 10 +- web/src/pages/Redemption/index.js | 18 +- .../pages/Setting/Model/SettingClaudeModel.js | 82 +- .../pages/Setting/Model/SettingGeminiModel.js | 45 +- .../pages/Setting/Model/SettingGlobalModel.js | 17 +- .../Setting/Operation/GroupRatioSettings.js | 99 +- .../Setting/Operation/ModelRatioSettings.js | 127 +- .../Operation/ModelRationNotSetEditor.js | 245 +- .../Operation/ModelSettingsVisualEditor.js | 492 +-- .../pages/Setting/Operation/SettingsChats.js | 109 +- .../Setting/Operation/SettingsCreditLimit.js | 3 +- .../Operation/SettingsDataDashboard.js | 5 +- .../Setting/Operation/SettingsDrawing.js | 6 +- .../Setting/Operation/SettingsGeneral.js | 20 +- .../pages/Setting/Operation/SettingsLog.js | 3 +- .../Setting/Operation/SettingsMonitoring.js | 20 +- .../Operation/SettingsSensitiveWords.js | 3 +- .../RateLimit/SettingsRequestRateLimit.js | 5 +- web/src/pages/Setup/index.js | 162 +- web/src/pages/Task/index.js | 2 +- web/src/pages/Token/EditToken.js | 32 +- web/src/pages/Token/index.js | 16 +- web/src/pages/TopUp/index.js | 12 +- web/src/pages/User/EditUser.js | 30 +- web/src/pages/User/index.js | 8 +- web/vite.config.js | 6 +- 74 files changed, 6413 insertions(+), 3548 deletions(-) diff --git a/web/.prettierrc.mjs b/web/.prettierrc.mjs index ecae84d3..5140bc3e 100644 --- a/web/.prettierrc.mjs +++ b/web/.prettierrc.mjs @@ -1 +1 @@ -module.exports = require("@so1ve/prettier-config"); +module.exports = require('@so1ve/prettier-config'); diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index c57bc443..c503b5bb 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -5,7 +5,6 @@ settings: excludeLinksFromLockfile: false importers: - .: dependencies: '@douyinfe/semi-icons': @@ -95,839 +94,1429 @@ importers: version: 5.4.16 packages: - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, + } + engines: { node: '>=6.0.0' } '@astrojs/compiler@2.11.0': - resolution: {integrity: sha512-zZOO7i+JhojO8qmlyR/URui6LyfHJY6m+L9nwyX5GiKD78YoRaZ5tzz6X0fkl+5bD3uwlDHayf6Oe8Fu36RKNg==} + resolution: + { + integrity: sha512-zZOO7i+JhojO8qmlyR/URui6LyfHJY6m+L9nwyX5GiKD78YoRaZ5tzz6X0fkl+5bD3uwlDHayf6Oe8Fu36RKNg==, + } '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==, + } + engines: { node: '>=6.9.0' } '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==, + } + engines: { node: '>=6.9.0' } '@babel/core@7.26.10': - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==, + } + engines: { node: '>=6.9.0' } '@babel/generator@7.27.0': - resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==, + } + engines: { node: '>=6.9.0' } '@babel/helper-compilation-targets@7.27.0': - resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==, + } + engines: { node: '>=6.9.0' } '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==, + } + engines: { node: '>=6.9.0' } '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==, + } + engines: { node: '>=6.9.0' } '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, + } + engines: { node: '>=6.9.0' } '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, + } + engines: { node: '>=6.9.0' } '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==, + } + engines: { node: '>=6.9.0' } '@babel/helpers@7.27.0': - resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==, + } + engines: { node: '>=6.9.0' } '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==, + } + engines: { node: '>=6.0.0' } hasBin: true '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==, + } + engines: { node: '>=6.9.0' } '@babel/template@7.27.0': - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==, + } + engines: { node: '>=6.9.0' } '@babel/traverse@7.27.0': - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==, + } + engines: { node: '>=6.9.0' } '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==, + } + engines: { node: '>=6.9.0' } '@dnd-kit/accessibility@3.1.1': - resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} + resolution: + { + integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==, + } peerDependencies: react: '>=16.8.0' '@dnd-kit/core@6.3.1': - resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==} + resolution: + { + integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==, + } peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' '@dnd-kit/sortable@7.0.2': - resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} + resolution: + { + integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==, + } peerDependencies: '@dnd-kit/core': ^6.0.7 react: '>=16.8.0' '@dnd-kit/utilities@3.2.2': - resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + resolution: + { + integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==, + } peerDependencies: react: '>=16.8.0' '@douyinfe/semi-animation-react@2.77.1': - resolution: {integrity: sha512-imELR02pufgGFkZURfTd9oBUtZPYhHvXv9WsYoRvEoBM9U7yzxrR6Fb/Lc3TH+WHVJ2oZHH2S0APS5t1MceEOw==} + resolution: + { + integrity: sha512-imELR02pufgGFkZURfTd9oBUtZPYhHvXv9WsYoRvEoBM9U7yzxrR6Fb/Lc3TH+WHVJ2oZHH2S0APS5t1MceEOw==, + } '@douyinfe/semi-animation-styled@2.77.1': - resolution: {integrity: sha512-FBRroqVJroel1CXmBgV58ulZHG2xUVInJF7k0FAag54noKKaToEobSxRjiTJ6JHne3ZDU1M6sBqpbzYJElFnPQ==} + resolution: + { + integrity: sha512-FBRroqVJroel1CXmBgV58ulZHG2xUVInJF7k0FAag54noKKaToEobSxRjiTJ6JHne3ZDU1M6sBqpbzYJElFnPQ==, + } '@douyinfe/semi-animation@2.77.1': - resolution: {integrity: sha512-Q1D7whvQe0D+mPov8hXeH/e1uR/iBhpGGcW1LCTL2pSVMEZEYGJLf2KeXTTiCIgRVWm0PRH3Sux7auJ64zg7vw==} + resolution: + { + integrity: sha512-Q1D7whvQe0D+mPov8hXeH/e1uR/iBhpGGcW1LCTL2pSVMEZEYGJLf2KeXTTiCIgRVWm0PRH3Sux7auJ64zg7vw==, + } '@douyinfe/semi-foundation@2.77.1': - resolution: {integrity: sha512-DAXRy8ryLNzbKAiTAv+RrivGCoMU0asv2cO7PNV5aBq0ICB8XXn97FHyZo6Wb5NpqpyMhOaOr8Ro1bfpd0FeaA==} + resolution: + { + integrity: sha512-DAXRy8ryLNzbKAiTAv+RrivGCoMU0asv2cO7PNV5aBq0ICB8XXn97FHyZo6Wb5NpqpyMhOaOr8Ro1bfpd0FeaA==, + } '@douyinfe/semi-icons@2.77.1': - resolution: {integrity: sha512-IbGqYzbjzCoSd+//HlO/Gn1c3XmbulQwGys+JgDfQhYIbPeGyhQfLk56Q7ku3vJGC8BGy7dUmR9MbeTf1UQGtw==} + resolution: + { + integrity: sha512-IbGqYzbjzCoSd+//HlO/Gn1c3XmbulQwGys+JgDfQhYIbPeGyhQfLk56Q7ku3vJGC8BGy7dUmR9MbeTf1UQGtw==, + } peerDependencies: react: '>=16.0.0' '@douyinfe/semi-illustrations@2.77.1': - resolution: {integrity: sha512-FlESLOPaY0SadiSIFcP4gqJUk+CYkd4rHK6YP9bfjmU26v7h1S02H7pGLLV1lS0WnY4j0ad4zqRV9tbXFvba9g==} + resolution: + { + integrity: sha512-FlESLOPaY0SadiSIFcP4gqJUk+CYkd4rHK6YP9bfjmU26v7h1S02H7pGLLV1lS0WnY4j0ad4zqRV9tbXFvba9g==, + } peerDependencies: react: '>=16.0.0' '@douyinfe/semi-json-viewer-core@2.77.1': - resolution: {integrity: sha512-LOW+7ga2OzFIL9pGKftwHfl1kKLTV3x6Cs857iyvq9GIF/GHbAboiHcKUy2OZIHfy66zvP+Focs+yhfZG7IcZw==} + resolution: + { + integrity: sha512-LOW+7ga2OzFIL9pGKftwHfl1kKLTV3x6Cs857iyvq9GIF/GHbAboiHcKUy2OZIHfy66zvP+Focs+yhfZG7IcZw==, + } '@douyinfe/semi-theme-default@2.77.1': - resolution: {integrity: sha512-Rug75C7jjSqmCP2L2tBI0K4dnXuo4GardzwSzdSjxDkiaIXwOwR5KE0K1FRbKWkQ7xmxbyRu4S6Pff+CDEJ/lA==} + resolution: + { + integrity: sha512-Rug75C7jjSqmCP2L2tBI0K4dnXuo4GardzwSzdSjxDkiaIXwOwR5KE0K1FRbKWkQ7xmxbyRu4S6Pff+CDEJ/lA==, + } '@douyinfe/semi-ui@2.77.1': - resolution: {integrity: sha512-eIy7kr9OleCwlNRby3VICSGScHM23Zt2u7TJpID68qN3WrfQowGaB4wQ/0k5bvpLzv463HQnVWFk5aak+v46yw==} + resolution: + { + integrity: sha512-eIy7kr9OleCwlNRby3VICSGScHM23Zt2u7TJpID68qN3WrfQowGaB4wQ/0k5bvpLzv463HQnVWFk5aak+v46yw==, + } peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==, + } + engines: { node: '>=12' } cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==, + } + engines: { node: '>=12' } cpu: [arm64] os: [android] '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==, + } + engines: { node: '>=12' } cpu: [arm] os: [android] '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==, + } + engines: { node: '>=12' } cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==, + } + engines: { node: '>=12' } cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==, + } + engines: { node: '>=12' } cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==, + } + engines: { node: '>=12' } cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==, + } + engines: { node: '>=12' } cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==, + } + engines: { node: '>=12' } cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==, + } + engines: { node: '>=12' } cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==, + } + engines: { node: '>=12' } cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==, + } + engines: { node: '>=12' } cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==, + } + engines: { node: '>=12' } cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==, + } + engines: { node: '>=12' } cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==, + } + engines: { node: '>=12' } cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==, + } + engines: { node: '>=12' } cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==, + } + engines: { node: '>=12' } cpu: [x64] os: [linux] '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==, + } + engines: { node: '>=12' } cpu: [x64] os: [netbsd] '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==, + } + engines: { node: '>=12' } cpu: [x64] os: [openbsd] '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==, + } + engines: { node: '>=12' } cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==, + } + engines: { node: '>=12' } cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==, + } + engines: { node: '>=12' } cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==, + } + engines: { node: '>=12' } cpu: [x64] os: [win32] '@fluentui/react-component-event-listener@0.63.1': - resolution: {integrity: sha512-gSMdOh6tI3IJKZFqxfQwbTpskpME0CvxdxGM2tdglmf6ZPVDi0L4+KKIm+2dN8nzb8Ya1A8ZT+Ddq0KmZtwVQg==} + resolution: + { + integrity: sha512-gSMdOh6tI3IJKZFqxfQwbTpskpME0CvxdxGM2tdglmf6ZPVDi0L4+KKIm+2dN8nzb8Ya1A8ZT+Ddq0KmZtwVQg==, + } peerDependencies: react: ^16.8.0 || ^17 || ^18 react-dom: ^16.8.0 || ^17 || ^18 '@fluentui/react-component-ref@0.63.1': - resolution: {integrity: sha512-8MkXX4+R3i80msdbD4rFpEB4WWq2UDvGwG386g3ckIWbekdvN9z2kWAd9OXhRGqB7QeOsoAGWocp6gAMCivRlw==} + resolution: + { + integrity: sha512-8MkXX4+R3i80msdbD4rFpEB4WWq2UDvGwG386g3ckIWbekdvN9z2kWAd9OXhRGqB7QeOsoAGWocp6gAMCivRlw==, + } peerDependencies: react: ^16.8.0 || ^17 || ^18 react-dom: ^16.8.0 || ^17 || ^18 '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==, + } + engines: { node: '>=6.0.0' } '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: '>=6.0.0' } '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, + } + engines: { node: '>=6.0.0' } '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + resolution: + { + integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, + } '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + resolution: + { + integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + } '@mdx-js/mdx@3.1.0': - resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} + resolution: + { + integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==, + } '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + resolution: + { + integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==, + } '@remix-run/router@1.23.0': - resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==, + } + engines: { node: '>=14.0.0' } '@resvg/resvg-js-android-arm-eabi@2.4.1': - resolution: {integrity: sha512-AA6f7hS0FAPpvQMhBCf6f1oD1LdlqNXKCxAAPpKh6tR11kqV0YIB9zOlIYgITM14mq2YooLFl6XIbbvmY+jwUw==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-AA6f7hS0FAPpvQMhBCf6f1oD1LdlqNXKCxAAPpKh6tR11kqV0YIB9zOlIYgITM14mq2YooLFl6XIbbvmY+jwUw==, + } + engines: { node: '>= 10' } cpu: [arm] os: [android] '@resvg/resvg-js-android-arm64@2.4.1': - resolution: {integrity: sha512-/QleoRdPfsEuH9jUjilYcDtKK/BkmWcK+1LXM8L2nsnf/CI8EnFyv7ZzCj4xAIvZGAy9dTYr/5NZBcTwxG2HQg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-/QleoRdPfsEuH9jUjilYcDtKK/BkmWcK+1LXM8L2nsnf/CI8EnFyv7ZzCj4xAIvZGAy9dTYr/5NZBcTwxG2HQg==, + } + engines: { node: '>= 10' } cpu: [arm64] os: [android] '@resvg/resvg-js-darwin-arm64@2.4.1': - resolution: {integrity: sha512-U1oMNhea+kAXgiEXgzo7EbFGCD1Edq5aSlQoe6LMly6UjHzgx2W3N5kEXCwU/CgN5FiQhZr7PlSJSlcr7mdhfg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-U1oMNhea+kAXgiEXgzo7EbFGCD1Edq5aSlQoe6LMly6UjHzgx2W3N5kEXCwU/CgN5FiQhZr7PlSJSlcr7mdhfg==, + } + engines: { node: '>= 10' } cpu: [arm64] os: [darwin] '@resvg/resvg-js-darwin-x64@2.4.1': - resolution: {integrity: sha512-avyVh6DpebBfHHtTQTZYSr6NG1Ur6TEilk1+H0n7V+g4F7x7WPOo8zL00ZhQCeRQ5H4f8WXNWIEKL8fwqcOkYw==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-avyVh6DpebBfHHtTQTZYSr6NG1Ur6TEilk1+H0n7V+g4F7x7WPOo8zL00ZhQCeRQ5H4f8WXNWIEKL8fwqcOkYw==, + } + engines: { node: '>= 10' } cpu: [x64] os: [darwin] '@resvg/resvg-js-linux-arm-gnueabihf@2.4.1': - resolution: {integrity: sha512-isY/mdKoBWH4VB5v621co+8l101jxxYjuTkwOLsbW+5RK9EbLciPlCB02M99ThAHzI2MYxIUjXNmNgOW8btXvw==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-isY/mdKoBWH4VB5v621co+8l101jxxYjuTkwOLsbW+5RK9EbLciPlCB02M99ThAHzI2MYxIUjXNmNgOW8btXvw==, + } + engines: { node: '>= 10' } cpu: [arm] os: [linux] '@resvg/resvg-js-linux-arm64-gnu@2.4.1': - resolution: {integrity: sha512-uY5voSCrFI8TH95vIYBm5blpkOtltLxLRODyhKJhGfskOI7XkRw5/t1u0sWAGYD8rRSNX+CA+np86otKjubrNg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-uY5voSCrFI8TH95vIYBm5blpkOtltLxLRODyhKJhGfskOI7XkRw5/t1u0sWAGYD8rRSNX+CA+np86otKjubrNg==, + } + engines: { node: '>= 10' } cpu: [arm64] os: [linux] '@resvg/resvg-js-linux-arm64-musl@2.4.1': - resolution: {integrity: sha512-6mT0+JBCsermKMdi/O2mMk3m7SqOjwi9TKAwSngRZ/nQoL3Z0Z5zV+572ztgbWr0GODB422uD8e9R9zzz38dRQ==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-6mT0+JBCsermKMdi/O2mMk3m7SqOjwi9TKAwSngRZ/nQoL3Z0Z5zV+572ztgbWr0GODB422uD8e9R9zzz38dRQ==, + } + engines: { node: '>= 10' } cpu: [arm64] os: [linux] '@resvg/resvg-js-linux-x64-gnu@2.4.1': - resolution: {integrity: sha512-60KnrscLj6VGhkYOJEmmzPlqqfcw1keDh6U+vMcNDjPhV3B5vRSkpP/D/a8sfokyeh4VEacPSYkWGezvzS2/mg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-60KnrscLj6VGhkYOJEmmzPlqqfcw1keDh6U+vMcNDjPhV3B5vRSkpP/D/a8sfokyeh4VEacPSYkWGezvzS2/mg==, + } + engines: { node: '>= 10' } cpu: [x64] os: [linux] '@resvg/resvg-js-linux-x64-musl@2.4.1': - resolution: {integrity: sha512-0AMyZSICC1D7ge115cOZQW8Pcad6PjWuZkBFF3FJuSxC6Dgok0MQnLTs2MfMdKBlAcwO9dXsf3bv9tJZj8pATA==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-0AMyZSICC1D7ge115cOZQW8Pcad6PjWuZkBFF3FJuSxC6Dgok0MQnLTs2MfMdKBlAcwO9dXsf3bv9tJZj8pATA==, + } + engines: { node: '>= 10' } cpu: [x64] os: [linux] '@resvg/resvg-js-win32-arm64-msvc@2.4.1': - resolution: {integrity: sha512-76XDFOFSa3d0QotmcNyChh2xHwk+JTFiEQBVxMlHpHMeq7hNrQJ1IpE1zcHSQvrckvkdfLboKRrlGB86B10Qjw==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-76XDFOFSa3d0QotmcNyChh2xHwk+JTFiEQBVxMlHpHMeq7hNrQJ1IpE1zcHSQvrckvkdfLboKRrlGB86B10Qjw==, + } + engines: { node: '>= 10' } cpu: [arm64] os: [win32] '@resvg/resvg-js-win32-ia32-msvc@2.4.1': - resolution: {integrity: sha512-odyVFGrEWZIzzJ89KdaFtiYWaIJh9hJRW/frcEcG3agJ464VXkN/2oEVF5ulD+5mpGlug9qJg7htzHcKxDN8sg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-odyVFGrEWZIzzJ89KdaFtiYWaIJh9hJRW/frcEcG3agJ464VXkN/2oEVF5ulD+5mpGlug9qJg7htzHcKxDN8sg==, + } + engines: { node: '>= 10' } cpu: [ia32] os: [win32] '@resvg/resvg-js-win32-x64-msvc@2.4.1': - resolution: {integrity: sha512-vY4kTLH2S3bP+puU5x7hlAxHv+ulFgcK6Zn3efKSr0M0KnZ9A3qeAjZteIpkowEFfUeMPNg2dvvoFRJA9zqxSw==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-vY4kTLH2S3bP+puU5x7hlAxHv+ulFgcK6Zn3efKSr0M0KnZ9A3qeAjZteIpkowEFfUeMPNg2dvvoFRJA9zqxSw==, + } + engines: { node: '>= 10' } cpu: [x64] os: [win32] '@resvg/resvg-js@2.4.1': - resolution: {integrity: sha512-wTOf1zerZX8qYcMmLZw3czR4paI4hXqPjShNwJRh5DeHxvgffUS5KM7XwxtbIheUW6LVYT5fhT2AJiP6mU7U4A==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-wTOf1zerZX8qYcMmLZw3czR4paI4hXqPjShNwJRh5DeHxvgffUS5KM7XwxtbIheUW6LVYT5fhT2AJiP6mU7U4A==, + } + engines: { node: '>= 10' } '@rollup/rollup-android-arm-eabi@4.39.0': - resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} + resolution: + { + integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==, + } cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.39.0': - resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==} + resolution: + { + integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==, + } cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.39.0': - resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==} + resolution: + { + integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==, + } cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.39.0': - resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==} + resolution: + { + integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==, + } cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.39.0': - resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==} + resolution: + { + integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==, + } cpu: [arm64] os: [freebsd] '@rollup/rollup-freebsd-x64@4.39.0': - resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==} + resolution: + { + integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==, + } cpu: [x64] os: [freebsd] '@rollup/rollup-linux-arm-gnueabihf@4.39.0': - resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==} + resolution: + { + integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==, + } cpu: [arm] os: [linux] '@rollup/rollup-linux-arm-musleabihf@4.39.0': - resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==} + resolution: + { + integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==, + } cpu: [arm] os: [linux] '@rollup/rollup-linux-arm64-gnu@4.39.0': - resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==} + resolution: + { + integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==, + } cpu: [arm64] os: [linux] '@rollup/rollup-linux-arm64-musl@4.39.0': - resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==} + resolution: + { + integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==, + } cpu: [arm64] os: [linux] '@rollup/rollup-linux-loongarch64-gnu@4.39.0': - resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==} + resolution: + { + integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==, + } cpu: [loong64] os: [linux] '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': - resolution: {integrity: sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==} + resolution: + { + integrity: sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==, + } cpu: [ppc64] os: [linux] '@rollup/rollup-linux-riscv64-gnu@4.39.0': - resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==} + resolution: + { + integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==, + } cpu: [riscv64] os: [linux] '@rollup/rollup-linux-riscv64-musl@4.39.0': - resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==} + resolution: + { + integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==, + } cpu: [riscv64] os: [linux] '@rollup/rollup-linux-s390x-gnu@4.39.0': - resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==} + resolution: + { + integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==, + } cpu: [s390x] os: [linux] '@rollup/rollup-linux-x64-gnu@4.39.0': - resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==} + resolution: + { + integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==, + } cpu: [x64] os: [linux] '@rollup/rollup-linux-x64-musl@4.39.0': - resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==} + resolution: + { + integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==, + } cpu: [x64] os: [linux] '@rollup/rollup-win32-arm64-msvc@4.39.0': - resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==} + resolution: + { + integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==, + } cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.39.0': - resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==} + resolution: + { + integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==, + } cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-msvc@4.39.0': - resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==} + resolution: + { + integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==, + } cpu: [x64] os: [win32] '@semantic-ui-react/event-stack@3.1.3': - resolution: {integrity: sha512-FdTmJyWvJaYinHrKRsMLDrz4tTMGdFfds299Qory53hBugiDvGC0tEJf+cHsi5igDwWb/CLOgOiChInHwq8URQ==} + resolution: + { + integrity: sha512-FdTmJyWvJaYinHrKRsMLDrz4tTMGdFfds299Qory53hBugiDvGC0tEJf+cHsi5igDwWb/CLOgOiChInHwq8URQ==, + } peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 '@so1ve/prettier-config@3.1.0': - resolution: {integrity: sha512-9GJ1yXKBC4DzqCTTaZoBf8zw7WWkVuXcccZt1Aqk4lj6ab/GiNUnjPGajUVYLjaqAEOKqM7jUSUfTjk2JTjCAg==} + resolution: + { + integrity: sha512-9GJ1yXKBC4DzqCTTaZoBf8zw7WWkVuXcccZt1Aqk4lj6ab/GiNUnjPGajUVYLjaqAEOKqM7jUSUfTjk2JTjCAg==, + } peerDependencies: prettier: ^3.0.0 '@so1ve/prettier-plugin-toml@3.1.0': - resolution: {integrity: sha512-8WZAGjAVNIJlkfWL6wHKxlUuEBY45fdd5qY5bR/Z6r/txgzKXk/r9qi1DTwc17gi/WcNuRrcRugecRT+mWbIYg==} + resolution: + { + integrity: sha512-8WZAGjAVNIJlkfWL6wHKxlUuEBY45fdd5qY5bR/Z6r/txgzKXk/r9qi1DTwc17gi/WcNuRrcRugecRT+mWbIYg==, + } peerDependencies: prettier: ^3.0.0 '@turf/boolean-clockwise@6.5.0': - resolution: {integrity: sha512-45+C7LC5RMbRWrxh3Z0Eihsc8db1VGBO5d9BLTOAwU4jR6SgsunTfRWR16X7JUwIDYlCVEmnjcXJNi/kIU3VIw==} + resolution: + { + integrity: sha512-45+C7LC5RMbRWrxh3Z0Eihsc8db1VGBO5d9BLTOAwU4jR6SgsunTfRWR16X7JUwIDYlCVEmnjcXJNi/kIU3VIw==, + } '@turf/clone@6.5.0': - resolution: {integrity: sha512-mzVtTFj/QycXOn6ig+annKrM6ZlimreKYz6f/GSERytOpgzodbQyOgkfwru100O1KQhhjSudKK4DsQ0oyi9cTw==} + resolution: + { + integrity: sha512-mzVtTFj/QycXOn6ig+annKrM6ZlimreKYz6f/GSERytOpgzodbQyOgkfwru100O1KQhhjSudKK4DsQ0oyi9cTw==, + } '@turf/flatten@6.5.0': - resolution: {integrity: sha512-IBZVwoNLVNT6U/bcUUllubgElzpMsNoCw8tLqBw6dfYg9ObGmpEjf9BIYLr7a2Yn5ZR4l7YIj2T7kD5uJjZADQ==} + resolution: + { + integrity: sha512-IBZVwoNLVNT6U/bcUUllubgElzpMsNoCw8tLqBw6dfYg9ObGmpEjf9BIYLr7a2Yn5ZR4l7YIj2T7kD5uJjZADQ==, + } '@turf/helpers@6.5.0': - resolution: {integrity: sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==} + resolution: + { + integrity: sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==, + } '@turf/invariant@6.5.0': - resolution: {integrity: sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==} + resolution: + { + integrity: sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==, + } '@turf/meta@3.14.0': - resolution: {integrity: sha512-OtXqLQuR9hlQ/HkAF/OdzRea7E0eZK1ay8y8CBXkoO2R6v34CsDrWYLMSo0ZzMsaQDpKo76NPP2GGo+PyG1cSg==} + resolution: + { + integrity: sha512-OtXqLQuR9hlQ/HkAF/OdzRea7E0eZK1ay8y8CBXkoO2R6v34CsDrWYLMSo0ZzMsaQDpKo76NPP2GGo+PyG1cSg==, + } '@turf/meta@6.5.0': - resolution: {integrity: sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==} + resolution: + { + integrity: sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==, + } '@turf/rewind@6.5.0': - resolution: {integrity: sha512-IoUAMcHWotBWYwSYuYypw/LlqZmO+wcBpn8ysrBNbazkFNkLf3btSDZMkKJO/bvOzl55imr/Xj4fi3DdsLsbzQ==} + resolution: + { + integrity: sha512-IoUAMcHWotBWYwSYuYypw/LlqZmO+wcBpn8ysrBNbazkFNkLf3btSDZMkKJO/bvOzl55imr/Xj4fi3DdsLsbzQ==, + } '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + resolution: + { + integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, + } '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + resolution: + { + integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==, + } '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + resolution: + { + integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, + } '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + resolution: + { + integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==, + } '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + resolution: + { + integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, + } '@types/estree-jsx@1.0.5': - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + resolution: + { + integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==, + } '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + resolution: + { + integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==, + } '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + resolution: + { + integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==, + } '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + resolution: + { + integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==, + } '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + resolution: + { + integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==, + } '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + resolution: + { + integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==, + } '@types/parse-author@2.0.3': - resolution: {integrity: sha512-pgRW2K/GVQoogylrGJXDl7PBLW9A6T4OOc9Hy9MLT5f7vgufK2GQ8FcfAbjFHR5HjcN9ByzuCczAORk49REqoA==} + resolution: + { + integrity: sha512-pgRW2K/GVQoogylrGJXDl7PBLW9A6T4OOc9Hy9MLT5f7vgufK2GQ8FcfAbjFHR5HjcN9ByzuCczAORk49REqoA==, + } '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + resolution: + { + integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==, + } '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + resolution: + { + integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==, + } '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + resolution: + { + integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==, + } '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + resolution: + { + integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==, + } '@visactor/react-vchart@1.8.11': - resolution: {integrity: sha512-wHnCex9gOpnttTtSu04ozKJhTveUk8Ln2KX/7PZyCJxqlXq+eWvW4zvM6Ja8T8kGXfXtFYVVNh9zBMQ7y2T/Sw==} + resolution: + { + integrity: sha512-wHnCex9gOpnttTtSu04ozKJhTveUk8Ln2KX/7PZyCJxqlXq+eWvW4zvM6Ja8T8kGXfXtFYVVNh9zBMQ7y2T/Sw==, + } peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' '@visactor/vchart-semi-theme@1.8.8': - resolution: {integrity: sha512-lm57CX3r6Bm7iGBYYyWhDY+1BvkyhNVLEckKx2PnlPKpJHikKSIK2ACyI5SmHuSOOdYzhY2QK6ZfYa2NShJ83w==} + resolution: + { + integrity: sha512-lm57CX3r6Bm7iGBYYyWhDY+1BvkyhNVLEckKx2PnlPKpJHikKSIK2ACyI5SmHuSOOdYzhY2QK6ZfYa2NShJ83w==, + } peerDependencies: '@visactor/vchart': ~1.8.8 '@visactor/vchart-theme-utils@1.8.8': - resolution: {integrity: sha512-RdCey3/t0+82EYyFZvx210rgJJWti9rsgcL3ROZS7o9CtRW1CMj9u9LKLDNIcPLNcLNACFC0aoT03jpdD1BCpA==} + resolution: + { + integrity: sha512-RdCey3/t0+82EYyFZvx210rgJJWti9rsgcL3ROZS7o9CtRW1CMj9u9LKLDNIcPLNcLNACFC0aoT03jpdD1BCpA==, + } peerDependencies: '@visactor/vchart': ~1.8.8 '@visactor/vchart@1.8.11': - resolution: {integrity: sha512-RdQ822J02GgAQNXvO1LiT0T3O6FjdgPdcm9hVBFyrpBBmuI8MH02IE7Y1kGe9NiFTH4tDwP0ixRgBmqNSGSLZQ==} + resolution: + { + integrity: sha512-RdQ822J02GgAQNXvO1LiT0T3O6FjdgPdcm9hVBFyrpBBmuI8MH02IE7Y1kGe9NiFTH4tDwP0ixRgBmqNSGSLZQ==, + } '@visactor/vdataset@0.17.5': - resolution: {integrity: sha512-zVBdLWHWrhldGc8JDjSYF9lvpFT4ZEFQDB0b6yvfSiHzHKHiSco+rWmUFvA7r4ObT6j2QWF1vZAV9To8Ml4vHw==} + resolution: + { + integrity: sha512-zVBdLWHWrhldGc8JDjSYF9lvpFT4ZEFQDB0b6yvfSiHzHKHiSco+rWmUFvA7r4ObT6j2QWF1vZAV9To8Ml4vHw==, + } '@visactor/vgrammar-coordinate@0.10.11': - resolution: {integrity: sha512-XSUvEkaf/NQHFafmTwqoIMZicp9fF3o6NB2FDpuWrK4DI1lTuip/0RkqrC+kBAjc5erjt0em0TiITyqXpp4G6w==} + resolution: + { + integrity: sha512-XSUvEkaf/NQHFafmTwqoIMZicp9fF3o6NB2FDpuWrK4DI1lTuip/0RkqrC+kBAjc5erjt0em0TiITyqXpp4G6w==, + } '@visactor/vgrammar-core@0.10.11': - resolution: {integrity: sha512-VL9vcLPDg1LrHl7EOx0Ga9ATsoaChKIaCGzxjrPEjWiIS5VPU9Rs0jBKP+ch8BjamAoSuqL5mKd0L/RaUBqlaA==} + resolution: + { + integrity: sha512-VL9vcLPDg1LrHl7EOx0Ga9ATsoaChKIaCGzxjrPEjWiIS5VPU9Rs0jBKP+ch8BjamAoSuqL5mKd0L/RaUBqlaA==, + } '@visactor/vgrammar-hierarchy@0.10.11': - resolution: {integrity: sha512-0r3k51pPlJHu63BduG3htsV/ul62aVcKJxFftRfvKkwGjm1KeHoOZEEAwIf78U2puio0BkLqVn2Ek2L4FYZaIg==} + resolution: + { + integrity: sha512-0r3k51pPlJHu63BduG3htsV/ul62aVcKJxFftRfvKkwGjm1KeHoOZEEAwIf78U2puio0BkLqVn2Ek2L4FYZaIg==, + } '@visactor/vgrammar-projection@0.10.11': - resolution: {integrity: sha512-yEiKsxdfs5+g60wv5xZ1kyS/EDrAsUzAxCMpFFASVUYbQObHvW+elm+UPq2TBX6KZqAM0gsd1inzaLvfsCrLSg==} + resolution: + { + integrity: sha512-yEiKsxdfs5+g60wv5xZ1kyS/EDrAsUzAxCMpFFASVUYbQObHvW+elm+UPq2TBX6KZqAM0gsd1inzaLvfsCrLSg==, + } '@visactor/vgrammar-sankey@0.10.11': - resolution: {integrity: sha512-BbJTPuyydsL/L5XtQv59Q82GgJeePY7Wleac798usx3GnDK0GAOrPsI3bubSsOESJ4pNk3V4HPGEQDG1vCPb4w==} + resolution: + { + integrity: sha512-BbJTPuyydsL/L5XtQv59Q82GgJeePY7Wleac798usx3GnDK0GAOrPsI3bubSsOESJ4pNk3V4HPGEQDG1vCPb4w==, + } '@visactor/vgrammar-util@0.10.11': - resolution: {integrity: sha512-cJZLmKZvN95Y+yGhX+28+UpZu3bhYYlXDlHJNvXHyonI76ZYgtceyon2b3lI6XIsUsBGcD4Uo777s949X5os3g==} + resolution: + { + integrity: sha512-cJZLmKZvN95Y+yGhX+28+UpZu3bhYYlXDlHJNvXHyonI76ZYgtceyon2b3lI6XIsUsBGcD4Uo777s949X5os3g==, + } '@visactor/vgrammar-wordcloud-shape@0.10.11': - resolution: {integrity: sha512-NsQOYJp+9WHnIApMvkcUOaajxIg5U/r6rD8LKnoXW/HqAN2TFYXcRR3Daqmk9rrpM5VztQimKOsA1yZWyzozrA==} + resolution: + { + integrity: sha512-NsQOYJp+9WHnIApMvkcUOaajxIg5U/r6rD8LKnoXW/HqAN2TFYXcRR3Daqmk9rrpM5VztQimKOsA1yZWyzozrA==, + } '@visactor/vgrammar-wordcloud@0.10.11': - resolution: {integrity: sha512-JWDqjGhr9JlYkKVBeEkiOqLQk7C1x1BtnsZ+E8oN541gzUqHwfS9qZyhwI3OyoSLewJlsSSPu1vXLKSQzLzKPA==} + resolution: + { + integrity: sha512-JWDqjGhr9JlYkKVBeEkiOqLQk7C1x1BtnsZ+E8oN541gzUqHwfS9qZyhwI3OyoSLewJlsSSPu1vXLKSQzLzKPA==, + } '@visactor/vrender-components@0.17.17': - resolution: {integrity: sha512-7gYFQrozvBkyGF7s/JHXdWDZnATzymxzug63CZd4EB7A0OXKatVDImXRePqwzlPD3QamF7QMVWn0CuIx3gQ2gA==} + resolution: + { + integrity: sha512-7gYFQrozvBkyGF7s/JHXdWDZnATzymxzug63CZd4EB7A0OXKatVDImXRePqwzlPD3QamF7QMVWn0CuIx3gQ2gA==, + } '@visactor/vrender-core@0.17.17': - resolution: {integrity: sha512-pAZGaimunDAWOBdFhzPh0auH5ryxAHr+MVoz+QdASG+6RZXy8D02l8v2QYu4+e4uorxe/s2ZkdNDm81SlNkoHQ==} + resolution: + { + integrity: sha512-pAZGaimunDAWOBdFhzPh0auH5ryxAHr+MVoz+QdASG+6RZXy8D02l8v2QYu4+e4uorxe/s2ZkdNDm81SlNkoHQ==, + } '@visactor/vrender-kits@0.17.17': - resolution: {integrity: sha512-noRP1hAHvPCv36nf2P6sZ930Tk+dJ8jpPWIUm1cFYmUNdcumgIS8Cug0RyeZ+saSqVt5FDTwIwifhOqupw5Zaw==} + resolution: + { + integrity: sha512-noRP1hAHvPCv36nf2P6sZ930Tk+dJ8jpPWIUm1cFYmUNdcumgIS8Cug0RyeZ+saSqVt5FDTwIwifhOqupw5Zaw==, + } '@visactor/vscale@0.17.5': - resolution: {integrity: sha512-2dkS1IlAJ/IdTp8JElbctOOv6lkHKBKPDm8KvwBo0NuGWQeYAebSeyN3QCdwKbj76gMlCub4zc+xWrS5YiA2zA==} + resolution: + { + integrity: sha512-2dkS1IlAJ/IdTp8JElbctOOv6lkHKBKPDm8KvwBo0NuGWQeYAebSeyN3QCdwKbj76gMlCub4zc+xWrS5YiA2zA==, + } '@visactor/vutils-extension@1.8.11': - resolution: {integrity: sha512-Hknzpy3+xh4sdL0iSn5N93BHiMJF4FdwSwhHYEibRpriZmWKG6wBxsJ0Bll4d7oS4f+svxt8Sg2vRYKzQEcIxQ==} + resolution: + { + integrity: sha512-Hknzpy3+xh4sdL0iSn5N93BHiMJF4FdwSwhHYEibRpriZmWKG6wBxsJ0Bll4d7oS4f+svxt8Sg2vRYKzQEcIxQ==, + } '@visactor/vutils@0.17.5': - resolution: {integrity: sha512-HFN6Pk1Wc1RK842g02MeKOlvdri5L7/nqxMVTqxIvi0XMhHXpmoqN4+/9H+h8LmJpVohyrI/MT85TRBV/rManw==} + resolution: + { + integrity: sha512-HFN6Pk1Wc1RK842g02MeKOlvdri5L7/nqxMVTqxIvi0XMhHXpmoqN4+/9H+h8LmJpVohyrI/MT85TRBV/rManw==, + } '@vitejs/plugin-react@4.3.4': - resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { + integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==, + } + engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 abs-svg-path@0.1.1: - resolution: {integrity: sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==} + resolution: + { + integrity: sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==, + } acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==, + } + engines: { node: '>=0.4.0' } hasBin: true array-source@0.0.4: - resolution: {integrity: sha512-frNdc+zBn80vipY+GdcJkLEbMWj3xmzArYApmUGxoiV8uAu/ygcs9icPdsGdA26h0MkHUMW6EN2piIvVx+M5Mw==} + resolution: + { + integrity: sha512-frNdc+zBn80vipY+GdcJkLEbMWj3xmzArYApmUGxoiV8uAu/ygcs9icPdsGdA26h0MkHUMW6EN2piIvVx+M5Mw==, + } astring@1.9.0: - resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + resolution: + { + integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==, + } hasBin: true async-validator@3.5.2: - resolution: {integrity: sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ==} + resolution: + { + integrity: sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ==, + } asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } attr-accept@2.2.5: - resolution: {integrity: sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==, + } + engines: { node: '>=4' } author-regex@1.0.0: - resolution: {integrity: sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==, + } + engines: { node: '>=0.8' } axios@0.27.2: - resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + resolution: + { + integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==, + } bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + resolution: + { + integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, + } balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } bezier-easing@2.1.0: - resolution: {integrity: sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==} + resolution: + { + integrity: sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==, + } brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + resolution: + { + integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, + } + engines: { node: '>= 0.4' } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: '>=6' } caniuse-lite@1.0.30001709: - resolution: {integrity: sha512-NgL3vUTnDrPCZ3zTahp4fsugQ4dc7EKTSzwQDPEel6DMoMnfH2jhry9n2Zm8onbSR+f/QtKHFOA+iAQu4kbtWA==} + resolution: + { + integrity: sha512-NgL3vUTnDrPCZ3zTahp4fsugQ4dc7EKTSzwQDPEel6DMoMnfH2jhry9n2Zm8onbSR+f/QtKHFOA+iAQu4kbtWA==, + } ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + resolution: + { + integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, + } character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + resolution: + { + integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, + } character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + resolution: + { + integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, + } character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + resolution: + { + integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, + } character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + resolution: + { + integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==, + } classnames@2.5.1: - resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + resolution: + { + integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==, + } clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==, + } + engines: { node: '>=6' } collapse-white-space@2.1.0: - resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + resolution: + { + integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==, + } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: '>=7.0.0' } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: '>= 0.8' } comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + resolution: + { + integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==, + } commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + resolution: + { + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + } commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: '>= 6' } compute-scroll-into-view@1.0.20: - resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + resolution: + { + integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==, + } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } concat-stream@1.4.11: - resolution: {integrity: sha512-X3JMh8+4je3U1cQpG87+f9lXHDrqcb2MVLg9L7o8b1UZ0DzhRrUpdn65ttzu10PpJPPI3MQNkis+oha6TSA9Mw==} - engines: {'0': node >= 0.8} + resolution: + { + integrity: sha512-X3JMh8+4je3U1cQpG87+f9lXHDrqcb2MVLg9L7o8b1UZ0DzhRrUpdn65ttzu10PpJPPI3MQNkis+oha6TSA9Mw==, + } + engines: { '0': node >= 0.8 } concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} + resolution: + { + integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==, + } + engines: { '0': node >= 6.0 } convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } copy-text-to-clipboard@2.2.0: - resolution: {integrity: sha512-WRvoIdnTs1rgPMkgA2pUOa/M4Enh2uzCwdKsOMYNAJiz/4ZvEJgmbF4OmninPmlFdAWisfeh0tH+Cpf7ni3RqQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-WRvoIdnTs1rgPMkgA2pUOa/M4Enh2uzCwdKsOMYNAJiz/4ZvEJgmbF4OmninPmlFdAWisfeh0tH+Cpf7ni3RqQ==, + } + engines: { node: '>=6' } core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, + } + engines: { node: '>=10' } d3-array@1.2.4: - resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} + resolution: + { + integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==, + } d3-dsv@2.0.0: - resolution: {integrity: sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==} + resolution: + { + integrity: sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==, + } hasBin: true d3-geo@1.12.1: - resolution: {integrity: sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==} + resolution: + { + integrity: sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==, + } d3-hexbin@0.2.2: - resolution: {integrity: sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==} + resolution: + { + integrity: sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==, + } d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==, + } + engines: { node: '>=12' } date-fns-tz@1.3.8: - resolution: {integrity: sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==} + resolution: + { + integrity: sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==, + } peerDependencies: date-fns: '>=2.0.0' date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} + resolution: + { + integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==, + } + engines: { node: '>=0.11' } dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + resolution: + { + integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==, + } debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, + } + engines: { node: '>=6.0' } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -935,107 +1524,197 @@ packages: optional: true decode-named-character-reference@1.1.0: - resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + resolution: + { + integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==, + } delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: '>=0.4.0' } dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: '>=6' } devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + resolution: + { + integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, + } dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, + } + engines: { node: '>= 0.4' } electron-to-chromium@1.5.130: - resolution: {integrity: sha512-Ou2u7L9j2XLZbhqzyX0jWDj6gA8D3jIfVzt4rikLf3cGBa0VdReuFimBKS9tQJA4+XpeCxj1NoWlfBXzbMa9IA==} + resolution: + { + integrity: sha512-Ou2u7L9j2XLZbhqzyX0jWDj6gA8D3jIfVzt4rikLf3cGBa0VdReuFimBKS9tQJA4+XpeCxj1NoWlfBXzbMa9IA==, + } error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, + } + engines: { node: '>= 0.4' } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: '>= 0.4' } es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, + } + engines: { node: '>= 0.4' } es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, + } + engines: { node: '>= 0.4' } esast-util-from-estree@2.0.0: - resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + resolution: + { + integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==, + } esast-util-from-js@2.0.1: - resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + resolution: + { + integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==, + } esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==, + } + engines: { node: '>=12' } hasBin: true escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + } + engines: { node: '>=6' } escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, + } + engines: { node: '>=12' } estree-util-attach-comments@3.0.0: - resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + resolution: + { + integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==, + } estree-util-build-jsx@3.0.1: - resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + resolution: + { + integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==, + } estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + resolution: + { + integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==, + } estree-util-scope@1.0.0: - resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + resolution: + { + integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==, + } estree-util-to-js@2.0.0: - resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + resolution: + { + integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==, + } estree-util-visit@2.0.0: - resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + resolution: + { + integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==, + } estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + resolution: + { + integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, + } exenv@1.2.2: - resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} + resolution: + { + integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==, + } extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } fast-copy@3.0.2: - resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + resolution: + { + integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==, + } file-selector@2.1.2: - resolution: {integrity: sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==, + } + engines: { node: '>= 12' } file-source@0.6.1: - resolution: {integrity: sha512-1R1KneL7eTXmXfKxC10V/9NeGOdbsAXJ+lQ//fvvcHUgtaZcZDWNJNblxAoVOyV1cj45pOtUrR3vZTBwqcW8XA==} + resolution: + { + integrity: sha512-1R1KneL7eTXmXfKxC10V/9NeGOdbsAXJ+lQ//fvvcHUgtaZcZDWNJNblxAoVOyV1cj45pOtUrR3vZTBwqcW8XA==, + } follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==, + } + engines: { node: '>=4.0' } peerDependencies: debug: '*' peerDependenciesMeta: @@ -1043,524 +1722,986 @@ packages: optional: true form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==, + } + engines: { node: '>= 6' } fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, + } + engines: { node: '>=12' } fs-extra@4.0.3: - resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} + resolution: + { + integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==, + } fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: '>=6.9.0' } geobuf@3.0.2: - resolution: {integrity: sha512-ASgKwEAQQRnyNFHNvpd5uAwstbVYmiTW0Caw3fBb509tNTqXyAAPMyFs5NNihsLZhLxU1j/kjFhkhLWA9djuVg==} + resolution: + { + integrity: sha512-ASgKwEAQQRnyNFHNvpd5uAwstbVYmiTW0Caw3fBb509tNTqXyAAPMyFs5NNihsLZhLxU1j/kjFhkhLWA9djuVg==, + } hasBin: true geojson-dissolve@3.1.0: - resolution: {integrity: sha512-JXHfn+A3tU392HA703gJbjmuHaQOAE/C1KzbELCczFRFux+GdY6zt1nKb1VMBHp4LWeE7gUY2ql+g06vJqhiwQ==} + resolution: + { + integrity: sha512-JXHfn+A3tU392HA703gJbjmuHaQOAE/C1KzbELCczFRFux+GdY6zt1nKb1VMBHp4LWeE7gUY2ql+g06vJqhiwQ==, + } geojson-flatten@0.2.4: - resolution: {integrity: sha512-LiX6Jmot8adiIdZ/fthbcKKPOfWjTQchX/ggHnwMZ2e4b0I243N1ANUos0LvnzepTEsj0+D4fIJ5bKhBrWnAHA==} + resolution: + { + integrity: sha512-LiX6Jmot8adiIdZ/fthbcKKPOfWjTQchX/ggHnwMZ2e4b0I243N1ANUos0LvnzepTEsj0+D4fIJ5bKhBrWnAHA==, + } hasBin: true geojson-linestring-dissolve@0.0.1: - resolution: {integrity: sha512-Y8I2/Ea28R/Xeki7msBcpMvJL2TaPfaPKP8xqueJfQ9/jEhps+iOJxOR2XCBGgVb12Z6XnDb1CMbaPfLepsLaw==} + resolution: + { + integrity: sha512-Y8I2/Ea28R/Xeki7msBcpMvJL2TaPfaPKP8xqueJfQ9/jEhps+iOJxOR2XCBGgVb12Z6XnDb1CMbaPfLepsLaw==, + } get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, + } + engines: { node: '>= 0.4' } get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, + } + engines: { node: '>= 0.4' } get-stdin@6.0.0: - resolution: {integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==, + } + engines: { node: '>=4' } glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } deprecated: Glob versions prior to v9 are no longer supported globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: '>=4' } gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, + } + engines: { node: '>= 0.4' } graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, + } + engines: { node: '>= 0.4' } has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, + } + engines: { node: '>= 0.4' } hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: '>= 0.4' } hast-util-to-estree@3.1.3: - resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + resolution: + { + integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==, + } hast-util-to-jsx-runtime@2.3.6: - resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + resolution: + { + integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==, + } hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + resolution: + { + integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==, + } history@5.3.0: - resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} + resolution: + { + integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==, + } html-parse-stringify@3.0.1: - resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + resolution: + { + integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==, + } i18next-browser-languagedetector@7.2.2: - resolution: {integrity: sha512-6b7r75uIJDWCcCflmbof+sJ94k9UQO4X0YR62oUfqGI/GjCLVzlCwu8TFdRZIqVLzWbzNcmkmhfqKEr4TLz4HQ==} + resolution: + { + integrity: sha512-6b7r75uIJDWCcCflmbof+sJ94k9UQO4X0YR62oUfqGI/GjCLVzlCwu8TFdRZIqVLzWbzNcmkmhfqKEr4TLz4HQ==, + } i18next@23.16.8: - resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} + resolution: + { + integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==, + } iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: '>=0.10.0' } ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, + } + engines: { node: '>=6' } inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } inline-style-parser@0.2.4: - resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + resolution: + { + integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==, + } is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + resolution: + { + integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==, + } is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + resolution: + { + integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==, + } is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + resolution: + { + integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==, + } is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + resolution: + { + integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==, + } is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, + } + engines: { node: '>=12' } isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + resolution: + { + integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==, + } jquery@3.7.1: - resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} + resolution: + { + integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==, + } js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, + } + engines: { node: '>=6' } hasBin: true json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: '>=6' } hasBin: true jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + resolution: + { + integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==, + } jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + resolution: + { + integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, + } jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } keyboard-key@1.1.0: - resolution: {integrity: sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ==} + resolution: + { + integrity: sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ==, + } lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + resolution: + { + integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, + } lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + resolution: + { + integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, + } loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + resolution: + { + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, + } hasBin: true lottie-web@5.12.2: - resolution: {integrity: sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==} + resolution: + { + integrity: sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==, + } lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } markdown-extensions@2.0.0: - resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==, + } + engines: { node: '>=16' } markdown-table@3.0.4: - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + resolution: + { + integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==, + } marked@4.3.0: - resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==, + } + engines: { node: '>= 12' } hasBin: true math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, + } + engines: { node: '>= 0.4' } mdast-util-find-and-replace@3.0.2: - resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + resolution: + { + integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==, + } mdast-util-from-markdown@2.0.2: - resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + resolution: + { + integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==, + } mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + resolution: + { + integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==, + } mdast-util-gfm-footnote@2.1.0: - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + resolution: + { + integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==, + } mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + resolution: + { + integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==, + } mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + resolution: + { + integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==, + } mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + resolution: + { + integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==, + } mdast-util-gfm@3.1.0: - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + resolution: + { + integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==, + } mdast-util-mdx-expression@2.0.1: - resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + resolution: + { + integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==, + } mdast-util-mdx-jsx@3.2.0: - resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + resolution: + { + integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==, + } mdast-util-mdx@3.0.0: - resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + resolution: + { + integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==, + } mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + resolution: + { + integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==, + } mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + resolution: + { + integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==, + } mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + resolution: + { + integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==, + } mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + resolution: + { + integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==, + } mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + resolution: + { + integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, + } memoize-one@5.2.1: - resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + resolution: + { + integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==, + } micromark-core-commonmark@2.0.3: - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + resolution: + { + integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==, + } micromark-extension-gfm-autolink-literal@2.1.0: - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + resolution: + { + integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==, + } micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + resolution: + { + integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==, + } micromark-extension-gfm-strikethrough@2.1.0: - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + resolution: + { + integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==, + } micromark-extension-gfm-table@2.1.1: - resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + resolution: + { + integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==, + } micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + resolution: + { + integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==, + } micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + resolution: + { + integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==, + } micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + resolution: + { + integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==, + } micromark-extension-mdx-expression@3.0.1: - resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + resolution: + { + integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==, + } micromark-extension-mdx-jsx@3.0.2: - resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + resolution: + { + integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==, + } micromark-extension-mdx-md@2.0.0: - resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + resolution: + { + integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==, + } micromark-extension-mdxjs-esm@3.0.0: - resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + resolution: + { + integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==, + } micromark-extension-mdxjs@3.0.0: - resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + resolution: + { + integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==, + } micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + resolution: + { + integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==, + } micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + resolution: + { + integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==, + } micromark-factory-mdx-expression@2.0.3: - resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + resolution: + { + integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==, + } micromark-factory-space@2.0.1: - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + resolution: + { + integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==, + } micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + resolution: + { + integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==, + } micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + resolution: + { + integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==, + } micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + resolution: + { + integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==, + } micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + resolution: + { + integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==, + } micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + resolution: + { + integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==, + } micromark-util-combine-extensions@2.0.1: - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + resolution: + { + integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==, + } micromark-util-decode-numeric-character-reference@2.0.2: - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + resolution: + { + integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==, + } micromark-util-decode-string@2.0.1: - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + resolution: + { + integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==, + } micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + resolution: + { + integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==, + } micromark-util-events-to-acorn@2.0.3: - resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + resolution: + { + integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==, + } micromark-util-html-tag-name@2.0.1: - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + resolution: + { + integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==, + } micromark-util-normalize-identifier@2.0.1: - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + resolution: + { + integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==, + } micromark-util-resolve-all@2.0.1: - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + resolution: + { + integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==, + } micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + resolution: + { + integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==, + } micromark-util-subtokenize@2.1.0: - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + resolution: + { + integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==, + } micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + resolution: + { + integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==, + } micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + resolution: + { + integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==, + } micromark@4.0.2: - resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + resolution: + { + integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==, + } mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: '>= 0.6' } mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: '>= 0.6' } minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } minimist@1.2.0: - resolution: {integrity: sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw==} + resolution: + { + integrity: sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw==, + } minimist@1.2.6: - resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + resolution: + { + integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==, + } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + resolution: + { + integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==, + } object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: '>=0.10.0' } once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: '>=6' } parse-author@2.0.0: - resolution: {integrity: sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==, + } + engines: { node: '>=0.10.0' } parse-entities@4.0.2: - resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + resolution: + { + integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==, + } parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: '>=8' } parse-svg-path@0.1.2: - resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==} + resolution: + { + integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==, + } path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + resolution: + { + integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, + } path-data-parser@0.1.0: - resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + resolution: + { + integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==, + } path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: '>=0.10.0' } path-source@0.1.3: - resolution: {integrity: sha512-dWRHm5mIw5kw0cs3QZLNmpUWty48f5+5v9nWD2dw3Y0Hf+s01Ag8iJEWV0Sm0kocE8kK27DrIowha03e1YR+Qw==} + resolution: + { + integrity: sha512-dWRHm5mIw5kw0cs3QZLNmpUWty48f5+5v9nWD2dw3Y0Hf+s01Ag8iJEWV0Sm0kocE8kK27DrIowha03e1YR+Qw==, + } path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + } + engines: { node: '>=8' } pbf@3.3.0: - resolution: {integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==} + resolution: + { + integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==, + } hasBin: true picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } point-at-length@1.1.0: - resolution: {integrity: sha512-nNHDk9rNEh/91o2Y8kHLzBLNpLf80RYd2gCun9ss+V0ytRSf6XhryBTx071fesktjbachRmGuUbId+JQmzhRXw==} + resolution: + { + integrity: sha512-nNHDk9rNEh/91o2Y8kHLzBLNpLf80RYd2gCun9ss+V0ytRSf6XhryBTx071fesktjbachRmGuUbId+JQmzhRXw==, + } points-on-curve@0.2.0: - resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + resolution: + { + integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==, + } points-on-path@0.2.1: - resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + resolution: + { + integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==, + } postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==, + } + engines: { node: ^10 || ^12 || >=14 } prettier-package-json@2.8.0: - resolution: {integrity: sha512-WxtodH/wWavfw3MR7yK/GrS4pASEQ+iSTkdtSxPJWvqzG55ir5nvbLt9rw5AOiEcqqPCRM92WCtR1rk3TG3JSQ==} + resolution: + { + integrity: sha512-WxtodH/wWavfw3MR7yK/GrS4pASEQ+iSTkdtSxPJWvqzG55ir5nvbLt9rw5AOiEcqqPCRM92WCtR1rk3TG3JSQ==, + } hasBin: true prettier-plugin-astro@0.14.1: - resolution: {integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==} - engines: {node: ^14.15.0 || >=16.0.0} + resolution: + { + integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==, + } + engines: { node: ^14.15.0 || >=16.0.0 } prettier-plugin-curly-and-jsdoc@3.1.0: - resolution: {integrity: sha512-4QMOHnLlkP2jTRWS0MFH6j+cuOiXLvXOqCLKbtwwVd8PPyq8NenW5AAwfwqiTNHBQG/DmzViPphRrwgN0XkUVQ==} + resolution: + { + integrity: sha512-4QMOHnLlkP2jTRWS0MFH6j+cuOiXLvXOqCLKbtwwVd8PPyq8NenW5AAwfwqiTNHBQG/DmzViPphRrwgN0XkUVQ==, + } peerDependencies: prettier: ^3.0.0 prettier-plugin-pkgsort@0.2.1: - resolution: {integrity: sha512-/k5MIw84EhgoH7dmq4+6ozHjJ0VYbxbw17g4C+WPGHODkLivGwJoA6U1YPR/KObyRDMQJHXAfXKu++9smg7Jyw==} + resolution: + { + integrity: sha512-/k5MIw84EhgoH7dmq4+6ozHjJ0VYbxbw17g4C+WPGHODkLivGwJoA6U1YPR/KObyRDMQJHXAfXKu++9smg7Jyw==, + } peerDependencies: prettier: ^3.0.0 prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==, + } + engines: { node: '>=14' } hasBin: true prismjs@1.30.0: - resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==, + } + engines: { node: '>=6' } prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + resolution: + { + integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, + } property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + resolution: + { + integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==, + } protocol-buffers-schema@3.6.0: - resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} + resolution: + { + integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==, + } react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + resolution: + { + integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==, + } peerDependencies: react: ^18.3.1 react-draggable@4.4.6: - resolution: {integrity: sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==} + resolution: + { + integrity: sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==, + } peerDependencies: react: '>= 16.3.0' react-dom: '>= 16.3.0' react-dropzone@14.3.8: - resolution: {integrity: sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==} - engines: {node: '>= 10.13'} + resolution: + { + integrity: sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==, + } + engines: { node: '>= 10.13' } peerDependencies: react: '>= 16.8 || 18.0.0' react-fast-compare@3.2.2: - resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + resolution: + { + integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==, + } react-fireworks@1.0.4: - resolution: {integrity: sha512-jj1a+HTicB4pR6g2lqhVyAox0GTE0TOrZK2XaJFRYOwltgQWeYErZxnvU9+zH/blY+Hpmu9IKyb39OD3KcCMJw==} + resolution: + { + integrity: sha512-jj1a+HTicB4pR6g2lqhVyAox0GTE0TOrZK2XaJFRYOwltgQWeYErZxnvU9+zH/blY+Hpmu9IKyb39OD3KcCMJw==, + } react-i18next@13.5.0: - resolution: {integrity: sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==} + resolution: + { + integrity: sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==, + } peerDependencies: i18next: '>= 23.2.3' react: '>= 16.8.0' @@ -1573,302 +2714,548 @@ packages: optional: true react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + resolution: + { + integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, + } react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + resolution: + { + integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==, + } react-popper@2.3.0: - resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==} + resolution: + { + integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==, + } peerDependencies: '@popperjs/core': ^2.0.0 react: ^16.8.0 || ^17 || ^18 react-dom: ^16.8.0 || ^17 || ^18 react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==, + } + engines: { node: '>=0.10.0' } react-resizable@3.0.5: - resolution: {integrity: sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==} + resolution: + { + integrity: sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==, + } peerDependencies: react: '>= 16.3' react-router-dom@6.30.0: - resolution: {integrity: sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==, + } + engines: { node: '>=14.0.0' } peerDependencies: react: '>=16.8' react-dom: '>=16.8' react-router@6.30.0: - resolution: {integrity: sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==, + } + engines: { node: '>=14.0.0' } peerDependencies: react: '>=16.8' react-telegram-login@1.1.2: - resolution: {integrity: sha512-pDP+bvfaklWgnK5O6yvZnIwgky0nnYUU6Zhk0EjdMSkPsLQoOzZRsXIoZnbxyBXhi7346bsxMH+EwwJPTxClDw==} + resolution: + { + integrity: sha512-pDP+bvfaklWgnK5O6yvZnIwgky0nnYUU6Zhk0EjdMSkPsLQoOzZRsXIoZnbxyBXhi7346bsxMH+EwwJPTxClDw==, + } peerDependencies: react: ^16.13.1 react-toastify@9.1.3: - resolution: {integrity: sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==} + resolution: + { + integrity: sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==, + } peerDependencies: react: '>=16' react-dom: '>=16' react-turnstile@1.1.4: - resolution: {integrity: sha512-oluyRWADdsufCt5eMqacW4gfw8/csr6Tk+fmuaMx0PWMKP1SX1iCviLvD2D5w92eAzIYDHi/krUWGHhlfzxTpQ==} + resolution: + { + integrity: sha512-oluyRWADdsufCt5eMqacW4gfw8/csr6Tk+fmuaMx0PWMKP1SX1iCviLvD2D5w92eAzIYDHi/krUWGHhlfzxTpQ==, + } peerDependencies: react: '>= 16.13.1' react-dom: '>= 16.13.1' react-window@1.8.11: - resolution: {integrity: sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==} - engines: {node: '>8.0.0'} + resolution: + { + integrity: sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==, + } + engines: { node: '>8.0.0' } peerDependencies: react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==, + } + engines: { node: '>=0.10.0' } readable-stream@1.1.14: - resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + resolution: + { + integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==, + } readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: '>= 6' } recma-build-jsx@1.0.0: - resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + resolution: + { + integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==, + } recma-jsx@1.0.0: - resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + resolution: + { + integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==, + } recma-parse@1.0.0: - resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + resolution: + { + integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==, + } recma-stringify@1.0.0: - resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + resolution: + { + integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==, + } regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } rehype-recma@1.0.0: - resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + resolution: + { + integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==, + } remark-gfm@4.0.1: - resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + resolution: + { + integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==, + } remark-mdx@3.1.0: - resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + resolution: + { + integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==, + } remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + resolution: + { + integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==, + } remark-rehype@11.1.2: - resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + resolution: + { + integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==, + } remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + resolution: + { + integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==, + } resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: '>=4' } resolve-protobuf-schema@2.1.0: - resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + resolution: + { + integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==, + } rollup@4.39.0: - resolution: {integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + resolution: + { + integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==, + } + engines: { node: '>=18.0.0', npm: '>=8.0.0' } hasBin: true roughjs@4.5.2: - resolution: {integrity: sha512-2xSlLDKdsWyFxrveYWk9YQ/Y9UfK38EAMRNkYkMqYBJvPX8abCa9PN0x3w02H8Oa6/0bcZICJU+U95VumPqseg==} + resolution: + { + integrity: sha512-2xSlLDKdsWyFxrveYWk9YQ/Y9UfK38EAMRNkYkMqYBJvPX8abCa9PN0x3w02H8Oa6/0bcZICJU+U95VumPqseg==, + } rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + resolution: + { + integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==, + } s.color@0.0.15: - resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} + resolution: + { + integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==, + } safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } sass-formatter@0.7.9: - resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} + resolution: + { + integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==, + } scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + resolution: + { + integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==, + } scroll-into-view-if-needed@2.2.31: - resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + resolution: + { + integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==, + } semantic-ui-offline@2.5.0: - resolution: {integrity: sha512-Fldx3SfaVtWx5EeCb/5EiJwYkzrGbtsAwVs02xLkeV5z5l8GJmplWEVOeJVjbEpmyiwPWp7cA48JwT5RjbWBVA==} + resolution: + { + integrity: sha512-Fldx3SfaVtWx5EeCb/5EiJwYkzrGbtsAwVs02xLkeV5z5l8GJmplWEVOeJVjbEpmyiwPWp7cA48JwT5RjbWBVA==, + } semantic-ui-react@2.1.5: - resolution: {integrity: sha512-nIqmmUNpFHfovEb+RI2w3E2/maZQutd8UIWyRjf1SLse+XF51hI559xbz/sLN3O6RpLjr/echLOOXwKCirPy3Q==} + resolution: + { + integrity: sha512-nIqmmUNpFHfovEb+RI2w3E2/maZQutd8UIWyRjf1SLse+XF51hI559xbz/sLN3O6RpLjr/echLOOXwKCirPy3Q==, + } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } hasBin: true shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + resolution: + { + integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==, + } shapefile@0.6.6: - resolution: {integrity: sha512-rLGSWeK2ufzCVx05wYd+xrWnOOdSV7xNUW5/XFgx3Bc02hBkpMlrd2F1dDII7/jhWzv0MSyBFh5uJIy9hLdfuw==} + resolution: + { + integrity: sha512-rLGSWeK2ufzCVx05wYd+xrWnOOdSV7xNUW5/XFgx3Bc02hBkpMlrd2F1dDII7/jhWzv0MSyBFh5uJIy9hLdfuw==, + } hasBin: true simple-statistics@7.8.8: - resolution: {integrity: sha512-CUtP0+uZbcbsFpqEyvNDYjJCl+612fNgjT8GaVuvMG7tBuJg8gXGpsP5M7X658zy0IcepWOZ6nPBu1Qb9ezA1w==} + resolution: + { + integrity: sha512-CUtP0+uZbcbsFpqEyvNDYjJCl+612fNgjT8GaVuvMG7tBuJg8gXGpsP5M7X658zy0IcepWOZ6nPBu1Qb9ezA1w==, + } simplify-geojson@1.0.5: - resolution: {integrity: sha512-02l1W4UipP5ivNVq6kX15mAzCRIV1oI3tz0FUEyOsNiv1ltuFDjbNhO+nbv/xhbDEtKqWLYuzpWhUsJrjR/ypA==} + resolution: + { + integrity: sha512-02l1W4UipP5ivNVq6kX15mAzCRIV1oI3tz0FUEyOsNiv1ltuFDjbNhO+nbv/xhbDEtKqWLYuzpWhUsJrjR/ypA==, + } hasBin: true simplify-geometry@0.0.2: - resolution: {integrity: sha512-ZEyrplkqgCqDlL7V8GbbYgTLlcnNF+MWWUdy8s8ZeJru50bnI71rDew/I+HG36QS2mPOYAq1ZjwNXxHJ8XOVBw==} + resolution: + { + integrity: sha512-ZEyrplkqgCqDlL7V8GbbYgTLlcnNF+MWWUdy8s8ZeJru50bnI71rDew/I+HG36QS2mPOYAq1ZjwNXxHJ8XOVBw==, + } slice-source@0.4.1: - resolution: {integrity: sha512-YiuPbxpCj4hD9Qs06hGAz/OZhQ0eDuALN0lRWJez0eD/RevzKqGdUx1IOMUnXgpr+sXZLq3g8ERwbAH0bCb8vg==} + resolution: + { + integrity: sha512-YiuPbxpCj4hD9Qs06hGAz/OZhQ0eDuALN0lRWJez0eD/RevzKqGdUx1IOMUnXgpr+sXZLq3g8ERwbAH0bCb8vg==, + } sort-object-keys@1.1.3: - resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + resolution: + { + integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==, + } sort-order@1.1.2: - resolution: {integrity: sha512-Q8tOrwB1TSv9fNUXym9st3TZJODtmcOIi2JWCkVNQPrRg17KPwlpwweTEb7pMwUIFMTAgx2/JsQQXEPFzYQj3A==} + resolution: + { + integrity: sha512-Q8tOrwB1TSv9fNUXym9st3TZJODtmcOIi2JWCkVNQPrRg17KPwlpwweTEb7pMwUIFMTAgx2/JsQQXEPFzYQj3A==, + } source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: '>=0.10.0' } source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, + } + engines: { node: '>= 8' } space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + resolution: + { + integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, + } sse.js@https://codeload.github.com/mpetazzoni/sse.js/tar.gz/39b9b82aae95fd58d9d08b487845fe230f4b14e6: - resolution: {tarball: https://codeload.github.com/mpetazzoni/sse.js/tar.gz/39b9b82aae95fd58d9d08b487845fe230f4b14e6} + resolution: + { + tarball: https://codeload.github.com/mpetazzoni/sse.js/tar.gz/39b9b82aae95fd58d9d08b487845fe230f4b14e6, + } version: 2.6.0 stream-source@0.3.5: - resolution: {integrity: sha512-ZuEDP9sgjiAwUVoDModftG0JtYiLUV8K4ljYD1VyUMRWtbVf92474o4kuuul43iZ8t/hRuiDAx1dIJSvirrK/g==} + resolution: + { + integrity: sha512-ZuEDP9sgjiAwUVoDModftG0JtYiLUV8K4ljYD1VyUMRWtbVf92474o4kuuul43iZ8t/hRuiDAx1dIJSvirrK/g==, + } string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + resolution: + { + integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==, + } string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + resolution: + { + integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==, + } style-to-js@1.1.16: - resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} + resolution: + { + integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==, + } style-to-object@1.0.8: - resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + resolution: + { + integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==, + } suf-log@2.5.3: - resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} + resolution: + { + integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==, + } text-encoding@0.6.4: - resolution: {integrity: sha512-hJnc6Qg3dWoOMkqP53F0dzRIgtmsAge09kxUIqGrEUS4qr5rWLckGYaQAVr+opBrIMRErGgy6f5aPnyPpyGRfg==} + resolution: + { + integrity: sha512-hJnc6Qg3dWoOMkqP53F0dzRIgtmsAge09kxUIqGrEUS4qr5rWLckGYaQAVr+opBrIMRErGgy6f5aPnyPpyGRfg==, + } deprecated: no longer maintained topojson-client@3.1.0: - resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} + resolution: + { + integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==, + } hasBin: true topojson-server@3.0.1: - resolution: {integrity: sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==} + resolution: + { + integrity: sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==, + } hasBin: true trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + resolution: + { + integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, + } trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + resolution: + { + integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==, + } tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + resolution: + { + integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, + } typedarray@0.0.7: - resolution: {integrity: sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==} + resolution: + { + integrity: sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==, + } typescript@4.4.2: - resolution: {integrity: sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==} - engines: {node: '>=4.2.0'} + resolution: + { + integrity: sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==, + } + engines: { node: '>=4.2.0' } hasBin: true unified@11.0.5: - resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + resolution: + { + integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==, + } unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + resolution: + { + integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==, + } unist-util-position-from-estree@2.0.0: - resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + resolution: + { + integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==, + } unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + resolution: + { + integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==, + } unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + resolution: + { + integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, + } unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + resolution: + { + integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==, + } unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + resolution: + { + integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, + } universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + resolution: + { + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, + } + engines: { node: '>= 4.0.0' } universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + resolution: + { + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, + } + engines: { node: '>= 10.0.0' } update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + resolution: + { + integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==, + } hasBin: true peerDependencies: browserslist: '>= 4.21.0' util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } utility-types@3.11.0: - resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==, + } + engines: { node: '>= 4' } vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + resolution: + { + integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==, + } vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + resolution: + { + integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==, + } vite@5.4.16: - resolution: {integrity: sha512-Y5gnfp4NemVfgOTDQAunSD4346fal44L9mszGGY/e+qxsRT5y1sMlS/8tiQ8AFAp+MFgYNSINdfEchJiPm41vQ==} - engines: {node: ^18.0.0 || >=20.0.0} + resolution: + { + integrity: sha512-Y5gnfp4NemVfgOTDQAunSD4346fal44L9mszGGY/e+qxsRT5y1sMlS/8tiQ8AFAp+MFgYNSINdfEchJiPm41vQ==, + } + engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true peerDependencies: '@types/node': ^18.0.0 || >=20.0.0 @@ -1898,27 +3285,44 @@ packages: optional: true void-elements@3.1.0: - resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==, + } + engines: { node: '>=0.10.0' } warning@4.0.3: - resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + resolution: + { + integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==, + } wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, + } + engines: { node: '>= 6' } zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + resolution: + { + integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, + } snapshots: - '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -4046,7 +5450,8 @@ snapshots: space-separated-tokens@2.0.2: {} - sse.js@https://codeload.github.com/mpetazzoni/sse.js/tar.gz/39b9b82aae95fd58d9d08b487845fe230f4b14e6: {} + sse.js@https://codeload.github.com/mpetazzoni/sse.js/tar.gz/39b9b82aae95fd58d9d08b487845fe230f4b14e6: + {} stream-source@0.3.5: {} diff --git a/web/src/App.js b/web/src/App.js index 15f449be..d37000a7 100644 --- a/web/src/App.js +++ b/web/src/App.js @@ -21,9 +21,9 @@ import Chat2Link from './pages/Chat2Link'; import { Layout } from '@douyinfe/semi-ui'; import Midjourney from './pages/Midjourney'; import Pricing from './pages/Pricing/index.js'; -import Task from "./pages/Task/index.js"; +import Task from './pages/Task/index.js'; import Playground from './pages/Playground/Playground.js'; -import OAuth2Callback from "./components/OAuth2Callback.js"; +import OAuth2Callback from './components/OAuth2Callback.js'; import PersonalSetting from './components/PersonalSetting.js'; import Setup from './pages/Setup/index.js'; @@ -33,7 +33,7 @@ const About = lazy(() => import('./pages/About')); function App() { const location = useLocation(); - + return ( <> @@ -166,18 +166,18 @@ function App() { } /> }> - - - } + path='/oauth/oidc' + element={ + }> + + + } /> } key={location.pathname}> - + } /> @@ -274,19 +274,19 @@ function App() { } /> {/* 方便使用chat2link直接跳转聊天... */} - - } key={location.pathname}> - - - - } - /> - } /> - - + + } key={location.pathname}> + + + + } + /> + } /> + + ); } diff --git a/web/src/components/ChannelsTable.js b/web/src/components/ChannelsTable.js index df250593..15b4059a 100644 --- a/web/src/components/ChannelsTable.js +++ b/web/src/components/ChannelsTable.js @@ -7,7 +7,7 @@ import { showInfo, showSuccess, showWarning, - timestamp2string + timestamp2string, } from '../helpers'; import { CHANNEL_OPTIONS, ITEMS_PER_PAGE } from '../constants'; @@ -15,13 +15,18 @@ import { getQuotaPerUnit, renderGroup, renderNumberWithPoint, - renderQuota, renderQuotaWithPrompt, stringToColor + renderQuota, + renderQuotaWithPrompt, + stringToColor, } from '../helpers/render'; import { - Button, Divider, + Button, + Divider, Dropdown, - Form, Input, - InputNumber, Modal, + Form, + Input, + InputNumber, + Modal, Popconfirm, Space, SplitButtonGroup, @@ -31,10 +36,18 @@ import { Tooltip, Typography, Checkbox, - Layout + Layout, } from '@douyinfe/semi-ui'; import EditChannel from '../pages/Channel/EditChannel'; -import { IconList, IconTreeTriangleDown, IconClose, IconFilter, IconPlus, IconRefresh, IconSetting } from '@douyinfe/semi-icons'; +import { + IconList, + IconTreeTriangleDown, + IconClose, + IconFilter, + IconPlus, + IconRefresh, + IconSetting, +} from '@douyinfe/semi-icons'; import { loadChannelModels } from './utils.js'; import EditTagModal from '../pages/Channel/EditTagModal.js'; import TextNumberInput from './custom/TextNumberInput.js'; @@ -58,7 +71,7 @@ const ChannelsTable = () => { type2label[0] = { value: 0, label: t('未知类型'), color: 'grey' }; } return ( - + {type2label[type]?.label} ); @@ -82,25 +95,25 @@ const ChannelsTable = () => { switch (status) { case 1: return ( - + {t('已启用')} ); case 2: return ( - + {t('已禁用')} ); case 3: return ( - + {t('自动禁用')} ); default: return ( - + {t('未知状态')} ); @@ -112,31 +125,31 @@ const ChannelsTable = () => { time = time.toFixed(2) + t(' 秒'); if (responseTime === 0) { return ( - + {t('未测试')} ); } else if (responseTime <= 1000) { return ( - + {time} ); } else if (responseTime <= 3000) { return ( - + {time} ); } else if (responseTime <= 5000) { return ( - + {time} ); } else { return ( - + {time} ); @@ -154,7 +167,7 @@ const ChannelsTable = () => { BALANCE: 'balance', PRIORITY: 'priority', WEIGHT: 'weight', - OPERATE: 'operate' + OPERATE: 'operate', }; // State for column visibility @@ -184,7 +197,10 @@ const ChannelsTable = () => { useEffect(() => { if (Object.keys(visibleColumns).length > 0) { // Save to localStorage - localStorage.setItem('channels-table-columns', JSON.stringify(visibleColumns)); + localStorage.setItem( + 'channels-table-columns', + JSON.stringify(visibleColumns), + ); } }, [visibleColumns]); @@ -200,7 +216,7 @@ const ChannelsTable = () => { [COLUMN_KEYS.BALANCE]: true, [COLUMN_KEYS.PRIORITY]: true, [COLUMN_KEYS.WEIGHT]: true, - [COLUMN_KEYS.OPERATE]: true + [COLUMN_KEYS.OPERATE]: true, }; }; @@ -218,13 +234,13 @@ const ChannelsTable = () => { // Handle "Select All" checkbox const handleSelectAll = (checked) => { - const allKeys = Object.keys(COLUMN_KEYS).map(key => COLUMN_KEYS[key]); + const allKeys = Object.keys(COLUMN_KEYS).map((key) => COLUMN_KEYS[key]); const updatedColumns = {}; - - allKeys.forEach(key => { + + allKeys.forEach((key) => { updatedColumns[key] = checked; }); - + setVisibleColumns(updatedColumns); }; @@ -233,12 +249,12 @@ const ChannelsTable = () => { { key: COLUMN_KEYS.ID, title: t('ID'), - dataIndex: 'id' + dataIndex: 'id', }, { key: COLUMN_KEYS.NAME, title: t('名称'), - dataIndex: 'name' + dataIndex: 'name', }, { key: COLUMN_KEYS.GROUP, @@ -248,7 +264,8 @@ const ChannelsTable = () => { return (
- {text?.split(',') + {text + ?.split(',') .sort((a, b) => { if (a === 'default') return -1; if (b === 'default') return 1; @@ -260,7 +277,7 @@ const ChannelsTable = () => {
); - } + }, }, { key: COLUMN_KEYS.TYPE, @@ -272,7 +289,7 @@ const ChannelsTable = () => { } else { return <>{renderTagType()}; } - } + }, }, { key: COLUMN_KEYS.STATUS, @@ -288,7 +305,11 @@ const ChannelsTable = () => { let time = otherInfo['status_time']; return (
- + {renderStatus(text)}
@@ -296,7 +317,7 @@ const ChannelsTable = () => { } else { return renderStatus(text); } - } + }, }, { key: COLUMN_KEYS.RESPONSE_TIME, @@ -304,7 +325,7 @@ const ChannelsTable = () => { dataIndex: 'response_time', render: (text, record, index) => { return
{renderResponseTime(text)}
; - } + }, }, { key: COLUMN_KEYS.BALANCE, @@ -316,15 +337,17 @@ const ChannelsTable = () => {
- + {renderQuota(record.used_quota)} - + { updateChannelBalance(record); }} @@ -336,13 +359,15 @@ const ChannelsTable = () => {
); } else { - return - - {renderQuota(record.used_quota)} - - ; + return ( + + + {renderQuota(record.used_quota)} + + + ); } - } + }, }, { key: COLUMN_KEYS.PRIORITY, @@ -354,7 +379,7 @@ const ChannelsTable = () => {
{ manageChannel(record.id, 'priority', record, e.target.value); }} @@ -366,33 +391,38 @@ const ChannelsTable = () => {
); } else { - return <> - { - Modal.warning({ - title: t('修改子渠道优先级'), - content: t('确定要修改所有子渠道优先级为 ') + e.target.value + t(' 吗?'), - onOk: () => { - if (e.target.value === '') { - return; - } - submitTagEdit('priority', { - tag: record.key, - priority: e.target.value - }) - }, - }) - }} - innerButtons - defaultValue={record.priority} - min={-999} - /> - ; + return ( + <> + { + Modal.warning({ + title: t('修改子渠道优先级'), + content: + t('确定要修改所有子渠道优先级为 ') + + e.target.value + + t(' 吗?'), + onOk: () => { + if (e.target.value === '') { + return; + } + submitTagEdit('priority', { + tag: record.key, + priority: e.target.value, + }); + }, + }); + }} + innerButtons + defaultValue={record.priority} + min={-999} + /> + + ); } - } + }, }, { key: COLUMN_KEYS.WEIGHT, @@ -404,7 +434,7 @@ const ChannelsTable = () => {
{ manageChannel(record.id, 'weight', record, e.target.value); }} @@ -419,22 +449,25 @@ const ChannelsTable = () => { return ( { Modal.warning({ title: t('修改子渠道权重'), - content: t('确定要修改所有子渠道权重为 ') + e.target.value + t(' 吗?'), + content: + t('确定要修改所有子渠道权重为 ') + + e.target.value + + t(' 吗?'), onOk: () => { if (e.target.value === '') { return; } submitTagEdit('weight', { tag: record.key, - weight: e.target.value - }) + weight: e.target.value, + }); }, - }) + }); }} innerButtons defaultValue={record.weight} @@ -442,7 +475,7 @@ const ChannelsTable = () => { /> ); } - } + }, }, { key: COLUMN_KEYS.OPERATE, @@ -457,7 +490,7 @@ const ChannelsTable = () => { aria-label={t('测试单个渠道操作项目组')} > {record.status === 1 ? ( ) : ( )} @@ -542,8 +575,8 @@ const ChannelsTable = () => { return ( <> - - + + } style={{ width: isMobile() ? '90%' : 500 }} @@ -603,37 +640,47 @@ const ChannelsTable = () => { >
v === true)} - indeterminate={Object.values(visibleColumns).some(v => v === true) && !Object.values(visibleColumns).every(v => v === true)} - onChange={e => handleSelectAll(e.target.checked)} + checked={Object.values(visibleColumns).every((v) => v === true)} + indeterminate={ + Object.values(visibleColumns).some((v) => v === true) && + !Object.values(visibleColumns).every((v) => v === true) + } + onChange={(e) => handleSelectAll(e.target.checked)} > {t('全选')}
-
- {allColumns.map(column => { +
+ {allColumns.map((column) => { // Skip columns without title if (!column.title) { return null; } - + return ( -
+
handleColumnVisibilityChange(column.key, e.target.checked)} + onChange={(e) => + handleColumnVisibilityChange(column.key, e.target.checked) + } > {column.title} @@ -656,14 +703,14 @@ const ChannelsTable = () => { const [updatingBalance, setUpdatingBalance] = useState(false); const [pageSize, setPageSize] = useState(ITEMS_PER_PAGE); const [showPrompt, setShowPrompt] = useState( - shouldShowPrompt('channel-test') + shouldShowPrompt('channel-test'), ); const [channelCount, setChannelCount] = useState(pageSize); const [groupOptions, setGroupOptions] = useState([]); const [showEdit, setShowEdit] = useState(false); const [enableBatchDelete, setEnableBatchDelete] = useState(false); const [editingChannel, setEditingChannel] = useState({ - id: undefined + id: undefined, }); const [showEditTag, setShowEditTag] = useState(false); const [editingTag, setEditingTag] = useState(''); @@ -676,7 +723,6 @@ const ChannelsTable = () => { const [currentTestChannel, setCurrentTestChannel] = useState(null); const [modelSearchKeyword, setModelSearchKeyword] = useState(''); - const removeRecord = (record) => { let newDataSource = [...channels]; if (record.id != null) { @@ -689,7 +735,7 @@ const ChannelsTable = () => { } } } else { - return data.id === record.id + return data.id === record.id; } }); @@ -708,7 +754,7 @@ const ChannelsTable = () => { if (!enableTagMode) { channelDates.push(channels[i]); } else { - let tag = channels[i].tag ? channels[i].tag : ""; + let tag = channels[i].tag ? channels[i].tag : ''; // find from channelTags let tagIndex = channelTags[tag]; let tagChannelDates = undefined; @@ -767,7 +813,6 @@ const ChannelsTable = () => { tagChannelDates.response_time += channels[i].response_time; tagChannelDates.response_time = tagChannelDates.response_time / 2; } - } // data.key = '' + data.id setChannels(channelDates); @@ -781,7 +826,7 @@ const ChannelsTable = () => { const loadChannels = async (startIdx, pageSize, idSort, enableTagMode) => { setLoading(true); const res = await API.get( - `/api/channel/?p=${startIdx}&page_size=${pageSize}&id_sort=${idSort}&tag_mode=${enableTagMode}` + `/api/channel/?p=${startIdx}&page_size=${pageSize}&id_sort=${idSort}&tag_mode=${enableTagMode}`, ); if (res === undefined) { return; @@ -802,7 +847,7 @@ const ChannelsTable = () => { }; const copySelectedChannel = async (record) => { - const channelToCopy = record + const channelToCopy = record; channelToCopy.name += t('_复制'); channelToCopy.created_time = null; channelToCopy.balance = 0; @@ -899,12 +944,12 @@ const ChannelsTable = () => { switch (action) { case 'enable': res = await API.post('/api/channel/tag/enabled', { - tag: tag + tag: tag, }); break; case 'disable': res = await API.post('/api/channel/tag/disabled', { - tag: tag + tag: tag, }); break; } @@ -927,7 +972,12 @@ const ChannelsTable = () => { } }; - const searchChannels = async (searchKeyword, searchGroup, searchModel, enableTagMode) => { + const searchChannels = async ( + searchKeyword, + searchGroup, + searchModel, + enableTagMode, + ) => { if (searchKeyword === '' && searchGroup === '' && searchModel === '') { await loadChannels(0, pageSize, idSort, enableTagMode); setActivePage(1); @@ -935,7 +985,7 @@ const ChannelsTable = () => { } setSearching(true); const res = await API.get( - `/api/channel/search?keyword=${searchKeyword}&group=${searchGroup}&model=${searchModel}&id_sort=${idSort}&tag_mode=${enableTagMode}` + `/api/channel/search?keyword=${searchKeyword}&group=${searchGroup}&model=${searchModel}&id_sort=${idSort}&tag_mode=${enableTagMode}`, ); const { success, message, data } = res.data; if (success) { @@ -953,10 +1003,10 @@ const ChannelsTable = () => { let updated = false; // Find and update the correct channel - newChannels.forEach(channel => { + newChannels.forEach((channel) => { if (channel.children !== undefined) { // If this is a tag group, search in its children - channel.children.forEach(child => { + channel.children.forEach((child) => { if (child.id === channelId) { updateFn(child); updated = true; @@ -984,8 +1034,12 @@ const ChannelsTable = () => { channel.response_time = time * 1000; channel.test_time = Date.now() / 1000; }); - - showInfo(t('通道 ${name} 测试成功,耗时 ${time.toFixed(2)} 秒。').replace('${name}', record.name).replace('${time.toFixed(2)}', time.toFixed(2))); + + showInfo( + t('通道 ${name} 测试成功,耗时 ${time.toFixed(2)} 秒。') + .replace('${name}', record.name) + .replace('${time.toFixed(2)}', time.toFixed(2)), + ); } else { showError(message); } @@ -999,7 +1053,9 @@ const ChannelsTable = () => { channel.balance = balance; channel.balance_updated_time = Date.now() / 1000; }); - showInfo(t('通道 ${name} 余额更新成功!').replace('${name}', record.name)); + showInfo( + t('通道 ${name} 余额更新成功!').replace('${name}', record.name), + ); } else { showError(message); } @@ -1019,7 +1075,9 @@ const ChannelsTable = () => { const res = await API.delete(`/api/channel/disabled`); const { success, message, data } = res.data; if (success) { - showSuccess(t('已删除所有禁用渠道,共计 ${data} 个').replace('${data}', data)); + showSuccess( + t('已删除所有禁用渠道,共计 ${data} 个').replace('${data}', data), + ); await refresh(); } else { showError(message); @@ -1072,15 +1130,14 @@ const ChannelsTable = () => { let pageData = channels.slice( (activePage - 1) * pageSize, - activePage * pageSize + activePage * pageSize, ); const handlePageChange = (page) => { setActivePage(page); if (page === Math.ceil(channels.length / pageSize) + 1) { // In this case we have to load more data and then append them. - loadChannels(page - 1, pageSize, idSort, enableTagMode).then((r) => { - }); + loadChannels(page - 1, pageSize, idSort, enableTagMode).then((r) => {}); } }; @@ -1106,8 +1163,8 @@ const ChannelsTable = () => { setGroupOptions( res.data.data.map((group) => ({ label: group, - value: group - })) + value: group, + })), ); } catch (error) { showError(error.message); @@ -1124,12 +1181,16 @@ const ChannelsTable = () => { data.priority = parseInt(data.priority); break; case 'weight': - if (data.weight === undefined || data.weight < 0 || data.weight === '') { + if ( + data.weight === undefined || + data.weight < 0 || + data.weight === '' + ) { showInfo('权重必须是非负整数!'); return; } data.weight = parseInt(data.weight); - break + break; } try { @@ -1141,7 +1202,7 @@ const ChannelsTable = () => { } catch (error) { showError(error); } - } + }; const closeEdit = () => { setShowEdit(false); @@ -1151,8 +1212,8 @@ const ChannelsTable = () => { if (record.status !== 1) { return { style: { - background: 'var(--semi-color-disabled-border)' - } + background: 'var(--semi-color-disabled-border)', + }, }; } else { return {}; @@ -1168,13 +1229,15 @@ const ChannelsTable = () => { showError(t('标签不能为空!')); return; } - let ids = selectedChannels.map(channel => channel.id); + let ids = selectedChannels.map((channel) => channel.id); const res = await API.post('/api/channel/batch/tag', { ids: ids, - tag: batchSetTagValue === '' ? null : batchSetTagValue + tag: batchSetTagValue === '' ? null : batchSetTagValue, }); if (res.data.success) { - showSuccess(t('已为 ${count} 个渠道设置标签!').replace('${count}', res.data.data)); + showSuccess( + t('已为 ${count} 个渠道设置标签!').replace('${count}', res.data.data), + ); await refresh(); setShowBatchSetTag(false); } else { @@ -1199,14 +1262,19 @@ const ChannelsTable = () => { />
{ - searchChannels(searchKeyword, searchGroup, searchModel, enableTagMode); + searchChannels( + searchKeyword, + searchGroup, + searchModel, + enableTagMode, + ); }} - labelPosition="left" + labelPosition='left' >
{ }} /> { }} /> { setSearchGroup(v); @@ -1237,9 +1308,9 @@ const ChannelsTable = () => { /> - + - + @@ -1330,7 +1407,11 @@ const ChannelsTable = () => { onConfirm={testAllChannels} position={isMobile() ? 'top' : 'top'} > - @@ -1341,7 +1422,11 @@ const ChannelsTable = () => { okType={'secondary'} onConfirm={updateAllChannelsBalance} > - @@ -1353,7 +1438,11 @@ const ChannelsTable = () => { okType={'danger'} onConfirm={deleteAllDisabledChannels} > - @@ -1361,26 +1450,32 @@ const ChannelsTable = () => { } > -
-
-
- {t('开启批量操作')} +
+
+ + {t('开启批量操作')} + { }} />
- -
+ +
{ onConfirm={batchDeleteChannels} disabled={!enableBatchDelete} > - -
- -
-
- {t('标签聚合模式')} + +
+
+ + {t('标签聚合模式')} + { }} />
- -
+ +
- + + theme='light' + type='tertiary' + style={{ + height: 'auto', + padding: '10px 12px', + textAlign: 'center', + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + width: '100%', + borderRadius: '6px', + }} + onClick={() => { + testChannel(currentTestChannel, model); + }} + > + {model} + ); })}
- + {/* 显示搜索结果数量 */} {modelSearchKeyword && ( - - {t('找到')} {currentTestChannel.models.split(',').filter(model => - model.toLowerCase().includes(modelSearchKeyword.toLowerCase()) - ).length} {t('个模型')} + + {t('找到')}{' '} + { + currentTestChannel.models + .split(',') + .filter((model) => + model + .toLowerCase() + .includes(modelSearchKeyword.toLowerCase()), + ).length + }{' '} + {t('个模型')} )}
diff --git a/web/src/components/Footer.js b/web/src/components/Footer.js index 7c2b0108..7092b873 100644 --- a/web/src/components/Footer.js +++ b/web/src/components/Footer.js @@ -28,11 +28,7 @@ const FooterBar = () => { New API {import.meta.env.VITE_REACT_APP_VERSION}{' '} {t('由')}{' '} - + Calcium-Ion {' '} {t('开发,基于')}{' '} @@ -59,10 +55,12 @@ const FooterBar = () => { }, []); return ( -
+
{footer ? (
{ @@ -109,8 +120,7 @@ const HeaderBar = () => { const logo = getLogo(); const currentDate = new Date(); // enable fireworks on new year(1.1 and 2.9-2.24) - const isNewYear = - (currentDate.getMonth() === 0 && currentDate.getDate() === 1); + const isNewYear = currentDate.getMonth() === 0 && currentDate.getDate() === 1; // Check if self-use mode is enabled const isSelfUseMode = statusState?.status?.self_use_mode_enabled || false; @@ -137,13 +147,17 @@ const HeaderBar = () => { icon: , }, // Only include the docs button if docsLink exists - ...(docsLink ? [{ - text: t('文档'), - itemKey: 'docs', - isExternal: true, - externalLink: docsLink, - icon: , - }] : []), + ...(docsLink + ? [ + { + text: t('文档'), + itemKey: 'docs', + isExternal: true, + externalLink: docsLink, + icon: , + }, + ] + : []), { text: t('关于'), itemKey: 'about', @@ -232,30 +246,38 @@ const HeaderBar = () => { chat: '/chat', }; return ( -
{ - if (props.itemKey === 'home') { - styleDispatch({ type: 'SET_INNER_PADDING', payload: false }); - styleDispatch({ type: 'SET_SIDER', payload: false }); - } else { - styleDispatch({ type: 'SET_INNER_PADDING', payload: true }); - if (!styleState.isMobile) { - styleDispatch({ type: 'SET_SIDER', payload: true }); +
{ + if (props.itemKey === 'home') { + styleDispatch({ + type: 'SET_INNER_PADDING', + payload: false, + }); + styleDispatch({ type: 'SET_SIDER', payload: false }); + } else { + styleDispatch({ + type: 'SET_INNER_PADDING', + payload: true, + }); + if (!styleState.isMobile) { + styleDispatch({ type: 'SET_SIDER', payload: true }); + } } - } - }}> + }} + > {props.isExternal ? ( {itemElement} ) : ( @@ -268,67 +290,98 @@ const HeaderBar = () => { selectedKeys={[]} // items={headerButtons} onSelect={(key) => {}} - header={styleState.isMobile?{ - logo: ( -
- { - !styleState.showSider ? -
+ ), } - {(isSelfUseMode || isDemoSiteMode) && ( - - {isSelfUseMode ? t('自用模式') : t('演示站点')} - - )} -
- ), - }:{ - logo: ( -
- logo -
- ), - text: ( -
- {systemName} - {(isSelfUseMode || isDemoSiteMode) && ( - - {isSelfUseMode ? t('自用模式') : t('演示站点')} - - )} -
- ), - }} + : { + logo: ( +
+ logo +
+ ), + text: ( +
+ {systemName} + {(isSelfUseMode || isDemoSiteMode) && ( + + {isSelfUseMode ? t('自用模式') : t('演示站点')} + + )} +
+ ), + } + } items={buttons} footer={ <> @@ -351,7 +404,7 @@ const HeaderBar = () => { <> { position='bottomRight' render={ - {t('退出')} + + {t('退出')} + } > @@ -401,14 +456,18 @@ const HeaderBar = () => { > {userState.user.username[0]} - {styleState.isMobile?null:{userState.user.username}} + {styleState.isMobile ? null : ( + + {userState.user.username} + + )} ) : ( <> } /> { diff --git a/web/src/components/LoginForm.js b/web/src/components/LoginForm.js index d0183d7a..6721199f 100644 --- a/web/src/components/LoginForm.js +++ b/web/src/components/LoginForm.js @@ -9,7 +9,11 @@ import { showSuccess, updateAPI, } from '../helpers'; -import {onGitHubOAuthClicked, onOIDCClicked, onLinuxDOOAuthClicked} from './utils'; +import { + onGitHubOAuthClicked, + onOIDCClicked, + onLinuxDOOAuthClicked, +} from './utils'; import Turnstile from 'react-turnstile'; import { Button, @@ -71,7 +75,6 @@ const LoginForm = () => { } }, []); - const onWeChatLoginClicked = () => { setShowWeChatLoginModal(true); }; @@ -223,7 +226,8 @@ const LoginForm = () => { }} > - {t('没有账户?')} {t('点击注册')} + {t('没有账户?')}{' '} + {t('点击注册')} {t('忘记密码?')} {t('点击重置')} @@ -257,15 +261,18 @@ const LoginForm = () => { <> )} {status.oidc_enabled ? ( -

- {t('微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)')} + {t( + '微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)', + )}

diff --git a/web/src/components/LogsTable.js b/web/src/components/LogsTable.js index 21d0a979..7834d51a 100644 --- a/web/src/components/LogsTable.js +++ b/web/src/components/LogsTable.js @@ -12,17 +12,19 @@ import { import { Avatar, - Button, Descriptions, + Button, + Descriptions, Form, Layout, - Modal, Popover, + Modal, + Popover, Select, Space, Spin, Table, Tag, Tooltip, - Checkbox + Checkbox, } from '@douyinfe/semi-ui'; import { ITEMS_PER_PAGE } from '../constants'; import { @@ -36,7 +38,7 @@ import { renderModelPriceSimple, renderNumber, renderQuota, - stringToColor + stringToColor, } from '../helpers/render'; import Paragraph from '@douyinfe/semi-ui/lib/es/typography/paragraph'; import { getLogOther } from '../helpers/other.js'; @@ -78,23 +80,51 @@ const LogsTable = () => { function renderType(type) { switch (type) { case 1: - return {t('充值')}; + return ( + + {t('充值')} + + ); case 2: - return {t('消费')}; + return ( + + {t('消费')} + + ); case 3: - return {t('管理')}; + return ( + + {t('管理')} + + ); case 4: - return {t('系统')}; + return ( + + {t('系统')} + + ); default: - return {t('未知')}; + return ( + + {t('未知')} + + ); } } function renderIsStream(bool) { if (bool) { - return {t('流')}; + return ( + + {t('流')} + + ); } else { - return {t('非流')}; + return ( + + {t('非流')} + + ); } } @@ -152,56 +182,70 @@ const LogsTable = () => { } function renderModelName(record) { - let other = getLogOther(record.other); - let modelMapped = other?.is_model_mapped && other?.upstream_model_name && other?.upstream_model_name !== ''; + let modelMapped = + other?.is_model_mapped && + other?.upstream_model_name && + other?.upstream_model_name !== ''; if (!modelMapped) { - return { - copyText(event, record.model_name).then(r => {}); - }} - > - {' '}{record.model_name}{' '} - ; + return ( + { + copyText(event, record.model_name).then((r) => {}); + }} + > + {' '} + {record.model_name}{' '} + + ); } else { return ( <> - - - { - copyText(event, record.model_name).then(r => {}); - }} - > - {t('请求并计费模型')}{' '}{record.model_name}{' '} - - { - copyText(event, other.upstream_model_name).then(r => {}); - }} - > - {t('实际模型')}{' '}{other.upstream_model_name}{' '} - - -
- }> + + + { + copyText(event, record.model_name).then((r) => {}); + }} + > + {t('请求并计费模型')} {record.model_name}{' '} + + { + copyText(event, other.upstream_model_name).then( + (r) => {}, + ); + }} + > + {t('实际模型')} {other.upstream_model_name}{' '} + + +
+ } + > { - copyText(event, record.model_name).then(r => {}); + copyText(event, record.model_name).then((r) => {}); }} - suffixIcon={} + suffixIcon={ + + } > - {' '}{record.model_name}{' '} + {' '} + {record.model_name}{' '} {/**/} @@ -219,7 +263,6 @@ const LogsTable = () => { ); } - } // Define column keys for selection @@ -236,7 +279,7 @@ const LogsTable = () => { COMPLETION: 'completion', COST: 'cost', RETRY: 'retry', - DETAILS: 'details' + DETAILS: 'details', }; // State for column visibility @@ -277,7 +320,7 @@ const LogsTable = () => { [COLUMN_KEYS.COMPLETION]: true, [COLUMN_KEYS.COST]: true, [COLUMN_KEYS.RETRY]: isAdminUser, - [COLUMN_KEYS.DETAILS]: true + [COLUMN_KEYS.DETAILS]: true, }; }; @@ -296,18 +339,23 @@ const LogsTable = () => { // Handle "Select All" checkbox const handleSelectAll = (checked) => { - const allKeys = Object.keys(COLUMN_KEYS).map(key => COLUMN_KEYS[key]); + const allKeys = Object.keys(COLUMN_KEYS).map((key) => COLUMN_KEYS[key]); const updatedColumns = {}; - - allKeys.forEach(key => { + + allKeys.forEach((key) => { // For admin-only columns, only enable them if user is admin - if ((key === COLUMN_KEYS.CHANNEL || key === COLUMN_KEYS.USERNAME || key === COLUMN_KEYS.RETRY) && !isAdminUser) { + if ( + (key === COLUMN_KEYS.CHANNEL || + key === COLUMN_KEYS.USERNAME || + key === COLUMN_KEYS.RETRY) && + !isAdminUser + ) { updatedColumns[key] = false; } else { updatedColumns[key] = checked; } }); - + setVisibleColumns(updatedColumns); }; @@ -361,7 +409,7 @@ const LogsTable = () => { style={{ marginRight: 4 }} onClick={(event) => { event.stopPropagation(); - showUserInfo(record.user_id) + showUserInfo(record.user_id); }} > {typeof text === 'string' && text.slice(0, 1)} @@ -403,32 +451,27 @@ const LogsTable = () => { dataIndex: 'group', render: (text, record, index) => { if (record.type === 0 || record.type === 2) { - if (record.group) { - return ( - <> - {renderGroup(record.group)} - - ); - } else { - let other = null; - try { - other = JSON.parse(record.other); - } catch (e) { - console.error(`Failed to parse record.other: "${record.other}".`, e); - } - if (other === null) { - return <>; - } - if (other.group !== undefined) { - return ( - <> - {renderGroup(other.group)} - - ); - } else { - return <>; - } - } + if (record.group) { + return <>{renderGroup(record.group)}; + } else { + let other = null; + try { + other = JSON.parse(record.other); + } catch (e) { + console.error( + `Failed to parse record.other: "${record.other}".`, + e, + ); + } + if (other === null) { + return <>; + } + if (other.group !== undefined) { + return <>{renderGroup(other.group)}; + } else { + return <>; + } + } } else { return <>; } @@ -572,30 +615,30 @@ const LogsTable = () => { let content = other?.claude ? renderClaudeModelPriceSimple( - other.model_ratio, - other.model_price, - other.group_ratio, - other.cache_tokens || 0, - other.cache_ratio || 1.0, - other.cache_creation_tokens || 0, - other.cache_creation_ratio || 1.0, - ) + other.model_ratio, + other.model_price, + other.group_ratio, + other.cache_tokens || 0, + other.cache_ratio || 1.0, + other.cache_creation_tokens || 0, + other.cache_creation_ratio || 1.0, + ) : renderModelPriceSimple( - other.model_ratio, - other.model_price, - other.group_ratio, - other.cache_tokens || 0, - other.cache_ratio || 1.0, - ); + other.model_ratio, + other.model_price, + other.group_ratio, + other.cache_tokens || 0, + other.cache_ratio || 1.0, + ); return ( - - {content} - + + {content} + ); }, }, @@ -605,13 +648,16 @@ const LogsTable = () => { useEffect(() => { if (Object.keys(visibleColumns).length > 0) { // Save to localStorage - localStorage.setItem('logs-table-columns', JSON.stringify(visibleColumns)); + localStorage.setItem( + 'logs-table-columns', + JSON.stringify(visibleColumns), + ); } }, [visibleColumns]); // Filter columns based on visibility settings const getVisibleColumns = () => { - return allColumns.filter(column => visibleColumns[column.key]); + return allColumns.filter((column) => visibleColumns[column.key]); }; // Column selector modal @@ -624,42 +670,59 @@ const LogsTable = () => { footer={ <> - - + + } >
v === true)} - indeterminate={Object.values(visibleColumns).some(v => v === true) && !Object.values(visibleColumns).every(v => v === true)} - onChange={e => handleSelectAll(e.target.checked)} + checked={Object.values(visibleColumns).every((v) => v === true)} + indeterminate={ + Object.values(visibleColumns).some((v) => v === true) && + !Object.values(visibleColumns).every((v) => v === true) + } + onChange={(e) => handleSelectAll(e.target.checked)} > {t('全选')}
-
- {allColumns.map(column => { +
+ {allColumns.map((column) => { // Skip admin-only columns for non-admin users - if (!isAdminUser && (column.key === COLUMN_KEYS.CHANNEL || - column.key === COLUMN_KEYS.USERNAME || - column.key === COLUMN_KEYS.RETRY)) { + if ( + !isAdminUser && + (column.key === COLUMN_KEYS.CHANNEL || + column.key === COLUMN_KEYS.USERNAME || + column.key === COLUMN_KEYS.RETRY) + ) { return null; } - + return ( -
+
handleColumnVisibilityChange(column.key, e.target.checked)} + onChange={(e) => + handleColumnVisibilityChange(column.key, e.target.checked) + } > {column.title} @@ -709,7 +772,7 @@ const LogsTable = () => { }); const handleInputChange = (value, name) => { - setInputs(inputs => ({ ...inputs, [name]: value })); + setInputs((inputs) => ({ ...inputs, [name]: value })); }; const getLogSelfStat = async () => { @@ -765,10 +828,18 @@ const LogsTable = () => { title: t('用户信息'), content: (
-

{t('用户名')}: {data.username}

-

{t('余额')}: {renderQuota(data.quota)}

-

{t('已用额度')}:{renderQuota(data.used_quota)}

-

{t('请求次数')}:{renderNumber(data.request_count)}

+

+ {t('用户名')}: {data.username} +

+

+ {t('余额')}: {renderQuota(data.quota)} +

+

+ {t('已用额度')}:{renderQuota(data.used_quota)} +

+

+ {t('请求次数')}:{renderNumber(data.request_count)} +

), centered: true, @@ -803,11 +874,11 @@ const LogsTable = () => { // key: '渠道重试', // value: content, // }) - } + } if (isAdminUser && (logs[i].type === 0 || logs[i].type === 2)) { expandDataLocal.push({ key: t('渠道信息'), - value: `${logs[i].channel} - ${logs[i].channel_name || '[未知]'}` + value: `${logs[i].channel} - ${logs[i].channel_name || '[未知]'}`, }); } if (other?.ws || other?.audio) { @@ -845,25 +916,28 @@ const LogsTable = () => { key: t('日志详情'), value: other?.claude ? renderClaudeLogContent( - other?.model_ratio, - other.completion_ratio, - other.model_price, - other.group_ratio, - other.user_group_ratio, - other.cache_ratio || 1.0, - other.cache_creation_ratio || 1.0 - ) + other?.model_ratio, + other.completion_ratio, + other.model_price, + other.group_ratio, + other.user_group_ratio, + other.cache_ratio || 1.0, + other.cache_creation_ratio || 1.0, + ) : renderLogContent( - other?.model_ratio, - other.completion_ratio, - other.model_price, - other.group_ratio, - other.user_group_ratio - ), + other?.model_ratio, + other.completion_ratio, + other.model_price, + other.group_ratio, + other.user_group_ratio, + ), }); } if (logs[i].type === 2) { - let modelMapped = other?.is_model_mapped && other?.upstream_model_name && other?.upstream_model_name !== ''; + let modelMapped = + other?.is_model_mapped && + other?.upstream_model_name && + other?.upstream_model_name !== ''; if (modelMapped) { expandDataLocal.push({ key: t('请求并计费模型'), @@ -1014,29 +1088,41 @@ const LogsTable = () => {
- + {t('消耗额度')}: {renderQuota(stat.quota)} - + RPM: {stat.rpm} - + TPM: {stat.tpm} @@ -1046,46 +1132,46 @@ const LogsTable = () => { <>
- { - styleState.isMobile ? ( -
- { - console.log(value); - handleInputChange(value, 'start_timestamp') - }} - /> - handleInputChange(value, 'end_timestamp')} - /> -
- ) : ( + {styleState.isMobile ? ( +
{ - if (Array.isArray(value) && value.length === 2) { - handleInputChange(value[0], 'start_timestamp'); - handleInputChange(value[1], 'end_timestamp'); - } + console.log(value); + handleInputChange(value, 'start_timestamp'); }} /> - ) - } + + handleInputChange(value, 'end_timestamp') + } + /> +
+ ) : ( + { + if (Array.isArray(value) && value.length === 2) { + handleInputChange(value[0], 'start_timestamp'); + handleInputChange(value[1], 'end_timestamp'); + } + }} + /> + )}
{ -
+
{ @@ -387,7 +408,7 @@ const ModelPricing = () => { t('第 {{start}} - {{end}} 条,共 {{total}} 条', { start: page.currentStart, end: page.currentEnd, - total: models.length + total: models.length, }), pageSize: models.length, showSizeChanger: false, diff --git a/web/src/components/ModelSetting.js b/web/src/components/ModelSetting.js index 4815abbc..6af82ba4 100644 --- a/web/src/components/ModelSetting.js +++ b/web/src/components/ModelSetting.js @@ -1,7 +1,6 @@ import React, { useEffect, useState } from 'react'; import { Card, Spin, Tabs } from '@douyinfe/semi-ui'; - import { API, showError, showSuccess } from '../helpers'; import { useTranslation } from 'react-i18next'; import SettingGeminiModel from '../pages/Setting/Model/SettingGeminiModel.js'; @@ -31,14 +30,12 @@ const ModelSetting = () => { if ( item.key === 'gemini.safety_settings' || item.key === 'gemini.version_settings' || - item.key === 'claude.model_headers_settings'|| + item.key === 'claude.model_headers_settings' || item.key === 'claude.default_max_tokens' ) { item.value = JSON.stringify(JSON.parse(item.value), null, 2); } - if ( - item.key.endsWith('Enabled') || item.key.endsWith('enabled') - ) { + if (item.key.endsWith('Enabled') || item.key.endsWith('enabled')) { newInputs[item.key] = item.value === 'true' ? true : false; } else { newInputs[item.key] = item.value; diff --git a/web/src/components/OAuth2Callback.js b/web/src/components/OAuth2Callback.js index cb8a4fcb..616ec313 100644 --- a/web/src/components/OAuth2Callback.js +++ b/web/src/components/OAuth2Callback.js @@ -6,56 +6,58 @@ import { UserContext } from '../context/User'; import { setUserData } from '../helpers/data.js'; const OAuth2Callback = (props) => { - const [searchParams, setSearchParams] = useSearchParams(); + const [searchParams, setSearchParams] = useSearchParams(); - const [userState, userDispatch] = useContext(UserContext); - const [prompt, setPrompt] = useState('处理中...'); - const [processing, setProcessing] = useState(true); + const [userState, userDispatch] = useContext(UserContext); + const [prompt, setPrompt] = useState('处理中...'); + const [processing, setProcessing] = useState(true); - let navigate = useNavigate(); + let navigate = useNavigate(); - const sendCode = async (code, state, count) => { - const res = await API.get(`/api/oauth/${props.type}?code=${code}&state=${state}`); - const { success, message, data } = res.data; - if (success) { - if (message === 'bind') { - showSuccess('绑定成功!'); - navigate('/setting'); - } else { - userDispatch({ type: 'login', payload: data }); - localStorage.setItem('user', JSON.stringify(data)); - setUserData(data); - updateAPI() - showSuccess('登录成功!'); - navigate('/token'); - } - } else { - showError(message); - if (count === 0) { - setPrompt(`操作失败,重定向至登录界面中...`); - navigate('/setting'); // in case this is failed to bind GitHub - return; - } - count++; - setPrompt(`出现错误,第 ${count} 次重试中...`); - await new Promise((resolve) => setTimeout(resolve, count * 2000)); - await sendCode(code, state, count); - } - }; - - useEffect(() => { - let code = searchParams.get('code'); - let state = searchParams.get('state'); - sendCode(code, state, 0).then(); - }, []); - - return ( - - - {prompt} - - + const sendCode = async (code, state, count) => { + const res = await API.get( + `/api/oauth/${props.type}?code=${code}&state=${state}`, ); + const { success, message, data } = res.data; + if (success) { + if (message === 'bind') { + showSuccess('绑定成功!'); + navigate('/setting'); + } else { + userDispatch({ type: 'login', payload: data }); + localStorage.setItem('user', JSON.stringify(data)); + setUserData(data); + updateAPI(); + showSuccess('登录成功!'); + navigate('/token'); + } + } else { + showError(message); + if (count === 0) { + setPrompt(`操作失败,重定向至登录界面中...`); + navigate('/setting'); // in case this is failed to bind GitHub + return; + } + count++; + setPrompt(`出现错误,第 ${count} 次重试中...`); + await new Promise((resolve) => setTimeout(resolve, count * 2000)); + await sendCode(code, state, count); + } + }; + + useEffect(() => { + let code = searchParams.get('code'); + let state = searchParams.get('state'); + sendCode(code, state, 0).then(); + }, []); + + return ( + + + {prompt} + + + ); }; export default OAuth2Callback; diff --git a/web/src/components/OIDCIcon.js b/web/src/components/OIDCIcon.js index 235e4345..eec3e655 100644 --- a/web/src/components/OIDCIcon.js +++ b/web/src/components/OIDCIcon.js @@ -2,21 +2,37 @@ import React from 'react'; import { Icon } from '@douyinfe/semi-ui'; const OIDCIcon = (props) => { - function CustomIcon() { - return ( - - - - - ); - } + function CustomIcon() { + return ( + + + + + ); + } - return } />; + return } />; }; -export default OIDCIcon; \ No newline at end of file +export default OIDCIcon; diff --git a/web/src/components/OperationSetting.js b/web/src/components/OperationSetting.js index d33f0146..28fb3a8f 100644 --- a/web/src/components/OperationSetting.js +++ b/web/src/components/OperationSetting.js @@ -11,7 +11,6 @@ import ModelSettingsVisualEditor from '../pages/Setting/Operation/ModelSettingsV import GroupRatioSettings from '../pages/Setting/Operation/GroupRatioSettings.js'; import ModelRatioSettings from '../pages/Setting/Operation/ModelRatioSettings.js'; - import { API, showError, showSuccess } from '../helpers'; import SettingsChats from '../pages/Setting/Operation/SettingsChats.js'; import { useTranslation } from 'react-i18next'; @@ -58,7 +57,7 @@ const OperationSetting = () => { DataExportInterval: 5, DefaultCollapseSidebar: false, // 默认折叠侧边栏 RetryTimes: 0, - Chats: "[]", + Chats: '[]', DemoSiteEnabled: false, SelfUseModeEnabled: false, AutomaticDisableKeywords: '', @@ -154,14 +153,14 @@ const OperationSetting = () => { {/* 合并模型倍率设置和可视化倍率设置 */} - - + + - + - + diff --git a/web/src/components/OtherSetting.js b/web/src/components/OtherSetting.js index e3295fb1..e837a4d5 100644 --- a/web/src/components/OtherSetting.js +++ b/web/src/components/OtherSetting.js @@ -1,5 +1,13 @@ import React, { useContext, useEffect, useRef, useState } from 'react'; -import { Banner, Button, Col, Form, Row, Modal, Space } from '@douyinfe/semi-ui'; +import { + Banner, + Button, + Col, + Form, + Row, + Modal, + Space, +} from '@douyinfe/semi-ui'; import { API, showError, showSuccess, timestamp2string } from '../helpers'; import { marked } from 'marked'; import { useTranslation } from 'react-i18next'; @@ -46,7 +54,7 @@ const OtherSetting = () => { HomePageContent: false, About: false, Footer: false, - CheckUpdate: false + CheckUpdate: false, }); const handleInputChange = async (value, e) => { const name = e.target.id; @@ -151,27 +159,30 @@ const OtherSetting = () => { const checkUpdate = async () => { try { - setLoadingInput((loadingInput) => ({ ...loadingInput, CheckUpdate: true })); + setLoadingInput((loadingInput) => ({ + ...loadingInput, + CheckUpdate: true, + })); // Use a CORS proxy to avoid direct cross-origin requests to GitHub API // Option 1: Use a public CORS proxy service // const proxyUrl = 'https://cors-anywhere.herokuapp.com/'; // const res = await API.get( // `${proxyUrl}https://api.github.com/repos/Calcium-Ion/new-api/releases/latest`, // ); - + // Option 2: Use the JSON proxy approach which often works better with GitHub API const res = await fetch( 'https://api.github.com/repos/Calcium-Ion/new-api/releases/latest', { headers: { - 'Accept': 'application/json', + Accept: 'application/json', 'Content-Type': 'application/json', // Adding User-Agent which is often required by GitHub API - 'User-Agent': 'new-api-update-checker' - } - } - ).then(response => response.json()); - + 'User-Agent': 'new-api-update-checker', + }, + }, + ).then((response) => response.json()); + // Option 3: Use a local proxy endpoint // Create a cached version of the response to avoid frequent GitHub API calls // const res = await API.get('/api/status/github-latest-release'); @@ -190,7 +201,10 @@ const OtherSetting = () => { console.error('Failed to check for updates:', error); showError('检查更新失败,请稍后再试'); } finally { - setLoadingInput((loadingInput) => ({ ...loadingInput, CheckUpdate: false })); + setLoadingInput((loadingInput) => ({ + ...loadingInput, + CheckUpdate: false, + })); } }; const getOptions = async () => { @@ -217,7 +231,10 @@ const OtherSetting = () => { // Function to open GitHub release page const openGitHubRelease = () => { - window.open(`https://github.com/Calcium-Ion/new-api/releases/tag/${updateData.tag_name}`, '_blank'); + window.open( + `https://github.com/Calcium-Ion/new-api/releases/tag/${updateData.tag_name}`, + '_blank', + ); }; const getStartTimeString = () => { @@ -237,7 +254,11 @@ const OtherSetting = () => { {t('当前版本')}:{statusState?.status?.version || t('未知')} - @@ -245,7 +266,9 @@ const OtherSetting = () => { - {t('启动时间')}:{getStartTimeString()} + + {t('启动时间')}:{getStartTimeString()} + @@ -300,7 +323,9 @@ const OtherSetting = () => { { { @@ -348,16 +379,16 @@ const OtherSetting = () => { visible={showUpdateModal} onCancel={() => setShowUpdateModal(false)} footer={[ - + , ]} >
diff --git a/web/src/components/PageLayout.js b/web/src/components/PageLayout.js index 97f164c6..d52bc0d4 100644 --- a/web/src/components/PageLayout.js +++ b/web/src/components/PageLayout.js @@ -13,7 +13,6 @@ import { UserContext } from '../context/User/index.js'; import { StatusContext } from '../context/Status/index.js'; const { Sider, Content, Header, Footer } = Layout; - const PageLayout = () => { const [userState, userDispatch] = useContext(UserContext); const [statusState, statusDispatch] = useContext(StatusContext); @@ -62,85 +61,104 @@ const PageLayout = () => { if (savedLang) { i18n.changeLanguage(savedLang); } - + // 默认显示侧边栏 styleDispatch({ type: 'SET_SIDER', payload: true }); }, [i18n]); // 获取侧边栏折叠状态 - const isSidebarCollapsed = localStorage.getItem('default_collapse_sidebar') === 'true'; + const isSidebarCollapsed = + localStorage.getItem('default_collapse_sidebar') === 'true'; return ( - -
+ +
- + {styleState.showSider && ( - + )} - + - + - ) -} + ); +}; -export default PageLayout; \ No newline at end of file +export default PageLayout; diff --git a/web/src/components/PersonalSetting.js b/web/src/components/PersonalSetting.js index 1053f2b0..2e8075f0 100644 --- a/web/src/components/PersonalSetting.js +++ b/web/src/components/PersonalSetting.js @@ -6,11 +6,15 @@ import { isRoot, showError, showInfo, - showSuccess + showSuccess, } from '../helpers'; import Turnstile from 'react-turnstile'; import { UserContext } from '../context/User'; -import { onGitHubOAuthClicked, onOIDCClicked, onLinuxDOOAuthClicked } from './utils'; +import { + onGitHubOAuthClicked, + onOIDCClicked, + onLinuxDOOAuthClicked, +} from './utils'; import { Avatar, Banner, @@ -32,13 +36,13 @@ import { AutoComplete, Checkbox, Tabs, - TabPane + TabPane, } from '@douyinfe/semi-ui'; import { getQuotaPerUnit, renderQuota, renderQuotaWithPrompt, - stringToColor + stringToColor, } from '../helpers/render'; import TelegramLoginButton from 'react-telegram-login'; import { useTranslation } from 'react-i18next'; @@ -54,7 +58,7 @@ const PersonalSetting = () => { email: '', self_account_deletion_confirmation: '', set_new_password: '', - set_new_password_confirmation: '' + set_new_password_confirmation: '', }); const [status, setStatus] = useState({}); const [showChangePasswordModal, setShowChangePasswordModal] = useState(false); @@ -77,14 +81,14 @@ const PersonalSetting = () => { const savedState = localStorage.getItem('modelsExpanded'); return savedState ? JSON.parse(savedState) : false; }); - const MODELS_DISPLAY_COUNT = 10; // 默认显示的模型数量 + const MODELS_DISPLAY_COUNT = 10; // 默认显示的模型数量 const [notificationSettings, setNotificationSettings] = useState({ warningType: 'email', warningThreshold: 100000, webhookUrl: '', webhookSecret: '', notificationEmail: '', - acceptUnsetModelRatioModel: false + acceptUnsetModelRatioModel: false, }); const [showWebhookDocs, setShowWebhookDocs] = useState(false); @@ -128,7 +132,8 @@ const PersonalSetting = () => { webhookUrl: settings.webhook_url || '', webhookSecret: settings.webhook_secret || '', notificationEmail: settings.notification_email || '', - acceptUnsetModelRatioModel: settings.accept_unset_model_ratio_model || false + acceptUnsetModelRatioModel: + settings.accept_unset_model_ratio_model || false, }); } }, [userState?.user?.setting]); @@ -222,7 +227,7 @@ const PersonalSetting = () => { const bindWeChat = async () => { if (inputs.wechat_verification_code === '') return; const res = await API.get( - `/api/oauth/wechat/bind?code=${inputs.wechat_verification_code}` + `/api/oauth/wechat/bind?code=${inputs.wechat_verification_code}`, ); const { success, message } = res.data; if (success) { @@ -239,7 +244,7 @@ const PersonalSetting = () => { return; } const res = await API.put(`/api/user/self`, { - password: inputs.set_new_password + password: inputs.set_new_password, }); const { success, message } = res.data; if (success) { @@ -257,7 +262,7 @@ const PersonalSetting = () => { return; } const res = await API.post(`/api/user/aff_transfer`, { - quota: transferAmount + quota: transferAmount, }); const { success, message } = res.data; if (success) { @@ -281,7 +286,7 @@ const PersonalSetting = () => { } setLoading(true); const res = await API.get( - `/api/verification?email=${inputs.email}&turnstile=${turnstileToken}` + `/api/verification?email=${inputs.email}&turnstile=${turnstileToken}`, ); const { success, message } = res.data; if (success) { @@ -299,7 +304,7 @@ const PersonalSetting = () => { } setLoading(true); const res = await API.get( - `/api/oauth/email/bind?email=${inputs.email}&code=${inputs.email_verification_code}` + `/api/oauth/email/bind?email=${inputs.email}&code=${inputs.email_verification_code}`, ); const { success, message } = res.data; if (success) { @@ -334,9 +339,9 @@ const PersonalSetting = () => { }; const handleNotificationSettingChange = (type, value) => { - setNotificationSettings(prev => ({ + setNotificationSettings((prev) => ({ ...prev, - [type]: value.target ? value.target.value : value // 处理 Radio 事件对象 + [type]: value.target ? value.target.value : value, // 处理 Radio 事件对象 })); }; @@ -344,11 +349,14 @@ const PersonalSetting = () => { try { const res = await API.put('/api/user/setting', { notify_type: notificationSettings.warningType, - quota_warning_threshold: parseFloat(notificationSettings.warningThreshold), + quota_warning_threshold: parseFloat( + notificationSettings.warningThreshold, + ), webhook_url: notificationSettings.webhookUrl, webhook_secret: notificationSettings.webhookSecret, notification_email: notificationSettings.notificationEmail, - accept_unset_model_ratio_model: notificationSettings.acceptUnsetModelRatioModel + accept_unset_model_ratio_model: + notificationSettings.acceptUnsetModelRatioModel, }); if (res.data.success) { @@ -363,7 +371,6 @@ const PersonalSetting = () => { }; return ( -
@@ -377,7 +384,10 @@ const PersonalSetting = () => { centered={true} >
- {t('可用额度')}{renderQuotaWithPrompt(userState?.user?.aff_quota)} + + {t('可用额度')} + {renderQuotaWithPrompt(userState?.user?.aff_quota)} + {
- {t('划转额度')}{renderQuotaWithPrompt(transferAmount)} {t('最低') + renderQuota(getQuotaPerUnit())} + {t('划转额度')} + {renderQuotaWithPrompt(transferAmount)}{' '} + {t('最低') + renderQuota(getQuotaPerUnit())}
{ @@ -416,25 +428,29 @@ const PersonalSetting = () => { title={{getUsername()}} description={ isRoot() ? ( - {t('管理员')} + {t('管理员')} ) : ( - {t('普通用户')} + {t('普通用户')} ) } > } headerExtraContent={ <> - - {'ID: ' + userState?.user?.id} - {userState?.user?.group} + + {'ID: ' + userState?.user?.id} + {userState?.user?.group} } footer={ <> -
- {t('可用模型')} +
+ + {t('可用模型')} +
{models.length <= MODELS_DISPLAY_COUNT ? ( @@ -442,7 +458,7 @@ const PersonalSetting = () => { {models.map((model) => ( { copyText(model); }} @@ -458,7 +474,7 @@ const PersonalSetting = () => { {models.map((model) => ( { copyText(model); }} @@ -467,8 +483,8 @@ const PersonalSetting = () => { ))} setIsModelsExpanded(false)} > @@ -478,24 +494,27 @@ const PersonalSetting = () => { {!isModelsExpanded && ( - {models.slice(0, MODELS_DISPLAY_COUNT).map((model) => ( - { - copyText(model); - }} - > - {model} - - ))} + {models + .slice(0, MODELS_DISPLAY_COUNT) + .map((model) => ( + { + copyText(model); + }} + > + {model} + + ))} setIsModelsExpanded(true)} > - {t('更多')} {models.length - MODELS_DISPLAY_COUNT} {t('个模型')} + {t('更多')} {models.length - MODELS_DISPLAY_COUNT}{' '} + {t('个模型')} )} @@ -503,7 +522,6 @@ const PersonalSetting = () => { )}
- } > @@ -536,9 +554,9 @@ const PersonalSetting = () => {
- - {renderQuota(userState?.user?.aff_quota)} - + + {renderQuota(userState?.user?.aff_quota)} +
{t('微信')} -
+
{
) : ( ) @@ -779,75 +802,113 @@ const PersonalSetting = () => {

handleInputChange('wechat_verification_code', v) } /> -
- - + +
- {t('接受未设置价格模型')} + + {t('接受未设置价格模型')} +
handleNotificationSettingChange('acceptUnsetModelRatioModel', e.target.checked)} + checked={ + notificationSettings.acceptUnsetModelRatioModel + } + onChange={(e) => + handleNotificationSettingChange( + 'acceptUnsetModelRatioModel', + e.target.checked, + ) + } > {t('接受未设置价格模型')} - - {t('当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用')} + + {t( + '当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用', + )}
- +
{t('通知方式')}
handleNotificationSettingChange('warningType', value)} + onChange={(value) => + handleNotificationSettingChange('warningType', value) + } > - {t('邮件通知')} - {t('Webhook通知')} + {t('邮件通知')} + {t('Webhook通知')}
{notificationSettings.warningType === 'webhook' && ( <>
- {t('Webhook地址')} + + {t('Webhook地址')} +
handleNotificationSettingChange('webhookUrl', val)} - placeholder={t('请输入Webhook地址,例如: https://example.com/webhook')} + onChange={(val) => + handleNotificationSettingChange('webhookUrl', val) + } + placeholder={t( + '请输入Webhook地址,例如: https://example.com/webhook', + )} /> - - {t('只支持https,系统将以 POST 方式发送通知,请确保地址可以接收 POST 请求')} + + {t( + '只支持https,系统将以 POST 方式发送通知,请确保地址可以接收 POST 请求', + )} - -
setShowWebhookDocs(!showWebhookDocs)}> - {t('Webhook请求结构')} {showWebhookDocs ? '▼' : '▶'} + +
+ setShowWebhookDocs(!showWebhookDocs) + } + > + {t('Webhook请求结构')}{' '} + {showWebhookDocs ? '▼' : '▶'}
-
-{`{
+                              
+                                {`{
     "type": "quota_exceed",      // 通知类型
     "title": "标题",             // 通知标题
     "content": "通知内容",       // 通知内容,支持 {{value}} 变量占位符
@@ -863,23 +924,38 @@ const PersonalSetting = () => {
     "values": ["$0.99"],
     "timestamp": 1739950503
 }`}
-                            
+
- {t('接口凭证(可选)')} + + {t('接口凭证(可选)')} +
handleNotificationSettingChange('webhookSecret', val)} + onChange={(val) => + handleNotificationSettingChange( + 'webhookSecret', + val, + ) + } placeholder={t('请输入密钥')} /> - - {t('密钥将以 Bearer 方式添加到请求头中,用于验证webhook请求的合法性')} + + {t( + '密钥将以 Bearer 方式添加到请求头中,用于验证webhook请求的合法性', + )} - + {t('Authorization: Bearer your-secret-key')}
@@ -892,40 +968,64 @@ const PersonalSetting = () => {
handleNotificationSettingChange('notificationEmail', val)} + onChange={(val) => + handleNotificationSettingChange( + 'notificationEmail', + val, + ) + } placeholder={t('留空则使用账号绑定的邮箱')} /> - - {t('设置用于接收额度预警的邮箱地址,不填则使用账号绑定的邮箱')} + + {t( + '设置用于接收额度预警的邮箱地址,不填则使用账号绑定的邮箱', + )}
)}
- {t('额度预警阈值')} {renderQuotaWithPrompt(notificationSettings.warningThreshold)} + + {t('额度预警阈值')}{' '} + {renderQuotaWithPrompt( + notificationSettings.warningThreshold, + )} +
handleNotificationSettingChange('warningThreshold', val)} + onChange={(val) => + handleNotificationSettingChange( + 'warningThreshold', + val, + ) + } style={{ width: 200 }} placeholder={t('请输入预警额度')} data={[ { value: 100000, label: '0.2$' }, { value: 500000, label: '1$' }, { value: 1000000, label: '5$' }, - { value: 5000000, label: '10$' } + { value: 5000000, label: '10$' }, ]} />
- - {t('当剩余额度低于此数值时,系统将通过选择的方式发送通知')} + + {t( + '当剩余额度低于此数值时,系统将通过选择的方式发送通知', + )}
-
@@ -938,20 +1038,22 @@ const PersonalSetting = () => { centered={true} maskClosable={false} > - {t('绑定邮箱地址')} + + {t('绑定邮箱地址')} +
handleInputChange('email', value)} - name="email" - type="email" + name='email' + type='email' /> @@ -417,7 +425,7 @@ const RedemptionsTable = () => { t('第 {{start}} - {{end}} 条,共 {{total}} 条', { start: page.currentStart, end: page.currentEnd, - total: tokenCount + total: tokenCount, }), onPageSizeChange: (size) => { setPageSize(size); diff --git a/web/src/components/RegisterForm.js b/web/src/components/RegisterForm.js index 6e79d32d..50fe4def 100644 --- a/web/src/components/RegisterForm.js +++ b/web/src/components/RegisterForm.js @@ -1,13 +1,32 @@ import React, { useContext, useEffect, useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; -import { API, getLogo, showError, showInfo, showSuccess, updateAPI } from '../helpers'; +import { + API, + getLogo, + showError, + showInfo, + showSuccess, + updateAPI, +} from '../helpers'; import Turnstile from 'react-turnstile'; -import { Button, Card, Divider, Form, Icon, Layout, Modal } from '@douyinfe/semi-ui'; +import { + Button, + Card, + Divider, + Form, + Icon, + Layout, + Modal, +} from '@douyinfe/semi-ui'; import Title from '@douyinfe/semi-ui/lib/es/typography/title'; import Text from '@douyinfe/semi-ui/lib/es/typography/text'; import { IconGithubLogo } from '@douyinfe/semi-icons'; -import {onGitHubOAuthClicked, onLinuxDOOAuthClicked, onOIDCClicked} from './utils.js'; -import OIDCIcon from "./OIDCIcon.js"; +import { + onGitHubOAuthClicked, + onLinuxDOOAuthClicked, + onOIDCClicked, +} from './utils.js'; +import OIDCIcon from './OIDCIcon.js'; import LinuxDoIcon from './LinuxDoIcon.js'; import WeChatIcon from './WeChatIcon.js'; import TelegramLoginButton from 'react-telegram-login/src'; @@ -22,7 +41,7 @@ const RegisterForm = () => { password: '', password2: '', email: '', - verification_code: '' + verification_code: '', }); const { username, password, password2 } = inputs; const [showEmailVerification, setShowEmailVerification] = useState(false); @@ -54,7 +73,6 @@ const RegisterForm = () => { } }); - const onWeChatLoginClicked = () => { setShowWeChatLoginModal(true); }; @@ -106,7 +124,7 @@ const RegisterForm = () => { inputs.aff_code = affCode; const res = await API.post( `/api/user/register?turnstile=${turnstileToken}`, - inputs + inputs, ); const { success, message } = res.data; if (success) { @@ -127,7 +145,7 @@ const RegisterForm = () => { } setLoading(true); const res = await API.get( - `/api/verification?email=${inputs.email}&turnstile=${turnstileToken}` + `/api/verification?email=${inputs.email}&turnstile=${turnstileToken}`, ); const { success, message } = res.data; if (success) { @@ -169,7 +187,6 @@ const RegisterForm = () => { } }; - return (
@@ -179,7 +196,7 @@ const RegisterForm = () => { style={{ justifyContent: 'center', display: 'flex', - marginTop: 120 + marginTop: 120, }} >
@@ -187,28 +204,28 @@ const RegisterForm = () => { {t('新用户注册')} -
+ handleChange('username', value)} /> handleChange('password', value)} /> handleChange('password2', value)} /> {showEmailVerification ? ( @@ -218,10 +235,13 @@ const RegisterForm = () => { label={t('邮箱')} placeholder={t('输入邮箱地址')} onChange={(value) => handleChange('email', value)} - name="email" - type="email" + name='email' + type='email' suffix={ - } @@ -230,8 +250,10 @@ const RegisterForm = () => { field={'verification_code'} label={t('验证码')} placeholder={t('输入验证码')} - onChange={(value) => handleChange('verification_code', value)} - name="verification_code" + onChange={(value) => + handleChange('verification_code', value) + } + name='verification_code' /> ) : ( @@ -252,14 +274,12 @@ const RegisterForm = () => { style={{ display: 'flex', justifyContent: 'space-between', - marginTop: 20 + marginTop: 20, }} > {t('已有账户?')} - - {t('点击登录')} - + {t('点击登录')}
{status.github_oauth || @@ -290,15 +310,18 @@ const RegisterForm = () => { <> )} {status.oidc_enabled ? ( -

- {t('微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)')} + {t( + '微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)', + )}

diff --git a/web/src/components/SiderBar.js b/web/src/components/SiderBar.js index 45c8c571..25b350d1 100644 --- a/web/src/components/SiderBar.js +++ b/web/src/components/SiderBar.js @@ -15,10 +15,13 @@ import { import '../index.css'; import { - IconCalendarClock, IconChecklistStroked, - IconComment, IconCommentStroked, + IconCalendarClock, + IconChecklistStroked, + IconComment, + IconCommentStroked, IconCreditCard, - IconGift, IconHelpCircle, + IconGift, + IconHelpCircle, IconHistogram, IconHome, IconImage, @@ -26,9 +29,16 @@ import { IconLayers, IconPriceTag, IconSetting, - IconUser + IconUser, } from '@douyinfe/semi-icons'; -import { Avatar, Dropdown, Layout, Nav, Switch, Divider } from '@douyinfe/semi-ui'; +import { + Avatar, + Dropdown, + Layout, + Nav, + Switch, + Divider, +} from '@douyinfe/semi-ui'; import { setStatusData } from '../helpers/data.js'; import { stringToColor } from '../helpers/render.js'; import { useSetTheme, useTheme } from '../context/Theme/index.js'; @@ -44,21 +54,23 @@ const navItemStyle = { // 自定义侧边栏按钮悬停样式 const navItemHoverStyle = { backgroundColor: 'var(--semi-color-primary-light-default)', - color: 'var(--semi-color-primary)' + color: 'var(--semi-color-primary)', }; // 自定义侧边栏按钮选中样式 const navItemSelectedStyle = { backgroundColor: 'var(--semi-color-primary-light-default)', color: 'var(--semi-color-primary)', - fontWeight: '600' + fontWeight: '600', }; // 自定义图标样式 const iconStyle = (itemKey, selectedKeys) => { return { fontSize: '18px', - color: selectedKeys.includes(itemKey) ? 'var(--semi-color-primary)' : 'var(--semi-color-text-2)', + color: selectedKeys.includes(itemKey) + ? 'var(--semi-color-primary)' + : 'var(--semi-color-text-2)', }; }; @@ -99,8 +111,24 @@ const SiderBar = () => { // 预先计算所有可能的图标样式 const allItemKeys = useMemo(() => { - const keys = ['home', 'channel', 'token', 'redemption', 'topup', 'user', 'log', 'midjourney', - 'setting', 'about', 'chat', 'detail', 'pricing', 'task', 'playground', 'personal']; + const keys = [ + 'home', + 'channel', + 'token', + 'redemption', + 'topup', + 'user', + 'log', + 'midjourney', + 'setting', + 'about', + 'chat', + 'detail', + 'pricing', + 'task', + 'playground', + 'personal', + ]; // 添加聊天项的keys for (let i = 0; i < chatItems.length; i++) { keys.push('chat' + i); @@ -111,7 +139,7 @@ const SiderBar = () => { // 使用useMemo一次性计算所有图标样式 const iconStyles = useMemo(() => { const styles = {}; - allItemKeys.forEach(key => { + allItemKeys.forEach((key) => { styles[key] = iconStyle(key, selectedKeys); }); return styles; @@ -157,10 +185,8 @@ const SiderBar = () => { to: '/task', icon: , className: - localStorage.getItem('enable_task') === 'true' - ? '' - : 'tableHiddle', - } + localStorage.getItem('enable_task') === 'true' ? '' : 'tableHiddle', + }, ], [ localStorage.getItem('enable_data_export'), @@ -241,13 +267,13 @@ const SiderBar = () => { // Function to update router map with chat routes const updateRouterMapWithChats = (chats) => { const newRouterMap = { ...routerMap }; - + if (Array.isArray(chats) && chats.length > 0) { for (let i = 0; i < chats.length; i++) { newRouterMap['chat' + i] = '/chat/' + i; } } - + setRouterMapState(newRouterMap); return newRouterMap; }; @@ -270,13 +296,13 @@ const SiderBar = () => { chatItems.push(chat); } setChatItems(chatItems); - + // Update router map with chat routes updateRouterMapWithChats(chats); } } catch (e) { console.error(e); - showError('聊天数据解析失败') + showError('聊天数据解析失败'); } } }, []); @@ -284,7 +310,9 @@ const SiderBar = () => { // Update the useEffect for route selection useEffect(() => { const currentPath = location.pathname; - let matchingKey = Object.keys(routerMapState).find(key => routerMapState[key] === currentPath); + let matchingKey = Object.keys(routerMapState).find( + (key) => routerMapState[key] === currentPath, + ); // Handle chat routes if (!matchingKey && currentPath.startsWith('/chat/')) { @@ -325,8 +353,8 @@ const SiderBar = () => { return ( <> diff --git a/web/src/components/SystemSetting.js b/web/src/components/SystemSetting.js index 3c377a61..52af981c 100644 --- a/web/src/components/SystemSetting.js +++ b/web/src/components/SystemSetting.js @@ -77,7 +77,8 @@ const SystemSetting = () => { const [isLoaded, setIsLoaded] = useState(false); const formApiRef = useRef(null); const [emailDomainWhitelist, setEmailDomainWhitelist] = useState([]); - const [showPasswordLoginConfirmModal, setShowPasswordLoginConfirmModal] = useState(false); + const [showPasswordLoginConfirmModal, setShowPasswordLoginConfirmModal] = + useState(false); const [linuxDOOAuthEnabled, setLinuxDOOAuthEnabled] = useState(false); const getOptions = async () => { @@ -138,18 +139,18 @@ const SystemSetting = () => { setLoading(true); try { // 分离 checkbox 类型的选项和其他选项 - const checkboxOptions = options.filter(opt => - opt.key.toLowerCase().endsWith('enabled') + const checkboxOptions = options.filter((opt) => + opt.key.toLowerCase().endsWith('enabled'), ); - const otherOptions = options.filter(opt => - !opt.key.toLowerCase().endsWith('enabled') + const otherOptions = options.filter( + (opt) => !opt.key.toLowerCase().endsWith('enabled'), ); // 处理 checkbox 类型的选项 for (const opt of checkboxOptions) { const res = await API.put('/api/option/', { key: opt.key, - value: opt.value.toString() + value: opt.value.toString(), }); if (!res.data.success) { showError(res.data.message); @@ -159,18 +160,19 @@ const SystemSetting = () => { // 处理其他选项 if (otherOptions.length > 0) { - const requestQueue = otherOptions.map(opt => + const requestQueue = otherOptions.map((opt) => API.put('/api/option/', { key: opt.key, - value: typeof opt.value === 'boolean' ? opt.value.toString() : opt.value - }) + value: + typeof opt.value === 'boolean' ? opt.value.toString() : opt.value, + }), ); const results = await Promise.all(requestQueue); - + // 检查所有请求是否成功 - const errorResults = results.filter(res => !res.data.success); - errorResults.forEach(res => { + const errorResults = results.filter((res) => !res.data.success); + errorResults.forEach((res) => { showError(res.data.message); }); } @@ -178,7 +180,7 @@ const SystemSetting = () => { showSuccess('更新成功'); // 更新本地状态 const newInputs = { ...inputs }; - options.forEach(opt => { + options.forEach((opt) => { newInputs[opt.key] = opt.value; }); setInputs(newInputs); @@ -201,7 +203,7 @@ const SystemSetting = () => { let WorkerUrl = removeTrailingSlash(inputs.WorkerUrl); await updateOptions([ { key: 'WorkerUrl', value: WorkerUrl }, - { key: 'WorkerValidKey', value: inputs.WorkerValidKey } + { key: 'WorkerValidKey', value: inputs.WorkerValidKey }, ]); }; @@ -216,11 +218,11 @@ const SystemSetting = () => { return; } } - + const options = [ - { key: 'PayAddress', value: removeTrailingSlash(inputs.PayAddress) } + { key: 'PayAddress', value: removeTrailingSlash(inputs.PayAddress) }, ]; - + if (inputs.EpayId !== '') { options.push({ key: 'EpayId', value: inputs.EpayId }); } @@ -234,18 +236,21 @@ const SystemSetting = () => { options.push({ key: 'MinTopUp', value: inputs.MinTopUp.toString() }); } if (inputs.CustomCallbackAddress !== '') { - options.push({ key: 'CustomCallbackAddress', value: inputs.CustomCallbackAddress }); + options.push({ + key: 'CustomCallbackAddress', + value: inputs.CustomCallbackAddress, + }); } if (originInputs['TopupGroupRatio'] !== inputs.TopupGroupRatio) { options.push({ key: 'TopupGroupRatio', value: inputs.TopupGroupRatio }); } - + await updateOptions(options); }; const submitSMTP = async () => { const options = []; - + if (originInputs['SMTPServer'] !== inputs.SMTPServer) { options.push({ key: 'SMTPServer', value: inputs.SMTPServer }); } @@ -255,13 +260,19 @@ const SystemSetting = () => { if (originInputs['SMTPFrom'] !== inputs.SMTPFrom) { options.push({ key: 'SMTPFrom', value: inputs.SMTPFrom }); } - if (originInputs['SMTPPort'] !== inputs.SMTPPort && inputs.SMTPPort !== '') { + if ( + originInputs['SMTPPort'] !== inputs.SMTPPort && + inputs.SMTPPort !== '' + ) { options.push({ key: 'SMTPPort', value: inputs.SMTPPort }); } - if (originInputs['SMTPToken'] !== inputs.SMTPToken && inputs.SMTPToken !== '') { + if ( + originInputs['SMTPToken'] !== inputs.SMTPToken && + inputs.SMTPToken !== '' + ) { options.push({ key: 'SMTPToken', value: inputs.SMTPToken }); } - + if (options.length > 0) { await updateOptions(options); } @@ -269,10 +280,12 @@ const SystemSetting = () => { const submitEmailDomainWhitelist = async () => { if (Array.isArray(emailDomainWhitelist)) { - await updateOptions([{ - key: 'EmailDomainWhitelist', - value: emailDomainWhitelist.join(',') - }]); + await updateOptions([ + { + key: 'EmailDomainWhitelist', + value: emailDomainWhitelist.join(','), + }, + ]); } else { showError('邮箱域名白名单格式不正确'); } @@ -280,23 +293,32 @@ const SystemSetting = () => { const submitWeChat = async () => { const options = []; - + if (originInputs['WeChatServerAddress'] !== inputs.WeChatServerAddress) { - options.push({ - key: 'WeChatServerAddress', - value: removeTrailingSlash(inputs.WeChatServerAddress) + options.push({ + key: 'WeChatServerAddress', + value: removeTrailingSlash(inputs.WeChatServerAddress), }); } - if (originInputs['WeChatAccountQRCodeImageURL'] !== inputs.WeChatAccountQRCodeImageURL) { - options.push({ - key: 'WeChatAccountQRCodeImageURL', - value: inputs.WeChatAccountQRCodeImageURL + if ( + originInputs['WeChatAccountQRCodeImageURL'] !== + inputs.WeChatAccountQRCodeImageURL + ) { + options.push({ + key: 'WeChatAccountQRCodeImageURL', + value: inputs.WeChatAccountQRCodeImageURL, }); } - if (originInputs['WeChatServerToken'] !== inputs.WeChatServerToken && inputs.WeChatServerToken !== '') { - options.push({ key: 'WeChatServerToken', value: inputs.WeChatServerToken }); + if ( + originInputs['WeChatServerToken'] !== inputs.WeChatServerToken && + inputs.WeChatServerToken !== '' + ) { + options.push({ + key: 'WeChatServerToken', + value: inputs.WeChatServerToken, + }); } - + if (options.length > 0) { await updateOptions(options); } @@ -304,14 +326,20 @@ const SystemSetting = () => { const submitGitHubOAuth = async () => { const options = []; - + if (originInputs['GitHubClientId'] !== inputs.GitHubClientId) { options.push({ key: 'GitHubClientId', value: inputs.GitHubClientId }); } - if (originInputs['GitHubClientSecret'] !== inputs.GitHubClientSecret && inputs.GitHubClientSecret !== '') { - options.push({ key: 'GitHubClientSecret', value: inputs.GitHubClientSecret }); + if ( + originInputs['GitHubClientSecret'] !== inputs.GitHubClientSecret && + inputs.GitHubClientSecret !== '' + ) { + options.push({ + key: 'GitHubClientSecret', + value: inputs.GitHubClientSecret, + }); } - + if (options.length > 0) { await updateOptions(options); } @@ -319,44 +347,74 @@ const SystemSetting = () => { const submitOIDCSettings = async () => { if (inputs['oidc.well_known'] !== '') { - if (!inputs['oidc.well_known'].startsWith('http://') && !inputs['oidc.well_known'].startsWith('https://')) { + if ( + !inputs['oidc.well_known'].startsWith('http://') && + !inputs['oidc.well_known'].startsWith('https://') + ) { showError('Well-Known URL 必须以 http:// 或 https:// 开头'); return; } try { const res = await API.get(inputs['oidc.well_known']); - inputs['oidc.authorization_endpoint'] = res.data['authorization_endpoint']; + inputs['oidc.authorization_endpoint'] = + res.data['authorization_endpoint']; inputs['oidc.token_endpoint'] = res.data['token_endpoint']; inputs['oidc.user_info_endpoint'] = res.data['userinfo_endpoint']; showSuccess('获取 OIDC 配置成功!'); } catch (err) { console.error(err); - showError("获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确"); + showError( + '获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确', + ); return; } } const options = []; - + if (originInputs['oidc.well_known'] !== inputs['oidc.well_known']) { - options.push({ key: 'oidc.well_known', value: inputs['oidc.well_known'] }); + options.push({ + key: 'oidc.well_known', + value: inputs['oidc.well_known'], + }); } if (originInputs['oidc.client_id'] !== inputs['oidc.client_id']) { options.push({ key: 'oidc.client_id', value: inputs['oidc.client_id'] }); } - if (originInputs['oidc.client_secret'] !== inputs['oidc.client_secret'] && inputs['oidc.client_secret'] !== '') { - options.push({ key: 'oidc.client_secret', value: inputs['oidc.client_secret'] }); + if ( + originInputs['oidc.client_secret'] !== inputs['oidc.client_secret'] && + inputs['oidc.client_secret'] !== '' + ) { + options.push({ + key: 'oidc.client_secret', + value: inputs['oidc.client_secret'], + }); } - if (originInputs['oidc.authorization_endpoint'] !== inputs['oidc.authorization_endpoint']) { - options.push({ key: 'oidc.authorization_endpoint', value: inputs['oidc.authorization_endpoint'] }); + if ( + originInputs['oidc.authorization_endpoint'] !== + inputs['oidc.authorization_endpoint'] + ) { + options.push({ + key: 'oidc.authorization_endpoint', + value: inputs['oidc.authorization_endpoint'], + }); } if (originInputs['oidc.token_endpoint'] !== inputs['oidc.token_endpoint']) { - options.push({ key: 'oidc.token_endpoint', value: inputs['oidc.token_endpoint'] }); + options.push({ + key: 'oidc.token_endpoint', + value: inputs['oidc.token_endpoint'], + }); } - if (originInputs['oidc.user_info_endpoint'] !== inputs['oidc.user_info_endpoint']) { - options.push({ key: 'oidc.user_info_endpoint', value: inputs['oidc.user_info_endpoint'] }); + if ( + originInputs['oidc.user_info_endpoint'] !== + inputs['oidc.user_info_endpoint'] + ) { + options.push({ + key: 'oidc.user_info_endpoint', + value: inputs['oidc.user_info_endpoint'], + }); } - + if (options.length > 0) { await updateOptions(options); } @@ -365,21 +423,27 @@ const SystemSetting = () => { const submitTelegramSettings = async () => { const options = [ { key: 'TelegramBotToken', value: inputs.TelegramBotToken }, - { key: 'TelegramBotName', value: inputs.TelegramBotName } + { key: 'TelegramBotName', value: inputs.TelegramBotName }, ]; await updateOptions(options); }; const submitTurnstile = async () => { const options = []; - + if (originInputs['TurnstileSiteKey'] !== inputs.TurnstileSiteKey) { options.push({ key: 'TurnstileSiteKey', value: inputs.TurnstileSiteKey }); } - if (originInputs['TurnstileSecretKey'] !== inputs.TurnstileSecretKey && inputs.TurnstileSecretKey !== '') { - options.push({ key: 'TurnstileSecretKey', value: inputs.TurnstileSecretKey }); + if ( + originInputs['TurnstileSecretKey'] !== inputs.TurnstileSecretKey && + inputs.TurnstileSecretKey !== '' + ) { + options.push({ + key: 'TurnstileSecretKey', + value: inputs.TurnstileSecretKey, + }); } - + if (options.length > 0) { await updateOptions(options); } @@ -387,14 +451,20 @@ const SystemSetting = () => { const submitLinuxDOOAuth = async () => { const options = []; - + if (originInputs['LinuxDOClientId'] !== inputs.LinuxDOClientId) { options.push({ key: 'LinuxDOClientId', value: inputs.LinuxDOClientId }); } - if (originInputs['LinuxDOClientSecret'] !== inputs.LinuxDOClientSecret && inputs.LinuxDOClientSecret !== '') { - options.push({ key: 'LinuxDOClientSecret', value: inputs.LinuxDOClientSecret }); + if ( + originInputs['LinuxDOClientSecret'] !== inputs.LinuxDOClientSecret && + inputs.LinuxDOClientSecret !== '' + ) { + options.push({ + key: 'LinuxDOClientSecret', + value: inputs.LinuxDOClientSecret, + }); } - + if (options.length > 0) { await updateOptions(options); } @@ -402,7 +472,7 @@ const SystemSetting = () => { const handleCheckboxChange = async (optionKey, event) => { const value = event.target.checked; - + if (optionKey === 'PasswordLoginEnabled' && !value) { setShowPasswordLoginConfirmModal(true); } else { @@ -450,7 +520,9 @@ const SystemSetting = () => { ) - + { (当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!) - + { - + { handleCheckboxChange('RegisterEnabled', e)} + onChange={(e) => + handleCheckboxChange('RegisterEnabled', e) + } > 允许新用户注册 @@ -631,7 +709,9 @@ const SystemSetting = () => { 用以防止恶意用户利用临时邮箱批量注册 - + { 用以支持系统的邮件发送 - + @@ -701,7 +783,9 @@ const SystemSetting = () => { handleCheckboxChange('SMTPSSLEnabled', e)} + onChange={(e) => + handleCheckboxChange('SMTPSSLEnabled', e) + } > 启用SMTP SSL @@ -711,14 +795,22 @@ const SystemSetting = () => { - 用以支持通过 OIDC 登录,例如 Okta、Auth0 等兼容 OIDC 协议的 IdP + + 用以支持通过 OIDC 登录,例如 Okta、Auth0 等兼容 OIDC 协议的 + IdP + - 若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 OIDC Well-Known URL,系统会自动获取 OIDC 配置 - + + 若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 + OIDC Well-Known URL,系统会自动获取 OIDC 配置 + + { /> - + { /> - + { description={`Homepage URL 填 ${inputs.ServerAddress ? inputs.ServerAddress : '网站地址'},Authorization callback URL 填 ${inputs.ServerAddress ? inputs.ServerAddress : '网站地址'}/oauth/github`} style={{ marginBottom: 20, marginTop: 16 }} /> - + - + { href='https://connect.linux.do/' target='_blank' rel='noreferrer' - style={{ display: 'inline-block', marginLeft: 4, marginRight: 4 }} + style={{ + display: 'inline-block', + marginLeft: 4, + marginRight: 4, + }} > 点击此处 @@ -812,10 +917,12 @@ const SystemSetting = () => { description={`回调 URL 填 ${inputs.ServerAddress ? inputs.ServerAddress : '网站地址'}/oauth/linuxdo`} style={{ marginBottom: 20, marginTop: 16 }} /> - + - @@ -835,7 +942,9 @@ const SystemSetting = () => { 用以支持通过微信进行登录注册 - + { 用以支持通过 Telegram 进行登录注册 - + { 用以支持用户校验 - + { - + { setShowPasswordLoginConfirmModal(false); formApiRef.current.setValue('PasswordLoginEnabled', true); }} - okText="确认" - cancelText="取消" + okText='确认' + cancelText='取消' >

您确定要取消密码登录功能吗?这可能会影响用户的登录方式。

@@ -919,12 +1032,19 @@ const SystemSetting = () => { )} ) : ( -
- +
+
)}
); }; -export default SystemSetting; \ No newline at end of file +export default SystemSetting; diff --git a/web/src/components/TaskLogsTable.js b/web/src/components/TaskLogsTable.js index 52bf39bb..4d243133 100644 --- a/web/src/components/TaskLogsTable.js +++ b/web/src/components/TaskLogsTable.js @@ -1,400 +1,512 @@ import React, { useEffect, useState } from 'react'; import { Label } from 'semantic-ui-react'; -import { API, copy, isAdmin, showError, showSuccess, timestamp2string } from '../helpers'; +import { + API, + copy, + isAdmin, + showError, + showSuccess, + timestamp2string, +} from '../helpers'; import { - Table, - Tag, - Form, - Button, - Layout, - Modal, - Typography, Progress, Card + Table, + Tag, + Form, + Button, + Layout, + Modal, + Typography, + Progress, + Card, } from '@douyinfe/semi-ui'; import { ITEMS_PER_PAGE } from '../constants'; -const colors = ['amber', 'blue', 'cyan', 'green', 'grey', 'indigo', - 'light-blue', 'lime', 'orange', 'pink', - 'purple', 'red', 'teal', 'violet', 'yellow' -] - +const colors = [ + 'amber', + 'blue', + 'cyan', + 'green', + 'grey', + 'indigo', + 'light-blue', + 'lime', + 'orange', + 'pink', + 'purple', + 'red', + 'teal', + 'violet', + 'yellow', +]; const renderTimestamp = (timestampInSeconds) => { - const date = new Date(timestampInSeconds * 1000); // 从秒转换为毫秒 + const date = new Date(timestampInSeconds * 1000); // 从秒转换为毫秒 - const year = date.getFullYear(); // 获取年份 - const month = ('0' + (date.getMonth() + 1)).slice(-2); // 获取月份,从0开始需要+1,并保证两位数 - const day = ('0' + date.getDate()).slice(-2); // 获取日期,并保证两位数 - const hours = ('0' + date.getHours()).slice(-2); // 获取小时,并保证两位数 - const minutes = ('0' + date.getMinutes()).slice(-2); // 获取分钟,并保证两位数 - const seconds = ('0' + date.getSeconds()).slice(-2); // 获取秒钟,并保证两位数 + const year = date.getFullYear(); // 获取年份 + const month = ('0' + (date.getMonth() + 1)).slice(-2); // 获取月份,从0开始需要+1,并保证两位数 + const day = ('0' + date.getDate()).slice(-2); // 获取日期,并保证两位数 + const hours = ('0' + date.getHours()).slice(-2); // 获取小时,并保证两位数 + const minutes = ('0' + date.getMinutes()).slice(-2); // 获取分钟,并保证两位数 + const seconds = ('0' + date.getSeconds()).slice(-2); // 获取秒钟,并保证两位数 - return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; // 格式化输出 + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; // 格式化输出 }; function renderDuration(submit_time, finishTime) { - // 确保startTime和finishTime都是有效的时间戳 - if (!submit_time || !finishTime) return 'N/A'; + // 确保startTime和finishTime都是有效的时间戳 + if (!submit_time || !finishTime) return 'N/A'; - // 将时间戳转换为Date对象 - const start = new Date(submit_time); - const finish = new Date(finishTime); + // 将时间戳转换为Date对象 + const start = new Date(submit_time); + const finish = new Date(finishTime); - // 计算时间差(毫秒) - const durationMs = finish - start; + // 计算时间差(毫秒) + const durationMs = finish - start; - // 将时间差转换为秒,并保留一位小数 - const durationSec = (durationMs / 1000).toFixed(1); + // 将时间差转换为秒,并保留一位小数 + const durationSec = (durationMs / 1000).toFixed(1); - // 设置颜色:大于60秒则为红色,小于等于60秒则为绿色 - const color = durationSec > 60 ? 'red' : 'green'; + // 设置颜色:大于60秒则为红色,小于等于60秒则为绿色 + const color = durationSec > 60 ? 'red' : 'green'; - // 返回带有样式的颜色标签 - return ( - - {durationSec} 秒 - - ); + // 返回带有样式的颜色标签 + return ( + + {durationSec} 秒 + + ); } const LogsTable = () => { - const [isModalOpen, setIsModalOpen] = useState(false); - const [modalContent, setModalContent] = useState(''); - const isAdminUser = isAdmin(); - const columns = [ - { - title: "提交时间", - dataIndex: 'submit_time', - render: (text, record, index) => { - return ( -
- {text ? renderTimestamp(text) : "-"} -
- ); - }, - }, - { - title: "结束时间", - dataIndex: 'finish_time', - render: (text, record, index) => { - return ( -
- {text ? renderTimestamp(text) : "-"} -
- ); - }, - }, - { - title: '进度', - dataIndex: 'progress', - width: 50, - render: (text, record, index) => { - return ( -
- { - // 转换例如100%为数字100,如果text未定义,返回0 - isNaN(text.replace('%', '')) ? text : - } -
- ); - }, - }, - { - title: '花费时间', - dataIndex: 'finish_time', // 以finish_time作为dataIndex - key: 'finish_time', - render: (finish, record) => { - // 假设record.start_time是存在的,并且finish是完成时间的时间戳 - return <> - { - finish ? renderDuration(record.submit_time, finish) : "-" - } - - }, - }, - { - title: "渠道", - dataIndex: 'channel_id', - className: isAdminUser ? 'tableShow' : 'tableHiddle', - render: (text, record, index) => { - return ( -
- { - copyText(text); // 假设copyText是用于文本复制的函数 - }} - > - {' '} - {text}{' '} - -
- ); - }, - }, - { - title: "平台", - dataIndex: 'platform', - render: (text, record, index) => { - return ( -
- {renderPlatform(text)} -
- ); - }, - }, - { - title: '类型', - dataIndex: 'action', - render: (text, record, index) => { - return ( -
- {renderType(text)} -
- ); - }, - }, - { - title: '任务ID(点击查看详情)', - dataIndex: 'task_id', - render: (text, record, index) => { - return ( { - setModalContent(JSON.stringify(record, null, 2)); - setIsModalOpen(true); - }} - > -
- {text} -
-
); - }, - }, - { - title: '任务状态', - dataIndex: 'status', - render: (text, record, index) => { - return ( -
- {renderStatus(text)} -
- ); - }, - }, - - { - title: '失败原因', - dataIndex: 'fail_reason', - render: (text, record, index) => { - // 如果text未定义,返回替代文本,例如空字符串''或其他 - if (!text) { - return '无'; - } - - return ( - { - setModalContent(text); - setIsModalOpen(true); - }} - > - {text} - - ); + const [isModalOpen, setIsModalOpen] = useState(false); + const [modalContent, setModalContent] = useState(''); + const isAdminUser = isAdmin(); + const columns = [ + { + title: '提交时间', + dataIndex: 'submit_time', + render: (text, record, index) => { + return
{text ? renderTimestamp(text) : '-'}
; + }, + }, + { + title: '结束时间', + dataIndex: 'finish_time', + render: (text, record, index) => { + return
{text ? renderTimestamp(text) : '-'}
; + }, + }, + { + title: '进度', + dataIndex: 'progress', + width: 50, + render: (text, record, index) => { + return ( +
+ { + // 转换例如100%为数字100,如果text未定义,返回0 + isNaN(text.replace('%', '')) ? ( + text + ) : ( + + ) } +
+ ); + }, + }, + { + title: '花费时间', + dataIndex: 'finish_time', // 以finish_time作为dataIndex + key: 'finish_time', + render: (finish, record) => { + // 假设record.start_time是存在的,并且finish是完成时间的时间戳 + return <>{finish ? renderDuration(record.submit_time, finish) : '-'}; + }, + }, + { + title: '渠道', + dataIndex: 'channel_id', + className: isAdminUser ? 'tableShow' : 'tableHiddle', + render: (text, record, index) => { + return ( +
+ { + copyText(text); // 假设copyText是用于文本复制的函数 + }} + > + {' '} + {text}{' '} + +
+ ); + }, + }, + { + title: '平台', + dataIndex: 'platform', + render: (text, record, index) => { + return
{renderPlatform(text)}
; + }, + }, + { + title: '类型', + dataIndex: 'action', + render: (text, record, index) => { + return
{renderType(text)}
; + }, + }, + { + title: '任务ID(点击查看详情)', + dataIndex: 'task_id', + render: (text, record, index) => { + return ( + { + setModalContent(JSON.stringify(record, null, 2)); + setIsModalOpen(true); + }} + > +
{text}
+
+ ); + }, + }, + { + title: '任务状态', + dataIndex: 'status', + render: (text, record, index) => { + return
{renderStatus(text)}
; + }, + }, + + { + title: '失败原因', + dataIndex: 'fail_reason', + render: (text, record, index) => { + // 如果text未定义,返回替代文本,例如空字符串''或其他 + if (!text) { + return '无'; } - ]; - const [logs, setLogs] = useState([]); - const [loading, setLoading] = useState(true); - const [activePage, setActivePage] = useState(1); - const [logCount, setLogCount] = useState(ITEMS_PER_PAGE); - const [logType] = useState(0); + return ( + { + setModalContent(text); + setIsModalOpen(true); + }} + > + {text} + + ); + }, + }, + ]; - let now = new Date(); - // 初始化start_timestamp为前一天 - let zeroNow = new Date(now.getFullYear(), now.getMonth(), now.getDate()); - const [inputs, setInputs] = useState({ - channel_id: '', - task_id: '', - start_timestamp: timestamp2string(zeroNow.getTime() /1000), - end_timestamp: '', - }); - const { channel_id, task_id, start_timestamp, end_timestamp } = inputs; + const [logs, setLogs] = useState([]); + const [loading, setLoading] = useState(true); + const [activePage, setActivePage] = useState(1); + const [logCount, setLogCount] = useState(ITEMS_PER_PAGE); + const [logType] = useState(0); - const handleInputChange = (value, name) => { - setInputs((inputs) => ({ ...inputs, [name]: value })); - }; + let now = new Date(); + // 初始化start_timestamp为前一天 + let zeroNow = new Date(now.getFullYear(), now.getMonth(), now.getDate()); + const [inputs, setInputs] = useState({ + channel_id: '', + task_id: '', + start_timestamp: timestamp2string(zeroNow.getTime() / 1000), + end_timestamp: '', + }); + const { channel_id, task_id, start_timestamp, end_timestamp } = inputs; + const handleInputChange = (value, name) => { + setInputs((inputs) => ({ ...inputs, [name]: value })); + }; - const setLogsFormat = (logs) => { - for (let i = 0; i < logs.length; i++) { - logs[i].timestamp2string = timestamp2string(logs[i].created_at); - logs[i].key = '' + logs[i].id; - } - // data.key = '' + data.id - setLogs(logs); - setLogCount(logs.length + ITEMS_PER_PAGE); - // console.log(logCount); + const setLogsFormat = (logs) => { + for (let i = 0; i < logs.length; i++) { + logs[i].timestamp2string = timestamp2string(logs[i].created_at); + logs[i].key = '' + logs[i].id; } + // data.key = '' + data.id + setLogs(logs); + setLogCount(logs.length + ITEMS_PER_PAGE); + // console.log(logCount); + }; - const loadLogs = async (startIdx) => { - setLoading(true); + const loadLogs = async (startIdx) => { + setLoading(true); - let url = ''; - let localStartTimestamp = parseInt(Date.parse(start_timestamp) / 1000); - let localEndTimestamp = parseInt(Date.parse(end_timestamp) / 1000 ); - if (isAdminUser) { - url = `/api/task/?p=${startIdx}&channel_id=${channel_id}&task_id=${task_id}&start_timestamp=${localStartTimestamp}&end_timestamp=${localEndTimestamp}`; - } else { - url = `/api/task/self?p=${startIdx}&task_id=${task_id}&start_timestamp=${localStartTimestamp}&end_timestamp=${localEndTimestamp}`; - } - const res = await API.get(url); - let { success, message, data } = res.data; - if (success) { - if (startIdx === 0) { - setLogsFormat(data); - } else { - let newLogs = [...logs]; - newLogs.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); - setLogsFormat(newLogs); - } - } else { - showError(message); - } - setLoading(false); - }; - - const pageData = logs.slice((activePage - 1) * ITEMS_PER_PAGE, activePage * ITEMS_PER_PAGE); - - const handlePageChange = page => { - setActivePage(page); - if (page === Math.ceil(logs.length / ITEMS_PER_PAGE) + 1) { - // In this case we have to load more data and then append them. - loadLogs(page - 1).then(r => { - }); - } - }; - - const refresh = async () => { - // setLoading(true); - setActivePage(1); - await loadLogs(0); - }; - - const copyText = async (text) => { - if (await copy(text)) { - showSuccess('已复制:' + text); - } else { - // setSearchKeyword(text); - Modal.error({ title: "无法复制到剪贴板,请手动复制", content: text }); - } + let url = ''; + let localStartTimestamp = parseInt(Date.parse(start_timestamp) / 1000); + let localEndTimestamp = parseInt(Date.parse(end_timestamp) / 1000); + if (isAdminUser) { + url = `/api/task/?p=${startIdx}&channel_id=${channel_id}&task_id=${task_id}&start_timestamp=${localStartTimestamp}&end_timestamp=${localEndTimestamp}`; + } else { + url = `/api/task/self?p=${startIdx}&task_id=${task_id}&start_timestamp=${localStartTimestamp}&end_timestamp=${localEndTimestamp}`; } - - useEffect(() => { - refresh().then(); - }, [logType]); - - const renderType = (type) => { - switch (type) { - case 'MUSIC': - return ; - case 'LYRICS': - return ; - - default: - return ; - } + const res = await API.get(url); + let { success, message, data } = res.data; + if (success) { + if (startIdx === 0) { + setLogsFormat(data); + } else { + let newLogs = [...logs]; + newLogs.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); + setLogsFormat(newLogs); + } + } else { + showError(message); } + setLoading(false); + }; - const renderPlatform = (type) => { - switch (type) { - case "suno": - return ; - default: - return ; - } + const pageData = logs.slice( + (activePage - 1) * ITEMS_PER_PAGE, + activePage * ITEMS_PER_PAGE, + ); + + const handlePageChange = (page) => { + setActivePage(page); + if (page === Math.ceil(logs.length / ITEMS_PER_PAGE) + 1) { + // In this case we have to load more data and then append them. + loadLogs(page - 1).then((r) => {}); } + }; - const renderStatus = (type) => { - switch (type) { - case 'SUCCESS': - return ; - case 'NOT_START': - return ; - case 'SUBMITTED': - return ; - case 'IN_PROGRESS': - return ; - case 'FAILURE': - return ; - case 'QUEUED': - return ; - case 'UNKNOWN': - return ; - case '': - return ; - default: - return ; - } + const refresh = async () => { + // setLoading(true); + setActivePage(1); + await loadLogs(0); + }; + + const copyText = async (text) => { + if (await copy(text)) { + showSuccess('已复制:' + text); + } else { + // setSearchKeyword(text); + Modal.error({ title: '无法复制到剪贴板,请手动复制', content: text }); } + }; - return ( - <> + useEffect(() => { + refresh().then(); + }, [logType]); - -
- <> - {isAdminUser && handleInputChange(value, 'channel_id')} /> - } - handleInputChange(value, 'task_id')} /> + const renderType = (type) => { + switch (type) { + case 'MUSIC': + return ( + + ); + case 'LYRICS': + return ( + + ); - handleInputChange(value, 'start_timestamp')} /> - handleInputChange(value, 'end_timestamp')} /> - - - - - - - setIsModalOpen(false)} - onCancel={() => setIsModalOpen(false)} - closable={null} - bodyStyle={{ height: '400px', overflow: 'auto' }} // 设置模态框内容区域样式 - width={800} // 设置模态框宽度 - > -

{modalContent}

-
- - - ); + default: + return ( + + ); + } + }; + + const renderPlatform = (type) => { + switch (type) { + case 'suno': + return ( + + ); + default: + return ( + + ); + } + }; + + const renderStatus = (type) => { + switch (type) { + case 'SUCCESS': + return ( + + ); + case 'NOT_START': + return ( + + ); + case 'SUBMITTED': + return ( + + ); + case 'IN_PROGRESS': + return ( + + ); + case 'FAILURE': + return ( + + ); + case 'QUEUED': + return ( + + ); + case 'UNKNOWN': + return ( + + ); + case '': + return ( + + ); + default: + return ( + + ); + } + }; + + return ( + <> + +
+ <> + {isAdminUser && ( + handleInputChange(value, 'channel_id')} + /> + )} + handleInputChange(value, 'task_id')} + /> + + handleInputChange(value, 'start_timestamp')} + /> + handleInputChange(value, 'end_timestamp')} + /> + + + + +
+ + setIsModalOpen(false)} + onCancel={() => setIsModalOpen(false)} + closable={null} + bodyStyle={{ height: '400px', overflow: 'auto' }} // 设置模态框内容区域样式 + width={800} // 设置模态框宽度 + > +

{modalContent}

+
+ + + ); }; export default LogsTable; diff --git a/web/src/components/TokensTable.js b/web/src/components/TokensTable.js index ba2a8be3..599b3459 100644 --- a/web/src/components/TokensTable.js +++ b/web/src/components/TokensTable.js @@ -8,14 +8,16 @@ import { } from '../helpers'; import { ITEMS_PER_PAGE } from '../constants'; -import {renderGroup, renderQuota} from '../helpers/render'; +import { renderGroup, renderQuota } from '../helpers/render'; import { - Button, Divider, + Button, + Divider, Dropdown, Form, Modal, Popconfirm, - Popover, Space, + Popover, + Space, SplitButtonGroup, Table, Tag, @@ -30,7 +32,6 @@ function renderTimestamp(timestamp) { } const TokensTable = () => { - const { t } = useTranslation(); const renderStatus = (status, model_limits_enabled = false) => { @@ -86,12 +87,14 @@ const TokensTable = () => { dataIndex: 'status', key: 'status', render: (text, record, index) => { - return
- - {renderStatus(text, record.model_limits_enabled)} - {renderGroup(record.group)} - -
; + return ( +
+ + {renderStatus(text, record.model_limits_enabled)} + {renderGroup(record.group)} + +
+ ); }, }, { @@ -143,7 +146,7 @@ const TokensTable = () => { dataIndex: 'operate', render: (text, record, index) => { let chats = localStorage.getItem('chats'); - let chatsArray = [] + let chatsArray = []; let shouldUseCustom = true; if (shouldUseCustom) { @@ -153,7 +156,7 @@ const TokensTable = () => { // check chats is array if (Array.isArray(chats)) { for (let i = 0; i < chats.length; i++) { - let chat = {} + let chat = {}; chat.node = 'item'; // c is a map // chat.key = chats[i].name; @@ -164,13 +167,12 @@ const TokensTable = () => { chat.name = key; chat.onClick = () => { onOpenLink(key, chats[i][key], record); - } + }; } } chatsArray.push(chat); } } - } catch (e) { console.log(e); showError(t('聊天链接配置错误,请联系管理员')); @@ -208,7 +210,11 @@ const TokensTable = () => { if (chatsArray.length === 0) { showError(t('请联系管理员配置聊天链接')); } else { - onOpenLink('default', chats[0][Object.keys(chats[0])[0]], record); + onOpenLink( + 'default', + chats[0][Object.keys(chats[0])[0]], + record, + ); } }} > @@ -539,36 +545,36 @@ const TokensTable = () => { {t('查询')} - +
@@ -588,7 +594,7 @@ const TokensTable = () => { t('第 {{start}} - {{end}} 条,共 {{total}} 条', { start: page.currentStart, end: page.currentEnd, - total: tokens.length + total: tokens.length, }), onPageSizeChange: (size) => { setPageSize(size); diff --git a/web/src/components/UsersTable.js b/web/src/components/UsersTable.js index a1e43b45..b77f7396 100644 --- a/web/src/components/UsersTable.js +++ b/web/src/components/UsersTable.js @@ -167,7 +167,11 @@ const UsersTable = () => { manageUser(record.id, 'demote', record); }} > - @@ -261,7 +265,7 @@ const UsersTable = () => { users[i].key = users[i].id; } setUsers(users); - } + }; const loadUsers = async (startIdx, pageSize) => { const res = await API.get(`/api/user/?p=${startIdx}&page_size=${pageSize}`); @@ -277,7 +281,6 @@ const UsersTable = () => { setLoading(false); }; - useEffect(() => { loadUsers(0, pageSize) .then() @@ -327,22 +330,29 @@ const UsersTable = () => { } }; - const searchUsers = async (startIdx, pageSize, searchKeyword, searchGroup) => { + const searchUsers = async ( + startIdx, + pageSize, + searchKeyword, + searchGroup, + ) => { if (searchKeyword === '' && searchGroup === '') { - // if keyword is blank, load files instead. - await loadUsers(startIdx, pageSize); - return; + // if keyword is blank, load files instead. + await loadUsers(startIdx, pageSize); + return; } setSearching(true); - const res = await API.get(`/api/user/search?keyword=${searchKeyword}&group=${searchGroup}&p=${startIdx}&page_size=${pageSize}`); + const res = await API.get( + `/api/user/search?keyword=${searchKeyword}&group=${searchGroup}&p=${startIdx}&page_size=${pageSize}`, + ); const { success, message, data } = res.data; if (success) { - const newPageData = data.items; - setActivePage(data.page); - setUserCount(data.total); - setUserFormat(newPageData); + const newPageData = data.items; + setActivePage(data.page); + setUserCount(data.total); + setUserFormat(newPageData); } else { - showError(message); + showError(message); } setSearching(false); }; @@ -354,9 +364,9 @@ const UsersTable = () => { const handlePageChange = (page) => { setActivePage(page); if (searchKeyword === '' && searchGroup === '') { - loadUsers(page, pageSize).then(); + loadUsers(page, pageSize).then(); } else { - searchUsers(page, pageSize, searchKeyword, searchGroup).then(); + searchUsers(page, pageSize, searchKeyword, searchGroup).then(); } }; @@ -372,7 +382,7 @@ const UsersTable = () => { }; const refresh = async () => { - setActivePage(1) + setActivePage(1); if (searchKeyword === '') { await loadUsers(activePage, pageSize); } else { @@ -431,7 +441,9 @@ const UsersTable = () => { >
- + { onChange={(value) => handleKeywordChange(value)} /> - + { t('第 {{start}} - {{end}} 条,共 {{total}} 条', { start: page.currentStart, end: page.currentEnd, - total: users.length + total: users.length, }), currentPage: activePage, pageSize: pageSize, diff --git a/web/src/components/custom/TextInput.js b/web/src/components/custom/TextInput.js index b4ace8f1..8c137fe1 100644 --- a/web/src/components/custom/TextInput.js +++ b/web/src/components/custom/TextInput.js @@ -1,7 +1,14 @@ import { Input, Typography } from '@douyinfe/semi-ui'; import React from 'react'; -const TextInput = ({ label, name, value, onChange, placeholder, type = 'text' }) => { +const TextInput = ({ + label, + name, + value, + onChange, + placeholder, + type = 'text', +}) => { return ( <>
@@ -12,10 +19,10 @@ const TextInput = ({ label, name, value, onChange, placeholder, type = 'text' }) placeholder={placeholder} onChange={(value) => onChange(value)} value={value} - autoComplete="new-password" + autoComplete='new-password' /> ); -} +}; -export default TextInput; \ No newline at end of file +export default TextInput; diff --git a/web/src/components/custom/TextNumberInput.js b/web/src/components/custom/TextNumberInput.js index e25c7725..36e0cac0 100644 --- a/web/src/components/custom/TextNumberInput.js +++ b/web/src/components/custom/TextNumberInput.js @@ -12,10 +12,10 @@ const TextNumberInput = ({ label, name, value, onChange, placeholder }) => { placeholder={placeholder} onChange={(value) => onChange(value)} value={value} - autoComplete="new-password" + autoComplete='new-password' /> ); -} +}; -export default TextNumberInput; \ No newline at end of file +export default TextNumberInput; diff --git a/web/src/components/fetchTokenKeys.js b/web/src/components/fetchTokenKeys.js index 46a70f15..e9cec001 100644 --- a/web/src/components/fetchTokenKeys.js +++ b/web/src/components/fetchTokenKeys.js @@ -13,7 +13,7 @@ async function fetchTokenKeys() { throw new Error('Failed to fetch token keys'); } } catch (error) { - console.error("Error fetching token keys:", error); + console.error('Error fetching token keys:', error); return []; } } @@ -27,7 +27,7 @@ function getServerAddress() { status = JSON.parse(status); serverAddress = status.server_address || ''; } catch (error) { - console.error("Failed to parse status from localStorage:", error); + console.error('Failed to parse status from localStorage:', error); } } @@ -65,4 +65,4 @@ export function useTokenKeys(id) { }, []); return { keys, serverAddress, isLoading }; -} \ No newline at end of file +} diff --git a/web/src/components/utils.js b/web/src/components/utils.js index df009bb0..93a5fb85 100644 --- a/web/src/components/utils.js +++ b/web/src/components/utils.js @@ -20,13 +20,12 @@ export async function onOIDCClicked(auth_url, client_id, openInNewTab = false) { const state = await getOAuthState(); if (!state) return; const redirect_uri = `${window.location.origin}/oauth/oidc`; - const response_type = "code"; - const scope = "openid profile email"; + const response_type = 'code'; + const scope = 'openid profile email'; const url = `${auth_url}?client_id=${client_id}&redirect_uri=${redirect_uri}&response_type=${response_type}&scope=${scope}&state=${state}`; if (openInNewTab) { window.open(url); - } else - { + } else { window.location.href = url; } } diff --git a/web/src/constants/channel.constants.js b/web/src/constants/channel.constants.js index f1d0c88d..958e1b4f 100644 --- a/web/src/constants/channel.constants.js +++ b/web/src/constants/channel.constants.js @@ -3,86 +3,86 @@ export const CHANNEL_OPTIONS = [ { value: 2, color: 'light-blue', - label: 'Midjourney Proxy' + label: 'Midjourney Proxy', }, { value: 5, color: 'blue', - label: 'Midjourney Proxy Plus' + label: 'Midjourney Proxy Plus', }, { value: 36, color: 'purple', - label: 'Suno API' + label: 'Suno API', }, { value: 4, color: 'grey', label: 'Ollama' }, { value: 14, color: 'indigo', - label: 'Anthropic Claude' + label: 'Anthropic Claude', }, { value: 33, color: 'indigo', - label: 'AWS Claude' + label: 'AWS Claude', }, { value: 41, color: 'blue', label: 'Vertex AI' }, { value: 3, color: 'teal', - label: 'Azure OpenAI' + label: 'Azure OpenAI', }, { value: 34, color: 'purple', - label: 'Cohere' + label: 'Cohere', }, { value: 39, color: 'grey', label: 'Cloudflare' }, { value: 43, color: 'blue', label: 'DeepSeek' }, { value: 15, color: 'blue', - label: '百度文心千帆' + label: '百度文心千帆', }, { value: 46, color: 'blue', - label: '百度文心千帆V2' + label: '百度文心千帆V2', }, { value: 17, color: 'orange', - label: '阿里通义千问' + label: '阿里通义千问', }, { value: 18, color: 'blue', - label: '讯飞星火认知' + label: '讯飞星火认知', }, { value: 16, color: 'violet', - label: '智谱 ChatGLM' + label: '智谱 ChatGLM', }, { value: 26, color: 'purple', - label: '智谱 GLM-4V' + label: '智谱 GLM-4V', }, { value: 24, color: 'orange', - label: 'Google Gemini' + label: 'Google Gemini', }, { value: 11, color: 'orange', - label: 'Google PaLM2' + label: 'Google PaLM2', }, { value: 47, color: 'blue', - label: 'Xinference' + label: 'Xinference', }, { value: 25, color: 'green', label: 'Moonshot' }, { value: 20, color: 'green', label: 'OpenRouter' }, @@ -98,21 +98,21 @@ export const CHANNEL_OPTIONS = [ { value: 22, color: 'blue', - label: '知识库:FastGPT' + label: '知识库:FastGPT', }, { value: 21, color: 'purple', - label: '知识库:AI Proxy' + label: '知识库:AI Proxy', }, { value: 44, color: 'purple', - label: '嵌入模型:MokaAI M3E' + label: '嵌入模型:MokaAI M3E', }, { value: 45, color: 'blue', - label: '字节火山方舟、豆包、DeepSeek通用' + label: '字节火山方舟、豆包、DeepSeek通用', }, ]; diff --git a/web/src/context/Style/index.js b/web/src/context/Style/index.js index fb516e84..db9b0dd1 100644 --- a/web/src/context/Style/index.js +++ b/web/src/context/Style/index.js @@ -19,25 +19,25 @@ export const StyleProvider = ({ children }) => { if ('type' in action) { switch (action.type) { case 'TOGGLE_SIDER': - setState(prev => ({ ...prev, showSider: !prev.showSider })); + setState((prev) => ({ ...prev, showSider: !prev.showSider })); break; case 'SET_SIDER': - setState(prev => ({ ...prev, showSider: action.payload })); + setState((prev) => ({ ...prev, showSider: action.payload })); break; case 'SET_MOBILE': - setState(prev => ({ ...prev, isMobile: action.payload })); + setState((prev) => ({ ...prev, isMobile: action.payload })); break; case 'SET_SIDER_COLLAPSED': - setState(prev => ({ ...prev, siderCollapsed: action.payload })); - break + setState((prev) => ({ ...prev, siderCollapsed: action.payload })); + break; case 'SET_INNER_PADDING': - setState(prev => ({ ...prev, shouldInnerPadding: action.payload })); + setState((prev) => ({ ...prev, shouldInnerPadding: action.payload })); break; default: - setState(prev => ({ ...prev, ...action })); + setState((prev) => ({ ...prev, ...action })); } } else { - setState(prev => ({ ...prev, ...action })); + setState((prev) => ({ ...prev, ...action })); } }; @@ -45,7 +45,7 @@ export const StyleProvider = ({ children }) => { const updateIsMobile = () => { const mobileDetected = isMobile(); dispatch({ type: 'SET_MOBILE', payload: mobileDetected }); - + // If on mobile, we might want to auto-hide the sidebar if (mobileDetected && state.showSider) { dispatch({ type: 'SET_SIDER', payload: false }); @@ -57,7 +57,12 @@ export const StyleProvider = ({ children }) => { const updateShowSider = () => { // check pathname const pathname = window.location.pathname; - if (pathname === '' || pathname === '/' || pathname.includes('/home') || pathname.includes('/chat')) { + if ( + pathname === '' || + pathname === '/' || + pathname.includes('/home') || + pathname.includes('/chat') + ) { dispatch({ type: 'SET_SIDER', payload: false }); dispatch({ type: 'SET_INNER_PADDING', payload: false }); } else if (pathname === '/setup') { @@ -73,7 +78,8 @@ export const StyleProvider = ({ children }) => { updateShowSider(); const updateSiderCollapsed = () => { - const isCollapsed = localStorage.getItem('default_collapse_sidebar') === 'true'; + const isCollapsed = + localStorage.getItem('default_collapse_sidebar') === 'true'; dispatch({ type: 'SET_SIDER_COLLAPSED', payload: isCollapsed }); }; @@ -83,7 +89,7 @@ export const StyleProvider = ({ children }) => { const handleResize = () => { updateIsMobile(); }; - + window.addEventListener('resize', handleResize); // Cleanup event listener on component unmount diff --git a/web/src/helpers/api.js b/web/src/helpers/api.js index 635d63b8..84d2df1f 100644 --- a/web/src/helpers/api.js +++ b/web/src/helpers/api.js @@ -7,8 +7,8 @@ export let API = axios.create({ : '', headers: { 'New-API-User': getUserIdFromLocalStorage(), - 'Cache-Control': 'no-store' - } + 'Cache-Control': 'no-store', + }, }); export function updateAPI() { @@ -18,8 +18,8 @@ export function updateAPI() { : '', headers: { 'New-API-User': getUserIdFromLocalStorage(), - 'Cache-Control': 'no-store' - } + 'Cache-Control': 'no-store', + }, }); } diff --git a/web/src/helpers/other.js b/web/src/helpers/other.js index 3e172180..c5d8c269 100644 --- a/web/src/helpers/other.js +++ b/web/src/helpers/other.js @@ -1,7 +1,7 @@ -export function getLogOther(otherStr) { - if (otherStr === undefined || otherStr === '') { - otherStr = '{}' - } - let other = JSON.parse(otherStr) - return other -} \ No newline at end of file +export function getLogOther(otherStr) { + if (otherStr === undefined || otherStr === '') { + otherStr = '{}'; + } + let other = JSON.parse(otherStr); + return other; +} diff --git a/web/src/helpers/render.js b/web/src/helpers/render.js index d1396191..4d1a3113 100644 --- a/web/src/helpers/render.js +++ b/web/src/helpers/render.js @@ -44,7 +44,10 @@ export function renderGroup(group) { if (await copy(group)) { showSuccess(i18next.t('已复制:') + group); } else { - Modal.error({ title: t('无法复制到剪贴板,请手动复制'), content: group }); + Modal.error({ + title: t('无法复制到剪贴板,请手动复制'), + content: group, + }); } }} > @@ -64,28 +67,37 @@ export function renderRatio(ratio) { } else if (ratio > 1) { color = 'blue'; } - return {ratio}x {i18next.t('倍率')}; + return ( + + {ratio}x {i18next.t('倍率')} + + ); } -const measureTextWidth = (text, style = { - fontSize: '14px', - fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif' -}, containerWidth) => { +const measureTextWidth = ( + text, + style = { + fontSize: '14px', + fontFamily: + '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif', + }, + containerWidth, +) => { const span = document.createElement('span'); - + span.style.visibility = 'hidden'; span.style.position = 'absolute'; span.style.whiteSpace = 'nowrap'; span.style.fontSize = style.fontSize; span.style.fontFamily = style.fontFamily; - + span.textContent = text; - + document.body.appendChild(span); const width = span.offsetWidth; - + document.body.removeChild(span); - + return width; }; @@ -94,7 +106,7 @@ export function truncateText(text, maxWidth = 200) { return text; } if (!text) return text; - + try { // Handle percentage-based maxWidth let actualMaxWidth = maxWidth; @@ -103,19 +115,19 @@ export function truncateText(text, maxWidth = 200) { // Use window width as fallback container width actualMaxWidth = window.innerWidth * percentage; } - + const width = measureTextWidth(text); if (width <= actualMaxWidth) return text; - + let left = 0; let right = text.length; let result = text; - + while (left <= right) { const mid = Math.floor((left + right) / 2); const truncated = text.slice(0, mid) + '...'; const currentWidth = measureTextWidth(truncated); - + if (currentWidth <= actualMaxWidth) { result = truncated; left = mid + 1; @@ -123,10 +135,13 @@ export function truncateText(text, maxWidth = 200) { right = mid - 1; } } - + return result; } catch (error) { - console.warn('Text measurement failed, falling back to character count', error); + console.warn( + 'Text measurement failed, falling back to character count', + error, + ); if (text.length > 20) { return text.slice(0, 17) + '...'; } @@ -149,11 +164,11 @@ export const renderGroupOption = (item) => { emptyContent, ...rest } = item; - + const baseStyle = { - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', padding: '8px 16px', cursor: disabled ? 'not-allowed' : 'pointer', backgroundColor: focused ? 'var(--semi-color-fill-0)' : 'transparent', @@ -162,8 +177,8 @@ export const renderGroupOption = (item) => { backgroundColor: 'var(--semi-color-primary-light-default)', }), '&:hover': { - backgroundColor: !disabled && 'var(--semi-color-fill-1)' - } + backgroundColor: !disabled && 'var(--semi-color-fill-1)', + }, }; const handleClick = () => { @@ -177,9 +192,9 @@ export const renderGroupOption = (item) => { onMouseEnter(e); } }; - + return ( -
{ {value} - + {label}
@@ -222,8 +237,7 @@ export function renderQuotaNumberWithDigit(num, digits = 2) { } export function renderNumberWithPoint(num) { - if (num === undefined) - return ''; + if (num === undefined) return ''; num = num.toFixed(2); if (num >= 100000) { // Convert number to string to manipulate it @@ -302,11 +316,14 @@ export function renderModelPrice( cacheRatio = 1.0, ) { if (modelPrice !== -1) { - return i18next.t('模型价格:${{price}} * 分组倍率:{{ratio}} = ${{total}}', { - price: modelPrice, - ratio: groupRatio, - total: modelPrice * groupRatio - }); + return i18next.t( + '模型价格:${{price}} * 分组倍率:{{ratio}} = ${{total}}', + { + price: modelPrice, + ratio: groupRatio, + total: modelPrice * groupRatio, + }, + ); } else { if (completionRatio === undefined) { completionRatio = 0; @@ -314,54 +331,72 @@ export function renderModelPrice( let inputRatioPrice = modelRatio * 2.0; let completionRatioPrice = modelRatio * 2.0 * completionRatio; let cacheRatioPrice = modelRatio * 2.0 * cacheRatio; - + // Calculate effective input tokens (non-cached + cached with ratio applied) - const effectiveInputTokens = (inputTokens - cacheTokens) + (cacheTokens * cacheRatio); - + const effectiveInputTokens = + inputTokens - cacheTokens + cacheTokens * cacheRatio; + let price = (effectiveInputTokens / 1000000) * inputRatioPrice * groupRatio + (completionTokens / 1000000) * completionRatioPrice * groupRatio; - + return ( <>
-

{i18next.t('提示价格:${{price}} / 1M tokens', { - price: inputRatioPrice, - })}

-

{i18next.t('补全价格:${{price}} * {{completionRatio}} = ${{total}} / 1M tokens (补全倍率: {{completionRatio}})', { - price: inputRatioPrice, - total: completionRatioPrice, - completionRatio: completionRatio - })}

- {cacheTokens > 0 && ( -

{i18next.t('缓存价格:${{price}} * {{cacheRatio}} = ${{total}} / 1M tokens (缓存倍率: {{cacheRatio}})', { +

+ {i18next.t('提示价格:${{price}} / 1M tokens', { price: inputRatioPrice, - total: inputRatioPrice * cacheRatio, - cacheRatio: cacheRatio - })}

+ })} +

+

+ {i18next.t( + '补全价格:${{price}} * {{completionRatio}} = ${{total}} / 1M tokens (补全倍率: {{completionRatio}})', + { + price: inputRatioPrice, + total: completionRatioPrice, + completionRatio: completionRatio, + }, + )} +

+ {cacheTokens > 0 && ( +

+ {i18next.t( + '缓存价格:${{price}} * {{cacheRatio}} = ${{total}} / 1M tokens (缓存倍率: {{cacheRatio}})', + { + price: inputRatioPrice, + total: inputRatioPrice * cacheRatio, + cacheRatio: cacheRatio, + }, + )} +

)}

- {cacheTokens > 0 ? - i18next.t('提示 {{nonCacheInput}} tokens / 1M tokens * ${{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * ${{cachePrice}} + 补全 {{completion}} tokens / 1M tokens * ${{compPrice}} * 分组 {{ratio}} = ${{total}}', { - nonCacheInput: inputTokens - cacheTokens, - cacheInput: cacheTokens, - cachePrice: inputRatioPrice * cacheRatio, - price: inputRatioPrice, - completion: completionTokens, - compPrice: completionRatioPrice, - ratio: groupRatio, - total: price.toFixed(6) - }) : - i18next.t('提示 {{input}} tokens / 1M tokens * ${{price}} + 补全 {{completion}} tokens / 1M tokens * ${{compPrice}} * 分组 {{ratio}} = ${{total}}', { - input: inputTokens, - price: inputRatioPrice, - completion: completionTokens, - compPrice: completionRatioPrice, - ratio: groupRatio, - total: price.toFixed(6) - }) - } + {cacheTokens > 0 + ? i18next.t( + '提示 {{nonCacheInput}} tokens / 1M tokens * ${{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * ${{cachePrice}} + 补全 {{completion}} tokens / 1M tokens * ${{compPrice}} * 分组 {{ratio}} = ${{total}}', + { + nonCacheInput: inputTokens - cacheTokens, + cacheInput: cacheTokens, + cachePrice: inputRatioPrice * cacheRatio, + price: inputRatioPrice, + completion: completionTokens, + compPrice: completionRatioPrice, + ratio: groupRatio, + total: price.toFixed(6), + }, + ) + : i18next.t( + '提示 {{input}} tokens / 1M tokens * ${{price}} + 补全 {{completion}} tokens / 1M tokens * ${{compPrice}} * 分组 {{ratio}} = ${{total}}', + { + input: inputTokens, + price: inputRatioPrice, + completion: completionTokens, + compPrice: completionRatioPrice, + ratio: groupRatio, + total: price.toFixed(6), + }, + )}

{i18next.t('仅供参考,以实际扣费为准')}

@@ -380,19 +415,22 @@ export function renderModelPriceSimple( if (modelPrice !== -1) { return i18next.t('价格:${{price}} * 分组:{{ratio}}', { price: modelPrice, - ratio: groupRatio + ratio: groupRatio, }); } else { if (cacheTokens !== 0) { - return i18next.t('模型: {{ratio}} * 分组: {{groupRatio}} * 缓存: {{cacheRatio}}', { - ratio: modelRatio, - groupRatio: groupRatio, - cacheRatio: cacheRatio - }); + return i18next.t( + '模型: {{ratio}} * 分组: {{groupRatio}} * 缓存: {{cacheRatio}}', + { + ratio: modelRatio, + groupRatio: groupRatio, + cacheRatio: cacheRatio, + }, + ); } else { return i18next.t('模型: {{ratio}} * 分组: {{groupRatio}}', { ratio: modelRatio, - groupRatio: groupRatio + groupRatio: groupRatio, }); } } @@ -414,11 +452,14 @@ export function renderAudioModelPrice( ) { // 1 ratio = $0.002 / 1K tokens if (modelPrice !== -1) { - return i18next.t('模型价格:${{price}} * 分组倍率:{{ratio}} = ${{total}}', { - price: modelPrice, - ratio: groupRatio, - total: modelPrice * groupRatio - }); + return i18next.t( + '模型价格:${{price}} * 分组倍率:{{ratio}} = ${{total}}', + { + price: modelPrice, + ratio: groupRatio, + total: modelPrice * groupRatio, + }, + ); } else { if (completionRatio === undefined) { completionRatio = 0; @@ -430,81 +471,120 @@ export function renderAudioModelPrice( let inputRatioPrice = modelRatio * 2.0; let completionRatioPrice = modelRatio * 2.0 * completionRatio; let cacheRatioPrice = modelRatio * 2.0 * cacheRatio; - + // Calculate effective input tokens (non-cached + cached with ratio applied) - const effectiveInputTokens = (inputTokens - cacheTokens) + (cacheTokens * cacheRatio); - + const effectiveInputTokens = + inputTokens - cacheTokens + cacheTokens * cacheRatio; + let textPrice = (effectiveInputTokens / 1000000) * inputRatioPrice * groupRatio + - (completionTokens / 1000000) * completionRatioPrice * groupRatio + (completionTokens / 1000000) * completionRatioPrice * groupRatio; let audioPrice = (audioInputTokens / 1000000) * inputRatioPrice * audioRatio * groupRatio + - (audioCompletionTokens / 1000000) * inputRatioPrice * audioRatio * audioCompletionRatio * groupRatio; + (audioCompletionTokens / 1000000) * + inputRatioPrice * + audioRatio * + audioCompletionRatio * + groupRatio; let price = textPrice + audioPrice; return ( <>
-

{i18next.t('提示价格:${{price}} / 1M tokens', { - price: inputRatioPrice, - })}

-

{i18next.t('补全价格:${{price}} * {{completionRatio}} = ${{total}} / 1M tokens (补全倍率: {{completionRatio}})', { - price: inputRatioPrice, - total: completionRatioPrice, - completionRatio: completionRatio - })}

- {cacheTokens > 0 && ( -

{i18next.t('缓存价格:${{price}} * {{cacheRatio}} = ${{total}} / 1M tokens (缓存倍率: {{cacheRatio}})', { +

+ {i18next.t('提示价格:${{price}} / 1M tokens', { price: inputRatioPrice, - total: inputRatioPrice * cacheRatio, - cacheRatio: cacheRatio - })}

+ })} +

+

+ {i18next.t( + '补全价格:${{price}} * {{completionRatio}} = ${{total}} / 1M tokens (补全倍率: {{completionRatio}})', + { + price: inputRatioPrice, + total: completionRatioPrice, + completionRatio: completionRatio, + }, + )} +

+ {cacheTokens > 0 && ( +

+ {i18next.t( + '缓存价格:${{price}} * {{cacheRatio}} = ${{total}} / 1M tokens (缓存倍率: {{cacheRatio}})', + { + price: inputRatioPrice, + total: inputRatioPrice * cacheRatio, + cacheRatio: cacheRatio, + }, + )} +

)} -

{i18next.t('音频提示价格:${{price}} * {{audioRatio}} = ${{total}} / 1M tokens (音频倍率: {{audioRatio}})', { - price: inputRatioPrice, - total: inputRatioPrice * audioRatio, - audioRatio: audioRatio - })}

-

{i18next.t('音频补全价格:${{price}} * {{audioRatio}} * {{audioCompRatio}} = ${{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})', { - price: inputRatioPrice, - total: inputRatioPrice * audioRatio * audioCompletionRatio, - audioRatio: audioRatio, - audioCompRatio: audioCompletionRatio - })}

- {cacheTokens > 0 ? - i18next.t('文字提示 {{nonCacheInput}} tokens / 1M tokens * ${{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * ${{cachePrice}} + 文字补全 {{completion}} tokens / 1M tokens * ${{compPrice}} = ${{total}}', { - nonCacheInput: inputTokens - cacheTokens, - cacheInput: cacheTokens, - cachePrice: inputRatioPrice * cacheRatio, + {i18next.t( + '音频提示价格:${{price}} * {{audioRatio}} = ${{total}} / 1M tokens (音频倍率: {{audioRatio}})', + { price: inputRatioPrice, - completion: completionTokens, - compPrice: completionRatioPrice, - total: textPrice.toFixed(6) - }) : - i18next.t('文字提示 {{input}} tokens / 1M tokens * ${{price}} + 文字补全 {{completion}} tokens / 1M tokens * ${{compPrice}} = ${{total}}', { - input: inputTokens, - price: inputRatioPrice, - completion: completionTokens, - compPrice: completionRatioPrice, - total: textPrice.toFixed(6) - }) - } + total: inputRatioPrice * audioRatio, + audioRatio: audioRatio, + }, + )}

- {i18next.t('音频提示 {{input}} tokens / 1M tokens * ${{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * ${{audioCompPrice}} = ${{total}}', { - input: audioInputTokens, - completion: audioCompletionTokens, - audioInputPrice: audioRatio * inputRatioPrice, - audioCompPrice: audioRatio * audioCompletionRatio * inputRatioPrice, - total: audioPrice.toFixed(6) - })} + {i18next.t( + '音频补全价格:${{price}} * {{audioRatio}} * {{audioCompRatio}} = ${{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})', + { + price: inputRatioPrice, + total: inputRatioPrice * audioRatio * audioCompletionRatio, + audioRatio: audioRatio, + audioCompRatio: audioCompletionRatio, + }, + )}

- {i18next.t('总价:文字价格 {{textPrice}} + 音频价格 {{audioPrice}} = ${{total}}', { - total: price.toFixed(6), - textPrice: textPrice.toFixed(6), - audioPrice: audioPrice.toFixed(6) - })} + {cacheTokens > 0 + ? i18next.t( + '文字提示 {{nonCacheInput}} tokens / 1M tokens * ${{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * ${{cachePrice}} + 文字补全 {{completion}} tokens / 1M tokens * ${{compPrice}} = ${{total}}', + { + nonCacheInput: inputTokens - cacheTokens, + cacheInput: cacheTokens, + cachePrice: inputRatioPrice * cacheRatio, + price: inputRatioPrice, + completion: completionTokens, + compPrice: completionRatioPrice, + total: textPrice.toFixed(6), + }, + ) + : i18next.t( + '文字提示 {{input}} tokens / 1M tokens * ${{price}} + 文字补全 {{completion}} tokens / 1M tokens * ${{compPrice}} = ${{total}}', + { + input: inputTokens, + price: inputRatioPrice, + completion: completionTokens, + compPrice: completionRatioPrice, + total: textPrice.toFixed(6), + }, + )} +

+

+ {i18next.t( + '音频提示 {{input}} tokens / 1M tokens * ${{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * ${{audioCompPrice}} = ${{total}}', + { + input: audioInputTokens, + completion: audioCompletionTokens, + audioInputPrice: audioRatio * inputRatioPrice, + audioCompPrice: + audioRatio * audioCompletionRatio * inputRatioPrice, + total: audioPrice.toFixed(6), + }, + )} +

+

+ {i18next.t( + '总价:文字价格 {{textPrice}} + 音频价格 {{audioPrice}} = ${{total}}', + { + total: price.toFixed(6), + textPrice: textPrice.toFixed(6), + audioPrice: audioPrice.toFixed(6), + }, + )}

{i18next.t('仅供参考,以实际扣费为准')}

@@ -517,7 +597,9 @@ export function renderQuotaWithPrompt(quota, digits) { let displayInCurrency = localStorage.getItem('display_in_currency'); displayInCurrency = displayInCurrency === 'true'; if (displayInCurrency) { - return ' | ' + i18next.t('等价金额') + ': ' + renderQuota(quota, digits) + ''; + return ( + ' | ' + i18next.t('等价金额') + ': ' + renderQuota(quota, digits) + '' + ); } return ''; } @@ -537,7 +619,7 @@ const colors = [ 'red', 'teal', 'violet', - 'yellow' + 'yellow', ]; // 基础10色色板 (N ≤ 10) @@ -551,7 +633,7 @@ const baseColors = [ '#304D77', '#B48DEB', '#009488', - '#FF7DDA' + '#FF7DDA', ]; // 扩展20色色板 (10 < N ≤ 20) @@ -575,7 +657,7 @@ const extendedColors = [ '#009488', '#59BAA8', '#FF7DDA', - '#FFCFEE' + '#FFCFEE', ]; export const modelColorMap = { @@ -631,14 +713,14 @@ export function modelToColor(modelName) { // 2. 生成一个稳定的数字作为索引 let hash = 0; for (let i = 0; i < modelName.length; i++) { - hash = ((hash << 5) - hash) + modelName.charCodeAt(i); + hash = (hash << 5) - hash + modelName.charCodeAt(i); hash = hash & hash; // Convert to 32-bit integer } hash = Math.abs(hash); // 3. 根据模型名称长度选择不同的色板 const colorPalette = modelName.length > 10 ? extendedColors : baseColors; - + // 4. 使用hash值选择颜色 const index = hash % colorPalette.length; return colorPalette[index]; @@ -668,12 +750,15 @@ export function renderClaudeModelPrice( const ratioLabel = false ? i18next.t('专属倍率') : i18next.t('分组倍率'); if (modelPrice !== -1) { - return i18next.t('模型价格:${{price}} * {{ratioType}}:{{ratio}} = ${{total}}', { - price: modelPrice, - ratioType: ratioLabel, - ratio: groupRatio, - total: modelPrice * groupRatio - }); + return i18next.t( + '模型价格:${{price}} * {{ratioType}}:{{ratio}} = ${{total}}', + { + price: modelPrice, + ratioType: ratioLabel, + ratio: groupRatio, + total: modelPrice * groupRatio, + }, + ); } else { if (completionRatio === undefined) { completionRatio = 0; @@ -687,9 +772,10 @@ export function renderClaudeModelPrice( // Calculate effective input tokens (non-cached + cached with ratio applied + cache creation with ratio applied) const nonCachedTokens = inputTokens; - const effectiveInputTokens = nonCachedTokens + - (cacheTokens * cacheRatio) + - (cacheCreationTokens * cacheCreationRatio); + const effectiveInputTokens = + nonCachedTokens + + cacheTokens * cacheRatio + + cacheCreationTokens * cacheCreationRatio; let price = (effectiveInputTokens / 1000000) * inputRatioPrice * groupRatio + @@ -698,56 +784,78 @@ export function renderClaudeModelPrice( return ( <>
-

{i18next.t('提示价格:${{price}} / 1M tokens', { - price: inputRatioPrice, - })}

-

{i18next.t('补全价格:${{price}} * {{ratio}} = ${{total}} / 1M tokens', { - price: inputRatioPrice, - ratio: completionRatio, - total: completionRatioPrice - })}

- {cacheTokens > 0 && ( -

{i18next.t('缓存价格:${{price}} * {{ratio}} = ${{total}} / 1M tokens (缓存倍率: {{cacheRatio}})', { +

+ {i18next.t('提示价格:${{price}} / 1M tokens', { price: inputRatioPrice, - ratio: cacheRatio, - total: cacheRatioPrice, - cacheRatio: cacheRatio - })}

+ })} +

+

+ {i18next.t( + '补全价格:${{price}} * {{ratio}} = ${{total}} / 1M tokens', + { + price: inputRatioPrice, + ratio: completionRatio, + total: completionRatioPrice, + }, + )} +

+ {cacheTokens > 0 && ( +

+ {i18next.t( + '缓存价格:${{price}} * {{ratio}} = ${{total}} / 1M tokens (缓存倍率: {{cacheRatio}})', + { + price: inputRatioPrice, + ratio: cacheRatio, + total: cacheRatioPrice, + cacheRatio: cacheRatio, + }, + )} +

)} {cacheCreationTokens > 0 && ( -

{i18next.t('缓存创建价格:${{price}} * {{ratio}} = ${{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})', { - price: inputRatioPrice, - ratio: cacheCreationRatio, - total: cacheCreationRatioPrice, - cacheCreationRatio: cacheCreationRatio - })}

+

+ {i18next.t( + '缓存创建价格:${{price}} * {{ratio}} = ${{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})', + { + price: inputRatioPrice, + ratio: cacheCreationRatio, + total: cacheCreationRatioPrice, + cacheCreationRatio: cacheCreationRatio, + }, + )} +

)}

- {(cacheTokens > 0 || cacheCreationTokens > 0) ? - i18next.t('提示 {{nonCacheInput}} tokens / 1M tokens * ${{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * ${{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * ${{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * ${{compPrice}} * 分组 {{ratio}} = ${{total}}', { - nonCacheInput: nonCachedTokens, - cacheInput: cacheTokens, - cacheRatio: cacheRatio, - cacheCreationInput: cacheCreationTokens, - cacheCreationRatio: cacheCreationRatio, - cachePrice: cacheRatioPrice, - cacheCreationPrice: cacheCreationRatioPrice, - price: inputRatioPrice, - completion: completionTokens, - compPrice: completionRatioPrice, - ratio: groupRatio, - total: price.toFixed(6) - }) : - i18next.t('提示 {{input}} tokens / 1M tokens * ${{price}} + 补全 {{completion}} tokens / 1M tokens * ${{compPrice}} * 分组 {{ratio}} = ${{total}}', { - input: inputTokens, - price: inputRatioPrice, - completion: completionTokens, - compPrice: completionRatioPrice, - ratio: groupRatio, - total: price.toFixed(6) - }) - } + {cacheTokens > 0 || cacheCreationTokens > 0 + ? i18next.t( + '提示 {{nonCacheInput}} tokens / 1M tokens * ${{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * ${{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * ${{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * ${{compPrice}} * 分组 {{ratio}} = ${{total}}', + { + nonCacheInput: nonCachedTokens, + cacheInput: cacheTokens, + cacheRatio: cacheRatio, + cacheCreationInput: cacheCreationTokens, + cacheCreationRatio: cacheCreationRatio, + cachePrice: cacheRatioPrice, + cacheCreationPrice: cacheCreationRatioPrice, + price: inputRatioPrice, + completion: completionTokens, + compPrice: completionRatioPrice, + ratio: groupRatio, + total: price.toFixed(6), + }, + ) + : i18next.t( + '提示 {{input}} tokens / 1M tokens * ${{price}} + 补全 {{completion}} tokens / 1M tokens * ${{compPrice}} * 分组 {{ratio}} = ${{total}}', + { + input: inputTokens, + price: inputRatioPrice, + completion: completionTokens, + compPrice: completionRatioPrice, + ratio: groupRatio, + total: price.toFixed(6), + }, + )}

{i18next.t('仅供参考,以实际扣费为准')}

@@ -770,17 +878,20 @@ export function renderClaudeLogContent( return i18next.t('模型价格 ${{price}},{{ratioType}} {{ratio}}', { price: modelPrice, ratioType: ratioLabel, - ratio: groupRatio + ratio: groupRatio, }); } else { - return i18next.t('模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},缓存创建倍率 {{cacheCreationRatio}},{{ratioType}} {{ratio}}', { - modelRatio: modelRatio, - completionRatio: completionRatio, - cacheRatio: cacheRatio, - cacheCreationRatio: cacheCreationRatio, - ratioType: ratioLabel, - ratio: groupRatio - }); + return i18next.t( + '模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},缓存创建倍率 {{cacheCreationRatio}},{{ratioType}} {{ratio}}', + { + modelRatio: modelRatio, + completionRatio: completionRatio, + cacheRatio: cacheRatio, + cacheCreationRatio: cacheCreationRatio, + ratioType: ratioLabel, + ratio: groupRatio, + }, + ); } } @@ -799,22 +910,25 @@ export function renderClaudeModelPriceSimple( return i18next.t('价格:${{price}} * {{ratioType}}:{{ratio}}', { price: modelPrice, ratioType: ratioLabel, - ratio: groupRatio + ratio: groupRatio, }); } else { if (cacheTokens !== 0 || cacheCreationTokens !== 0) { - return i18next.t('模型: {{ratio}} * {{ratioType}}: {{groupRatio}} * 缓存: {{cacheRatio}}', { - ratio: modelRatio, - ratioType: ratioLabel, - groupRatio: groupRatio, - cacheRatio: cacheRatio, - cacheCreationRatio: cacheCreationRatio - }); + return i18next.t( + '模型: {{ratio}} * {{ratioType}}: {{groupRatio}} * 缓存: {{cacheRatio}}', + { + ratio: modelRatio, + ratioType: ratioLabel, + groupRatio: groupRatio, + cacheRatio: cacheRatio, + cacheCreationRatio: cacheCreationRatio, + }, + ); } else { return i18next.t('模型: {{ratio}} * {{ratioType}}: {{groupRatio}}', { ratio: modelRatio, ratioType: ratioLabel, - groupRatio: groupRatio + groupRatio: groupRatio, }); } } @@ -824,7 +938,7 @@ export function renderLogContent( modelRatio, completionRatio, modelPrice = -1, - groupRatio + groupRatio, ) { const ratioLabel = false ? i18next.t('专属倍率') : i18next.t('分组倍率'); @@ -832,14 +946,17 @@ export function renderLogContent( return i18next.t('模型价格 ${{price}},{{ratioType}} {{ratio}}', { price: modelPrice, ratioType: ratioLabel, - ratio: groupRatio + ratio: groupRatio, }); } else { - return i18next.t('模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},{{ratioType}} {{ratio}}', { - modelRatio: modelRatio, - completionRatio: completionRatio, - ratioType: ratioLabel, - ratio: groupRatio - }); + return i18next.t( + '模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},{{ratioType}} {{ratio}}', + { + modelRatio: modelRatio, + completionRatio: completionRatio, + ratioType: ratioLabel, + ratio: groupRatio, + }, + ); } } diff --git a/web/src/helpers/utils.js b/web/src/helpers/utils.js index a40b2079..943daed9 100644 --- a/web/src/helpers/utils.js +++ b/web/src/helpers/utils.js @@ -51,11 +51,11 @@ export async function copy(text) { } catch (e) { try { // 构建input 执行 复制命令 - var _input = window.document.createElement("input"); + var _input = window.document.createElement('input'); _input.value = text; window.document.body.appendChild(_input); _input.select(); - window.document.execCommand("Copy"); + window.document.execCommand('Copy'); window.document.body.removeChild(_input); } catch (e) { okay = false; @@ -191,7 +191,7 @@ export function timestamp2string1(timestamp, dataExportDefaultTime = 'hour') { let day = date.getDate().toString(); let hour = date.getHours().toString(); if (day === '24') { - console.log("timestamp", timestamp); + console.log('timestamp', timestamp); } if (month.length === 1) { month = '0' + month; @@ -247,7 +247,6 @@ export function verifyJSONPromise(value) { } } - export function shouldShowPrompt(id) { let prompt = localStorage.getItem(`prompt-${id}`); return !prompt; diff --git a/web/src/i18n/i18n.js b/web/src/i18n/i18n.js index f0d6687d..c1bf5860 100644 --- a/web/src/i18n/i18n.js +++ b/web/src/i18n/i18n.js @@ -11,16 +11,16 @@ i18n .init({ resources: { en: { - translation: enTranslation + translation: enTranslation, }, zh: { - translation: zhTranslation - } + translation: zhTranslation, + }, }, fallbackLng: 'zh', interpolation: { - escapeValue: false - } + escapeValue: false, + }, }); -export default i18n; \ No newline at end of file +export default i18n; diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index a6ea61fc..b3fba71d 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -1065,7 +1065,7 @@ "价格:${{price}} * 分组:{{ratio}}": "Price: ${{price}} * Group: {{ratio}}", "模型: {{ratio}} * 分组: {{groupRatio}}": "Model: {{ratio}} * Group: {{groupRatio}}", "统计额度": "Statistical quota", - "统计Tokens": "Statistical Tokens", + "统计Tokens": "Statistical Tokens", "统计次数": "Statistical count", "平均RPM": "Average RPM", "平均TPM": "Average TPM", diff --git a/web/src/i18n/locales/zh.json b/web/src/i18n/locales/zh.json index b2cf894c..5c7904fc 100644 --- a/web/src/i18n/locales/zh.json +++ b/web/src/i18n/locales/zh.json @@ -10,4 +10,4 @@ "展开侧边栏": "展开侧边栏", "关闭侧边栏": "关闭侧边栏", "注销成功!": "注销成功!" -} \ No newline at end of file +} diff --git a/web/src/index.css b/web/src/index.css index 75745568..c2e8ecd0 100644 --- a/web/src/index.css +++ b/web/src/index.css @@ -1,8 +1,8 @@ body { margin: 0; padding-top: 0; - font-family: Lato, 'Helvetica Neue', Arial, Helvetica, 'Microsoft YaHei', - sans-serif; + font-family: + Lato, 'Helvetica Neue', Arial, Helvetica, 'Microsoft YaHei', sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; scrollbar-width: none; @@ -18,7 +18,20 @@ body { overflow: hidden; } -#root > section > header > section > div > div > div > div.semi-navigation-header-list-outer > div.semi-navigation-list-wrapper > ul > div > a > li > span{ +#root + > section + > header + > section + > div + > div + > div + > div.semi-navigation-header-list-outer + > div.semi-navigation-list-wrapper + > ul + > div + > a + > li + > span { font-weight: 600 !important; } @@ -33,24 +46,56 @@ body { .topnav { padding: 0 8px; } - + .topnav .semi-navigation-item { margin: 0 1px; padding: 0 4px; } - + .topnav .semi-navigation-list-wrapper { max-width: calc(55vw - 20px); overflow-x: auto; scrollbar-width: none; } - #root > section > header > section > div > div > div > div.semi-navigation-footer > div > a > li { + #root + > section + > header + > section + > div + > div + > div + > div.semi-navigation-footer + > div + > a + > li { padding: 0 0; } - #root > section > header > section > div > div > div > div.semi-navigation-header-list-outer > div.semi-navigation-list-wrapper > ul > div > a > li { + #root + > section + > header + > section + > div + > div + > div + > div.semi-navigation-header-list-outer + > div.semi-navigation-list-wrapper + > ul + > div + > a + > li { padding: 0 5px; } - #root > section > header > section > div > div > div > div.semi-navigation-footer > div:nth-child(1) > a > li { + #root + > section + > header + > section + > div + > div + > div + > div.semi-navigation-footer + > div:nth-child(1) + > a + > li { padding: 0 5px; } .semi-navigation-footer { @@ -96,13 +141,13 @@ body { position: static !important; height: 100% !important; } - + /* 确保内容区域在移动端可以正常滚动 */ #root { overflow: visible !important; height: 100% !important; } - + /* 隐藏在移动设备上 */ .hide-on-mobile { display: none !important; @@ -147,8 +192,8 @@ body::-webkit-scrollbar { } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; + font-family: + source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; } .semi-navigation-item { diff --git a/web/src/index.js b/web/src/index.js index bc16e36b..aa709ff8 100644 --- a/web/src/index.js +++ b/web/src/index.js @@ -28,7 +28,7 @@ root.render( - + diff --git a/web/src/pages/Channel/EditChannel.js b/web/src/pages/Channel/EditChannel.js index a127c09a..17930874 100644 --- a/web/src/pages/Channel/EditChannel.js +++ b/web/src/pages/Channel/EditChannel.js @@ -6,8 +6,9 @@ import { isMobile, showError, showInfo, - showSuccess, showWarning, - verifyJSON + showSuccess, + showWarning, + verifyJSON, } from '../../helpers'; import { CHANNEL_OPTIONS } from '../../constants'; import Title from '@douyinfe/semi-ui/lib/es/typography/title'; @@ -22,21 +23,22 @@ import { Select, TextArea, Checkbox, - Banner, Modal + Banner, + Modal, } from '@douyinfe/semi-ui'; import { getChannelModels, loadChannelModels } from '../../components/utils.js'; const MODEL_MAPPING_EXAMPLE = { - 'gpt-3.5-turbo': 'gpt-3.5-turbo-0125' + 'gpt-3.5-turbo': 'gpt-3.5-turbo-0125', }; const STATUS_CODE_MAPPING_EXAMPLE = { - 400: '500' + 400: '500', }; const REGION_EXAMPLE = { - 'default': 'us-central1', - 'claude-3-5-sonnet-20240620': 'europe-west1' + default: 'us-central1', + 'claude-3-5-sonnet-20240620': 'europe-west1', }; function type2secretPrompt(type) { @@ -82,7 +84,7 @@ const EditChannel = (props) => { groups: ['default'], priority: 0, weight: 0, - tag: '' + tag: '', }; const [batch, setBatch] = useState(false); const [autoBan, setAutoBan] = useState(true); @@ -98,12 +100,13 @@ const EditChannel = (props) => { if (name === 'base_url' && value.endsWith('/v1')) { Modal.confirm({ title: '警告', - content: '不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?', + content: + '不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?', onOk: () => { setInputs((inputs) => ({ ...inputs, [name]: value })); - } - }) - return + }, + }); + return; } setInputs((inputs) => ({ ...inputs, [name]: value })); if (name === 'type') { @@ -117,7 +120,7 @@ const EditChannel = (props) => { 'mj_blend', 'mj_upscale', 'mj_describe', - 'mj_uploads' + 'mj_uploads', ]; break; case 5: @@ -137,14 +140,11 @@ const EditChannel = (props) => { 'mj_high_variation', 'mj_low_variation', 'mj_pan', - 'mj_uploads' + 'mj_uploads', ]; break; case 36: - localModels = [ - 'suno_music', - 'suno_lyrics' - ]; + localModels = ['suno_music', 'suno_lyrics']; break; default: localModels = getChannelModels(value); @@ -180,7 +180,7 @@ const EditChannel = (props) => { data.model_mapping = JSON.stringify( JSON.parse(data.model_mapping), null, - 2 + 2, ); } setInputs(data); @@ -197,7 +197,6 @@ const EditChannel = (props) => { setLoading(false); }; - const fetchUpstreamModelList = async (name) => { // if (inputs['type'] !== 1) { // showError(t('仅支持 OpenAI 接口格式')); @@ -225,9 +224,9 @@ const EditChannel = (props) => { const res = await API.post('/api/channel/fetch_models', { base_url: inputs['base_url'], type: inputs['type'], - key: inputs['key'] + key: inputs['key'], }); - + if (res.data && res.data.success) { models.push(...res.data.data); } else { @@ -254,7 +253,7 @@ const EditChannel = (props) => { let res = await API.get(`/api/channel/models`); let localModelOptions = res.data.data.map((model) => ({ label: model.id, - value: model.id + value: model.id, })); setOriginModelOptions(localModelOptions); setFullModels(res.data.data.map((model) => model.id)); @@ -263,7 +262,7 @@ const EditChannel = (props) => { .filter((model) => { return model.id.startsWith('gpt-') || model.id.startsWith('text-'); }) - .map((model) => model.id) + .map((model) => model.id), ); } catch (error) { showError(error.message); @@ -279,8 +278,8 @@ const EditChannel = (props) => { setGroupOptions( res.data.data.map((group) => ({ label: group, - value: group - })) + value: group, + })), ); } catch (error) { showError(error.message); @@ -293,7 +292,7 @@ const EditChannel = (props) => { if (!localModelOptions.find((option) => option.label === model)) { localModelOptions.push({ label: model, - value: model + value: model, }); } }); @@ -330,7 +329,7 @@ const EditChannel = (props) => { if (localInputs.base_url && localInputs.base_url.endsWith('/')) { localInputs.base_url = localInputs.base_url.slice( 0, - localInputs.base_url.length - 1 + localInputs.base_url.length - 1, ); } if (localInputs.type === 18 && localInputs.other === '') { @@ -348,7 +347,7 @@ const EditChannel = (props) => { if (isEdit) { res = await API.put(`/api/channel/`, { ...localInputs, - id: parseInt(channelId) + id: parseInt(channelId), }); } else { res = await API.post(`/api/channel/`, localInputs); @@ -382,7 +381,7 @@ const EditChannel = (props) => { localModelOptions.push({ key: model, text: model, - value: model + value: model, }); } else if (model) { showError(t('某些模型已存在!')); @@ -397,14 +396,15 @@ const EditChannel = (props) => { handleInputChange('models', localModels); }; - return ( <> {isEdit ? t('更新渠道信息') : t('创建新的渠道')} + + {isEdit ? t('更新渠道信息') : t('创建新的渠道')} + } headerStyle={{ borderBottom: '1px solid var(--semi-color-border)' }} bodyStyle={{ borderBottom: '1px solid var(--semi-color-border)' }} @@ -412,11 +412,11 @@ const EditChannel = (props) => { footer={
-
{ handleInputChange('name', value); }} value={inputs.name} - autoComplete="new-password" + autoComplete='new-password' /> - {inputs.type !== 3 && inputs.type !== 8 && inputs.type !== 22 && inputs.type !== 36 && inputs.type !== 45 && ( - <> -
- {t('代理站地址')}: -
- - { - handleInputChange('base_url', value); - }} - value={inputs.base_url} - autoComplete="new-password" - /> - - - )} + {inputs.type !== 3 && + inputs.type !== 8 && + inputs.type !== 22 && + inputs.type !== 36 && + inputs.type !== 45 && ( + <> +
+ {t('代理站地址')}: +
+ + { + handleInputChange('base_url', value); + }} + value={inputs.base_url} + autoComplete='new-password' + /> + + + )}
{t('密钥')}:
{batch ? (