├── .eslintrc.cjs ├── .gitignore ├── README.md ├── index.html ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── public ├── icons │ ├── icon128.png │ ├── icon16.png │ ├── icon32.png │ └── icon48.png └── manifest.json ├── src ├── App.css ├── App.tsx ├── View.tsx ├── assets │ ├── animeskyline.jpeg │ └── realskyline.jpeg ├── contentScript.ts ├── index.css ├── main.tsx ├── utils.ts └── vite-env.d.ts ├── tailwind.config.js ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { browser: true, es2020: true }, 4 | extends: [ 5 | 'eslint:recommended', 6 | 'plugin:@typescript-eslint/recommended', 7 | 'plugin:react-hooks/recommended', 8 | ], 9 | ignorePatterns: ['dist', '.eslintrc.cjs'], 10 | parser: '@typescript-eslint/parser', 11 | plugins: ['react-refresh'], 12 | rules: { 13 | 'react-refresh/only-export-components': [ 14 | 'warn', 15 | { allowConstantExport: true }, 16 | ], 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | .env 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BrowserDiffusion 2 | 3 | BrowserDiffusion is a chrome extension that runs stable diffusion with LCM at near real-time on page images. 4 | 5 | [Demo Video](https://twitter.com/justoutquan/status/1760195318757654609) 6 | 7 | Built by [Justin](https://twitter.com/justoutquan) and [Michael](https://twitter.com/michaelbzhu) at [Mapo Labs](https://www.mapolabs.com/) 8 | 9 | ## Getting Started 10 | 11 | After cloning the repo, install dependencies. 12 | 13 | ``` 14 | pnpm install 15 | ``` 16 | 17 | This implementation uses Fal AI's serverless GPUs for generations to make it accessible to users without their own compute. 18 | Create a free account at [Fal AI](https://fal.ai/), which should start you with $10 in free credits. 19 | Go to Fal's [keys page](https://fal.ai/dashboard/keys) and create a new API key with the API scope. 20 | Copy the revealed key value to the `.env` file at root. 21 | 22 | ``` 23 | VITE_FAL_CREDENTIALS="insert_key_value_here" 24 | ``` 25 | 26 | Then run 27 | 28 | ``` 29 | pnpm run build 30 | ``` 31 | 32 | The build will be in `./dist`. 33 | 34 | To add it to your browser, open Google Chrome and click on the extensions puzzle icon on the top right > manage extension (Or navigate to [`chrome://extensions/`](chrome://extensions/)). 35 | 36 | Make sure Developer Mode is on (check toggle in top right corner). Click 'Load unpacked' and select the `./dist` folder in the project directory. 37 | 38 | The extension will now show up as a card on the screen and in your extensions bar to the right of the tab search bar! If you don't see it, you can click on the extensions puzzle icon, find BrowserDiffusion, and pin it. 39 | 40 | You're all set! Try visiting a site, typing a style, e.g. "((anime))", and it'll start to transform the site's images. 41 | 42 | Note: If you're using Fal, generation times may vary depending on their load. 43 | 44 | ## Making Changes 45 | 46 | While making changes to the code, on the Manage Extensions page, you can click the refresh icon on the card after making updates to ensure that its been reset. 47 | 48 | ## Current Limitations 49 | 50 | - Not all sites work. For example, it works on Instagram, but not Twitter at the moment, since Twitter uses an unusual pattern for images in its DOM. 51 | - It doesn't work on videos. 52 | - In this version, the extension popup must be open for conversions to take place. It is possible to do this by making the Fal requests in a background.ts file, but it's flakey because of Google's [manifest v3 updates](https://discourse.mozilla.org/t/impossible-to-upgrade-to-manifest-v3-for-extensions-that-require-constant-persistent-listeners/125942). 53 | - Your Fal key is exposed in the browser environment, which is okay for personal use, but bad practice for production. You should use a server proxy for sending Fal requests in production. 54 | - This example uses vanilla SD 1.5 without any fine-tuning or style Loras, so results aren't as good as more specialized models. 55 | 56 | ## Common Issues 57 | 58 | **I made changes to the code, but they're not reflecting.** 59 | 60 | If you've made changes to code and rebuilt with `pnpm run build` but the changes aren't reflecting, try clicking the refresh button in the extension card in 'Manage Extensions', and refreshing the page that you're testing the extension on. 61 | 62 | **It's not altering the images on the site** 63 | 64 | It can't convert on all sites. See [Current Limitations](#current-limitations) 65 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-starter", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "@fal-ai/serverless-client": "^0.8.5", 14 | "react": "^18.2.0", 15 | "react-dom": "^18.2.0", 16 | "tslib": "^2.6.2" 17 | }, 18 | "devDependencies": { 19 | "@types/react": "^18.2.56", 20 | "@types/react-dom": "^18.2.19", 21 | "@typescript-eslint/eslint-plugin": "^7.0.2", 22 | "@typescript-eslint/parser": "^7.0.2", 23 | "@vitejs/plugin-react-swc": "^3.5.0", 24 | "autoprefixer": "^10.4.17", 25 | "chrome-types": "^0.1.268", 26 | "eslint": "^8.56.0", 27 | "eslint-plugin-react-hooks": "^4.6.0", 28 | "eslint-plugin-react-refresh": "^0.4.5", 29 | "postcss": "^8.4.35", 30 | "tailwindcss": "^3.4.1", 31 | "typescript": "^5.2.2", 32 | "vite": "^5.1.4" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@fal-ai/serverless-client': 9 | specifier: ^0.8.5 10 | version: 0.8.5 11 | react: 12 | specifier: ^18.2.0 13 | version: 18.2.0 14 | react-dom: 15 | specifier: ^18.2.0 16 | version: 18.2.0(react@18.2.0) 17 | tslib: 18 | specifier: ^2.6.2 19 | version: 2.6.2 20 | 21 | devDependencies: 22 | '@types/react': 23 | specifier: ^18.2.56 24 | version: 18.2.57 25 | '@types/react-dom': 26 | specifier: ^18.2.19 27 | version: 18.2.19 28 | '@typescript-eslint/eslint-plugin': 29 | specifier: ^7.0.2 30 | version: 7.0.2(@typescript-eslint/parser@7.0.2)(eslint@8.56.0)(typescript@5.3.3) 31 | '@typescript-eslint/parser': 32 | specifier: ^7.0.2 33 | version: 7.0.2(eslint@8.56.0)(typescript@5.3.3) 34 | '@vitejs/plugin-react-swc': 35 | specifier: ^3.5.0 36 | version: 3.6.0(vite@5.1.4) 37 | autoprefixer: 38 | specifier: ^10.4.17 39 | version: 10.4.17(postcss@8.4.35) 40 | chrome-types: 41 | specifier: ^0.1.268 42 | version: 0.1.268 43 | eslint: 44 | specifier: ^8.56.0 45 | version: 8.56.0 46 | eslint-plugin-react-hooks: 47 | specifier: ^4.6.0 48 | version: 4.6.0(eslint@8.56.0) 49 | eslint-plugin-react-refresh: 50 | specifier: ^0.4.5 51 | version: 0.4.5(eslint@8.56.0) 52 | postcss: 53 | specifier: ^8.4.35 54 | version: 8.4.35 55 | tailwindcss: 56 | specifier: ^3.4.1 57 | version: 3.4.1 58 | typescript: 59 | specifier: ^5.2.2 60 | version: 5.3.3 61 | vite: 62 | specifier: ^5.1.4 63 | version: 5.1.4 64 | 65 | packages: 66 | 67 | /@aashutoshrathi/word-wrap@1.2.6: 68 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 69 | engines: {node: '>=0.10.0'} 70 | dev: true 71 | 72 | /@alloc/quick-lru@5.2.0: 73 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 74 | engines: {node: '>=10'} 75 | dev: true 76 | 77 | /@esbuild/aix-ppc64@0.19.12: 78 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} 79 | engines: {node: '>=12'} 80 | cpu: [ppc64] 81 | os: [aix] 82 | requiresBuild: true 83 | dev: true 84 | optional: true 85 | 86 | /@esbuild/android-arm64@0.19.12: 87 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} 88 | engines: {node: '>=12'} 89 | cpu: [arm64] 90 | os: [android] 91 | requiresBuild: true 92 | dev: true 93 | optional: true 94 | 95 | /@esbuild/android-arm@0.19.12: 96 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} 97 | engines: {node: '>=12'} 98 | cpu: [arm] 99 | os: [android] 100 | requiresBuild: true 101 | dev: true 102 | optional: true 103 | 104 | /@esbuild/android-x64@0.19.12: 105 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} 106 | engines: {node: '>=12'} 107 | cpu: [x64] 108 | os: [android] 109 | requiresBuild: true 110 | dev: true 111 | optional: true 112 | 113 | /@esbuild/darwin-arm64@0.19.12: 114 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} 115 | engines: {node: '>=12'} 116 | cpu: [arm64] 117 | os: [darwin] 118 | requiresBuild: true 119 | dev: true 120 | optional: true 121 | 122 | /@esbuild/darwin-x64@0.19.12: 123 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 124 | engines: {node: '>=12'} 125 | cpu: [x64] 126 | os: [darwin] 127 | requiresBuild: true 128 | dev: true 129 | optional: true 130 | 131 | /@esbuild/freebsd-arm64@0.19.12: 132 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} 133 | engines: {node: '>=12'} 134 | cpu: [arm64] 135 | os: [freebsd] 136 | requiresBuild: true 137 | dev: true 138 | optional: true 139 | 140 | /@esbuild/freebsd-x64@0.19.12: 141 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} 142 | engines: {node: '>=12'} 143 | cpu: [x64] 144 | os: [freebsd] 145 | requiresBuild: true 146 | dev: true 147 | optional: true 148 | 149 | /@esbuild/linux-arm64@0.19.12: 150 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 151 | engines: {node: '>=12'} 152 | cpu: [arm64] 153 | os: [linux] 154 | requiresBuild: true 155 | dev: true 156 | optional: true 157 | 158 | /@esbuild/linux-arm@0.19.12: 159 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} 160 | engines: {node: '>=12'} 161 | cpu: [arm] 162 | os: [linux] 163 | requiresBuild: true 164 | dev: true 165 | optional: true 166 | 167 | /@esbuild/linux-ia32@0.19.12: 168 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} 169 | engines: {node: '>=12'} 170 | cpu: [ia32] 171 | os: [linux] 172 | requiresBuild: true 173 | dev: true 174 | optional: true 175 | 176 | /@esbuild/linux-loong64@0.19.12: 177 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} 178 | engines: {node: '>=12'} 179 | cpu: [loong64] 180 | os: [linux] 181 | requiresBuild: true 182 | dev: true 183 | optional: true 184 | 185 | /@esbuild/linux-mips64el@0.19.12: 186 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} 187 | engines: {node: '>=12'} 188 | cpu: [mips64el] 189 | os: [linux] 190 | requiresBuild: true 191 | dev: true 192 | optional: true 193 | 194 | /@esbuild/linux-ppc64@0.19.12: 195 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} 196 | engines: {node: '>=12'} 197 | cpu: [ppc64] 198 | os: [linux] 199 | requiresBuild: true 200 | dev: true 201 | optional: true 202 | 203 | /@esbuild/linux-riscv64@0.19.12: 204 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} 205 | engines: {node: '>=12'} 206 | cpu: [riscv64] 207 | os: [linux] 208 | requiresBuild: true 209 | dev: true 210 | optional: true 211 | 212 | /@esbuild/linux-s390x@0.19.12: 213 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} 214 | engines: {node: '>=12'} 215 | cpu: [s390x] 216 | os: [linux] 217 | requiresBuild: true 218 | dev: true 219 | optional: true 220 | 221 | /@esbuild/linux-x64@0.19.12: 222 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 223 | engines: {node: '>=12'} 224 | cpu: [x64] 225 | os: [linux] 226 | requiresBuild: true 227 | dev: true 228 | optional: true 229 | 230 | /@esbuild/netbsd-x64@0.19.12: 231 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} 232 | engines: {node: '>=12'} 233 | cpu: [x64] 234 | os: [netbsd] 235 | requiresBuild: true 236 | dev: true 237 | optional: true 238 | 239 | /@esbuild/openbsd-x64@0.19.12: 240 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} 241 | engines: {node: '>=12'} 242 | cpu: [x64] 243 | os: [openbsd] 244 | requiresBuild: true 245 | dev: true 246 | optional: true 247 | 248 | /@esbuild/sunos-x64@0.19.12: 249 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} 250 | engines: {node: '>=12'} 251 | cpu: [x64] 252 | os: [sunos] 253 | requiresBuild: true 254 | dev: true 255 | optional: true 256 | 257 | /@esbuild/win32-arm64@0.19.12: 258 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 259 | engines: {node: '>=12'} 260 | cpu: [arm64] 261 | os: [win32] 262 | requiresBuild: true 263 | dev: true 264 | optional: true 265 | 266 | /@esbuild/win32-ia32@0.19.12: 267 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} 268 | engines: {node: '>=12'} 269 | cpu: [ia32] 270 | os: [win32] 271 | requiresBuild: true 272 | dev: true 273 | optional: true 274 | 275 | /@esbuild/win32-x64@0.19.12: 276 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} 277 | engines: {node: '>=12'} 278 | cpu: [x64] 279 | os: [win32] 280 | requiresBuild: true 281 | dev: true 282 | optional: true 283 | 284 | /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): 285 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 286 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 287 | peerDependencies: 288 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 289 | dependencies: 290 | eslint: 8.56.0 291 | eslint-visitor-keys: 3.4.3 292 | dev: true 293 | 294 | /@eslint-community/regexpp@4.10.0: 295 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 296 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 297 | dev: true 298 | 299 | /@eslint/eslintrc@2.1.4: 300 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 301 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 302 | dependencies: 303 | ajv: 6.12.6 304 | debug: 4.3.4 305 | espree: 9.6.1 306 | globals: 13.24.0 307 | ignore: 5.3.1 308 | import-fresh: 3.3.0 309 | js-yaml: 4.1.0 310 | minimatch: 3.1.2 311 | strip-json-comments: 3.1.1 312 | transitivePeerDependencies: 313 | - supports-color 314 | dev: true 315 | 316 | /@eslint/js@8.56.0: 317 | resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} 318 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 319 | dev: true 320 | 321 | /@fal-ai/serverless-client@0.8.5: 322 | resolution: {integrity: sha512-XnDqBTW1Vl8aFbpbL9K4J0Ezr7GIOGEz3UCU5D+faVk11tVQW1mLqZimiM4uriMqrka49he1ByJ7c7jVrqhdeQ==} 323 | engines: {node: '>=18.0.0'} 324 | dependencies: 325 | '@msgpack/msgpack': 3.0.0-beta2 326 | robot3: 0.4.1 327 | uuid-random: 1.3.2 328 | dev: false 329 | 330 | /@humanwhocodes/config-array@0.11.14: 331 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 332 | engines: {node: '>=10.10.0'} 333 | dependencies: 334 | '@humanwhocodes/object-schema': 2.0.2 335 | debug: 4.3.4 336 | minimatch: 3.1.2 337 | transitivePeerDependencies: 338 | - supports-color 339 | dev: true 340 | 341 | /@humanwhocodes/module-importer@1.0.1: 342 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 343 | engines: {node: '>=12.22'} 344 | dev: true 345 | 346 | /@humanwhocodes/object-schema@2.0.2: 347 | resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} 348 | dev: true 349 | 350 | /@isaacs/cliui@8.0.2: 351 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 352 | engines: {node: '>=12'} 353 | dependencies: 354 | string-width: 5.1.2 355 | string-width-cjs: /string-width@4.2.3 356 | strip-ansi: 7.1.0 357 | strip-ansi-cjs: /strip-ansi@6.0.1 358 | wrap-ansi: 8.1.0 359 | wrap-ansi-cjs: /wrap-ansi@7.0.0 360 | dev: true 361 | 362 | /@jridgewell/gen-mapping@0.3.3: 363 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 364 | engines: {node: '>=6.0.0'} 365 | dependencies: 366 | '@jridgewell/set-array': 1.1.2 367 | '@jridgewell/sourcemap-codec': 1.4.15 368 | '@jridgewell/trace-mapping': 0.3.22 369 | dev: true 370 | 371 | /@jridgewell/resolve-uri@3.1.2: 372 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 373 | engines: {node: '>=6.0.0'} 374 | dev: true 375 | 376 | /@jridgewell/set-array@1.1.2: 377 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 378 | engines: {node: '>=6.0.0'} 379 | dev: true 380 | 381 | /@jridgewell/sourcemap-codec@1.4.15: 382 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 383 | dev: true 384 | 385 | /@jridgewell/trace-mapping@0.3.22: 386 | resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} 387 | dependencies: 388 | '@jridgewell/resolve-uri': 3.1.2 389 | '@jridgewell/sourcemap-codec': 1.4.15 390 | dev: true 391 | 392 | /@msgpack/msgpack@3.0.0-beta2: 393 | resolution: {integrity: sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==} 394 | engines: {node: '>= 14'} 395 | dev: false 396 | 397 | /@nodelib/fs.scandir@2.1.5: 398 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 399 | engines: {node: '>= 8'} 400 | dependencies: 401 | '@nodelib/fs.stat': 2.0.5 402 | run-parallel: 1.2.0 403 | dev: true 404 | 405 | /@nodelib/fs.stat@2.0.5: 406 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 407 | engines: {node: '>= 8'} 408 | dev: true 409 | 410 | /@nodelib/fs.walk@1.2.8: 411 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 412 | engines: {node: '>= 8'} 413 | dependencies: 414 | '@nodelib/fs.scandir': 2.1.5 415 | fastq: 1.17.1 416 | dev: true 417 | 418 | /@pkgjs/parseargs@0.11.0: 419 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 420 | engines: {node: '>=14'} 421 | requiresBuild: true 422 | dev: true 423 | optional: true 424 | 425 | /@rollup/rollup-android-arm-eabi@4.12.0: 426 | resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} 427 | cpu: [arm] 428 | os: [android] 429 | requiresBuild: true 430 | dev: true 431 | optional: true 432 | 433 | /@rollup/rollup-android-arm64@4.12.0: 434 | resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} 435 | cpu: [arm64] 436 | os: [android] 437 | requiresBuild: true 438 | dev: true 439 | optional: true 440 | 441 | /@rollup/rollup-darwin-arm64@4.12.0: 442 | resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} 443 | cpu: [arm64] 444 | os: [darwin] 445 | requiresBuild: true 446 | dev: true 447 | optional: true 448 | 449 | /@rollup/rollup-darwin-x64@4.12.0: 450 | resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} 451 | cpu: [x64] 452 | os: [darwin] 453 | requiresBuild: true 454 | dev: true 455 | optional: true 456 | 457 | /@rollup/rollup-linux-arm-gnueabihf@4.12.0: 458 | resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} 459 | cpu: [arm] 460 | os: [linux] 461 | requiresBuild: true 462 | dev: true 463 | optional: true 464 | 465 | /@rollup/rollup-linux-arm64-gnu@4.12.0: 466 | resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} 467 | cpu: [arm64] 468 | os: [linux] 469 | requiresBuild: true 470 | dev: true 471 | optional: true 472 | 473 | /@rollup/rollup-linux-arm64-musl@4.12.0: 474 | resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} 475 | cpu: [arm64] 476 | os: [linux] 477 | requiresBuild: true 478 | dev: true 479 | optional: true 480 | 481 | /@rollup/rollup-linux-riscv64-gnu@4.12.0: 482 | resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} 483 | cpu: [riscv64] 484 | os: [linux] 485 | requiresBuild: true 486 | dev: true 487 | optional: true 488 | 489 | /@rollup/rollup-linux-x64-gnu@4.12.0: 490 | resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} 491 | cpu: [x64] 492 | os: [linux] 493 | requiresBuild: true 494 | dev: true 495 | optional: true 496 | 497 | /@rollup/rollup-linux-x64-musl@4.12.0: 498 | resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} 499 | cpu: [x64] 500 | os: [linux] 501 | requiresBuild: true 502 | dev: true 503 | optional: true 504 | 505 | /@rollup/rollup-win32-arm64-msvc@4.12.0: 506 | resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} 507 | cpu: [arm64] 508 | os: [win32] 509 | requiresBuild: true 510 | dev: true 511 | optional: true 512 | 513 | /@rollup/rollup-win32-ia32-msvc@4.12.0: 514 | resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} 515 | cpu: [ia32] 516 | os: [win32] 517 | requiresBuild: true 518 | dev: true 519 | optional: true 520 | 521 | /@rollup/rollup-win32-x64-msvc@4.12.0: 522 | resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} 523 | cpu: [x64] 524 | os: [win32] 525 | requiresBuild: true 526 | dev: true 527 | optional: true 528 | 529 | /@swc/core-darwin-arm64@1.4.2: 530 | resolution: {integrity: sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw==} 531 | engines: {node: '>=10'} 532 | cpu: [arm64] 533 | os: [darwin] 534 | requiresBuild: true 535 | dev: true 536 | optional: true 537 | 538 | /@swc/core-darwin-x64@1.4.2: 539 | resolution: {integrity: sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ==} 540 | engines: {node: '>=10'} 541 | cpu: [x64] 542 | os: [darwin] 543 | requiresBuild: true 544 | dev: true 545 | optional: true 546 | 547 | /@swc/core-linux-arm-gnueabihf@1.4.2: 548 | resolution: {integrity: sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ==} 549 | engines: {node: '>=10'} 550 | cpu: [arm] 551 | os: [linux] 552 | requiresBuild: true 553 | dev: true 554 | optional: true 555 | 556 | /@swc/core-linux-arm64-gnu@1.4.2: 557 | resolution: {integrity: sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA==} 558 | engines: {node: '>=10'} 559 | cpu: [arm64] 560 | os: [linux] 561 | requiresBuild: true 562 | dev: true 563 | optional: true 564 | 565 | /@swc/core-linux-arm64-musl@1.4.2: 566 | resolution: {integrity: sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw==} 567 | engines: {node: '>=10'} 568 | cpu: [arm64] 569 | os: [linux] 570 | requiresBuild: true 571 | dev: true 572 | optional: true 573 | 574 | /@swc/core-linux-x64-gnu@1.4.2: 575 | resolution: {integrity: sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg==} 576 | engines: {node: '>=10'} 577 | cpu: [x64] 578 | os: [linux] 579 | requiresBuild: true 580 | dev: true 581 | optional: true 582 | 583 | /@swc/core-linux-x64-musl@1.4.2: 584 | resolution: {integrity: sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ==} 585 | engines: {node: '>=10'} 586 | cpu: [x64] 587 | os: [linux] 588 | requiresBuild: true 589 | dev: true 590 | optional: true 591 | 592 | /@swc/core-win32-arm64-msvc@1.4.2: 593 | resolution: {integrity: sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ==} 594 | engines: {node: '>=10'} 595 | cpu: [arm64] 596 | os: [win32] 597 | requiresBuild: true 598 | dev: true 599 | optional: true 600 | 601 | /@swc/core-win32-ia32-msvc@1.4.2: 602 | resolution: {integrity: sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA==} 603 | engines: {node: '>=10'} 604 | cpu: [ia32] 605 | os: [win32] 606 | requiresBuild: true 607 | dev: true 608 | optional: true 609 | 610 | /@swc/core-win32-x64-msvc@1.4.2: 611 | resolution: {integrity: sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw==} 612 | engines: {node: '>=10'} 613 | cpu: [x64] 614 | os: [win32] 615 | requiresBuild: true 616 | dev: true 617 | optional: true 618 | 619 | /@swc/core@1.4.2: 620 | resolution: {integrity: sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg==} 621 | engines: {node: '>=10'} 622 | requiresBuild: true 623 | peerDependencies: 624 | '@swc/helpers': ^0.5.0 625 | peerDependenciesMeta: 626 | '@swc/helpers': 627 | optional: true 628 | dependencies: 629 | '@swc/counter': 0.1.3 630 | '@swc/types': 0.1.5 631 | optionalDependencies: 632 | '@swc/core-darwin-arm64': 1.4.2 633 | '@swc/core-darwin-x64': 1.4.2 634 | '@swc/core-linux-arm-gnueabihf': 1.4.2 635 | '@swc/core-linux-arm64-gnu': 1.4.2 636 | '@swc/core-linux-arm64-musl': 1.4.2 637 | '@swc/core-linux-x64-gnu': 1.4.2 638 | '@swc/core-linux-x64-musl': 1.4.2 639 | '@swc/core-win32-arm64-msvc': 1.4.2 640 | '@swc/core-win32-ia32-msvc': 1.4.2 641 | '@swc/core-win32-x64-msvc': 1.4.2 642 | dev: true 643 | 644 | /@swc/counter@0.1.3: 645 | resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} 646 | dev: true 647 | 648 | /@swc/types@0.1.5: 649 | resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} 650 | dev: true 651 | 652 | /@types/estree@1.0.5: 653 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 654 | dev: true 655 | 656 | /@types/json-schema@7.0.15: 657 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 658 | dev: true 659 | 660 | /@types/prop-types@15.7.11: 661 | resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} 662 | dev: true 663 | 664 | /@types/react-dom@18.2.19: 665 | resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==} 666 | dependencies: 667 | '@types/react': 18.2.57 668 | dev: true 669 | 670 | /@types/react@18.2.57: 671 | resolution: {integrity: sha512-ZvQsktJgSYrQiMirAN60y4O/LRevIV8hUzSOSNB6gfR3/o3wCBFQx3sPwIYtuDMeiVgsSS3UzCV26tEzgnfvQw==} 672 | dependencies: 673 | '@types/prop-types': 15.7.11 674 | '@types/scheduler': 0.16.8 675 | csstype: 3.1.3 676 | dev: true 677 | 678 | /@types/scheduler@0.16.8: 679 | resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} 680 | dev: true 681 | 682 | /@types/semver@7.5.7: 683 | resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} 684 | dev: true 685 | 686 | /@typescript-eslint/eslint-plugin@7.0.2(@typescript-eslint/parser@7.0.2)(eslint@8.56.0)(typescript@5.3.3): 687 | resolution: {integrity: sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==} 688 | engines: {node: ^16.0.0 || >=18.0.0} 689 | peerDependencies: 690 | '@typescript-eslint/parser': ^7.0.0 691 | eslint: ^8.56.0 692 | typescript: '*' 693 | peerDependenciesMeta: 694 | typescript: 695 | optional: true 696 | dependencies: 697 | '@eslint-community/regexpp': 4.10.0 698 | '@typescript-eslint/parser': 7.0.2(eslint@8.56.0)(typescript@5.3.3) 699 | '@typescript-eslint/scope-manager': 7.0.2 700 | '@typescript-eslint/type-utils': 7.0.2(eslint@8.56.0)(typescript@5.3.3) 701 | '@typescript-eslint/utils': 7.0.2(eslint@8.56.0)(typescript@5.3.3) 702 | '@typescript-eslint/visitor-keys': 7.0.2 703 | debug: 4.3.4 704 | eslint: 8.56.0 705 | graphemer: 1.4.0 706 | ignore: 5.3.1 707 | natural-compare: 1.4.0 708 | semver: 7.6.0 709 | ts-api-utils: 1.2.1(typescript@5.3.3) 710 | typescript: 5.3.3 711 | transitivePeerDependencies: 712 | - supports-color 713 | dev: true 714 | 715 | /@typescript-eslint/parser@7.0.2(eslint@8.56.0)(typescript@5.3.3): 716 | resolution: {integrity: sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==} 717 | engines: {node: ^16.0.0 || >=18.0.0} 718 | peerDependencies: 719 | eslint: ^8.56.0 720 | typescript: '*' 721 | peerDependenciesMeta: 722 | typescript: 723 | optional: true 724 | dependencies: 725 | '@typescript-eslint/scope-manager': 7.0.2 726 | '@typescript-eslint/types': 7.0.2 727 | '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3) 728 | '@typescript-eslint/visitor-keys': 7.0.2 729 | debug: 4.3.4 730 | eslint: 8.56.0 731 | typescript: 5.3.3 732 | transitivePeerDependencies: 733 | - supports-color 734 | dev: true 735 | 736 | /@typescript-eslint/scope-manager@7.0.2: 737 | resolution: {integrity: sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==} 738 | engines: {node: ^16.0.0 || >=18.0.0} 739 | dependencies: 740 | '@typescript-eslint/types': 7.0.2 741 | '@typescript-eslint/visitor-keys': 7.0.2 742 | dev: true 743 | 744 | /@typescript-eslint/type-utils@7.0.2(eslint@8.56.0)(typescript@5.3.3): 745 | resolution: {integrity: sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==} 746 | engines: {node: ^16.0.0 || >=18.0.0} 747 | peerDependencies: 748 | eslint: ^8.56.0 749 | typescript: '*' 750 | peerDependenciesMeta: 751 | typescript: 752 | optional: true 753 | dependencies: 754 | '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3) 755 | '@typescript-eslint/utils': 7.0.2(eslint@8.56.0)(typescript@5.3.3) 756 | debug: 4.3.4 757 | eslint: 8.56.0 758 | ts-api-utils: 1.2.1(typescript@5.3.3) 759 | typescript: 5.3.3 760 | transitivePeerDependencies: 761 | - supports-color 762 | dev: true 763 | 764 | /@typescript-eslint/types@7.0.2: 765 | resolution: {integrity: sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==} 766 | engines: {node: ^16.0.0 || >=18.0.0} 767 | dev: true 768 | 769 | /@typescript-eslint/typescript-estree@7.0.2(typescript@5.3.3): 770 | resolution: {integrity: sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==} 771 | engines: {node: ^16.0.0 || >=18.0.0} 772 | peerDependencies: 773 | typescript: '*' 774 | peerDependenciesMeta: 775 | typescript: 776 | optional: true 777 | dependencies: 778 | '@typescript-eslint/types': 7.0.2 779 | '@typescript-eslint/visitor-keys': 7.0.2 780 | debug: 4.3.4 781 | globby: 11.1.0 782 | is-glob: 4.0.3 783 | minimatch: 9.0.3 784 | semver: 7.6.0 785 | ts-api-utils: 1.2.1(typescript@5.3.3) 786 | typescript: 5.3.3 787 | transitivePeerDependencies: 788 | - supports-color 789 | dev: true 790 | 791 | /@typescript-eslint/utils@7.0.2(eslint@8.56.0)(typescript@5.3.3): 792 | resolution: {integrity: sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==} 793 | engines: {node: ^16.0.0 || >=18.0.0} 794 | peerDependencies: 795 | eslint: ^8.56.0 796 | dependencies: 797 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) 798 | '@types/json-schema': 7.0.15 799 | '@types/semver': 7.5.7 800 | '@typescript-eslint/scope-manager': 7.0.2 801 | '@typescript-eslint/types': 7.0.2 802 | '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3) 803 | eslint: 8.56.0 804 | semver: 7.6.0 805 | transitivePeerDependencies: 806 | - supports-color 807 | - typescript 808 | dev: true 809 | 810 | /@typescript-eslint/visitor-keys@7.0.2: 811 | resolution: {integrity: sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==} 812 | engines: {node: ^16.0.0 || >=18.0.0} 813 | dependencies: 814 | '@typescript-eslint/types': 7.0.2 815 | eslint-visitor-keys: 3.4.3 816 | dev: true 817 | 818 | /@ungap/structured-clone@1.2.0: 819 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 820 | dev: true 821 | 822 | /@vitejs/plugin-react-swc@3.6.0(vite@5.1.4): 823 | resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} 824 | peerDependencies: 825 | vite: ^4 || ^5 826 | dependencies: 827 | '@swc/core': 1.4.2 828 | vite: 5.1.4 829 | transitivePeerDependencies: 830 | - '@swc/helpers' 831 | dev: true 832 | 833 | /acorn-jsx@5.3.2(acorn@8.11.3): 834 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 835 | peerDependencies: 836 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 837 | dependencies: 838 | acorn: 8.11.3 839 | dev: true 840 | 841 | /acorn@8.11.3: 842 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 843 | engines: {node: '>=0.4.0'} 844 | hasBin: true 845 | dev: true 846 | 847 | /ajv@6.12.6: 848 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 849 | dependencies: 850 | fast-deep-equal: 3.1.3 851 | fast-json-stable-stringify: 2.1.0 852 | json-schema-traverse: 0.4.1 853 | uri-js: 4.4.1 854 | dev: true 855 | 856 | /ansi-regex@5.0.1: 857 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 858 | engines: {node: '>=8'} 859 | dev: true 860 | 861 | /ansi-regex@6.0.1: 862 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 863 | engines: {node: '>=12'} 864 | dev: true 865 | 866 | /ansi-styles@4.3.0: 867 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 868 | engines: {node: '>=8'} 869 | dependencies: 870 | color-convert: 2.0.1 871 | dev: true 872 | 873 | /ansi-styles@6.2.1: 874 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 875 | engines: {node: '>=12'} 876 | dev: true 877 | 878 | /any-promise@1.3.0: 879 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 880 | dev: true 881 | 882 | /anymatch@3.1.3: 883 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 884 | engines: {node: '>= 8'} 885 | dependencies: 886 | normalize-path: 3.0.0 887 | picomatch: 2.3.1 888 | dev: true 889 | 890 | /arg@5.0.2: 891 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 892 | dev: true 893 | 894 | /argparse@2.0.1: 895 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 896 | dev: true 897 | 898 | /array-union@2.1.0: 899 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 900 | engines: {node: '>=8'} 901 | dev: true 902 | 903 | /autoprefixer@10.4.17(postcss@8.4.35): 904 | resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} 905 | engines: {node: ^10 || ^12 || >=14} 906 | hasBin: true 907 | peerDependencies: 908 | postcss: ^8.1.0 909 | dependencies: 910 | browserslist: 4.23.0 911 | caniuse-lite: 1.0.30001589 912 | fraction.js: 4.3.7 913 | normalize-range: 0.1.2 914 | picocolors: 1.0.0 915 | postcss: 8.4.35 916 | postcss-value-parser: 4.2.0 917 | dev: true 918 | 919 | /balanced-match@1.0.2: 920 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 921 | dev: true 922 | 923 | /binary-extensions@2.2.0: 924 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 925 | engines: {node: '>=8'} 926 | dev: true 927 | 928 | /brace-expansion@1.1.11: 929 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 930 | dependencies: 931 | balanced-match: 1.0.2 932 | concat-map: 0.0.1 933 | dev: true 934 | 935 | /brace-expansion@2.0.1: 936 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 937 | dependencies: 938 | balanced-match: 1.0.2 939 | dev: true 940 | 941 | /braces@3.0.2: 942 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 943 | engines: {node: '>=8'} 944 | dependencies: 945 | fill-range: 7.0.1 946 | dev: true 947 | 948 | /browserslist@4.23.0: 949 | resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} 950 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 951 | hasBin: true 952 | dependencies: 953 | caniuse-lite: 1.0.30001589 954 | electron-to-chromium: 1.4.679 955 | node-releases: 2.0.14 956 | update-browserslist-db: 1.0.13(browserslist@4.23.0) 957 | dev: true 958 | 959 | /callsites@3.1.0: 960 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 961 | engines: {node: '>=6'} 962 | dev: true 963 | 964 | /camelcase-css@2.0.1: 965 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 966 | engines: {node: '>= 6'} 967 | dev: true 968 | 969 | /caniuse-lite@1.0.30001589: 970 | resolution: {integrity: sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==} 971 | dev: true 972 | 973 | /chalk@4.1.2: 974 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 975 | engines: {node: '>=10'} 976 | dependencies: 977 | ansi-styles: 4.3.0 978 | supports-color: 7.2.0 979 | dev: true 980 | 981 | /chokidar@3.6.0: 982 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 983 | engines: {node: '>= 8.10.0'} 984 | dependencies: 985 | anymatch: 3.1.3 986 | braces: 3.0.2 987 | glob-parent: 5.1.2 988 | is-binary-path: 2.1.0 989 | is-glob: 4.0.3 990 | normalize-path: 3.0.0 991 | readdirp: 3.6.0 992 | optionalDependencies: 993 | fsevents: 2.3.3 994 | dev: true 995 | 996 | /chrome-types@0.1.268: 997 | resolution: {integrity: sha512-F7qS80/sKB4D4U4WNuVrXxytRHjl7VU2ZHksMYx2WJ+LJl8XjbmucTlOSSiOw4cKzH+9sSQAIENbv84hH94LhA==} 998 | dev: true 999 | 1000 | /color-convert@2.0.1: 1001 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1002 | engines: {node: '>=7.0.0'} 1003 | dependencies: 1004 | color-name: 1.1.4 1005 | dev: true 1006 | 1007 | /color-name@1.1.4: 1008 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1009 | dev: true 1010 | 1011 | /commander@4.1.1: 1012 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 1013 | engines: {node: '>= 6'} 1014 | dev: true 1015 | 1016 | /concat-map@0.0.1: 1017 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1018 | dev: true 1019 | 1020 | /cross-spawn@7.0.3: 1021 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1022 | engines: {node: '>= 8'} 1023 | dependencies: 1024 | path-key: 3.1.1 1025 | shebang-command: 2.0.0 1026 | which: 2.0.2 1027 | dev: true 1028 | 1029 | /cssesc@3.0.0: 1030 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 1031 | engines: {node: '>=4'} 1032 | hasBin: true 1033 | dev: true 1034 | 1035 | /csstype@3.1.3: 1036 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 1037 | dev: true 1038 | 1039 | /debug@4.3.4: 1040 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1041 | engines: {node: '>=6.0'} 1042 | peerDependencies: 1043 | supports-color: '*' 1044 | peerDependenciesMeta: 1045 | supports-color: 1046 | optional: true 1047 | dependencies: 1048 | ms: 2.1.2 1049 | dev: true 1050 | 1051 | /deep-is@0.1.4: 1052 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1053 | dev: true 1054 | 1055 | /didyoumean@1.2.2: 1056 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 1057 | dev: true 1058 | 1059 | /dir-glob@3.0.1: 1060 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1061 | engines: {node: '>=8'} 1062 | dependencies: 1063 | path-type: 4.0.0 1064 | dev: true 1065 | 1066 | /dlv@1.1.3: 1067 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 1068 | dev: true 1069 | 1070 | /doctrine@3.0.0: 1071 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1072 | engines: {node: '>=6.0.0'} 1073 | dependencies: 1074 | esutils: 2.0.3 1075 | dev: true 1076 | 1077 | /eastasianwidth@0.2.0: 1078 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1079 | dev: true 1080 | 1081 | /electron-to-chromium@1.4.679: 1082 | resolution: {integrity: sha512-NhQMsz5k0d6m9z3qAxnsOR/ebal4NAGsrNVRwcDo4Kc/zQ7KdsTKZUxZoygHcVRb0QDW3waEDIcE3isZ79RP6g==} 1083 | dev: true 1084 | 1085 | /emoji-regex@8.0.0: 1086 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1087 | dev: true 1088 | 1089 | /emoji-regex@9.2.2: 1090 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1091 | dev: true 1092 | 1093 | /esbuild@0.19.12: 1094 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} 1095 | engines: {node: '>=12'} 1096 | hasBin: true 1097 | requiresBuild: true 1098 | optionalDependencies: 1099 | '@esbuild/aix-ppc64': 0.19.12 1100 | '@esbuild/android-arm': 0.19.12 1101 | '@esbuild/android-arm64': 0.19.12 1102 | '@esbuild/android-x64': 0.19.12 1103 | '@esbuild/darwin-arm64': 0.19.12 1104 | '@esbuild/darwin-x64': 0.19.12 1105 | '@esbuild/freebsd-arm64': 0.19.12 1106 | '@esbuild/freebsd-x64': 0.19.12 1107 | '@esbuild/linux-arm': 0.19.12 1108 | '@esbuild/linux-arm64': 0.19.12 1109 | '@esbuild/linux-ia32': 0.19.12 1110 | '@esbuild/linux-loong64': 0.19.12 1111 | '@esbuild/linux-mips64el': 0.19.12 1112 | '@esbuild/linux-ppc64': 0.19.12 1113 | '@esbuild/linux-riscv64': 0.19.12 1114 | '@esbuild/linux-s390x': 0.19.12 1115 | '@esbuild/linux-x64': 0.19.12 1116 | '@esbuild/netbsd-x64': 0.19.12 1117 | '@esbuild/openbsd-x64': 0.19.12 1118 | '@esbuild/sunos-x64': 0.19.12 1119 | '@esbuild/win32-arm64': 0.19.12 1120 | '@esbuild/win32-ia32': 0.19.12 1121 | '@esbuild/win32-x64': 0.19.12 1122 | dev: true 1123 | 1124 | /escalade@3.1.2: 1125 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 1126 | engines: {node: '>=6'} 1127 | dev: true 1128 | 1129 | /escape-string-regexp@4.0.0: 1130 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1131 | engines: {node: '>=10'} 1132 | dev: true 1133 | 1134 | /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0): 1135 | resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} 1136 | engines: {node: '>=10'} 1137 | peerDependencies: 1138 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 1139 | dependencies: 1140 | eslint: 8.56.0 1141 | dev: true 1142 | 1143 | /eslint-plugin-react-refresh@0.4.5(eslint@8.56.0): 1144 | resolution: {integrity: sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==} 1145 | peerDependencies: 1146 | eslint: '>=7' 1147 | dependencies: 1148 | eslint: 8.56.0 1149 | dev: true 1150 | 1151 | /eslint-scope@7.2.2: 1152 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 1153 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1154 | dependencies: 1155 | esrecurse: 4.3.0 1156 | estraverse: 5.3.0 1157 | dev: true 1158 | 1159 | /eslint-visitor-keys@3.4.3: 1160 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1161 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1162 | dev: true 1163 | 1164 | /eslint@8.56.0: 1165 | resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} 1166 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1167 | hasBin: true 1168 | dependencies: 1169 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) 1170 | '@eslint-community/regexpp': 4.10.0 1171 | '@eslint/eslintrc': 2.1.4 1172 | '@eslint/js': 8.56.0 1173 | '@humanwhocodes/config-array': 0.11.14 1174 | '@humanwhocodes/module-importer': 1.0.1 1175 | '@nodelib/fs.walk': 1.2.8 1176 | '@ungap/structured-clone': 1.2.0 1177 | ajv: 6.12.6 1178 | chalk: 4.1.2 1179 | cross-spawn: 7.0.3 1180 | debug: 4.3.4 1181 | doctrine: 3.0.0 1182 | escape-string-regexp: 4.0.0 1183 | eslint-scope: 7.2.2 1184 | eslint-visitor-keys: 3.4.3 1185 | espree: 9.6.1 1186 | esquery: 1.5.0 1187 | esutils: 2.0.3 1188 | fast-deep-equal: 3.1.3 1189 | file-entry-cache: 6.0.1 1190 | find-up: 5.0.0 1191 | glob-parent: 6.0.2 1192 | globals: 13.24.0 1193 | graphemer: 1.4.0 1194 | ignore: 5.3.1 1195 | imurmurhash: 0.1.4 1196 | is-glob: 4.0.3 1197 | is-path-inside: 3.0.3 1198 | js-yaml: 4.1.0 1199 | json-stable-stringify-without-jsonify: 1.0.1 1200 | levn: 0.4.1 1201 | lodash.merge: 4.6.2 1202 | minimatch: 3.1.2 1203 | natural-compare: 1.4.0 1204 | optionator: 0.9.3 1205 | strip-ansi: 6.0.1 1206 | text-table: 0.2.0 1207 | transitivePeerDependencies: 1208 | - supports-color 1209 | dev: true 1210 | 1211 | /espree@9.6.1: 1212 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 1213 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1214 | dependencies: 1215 | acorn: 8.11.3 1216 | acorn-jsx: 5.3.2(acorn@8.11.3) 1217 | eslint-visitor-keys: 3.4.3 1218 | dev: true 1219 | 1220 | /esquery@1.5.0: 1221 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 1222 | engines: {node: '>=0.10'} 1223 | dependencies: 1224 | estraverse: 5.3.0 1225 | dev: true 1226 | 1227 | /esrecurse@4.3.0: 1228 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1229 | engines: {node: '>=4.0'} 1230 | dependencies: 1231 | estraverse: 5.3.0 1232 | dev: true 1233 | 1234 | /estraverse@5.3.0: 1235 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1236 | engines: {node: '>=4.0'} 1237 | dev: true 1238 | 1239 | /esutils@2.0.3: 1240 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1241 | engines: {node: '>=0.10.0'} 1242 | dev: true 1243 | 1244 | /fast-deep-equal@3.1.3: 1245 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1246 | dev: true 1247 | 1248 | /fast-glob@3.3.2: 1249 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 1250 | engines: {node: '>=8.6.0'} 1251 | dependencies: 1252 | '@nodelib/fs.stat': 2.0.5 1253 | '@nodelib/fs.walk': 1.2.8 1254 | glob-parent: 5.1.2 1255 | merge2: 1.4.1 1256 | micromatch: 4.0.5 1257 | dev: true 1258 | 1259 | /fast-json-stable-stringify@2.1.0: 1260 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1261 | dev: true 1262 | 1263 | /fast-levenshtein@2.0.6: 1264 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1265 | dev: true 1266 | 1267 | /fastq@1.17.1: 1268 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 1269 | dependencies: 1270 | reusify: 1.0.4 1271 | dev: true 1272 | 1273 | /file-entry-cache@6.0.1: 1274 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1275 | engines: {node: ^10.12.0 || >=12.0.0} 1276 | dependencies: 1277 | flat-cache: 3.2.0 1278 | dev: true 1279 | 1280 | /fill-range@7.0.1: 1281 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1282 | engines: {node: '>=8'} 1283 | dependencies: 1284 | to-regex-range: 5.0.1 1285 | dev: true 1286 | 1287 | /find-up@5.0.0: 1288 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1289 | engines: {node: '>=10'} 1290 | dependencies: 1291 | locate-path: 6.0.0 1292 | path-exists: 4.0.0 1293 | dev: true 1294 | 1295 | /flat-cache@3.2.0: 1296 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 1297 | engines: {node: ^10.12.0 || >=12.0.0} 1298 | dependencies: 1299 | flatted: 3.3.1 1300 | keyv: 4.5.4 1301 | rimraf: 3.0.2 1302 | dev: true 1303 | 1304 | /flatted@3.3.1: 1305 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 1306 | dev: true 1307 | 1308 | /foreground-child@3.1.1: 1309 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 1310 | engines: {node: '>=14'} 1311 | dependencies: 1312 | cross-spawn: 7.0.3 1313 | signal-exit: 4.1.0 1314 | dev: true 1315 | 1316 | /fraction.js@4.3.7: 1317 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 1318 | dev: true 1319 | 1320 | /fs.realpath@1.0.0: 1321 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1322 | dev: true 1323 | 1324 | /fsevents@2.3.3: 1325 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1326 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1327 | os: [darwin] 1328 | requiresBuild: true 1329 | dev: true 1330 | optional: true 1331 | 1332 | /function-bind@1.1.2: 1333 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1334 | dev: true 1335 | 1336 | /glob-parent@5.1.2: 1337 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1338 | engines: {node: '>= 6'} 1339 | dependencies: 1340 | is-glob: 4.0.3 1341 | dev: true 1342 | 1343 | /glob-parent@6.0.2: 1344 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1345 | engines: {node: '>=10.13.0'} 1346 | dependencies: 1347 | is-glob: 4.0.3 1348 | dev: true 1349 | 1350 | /glob@10.3.10: 1351 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 1352 | engines: {node: '>=16 || 14 >=14.17'} 1353 | hasBin: true 1354 | dependencies: 1355 | foreground-child: 3.1.1 1356 | jackspeak: 2.3.6 1357 | minimatch: 9.0.3 1358 | minipass: 7.0.4 1359 | path-scurry: 1.10.1 1360 | dev: true 1361 | 1362 | /glob@7.2.3: 1363 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1364 | dependencies: 1365 | fs.realpath: 1.0.0 1366 | inflight: 1.0.6 1367 | inherits: 2.0.4 1368 | minimatch: 3.1.2 1369 | once: 1.4.0 1370 | path-is-absolute: 1.0.1 1371 | dev: true 1372 | 1373 | /globals@13.24.0: 1374 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 1375 | engines: {node: '>=8'} 1376 | dependencies: 1377 | type-fest: 0.20.2 1378 | dev: true 1379 | 1380 | /globby@11.1.0: 1381 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1382 | engines: {node: '>=10'} 1383 | dependencies: 1384 | array-union: 2.1.0 1385 | dir-glob: 3.0.1 1386 | fast-glob: 3.3.2 1387 | ignore: 5.3.1 1388 | merge2: 1.4.1 1389 | slash: 3.0.0 1390 | dev: true 1391 | 1392 | /graphemer@1.4.0: 1393 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1394 | dev: true 1395 | 1396 | /has-flag@4.0.0: 1397 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1398 | engines: {node: '>=8'} 1399 | dev: true 1400 | 1401 | /hasown@2.0.1: 1402 | resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} 1403 | engines: {node: '>= 0.4'} 1404 | dependencies: 1405 | function-bind: 1.1.2 1406 | dev: true 1407 | 1408 | /ignore@5.3.1: 1409 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 1410 | engines: {node: '>= 4'} 1411 | dev: true 1412 | 1413 | /import-fresh@3.3.0: 1414 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1415 | engines: {node: '>=6'} 1416 | dependencies: 1417 | parent-module: 1.0.1 1418 | resolve-from: 4.0.0 1419 | dev: true 1420 | 1421 | /imurmurhash@0.1.4: 1422 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1423 | engines: {node: '>=0.8.19'} 1424 | dev: true 1425 | 1426 | /inflight@1.0.6: 1427 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1428 | dependencies: 1429 | once: 1.4.0 1430 | wrappy: 1.0.2 1431 | dev: true 1432 | 1433 | /inherits@2.0.4: 1434 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1435 | dev: true 1436 | 1437 | /is-binary-path@2.1.0: 1438 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1439 | engines: {node: '>=8'} 1440 | dependencies: 1441 | binary-extensions: 2.2.0 1442 | dev: true 1443 | 1444 | /is-core-module@2.13.1: 1445 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1446 | dependencies: 1447 | hasown: 2.0.1 1448 | dev: true 1449 | 1450 | /is-extglob@2.1.1: 1451 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1452 | engines: {node: '>=0.10.0'} 1453 | dev: true 1454 | 1455 | /is-fullwidth-code-point@3.0.0: 1456 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1457 | engines: {node: '>=8'} 1458 | dev: true 1459 | 1460 | /is-glob@4.0.3: 1461 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1462 | engines: {node: '>=0.10.0'} 1463 | dependencies: 1464 | is-extglob: 2.1.1 1465 | dev: true 1466 | 1467 | /is-number@7.0.0: 1468 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1469 | engines: {node: '>=0.12.0'} 1470 | dev: true 1471 | 1472 | /is-path-inside@3.0.3: 1473 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1474 | engines: {node: '>=8'} 1475 | dev: true 1476 | 1477 | /isexe@2.0.0: 1478 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1479 | dev: true 1480 | 1481 | /jackspeak@2.3.6: 1482 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1483 | engines: {node: '>=14'} 1484 | dependencies: 1485 | '@isaacs/cliui': 8.0.2 1486 | optionalDependencies: 1487 | '@pkgjs/parseargs': 0.11.0 1488 | dev: true 1489 | 1490 | /jiti@1.21.0: 1491 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} 1492 | hasBin: true 1493 | dev: true 1494 | 1495 | /js-tokens@4.0.0: 1496 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1497 | dev: false 1498 | 1499 | /js-yaml@4.1.0: 1500 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1501 | hasBin: true 1502 | dependencies: 1503 | argparse: 2.0.1 1504 | dev: true 1505 | 1506 | /json-buffer@3.0.1: 1507 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1508 | dev: true 1509 | 1510 | /json-schema-traverse@0.4.1: 1511 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1512 | dev: true 1513 | 1514 | /json-stable-stringify-without-jsonify@1.0.1: 1515 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1516 | dev: true 1517 | 1518 | /keyv@4.5.4: 1519 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1520 | dependencies: 1521 | json-buffer: 3.0.1 1522 | dev: true 1523 | 1524 | /levn@0.4.1: 1525 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1526 | engines: {node: '>= 0.8.0'} 1527 | dependencies: 1528 | prelude-ls: 1.2.1 1529 | type-check: 0.4.0 1530 | dev: true 1531 | 1532 | /lilconfig@2.1.0: 1533 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1534 | engines: {node: '>=10'} 1535 | dev: true 1536 | 1537 | /lilconfig@3.1.1: 1538 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} 1539 | engines: {node: '>=14'} 1540 | dev: true 1541 | 1542 | /lines-and-columns@1.2.4: 1543 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1544 | dev: true 1545 | 1546 | /locate-path@6.0.0: 1547 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1548 | engines: {node: '>=10'} 1549 | dependencies: 1550 | p-locate: 5.0.0 1551 | dev: true 1552 | 1553 | /lodash.merge@4.6.2: 1554 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1555 | dev: true 1556 | 1557 | /loose-envify@1.4.0: 1558 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1559 | hasBin: true 1560 | dependencies: 1561 | js-tokens: 4.0.0 1562 | dev: false 1563 | 1564 | /lru-cache@10.2.0: 1565 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 1566 | engines: {node: 14 || >=16.14} 1567 | dev: true 1568 | 1569 | /lru-cache@6.0.0: 1570 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1571 | engines: {node: '>=10'} 1572 | dependencies: 1573 | yallist: 4.0.0 1574 | dev: true 1575 | 1576 | /merge2@1.4.1: 1577 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1578 | engines: {node: '>= 8'} 1579 | dev: true 1580 | 1581 | /micromatch@4.0.5: 1582 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1583 | engines: {node: '>=8.6'} 1584 | dependencies: 1585 | braces: 3.0.2 1586 | picomatch: 2.3.1 1587 | dev: true 1588 | 1589 | /minimatch@3.1.2: 1590 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1591 | dependencies: 1592 | brace-expansion: 1.1.11 1593 | dev: true 1594 | 1595 | /minimatch@9.0.3: 1596 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1597 | engines: {node: '>=16 || 14 >=14.17'} 1598 | dependencies: 1599 | brace-expansion: 2.0.1 1600 | dev: true 1601 | 1602 | /minipass@7.0.4: 1603 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1604 | engines: {node: '>=16 || 14 >=14.17'} 1605 | dev: true 1606 | 1607 | /ms@2.1.2: 1608 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1609 | dev: true 1610 | 1611 | /mz@2.7.0: 1612 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1613 | dependencies: 1614 | any-promise: 1.3.0 1615 | object-assign: 4.1.1 1616 | thenify-all: 1.6.0 1617 | dev: true 1618 | 1619 | /nanoid@3.3.7: 1620 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1621 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1622 | hasBin: true 1623 | dev: true 1624 | 1625 | /natural-compare@1.4.0: 1626 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1627 | dev: true 1628 | 1629 | /node-releases@2.0.14: 1630 | resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} 1631 | dev: true 1632 | 1633 | /normalize-path@3.0.0: 1634 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1635 | engines: {node: '>=0.10.0'} 1636 | dev: true 1637 | 1638 | /normalize-range@0.1.2: 1639 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1640 | engines: {node: '>=0.10.0'} 1641 | dev: true 1642 | 1643 | /object-assign@4.1.1: 1644 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1645 | engines: {node: '>=0.10.0'} 1646 | dev: true 1647 | 1648 | /object-hash@3.0.0: 1649 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1650 | engines: {node: '>= 6'} 1651 | dev: true 1652 | 1653 | /once@1.4.0: 1654 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1655 | dependencies: 1656 | wrappy: 1.0.2 1657 | dev: true 1658 | 1659 | /optionator@0.9.3: 1660 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 1661 | engines: {node: '>= 0.8.0'} 1662 | dependencies: 1663 | '@aashutoshrathi/word-wrap': 1.2.6 1664 | deep-is: 0.1.4 1665 | fast-levenshtein: 2.0.6 1666 | levn: 0.4.1 1667 | prelude-ls: 1.2.1 1668 | type-check: 0.4.0 1669 | dev: true 1670 | 1671 | /p-limit@3.1.0: 1672 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1673 | engines: {node: '>=10'} 1674 | dependencies: 1675 | yocto-queue: 0.1.0 1676 | dev: true 1677 | 1678 | /p-locate@5.0.0: 1679 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1680 | engines: {node: '>=10'} 1681 | dependencies: 1682 | p-limit: 3.1.0 1683 | dev: true 1684 | 1685 | /parent-module@1.0.1: 1686 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1687 | engines: {node: '>=6'} 1688 | dependencies: 1689 | callsites: 3.1.0 1690 | dev: true 1691 | 1692 | /path-exists@4.0.0: 1693 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1694 | engines: {node: '>=8'} 1695 | dev: true 1696 | 1697 | /path-is-absolute@1.0.1: 1698 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1699 | engines: {node: '>=0.10.0'} 1700 | dev: true 1701 | 1702 | /path-key@3.1.1: 1703 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1704 | engines: {node: '>=8'} 1705 | dev: true 1706 | 1707 | /path-parse@1.0.7: 1708 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1709 | dev: true 1710 | 1711 | /path-scurry@1.10.1: 1712 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 1713 | engines: {node: '>=16 || 14 >=14.17'} 1714 | dependencies: 1715 | lru-cache: 10.2.0 1716 | minipass: 7.0.4 1717 | dev: true 1718 | 1719 | /path-type@4.0.0: 1720 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1721 | engines: {node: '>=8'} 1722 | dev: true 1723 | 1724 | /picocolors@1.0.0: 1725 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1726 | dev: true 1727 | 1728 | /picomatch@2.3.1: 1729 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1730 | engines: {node: '>=8.6'} 1731 | dev: true 1732 | 1733 | /pify@2.3.0: 1734 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 1735 | engines: {node: '>=0.10.0'} 1736 | dev: true 1737 | 1738 | /pirates@4.0.6: 1739 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1740 | engines: {node: '>= 6'} 1741 | dev: true 1742 | 1743 | /postcss-import@15.1.0(postcss@8.4.35): 1744 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 1745 | engines: {node: '>=14.0.0'} 1746 | peerDependencies: 1747 | postcss: ^8.0.0 1748 | dependencies: 1749 | postcss: 8.4.35 1750 | postcss-value-parser: 4.2.0 1751 | read-cache: 1.0.0 1752 | resolve: 1.22.8 1753 | dev: true 1754 | 1755 | /postcss-js@4.0.1(postcss@8.4.35): 1756 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 1757 | engines: {node: ^12 || ^14 || >= 16} 1758 | peerDependencies: 1759 | postcss: ^8.4.21 1760 | dependencies: 1761 | camelcase-css: 2.0.1 1762 | postcss: 8.4.35 1763 | dev: true 1764 | 1765 | /postcss-load-config@4.0.2(postcss@8.4.35): 1766 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 1767 | engines: {node: '>= 14'} 1768 | peerDependencies: 1769 | postcss: '>=8.0.9' 1770 | ts-node: '>=9.0.0' 1771 | peerDependenciesMeta: 1772 | postcss: 1773 | optional: true 1774 | ts-node: 1775 | optional: true 1776 | dependencies: 1777 | lilconfig: 3.1.1 1778 | postcss: 8.4.35 1779 | yaml: 2.3.4 1780 | dev: true 1781 | 1782 | /postcss-nested@6.0.1(postcss@8.4.35): 1783 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 1784 | engines: {node: '>=12.0'} 1785 | peerDependencies: 1786 | postcss: ^8.2.14 1787 | dependencies: 1788 | postcss: 8.4.35 1789 | postcss-selector-parser: 6.0.15 1790 | dev: true 1791 | 1792 | /postcss-selector-parser@6.0.15: 1793 | resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} 1794 | engines: {node: '>=4'} 1795 | dependencies: 1796 | cssesc: 3.0.0 1797 | util-deprecate: 1.0.2 1798 | dev: true 1799 | 1800 | /postcss-value-parser@4.2.0: 1801 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1802 | dev: true 1803 | 1804 | /postcss@8.4.35: 1805 | resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} 1806 | engines: {node: ^10 || ^12 || >=14} 1807 | dependencies: 1808 | nanoid: 3.3.7 1809 | picocolors: 1.0.0 1810 | source-map-js: 1.0.2 1811 | dev: true 1812 | 1813 | /prelude-ls@1.2.1: 1814 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1815 | engines: {node: '>= 0.8.0'} 1816 | dev: true 1817 | 1818 | /punycode@2.3.1: 1819 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1820 | engines: {node: '>=6'} 1821 | dev: true 1822 | 1823 | /queue-microtask@1.2.3: 1824 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1825 | dev: true 1826 | 1827 | /react-dom@18.2.0(react@18.2.0): 1828 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 1829 | peerDependencies: 1830 | react: ^18.2.0 1831 | dependencies: 1832 | loose-envify: 1.4.0 1833 | react: 18.2.0 1834 | scheduler: 0.23.0 1835 | dev: false 1836 | 1837 | /react@18.2.0: 1838 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 1839 | engines: {node: '>=0.10.0'} 1840 | dependencies: 1841 | loose-envify: 1.4.0 1842 | dev: false 1843 | 1844 | /read-cache@1.0.0: 1845 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 1846 | dependencies: 1847 | pify: 2.3.0 1848 | dev: true 1849 | 1850 | /readdirp@3.6.0: 1851 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1852 | engines: {node: '>=8.10.0'} 1853 | dependencies: 1854 | picomatch: 2.3.1 1855 | dev: true 1856 | 1857 | /resolve-from@4.0.0: 1858 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1859 | engines: {node: '>=4'} 1860 | dev: true 1861 | 1862 | /resolve@1.22.8: 1863 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1864 | hasBin: true 1865 | dependencies: 1866 | is-core-module: 2.13.1 1867 | path-parse: 1.0.7 1868 | supports-preserve-symlinks-flag: 1.0.0 1869 | dev: true 1870 | 1871 | /reusify@1.0.4: 1872 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1873 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1874 | dev: true 1875 | 1876 | /rimraf@3.0.2: 1877 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1878 | hasBin: true 1879 | dependencies: 1880 | glob: 7.2.3 1881 | dev: true 1882 | 1883 | /robot3@0.4.1: 1884 | resolution: {integrity: sha512-hzjy826lrxzx8eRgv80idkf8ua1JAepRc9Efdtj03N3KNJuznQCPlyCJ7gnUmDFwZCLQjxy567mQVKmdv2BsXQ==} 1885 | dev: false 1886 | 1887 | /rollup@4.12.0: 1888 | resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} 1889 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1890 | hasBin: true 1891 | dependencies: 1892 | '@types/estree': 1.0.5 1893 | optionalDependencies: 1894 | '@rollup/rollup-android-arm-eabi': 4.12.0 1895 | '@rollup/rollup-android-arm64': 4.12.0 1896 | '@rollup/rollup-darwin-arm64': 4.12.0 1897 | '@rollup/rollup-darwin-x64': 4.12.0 1898 | '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 1899 | '@rollup/rollup-linux-arm64-gnu': 4.12.0 1900 | '@rollup/rollup-linux-arm64-musl': 4.12.0 1901 | '@rollup/rollup-linux-riscv64-gnu': 4.12.0 1902 | '@rollup/rollup-linux-x64-gnu': 4.12.0 1903 | '@rollup/rollup-linux-x64-musl': 4.12.0 1904 | '@rollup/rollup-win32-arm64-msvc': 4.12.0 1905 | '@rollup/rollup-win32-ia32-msvc': 4.12.0 1906 | '@rollup/rollup-win32-x64-msvc': 4.12.0 1907 | fsevents: 2.3.3 1908 | dev: true 1909 | 1910 | /run-parallel@1.2.0: 1911 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1912 | dependencies: 1913 | queue-microtask: 1.2.3 1914 | dev: true 1915 | 1916 | /scheduler@0.23.0: 1917 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 1918 | dependencies: 1919 | loose-envify: 1.4.0 1920 | dev: false 1921 | 1922 | /semver@7.6.0: 1923 | resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} 1924 | engines: {node: '>=10'} 1925 | hasBin: true 1926 | dependencies: 1927 | lru-cache: 6.0.0 1928 | dev: true 1929 | 1930 | /shebang-command@2.0.0: 1931 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1932 | engines: {node: '>=8'} 1933 | dependencies: 1934 | shebang-regex: 3.0.0 1935 | dev: true 1936 | 1937 | /shebang-regex@3.0.0: 1938 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1939 | engines: {node: '>=8'} 1940 | dev: true 1941 | 1942 | /signal-exit@4.1.0: 1943 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1944 | engines: {node: '>=14'} 1945 | dev: true 1946 | 1947 | /slash@3.0.0: 1948 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1949 | engines: {node: '>=8'} 1950 | dev: true 1951 | 1952 | /source-map-js@1.0.2: 1953 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1954 | engines: {node: '>=0.10.0'} 1955 | dev: true 1956 | 1957 | /string-width@4.2.3: 1958 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1959 | engines: {node: '>=8'} 1960 | dependencies: 1961 | emoji-regex: 8.0.0 1962 | is-fullwidth-code-point: 3.0.0 1963 | strip-ansi: 6.0.1 1964 | dev: true 1965 | 1966 | /string-width@5.1.2: 1967 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1968 | engines: {node: '>=12'} 1969 | dependencies: 1970 | eastasianwidth: 0.2.0 1971 | emoji-regex: 9.2.2 1972 | strip-ansi: 7.1.0 1973 | dev: true 1974 | 1975 | /strip-ansi@6.0.1: 1976 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1977 | engines: {node: '>=8'} 1978 | dependencies: 1979 | ansi-regex: 5.0.1 1980 | dev: true 1981 | 1982 | /strip-ansi@7.1.0: 1983 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1984 | engines: {node: '>=12'} 1985 | dependencies: 1986 | ansi-regex: 6.0.1 1987 | dev: true 1988 | 1989 | /strip-json-comments@3.1.1: 1990 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1991 | engines: {node: '>=8'} 1992 | dev: true 1993 | 1994 | /sucrase@3.35.0: 1995 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1996 | engines: {node: '>=16 || 14 >=14.17'} 1997 | hasBin: true 1998 | dependencies: 1999 | '@jridgewell/gen-mapping': 0.3.3 2000 | commander: 4.1.1 2001 | glob: 10.3.10 2002 | lines-and-columns: 1.2.4 2003 | mz: 2.7.0 2004 | pirates: 4.0.6 2005 | ts-interface-checker: 0.1.13 2006 | dev: true 2007 | 2008 | /supports-color@7.2.0: 2009 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2010 | engines: {node: '>=8'} 2011 | dependencies: 2012 | has-flag: 4.0.0 2013 | dev: true 2014 | 2015 | /supports-preserve-symlinks-flag@1.0.0: 2016 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2017 | engines: {node: '>= 0.4'} 2018 | dev: true 2019 | 2020 | /tailwindcss@3.4.1: 2021 | resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} 2022 | engines: {node: '>=14.0.0'} 2023 | hasBin: true 2024 | dependencies: 2025 | '@alloc/quick-lru': 5.2.0 2026 | arg: 5.0.2 2027 | chokidar: 3.6.0 2028 | didyoumean: 1.2.2 2029 | dlv: 1.1.3 2030 | fast-glob: 3.3.2 2031 | glob-parent: 6.0.2 2032 | is-glob: 4.0.3 2033 | jiti: 1.21.0 2034 | lilconfig: 2.1.0 2035 | micromatch: 4.0.5 2036 | normalize-path: 3.0.0 2037 | object-hash: 3.0.0 2038 | picocolors: 1.0.0 2039 | postcss: 8.4.35 2040 | postcss-import: 15.1.0(postcss@8.4.35) 2041 | postcss-js: 4.0.1(postcss@8.4.35) 2042 | postcss-load-config: 4.0.2(postcss@8.4.35) 2043 | postcss-nested: 6.0.1(postcss@8.4.35) 2044 | postcss-selector-parser: 6.0.15 2045 | resolve: 1.22.8 2046 | sucrase: 3.35.0 2047 | transitivePeerDependencies: 2048 | - ts-node 2049 | dev: true 2050 | 2051 | /text-table@0.2.0: 2052 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2053 | dev: true 2054 | 2055 | /thenify-all@1.6.0: 2056 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 2057 | engines: {node: '>=0.8'} 2058 | dependencies: 2059 | thenify: 3.3.1 2060 | dev: true 2061 | 2062 | /thenify@3.3.1: 2063 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2064 | dependencies: 2065 | any-promise: 1.3.0 2066 | dev: true 2067 | 2068 | /to-regex-range@5.0.1: 2069 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2070 | engines: {node: '>=8.0'} 2071 | dependencies: 2072 | is-number: 7.0.0 2073 | dev: true 2074 | 2075 | /ts-api-utils@1.2.1(typescript@5.3.3): 2076 | resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} 2077 | engines: {node: '>=16'} 2078 | peerDependencies: 2079 | typescript: '>=4.2.0' 2080 | dependencies: 2081 | typescript: 5.3.3 2082 | dev: true 2083 | 2084 | /ts-interface-checker@0.1.13: 2085 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 2086 | dev: true 2087 | 2088 | /tslib@2.6.2: 2089 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 2090 | dev: false 2091 | 2092 | /type-check@0.4.0: 2093 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2094 | engines: {node: '>= 0.8.0'} 2095 | dependencies: 2096 | prelude-ls: 1.2.1 2097 | dev: true 2098 | 2099 | /type-fest@0.20.2: 2100 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2101 | engines: {node: '>=10'} 2102 | dev: true 2103 | 2104 | /typescript@5.3.3: 2105 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 2106 | engines: {node: '>=14.17'} 2107 | hasBin: true 2108 | dev: true 2109 | 2110 | /update-browserslist-db@1.0.13(browserslist@4.23.0): 2111 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 2112 | hasBin: true 2113 | peerDependencies: 2114 | browserslist: '>= 4.21.0' 2115 | dependencies: 2116 | browserslist: 4.23.0 2117 | escalade: 3.1.2 2118 | picocolors: 1.0.0 2119 | dev: true 2120 | 2121 | /uri-js@4.4.1: 2122 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2123 | dependencies: 2124 | punycode: 2.3.1 2125 | dev: true 2126 | 2127 | /util-deprecate@1.0.2: 2128 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2129 | dev: true 2130 | 2131 | /uuid-random@1.3.2: 2132 | resolution: {integrity: sha512-UOzej0Le/UgkbWEO8flm+0y+G+ljUon1QWTEZOq1rnMAsxo2+SckbiZdKzAHHlVh6gJqI1TjC/xwgR50MuCrBQ==} 2133 | dev: false 2134 | 2135 | /vite@5.1.4: 2136 | resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==} 2137 | engines: {node: ^18.0.0 || >=20.0.0} 2138 | hasBin: true 2139 | peerDependencies: 2140 | '@types/node': ^18.0.0 || >=20.0.0 2141 | less: '*' 2142 | lightningcss: ^1.21.0 2143 | sass: '*' 2144 | stylus: '*' 2145 | sugarss: '*' 2146 | terser: ^5.4.0 2147 | peerDependenciesMeta: 2148 | '@types/node': 2149 | optional: true 2150 | less: 2151 | optional: true 2152 | lightningcss: 2153 | optional: true 2154 | sass: 2155 | optional: true 2156 | stylus: 2157 | optional: true 2158 | sugarss: 2159 | optional: true 2160 | terser: 2161 | optional: true 2162 | dependencies: 2163 | esbuild: 0.19.12 2164 | postcss: 8.4.35 2165 | rollup: 4.12.0 2166 | optionalDependencies: 2167 | fsevents: 2.3.3 2168 | dev: true 2169 | 2170 | /which@2.0.2: 2171 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2172 | engines: {node: '>= 8'} 2173 | hasBin: true 2174 | dependencies: 2175 | isexe: 2.0.0 2176 | dev: true 2177 | 2178 | /wrap-ansi@7.0.0: 2179 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2180 | engines: {node: '>=10'} 2181 | dependencies: 2182 | ansi-styles: 4.3.0 2183 | string-width: 4.2.3 2184 | strip-ansi: 6.0.1 2185 | dev: true 2186 | 2187 | /wrap-ansi@8.1.0: 2188 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2189 | engines: {node: '>=12'} 2190 | dependencies: 2191 | ansi-styles: 6.2.1 2192 | string-width: 5.1.2 2193 | strip-ansi: 7.1.0 2194 | dev: true 2195 | 2196 | /wrappy@1.0.2: 2197 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2198 | dev: true 2199 | 2200 | /yallist@4.0.0: 2201 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2202 | dev: true 2203 | 2204 | /yaml@2.3.4: 2205 | resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} 2206 | engines: {node: '>= 14'} 2207 | dev: true 2208 | 2209 | /yocto-queue@0.1.0: 2210 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2211 | engines: {node: '>=10'} 2212 | dev: true 2213 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/icons/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbzhu/browserdiffusion/5dd439a16d6c0608e79a8adeddbd3792e41cdb66/public/icons/icon128.png -------------------------------------------------------------------------------- /public/icons/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbzhu/browserdiffusion/5dd439a16d6c0608e79a8adeddbd3792e41cdb66/public/icons/icon16.png -------------------------------------------------------------------------------- /public/icons/icon32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbzhu/browserdiffusion/5dd439a16d6c0608e79a8adeddbd3792e41cdb66/public/icons/icon32.png -------------------------------------------------------------------------------- /public/icons/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbzhu/browserdiffusion/5dd439a16d6c0608e79a8adeddbd3792e41cdb66/public/icons/icon48.png -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Browser Diffusion", 4 | 5 | "version": "1.0.0", 6 | "description": "Browser Diffusion", 7 | "action": { 8 | "default_popup": "index.html", 9 | "default_title": "open" 10 | }, 11 | "icons": { 12 | "16": "icons/icon16.png", 13 | "32": "icons/icon32.png", 14 | "48": "icons/icon48.png", 15 | "128": "icons/icon128.png" 16 | }, 17 | "permissions": ["storage", "scripting", "tabs", "activeTab"], 18 | "content_scripts": [ 19 | { 20 | "matches": [""], 21 | "js": ["contentScript.bundle.js"] 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import "./App.css"; 2 | import * as fal from "@fal-ai/serverless-client"; 3 | import View from "./View"; 4 | import { withTabId } from "./utils"; 5 | 6 | function App() { 7 | // setup fal 8 | fal.config({ 9 | credentials: import.meta.env.VITE_FAL_CREDENTIALS, 10 | }); 11 | 12 | const connection = fal.realtime.connect("fal-ai/lcm", { 13 | onResult: (result) => { 14 | let newImageUrl = result.images[0].url; 15 | withTabId((tabId) => { 16 | // After receiving the new image URL, send a message to the content script to update the specific image 17 | chrome.tabs.sendMessage(tabId, { 18 | action: "updateSingleImage", 19 | originalUrl: result.request_id, 20 | newImageUrl: newImageUrl, 21 | }); 22 | }); 23 | }, 24 | onError: (error) => { 25 | console.error("uh oh fal individual image gen attempt failed for img "); 26 | console.error(error); 27 | }, 28 | }); 29 | 30 | const sendToFal = (img: any, user_prompt: string) => { 31 | const prompt = 32 | user_prompt.length > 0 33 | ? user_prompt 34 | : "((anime, masterpiece)), vibrant, high-contrast, high-quality, manga"; 35 | connection.send({ 36 | prompt, 37 | sync_mode: true, 38 | image_url: img.croppedb64Image, 39 | guidance_scale: 1.2, 40 | negative_prompt: 41 | "watercolor, dull, nsfw, (worst quality, low quality:1.3), (depth of field, blurry:1.2), (greyscale, monochrome:1.1), 3D face, nose, cropped, lowres, text, jpeg artifacts, signature, watermark, username, blurry, artist name, trademark, watermark, title, (tan, muscular, loli, petite, child, infant, toddlers, chibi, sd character:1.1), multiple view, Reference sheet,", 42 | num_inference_steps: 5, 43 | enable_safety_checks: false, 44 | num_images: 1, 45 | strength: 0.6, //the lower the value, the more true to the original image 46 | request_id: img.imageUrl, 47 | }); 48 | }; 49 | 50 | return ; 51 | } 52 | 53 | export default App; 54 | -------------------------------------------------------------------------------- /src/View.tsx: -------------------------------------------------------------------------------- 1 | import { FC, useEffect, useState } from "react"; 2 | import animeSkylinePhoto from "./assets/animeskyline.jpeg"; 3 | import realSkylinePhoto from "./assets/realskyline.jpeg"; 4 | import { withTabId } from "./utils"; 5 | 6 | type ViewProps = { 7 | sendToFal: (img: any, user_prompt: string) => void; 8 | }; 9 | 10 | const delay = (ms: number) => { 11 | return new Promise((resolve) => setTimeout(resolve, ms)); 12 | }; 13 | 14 | let didInit = false; 15 | 16 | const View: FC = ({ sendToFal }) => { 17 | const [isReplacing, setIsReplacing] = useState(false); 18 | const [prompt, setPrompt] = useState(""); 19 | 20 | useEffect(() => { 21 | if (didInit) return; 22 | didInit = true; 23 | 24 | withTabId(async (tabId) => { 25 | // get badge text 26 | const badgeText = await chrome.action.getBadgeText({ tabId }); 27 | if (badgeText === "ON") { 28 | setIsReplacing(true); 29 | } 30 | }); 31 | 32 | // setup listener for messages from contentscript 33 | chrome.runtime.onMessage.addListener((message: any) => { 34 | if (message.action === "processImages") { 35 | processImagesWithFAL(message.images); 36 | } 37 | return false; // return false since not responding to sender here 38 | }); 39 | }, []); 40 | 41 | const processImagesWithFAL = async (images: any[]) => { 42 | const user_prompt = window.sessionStorage.getItem("user_prompt") ?? ""; 43 | for (const imageObj of images) { 44 | // Delay in milliseconds. otherwise on load might send too many requests at once 45 | await delay(300); 46 | sendToFal(imageObj, user_prompt); 47 | } 48 | }; 49 | 50 | const toggleReplaceImages = () => { 51 | const newState = !isReplacing; 52 | setIsReplacing(newState); 53 | 54 | window.sessionStorage.setItem("user_prompt", prompt); 55 | withTabId((tabId) => { 56 | // update badge text 57 | chrome.action.setBadgeText({ 58 | text: newState ? "ON" : "OFF", 59 | tabId, 60 | }); 61 | 62 | chrome.action.setBadgeBackgroundColor({ 63 | color: newState ? "#90EE90" : "#D3D3D3", // Light green for "ON", light gray for "OFF" 64 | tabId: tabId, 65 | }); 66 | // send message to contentScript 67 | chrome.tabs.sendMessage(tabId, { replaceImages: newState }); 68 | }); 69 | }; 70 | 71 | return ( 72 |
82 |
86 | setPrompt(e.target.value)} 90 | className="bg-transparent h-10 px-4 w-[200px] text-sm focus:outline-none placeholder:text-slate-600" 91 | placeholder="Custom prompt" 92 | /> 93 |
94 | 116 |
117 | {isReplacing ? "AI" : "Reality"} 118 |
119 | {/* Skyline */} 123 |
124 | ); 125 | }; 126 | 127 | export default View; 128 | -------------------------------------------------------------------------------- /src/assets/animeskyline.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbzhu/browserdiffusion/5dd439a16d6c0608e79a8adeddbd3792e41cdb66/src/assets/animeskyline.jpeg -------------------------------------------------------------------------------- /src/assets/realskyline.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbzhu/browserdiffusion/5dd439a16d6c0608e79a8adeddbd3792e41cdb66/src/assets/realskyline.jpeg -------------------------------------------------------------------------------- /src/contentScript.ts: -------------------------------------------------------------------------------- 1 | // ---------- GLOBALS ---------- 2 | let isReplacingImages = false; 3 | var imagesStore = {} as any; 4 | var imageStartTimes = {} as any; 5 | const timeBeforeRetry = 3000; //min time in ms to wait before retrying generation for a given image 6 | 7 | // ---------- UTILS ---------- 8 | 9 | function findKeyByValue(obj: any, value: any) { 10 | return Object.keys(obj).find((key) => obj[key] === value); 11 | } 12 | 13 | /** 14 | * Extracts URLs from the given text. 15 | * @param {string} text - The text to search for URLs. 16 | * @returns {string[]|null} - An array of URLs found in the text, or null if no URLs are found. 17 | */ 18 | function extractUrls(text: string) { 19 | const urlPattern = /https?:\/\/[^\s]+/g; 20 | const urls = text.match(urlPattern); 21 | return urls ? urls : null; 22 | } 23 | 24 | /** 25 | * Sends image URLs to the background script 26 | * @param {Array} filteredImages - List of image URLs to be sent 27 | */ 28 | async function sendImageUrlsToApp(filteredImages: string[]) { 29 | try { 30 | // Convert image URLs to base64 and create image objects 31 | const imageObjects = await Promise.all( 32 | filteredImages.map(async (imageUrl) => { 33 | return { imageUrl, croppedb64Image: imageUrl }; 34 | }) 35 | ); 36 | // Send image objects to the background script 37 | chrome.runtime.sendMessage({ 38 | action: "processImages", 39 | images: imageObjects, 40 | }); 41 | } catch (error) { 42 | console.error("Error processing images:", error); 43 | } 44 | } 45 | 46 | /** 47 | * Check if the image should be processed based on various conditions. 48 | * 49 | * @param {HTMLImageElement} img - the image to be processed 50 | * @return {boolean} whether the image should be processed or not 51 | */ 52 | function shouldProcess(img: HTMLImageElement) { 53 | if ( 54 | (!imageStartTimes.hasOwnProperty(img.src) || 55 | imageStartTimes[img.src] + timeBeforeRetry < Date.now()) && 56 | !img.src.startsWith("data:image") && 57 | !img.alt.toLowerCase().includes("profile") && 58 | !img.src.toLowerCase().includes("video_thumb") && 59 | !img.src.toLowerCase().includes("icon") && 60 | !img.src.toLowerCase().includes("static-asset") && 61 | !(img.offsetWidth < 125 && img.offsetHeight < 125) 62 | ) { 63 | return true; 64 | } 65 | return false; 66 | } 67 | 68 | // ---------- LIFECYCLE ---------- 69 | 70 | /** 71 | * Scans the document for images and sends the URLs of new images to the background process for processing. 72 | */ 73 | const scanImages = () => { 74 | if (!isReplacingImages) { 75 | return; 76 | } 77 | 78 | const images = [...document.getElementsByTagName("img")]; 79 | let filteredImages = []; 80 | 81 | for (let img of images) { 82 | // Check if the image URL is not already stored and should be processed 83 | if (!imagesStore.hasOwnProperty(img.src) && shouldProcess(img)) { 84 | filteredImages.push(img.src); 85 | imageStartTimes[img.src] = Date.now(); 86 | } 87 | } 88 | 89 | if (filteredImages.length > 0) { 90 | sendImageUrlsToApp(filteredImages); 91 | } 92 | }; 93 | 94 | /** 95 | * Updates the images on the page based on the current state of the imagesStore. 96 | */ 97 | function updatePageImages() { 98 | // Update general images 99 | const images = [...document.getElementsByTagName("img")]; 100 | for (let img of images) { 101 | let currentUrl = img.src; 102 | if (!isReplacingImages) { 103 | // If replacing is toggled off, switch altered images back, while keeping generations in imagesStore 104 | let originalImage = findKeyByValue(imagesStore, currentUrl); 105 | img.src = originalImage === undefined ? currentUrl : originalImage; 106 | } else if ( 107 | imagesStore.hasOwnProperty(currentUrl) && 108 | img.src !== imagesStore[currentUrl] 109 | ) { 110 | img.src = imagesStore[currentUrl]; 111 | } 112 | } 113 | 114 | // In some sites like the nytimes, the source of truth is in the source tag, not the img tag 115 | const sources = [...document.getElementsByTagName("source")]; 116 | for (let source of sources) { 117 | if (!isReplacingImages) { 118 | let originalImage = findKeyByValue(imagesStore, source.srcset); 119 | source.srcset = 120 | originalImage === undefined ? source.srcset : originalImage; 121 | } else { 122 | let currentUrls = extractUrls(source.srcset) || source.srcset; 123 | if (currentUrls === null) continue; 124 | for (let currentUrl of currentUrls) { 125 | if ( 126 | imagesStore.hasOwnProperty(currentUrl) && 127 | source.srcset !== imagesStore[currentUrl] 128 | ) { 129 | source.srcset = imagesStore[currentUrl]; 130 | } 131 | } 132 | } 133 | } 134 | } 135 | 136 | /** 137 | * Function to observe DOM changes and replace images if new ones are added 138 | */ 139 | const observeDOM = () => { 140 | const observer = new MutationObserver((mutations) => { 141 | const hasAdditions = mutations.some( 142 | (mutation) => mutation.addedNodes.length > 0 143 | ); 144 | 145 | // If new nodes are added and the flag for replacing images is true, then scan for and update images 146 | if (hasAdditions && isReplacingImages) { 147 | scanImages(); 148 | updatePageImages(); 149 | } 150 | }); 151 | 152 | // Start observing changes to the entire body and its subtree 153 | observer.observe(document.body, { 154 | childList: true, 155 | subtree: true, 156 | }); 157 | }; 158 | 159 | // ---------- MAIN ---------- 160 | 161 | /** 162 | * Listens for messages from App.js and background.js and performs actions based on the message content. 163 | * - If the message action is "updateSingleImage", it updates a single image's URL in the imagesStore and triggers an update of page images. 164 | * - If the message contains "replaceImages", it toggles the state of image replacement, connects to the runtime for further instructions, scans for new images, updates page images, and sends a success response. 165 | */ 166 | chrome.runtime.onMessage.addListener((request: any) => { 167 | if ( 168 | request.hasOwnProperty("action") && 169 | request.action === "updateSingleImage" 170 | ) { 171 | imagesStore[request.originalUrl] = request.newImageUrl; 172 | updatePageImages(); 173 | } else if (request.hasOwnProperty("replaceImages")) { 174 | isReplacingImages = request.replaceImages; 175 | scanImages(); 176 | updatePageImages(); 177 | } 178 | return false; // return false since not responding to sender here 179 | }); 180 | 181 | observeDOM(); 182 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | display: flex; 4 | place-items: center; 5 | min-width: 250px; 6 | min-height: 250px; 7 | } 8 | 9 | #root { 10 | width: 100%; 11 | height: 100%; 12 | } 13 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import App from "./App.tsx"; 4 | import "./index.css"; 5 | 6 | ReactDOM.createRoot(document.getElementById("root")!).render( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | export const withTabId = (callback: (tabId: number) => void) => { 2 | chrome.tabs.query({ active: true, currentWindow: true }, async (tabs) => { 3 | const tabId = tabs[0].id; 4 | if (tabId) { 5 | callback(tabId); 6 | } else { 7 | console.error("No tabId found"); 8 | } 9 | }); 10 | }; 11 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], 4 | theme: { 5 | extend: {}, 6 | }, 7 | plugins: [], 8 | }; 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true, 22 | "types": ["chrome-types"] 23 | }, 24 | "include": ["src"], 25 | "references": [{ "path": "./tsconfig.node.json" }] 26 | } 27 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true, 8 | "strict": true 9 | }, 10 | "include": ["vite.config.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react-swc"; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | build: { 8 | rollupOptions: { 9 | input: { 10 | contentScript: "src/contentScript.ts", 11 | main: "index.html", 12 | }, 13 | output: { 14 | entryFileNames: (chunkInfo) => { 15 | // Use a custom name for the contentScript script bundle 16 | if (chunkInfo.name === "contentScript") { 17 | return "contentScript.bundle.js"; 18 | } 19 | // Default naming scheme for other assets 20 | return "assets/[name].[hash].js"; 21 | }, 22 | dir: "dist", // Output directory 23 | }, 24 | }, 25 | }, 26 | }); 27 | --------------------------------------------------------------------------------