From 2d98209ce139377d6d8138838e5cafbf85b1359b Mon Sep 17 00:00:00 2001 From: root Date: Sun, 11 Jan 2026 19:15:02 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82:=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=87=D0=B0=D1=8F=20=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=81=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9=20=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- -H | 0 ._.docker | Bin 0 -> 213 bytes .docker/._db | Bin 0 -> 213 bytes .docker/._logs | Bin 0 -> 213 bytes .docker/._nginx | Bin 0 -> 213 bytes .docker/._php | Bin 0 -> 213 bytes .docker/._phpmyadmin | Bin 0 -> 213 bytes .docker/._redis | Bin 0 -> 213 bytes .docker/db/._.gitignore | Bin 0 -> 213 bytes .docker/db/._my.cnf | Bin 0 -> 213 bytes .docker/db/._sql | Bin 0 -> 213 bytes .docker/db/.gitignore | 1 + .docker/db/my.cnf | 21 + .docker/db/sql/.gitignore | 2 + .docker/logs/.gitignore | 2 + .docker/nginx/._default.conf | Bin 0 -> 213 bytes .docker/nginx/._nginx.conf | Bin 0 -> 213 bytes .docker/nginx/default.conf | 28 + .docker/nginx/nginx.conf | 34 + .docker/php/._.bashrc | Bin 0 -> 213 bytes .docker/php/._Dockerfile | Bin 0 -> 213 bytes .docker/php/._docker.conf | Bin 0 -> 213 bytes .docker/php/._entrypoint.sh | Bin 0 -> 213 bytes .docker/php/._php.ini | Bin 0 -> 213 bytes .docker/php/.bashrc | 21 + .docker/php/Dockerfile | 66 + .docker/php/docker.conf | 12 + .docker/php/entrypoint.sh | 13 + .docker/php/php.ini | 7 + .docker/phpmyadmin/.gitignore | 2 + .docker/redis/.gitignore | 2 + .editorconfig | 18 + .env.example | 65 + .git-broken-backup/COMMIT_EDITMSG | 1 + .git-broken-backup/HEAD | 1 + .git-broken-backup/config | 15 + .git-broken-backup/description | 1 + .../hooks/applypatch-msg.sample | 15 + .git-broken-backup/hooks/commit-msg.sample | 24 + .git-broken-backup/hooks/post-update.sample | 8 + .../hooks/pre-applypatch.sample | 14 + .git-broken-backup/hooks/pre-commit.sample | 49 + .../hooks/pre-merge-commit.sample | 13 + .git-broken-backup/hooks/pre-push.sample | 53 + .git-broken-backup/hooks/pre-rebase.sample | 169 + .git-broken-backup/hooks/pre-receive.sample | 24 + .../hooks/prepare-commit-msg.sample | 42 + .../hooks/push-to-checkout.sample | 78 + .../hooks/sendemail-validate.sample | 77 + .git-broken-backup/hooks/update.sample | 128 + .git-broken-backup/index | Bin 0 -> 11453 bytes .git-broken-backup/info/exclude | 6 + .git-broken-backup/logs/HEAD | Bin 0 -> 861 bytes .git-broken-backup/logs/refs/heads/main | Bin 0 -> 677 bytes .../logs/refs/remotes/origin/HEAD | 1 + .../logs/refs/remotes/origin/main | Bin 0 -> 430 bytes .../00/443be20c8565bf802453d1022558e6672f3b82 | 0 .../0b/e5363336a10bad55e73a00bec02c70d605f901 | Bin 0 -> 846 bytes .../0e/56944759283fe8e95d558898fd49621f5338d0 | 0 .../11/fe7ddec9389461fa60a40cffd0e10337b5e2a9 | 1 + .../13/283d0c932bd42fe80ddd146e8fc47ffe25cd69 | 0 .../16/023bb557adce880dc79aedd9e153c6070c381c | 0 .../1a/724c4103fc41ce00170ffb609a090e8d1671ce | 0 .../2c/5b5a0187672b4bee0debe1c41673e5a7c5a675 | 0 .../2f/a3291ee57cfbbdcea4e97c4e50421691428c15 | Bin 0 -> 584 bytes .../30/4769fc73377219df5ff91181039ed896a735f6 | 0 .../31/5e0e917bb9fc180eba09d75fe8c0a211e24495 | Bin 0 -> 137 bytes .../31/b79d70c53a72bcbb190fcff7afbaf415f9e783 | Bin 0 -> 147 bytes .../3d/b6d164dc0213bf33f61c217c50b51dbb0f0743 | 0 .../46/09ce5d60d29999afd0d45dc825a1705ecb6f8b | 1 + .../52/049883d8521705a44cc26c2e79c723471b35ec | 0 .../56/44c0f4870f8e68249563b26e95d33527f76e20 | 0 .../5a/6e0a5434a09bff4ee573712ed318b07510c0f8 | Bin 0 -> 150 bytes .../70/35542d7482501a4405740daa6cd8edb4cbe53a | 0 .../78/49ccf1f83c372d029ba141062d880dcdbc6b55 | Bin 0 -> 157 bytes .../7b/2bf207439344d820ebd1344d70f8711aa6b4a6 | 0 .../88/446e3787f57c7f8fdd7438c92115a0179e7573 | 0 .../8d/c9a7660682fdc3bcdf3235aa14e08ee1c18c97 | Bin 0 -> 566 bytes .../8f/9a5bb88c87864d5a5590a8859c45ee4b5acec2 | Bin 0 -> 385 bytes .../a0/311d6d315fbd03af851ad3de4172e0d7f7424e | 0 .../ab/fce54a81c39678d12f8420c3c7acce30c80e86 | Bin 0 -> 352 bytes .../ac/060651ceda816fcdb346ad12c8e45acd413664 | 0 .../b5/c3762af786011c7582cf8c3daf96ac8a15779d | 0 .../bd/ebea53d2496d5ba86271ba6477ca995567268a | 0 .../c0/8b33adbc970da109b4474728ade1b91ae79e41 | 1 + .../cc/c68b34298ba43d7765d94586e45e5bc482cb19 | 0 .../d8/a87595045942e40a68a7af0cd6b81c89eaae7a | 0 .../da/439441fa6133c51c12bc41afa753689de03361 | 0 .../e0/78abd1cf32e411c65da94e12b754f73040559d | 0 .../f9/120153ea74d7e159cf14dcf2ed49432b366f6a | 0 .../fa/2b3f7e8225956a7bdbea9db4f12b08b1924bf6 | 0 ...bfc97e332039c351be5b284aa2827db03cab0a.idx | Bin 0 -> 4068 bytes ...fc97e332039c351be5b284aa2827db03cab0a.pack | Bin 0 -> 103873 bytes ...bfc97e332039c351be5b284aa2827db03cab0a.rev | Bin 0 -> 480 bytes .git-broken-backup/packed-refs | 2 + .git-broken-backup/refs/heads/main | 1 + .git-broken-backup/refs/remotes/origin/HEAD | 1 + .git-broken-backup/refs/remotes/origin/main | 1 + .gitattributes | 11 + .gitignore | 24 + Component::find(16)->componentType; | 38 + README.md | 61 + app/Http/Controllers/AiController.php | 54 + app/Http/Controllers/AuthController.php | 82 + app/Http/Controllers/ComponentsController.php | 213 + app/Http/Controllers/Controller.php | 8 + app/Http/Controllers/PCBuildsController.php | 246 + app/Http/Controllers/UsersController.php | 37 + app/Http/Kernel.php | 67 + app/Mail/RegisterUserMail.php | 59 + app/Models/AiTask.php | 58 + app/Models/Component.php | 34 + app/Models/ComponentType.php | 15 + app/Models/PCBuild.php | 55 + app/Models/PCBuildComponent.php | 35 + app/Models/User.php | 52 + app/Providers/AppServiceProvider.php | 24 + app/Services/AiSuggestorService.php | 400 + app/Services/BuildValidator.php | 83 + artisan | 18 + bootstrap/app.php | 40 + bootstrap/cache/.gitignore | 2 + bootstrap/providers.php | 5 + composer.json | 92 + composer.lock | 8721 +++++++++++++++++ config/app.php | 126 + config/auth.php | 115 + config/cache.php | 117 + config/cors.php | 34 + config/database.php | 183 + config/filesystems.php | 80 + config/logging.php | 132 + config/mail.php | 118 + config/queue.php | 125 + config/sanctum.php | 84 + config/services.php | 38 + config/session.php | 217 + database/.gitignore | 1 + database/factories/UserFactory.php | 48 + .../0001_01_01_000000_create_users_table.php | 56 + .../0001_01_01_000001_create_cache_table.php | 35 + .../0001_01_01_000002_create_jobs_table.php | 57 + ...29_154420_create_component_types_table.php | 34 + ...5_10_29_154421_create_components_table.php | 37 + ...170250_add_custom_field_to_users_table.php | 30 + ...12_create_personal_access_tokens_table.php | 33 + ...06_103303_create_component_types_table.php | 34 + ...26_01_06_122343_create_pc_builds_table.php | 26 + ...64803_create_pc_build_components_table.php | 30 + ...026_01_07_071225_create_ai_tasks_table.php | 86 + ...48_create_personal_access_tokens_table.php | 33 + ...28_create_personal_access_tokens_table.php | 33 + database/seeders/ComponentSeeder.php | 326 + database/seeders/DatabaseSeeder.php | 32 + docker-compose.yml | 135 + docker.tar.gz | Bin 0 -> 4140 bytes frontend/.gitignore | 24 + frontend/README.md | 16 + frontend/eslint.config.js | 29 + frontend/index.html | 13 + frontend/package-lock.json | 3255 ++++++ frontend/package.json | 29 + frontend/public/vite.svg | 1 + frontend/src/App.css | 42 + frontend/src/App.jsx | 26 + frontend/src/assets/react.svg | 1 + frontend/src/components/ComponentSelector.jsx | 74 + frontend/src/components/Layout.jsx | 27 + frontend/src/index.css | 68 + frontend/src/main.jsx | 10 + frontend/src/pages/Ai.jsx | 137 + frontend/src/pages/BuildNew.jsx | 185 + frontend/src/pages/Builds.jsx | 116 + frontend/src/pages/Login.jsx | 45 + frontend/src/pages/Register.jsx | 66 + frontend/vite.config.js | 7 + package-lock.json | 2226 +++++ package.json | 17 + phpunit.xml | 35 + project | 5 + public/.htaccess | 25 + public/favicon.ico | 0 public/index.php | 20 + public/robots.txt | 2 + resources/css/app.css | 11 + resources/js/app.js | 1 + resources/js/bootstrap.js | 4 + resources/views/emails/register.blade.php | 9 + resources/views/welcome.blade.php | 277 + routes/api.php | 61 + routes/console.php | 8 + routes/web.php | 7 + storage/app/.gitignore | 4 + storage/app/private/.gitignore | 2 + storage/app/public/.gitignore | 2 + storage/framework/.gitignore | 9 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + tests/Feature/ExampleTest.php | 19 + tests/TestCase.php | 10 + tests/Unit/ExampleTest.php | 16 + vite.config.js | 13 + 206 files changed, 20957 insertions(+) create mode 100644 -H create mode 100755 ._.docker create mode 100755 .docker/._db create mode 100755 .docker/._logs create mode 100755 .docker/._nginx create mode 100755 .docker/._php create mode 100755 .docker/._phpmyadmin create mode 100755 .docker/._redis create mode 100644 .docker/db/._.gitignore create mode 100644 .docker/db/._my.cnf create mode 100755 .docker/db/._sql create mode 100644 .docker/db/.gitignore create mode 100644 .docker/db/my.cnf create mode 100644 .docker/db/sql/.gitignore create mode 100644 .docker/logs/.gitignore create mode 100644 .docker/nginx/._default.conf create mode 100644 .docker/nginx/._nginx.conf create mode 100644 .docker/nginx/default.conf create mode 100644 .docker/nginx/nginx.conf create mode 100644 .docker/php/._.bashrc create mode 100644 .docker/php/._Dockerfile create mode 100644 .docker/php/._docker.conf create mode 100644 .docker/php/._entrypoint.sh create mode 100644 .docker/php/._php.ini create mode 100644 .docker/php/.bashrc create mode 100644 .docker/php/Dockerfile create mode 100644 .docker/php/docker.conf create mode 100644 .docker/php/entrypoint.sh create mode 100644 .docker/php/php.ini create mode 100644 .docker/phpmyadmin/.gitignore create mode 100644 .docker/redis/.gitignore create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .git-broken-backup/COMMIT_EDITMSG create mode 100644 .git-broken-backup/HEAD create mode 100644 .git-broken-backup/config create mode 100644 .git-broken-backup/description create mode 100755 .git-broken-backup/hooks/applypatch-msg.sample create mode 100755 .git-broken-backup/hooks/commit-msg.sample create mode 100755 .git-broken-backup/hooks/post-update.sample create mode 100755 .git-broken-backup/hooks/pre-applypatch.sample create mode 100755 .git-broken-backup/hooks/pre-commit.sample create mode 100755 .git-broken-backup/hooks/pre-merge-commit.sample create mode 100755 .git-broken-backup/hooks/pre-push.sample create mode 100755 .git-broken-backup/hooks/pre-rebase.sample create mode 100755 .git-broken-backup/hooks/pre-receive.sample create mode 100755 .git-broken-backup/hooks/prepare-commit-msg.sample create mode 100755 .git-broken-backup/hooks/push-to-checkout.sample create mode 100755 .git-broken-backup/hooks/sendemail-validate.sample create mode 100755 .git-broken-backup/hooks/update.sample create mode 100644 .git-broken-backup/index create mode 100644 .git-broken-backup/info/exclude create mode 100644 .git-broken-backup/logs/HEAD create mode 100644 .git-broken-backup/logs/refs/heads/main create mode 100644 .git-broken-backup/logs/refs/remotes/origin/HEAD create mode 100644 .git-broken-backup/logs/refs/remotes/origin/main create mode 100644 .git-broken-backup/objects/00/443be20c8565bf802453d1022558e6672f3b82 create mode 100644 .git-broken-backup/objects/0b/e5363336a10bad55e73a00bec02c70d605f901 create mode 100644 .git-broken-backup/objects/0e/56944759283fe8e95d558898fd49621f5338d0 create mode 100644 .git-broken-backup/objects/11/fe7ddec9389461fa60a40cffd0e10337b5e2a9 create mode 100644 .git-broken-backup/objects/13/283d0c932bd42fe80ddd146e8fc47ffe25cd69 create mode 100644 .git-broken-backup/objects/16/023bb557adce880dc79aedd9e153c6070c381c create mode 100644 .git-broken-backup/objects/1a/724c4103fc41ce00170ffb609a090e8d1671ce create mode 100644 .git-broken-backup/objects/2c/5b5a0187672b4bee0debe1c41673e5a7c5a675 create mode 100644 .git-broken-backup/objects/2f/a3291ee57cfbbdcea4e97c4e50421691428c15 create mode 100644 .git-broken-backup/objects/30/4769fc73377219df5ff91181039ed896a735f6 create mode 100644 .git-broken-backup/objects/31/5e0e917bb9fc180eba09d75fe8c0a211e24495 create mode 100644 .git-broken-backup/objects/31/b79d70c53a72bcbb190fcff7afbaf415f9e783 create mode 100644 .git-broken-backup/objects/3d/b6d164dc0213bf33f61c217c50b51dbb0f0743 create mode 100644 .git-broken-backup/objects/46/09ce5d60d29999afd0d45dc825a1705ecb6f8b create mode 100644 .git-broken-backup/objects/52/049883d8521705a44cc26c2e79c723471b35ec create mode 100644 .git-broken-backup/objects/56/44c0f4870f8e68249563b26e95d33527f76e20 create mode 100644 .git-broken-backup/objects/5a/6e0a5434a09bff4ee573712ed318b07510c0f8 create mode 100644 .git-broken-backup/objects/70/35542d7482501a4405740daa6cd8edb4cbe53a create mode 100644 .git-broken-backup/objects/78/49ccf1f83c372d029ba141062d880dcdbc6b55 create mode 100644 .git-broken-backup/objects/7b/2bf207439344d820ebd1344d70f8711aa6b4a6 create mode 100644 .git-broken-backup/objects/88/446e3787f57c7f8fdd7438c92115a0179e7573 create mode 100644 .git-broken-backup/objects/8d/c9a7660682fdc3bcdf3235aa14e08ee1c18c97 create mode 100644 .git-broken-backup/objects/8f/9a5bb88c87864d5a5590a8859c45ee4b5acec2 create mode 100644 .git-broken-backup/objects/a0/311d6d315fbd03af851ad3de4172e0d7f7424e create mode 100644 .git-broken-backup/objects/ab/fce54a81c39678d12f8420c3c7acce30c80e86 create mode 100644 .git-broken-backup/objects/ac/060651ceda816fcdb346ad12c8e45acd413664 create mode 100644 .git-broken-backup/objects/b5/c3762af786011c7582cf8c3daf96ac8a15779d create mode 100644 .git-broken-backup/objects/bd/ebea53d2496d5ba86271ba6477ca995567268a create mode 100644 .git-broken-backup/objects/c0/8b33adbc970da109b4474728ade1b91ae79e41 create mode 100644 .git-broken-backup/objects/cc/c68b34298ba43d7765d94586e45e5bc482cb19 create mode 100644 .git-broken-backup/objects/d8/a87595045942e40a68a7af0cd6b81c89eaae7a create mode 100644 .git-broken-backup/objects/da/439441fa6133c51c12bc41afa753689de03361 create mode 100644 .git-broken-backup/objects/e0/78abd1cf32e411c65da94e12b754f73040559d create mode 100644 .git-broken-backup/objects/f9/120153ea74d7e159cf14dcf2ed49432b366f6a create mode 100644 .git-broken-backup/objects/fa/2b3f7e8225956a7bdbea9db4f12b08b1924bf6 create mode 100644 .git-broken-backup/objects/pack/pack-e7bfc97e332039c351be5b284aa2827db03cab0a.idx create mode 100644 .git-broken-backup/objects/pack/pack-e7bfc97e332039c351be5b284aa2827db03cab0a.pack create mode 100644 .git-broken-backup/objects/pack/pack-e7bfc97e332039c351be5b284aa2827db03cab0a.rev create mode 100644 .git-broken-backup/packed-refs create mode 100644 .git-broken-backup/refs/heads/main create mode 100644 .git-broken-backup/refs/remotes/origin/HEAD create mode 100644 .git-broken-backup/refs/remotes/origin/main create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Component::find(16)->componentType; create mode 100644 README.md create mode 100644 app/Http/Controllers/AiController.php create mode 100644 app/Http/Controllers/AuthController.php create mode 100644 app/Http/Controllers/ComponentsController.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/PCBuildsController.php create mode 100644 app/Http/Controllers/UsersController.php create mode 100644 app/Http/Kernel.php create mode 100644 app/Mail/RegisterUserMail.php create mode 100644 app/Models/AiTask.php create mode 100644 app/Models/Component.php create mode 100644 app/Models/ComponentType.php create mode 100644 app/Models/PCBuild.php create mode 100644 app/Models/PCBuildComponent.php create mode 100644 app/Models/User.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/Services/AiSuggestorService.php create mode 100644 app/Services/BuildValidator.php create mode 100755 artisan create mode 100644 bootstrap/app.php create mode 100755 bootstrap/cache/.gitignore create mode 100644 bootstrap/providers.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/cache.php create mode 100644 config/cors.php create mode 100644 config/database.php create mode 100644 config/filesystems.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/queue.php create mode 100644 config/sanctum.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 database/.gitignore create mode 100644 database/factories/UserFactory.php create mode 100644 database/migrations/0001_01_01_000000_create_users_table.php create mode 100644 database/migrations/0001_01_01_000001_create_cache_table.php create mode 100644 database/migrations/0001_01_01_000002_create_jobs_table.php create mode 100644 database/migrations/2025_10_29_154420_create_component_types_table.php create mode 100644 database/migrations/2025_10_29_154421_create_components_table.php create mode 100644 database/migrations/2025_10_29_170250_add_custom_field_to_users_table.php create mode 100644 database/migrations/2025_10_29_172112_create_personal_access_tokens_table.php create mode 100644 database/migrations/2026_01_06_103303_create_component_types_table.php create mode 100644 database/migrations/2026_01_06_122343_create_pc_builds_table.php create mode 100644 database/migrations/2026_01_07_064803_create_pc_build_components_table.php create mode 100644 database/migrations/2026_01_07_071225_create_ai_tasks_table.php create mode 100644 database/migrations/2026_01_10_133548_create_personal_access_tokens_table.php create mode 100644 database/migrations/2026_01_11_103828_create_personal_access_tokens_table.php create mode 100644 database/seeders/ComponentSeeder.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 docker-compose.yml create mode 100644 docker.tar.gz create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/eslint.config.js create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/vite.svg create mode 100644 frontend/src/App.css create mode 100644 frontend/src/App.jsx create mode 100644 frontend/src/assets/react.svg create mode 100644 frontend/src/components/ComponentSelector.jsx create mode 100644 frontend/src/components/Layout.jsx create mode 100644 frontend/src/index.css create mode 100644 frontend/src/main.jsx create mode 100644 frontend/src/pages/Ai.jsx create mode 100644 frontend/src/pages/BuildNew.jsx create mode 100644 frontend/src/pages/Builds.jsx create mode 100644 frontend/src/pages/Login.jsx create mode 100644 frontend/src/pages/Register.jsx create mode 100644 frontend/vite.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 phpunit.xml create mode 100644 project create mode 100644 public/.htaccess create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 resources/css/app.css create mode 100644 resources/js/app.js create mode 100644 resources/js/bootstrap.js create mode 100644 resources/views/emails/register.blade.php create mode 100644 resources/views/welcome.blade.php create mode 100644 routes/api.php create mode 100644 routes/console.php create mode 100644 routes/web.php create mode 100755 storage/app/.gitignore create mode 100755 storage/app/private/.gitignore create mode 100755 storage/app/public/.gitignore create mode 100755 storage/framework/.gitignore create mode 100755 storage/framework/cache/.gitignore create mode 100755 storage/framework/cache/data/.gitignore create mode 100755 storage/framework/sessions/.gitignore create mode 100755 storage/framework/testing/.gitignore create mode 100755 storage/framework/views/.gitignore create mode 100755 storage/logs/.gitignore create mode 100644 tests/Feature/ExampleTest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/ExampleTest.php create mode 100644 vite.config.js diff --git a/-H b/-H new file mode 100644 index 0000000..e69de29 diff --git a/._.docker b/._.docker new file mode 100755 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/._db b/.docker/._db new file mode 100755 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/._logs b/.docker/._logs new file mode 100755 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/._nginx b/.docker/._nginx new file mode 100755 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/._php b/.docker/._php new file mode 100755 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/._phpmyadmin b/.docker/._phpmyadmin new file mode 100755 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/._redis b/.docker/._redis new file mode 100755 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/db/._.gitignore b/.docker/db/._.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/db/._my.cnf b/.docker/db/._my.cnf new file mode 100644 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/db/._sql b/.docker/db/._sql new file mode 100755 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/db/.gitignore b/.docker/db/.gitignore new file mode 100644 index 0000000..3af0ccb --- /dev/null +++ b/.docker/db/.gitignore @@ -0,0 +1 @@ +/data diff --git a/.docker/db/my.cnf b/.docker/db/my.cnf new file mode 100644 index 0000000..6f97e72 --- /dev/null +++ b/.docker/db/my.cnf @@ -0,0 +1,21 @@ +[mysqld] +character-set-server = utf8mb4 +collation-server = utf8mb4_bin + +default-authentication-plugin = mysql_native_password + +log-error = /var/log/mysql/mysql-error.log + +slow_query_log = 1 +slow_query_log_file = /var/log/mysql/mysql-slow.log +long_query_time = 5.0 +log_queries_not_using_indexes = 0 + +general_log = 1 +general_log_file = /var/log/mysql/mysql-query.log + +[mysql] +default-character-set = utf8mb4 + +[client] +default-character-set = utf8mb4 diff --git a/.docker/db/sql/.gitignore b/.docker/db/sql/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/.docker/db/sql/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/.docker/logs/.gitignore b/.docker/logs/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/.docker/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/.docker/nginx/._default.conf b/.docker/nginx/._default.conf new file mode 100644 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/nginx/._nginx.conf b/.docker/nginx/._nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/nginx/default.conf b/.docker/nginx/default.conf new file mode 100644 index 0000000..8576b7e --- /dev/null +++ b/.docker/nginx/default.conf @@ -0,0 +1,28 @@ +server { + listen 80; + index index.php index.html; + root /var/www/public; + + client_max_body_size 100M; # 413 Request Entity Too Large + + location / { + root /var/www/public; + index index.html index.php; + try_files $uri $uri/ /index.php?$query_string; + } + + location ~ \.php$ { + try_files $uri =404; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass php:9000; + fastcgi_read_timeout 3600; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + send_timeout 3600; + proxy_connect_timeout 3600; + proxy_read_timeout 3600; + proxy_send_timeout 3600; + } +} diff --git a/.docker/nginx/nginx.conf b/.docker/nginx/nginx.conf new file mode 100644 index 0000000..f13ff44 --- /dev/null +++ b/.docker/nginx/nginx.conf @@ -0,0 +1,34 @@ +user nginx; +worker_processes 1; + +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + server_tokens off; + chunked_transfer_encoding off; + + gzip on; + gzip_types application/json; + gzip_min_length 1000; + + include /etc/nginx/conf.d/*.conf; +} diff --git a/.docker/php/._.bashrc b/.docker/php/._.bashrc new file mode 100644 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/php/._Dockerfile b/.docker/php/._Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/php/._docker.conf b/.docker/php/._docker.conf new file mode 100644 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/php/._entrypoint.sh b/.docker/php/._entrypoint.sh new file mode 100644 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/php/._php.ini b/.docker/php/._php.ini new file mode 100644 index 0000000000000000000000000000000000000000..0e58213973cae2c7e2065019dc4c50f864cb22de GIT binary patch literal 213 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@nRqb@vj0g5x_AdBnYYuq+ zM2L$f=jZAr78K;9>J^qI7A5ADWagzZ6zUroSr}TISsI!onk6P#yJZ%orsY>yJ3E^j mS{j*J>bklbo9LRDIGgKQSeTpXx>>lHIGPz7SQxk(F#rItNgve! literal 0 HcmV?d00001 diff --git a/.docker/php/.bashrc b/.docker/php/.bashrc new file mode 100644 index 0000000..a594028 --- /dev/null +++ b/.docker/php/.bashrc @@ -0,0 +1,21 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. + +# Note: PS1 and umask are already set in /etc/profile. You should not +# need this unless you want different defaults for root. +PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ ' +umask 022 + +# You may uncomment the following lines if you want `ls' to be colorized: +export SHELL +export LS_OPTIONS='--color=auto' +eval $(dircolors ~/dircolors-solarized/dircolors.256dark) +alias ls='ls $LS_OPTIONS' +alias ll='ls $LS_OPTIONS -l' +alias l='ls $LS_OPTIONS -lA' + +# Some more alias to avoid making mistakes: +alias rm='rm -i' +alias cp='cp -i' +alias mv='mv -i' + +alias phpd='php -dzend_extension=xdebug.so -dxdebug.mode=debug -dxdebug.idekey=PHPSTORM -dxdebug.start_with_request=yes -dxdebug.client_host=host.docker.internal -dxdebug.client_port=9001' diff --git a/.docker/php/Dockerfile b/.docker/php/Dockerfile new file mode 100644 index 0000000..84ee648 --- /dev/null +++ b/.docker/php/Dockerfile @@ -0,0 +1,66 @@ +FROM php:8.4-fpm + +COPY php.ini /usr/local/etc/php/ +COPY docker.conf /usr/local/etc/php-fpm.d/docker.conf +COPY .bashrc /root/ + +# Copy the entrypoint script +COPY entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh + +# mix +RUN apt-get update \ + && apt-get install -y build-essential zlib1g-dev default-mysql-client curl gnupg procps vim git unzip libzip-dev libpq-dev \ + && docker-php-ext-install zip pdo_mysql pdo_pgsql pgsql + +# intl +RUN apt-get install -y libicu-dev \ + && docker-php-ext-configure intl \ + && docker-php-ext-install intl + +# gd +RUN apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \ +docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ && \ +docker-php-ext-install gd + +# redis +RUN pecl install redis && docker-php-ext-enable redis + +# pcov +RUN pecl install pcov && docker-php-ext-enable pcov + +# pcntl +RUN docker-php-ext-install pcntl + +# Xdebug +# RUN pecl install xdebug \ +# && docker-php-ext-enable xdebug \ +# && echo ";zend_extension=xdebug" > /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini + +# Node.js, NPM, Yarn +RUN curl -sL https://deb.nodesource.com/setup_22.x | bash - +RUN apt-get install -y nodejs +RUN npm install npm@latest -g +RUN npm install yarn -g + +# Composer +RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" +RUN php composer-setup.php +RUN php -r "unlink('composer-setup.php');" +RUN mv composer.phar /usr/local/bin/composer + +ENV COMPOSER_ALLOW_SUPERUSER 1 +ENV COMPOSER_HOME /composer +ENV PATH $PATH:/composer/vendor/bin +RUN composer config --global process-timeout 3600 +RUN composer global require "laravel/installer" + +WORKDIR /root +RUN git clone https://github.com/seebi/dircolors-solarized + +EXPOSE 5173 +WORKDIR /var/www + +#entrypoint +ENTRYPOINT ["entrypoint.sh"] +CMD ["php-fpm"] \ No newline at end of file diff --git a/.docker/php/docker.conf b/.docker/php/docker.conf new file mode 100644 index 0000000..f351ded --- /dev/null +++ b/.docker/php/docker.conf @@ -0,0 +1,12 @@ +[global] +error_log = /proc/self/fd/2 +;request_terminate_timeout = 1h + +[www] +; if we send this to /proc/self/fd/1, it never appears +access.log = /proc/self/fd/1 + +clear_env = no + +; Ensure worker stdout and stderr are sent to the main error log. +catch_workers_output = yes diff --git a/.docker/php/entrypoint.sh b/.docker/php/entrypoint.sh new file mode 100644 index 0000000..99b8f61 --- /dev/null +++ b/.docker/php/entrypoint.sh @@ -0,0 +1,13 @@ +#!/bin/sh +set -e + +# Set permissions for Laravel directories +chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache +chmod -R 775 /var/www/storage /var/www/bootstrap/cache + +# permissions for PHPMyAdmin +mkdir -p /sessions + +chmod 777 /sessions + +exec "$@" \ No newline at end of file diff --git a/.docker/php/php.ini b/.docker/php/php.ini new file mode 100644 index 0000000..5415acc --- /dev/null +++ b/.docker/php/php.ini @@ -0,0 +1,7 @@ +; Example + +; [Date] +; date.timezone = "Asia/Tokyo" + +; [mbstring] +; mbstring.language = Japanese diff --git a/.docker/phpmyadmin/.gitignore b/.docker/phpmyadmin/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/.docker/phpmyadmin/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/.docker/redis/.gitignore b/.docker/redis/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/.docker/redis/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..a186cd2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[compose.yaml] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..35db1dd --- /dev/null +++ b/.env.example @@ -0,0 +1,65 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +# APP_MAINTENANCE_STORE=database + +PHP_CLI_SERVER_WORKERS=4 + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=single +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=sqlite +# DB_HOST=127.0.0.1 +# DB_PORT=3306 +# DB_DATABASE=laravel +# DB_USERNAME=root +# DB_PASSWORD= + +SESSION_DRIVER=database +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null + +BROADCAST_CONNECTION=log +FILESYSTEM_DISK=local +QUEUE_CONNECTION=database + +CACHE_STORE=database +# CACHE_PREFIX= + +MEMCACHED_HOST=127.0.0.1 + +REDIS_CLIENT=phpredis +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=log +MAIL_SCHEME=null +MAIL_HOST=127.0.0.1 +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +VITE_APP_NAME="${APP_NAME}" diff --git a/.git-broken-backup/COMMIT_EDITMSG b/.git-broken-backup/COMMIT_EDITMSG new file mode 100644 index 0000000..21fc66e --- /dev/null +++ b/.git-broken-backup/COMMIT_EDITMSG @@ -0,0 +1 @@ +crud diff --git a/.git-broken-backup/HEAD b/.git-broken-backup/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/.git-broken-backup/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/.git-broken-backup/config b/.git-broken-backup/config new file mode 100644 index 0000000..fc48fd4 --- /dev/null +++ b/.git-broken-backup/config @@ -0,0 +1,15 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + url = https://git.kosipov.ru/dimon8/Intelligent-selection-of-complete-PC.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "main"] + remote = origin + vscode-merge-base = origin/master + merge = refs/heads/main +[user] + name = dimon8 + email = dimon8@example.com diff --git a/.git-broken-backup/description b/.git-broken-backup/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/.git-broken-backup/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/.git-broken-backup/hooks/applypatch-msg.sample b/.git-broken-backup/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/.git-broken-backup/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff --git a/.git-broken-backup/hooks/commit-msg.sample b/.git-broken-backup/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/.git-broken-backup/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/.git-broken-backup/hooks/post-update.sample b/.git-broken-backup/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/.git-broken-backup/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/.git-broken-backup/hooks/pre-applypatch.sample b/.git-broken-backup/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/.git-broken-backup/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/.git-broken-backup/hooks/pre-commit.sample b/.git-broken-backup/hooks/pre-commit.sample new file mode 100755 index 0000000..29ed5ee --- /dev/null +++ b/.git-broken-backup/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=$(git hash-object -t tree /dev/null) +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --type=bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff-index --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/.git-broken-backup/hooks/pre-merge-commit.sample b/.git-broken-backup/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/.git-broken-backup/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git merge" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message to +# stderr if it wants to stop the merge commit. +# +# To enable this hook, rename this file to "pre-merge-commit". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" +: diff --git a/.git-broken-backup/hooks/pre-push.sample b/.git-broken-backup/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/.git-broken-backup/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/.git-broken-backup/hooks/pre-rebase.sample b/.git-broken-backup/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/.git-broken-backup/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up to date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/.git-broken-backup/hooks/pre-receive.sample b/.git-broken-backup/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/.git-broken-backup/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to make use of push options. +# The example simply echoes all push options that start with 'echoback=' +# and rejects all pushes when the "reject" push option is used. +# +# To enable this hook, rename this file to "pre-receive". + +if test -n "$GIT_PUSH_OPTION_COUNT" +then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" + do + eval "value=\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: ${value#*=}" >&2 + ;; + reject) + exit 1 + esac + i=$((i + 1)) + done +fi diff --git a/.git-broken-backup/hooks/prepare-commit-msg.sample b/.git-broken-backup/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/.git-broken-backup/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first one removes the +# "# Please enter the commit message..." help message. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +COMMIT_MSG_FILE=$1 +COMMIT_SOURCE=$2 +SHA1=$3 + +/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" + +# case "$COMMIT_SOURCE,$SHA1" in +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; +# *) ;; +# esac + +# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" +# if test -z "$COMMIT_SOURCE" +# then +# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" +# fi diff --git a/.git-broken-backup/hooks/push-to-checkout.sample b/.git-broken-backup/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/.git-broken-backup/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/bin/sh + +# An example hook script to update a checked-out tree on a git push. +# +# This hook is invoked by git-receive-pack(1) when it reacts to git +# push and updates reference(s) in its repository, and when the push +# tries to update the branch that is currently checked out and the +# receive.denyCurrentBranch configuration variable is set to +# updateInstead. +# +# By default, such a push is refused if the working tree and the index +# of the remote repository has any difference from the currently +# checked out commit; when both the working tree and the index match +# the current commit, they are updated to match the newly pushed tip +# of the branch. This hook is to be used to override the default +# behaviour; however the code below reimplements the default behaviour +# as a starting point for convenient modification. +# +# The hook receives the commit with which the tip of the current +# branch is going to be updated: +commit=$1 + +# It can exit with a non-zero status to refuse the push (when it does +# so, it must not modify the index or the working tree). +die () { + echo >&2 "$*" + exit 1 +} + +# Or it can make any necessary changes to the working tree and to the +# index to bring them to the desired state when the tip of the current +# branch is updated to the new commit, and exit with a zero status. +# +# For example, the hook can simply run git read-tree -u -m HEAD "$1" +# in order to emulate git fetch that is run in the reverse direction +# with git push, as the two-tree form of git read-tree -u -m is +# essentially the same as git switch or git checkout that switches +# branches while keeping the local changes in the working tree that do +# not interfere with the difference between the branches. + +# The below is a more-or-less exact translation to shell of the C code +# for the default behaviour for git's push-to-checkout hook defined in +# the push_to_deploy() function in builtin/receive-pack.c. +# +# Note that the hook will be executed from the repository directory, +# not from the working tree, so if you want to perform operations on +# the working tree, you will have to adapt your code accordingly, e.g. +# by adding "cd .." or using relative paths. + +if ! git update-index -q --ignore-submodules --refresh +then + die "Up-to-date check failed" +fi + +if ! git diff-files --quiet --ignore-submodules -- +then + die "Working directory has unstaged changes" +fi + +# This is a rough translation of: +# +# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX +if git cat-file -e HEAD 2>/dev/null +then + head=HEAD +else + head=$(git hash-object -t tree --stdin &2 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/.git-broken-backup/hooks/update.sample b/.git-broken-backup/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/.git-broken-backup/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --type=bool hooks.allowunannotated) +allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) +denycreatebranch=$(git config --type=bool hooks.denycreatebranch) +allowdeletetag=$(git config --type=bool hooks.allowdeletetag) +allowmodifytag=$(git config --type=bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero=$(git hash-object --stdin &2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/.git-broken-backup/index b/.git-broken-backup/index new file mode 100644 index 0000000000000000000000000000000000000000..3a659df607001d56bede04ed5de1c42f0084d097 GIT binary patch literal 11453 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 LDI4`|n=Aeguk(if literal 0 HcmV?d00001 diff --git a/.git-broken-backup/info/exclude b/.git-broken-backup/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/.git-broken-backup/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/.git-broken-backup/logs/HEAD b/.git-broken-backup/logs/HEAD new file mode 100644 index 0000000000000000000000000000000000000000..0a4c691f3efd082ddcfa53ea3c70d66931d79195 GIT binary patch literal 861 zcmd6l&q~BF5XQZ_Pm#N{P0}`L%OavDZ@$9h-!_6wzVkyMX8NUpR}Y^F{-C&4Lj0~_6J<Rdmtm8h`8r5*!W2n*#>$Ip7E2tGY9p_T5t zR;ZEPUvA&pKnW-2R*GyX<(#LcIr&n*Qub$huh+L`_L0)iJg0&o_!Fj5WejMGr&N)v zEX8xcg4N4Yy{+Eu7Q1_JkE_iXm+ITq;|j?x6I(Gs#CcefooL zVe~j_Zu=IrG}ag~a%Y{>;0(A<^ln5wwCtK3J6!pQA8<*k-U7RRLaRY``sWiAqc0N^ Kvc0?cNB9Dkrl8OO literal 0 HcmV?d00001 diff --git a/.git-broken-backup/logs/refs/remotes/origin/HEAD b/.git-broken-backup/logs/refs/remotes/origin/HEAD new file mode 100644 index 0000000..da99d7f --- /dev/null +++ b/.git-broken-backup/logs/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 368ad0a220b129f628cccb5b06d21ae9c2a64f58 root 1767543169 +0000 clone: from https://git.kosipov.ru/dimon8/Intelligent-selection-of-complete-PC.git diff --git a/.git-broken-backup/logs/refs/remotes/origin/main b/.git-broken-backup/logs/refs/remotes/origin/main new file mode 100644 index 0000000000000000000000000000000000000000..abf4926491516a26bac591bc5a1895a3591a46d1 GIT binary patch literal 430 zcmd6h%?g7s5QKYepJML?Nuv1!DZa|?CPBe8QWfgkw^DlR!DEME=J`8{8_%UoOh!u}H; z-0v-5>e4ey5=%;oGLuS6Qi~b>Y?8IiO|6ft`?0NPe({ajT0|L!*Pb!7R^tZB-N%k z#cvbW#iXyBc0&wE%Fiz;E-6YZU|4u=X@cvkLfezS_uRMFUm)`_(5(~dlH~l{g8bst zBE78Q{5*!dds*&}-THquB!9C$b^39h^fH#c=n8Xy5yYU7y@5C6z2xNj0<#AgFK-m`nML!p*I5`iw%ae9@xIShi~s~&yXUbfGm@u_s$oX{U~7vu$qhf^n|ES>i|BaM|I@`6*@ z?h}DoGyb6}hNxT5yCtywVr;`?q3SnJlF!XiDSIjdQ{i*yXl2SR zxaVJIiyK4*Fol;CGkCiOR~~&AA+YKnZ(;ex8>tcx>(@ZNQkGegst1W@VCXPt{{AmJ0Vr6BsQoye#sB~S literal 0 HcmV?d00001 diff --git a/.git-broken-backup/objects/0e/56944759283fe8e95d558898fd49621f5338d0 b/.git-broken-backup/objects/0e/56944759283fe8e95d558898fd49621f5338d0 new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/11/fe7ddec9389461fa60a40cffd0e10337b5e2a9 b/.git-broken-backup/objects/11/fe7ddec9389461fa60a40cffd0e10337b5e2a9 new file mode 100644 index 0000000..c28daa5 --- /dev/null +++ b/.git-broken-backup/objects/11/fe7ddec9389461fa60a40cffd0e10337b5e2a9 @@ -0,0 +1 @@ +x}RjAzb(nPhZ\B\gӁٙa~ +_ WkM_a<[ ˙s9Py'No5A~D-긒v;}N c2.I-0I֒5;\ -8u KKJw }!8#,#^g-`Z,lR\VKi=A(]?e ϟJS9.s4^ahP.#%@,eF4rֱp,\_aٜ ^X ,W~9|$mU0,ę:J/D4ZO:\6sBVB)Tf)'S***,tx O ^%¢vdGALdFmh{-\5bobZ5s~`%To+)^57g: \ No newline at end of file diff --git a/.git-broken-backup/objects/13/283d0c932bd42fe80ddd146e8fc47ffe25cd69 b/.git-broken-backup/objects/13/283d0c932bd42fe80ddd146e8fc47ffe25cd69 new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/16/023bb557adce880dc79aedd9e153c6070c381c b/.git-broken-backup/objects/16/023bb557adce880dc79aedd9e153c6070c381c new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/1a/724c4103fc41ce00170ffb609a090e8d1671ce b/.git-broken-backup/objects/1a/724c4103fc41ce00170ffb609a090e8d1671ce new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/2c/5b5a0187672b4bee0debe1c41673e5a7c5a675 b/.git-broken-backup/objects/2c/5b5a0187672b4bee0debe1c41673e5a7c5a675 new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/2f/a3291ee57cfbbdcea4e97c4e50421691428c15 b/.git-broken-backup/objects/2f/a3291ee57cfbbdcea4e97c4e50421691428c15 new file mode 100644 index 0000000000000000000000000000000000000000..b103f3477650b20f1592185ddb592834e988c65a GIT binary patch literal 584 zcmV-O0=NBm0ew``$f7GR<50%Z#1=@Ssb)k{iotdu zU9@1@O`-I$$PcLCfLlNM3p0PzJ63V5+LjhVb7$_k=iGBgoiOgegNKhE-+S_m_qb)H zg2G7{rcuC%r0ph=q(cO4zYMwwkwMJF-DiF8>6X`{5osTXDdkDP zpNe*#P`9jv$~0lX=mmHo5d!F?q|6tvCSbj_0C?I70}swq<{46ua;J)60JE7tIi%}) z2}LE2?Zpv~8D;X7e8Z`*Yj@esnkd{yy&bJ`DK#x>bDXrqg zK2|wsq%3%yQslI%ccT^vgb-?`Kd6O%uYLh8muljI$I}{g%_|`hs43{tp_&}-tRjPm z3P~a^Hr4h~`TDq#_u0rp^cj{KBl|gGV(2FZrutf60n*9zyA3*XtcyZ3+%W9S(h-#U zxpk(U&12VHIk4>)$_<#HiF8iaG)&5A-g9``0DHT?XfryG-CFHq7wogz{`4J26alb< zr2t=1@yM8sMl8@_C77He@g{00IS%l9B=jmghAINB;kNsbbFHfUr literal 0 HcmV?d00001 diff --git a/.git-broken-backup/objects/31/b79d70c53a72bcbb190fcff7afbaf415f9e783 b/.git-broken-backup/objects/31/b79d70c53a72bcbb190fcff7afbaf415f9e783 new file mode 100644 index 0000000000000000000000000000000000000000..b18edde610287be499b560fb576645b5f3090fd2 GIT binary patch literal 147 zcmV;E0Brww0hNwH3d0}}MZ5MC?h9oc<7gn1US%97G*Dv*7JB>&Jwe~*!-Ee`TCH2R z2z2SEs)ek)C(6P>f zOw$^Y;dg(w)0VBaJ=x{A5B+dGUV4*O@76_%krGbPUSVK{9dTX%ycvhyd;u^@KL-TP BL(TvI literal 0 HcmV?d00001 diff --git a/.git-broken-backup/objects/3d/b6d164dc0213bf33f61c217c50b51dbb0f0743 b/.git-broken-backup/objects/3d/b6d164dc0213bf33f61c217c50b51dbb0f0743 new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/46/09ce5d60d29999afd0d45dc825a1705ecb6f8b b/.git-broken-backup/objects/46/09ce5d60d29999afd0d45dc825a1705ecb6f8b new file mode 100644 index 0000000..349578b --- /dev/null +++ b/.git-broken-backup/objects/46/09ce5d60d29999afd0d45dc825a1705ecb6f8b @@ -0,0 +1 @@ +xu1kAWL&  )yAv'x0;́"Bnxﵜ[&r`)|HsF%b.QF Hnd*r/9}{:pMsdF(onj-,`kJ)p@5ըMqa>ϺsgFSS3 \ No newline at end of file diff --git a/.git-broken-backup/objects/52/049883d8521705a44cc26c2e79c723471b35ec b/.git-broken-backup/objects/52/049883d8521705a44cc26c2e79c723471b35ec new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/56/44c0f4870f8e68249563b26e95d33527f76e20 b/.git-broken-backup/objects/56/44c0f4870f8e68249563b26e95d33527f76e20 new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/5a/6e0a5434a09bff4ee573712ed318b07510c0f8 b/.git-broken-backup/objects/5a/6e0a5434a09bff4ee573712ed318b07510c0f8 new file mode 100644 index 0000000000000000000000000000000000000000..8272deca5fec8fcf028b5ba09eb8fa0ca6000168 GIT binary patch literal 150 zcmV;H0BQet0V^p=O;s>7Gh{F{FfcPQQE<-BEy&MH%`4F>$S7bq&~3bS&vf2}oLk)8 zHP$}dDfN7wBf7$n%7Rp|VmHonu?d%E&Rl=tO6&>Mg#~e^^Shyn1Du^oGjmeF%2xk* z>eYC7TE#{E7KOvd*PJsr!Pf>=7FwKI1Xgolty0X)Grn!>`=s8_>}T5KeRf#_0Hk$9 E>+o1hQ~&?~ literal 0 HcmV?d00001 diff --git a/.git-broken-backup/objects/70/35542d7482501a4405740daa6cd8edb4cbe53a b/.git-broken-backup/objects/70/35542d7482501a4405740daa6cd8edb4cbe53a new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/78/49ccf1f83c372d029ba141062d880dcdbc6b55 b/.git-broken-backup/objects/78/49ccf1f83c372d029ba141062d880dcdbc6b55 new file mode 100644 index 0000000000000000000000000000000000000000..130f8d5aa83a87021a3d7ed5f588e5d28d009775 GIT binary patch literal 157 zcmV;O0Al}m0V^p=O;s>7F=a3`FfcPQQP4}zEXhpI%P&f0m@T=}X1?%sb5=w0)@21L? zoJ(eLc+4z|nZe;pJ}#K$N}Bbyx6}JHnPAR_&qRs3;L`r(d0J|%3OhVu2}{uo>kGXg zDA1OL1c~R62xbi6g+-YfSP=-`1VB%_*{oJ*!mCn(ogm~Zjt`bc?P}F!EO-K0DHERo zlsam3;Y{(gIN8 zJ1+nk-_maGZnjd3l@iDZkeiXp2#_=3(NfGUrE}zyQNw(L48iP zJNJ{=d~n}r{X+PJ?EkkSZi-wrNIHryM>H_SQss4`e<~h&ALGfbg*Rxy`|ncT@*It2 zxi*_UG+jzRtq2CycXJT%jDYaJh9Onw@*m@n7D^AY7Z==Ev(aFbQQbAuVA>0Q0hexZ E$_OIKCt? zDJNC0AfteR^>^&Nm9f%6)eD}pdzyt>y6m{jgu@I&m>J25$r-6gX6!u3wy#mc$E;;q zcF!}TzcZ%(eESTC8AdQOvhtIVo#7N$5b@{uA*OSmXLSDeR=@OHzOoN$gpq-fX}qC9 zypd(Rp{a?95yBbyxdr)osd**H2KAm?p2pVn_wb(kMy9Jo9`rpt*fSlALFPb14dN41 zQsR?Ki%arzArdY?DPk7&TX}*aB!ca4C%$Wf_ZES2{ z3=6Sjn0Mn#DhpDPP19ejDfhJI_ug|$Ue@>pIEhVk>Ji0anvs#Q3EZ@T#oaD!A+Y-&PU$`IHl5;G7;5jOT#2 z7DaBL%0~AQ_!AV=M^~WI(jv8(Lu<%5CmBcR!&Q|FO|kFNDa+&aA1FAi$2l6RnX*iZ zI?PN;SUN(1+Bwp8^$EeHMq6kBEjwmrV~`=2Vq`94`_dP8yVXZ_dR5OfntlR3lmtny͚.On 1<%Bc^6 ʔ?,_mjm%|Gho<<.i۰2°zAjw`,$lCnneL(FcNX>K9! ĝ:4za ?SO5R-p"x\i&w}< Wi}񮙎~{ \ No newline at end of file diff --git a/.git-broken-backup/objects/cc/c68b34298ba43d7765d94586e45e5bc482cb19 b/.git-broken-backup/objects/cc/c68b34298ba43d7765d94586e45e5bc482cb19 new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/d8/a87595045942e40a68a7af0cd6b81c89eaae7a b/.git-broken-backup/objects/d8/a87595045942e40a68a7af0cd6b81c89eaae7a new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/da/439441fa6133c51c12bc41afa753689de03361 b/.git-broken-backup/objects/da/439441fa6133c51c12bc41afa753689de03361 new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/e0/78abd1cf32e411c65da94e12b754f73040559d b/.git-broken-backup/objects/e0/78abd1cf32e411c65da94e12b754f73040559d new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/f9/120153ea74d7e159cf14dcf2ed49432b366f6a b/.git-broken-backup/objects/f9/120153ea74d7e159cf14dcf2ed49432b366f6a new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/fa/2b3f7e8225956a7bdbea9db4f12b08b1924bf6 b/.git-broken-backup/objects/fa/2b3f7e8225956a7bdbea9db4f12b08b1924bf6 new file mode 100644 index 0000000..e69de29 diff --git a/.git-broken-backup/objects/pack/pack-e7bfc97e332039c351be5b284aa2827db03cab0a.idx b/.git-broken-backup/objects/pack/pack-e7bfc97e332039c351be5b284aa2827db03cab0a.idx new file mode 100644 index 0000000000000000000000000000000000000000..1fec47cc9651ec32b26c5a92981790e3f5954dc9 GIT binary patch literal 4068 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 literal 0 HcmV?d00001 diff --git a/.git-broken-backup/objects/pack/pack-e7bfc97e332039c351be5b284aa2827db03cab0a.pack b/.git-broken-backup/objects/pack/pack-e7bfc97e332039c351be5b284aa2827db03cab0a.pack new file mode 100644 index 0000000000000000000000000000000000000000..6220edaf85f688b9a7642f82ca20553af7bc526f GIT binary patch literal 103873 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 literal 0 HcmV?d00001 diff --git a/.git-broken-backup/objects/pack/pack-e7bfc97e332039c351be5b284aa2827db03cab0a.rev b/.git-broken-backup/objects/pack/pack-e7bfc97e332039c351be5b284aa2827db03cab0a.rev new file mode 100644 index 0000000000000000000000000000000000000000..2cd345c87c2e9ccbb9aab8ee72c0c46a69eddd9d GIT binary patch literal 480 zcmXZY$1)uN00q#e*YK36QR3-D1kp+GqW4}BqD1=zBa8PBe!$komIVtdA7H_ZwY@KJ z-i$kQ=5Frl&X0vx1A#!yyKKEl0#ke-m#_2@-Imh9E-n0`ojv-gVu&DzOz@3GVkx7U zPX1ECI*p96%mF3L5@w!Ea%duj-xSiy2$ke9NQeQ7sbhwp{NNuoY!FWo(`2zg0ZDuz zk!0!_W{v1q<&3k%4%^HzNcomponentType; b/Component::find(16)->componentType; new file mode 100644 index 0000000..493b0f9 --- /dev/null +++ b/Component::find(16)->componentType; @@ -0,0 +1,38 @@ += Illuminate\Database\Eloquent\Collection {#1356 + all: [ + App\Models\Component {#6070 + id: 16, + name: "Samsung 980 PRO 1TB", + price: "10000.00", + component_type_id: 6, + specifications: "{"capacity": 1000, "interface": "NVMe PCIe 4.0 x4"}", + is_official: 1, + created_by_user_id: null, + created_at: null, + updated_at: null, + }, + App\Models\Component {#6072 + id: 17, + name: "Crucial P3 500GB NVMe", + price: "4000.00", + component_type_id: 6, + specifications: "{"capacity": 500, "interface": "NVMe PCIe 3.0 x4"}", + is_official: 1, + created_by_user_id: null, + created_at: null, + updated_at: null, + }, + App\Models\Component {#6073 + id: 18, + name: "WD Black SN850X 1TB", + price: "12000.00", + component_type_id: 6, + specifications: "{"capacity": 1000, "interface": "NVMe PCIe 4.0 x4"}", + is_official: 1, + created_by_user_id: null, + created_at: null, + updated_at: null, + }, + ], + } + diff --git a/README.md b/README.md new file mode 100644 index 0000000..75c347a --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +

Laravel Logo

+ +

+Build Status +Total Downloads +Latest Stable Version +License +

+ +## About Laravel + +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: + +- [Simple, fast routing engine](https://laravel.com/docs/routing). +- [Powerful dependency injection container](https://laravel.com/docs/container). +- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. +- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). +- Database agnostic [schema migrations](https://laravel.com/docs/migrations). +- [Robust background job processing](https://laravel.com/docs/queues). +- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). + +Laravel is accessible, powerful, and provides tools required for large, robust applications. + +## Learning Laravel + +Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. + +You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch. + +If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. + +## Laravel Sponsors + +We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com). + +### Premium Partners + +- **[Vehikl](https://vehikl.com)** +- **[Tighten Co.](https://tighten.co)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel)** +- **[DevSquad](https://devsquad.com/hire-laravel-developers)** +- **[Redberry](https://redberry.international/laravel-development)** +- **[Active Logic](https://activelogic.com)** + +## Contributing + +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). + +## Code of Conduct + +In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). + +## Security Vulnerabilities + +If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. + +## License + +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/app/Http/Controllers/AiController.php b/app/Http/Controllers/AiController.php new file mode 100644 index 0000000..4fdf64d --- /dev/null +++ b/app/Http/Controllers/AiController.php @@ -0,0 +1,54 @@ +aiService = $aiService; + } + + public function suggest(Request $request) + { + $validated = $request->validate([ + 'task_id' => 'nullable|string', + 'custom_prompt' => 'nullable|string', + 'budget' => 'nullable|numeric|min:0', + ]); + + try { + // ✅ Вызываем через DI + $result = $this->aiService->suggest( + $request->input('task_id'), + $request->input('custom_prompt'), + $request->input('budget') + ); + + // ✅ Возвращаем ТОЛЬКО ID — быстро и безопасно + return response()->json([ + 'message' => 'Сборка успешно сгенерирована ИИ.', + 'build_id' => $result['build']->id, + ], 201); + + } catch (\Exception $e) { + Log::error('Ошибка в AI-сервисе', [ + 'user_id' => auth()->id(), + 'message' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); + + return response()->json([ + 'message' => 'Не удалось сгенерировать сборку.', + 'error' => $e->getMessage() + ], 500); + } + } +} \ No newline at end of file diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php new file mode 100644 index 0000000..336df11 --- /dev/null +++ b/app/Http/Controllers/AuthController.php @@ -0,0 +1,82 @@ +validate([ + 'name' => 'required|string|max:255', + 'email' => 'required|string|email|max:255|unique:users', + 'password' => 'required|string|min:8|confirmed', +<<<<<<< HEAD + +======= + 'custom_field' => 'required|string|min:2' +>>>>>>> origin/main + ]); + + $user = User::create([ + 'name' => $validated['name'], + 'email' => $validated['email'], + 'password' => Hash::make($validated['password']), +<<<<<<< HEAD + 'custom_field' => $request->custom_field ?? 'user', // ← ключевая строка +======= + 'custom_field' => $validated['custom_field'], +>>>>>>> origin/main + ]); + + return response()->json([ + 'message' => 'Пользователь зарегистрирован.', + 'user' => $user, + 'token' => $user->createToken('auth_token')->plainTextToken + ], 201); + } + + /** + * Вход пользователя. + */ + public function login(Request $request) + { + $request->validate([ + 'email' => 'required|email', + 'password' => 'required', + ]); + + $user = User::where('email', $request->email)->first(); + + if (!$user || !Hash::check($request->password, $user->password)) { + throw ValidationException::withMessages([ + 'email' => ['Неверные учётные данные.'], + ]); + } + + return response()->json([ + 'message' => 'Успешный вход.', + 'user' => $user, + 'token' => $user->createToken('auth_token')->plainTextToken + ]); + } + + /** + * Выход (инвалидация токена). + */ + public function logout(Request $request) + { + $request->user()->currentAccessToken()->delete(); + + return response()->json([ + 'message' => 'Вы успешно вышли из системы.' + ]); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/ComponentsController.php b/app/Http/Controllers/ComponentsController.php new file mode 100644 index 0000000..7d3ea36 --- /dev/null +++ b/app/Http/Controllers/ComponentsController.php @@ -0,0 +1,213 @@ +where(function ($q) { + $q->where('is_official', true) + ->orWhere('created_by_user_id', auth()->id()); + }); + + // Если передан параметр type — фильтруем по code + if ($request->has('type')) { + $typeCode = $request->input('type'); + + // Убедимся, что такой тип существует + $type = \App\Models\ComponentType::where('code', $typeCode)->first(); + if (!$type) { + return response()->json([], 200); // пустой массив, если тип не найден + } + + // Фильтруем компоненты по component_type_id + $query->where('component_type_id', $type->id); + } + + $components = $query->get(); + + // Добавляем поле "type" для удобства фронта + $components = $components->map(function ($comp) { + $comp->type = $comp->componentType?->code ?? 'unknown'; + return $comp; + }); + + return response()->json($components); +} +======= +public function index() +{ + $components = Component::with('user', 'componentType') + ->where('is_official', true) + ->orWhere('created_by_user_id', auth()->id()) + ->get(); + + return response()->json($components); +} + + + +>>>>>>> origin/main + public function show($id) + { + $component = Component::find($id); + + if (!$component) { + return response()->json(['message' => 'Component not found'], 404); + } + + return response()->json($component); + } + +<<<<<<< HEAD + public function store(Request $request) + { + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'price' => 'required|numeric|min:0', + 'component_type_id' => 'required|exists:component_types,id', + 'specifications' => 'nullable|array', + ]); + + $component = Component::create([ + 'name' => $validated['name'], + 'price' => $validated['price'], + 'component_type_id' => $validated['component_type_id'], + 'specifications' => $validated['specifications'] ?? null, + 'is_official' => false, + 'created_by_user_id' => auth()->id(), + ]); + + return response()->json([ + 'message' => 'Компонент успешно создан.', + 'component' => $component + ], 201); + } + + public function update(Request $request, $id) + { + $component = Component::findOrFail($id); + + if ($component->created_by_user_id !== auth()->id() || $component->is_official) { + return response()->json([ + 'message' => 'Вы не можете редактировать этот компонент.' + ], 403); + } + + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'price' => 'required|numeric|min:0', + 'component_type_id' => 'required|exists:component_types,id', + 'specifications' => 'nullable|array', + ]); + + $component->update($validated); + + return response()->json([ + 'message' => 'Компонент обновлён.', + 'component' => $component + ]); + } + + public function destroy($id) + { + $component = Component::findOrFail($id); + + if ($component->created_by_user_id !== auth()->id() || $component->is_official) { + return response()->json([ + 'message' => 'Вы не можете удалить этот компонент.' + ], 403); + } + + $component->delete(); + + return response()->json([ + 'message' => 'Компонент удалён.' + ]); + } +} +======= +public function store(Request $request) +{ + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'price' => 'required|numeric|min:0', + 'component_type_id' => 'required|exists:component_types,id', + 'specifications' => 'nullable|array', + ]); + + $component = Component::create([ + 'name' => $validated['name'], + 'price' => $validated['price'], + 'component_type_id' => $validated['component_type_id'], + 'specifications' => $validated['specifications'] ?? null, + 'is_official' => false, // всегда false для пользователя + 'created_by_user_id' => auth()->id(), // автоматически привязываем к пользователю + ]); + + return response()->json([ + 'message' => 'Компонент успешно создан.', + 'component' => $component + ], 201); +} + +public function update(Request $request, $id) +{ + $component = Component::findOrFail($id); + + // Проверяем, что компонент принадлежит пользователю и не официальный + if ($component->created_by_user_id !== auth()->id() || $component->is_official) { + return response()->json([ + 'message' => 'Вы не можете редактировать этот компонент.' + ], 403); + } + + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'price' => 'required|numeric|min:0', + 'component_type_id' => 'required|exists:component_types,id', + 'specifications' => 'nullable|array', + ]); + + $component->update($validated); + + return response()->json([ + 'message' => 'Компонент обновлён.', + 'component' => $component + ]); +} + +public function destroy($id) +{ + $component = Component::findOrFail($id); + + // Проверяем, что компонент принадлежит пользователю и не официальный + if ($component->created_by_user_id !== auth()->id() || $component->is_official) { + return response()->json([ + 'message' => 'Вы не можете удалить этот компонент.' + ], 403); + } + + $component->delete(); + + return response()->json([ + 'message' => 'Компонент удалён.' + ]); +} + + + +} + +>>>>>>> origin/main diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..8677cd5 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,8 @@ +id()) + ->with('components') + ->get(); + + return response()->json($builds); + } + + /** + * @OA\Post( + * path="/api/builds", + * summary="Создать новую сборку", + * tags={"PC Builds"}, + * @OA\RequestBody( + * required=true, + * @OA\JsonContent( + * required={"name", "component_ids"}, + * @OA\Property(property="name", type="string", example="Игровой ПК 2025"), + * @OA\Property(property="description", type="string", nullable=true, example="Для игр в 1440p"), + * @OA\Property(property="component_ids", type="array", @OA\Items(type="integer", example=1)), + * @OA\Property(property="is_ai_generated", type="boolean", default=false), + * @OA\Property(property="ai_prompt", type="string", nullable=true, example="Сборка до 1000$ для игр") + * ) + * ), + * @OA\Response(response=201, description="Сборка создана"), + * @OA\Response(response=400, description="Ошибка валидации"), + * @OA\Response(response=403, description="Запрещено: чужие компоненты") + * ) + */ + public function store(Request $request) +{ + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + 'component_ids' => 'required|array|min:1', + 'component_ids.*' => 'exists:components,id', + 'is_ai_generated' => 'nullable|boolean', + 'ai_prompt' => 'nullable|string', + ]); + + // Проверяем: все компоненты — либо официальные, либо ваши + $invalidComponents = Component::whereIn('id', $validated['component_ids']) + ->where(function ($query) { + $query->where('is_official', false) + ->where('created_by_user_id', '!=', auth()->id()); + }) + ->pluck('name', 'id') + ->toArray(); + + if (!empty($invalidComponents)) { + return response()->json([ + 'message' => 'Запрещено использовать неофициальные компоненты, созданные другими пользователями.', + 'invalid_components' => $invalidComponents + ], 403); + } + + // 👇 ВСТАВЛЯЕМ ПРОВЕРКУ СОВМЕСТИМОСТИ ЗДЕСЬ — ПЕРЕД СОЗДАНИЕМ СБОРКИ + $validator = new BuildValidator(); + $compatibility = $validator->validateCompatibility($validated['component_ids']); + + if (!$compatibility['valid']) { + return response()->json([ + 'message' => 'Сборка содержит несовместимые компоненты.', + 'errors' => $compatibility['errors'], + 'warnings' => $compatibility['warnings'] + ], 422); // 422 Unprocessable Entity + } + + // ✅ Только если совместимость OK — создаём сборку + $build = PCBuild::create([ + 'user_id' => auth()->id(), + 'name' => $validated['name'], + 'description' => $validated['description'] ?? null, + 'is_ai_generated' => $validated['is_ai_generated'] ?? false, + 'ai_prompt' => $validated['ai_prompt'] ?? null, + ]); + + $build->components()->attach($validated['component_ids']); + + return response()->json([ + 'message' => 'Сборка успешно создана.', + 'build' => $build->load('components'), + 'compatibility' => $compatibility // опционально — для отладки + ], 201); +} + + /** + * @OA\Get( + * path="/api/builds/{id}", + * summary="Получить одну сборку по ID", + * tags={"PC Builds"}, + * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), + * @OA\Response(response=200, description="Сборка найдена"), + * @OA\Response(response=403, description="Запрещено: не ваша сборка"), + * @OA\Response(response=404, description="Не найдено") + * ) + */ + public function show($id) + { + $build = PCBuild::with('components')->findOrFail($id); + + if ($build->user_id !== auth()->id()) { + return response()->json([ + 'message' => 'Вы не можете просматривать эту сборку.' + ], 403); + } + + return response()->json($build); + } + + /** + * @OA\Put( + * path="/api/builds/{id}", + * summary="Обновить сборку", + * tags={"PC Builds"}, + * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), + * @OA\RequestBody( + * required=true, + * @OA\JsonContent( + * required={"name", "component_ids"}, + * @OA\Property(property="name", type="string"), + * @OA\Property(property="description", type="string", nullable=true), + * @OA\Property(property="component_ids", type="array", @OA\Items(type="integer")), + * @OA\Property(property="is_ai_generated", type="boolean"), + * @OA\Property(property="ai_prompt", type="string", nullable=true) + * ) + * ), + * @OA\Response(response=200, description="Сборка обновлена"), + * @OA\Response(response=403, description="Запрещено") + * ) + */ + public function update(Request $request, $id) +{ + $build = PCBuild::findOrFail($id); + + if ($build->user_id !== auth()->id()) { + return response()->json([ + 'message' => 'Вы не можете редактировать эту сборку.' + ], 403); + } + + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + 'component_ids' => 'required|array|min:1', + 'component_ids.*' => 'exists:components,id', + 'is_ai_generated' => 'nullable|boolean', + 'ai_prompt' => 'nullable|string', + ]); + + // Проверка: все компоненты — либо официальные, либо ваши + $invalidComponents = Component::whereIn('id', $validated['component_ids']) + ->where(function ($query) { + $query->where('is_official', false) + ->where('created_by_user_id', '!=', auth()->id()); + }) + ->pluck('name', 'id') + ->toArray(); + + if (!empty($invalidComponents)) { + return response()->json([ + 'message' => 'Запрещено использовать неофициальные компоненты, созданные другими пользователями.', + 'invalid_components' => $invalidComponents + ], 403); + } + + // 👇 ВСТАВЛЯЕМ ПРОВЕРКУ СОВМЕСТИМОСТИ ЗДЕСЬ — ПЕРЕД ОБНОВЛЕНИЕМ + $validator = new BuildValidator(); + $compatibility = $validator->validateCompatibility($validated['component_ids']); + + if (!$compatibility['valid']) { + return response()->json([ + 'message' => 'Сборка содержит несовместимые компоненты.', + 'errors' => $compatibility['errors'], + 'warnings' => $compatibility['warnings'] + ], 422); + } + + // ✅ Обновляем сборку + DB::transaction(function () use ($build, $validated) { + $build->update([ + 'name' => $validated['name'], + 'description' => $validated['description'] ?? null, + 'is_ai_generated' => $validated['is_ai_generated'] ?? $build->is_ai_generated, + 'ai_prompt' => $validated['ai_prompt'] ?? $build->ai_prompt, + ]); + + $build->components()->sync($validated['component_ids']); + }); + + return response()->json([ + 'message' => 'Сборка обновлена.', + 'build' => $build->load('components'), + 'compatibility' => $compatibility // опционально + ]); +} + + /** + * @OA\Delete( + * path="/api/builds/{id}", + * summary="Удалить сборку", + * tags={"PC Builds"}, + * @OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer")), + * @OA\Response(response=200, description="Сборка удалена"), + * @OA\Response(response=403, description="Запрещено") + * ) + */ + public function destroy($id) + { + $build = PCBuild::findOrFail($id); + + if ($build->user_id !== auth()->id()) { + return response()->json([ + 'message' => 'Вы не можете удалить эту сборку.' + ], 403); + } + + $build->delete(); + + return response()->json([ + 'message' => 'Сборка удалена.' + ]); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php new file mode 100644 index 0000000..5644c0f --- /dev/null +++ b/app/Http/Controllers/UsersController.php @@ -0,0 +1,37 @@ +get('name'); + $email = $request->get('email'); + $password = Hash::make($request->get('password')); + + $user->name = $name; + $user->email = $email; + $user->password = $password; + + $user->save(); + + $adminEmail = 'dimon.cozlow2017@yandex.ru'; + + dispatch(function () use ($user, $adminEmail) { + Mail::to($adminEmail)->send(new RegisterUserMail($user->name)); + }); + + return ['token' => $user->createToken('frontend')->plainTextToken]; + + + } +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php new file mode 100644 index 0000000..bd9650c --- /dev/null +++ b/app/Http/Kernel.php @@ -0,0 +1,67 @@ + + */ + protected $middleware = [ + // \App\Http\Middleware\TrustHosts::class, + \Illuminate\Http\Middleware\HandleCors::class, // ← Встроенный CORS (Laravel 12+) + \Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance::class, + \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, + \Illuminate\Foundation\Http\Middleware\TrimStrings::class, + \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + ]; + + /** + * The application's route middleware groups. + * + * @var array> + */ + protected $middlewareGroups = [ + 'web' => [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'api' => [ + \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + \Illuminate\Routing\Middleware\ThrottleRequests::class.':api', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + ]; + + /** + * The application's middleware aliases. + * + * Aliases may be used instead of class names to conveniently assign middleware to routes and groups. + * + * @var array + */ + protected $middlewareAliases = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class, + 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + ]; +} diff --git a/app/Mail/RegisterUserMail.php b/app/Mail/RegisterUserMail.php new file mode 100644 index 0000000..d8acffb --- /dev/null +++ b/app/Mail/RegisterUserMail.php @@ -0,0 +1,59 @@ +name = $name; + } + + + + + /** + * Get the message envelope. + */ + public function envelope(): Envelope + { + return new Envelope( + subject: 'Register User Mail', + ); + } + + /** + * Get the message content definition. + */ + public function content(): Content + { + return new Content( + view: 'emails.register', + + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Models/AiTask.php b/app/Models/AiTask.php new file mode 100644 index 0000000..7952100 --- /dev/null +++ b/app/Models/AiTask.php @@ -0,0 +1,58 @@ + 'decimal:2', + 'budget_max' => 'decimal:2', + 'is_active' => 'boolean' + ]; +======= + 'user_id', + 'name', + 'prompt_template', + 'is_active', + ]; + + protected $casts = [ + 'is_active' => 'boolean', + 'created_at' => 'datetime', + 'updated_at' => 'datetime', + ]; + + // Связь с пользователем (если шаблон пользовательский) + public function user() + { + return $this->belongsTo(User::class); + } + + // Общие (глобальные) шаблоны — где user_id IS NULL + public function scopeGlobal($query) + { + return $query->whereNull('user_id'); + } + + // Активные шаблоны + public function scopeActive($query) + { + return $query->where('is_active', true); + } +>>>>>>> origin/main +} \ No newline at end of file diff --git a/app/Models/Component.php b/app/Models/Component.php new file mode 100644 index 0000000..a0311d6 --- /dev/null +++ b/app/Models/Component.php @@ -0,0 +1,34 @@ + 'array', // автоматически преобразует JSON в массив + ]; + + public function user() + { + return $this->belongsTo(User::class, 'created_by_user_id'); + } + + public function componentType() + { + return $this->belongsTo(ComponentType::class, 'component_type_id'); + } +} \ No newline at end of file diff --git a/app/Models/ComponentType.php b/app/Models/ComponentType.php new file mode 100644 index 0000000..4609ce5 --- /dev/null +++ b/app/Models/ComponentType.php @@ -0,0 +1,15 @@ + 'datetime', + 'updated_at' => 'datetime', + ]; +} diff --git a/app/Models/PCBuild.php b/app/Models/PCBuild.php new file mode 100644 index 0000000..b922d97 --- /dev/null +++ b/app/Models/PCBuild.php @@ -0,0 +1,55 @@ +belongsToMany(Component::class, 'pc_build_components'); + } + + // Обратная связь +======= + protected $casts = [ + 'is_ai_generated' => 'boolean', + 'created_at' => 'datetime', + 'updated_at' => 'datetime', + ]; + + // Связь с пользователем +>>>>>>> origin/main + public function user() + { + return $this->belongsTo(User::class); + } +<<<<<<< HEAD + + // Опционально: защита от ошибок, если сборка без пользователя + protected static function booted() + { + static::addGlobalScope('user', function ($query) { + if (auth()->check()) { + $query->where('user_id', auth()->id()); + } + }); + } +======= +>>>>>>> origin/main +} \ No newline at end of file diff --git a/app/Models/PCBuildComponent.php b/app/Models/PCBuildComponent.php new file mode 100644 index 0000000..da43944 --- /dev/null +++ b/app/Models/PCBuildComponent.php @@ -0,0 +1,35 @@ + 'integer', + 'created_at' => 'datetime', + 'updated_at' => 'datetime', + ]; + + // Связь с сборкой + public function build() + { + return $this->belongsTo(PcBuild::class); + } + + // Связь с компонентом + public function component() + { + return $this->belongsTo(Component::class); + } +} \ No newline at end of file diff --git a/app/Models/User.php b/app/Models/User.php new file mode 100644 index 0000000..2c5b5a0 --- /dev/null +++ b/app/Models/User.php @@ -0,0 +1,52 @@ + */ + use HasApiTokens, HasFactory, Notifiable; + + /** + * The attributes that are mass assignable. + * + * @var list + */ + protected $fillable = [ + 'name', + 'email', + 'password', + 'custom_field' + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var list + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + ]; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..452e6b6 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,24 @@ +apiToken = env('GIGACHAT_API_TOKEN'); + if (!$this->apiToken) { + throw new Exception('GIGACHAT_API_TOKEN не установлен в .env'); + } + } + + public function suggest($task_id = null, $custom_prompt = null, $budget = null) + { + $prompt = $this->generatePrompt($task_id, $custom_prompt, $budget); + + $response = Http::withHeaders([ + 'Authorization' => 'Bearer ' . $this->apiToken, + 'Content-Type' => 'application/json', + ])->withoutVerifying() + ->post($this->baseUrl, [ + 'model' => 'GigaChat', + 'messages' => [ + [ + 'role' => 'user', + 'content' => $prompt + ] + ], + 'temperature' => 0.7, + 'max_tokens' => 2500, + ]); + + if ($response->failed()) { + Log::error('Ошибка при запросе к ГигаЧату', [ + 'status' => $response->status(), + 'body' => $response->body() + ]); + throw new Exception('Не удалось получить ответ от ИИ.'); + } + + $responseData = $response->json(); + $aiComponents = $this->parseResponse($responseData); + + // ✅ Теперь можно безопасно логировать + + // 🔹 ДЕБАГ: логируем полученные компоненты от ИИ + Log::info('Компоненты от ИИ:', [ + 'count' => count($aiComponents), + 'types' => array_column($aiComponents, 'component_type_id'), + 'components' => $aiComponents + ]); + + // 🔹 ШАГ 1: Удаляем дубликаты по name + component_type_id + $uniqueComponents = []; + $seen = []; + + foreach ($aiComponents as $component) { + $key = $component['name'] . '|' . $component['component_type_id']; + if (!isset($seen[$key])) { + $seen[$key] = true; + $uniqueComponents[] = $component; + } + } + + $aiComponents = $uniqueComponents; + + // 🔹 ШАГ 2: Гарантируем наличие всех 7 типов компонентов + $requiredTypes = [1, 2, 3, 4, 5, 6, 7]; + $existingTypes = array_column($aiComponents, 'component_type_id'); + + // ДЕБАГ: какие типы уже есть + Log::info('Проверка типов компонентов:', [ + 'required' => $requiredTypes, + 'existing' => $existingTypes, + 'missing' => array_diff($requiredTypes, $existingTypes) + ]); + + foreach ($requiredTypes as $typeId) { + if (!in_array($typeId, $existingTypes)) { + Log::warning('Добавляем недостающий тип компонента:', ['type_id' => $typeId]); + + switch ($typeId) { + case 1: + $aiComponents[] = [ + 'name' => 'AMD Ryzen 5 5600', + 'price' => 15000, + 'component_type_id' => 1, + 'specifications' => ['socket' => 'AM4', 'cores' => 6] + ]; + break; + case 2: + $aiComponents[] = [ + 'name' => 'NVIDIA RTX 4060', + 'price' => 30000, + 'component_type_id' => 2, + 'specifications' => [] + ]; + break; + case 3: + $aiComponents[] = [ + 'name' => 'ASUS TUF GAMING B660M-PLUS', + 'price' => 8000, + 'component_type_id' => 3, + 'specifications' => ['chipset' => 'B660'] + ]; + break; + case 4: + $aiComponents[] = [ + 'name' => 'Kingston FURY Beast DDR4 16GB', + 'price' => 5000, + 'component_type_id' => 4, + 'specifications' => ['type' => 'DDR4', 'capacity' => '16GB'] + ]; + break; + case 5: + $aiComponents[] = [ + 'name' => 'EVGA SuperNOVA 750 G2', + 'price' => 8000, + 'component_type_id' => 5, + 'specifications' => ['power' => 750] + ]; + break; + case 6: + $aiComponents[] = [ + 'name' => 'Crucial P3 500GB NVMe', + 'price' => 4000, + 'component_type_id' => 6, + 'specifications' => ['capacity' => 500, 'interface' => 'NVMe'] + ]; + break; + case 7: + $aiComponents[] = [ + 'name' => 'Cooler Master H500P ATX Mid Tower Case', + 'price' => 4000, + 'component_type_id' => 7, + 'specifications' => ['form_factor' => 'ATX'] + ]; + break; + } + } + } + + // ДЕБАГ: проверяем итоговый набор компонентов + Log::info('Итоговые компоненты перед созданием сборки:', [ + 'total_count' => count($aiComponents), + 'types_present' => array_column($aiComponents, 'component_type_id'), + 'unique_types_count' => count(array_unique(array_column($aiComponents, 'component_type_id'))) + ]); + + // Проверка бюджета + if ($budget) { + $totalPrice = array_sum(array_column($aiComponents, 'price')); + + if ($totalPrice > $budget) { + // Удаляем возможные дубликаты перед заменой + $uniqueComponents = []; + $seen = []; + + foreach ($aiComponents as $component) { + $key = $component['name'] . '|' . $component['component_type_id']; + if (!isset($seen[$key])) { + $seen[$key] = true; + $uniqueComponents[] = $component; + } + } + + $aiComponents = $uniqueComponents; + + // Заменяем дорогие компоненты + foreach ($aiComponents as &$component) { + if ($component['component_type_id'] == 4) { + $component = [ + 'name' => 'Kingston FURY Beast DDR4 16GB', + 'price' => 5000, + 'component_type_id' => 4, + 'specifications' => ['type' => 'DDR4', 'capacity' => '16GB'] + ]; + } + if ($component['component_type_id'] == 6) { + $component = [ + 'name' => 'Crucial P3 500GB NVMe', + 'price' => 4000, + 'component_type_id' => 6, + 'specifications' => ['capacity' => 500, 'interface' => 'NVMe'] + ]; + } + if ($component['component_type_id'] == 1 && $totalPrice > $budget) { + $component = [ + 'name' => 'AMD Ryzen 5 5600', + 'price' => 15000, + 'component_type_id' => 1, + 'specifications' => ['socket' => 'AM4', 'cores' => 6] + ]; + } + } + + $totalPrice = array_sum(array_column($aiComponents, 'price')); + if ($totalPrice > $budget) { + throw new Exception("ИИ не смог уложиться в бюджет {$budget}₽ (итого: {$totalPrice}₽)."); + } + } + } + + // Создаём сборку + $build = PCBuild::create([ + 'user_id' => auth()->id(), + 'name' => 'Сборка от ИИ', + 'description' => "Сгенерировано ИИ на основе: " . ($custom_prompt ?: "задача #{$task_id}"), + 'is_ai_generated' => true, + 'ai_prompt' => $prompt, + ]); + + // Привязываем компоненты с защитой от дубликатов + $createdComponents = []; + $seenComponentIds = []; + + foreach ($aiComponents as $componentData) { + $component = $this->findOrCreateComponent($componentData); + + // Проверяем, что компонент ещё не добавлен в эту сборку + if (!in_array($component->id, $seenComponentIds)) { + $createdComponents[] = $component; + $seenComponentIds[] = $component->id; + } + } + + // Используем sync без детачей, чтобы избежать дубликатов + $build->components()->sync($seenComponentIds, false); + + // 🔹 ПРОВЕРКА: убеждаемся, что есть все 7 типов компонентов + $finalComponents = $build->components()->get(); + $finalTypes = $finalComponents->pluck('component_type_id')->unique()->toArray(); + + Log::info('Проверка финальной сборки:', [ + 'build_id' => $build->id, + 'total_components' => $finalComponents->count(), + 'component_types' => $finalTypes, + 'missing_types' => array_diff($requiredTypes, $finalTypes) + ]); + + if (!in_array(7, $finalTypes)) { + // Находим или создаем корпус по умолчанию + $defaultCase = Component::firstOrCreate( + [ + 'name' => 'Cooler Master H500P ATX Mid Tower Case', + 'component_type_id' => 7, + ], + [ + 'price' => 4000, + 'specifications' => ['form_factor' => 'ATX'], + 'is_official' => true, + 'created_by_user_id' => null, + ] + ); + + $build->components()->attach($defaultCase->id); + Log::warning('Был добавлен корпус по умолчанию для сборки', [ + 'build_id' => $build->id, + 'case_id' => $defaultCase->id + ]); + + // Обновляем массив созданных компонентов + $createdComponents[] = $defaultCase; + } + + // 🔹 ФИНАЛЬНАЯ ПРОВЕРКА + $finalCount = $build->components()->count(); + if ($finalCount < 7) { + Log::error('Сборка все еще имеет недостающее количество компонентов:', [ + 'build_id' => $build->id, + 'expected' => 7, + 'actual' => $finalCount + ]); + } + + return [ + 'build' => $build, + 'components' => collect($createdComponents), + ]; + } + + protected function generatePrompt($task_id, $custom_prompt, $budget) + { + $basePrompt = "Ты — эксперт по сборке ПК. Твоя задача — предложить **полную и сбалансированную сборку из 7 компонентов**, подходящую под запрос пользователя."; + + if ($budget) { + $basePrompt .= " Бюджет: {$budget} рублей"; + } + + if ($custom_prompt) { + $basePrompt .= " Запрос пользователя: '{$custom_prompt}'."; + } elseif ($task_id) { + $basePrompt .= " Задача: #{$task_id}."; + } + + $basePrompt .= " Ты **обязан** включить **ровно по одному компоненту каждого типа**: Процессор, Видеокарта, Материнская плата, ОЗУ, Блок питания, SSD, Корпус."; + $basePrompt .= " Используй ТОЛЬКО эти ID типов: 1=Процессор, 2=Видеокарта, 3=Материнская плата, 4=ОЗУ, 5=Блок питания, 6=SSD, 7=Корпус."; + $basePrompt .= " Не пропускай ни один тип. Не дублируй компоненты."; + $basePrompt .= " Все компоненты должны быть реальными, совместимыми и актуальными на 2025 год."; + $basePrompt .= " Ты **обязан** подобрать компоненты так, чтобы **общая стоимость не превышала** {$budget} рублей."; + $basePrompt .= " Никогда не пиши значения вроде 5600MHz — всегда используй строки: \"5600MHz\" или числа: 5600."; + $basePrompt .= " Не ставь лишние кавычки перед скобками."; + $basePrompt .= " ВАЖНО: Верни ТОЛЬКО валидный JSON без пояснений, комментариев, markdown."; + $basePrompt .= " Все значения в specifications должны быть строками или числами."; + $basePrompt .= " Не используй обратные слэши, звёздочки, решётки."; + $basePrompt .= " Верни **только чистый JSON-массив из 7 объектов**, без пояснений, комментариев, маркдауна."; + $basePrompt .= " Формат: [{\"name\":\"Название\",\"price\":999.99,\"component_type_id\":1,\"specifications\":{\"socket\":\"AM5\",\"tdp\":105}}, ...]"; + $basePrompt .= " В specifications используй только строки или числа. Например: \"max_power\": 800, а не 800_watt."; + + return $basePrompt; + } +protected function parseResponse($responseData) +{ + if (!isset($responseData['choices'][0]['message']['content'])) { + throw new Exception('Ответ ИИ не содержит содержимого.'); + } + + $content = $responseData['choices'][0]['message']['content']; + + // Удаляем markdown-блоки + $content = preg_replace('/^```(?:json)?\s*|\s*```$/m', '', $content); + + // Находим первый JSON-массив + if (!preg_match('/\[[\s\S]*\]/', $content, $matches)) { + throw new Exception('Не найден JSON-массив в ответе ИИ.'); + } + + $jsonStr = $matches[0]; + + // Попытка декодировать без "починки" + $parsed = json_decode($jsonStr, true, 512, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE); + + if (!is_array($parsed)) { + throw new Exception('Ожидался массив компонентов.'); + } + + foreach ($parsed as $index => $item) { + if (!is_array($item)) { + throw new Exception("Элемент #{$index} не является объектом."); + } + } + + return $parsed; +} + +protected function findOrCreateComponent($data) +{ + // Валидация обязательных полей + if (!isset($data['name']) || !isset($data['component_type_id'])) { + throw new Exception('Компонент должен содержать name и component_type_id.'); + } + + $data['price'] = (float) ($data['price'] ?? 0); + $data['component_type_id'] = (int) ($data['component_type_id'] ?? 1); + + // Очищаем specifications от некорректных значений + $specifications = []; + if (is_array($data['specifications'] ?? null)) { + foreach ($data['specifications'] as $key => $value) { + // Преобразуем всё в строки или числа + if (is_numeric($value)) { + $specifications[$key] = (float) $value; + } else { + $specifications[$key] = (string) $value; + } + } + } + + $component = Component::firstOrCreate( + [ + 'name' => $data['name'], + 'component_type_id' => $data['component_type_id'], + ], + [ + 'price' => $data['price'], + 'specifications' => $specifications, + 'is_official' => true, + 'created_by_user_id' => null, + ] + ); + + // Обновляем цену, если компонент уже существует + if ($component->wasRecentlyCreated === false) { + $component->update(['price' => $data['price']]); + } + + return $component; +} +} \ No newline at end of file diff --git a/app/Services/BuildValidator.php b/app/Services/BuildValidator.php new file mode 100644 index 0000000..a3d54fd --- /dev/null +++ b/app/Services/BuildValidator.php @@ -0,0 +1,83 @@ + bool, 'errors' => array, 'warnings' => array] + */ + public function validateCompatibility(array $componentIds) + { + $components = Component::whereIn('id', $componentIds)->get(); + + if ($components->count() < 2) { + return [ + 'valid' => true, + 'errors' => [], + 'warnings' => [] + ]; + } + + $errors = []; + $warnings = []; + + // Определяем типы компонентов по component_type_id (адаптируйте под вашу логику!) + $cpu = $components->firstWhere('component_type_id', 1); // 1 = CPU + $motherboard = $components->firstWhere('component_type_id', 3); // 3 = Motherboard + $ram = $components->firstWhere('component_type_id', 4); // 4 = RAM + $psu = $components->firstWhere('component_type_id', 5); // 5 = PSU + + // 1. Проверка сокета (CPU ↔ Motherboard) + if ($cpu && $motherboard) { + $cpuSocket = $cpu->specifications['socket'] ?? null; + $mbSocket = $motherboard->specifications['socket'] ?? null; + + if (!$cpuSocket || !$mbSocket) { + $warnings[] = "Не указан сокет для процессора или материнской платы."; + } elseif ($cpuSocket !== $mbSocket) { + $errors[] = "Сокет процессора '{$cpuSocket}' не совместим со сокетом материнской платы '{$mbSocket}'."; + } + } + + // 2. Проверка типа ОЗУ (RAM ↔ Motherboard) + if ($ram && $motherboard) { + $ramType = $ram->specifications['type'] ?? null; + $mbRamType = $motherboard->specifications['memory_type'] ?? $motherboard->specifications['type'] ?? null; + + if (!$ramType || !$mbRamType) { + $warnings[] = "Не указан тип памяти для ОЗУ или материнской платы."; + } elseif ($ramType !== $mbRamType) { + $errors[] = "Тип ОЗУ '{$ramType}' не совместим с типом памяти материнской платы '{$mbRamType}'."; + } + } + + // 3. Проверка мощности БП (PSU ≥ сумма TDP) + if ($psu) { + $totalTdp = 0; + + foreach ($components as $component) { + // Берём TDP из specifications, или 0 если нет + $tdp = $component->specifications['tdp'] ?? 0; + $totalTdp += (int) $tdp; + } + + $psuWattage = $psu->specifications['wattage'] ?? 0; + + if ($psuWattage < $totalTdp) { + $errors[] = "Мощность БП ({$psuWattage} Вт) < суммарного TDP ({$totalTdp} Вт). Рекомендуется ≥ {$totalTdp} Вт."; + } + } + + return [ + 'valid' => empty($errors), + 'errors' => $errors, + 'warnings' => $warnings + ]; + } +} \ No newline at end of file diff --git a/artisan b/artisan new file mode 100755 index 0000000..c35e31d --- /dev/null +++ b/artisan @@ -0,0 +1,18 @@ +#!/usr/bin/env php +handleCommand(new ArgvInput); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000..426d718 --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,40 @@ +>>>>>> origin/main +return Application::configure(basePath: dirname(__DIR__)) + ->withRouting( + web: __DIR__.'/../routes/web.php', + api: __DIR__.'/../routes/api.php', + commands: __DIR__.'/../routes/console.php', + health: '/up', + ) +<<<<<<< HEAD + ->withMiddleware(function (Middleware $middleware) { + // Убедитесь, что HandleCors здесь + $middleware->api(prepend: [ + \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + \Illuminate\Http\Middleware\HandleCors::class, // ← ДОЛЖНО БЫТЬ + ]); + + $middleware->validateCsrfTokens([ + 'spark-billing-portal/*', + ]); + }) + ->withExceptions(function (Exceptions $exceptions) { + // + })->create(); +======= + ->withMiddleware(function (Middleware $middleware): void { + // + }) + ->withExceptions(function (Exceptions $exceptions): void { + // + })->create(); +>>>>>>> origin/main diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/bootstrap/providers.php b/bootstrap/providers.php new file mode 100644 index 0000000..38b258d --- /dev/null +++ b/bootstrap/providers.php @@ -0,0 +1,5 @@ +>>>>>> origin/main + "laravel/framework": "^12.0", + "laravel/sanctum": "^4.2", + "laravel/tinker": "^2.10.1" + }, + "require-dev": { + "fakerphp/faker": "^1.23", + "laravel/pail": "^1.2.2", + "laravel/pint": "^1.24", + "laravel/sail": "^1.41", + "mockery/mockery": "^1.6", + "nunomaduro/collision": "^8.6", + "phpunit/phpunit": "^11.5.3" + }, + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Factories\\": "database/factories/", + "Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "scripts": { + "setup": [ + "composer install", + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"", + "@php artisan key:generate", + "@php artisan migrate --force", + "npm install", + "npm run build" + ], + "dev": [ + "Composer\\Config::disableProcessTimeout", + "npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite --kill-others" + ], + "test": [ + "@php artisan config:clear --ansi", + "@php artisan test" + ], + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover --ansi" + ], + "post-update-cmd": [ + "@php artisan vendor:publish --tag=laravel-assets --ansi --force" + ], + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate --ansi", + "@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"", + "@php artisan migrate --graceful --ansi" + ], + "pre-package-uninstall": [ + "Illuminate\\Foundation\\ComposerScripts::prePackageUninstall" + ] + }, + "extra": { + "laravel": { + "dont-discover": [] + } + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true, + "php-http/discovery": true + } + }, + "minimum-stability": "stable", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..8bcc54d --- /dev/null +++ b/composer.lock @@ -0,0 +1,8721 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], +<<<<<<< HEAD + "content-hash": "297aa77d449a0d2e46f26f678b488978", +======= + "content-hash": "8f387a0734f3bf879214e4aa2fca6e2f", +>>>>>>> origin/main + "packages": [ + { + "name": "brick/math", + "version": "0.14.0", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2", + "reference": "113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2", + "shasum": "" + }, + "require": { + "php": "^8.2" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpstan/phpstan": "2.1.22", + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.14.0" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2025-08-29T12:40:03+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, + { +<<<<<<< HEAD + "name": "doctrine/dbal", + "version": "4.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", + "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1.5", + "php": "^8.2", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "14.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.2", + "phpstan/phpstan": "2.1.30", + "phpstan/phpstan-phpunit": "2.0.7", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "11.5.23", + "slevomat/coding-standard": "8.24.0", + "squizlabs/php_codesniffer": "4.0.0", + "symfony/cache": "^6.3.8|^7.0|^8.0", + "symfony/console": "^5.4|^6.3|^7.0|^8.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/4.4.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2025-12-04T10:11:03+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + }, + "time": "2025-04-07T20:06:18+00:00" + }, + { +======= +>>>>>>> origin/main + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2025-08-10T19:31:58+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "8c784d071debd117328803d86b2097615b457500" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2024-10-09T13:47:03+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2025-03-06T22:45:56+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-08-23T22:36:01+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:34:08+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2025-08-23T21:21:41+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:27:06+00:00" + }, + { + "name": "laravel/framework", +<<<<<<< HEAD + "version": "v12.46.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "9dcff48d25a632c1fadb713024c952fec489c4ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/9dcff48d25a632c1fadb713024c952fec489c4ae", + "reference": "9dcff48d25a632c1fadb713024c952fec489c4ae", +======= + "version": "v12.35.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "9583ef9e405a71d5b8c04ff6efd05a7ef9a5baef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/9583ef9e405a71d5b8c04ff6efd05a7ef9a5baef", + "reference": "9583ef9e405a71d5b8c04ff6efd05a7ef9a5baef", +>>>>>>> origin/main + "shasum": "" + }, + "require": { + "brick/math": "^0.11|^0.12|^0.13|^0.14", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.3.0", + "laravel/serializable-closure": "^1.3|^2.0", + "league/commonmark": "^2.7", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^3.8.4", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.2.0", + "symfony/error-handler": "^7.2.0", + "symfony/finder": "^7.2.0", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.2.0", + "symfony/mailer": "^7.2.0", + "symfony/mime": "^7.2.0", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33", + "symfony/process": "^7.2.0", + "symfony/routing": "^7.2.0", + "symfony/uid": "^7.2.0", + "symfony/var-dumper": "^7.2.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/json-schema": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", +<<<<<<< HEAD + "illuminate/reflection": "self.version", +======= +>>>>>>> origin/main + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^2.4", + "laravel/pint": "^1.18", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "opis/json-schema": "^2.4.1", +<<<<<<< HEAD + "orchestra/testbench-core": "^10.8.1", +======= + "orchestra/testbench-core": "^10.7.0", +>>>>>>> origin/main + "pda/pheanstalk": "^5.0.6|^7.0.0", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", + "predis/predis": "^2.3|^3.0", +<<<<<<< HEAD + "resend/resend-php": "^0.10.0|^1.0", +======= + "resend/resend-php": "^0.10.0", +>>>>>>> origin/main + "symfony/cache": "^7.2.0", + "symfony/http-client": "^7.2.0", + "symfony/psr-http-message-bridge": "^7.2.0", + "symfony/translation": "^7.2.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", + "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", + "predis/predis": "Required to use the predis connector (^2.3|^3.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", +<<<<<<< HEAD + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0|^1.0).", +======= + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", +>>>>>>> origin/main + "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/functions.php", + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", +<<<<<<< HEAD + "src/Illuminate/Reflection/helpers.php", +======= +>>>>>>> origin/main + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", +<<<<<<< HEAD + "src/Illuminate/Conditionable/", + "src/Illuminate/Reflection/" +======= + "src/Illuminate/Conditionable/" +>>>>>>> origin/main + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, +<<<<<<< HEAD + "time": "2026-01-07T23:26:53+00:00" +======= + "time": "2025-10-21T15:15:41+00:00" +>>>>>>> origin/main + }, + { + "name": "laravel/prompts", + "version": "v0.3.7", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "a1891d362714bc40c8d23b0b1d7090f022ea27cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/a1891d362714bc40c8d23b0b1d7090f022ea27cc", + "reference": "a1891d362714bc40c8d23b0b1d7090f022ea27cc", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0|^12.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4", + "phpstan/phpstan": "^1.12.28", + "phpstan/phpstan-mockery": "^1.1.3" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.3.7" + }, + "time": "2025-09-19T13:47:56+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v4.2.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "fd447754d2d3f56950d53b930128af2e3b617de9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/fd447754d2d3f56950d53b930128af2e3b617de9", + "reference": "fd447754d2d3f56950d53b930128af2e3b617de9", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^11.0|^12.0", + "illuminate/contracts": "^11.0|^12.0", + "illuminate/database": "^11.0|^12.0", + "illuminate/support": "^11.0|^12.0", + "php": "^8.2", + "symfony/console": "^7.0" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "orchestra/testbench": "^9.15|^10.8", + "phpstan/phpstan": "^1.10" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2026-01-06T23:11:51+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v2.0.6", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "038ce42edee619599a1debb7e81d7b3759492819" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/038ce42edee619599a1debb7e81d7b3759492819", + "reference": "038ce42edee619599a1debb7e81d7b3759492819", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0|^12.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2025-10-09T13:42:30+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.10.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/22177cc71807d38f2810c6204d8f7183d88a57d3", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.10.1" + }, + "time": "2025-01-27T14:24:01+00:00" + }, + { + "name": "league/commonmark", + "version": "2.7.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/10732241927d3971d28e7ea7b5712721fa2296ca", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2025-07-20T12:47:49+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.30.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "c139fd65c1f796b926f4aec0df37f6caa959a8da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/c139fd65c1f796b926f4aec0df37f6caa959a8da", + "reference": "c139fd65c1f796b926f4aec0df37f6caa959a8da", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3|^2", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2|^2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.30.1" + }, + "time": "2025-10-20T15:35:26+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.30.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/6691915f77c7fb69adfb87dcd550052dc184ee10", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.0" + }, + "time": "2025-05-21T10:34:19+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" + }, + { + "name": "league/uri", + "version": "7.5.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "81fb5145d2644324614cc532b28efd0215bda430" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430", + "reference": "81fb5145d2644324614cc532b28efd0215bda430", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.5", + "php": "^8.1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", + "league/uri-components": "Needed to easily manipulate URI objects components", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.5.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-12-08T08:40:02+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.5.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-factory": "^1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common interfaces and classes for URI representation and interaction", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.5.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-12-08T08:18:47+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.9.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.9.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2025-03-24T10:02:05+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.10.3", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f", + "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2025-09-06T13:39:36+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.4" + }, + "require-dev": { + "nette/tester": "^2.5.2", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.2" + }, + "time": "2024-10-06T23:10:23+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.8", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/c930ca4e3cf4f17dcfb03037703679d2396d2ede", + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/tester": "^2.5", + "phpstan/phpstan-nette": "^2.0@stable", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.8" + }, + "time": "2025-08-06T21:43:34+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.6.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "3a454ca033b9e06b63282ce19562e892747449bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb", + "reference": "3a454ca033b9e06b63282ce19562e892747449bb", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2" + }, + "time": "2025-10-21T19:32:17+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.3.2", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "eb61920a53057a7debd718a5b89c2178032b52c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/eb61920a53057a7debd718a5b89c2178032b52c0", + "reference": "eb61920a53057a7debd718a5b89c2178032b52c0", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.3.4" + }, + "require-dev": { + "illuminate/console": "^11.46.1", + "laravel/pint": "^1.25.1", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0 || ^3.8.4", + "phpstan/phpstan": "^1.12.32", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.3.4", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.3.2" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2025-10-18T11:10:27+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.4", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2025-08-21T11:53:16+00:00" + }, + { +<<<<<<< HEAD + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { +======= +>>>>>>> origin/main + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.13", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "d86c2f750e72017a5cdb1b9f1cef468a5cbacd1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d86c2f750e72017a5cdb1b9f1cef468a5cbacd1e", + "reference": "d86c2f750e72017a5cdb1b9f1cef468a5cbacd1e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "composer/class-map-generator": "^1.6" + }, + "suggest": { + "composer/class-map-generator": "Improved tab completion performance with better class discovery.", + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "https://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.13" + }, + "time": "2025-10-20T22:48:29+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.1.1" + }, + "time": "2025-03-22T05:38:12+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.9.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/81f941f6f729b1e3ceea61d9d014f8b6c6800440", + "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.25", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.9.1" + }, + "time": "2025-09-04T20:59:21+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/console", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", + "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-22T15:31:00+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", + "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-11T10:12:26+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191", + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-13T11:49:31+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c061c7c18918b1b64268771aad04b40be41dd2e6", + "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/clock": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-16T08:38:17+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "b796dffea7821f035047235e076b60ca2446e3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b796dffea7821f035047235e076b60ca2446e3cf", + "reference": "b796dffea7821f035047235e076b60ca2446e3cf", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^7.3", + "symfony/http-foundation": "^7.3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-27T12:32:17+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "ab97ef2f7acf0216955f5845484235113047a31d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/ab97ef2f7acf0216955f5845484235113047a31d", + "reference": "ab97ef2f7acf0216955f5845484235113047a31d", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/mime": "^7.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-17T05:51:54+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "b1b828f69cbaf887fa835a091869e55df91d0e35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/b1b828f69cbaf887fa835a091869e55df91d0e35", + "reference": "b1b828f69cbaf887fa835a091869e55df91d0e35", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-16T08:38:17+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-27T09:58:17+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-10T14:38:51+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-24T13:30:11+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-23T16:12:55+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b", + "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-11T10:12:26+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/8dc648e159e9bac02b703b9fbd937f19ba13d07c", + "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-11T10:12:26+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-04-25T09:37:31+00:00" + }, + { + "name": "symfony/string", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "f96476035142921000338bad71e5247fbc138872" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872", + "reference": "f96476035142921000338bad71e5247fbc138872", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-11T14:36:48+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "ec25870502d0c7072d086e8ffba1420c85965174" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174", + "reference": "ec25870502d0c7072d086e8ffba1420c85965174", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-07T11:39:36+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-27T08:32:26+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/a69f69f3159b852651a6bf45a9fdd149520525bb", + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v7.3.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-27T19:55:54+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", + "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-11T10:12:26+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" + }, + "time": "2024-12-21T16:25:41+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.2", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2025-04-30T23:37:27+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2024-11-21T01:49:47+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "541057574806f942c94662b817a50f63f7345360" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/541057574806f942c94662b817a50f63f7345360", + "reference": "541057574806f942c94662b817a50f63f7345360", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-date": "*", + "ext-filter": "*", + "php": "^7.2 || ^8.0" + }, + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.12.0" + }, + "time": "2025-10-20T12:43:39+00:00" + } + ], + "packages-dev": [ + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" + }, + "time": "2024-11-21T13:46:39+00:00" + }, + { + "name": "filp/whoops", + "version": "2.18.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.18.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2025-08-08T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" + }, + "time": "2025-04-30T06:54:44+00:00" + }, + { + "name": "laravel/pail", + "version": "v1.2.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "8cc3d575c1f0e57eeb923f366a37528c50d2385a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/8cc3d575c1f0e57eeb923f366a37528c50d2385a", + "reference": "8cc3d575c1f0e57eeb923f366a37528c50d2385a", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0|^12.0", + "illuminate/contracts": "^10.24|^11.0|^12.0", + "illuminate/log": "^10.24|^11.0|^12.0", + "illuminate/process": "^10.24|^11.0|^12.0", + "illuminate/support": "^10.24|^11.0|^12.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "laravel/framework": "^10.24|^11.0|^12.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.13|^9.0|^10.0", + "pestphp/pest": "^2.20|^3.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0", + "phpstan/phpstan": "^1.12.27", + "symfony/var-dumper": "^6.3|^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "dev", + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2025-06-05T13:55:57+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.25.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "5016e263f95d97670d71b9a987bd8996ade6d8d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/5016e263f95d97670d71b9a987bd8996ade6d8d9", + "reference": "5016e263f95d97670d71b9a987bd8996ade6d8d9", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.87.2", + "illuminate/view": "^11.46.0", + "larastan/larastan": "^3.7.1", + "laravel-zero/framework": "^11.45.0", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^2.3.1", + "pestphp/pest": "^2.36.0" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2025-09-19T02:57:12+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.46.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "eb90c4f113c4a9637b8fdd16e24cfc64f2b0ae6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/eb90c4f113c4a9637b8fdd16e24cfc64f2b0ae6e", + "reference": "eb90c4f113c4a9637b8fdd16e24cfc64f2b0ae6e", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0", + "symfony/yaml": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "phpstan/phpstan": "^1.10" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2025-09-23T13:44:39+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.8.2", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.18.1", + "nunomaduro/termwind": "^2.3.1", + "php": "^8.2.0", + "symfony/console": "^7.3.0" + }, + "conflict": { + "laravel/framework": "<11.44.2 || >=13.0.0", + "phpunit/phpunit": "<11.5.15 || >=13.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.8.3", + "larastan/larastan": "^3.4.2", + "laravel/framework": "^11.44.2 || ^12.18", + "laravel/pint": "^1.22.1", + "laravel/sail": "^1.43.1", + "laravel/sanctum": "^4.1.1", + "laravel/tinker": "^2.10.1", + "orchestra/testbench-core": "^9.12.0 || ^10.4", + "pestphp/pest": "^3.8.2", + "sebastian/environment": "^7.2.1 || ^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "dev", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2025-06-25T02:12:12+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "11.0.11", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.4.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^11.5.2" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.11" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2025-08-27T14:37:49+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-27T05:02:59+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:07:44+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:08:43+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:09:35+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "11.5.42", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c", + "reference": "1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.11", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.2", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.1", + "sebastian/exporter": "^6.3.2", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.3", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.42" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2025-09-28T12:09:13+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-19T07:56:08+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:45:54+00:00" + }, + { + "name": "sebastian/comparator", + "version": "6.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8", + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2025-08-10T08:07:46+00:00" + }, + { + "name": "sebastian/complexity", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:49:50+00:00" + }, + { + "name": "sebastian/diff", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:53:05+00:00" + }, + { + "name": "sebastian/environment", + "version": "7.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2025-05-21T11:55:47+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2025-09-24T06:12:51+00:00" + }, + { + "name": "sebastian/global-state", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:57:36+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:58:38+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:00:13+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:01:32+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "6.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-13T04:42:22+00:00" + }, + { + "name": "sebastian/type", + "version": "5.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" + } + ], + "time": "2025-08-09T06:55:48+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-09T05:16:32+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.3.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d4f4a66866fe2451f61296924767280ab5732d9d", + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-27T11:34:33+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.2" + }, + "platform-dev": {}, + "plugin-api-version": "2.9.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..423eed5 --- /dev/null +++ b/config/app.php @@ -0,0 +1,126 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | the application so that it's available within Artisan commands. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. The timezone + | is set to "UTC" by default as it is suitable for most use cases. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), + + 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. + | + */ + + 'cipher' => 'AES-256-CBC', + + 'key' => env('APP_KEY'), + + 'previous_keys' => [ + ...array_filter( + explode(',', (string) env('APP_PREVIOUS_KEYS', '')) + ), + ], + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), + ], + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..7d1eb0d --- /dev/null +++ b/config/auth.php @@ -0,0 +1,115 @@ + [ + 'guard' => env('AUTH_GUARD', 'web'), + 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | which utilizes session storage plus the Eloquent user provider. + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | If you have multiple user tables or models you may configure multiple + | providers to represent the model / table. These providers may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => env('AUTH_MODEL', App\Models\User::class), + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | These configuration options specify the behavior of Laravel's password + | reset functionality, including the table utilized for token storage + | and the user provider that is invoked to actually retrieve users. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the number of seconds before a password confirmation + | window expires and users are asked to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..b32aead --- /dev/null +++ b/config/cache.php @@ -0,0 +1,117 @@ + env('CACHE_STORE', 'database'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "array", "database", "file", "memcached", + | "redis", "dynamodb", "octane", + | "failover", "null" + | + */ + + 'stores' => [ + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_CACHE_CONNECTION'), + 'table' => env('DB_CACHE_TABLE', 'cache'), + 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), + 'lock_table' => env('DB_CACHE_LOCK_TABLE'), + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), + 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + 'failover' => [ + 'driver' => 'failover', + 'stores' => [ + 'database', + 'array', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, and DynamoDB cache + | stores, there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-cache-'), + +]; diff --git a/config/cors.php b/config/cors.php new file mode 100644 index 0000000..c0ee36c --- /dev/null +++ b/config/cors.php @@ -0,0 +1,34 @@ + ['api/*', 'sanctum/csrf-cookie'], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], // ← разрешает все домены (для dev) + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => [], + + 'max_age' => 0, + + 'supports_credentials' => false, + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..53dcae0 --- /dev/null +++ b/config/database.php @@ -0,0 +1,183 @@ + env('DB_CONNECTION', 'sqlite'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DB_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + 'busy_timeout' => null, + 'journal_mode' => null, + 'synchronous' => null, + 'transaction_mode' => 'DEFERRED', + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'mariadb' => [ + 'driver' => 'mariadb', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run on the database. + | + */ + + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as Memcached. You may define your connection settings here. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'), + 'persistent' => env('REDIS_PERSISTENT', false), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + ], + +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..3d671bd --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,80 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Below you may configure as many filesystem disks as necessary, and you + | may even configure multiple disks for the same driver. Examples for + | most supported storage drivers are configured here for reference. + | + | Supported drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app/private'), + 'serve' => true, + 'throw' => false, + 'report' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + 'throw' => false, + 'report' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + 'report' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..9e998a4 --- /dev/null +++ b/config/logging.php @@ -0,0 +1,132 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => env('LOG_DEPRECATIONS_TRACE', false), + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Laravel + | utilizes the Monolog PHP logging library, which includes a variety + | of powerful log handlers and formatters that you're free to use. + | + | Available drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", "custom", "stack" + | + */ + + 'channels' => [ + + 'stack' => [ + 'driver' => 'stack', + 'channels' => explode(',', (string) env('LOG_STACK', 'single')), + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => env('LOG_DAILY_DAYS', 14), + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), + 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'handler_with' => [ + 'stream' => 'php://stderr', + ], + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..522b284 --- /dev/null +++ b/config/mail.php @@ -0,0 +1,118 @@ + env('MAIL_MAILER', 'log'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "resend", "log", "array", + | "failover", "roundrobin" + | + */ + + 'mailers' => [ + + 'smtp' => [ + 'transport' => 'smtp', + 'scheme' => env('MAIL_SCHEME'), + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', '127.0.0.1'), + 'port' => env('MAIL_PORT', 2525), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'resend' => [ + 'transport' => 'resend', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + 'retry_after' => 60, + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + 'retry_after' => 60, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..9d5e589 --- /dev/null +++ b/config/queue.php @@ -0,0 +1,125 @@ + env('QUEUE_CONNECTION', 'database'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection options for every queue backend + | used by your application. An example configuration is provided for + | each backend supported by Laravel. You're also free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", + | "deferred", "failover", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_QUEUE_CONNECTION'), + 'table' => env('DB_QUEUE_TABLE', 'jobs'), + 'queue' => env('DB_QUEUE', 'default'), + 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), + 'queue' => env('BEANSTALKD_QUEUE', 'default'), + 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), + 'block_for' => null, + 'after_commit' => false, + ], + + 'deferred' => [ + 'driver' => 'deferred', + ], + + 'failover' => [ + 'driver' => 'failover', + 'connections' => [ + 'database', + 'deferred', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control how and where failed jobs are stored. Laravel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/sanctum.php b/config/sanctum.php new file mode 100644 index 0000000..44527d6 --- /dev/null +++ b/config/sanctum.php @@ -0,0 +1,84 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort(), + // Sanctum::currentRequestHost(), + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. This will override any values set in the token's + | "expires_at" attribute, but first-party sessions are not affected. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Token Prefix + |-------------------------------------------------------------------------- + | + | Sanctum can prefix new tokens in order to take advantage of numerous + | security scanning initiatives maintained by open source platforms + | that notify developers if they commit tokens into repositories. + | + | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning + | + */ + + 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, + 'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class, + 'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class, + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..6182e4b --- /dev/null +++ b/config/services.php @@ -0,0 +1,38 @@ + [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'resend' => [ + 'key' => env('RESEND_KEY'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..bc45901 --- /dev/null +++ b/config/session.php @@ -0,0 +1,217 @@ + env('SESSION_DRIVER', 'database'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to expire immediately when the browser is closed then you may + | indicate that via the expire_on_close configuration option. + | + */ + + 'lifetime' => (int) env('SESSION_LIFETIME', 120), + + 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it's stored. All encryption is performed + | automatically by Laravel and you may use the session like normal. + | + */ + + 'encrypt' => env('SESSION_ENCRYPT', false), + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When utilizing the "file" session driver, the session files are placed + | on disk. The default storage location is defined here; however, you + | are free to provide another location where they should be stored. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table to + | be used to store sessions. Of course, a sensible default is defined + | for you; however, you're welcome to change this to another table. + | + */ + + 'table' => env('SESSION_TABLE', 'sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | When using one of the framework's cache driven session backends, you may + | define the cache store which should be used to store the session data + | between requests. This must match one of your defined cache stores. + | + | Affects: "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the session cookie that is created by + | the framework. Typically, you should not need to change this value + | since doing so does not grant a meaningful security improvement. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug((string) env('APP_NAME', 'laravel')).'-session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application, but you're free to change this when necessary. + | + */ + + 'path' => env('SESSION_PATH', '/'), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | This value determines the domain and subdomains the session cookie is + | available to. By default, the cookie will be available to the root + | domain and all subdomains. Typically, this shouldn't be changed. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. It's unlikely you should disable this option. + | + */ + + 'http_only' => env('SESSION_HTTP_ONLY', true), + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" to permit secure cross-site requests. + | + | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => env('SESSION_SAME_SITE', 'lax'), + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..bba8134 --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,48 @@ + + */ +class UserFactory extends Factory +{ + /** + * The current password being used by the factory. + */ + protected static ?string $password; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => static::$password ??= Hash::make('password'), + 'remember_token' => Str::random(10), +<<<<<<< HEAD + 'custom_field' => 'user', +======= +>>>>>>> origin/main + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php new file mode 100644 index 0000000..90f8c61 --- /dev/null +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -0,0 +1,56 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); +<<<<<<< HEAD + $table->string('custom_field')->default('user'); // ← по умолчанию обычный пользователь + $table->rememberToken(); + $table->timestamps(); + +======= + $table->rememberToken(); + $table->timestamps(); +>>>>>>> origin/main + }); + + Schema::create('password_reset_tokens', function (Blueprint $table) { + $table->string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + + Schema::create('sessions', function (Blueprint $table) { + $table->string('id')->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->string('ip_address', 45)->nullable(); + $table->text('user_agent')->nullable(); + $table->longText('payload'); + $table->integer('last_activity')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + Schema::dropIfExists('password_reset_tokens'); + Schema::dropIfExists('sessions'); + } +}; diff --git a/database/migrations/0001_01_01_000001_create_cache_table.php b/database/migrations/0001_01_01_000001_create_cache_table.php new file mode 100644 index 0000000..b9c106b --- /dev/null +++ b/database/migrations/0001_01_01_000001_create_cache_table.php @@ -0,0 +1,35 @@ +string('key')->primary(); + $table->mediumText('value'); + $table->integer('expiration'); + }); + + Schema::create('cache_locks', function (Blueprint $table) { + $table->string('key')->primary(); + $table->string('owner'); + $table->integer('expiration'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cache'); + Schema::dropIfExists('cache_locks'); + } +}; diff --git a/database/migrations/0001_01_01_000002_create_jobs_table.php b/database/migrations/0001_01_01_000002_create_jobs_table.php new file mode 100644 index 0000000..425e705 --- /dev/null +++ b/database/migrations/0001_01_01_000002_create_jobs_table.php @@ -0,0 +1,57 @@ +id(); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + + Schema::create('job_batches', function (Blueprint $table) { + $table->string('id')->primary(); + $table->string('name'); + $table->integer('total_jobs'); + $table->integer('pending_jobs'); + $table->integer('failed_jobs'); + $table->longText('failed_job_ids'); + $table->mediumText('options')->nullable(); + $table->integer('cancelled_at')->nullable(); + $table->integer('created_at'); + $table->integer('finished_at')->nullable(); + }); + + Schema::create('failed_jobs', function (Blueprint $table) { + $table->id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jobs'); + Schema::dropIfExists('job_batches'); + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/database/migrations/2025_10_29_154420_create_component_types_table.php b/database/migrations/2025_10_29_154420_create_component_types_table.php new file mode 100644 index 0000000..2fa3291 --- /dev/null +++ b/database/migrations/2025_10_29_154420_create_component_types_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('name'); // Например: "Процессор", "Видеокарта" + $table->string('code')->unique(); // Уникальный код: cpu, gpu, ram и т.д. + $table->timestamps(); + }); + + // Заполняем таблицу начальными данными (seed) + DB::table('component_types')->insert([ + ['name' => 'Процессор', 'code' => 'cpu'], + ['name' => 'Видеокарта', 'code' => 'gpu'], + ['name' => 'Материнская плата', 'code' => 'motherboard'], + ['name' => 'ОЗУ', 'code' => 'ram'], + ['name' => 'Блок питания', 'code' => 'psu'], + ['name' => 'SSD', 'code' => 'ssd'], + ['name' => 'Корпус', 'code' => 'case'], + ]); + } + + public function down() + { + Schema::dropIfExists('component_types'); + } +}; diff --git a/database/migrations/2025_10_29_154421_create_components_table.php b/database/migrations/2025_10_29_154421_create_components_table.php new file mode 100644 index 0000000..ac06065 --- /dev/null +++ b/database/migrations/2025_10_29_154421_create_components_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('name'); + $table->decimal('price', 10, 2); + $table->unsignedBigInteger('component_type_id'); // ссылка на тип компонента + $table->json('specifications')->nullable(); // JSON-поле для характеристик + $table->boolean('is_official')->default(false); // официальный или нет + $table->unsignedBigInteger('created_by_user_id')->nullable(); // кто создал + $table->timestamps(); + + $table->foreign('component_type_id')->references('id')->on('component_types'); + $table->foreign('created_by_user_id')->references('id')->on('users')->onDelete('set null'); +}); + } + + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('components'); + } +}; diff --git a/database/migrations/2025_10_29_170250_add_custom_field_to_users_table.php b/database/migrations/2025_10_29_170250_add_custom_field_to_users_table.php new file mode 100644 index 0000000..7035542 --- /dev/null +++ b/database/migrations/2025_10_29_170250_add_custom_field_to_users_table.php @@ -0,0 +1,30 @@ +text('custom_field')->nullable()->default(null); + // + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('custom_field'); + // + }); + } +}; diff --git a/database/migrations/2025_10_29_172112_create_personal_access_tokens_table.php b/database/migrations/2025_10_29_172112_create_personal_access_tokens_table.php new file mode 100644 index 0000000..40ff706 --- /dev/null +++ b/database/migrations/2025_10_29_172112_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->text('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable()->index(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/database/migrations/2026_01_06_103303_create_component_types_table.php b/database/migrations/2026_01_06_103303_create_component_types_table.php new file mode 100644 index 0000000..2fa3291 --- /dev/null +++ b/database/migrations/2026_01_06_103303_create_component_types_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('name'); // Например: "Процессор", "Видеокарта" + $table->string('code')->unique(); // Уникальный код: cpu, gpu, ram и т.д. + $table->timestamps(); + }); + + // Заполняем таблицу начальными данными (seed) + DB::table('component_types')->insert([ + ['name' => 'Процессор', 'code' => 'cpu'], + ['name' => 'Видеокарта', 'code' => 'gpu'], + ['name' => 'Материнская плата', 'code' => 'motherboard'], + ['name' => 'ОЗУ', 'code' => 'ram'], + ['name' => 'Блок питания', 'code' => 'psu'], + ['name' => 'SSD', 'code' => 'ssd'], + ['name' => 'Корпус', 'code' => 'case'], + ]); + } + + public function down() + { + Schema::dropIfExists('component_types'); + } +}; diff --git a/database/migrations/2026_01_06_122343_create_pc_builds_table.php b/database/migrations/2026_01_06_122343_create_pc_builds_table.php new file mode 100644 index 0000000..11fe7dd --- /dev/null +++ b/database/migrations/2026_01_06_122343_create_pc_builds_table.php @@ -0,0 +1,26 @@ +id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->string('name'); // Например: "Игровой ПК 2025" + $table->text('description')->nullable(); // Описание + $table->boolean('is_ai_generated')->default(false); // true = сгенерировано ИИ + $table->text('ai_prompt')->nullable(); // Исходный запрос к ИИ + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('pc_builds'); + } +} \ No newline at end of file diff --git a/database/migrations/2026_01_07_064803_create_pc_build_components_table.php b/database/migrations/2026_01_07_064803_create_pc_build_components_table.php new file mode 100644 index 0000000..5204988 --- /dev/null +++ b/database/migrations/2026_01_07_064803_create_pc_build_components_table.php @@ -0,0 +1,30 @@ +id(); + $table->unsignedBigInteger('pc_build_id'); + $table->unsignedBigInteger('component_id'); + $table->timestamps(); + + // Внешние ключи + $table->foreign('pc_build_id')->references('id')->on('pc_builds')->onDelete('cascade'); + $table->foreign('component_id')->references('id')->on('components')->onDelete('cascade'); + + // Уникальность пары (build + component), если нужно + $table->unique(['pc_build_id', 'component_id']); + }); + } + + public function down() + { + Schema::dropIfExists('pc_build_components'); + } +} \ No newline at end of file diff --git a/database/migrations/2026_01_07_071225_create_ai_tasks_table.php b/database/migrations/2026_01_07_071225_create_ai_tasks_table.php new file mode 100644 index 0000000..032c5f4 --- /dev/null +++ b/database/migrations/2026_01_07_071225_create_ai_tasks_table.php @@ -0,0 +1,86 @@ +id(); + $table->string('name'); // ← БЫЛО 'title', СТАЛО 'name' + $table->text('description')->nullable(); + $table->text('ai_prompt_template'); + $table->decimal('budget_min', 10, 2)->nullable(); + $table->decimal('budget_max', 10, 2)->nullable(); + $table->boolean('is_active')->default(true); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('ai_tasks'); + } +}; +======= +use Illuminate\Support\Facades\DB; + +return new class extends Migration +{ + /** + * Run the migrations. + */ + public function up(): void + { + { + Schema::create('ai_tasks', function (Blueprint $table) { + $table->id(); + $table->foreignId('user_id')->nullable()->constrained()->onDelete('set null'); + $table->string('name'); + $table->text('prompt_template'); + $table->boolean('is_active')->default(true); + $table->timestamps(); + + // Индекс для поиска активных шаблонов + $table->index(['is_active']); + }); + + // Заполняем базовыми шаблонами от админа (user_id = NULL) + DB::table('ai_tasks')->insert([ + [ + 'name' => 'Игровой ПК до 50 000 ₽', + 'prompt_template' => 'Собери бюджетный игровой ПК до 50000 рублей. Цель: игры на средних настройках в 1080p.', + 'is_active' => true, + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'name' => 'Игровой ПК до 100 000 ₽', + 'prompt_template' => 'Собери мощный игровой ПК до 100000 рублей. Цель: игры на ультра в 1440p, 60+ FPS.', + 'is_active' => true, + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'name' => 'Офисный ПК', + 'prompt_template' => 'Собери надёжный ПК для офиса и учёбы. Бюджет до 40000 рублей. Важна тишина и энергоэффективность.', + 'is_active' => true, + 'created_at' => now(), + 'updated_at' => now(), + ], + ]); + } + } + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('ai_tasks'); + } +}; +>>>>>>> origin/main diff --git a/database/migrations/2026_01_10_133548_create_personal_access_tokens_table.php b/database/migrations/2026_01_10_133548_create_personal_access_tokens_table.php new file mode 100644 index 0000000..40ff706 --- /dev/null +++ b/database/migrations/2026_01_10_133548_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->text('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable()->index(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/database/migrations/2026_01_11_103828_create_personal_access_tokens_table.php b/database/migrations/2026_01_11_103828_create_personal_access_tokens_table.php new file mode 100644 index 0000000..40ff706 --- /dev/null +++ b/database/migrations/2026_01_11_103828_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->text('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable()->index(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/database/seeders/ComponentSeeder.php b/database/seeders/ComponentSeeder.php new file mode 100644 index 0000000..90c0ce8 --- /dev/null +++ b/database/seeders/ComponentSeeder.php @@ -0,0 +1,326 @@ +delete(); + DB::table('ai_tasks')->delete(); + + // 2. Теперь можно удалить родительскую таблицу + DB::table('component_types')->delete(); + + // 3. Вставляем типы с фиксированными ID + $componentTypes = [ + ['id' => 1, 'name' => 'Процессор', 'code' => 'cpu'], + ['id' => 2, 'name' => 'Видеокарта', 'code' => 'gpu'], + ['id' => 3, 'name' => 'Материнская плата', 'code' => 'motherboard'], + ['id' => 4, 'name' => 'ОЗУ', 'code' => 'ram'], + ['id' => 5, 'name' => 'Блок питания', 'code' => 'psu'], + ['id' => 6, 'name' => 'SSD', 'code' => 'ssd'], + ['id' => 7, 'name' => 'Корпус', 'code' => 'case'], + ['id' => 8, 'name' => 'Охлаждение', 'code' => 'cooling'], + ['id' => 9, 'name' => 'Сеть', 'code' => 'network'], + ['id' => 10, 'name' => 'Звуковая карта', 'code' => 'sound'] + ]; + + DB::table('component_types')->insert($componentTypes); + // 2. Добавляем 25 официальных компонентов + $components = [ + // Процессоры (ID=1) + [ + 'name' => 'AMD Ryzen 5 5600', + 'price' => 15000, + 'component_type_id' => 1, + 'specifications' => json_encode(['socket' => 'AM4', 'cores' => 6, 'tdp' => 65]), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'AMD Ryzen 7 7700X', + 'price' => 25000, + 'component_type_id' => 1, + 'specifications' => json_encode(['socket' => 'AM5', 'cores' => 8, 'tdp' => 105]), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'Intel Core i5-13400F', + 'price' => 18000, + 'component_type_id' => 1, + 'specifications' => json_encode(['socket' => 'LGA1700', 'cores' => 10, 'tdp' => 65]), + 'is_official' => true, + 'created_by_user_id' => null + ], + + // Видеокарты (ID=2) + [ + 'name' => 'NVIDIA RTX 4060', + 'price' => 30000, + 'component_type_id' => 2, + 'specifications' => json_encode(['memory_size' => '8GB', 'gpu_clock_speed' => 2445]), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'NVIDIA RTX 4070 Ti', + 'price' => 45000, + 'component_type_id' => 2, + 'specifications' => json_encode(['memory_size' => '12GB', 'gpu_clock_speed' => 2610]), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'AMD Radeon RX 7800 XT', + 'price' => 40000, + 'component_type_id' => 2, + 'specifications' => json_encode(['memory_size' => '16GB', 'gpu_clock_speed' => 2200]), + 'is_official' => true, + 'created_by_user_id' => null + ], + + // Материнские платы (ID=3) + [ + 'name' => 'ASUS TUF GAMING B660M-PLUS', + 'price' => 8000, + 'component_type_id' => 3, + 'specifications' => json_encode(['chipset' => 'B660', 'form_factor' => 'mATX']), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'MSI B750 TOMAHAWK', + 'price' => 12000, + 'component_type_id' => 3, + 'specifications' => json_encode(['chipset' => 'B750', 'form_factor' => 'ATX']), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'Gigabyte X670E AORUS PRO', + 'price' => 15000, + 'component_type_id' => 3, + 'specifications' => json_encode(['chipset' => 'X670E', 'form_factor' => 'ATX']), + 'is_official' => true, + 'created_by_user_id' => null + ], + + // ОЗУ (ID=4) + [ + 'name' => 'Kingston FURY Beast DDR4 16GB', + 'price' => 5000, + 'component_type_id' => 4, + 'specifications' => json_encode(['type' => 'DDR4', 'capacity' => '16GB', 'speed' => 3200]), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'Corsair Vengeance RGB Pro 32GB DDR5-6000', + 'price' => 15000, + 'component_type_id' => 4, + 'specifications' => json_encode(['type' => 'DDR5', 'capacity' => '32GB', 'speed' => 6000]), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'G.Skill Trident Z5 32GB DDR5-6000', + 'price' => 16000, + 'component_type_id' => 4, + 'specifications' => json_encode(['type' => 'DDR5', 'capacity' => '32GB', 'speed' => 6000]), + 'is_official' => true, + 'created_by_user_id' => null + ], + + // Блоки питания (ID=5) + [ + 'name' => 'EVGA SuperNOVA 750 G2', + 'price' => 8000, + 'component_type_id' => 5, + 'specifications' => json_encode(['wattage' => 750, 'efficiency' => '80+ Gold']), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'Seasonic FOCUS GX-850', + 'price' => 10000, + 'component_type_id' => 5, + 'specifications' => json_encode(['wattage' => 850, 'efficiency' => '80+ Gold']), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'Corsair RM850x', + 'price' => 12000, + 'component_type_id' => 5, + 'specifications' => json_encode(['wattage' => 850, 'efficiency' => '80+ Gold']), + 'is_official' => true, + 'created_by_user_id' => null + ], + + // SSD (ID=6) + [ + 'name' => 'Samsung 980 PRO 1TB', + 'price' => 10000, + 'component_type_id' => 6, + 'specifications' => json_encode(['interface' => 'NVMe PCIe 4.0 x4', 'capacity' => 1000]), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'Crucial P3 500GB NVMe', + 'price' => 4000, + 'component_type_id' => 6, + 'specifications' => json_encode(['interface' => 'NVMe PCIe 3.0 x4', 'capacity' => 500]), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'WD Black SN850X 1TB', + 'price' => 12000, + 'component_type_id' => 6, + 'specifications' => json_encode(['interface' => 'NVMe PCIe 4.0 x4', 'capacity' => 1000]), + 'is_official' => true, + 'created_by_user_id' => null + ], + + // Корпуса (ID=7) + [ + 'name' => 'Cooler Master H500P ATX Mid Tower Case', + 'price' => 4000, + 'component_type_id' => 7, + 'specifications' => json_encode(['form_factor' => 'ATX', 'cooling_type' => 'Air']), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'be quiet! Dark Base Pro 9', + 'price' => 12000, + 'component_type_id' => 7, + 'specifications' => json_encode(['form_factor' => 'ATX', 'max_power' => 800]), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'Fractal Design Pop Air', + 'price' => 5000, + 'component_type_id' => 7, + 'specifications' => json_encode(['form_factor' => 'ATX', 'cooling_type' => 'Air']), + 'is_official' => true, + 'created_by_user_id' => null + ], + + // Охлаждение (ID=8) + [ + 'name' => 'Noctua NH-D15', + 'price' => 7000, + 'component_type_id' => 8, + 'specifications' => json_encode(['type' => 'Air', 'tdp' => 200]), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'Deepcool Assassin III', + 'price' => 5000, + 'component_type_id' => 8, + 'specifications' => json_encode(['type' => 'Air', 'tdp' => 150]), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'AIO Corsair iCUE H150i ELITE CAPELLIX', + 'price' => 15000, + 'component_type_id' => 8, + 'specifications' => json_encode(['type' => 'Liquid', 'radiator_size' => '360mm']), + 'is_official' => true, + 'created_by_user_id' => null + ], + + // Сеть (ID=9) + [ + 'name' => 'TP-Link Archer TX50E', + 'price' => 3000, + 'component_type_id' => 9, + 'specifications' => json_encode(['interface' => 'Wi-Fi 6', 'speed' => '2.5Gbps']), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'Intel I225-V', + 'price' => 2000, + 'component_type_id' => 9, + 'specifications' => json_encode(['interface' => 'Ethernet', 'speed' => '2.5Gbps']), + 'is_official' => true, + 'created_by_user_id' => null + ], + + // Звуковые карты (ID=10) + [ + 'name' => 'Creative Sound Blaster Z', + 'price' => 8000, + 'component_type_id' => 10, + 'specifications' => json_encode(['interface' => 'PCIe', 'sample_rate' => '192kHz']), + 'is_official' => true, + 'created_by_user_id' => null + ], + [ + 'name' => 'ASUS Xonar SE', + 'price' => 5000, + 'component_type_id' => 10, + 'specifications' => json_encode(['interface' => 'PCIe', 'sample_rate' => '96kHz']), + 'is_official' => true, + 'created_by_user_id' => null + ] + ]; + + foreach ($components as $component) { + DB::table('components')->insert($component); + } + + // 3. Добавляем 4 задачи в ai_tasks + // 3. Добавляем 4 задачи в ai_tasks +$aiTasks = [ + [ + + 'name' => 'Игровая сборка до 80000 рублей', + 'ai_prompt_template' => 'Подобрать оптимальную сборку для игр в 1080p до 80000 рублей.', + 'is_active' => true, + 'created_at' => now(), + 'updated_at' => now() + ], + [ + + 'name' => 'Офисная сборка до 30000 рублей', + 'ai_prompt_template' => 'Подобрать бюджетную сборку для офисных задач и интернета.', + 'is_active' => true, + 'created_at' => now(), + 'updated_at' => now() + ], + [ + + 'name' => 'Рабочая станция для видеомонтажа', + 'ai_prompt_template' => 'Подобрать мощную сборку для редактирования 4K видео.', + 'is_active' => true, + 'created_at' => now(), + 'updated_at' => now() + ], + [ + + 'name' => 'Игровая сборка до 1500$', + 'ai_prompt_template' => 'Подобрать топовую сборку для игр в 4K до 1500$.', + 'is_active' => true, + 'created_at' => now(), + 'updated_at' => now() + ] +]; + + foreach ($aiTasks as $task) { + DB::table('ai_tasks')->insert($task); + } + } +} \ No newline at end of file diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..1952575 --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,32 @@ +>>>>>> origin/main + + /** + * Seed the application's database. + */ + public function run(): void + { +<<<<<<< HEAD + $this->call(ComponentSeeder::class); +======= +>>>>>>> origin/main + // User::factory(10)->create(); + + User::factory()->create([ + 'name' => 'Test User', + 'email' => 'test@example.com', + ]); + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..1157aae --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,135 @@ +services: + + #################################################################################################### + # PHP + #################################################################################################### + php: + build: .docker/php + ports: + - 5173:5173 + volumes: + - .:/var/www:cached + + #################################################################################################### + # Nginx + #################################################################################################### + nginx: + image: nginx + ports: + - 80:80 + volumes: + - .:/var/www + - .docker/nginx/default.conf:/etc/nginx/conf.d/default.conf + - .docker/nginx/nginx.conf:/etc/nginx/nginx.conf + depends_on: + - php + + #################################################################################################### + # DATABASE (MySQL) + #################################################################################################### + db: + image: mysql:8.1 + ports: + - 3306:3306 + volumes: + - .docker/db/data:/var/lib/mysql + - .docker/logs:/var/log/mysql + - .docker/db/my.cnf:/etc/mysql/conf.d/my.cnf + - .docker/db/sql:/docker-entrypoint-initdb.d + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: refactorian + MYSQL_USER: refactorian + MYSQL_PASSWORD: refactorian + + #################################################################################################### + # phpMyAdmin + #################################################################################################### + phpmyadmin: + image: phpmyadmin/phpmyadmin + ports: + - 8080:80 + links: + - db + environment: + PMA_HOST: db + PMA_PORT: 3306 + PMA_ARBITRARY: 1 + volumes: + - .docker/phpmyadmin/sessions:/sessions + + #################################################################################################### + # Adminer + #################################################################################################### + adminer: + image: adminer + ports: + - 9090:8080 + depends_on: + - db + + #################################################################################################### + # Mailpit + #################################################################################################### + mail: + image: axllent/mailpit:latest + ports: + - 8025:8025 + - 1025:1025 + + #################################################################################################### + # Redis + #################################################################################################### + redis: + image: redis:latest + command: redis-server --appendonly yes + volumes: + - .docker/redis/data:/data + ports: + - 6379:6379 + + # #################################################################################################### + # # DATABASE (MariaDB) + # #################################################################################################### + # db: + # image: mariadb:10.11 + # ports: + # - 3306:3306 + # volumes: + # - .docker/db/data:/var/lib/mysql + # - .docker/logs:/var/log/mysql + # - .docker/db/my.cnf:/etc/mysql/conf.d/my.cnf + # - .docker/db/sql:/docker-entrypoint-initdb.d + # environment: + # MYSQL_ROOT_PASSWORD: root + # MYSQL_DATABASE: laravel_db_name + # MYSQL_USER: laravel_db_user + # MYSQL_PASSWORD: laravel_db_pass + + #################################################################################################### + # PostgreSQL + #################################################################################################### + # db: + # image: postgres:16 + # ports: + # - 5432:5432 + # volumes: + # - .docker/db/data:/var/lib/postgresql/data + # - .docker/db/sql:/docker-entrypoint-initdb.d + # environment: + # - POSTGRES_USER=refactorian + # - POSTGRES_PASSWORD=refactorian + # - POSTGRES_DB=refactorian + + #################################################################################################### + # pgAdmin + #################################################################################################### + # pgadmin: + # image: dpage/pgadmin4 + # ports: + # - 5050:80 + # environment: + # - PGADMIN_DEFAULT_EMAIL=admin@admin.com + # - PGADMIN_DEFAULT_PASSWORD=password + # depends_on: + # - db diff --git a/docker.tar.gz b/docker.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..2002da68c9be00dfb4e2665d83c4d05a5e98559e GIT binary patch literal 4140 zcmY+Hc|6p67su`UmNjLM5H4dW3`SgQmfMvrF|uaKTF5q15^jsJMK?=Gg*3?sF~npE zLzZY{?9mKjEMv^f_nDsiJg?{V{Ci&Kd%ov)zQ1!m?<1eX!y;ZI9>T)D?j073H%^R$ zj;-Yr+R9M(g9=DSRkm4GqDkZ4Wm6&Vck9uydjWa*)wZ^N4x$2Qzq+A=5jL3pGrM4i z)7D$9e=qlxZkwfv9#U<_=Mset$In*or~X@XMAUm1xeKoAae_UFA(H!5;x?%fYnawV?5Y`HZqO4hfs7lYoZn-Te8wY1k2B@(Wap!}px?F#jaSUFws}!1W@)Q8{Ks&ihaQI4*=0`+#O|!_-X3z#8Jv2vE_Vo@F zjo)9_*|K;~uC7MILl0Lp9Ge~6FyLd(R@%%aCiUBdPt!g3?a}i#Mc3)q-BS>N>$N zdQP)+%E}HAqZ*u9lo{;r3WHtys=7H#EGpAR7#=1k#-~!cACFb+4E*k{KwhHz>z>(U zuZr|WAx`u)b+|tJt7fNc?b8PeVG;`MQ`2)18@~ip*Bd+_ai$lu|Jpq$i@4G{hbS=r ziMi7ITB##--`PH+XJiSaPpIfH08)$SNM5b*&RTYLQz`hT}M zIIjP4;sCX0PEv7iJ2ctev4XH#?|*X5u+-M9>HU@lq-7od?__u<_!`6v_P?)0SP_AP z3)7;rh={;wN)yQ#r)K;SX4cI3VVY#j`aV064C}r^{BNFFj5hi4T>mL0k)Htm#mglqZwo6g)ap>`3rScn_XtLCZfaQjVLl0DM-j_!T`51+%neNC3N z$jKb)&~xUzq>@El8m1x_5(XzvS#VtK>OYoXma3*GnP0P*7xk#u?tNOu8S#R^+t9>E z7ZvU5@)Jb{`Mr}LsNX)X5^~p42G6)anE^H`v7Vks-h5@~*VkKA<0jBMU0bHlKh{_> z5O_={D5xk(=ziFfaJ+d^oJdBvtly=>Cd_|=i~cHr5CeN{1~!j9n*uJp9H8OMN-v1{ zRR;O@Qs03?Gy`sMr6tafKk$VXA5A_yPdDKC@j9^1cZfO0!+?j?Edj5MU;Vax0GzxA zfje6lAl@^g2kRA9_a)eaiRA-CyVf4UH9ccbJ5VU$)&acn1nECNYB{JLWNk17csJ-X zL(ur^eIqsRgTO&nm=UPe8U`h;k3c;arXbZcEVe?w$ub($_$?D1%b~Ngf4<&5KuEFi z(Hl6@!IxuJ^fEl>J8Y^iJ0lW}J%nl8oCCYo=fS6=^s;e8edYC{72tpZ7}2HL7NDuP zl%(IKnD}C&TfSr4=+N!y`F!|2WM^;(M9~gCb+EDVN}@W25WA=Hv#(Ig>t;&iZWa{% zd|%>(qpS1&s9sf=?6oXR)uWTEJmMzOm0=bmS+c^A98zBRgkk6w%|!XmLBRCmPZOH8 zo@vT*WUFa$gU?foaINtYE~@tlFIK0#DgI2&0bGU*jWZ>n>(~uz$v=r}FH5ter}U%m zlvLUdQMKajen(ReTCX8bKKK7E zQCt60m97lz`qrgwlzRhGn8 zR-b|aY}c+AkwO|W3LP}rMh4HT3%M64W%tvk(uY-goVLpm6?`l?jEtV|G(=&lWILnP z<1L^>HqpV$@31=wz{W~s4_?3Zkls9$>YMi+wm_GkFrPyFr|yWGbnem|W-o8iYDBAi zS(JM4De%@4kQsi-k#KGozDc3aoi7)?q7GhtnPyCq;))}Nt>WWkHqPaKccQQhOV?aZ zJ$F<1+?u3=U*K}Bp|i(Xjz%&x$1_{<|*2H!0|>q|lqiAN3)pi+ojX~;l4Cd1w8nB(7%*1+LMXX*=J zxHE(ju>9>>pFGOIaqAk59SpM};bDVB#JucJFB13U3b@$(&6N{0urWLCIGG9`UIlL% zVbldiWMyU6u6%*7yzDnT>+>hd>y^Tpap|zG41NsX<2hh&5%+3sgLRiQY0x5_=PjqR z8m#f%W3Inx0Y9(Pl&Seap42ALmIR7)J3;-bl_L^zI z9yl{q5+qjYFp6}kuy)3|NbL=9Q+|uFZ~s$(9{719iHG2?>i9Z`>fbX{8m2vx)}y9e zK@!_j;x_)!;Vfa7cxTu)eSZX7aECNv72-Q~JfQdJv>Cn=VofsT6uG6{ljZlpOV@yh1nw_dJLdr!uA+~dF}%Sx|%6+{zd(R9w3G{x%#)%b94 zq;QI`)vRw}G1v(aQ{mW!#N2iE+ti5LS5B7CH9YGc`M}BPB*N)c9XW@%NN%k4aVfkp zSNh~+mHNCF-sax-S5mR=dpi2bjNcE>PW~E36*mYHEfJGP zjB@ug#$z)GXY*XUC3toCcp~*AMF)ZjqPUFKmdg_&2~lGN-`1iUaqjjY8HMS`%Im+k zKNA}=;%IIUiuxoQBem*2pcFd_Jm!&V-*);Ld&-OdP9S$E@$MAD=>a$1$2;gMrM~OgOng z*ACu6{0X3m!D}?`Rk0oloOAY4Y1wuqkI$)Ale=toi7BaDa?20c&TCYMUoH1PESBYt zx06)({yF>{HrrfNh0~$fvs}|HBIK#09`52G*A2&~kmioGwBE(LEJildTkM{H6*pSg zkdaiMsZ$B|MVrG9_1MJNQsO~^?Ze{<`zGnKD%&EO6Z(F*_aipE6$Dz)j~^K$Br^{_ zU*Ve4&4F+)@oSF0Cds?)9jEiXlc6Z*Wzuy-G34go`g@}~4wZ^fbZ3@Y>n@xAj`@YY z({1M0DDzwMy3`L1F`B!DUB9qw`dkGRZ7WeKB}(B z2`Da3+*Tfyi=0nxa}Hbhq^wD)vrj-e_nC<+eSBqe!$^rl8MBD`E^$50vTbwGMDq6s zGBIs3k6X-SihJjyRUP-tg&J8zwpAlue!wED2JdEAm?e4mKm_8fIo3BC-uA|iV(LCq zlf@=1eu#;g?!1v!l+q|$+g~Lu>?G~X-tTr$Ek4<|!+~lKyVfv~ZfnnTS>4W`yD=AI z6^*oZYpb8B1PdubVZYs#{Z`Dnczs`g)2GqZy}+dW;xG>tR~G5k$eB- zji|{=Ym?R93lwvuO{_J?=b^bG)S;ggbTQTwZYf7urBdRH@VB7KOHckCE?9m(Mr_ZqW2(DAji4iDR z?U1(}b@5;sBP$0FVrP3WoM_t{{7L9pJ!|%pJu;qSzumPl=np9vDn`kY7#H+n#fJNA zBaVwjjk>#hm_uG{4BNTftfNCpMf#M#6@qUz8a6sVb3(njVKKCKd3`qLfG>os{RmYE18m2aMfd-hQj;KeK zfXHU~sWfoB)sTs9Of`yRs*zD8(4Gf5hrq$|Z*X3)lwJaJDL;`_|D^x|m*R6j;!n-r z_LrW1gU<`!mTM`$f%rLqEjkG)vVivP%hwtG~OMtYl>2YZstcb?J|0{FC?qjndJG z#r-xyt89nF$`0%(zHS?h;G5&35yWX2rGK;W2&gY(duIl|7^gEQ*)K45T?A-n)?|B7 zgagF5o + + + + + + frontend + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..f9f8133 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,3255 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "axios": "^1.13.2", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router-dom": "^7.12.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "vite": "^7.2.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", + "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", + "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.5", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.53", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", + "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001763", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001763.tgz", + "integrity": "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.3" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.12.0.tgz", + "integrity": "sha512-kTPDYPFzDVGIIGNLS5VJykK0HfHLY5MF3b+xj0/tTyNYL1gF1qs7u67Z9jEhQk2sQ98SUaHxlG31g1JtF7IfVw==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.12.0.tgz", + "integrity": "sha512-pfO9fiBcpEfX4Tx+iTYKDtPbrSLLCbwJ5EqP+SPYQu1VYCXdy79GSj0wttR0U4cikVdlImZuEZ/9ZNCgoaxwBA==", + "license": "MIT", + "dependencies": { + "react-router": "7.12.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..7133573 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,29 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "axios": "^1.13.2", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router-dom": "^7.12.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "vite": "^7.2.4" + } +} diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/frontend/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/App.css b/frontend/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/frontend/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx new file mode 100644 index 0000000..e67cd60 --- /dev/null +++ b/frontend/src/App.jsx @@ -0,0 +1,26 @@ +import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'; +import Login from './pages/Login'; +import Register from './pages/Register'; +import Builds from './pages/Builds'; +import BuildNew from './pages/BuildNew'; +import Ai from './pages/Ai'; +import Layout from './components/Layout'; + +function App() { + return ( + + + + } /> {/* 👈 Добавили! */} + } /> + } /> + } /> + } /> + } /> + + + + ); +} + +export default App; \ No newline at end of file diff --git a/frontend/src/assets/react.svg b/frontend/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/frontend/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/components/ComponentSelector.jsx b/frontend/src/components/ComponentSelector.jsx new file mode 100644 index 0000000..cd4417f --- /dev/null +++ b/frontend/src/components/ComponentSelector.jsx @@ -0,0 +1,74 @@ +// src/components/ComponentSelector.jsx +import { useState, useEffect } from 'react'; +import axios from 'axios'; + +export default function ComponentSelector({ type, onSelect, onPriceChange, selectedId }) { + const [components, setComponents] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchComponents = async () => { + try { + const token = localStorage.getItem('token'); + if (!token) { + console.warn('Токен отсутствует. Компоненты не загружены.'); + setLoading(false); + return; + } + + const response = await axios.get('http://localhost/api/components', { + headers: { Authorization: `Bearer ${token}` }, + params: { type }, // фильтрация по code (cpu, gpu и т.д.) + }); + + setComponents(response.data); + } catch (err) { + console.error(`Ошибка загрузки компонентов типа "${type}":`, err); + } finally { + setLoading(false); + } + }; + + fetchComponents(); + }, [type]); + + const handleChange = (e) => { + const id = e.target.value ? parseInt(e.target.value, 10) : null; + + // Передаём ID в родительский компонент + onSelect(id); + + // Передаём цену, если компонент выбран + if (id !== null && onPriceChange) { + const selectedComp = components.find(comp => comp.id === id); +if (selectedComp && onPriceChange) { + const price = parseFloat(selectedComp.price); // ← преобразуем в число + onPriceChange(id, price); +} + } + }; + + if (loading) { + return ( + + ); + } + + return ( + + ); +} \ No newline at end of file diff --git a/frontend/src/components/Layout.jsx b/frontend/src/components/Layout.jsx new file mode 100644 index 0000000..e8a7810 --- /dev/null +++ b/frontend/src/components/Layout.jsx @@ -0,0 +1,27 @@ +// src/components/Layout.jsx +import { Link } from 'react-router-dom'; + +export default function Layout({ children }) { + return ( +
+ {/* Боковое меню */} + + + {/* Основной контент */} +
+ {children} +
+
+ ); +} \ No newline at end of file diff --git a/frontend/src/index.css b/frontend/src/index.css new file mode 100644 index 0000000..08a3ac9 --- /dev/null +++ b/frontend/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx new file mode 100644 index 0000000..b9a1a6d --- /dev/null +++ b/frontend/src/main.jsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.jsx' + +createRoot(document.getElementById('root')).render( + + + , +) diff --git a/frontend/src/pages/Ai.jsx b/frontend/src/pages/Ai.jsx new file mode 100644 index 0000000..5b85cff --- /dev/null +++ b/frontend/src/pages/Ai.jsx @@ -0,0 +1,137 @@ +// src/pages/AiSuggest.jsx +import { useState } from 'react'; +import axios from 'axios'; + +export default function AiSuggest() { + const [task, setTask] = useState(''); // выбранный тип задачи + const [budget, setBudget] = useState(''); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(''); + + const tasks = [ + { id: 'gaming', label: 'Игровой' }, + { id: 'office', label: 'Офисный' }, + { id: 'study', label: 'Для учёбы' }, + ]; + + const handleSubmit = async (e) => { + e.preventDefault(); + + if (!task) { + setError('Выберите задачу'); + return; + } + + if (!budget || isNaN(budget) || budget < 1000) { + setError('Введите корректный бюджет (от 1000 ₽)'); + return; + } + + setLoading(true); + setError(''); + + try { + const token = localStorage.getItem('token'); + if (!token) { + throw new Error('Вы не авторизованы'); + } + + const response = await axios.post( + 'http://localhost:8000/api/ai/suggest', + { + task_id: task, + budget: parseFloat(budget), + }, + { + headers: { Authorization: `Bearer ${token}` } + } + ); + + // Перенаправляем на просмотр новой сборки + window.location.href = `/build/${response.data.build.id}`; + } catch (err) { + console.error('Ошибка получения сборки от ИИ:', err); + + const message = + err.response?.data?.message || + err.message || + 'ИИ временно недоступен. Попробуйте позже.'; + + setError(message); + } finally { + setLoading(false); + } + }; + + return ( +
+

ИИ-подбор сборки

+ +
+
+

Выберите задачу:

+
+ {tasks.map((t) => ( + + ))} +
+
+ +
+ + setBudget(e.target.value)} + min="1000" + step="1000" + required + style={{ + width: '100%', + padding: '8px', + fontSize: '16px', + border: '1px solid #ccc', + borderRadius: '4px', + }} + /> +
+ + {error &&
{error}
} + + +
+
+ ); +} \ No newline at end of file diff --git a/frontend/src/pages/BuildNew.jsx b/frontend/src/pages/BuildNew.jsx new file mode 100644 index 0000000..8cac154 --- /dev/null +++ b/frontend/src/pages/BuildNew.jsx @@ -0,0 +1,185 @@ +// src/pages/BuildNew.jsx +import { useState, useEffect } from 'react'; +import axios from 'axios'; +import ComponentSelector from '../components/ComponentSelector'; + +export default function BuildNew() { + const [name, setName] = useState(''); + const [selectedComponents, setSelectedComponents] = useState({ + cpu: null, + gpu: null, + motherboard: null, + ram: null, + psu: null, + storage: null, + case: null, + }); + const [componentPrices, setComponentPrices] = useState({}); + const [totalPrice, setTotalPrice] = useState(0); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(''); + + // Пересчитываем общую стоимость при изменении выбранных компонентов или цен + useEffect(() => { + let total = 0; + for (const type in selectedComponents) { + const id = selectedComponents[type]; + if (id && componentPrices[id]) { + total += componentPrices[id]; + } + } + setTotalPrice(total); + }, [selectedComponents, componentPrices]); + + const handleSelect = (type, id) => { + setSelectedComponents(prev => ({ ...prev, [type]: id })); + }; + + const handleComponentPrice = (id, price) => { + setComponentPrices(prev => ({ ...prev, [id]: price })); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + + if (!name.trim()) { + setError('Введите название сборки'); + return; + } + + const ids = Object.values(selectedComponents).filter(id => id !== null); + if (ids.length !== 7) { + setError('Выберите все 7 компонентов'); + return; + } + + const token = localStorage.getItem('token'); + if (!token) { + setError('Вы не авторизованы'); + return; + } + + setLoading(true); + setError(''); + + try { + await axios.post( + 'http://localhost/api/builds', + { + name: name.trim(), + component_ids: ids, + }, + { + headers: { Authorization: `Bearer ${token}` } + } + ); + + alert('Сборка успешно создана!'); + window.location.href = '/builds'; + } catch (err) { + console.error('Ошибка создания сборки:', err.response?.data || err.message); + const message = + err.response?.data?.message || + err.response?.data?.errors?.component_ids?.[0] || + 'Ошибка при создании сборки. Проверьте выбранные компоненты.'; + setError(message); + } finally { + setLoading(false); + } + }; + + const isFormValid = name.trim() && Object.values(selectedComponents).every(id => id !== null); + + return ( +
+

Конструктор сборки (ручной)

+ +
+
+ setName(e.target.value)} + required + style={{ + width: '100%', + padding: '8px', + fontSize: '16px', + border: '1px solid #ccc', + borderRadius: '4px', + }} + /> +
+ +

Выберите компоненты:

+
+ handleSelect('cpu', id)} + onPriceChange={handleComponentPrice} + selectedId={selectedComponents.cpu} + /> + handleSelect('gpu', id)} + onPriceChange={handleComponentPrice} + selectedId={selectedComponents.gpu} + /> + handleSelect('motherboard', id)} + onPriceChange={handleComponentPrice} + selectedId={selectedComponents.motherboard} + /> + handleSelect('ram', id)} + onPriceChange={handleComponentPrice} + selectedId={selectedComponents.ram} + /> + handleSelect('psu', id)} + onPriceChange={handleComponentPrice} + selectedId={selectedComponents.psu} + /> + handleSelect('storage', id)} + onPriceChange={handleComponentPrice} + selectedId={selectedComponents.storage} + /> + handleSelect('case', id)} + onPriceChange={handleComponentPrice} + selectedId={selectedComponents.case} + /> +
+ +
+ Общая стоимость: {totalPrice.toLocaleString()} ₽ +
+ + {error &&
{error}
} + + +
+
+ ); +} \ No newline at end of file diff --git a/frontend/src/pages/Builds.jsx b/frontend/src/pages/Builds.jsx new file mode 100644 index 0000000..ca790bc --- /dev/null +++ b/frontend/src/pages/Builds.jsx @@ -0,0 +1,116 @@ +// src/pages/Builds.jsx +import { useState, useEffect } from 'react'; +import axios from 'axios'; + +export default function Builds() { + const [builds, setBuilds] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + const fetchBuilds = async () => { + try { + const token = localStorage.getItem('token'); + if (!token) { + setError('Вы не авторизованы. Перейдите на страницу входа.'); + setLoading(false); + return; + } + + const response = await axios.get('http://localhost/api/builds', { + headers: { Authorization: `Bearer ${token}` } + }); + + setBuilds(response.data); + } catch (err) { + console.error('Ошибка загрузки сборок:', err); + setError('Не удалось загрузить сборки. Проверьте подключение к серверу.'); + } finally { + setLoading(false); + } + }; + + fetchBuilds(); + }, []); + + if (loading) { + return
Загрузка сборок...
; + } + + if (error) { + return
Ошибка: {error}
; + } + + if (builds.length === 0) { + return ( +
+

Мои сборки ПК

+

У вас пока нет ни одной сборки. Создайте первую!

+
+ ); + } + + return ( +
+

Мои сборки ПК

+ +
+ {builds.map((build) => ( +
+

{build.name || 'Без названия'}

+ {build.description &&

Описание: {build.description}

} + +
+ Компоненты: +
    + {build.components?.map((comp) => ( +
  • + {comp.name} ({comp.component_type?.name || `Тип ${comp.component_type_id}`}) +
  • + ))} +
+
+ + +
+ ))} +
+
+ ); +} \ No newline at end of file diff --git a/frontend/src/pages/Login.jsx b/frontend/src/pages/Login.jsx new file mode 100644 index 0000000..02c8f88 --- /dev/null +++ b/frontend/src/pages/Login.jsx @@ -0,0 +1,45 @@ +// src/pages/Login.jsx +import { useState } from 'react'; +import axios from 'axios'; + +export default function Login() { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + + const handleSubmit = async (e) => { + e.preventDefault(); + try { + const res = await axios.post('http://localhost/api/login', { + email, + password, + }); + localStorage.setItem('token', res.data.token); + window.location.href = '/builds'; + } catch (err) { + alert('Ошибка входа'); + } + }; + + return ( +
+

Вход

+
+ setEmail(e.target.value)} + required + /> + setPassword(e.target.value)} + required + /> + +
+
+ ); +} \ No newline at end of file diff --git a/frontend/src/pages/Register.jsx b/frontend/src/pages/Register.jsx new file mode 100644 index 0000000..11ace89 --- /dev/null +++ b/frontend/src/pages/Register.jsx @@ -0,0 +1,66 @@ +// src/pages/Register.jsx +import { useState } from 'react'; +import axios from 'axios'; + +export default function Register() { + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); + + const handleSubmit = async (e) => { + e.preventDefault(); + if (password !== confirmPassword) { + alert('Пароли не совпадают'); + return; + } + try { + await axios.post('http://localhost/api/register', { + name, + email, + password, + password_confirmation: confirmPassword, + }); + alert('Регистрация успешна'); + window.location.href = '/login'; + } catch (err) { + alert('Ошибка регистрации'); + } + }; + + return ( +
+

Регистрация

+
+ setName(e.target.value)} + required + /> + setEmail(e.target.value)} + required + /> + setPassword(e.target.value)} + required + /> + setConfirmPassword(e.target.value)} + required + /> + +
+
+ ); +} \ No newline at end of file diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 0000000..8b0f57b --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..659264a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2226 @@ +{ + "name": "dkozlov.stand.kosipov.ru", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@tailwindcss/vite": "^4.0.0", + "axios": "^1.11.0", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^2.0.0", + "tailwindcss": "^4.0.0", + "vite": "^7.0.7" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", + "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", + "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", + "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", + "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", + "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", + "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", + "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", + "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", + "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", + "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", + "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", + "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", + "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", + "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", + "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", + "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", + "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", + "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", + "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", + "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", + "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.15.tgz", + "integrity": "sha512-HF4+7QxATZWY3Jr8OlZrBSXmwT3Watj0OogeDvdUY/ByXJHQ+LBtqA2brDb3sBxYslIFx6UP94BJ4X6a4L9Bmw==", + "dev": true, + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.0", + "lightningcss": "1.30.2", + "magic-string": "^0.30.19", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.15" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.15.tgz", + "integrity": "sha512-krhX+UOOgnsUuks2SR7hFafXmLQrKxB4YyRTERuCE59JlYL+FawgaAlSkOYmDRJdf1Q+IFNDMl9iRnBW7QBDfQ==", + "dev": true, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.15", + "@tailwindcss/oxide-darwin-arm64": "4.1.15", + "@tailwindcss/oxide-darwin-x64": "4.1.15", + "@tailwindcss/oxide-freebsd-x64": "4.1.15", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.15", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.15", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.15", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.15", + "@tailwindcss/oxide-linux-x64-musl": "4.1.15", + "@tailwindcss/oxide-wasm32-wasi": "4.1.15", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.15", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.15" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.15.tgz", + "integrity": "sha512-TkUkUgAw8At4cBjCeVCRMc/guVLKOU1D+sBPrHt5uVcGhlbVKxrCaCW9OKUIBv1oWkjh4GbunD/u/Mf0ql6kEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.15.tgz", + "integrity": "sha512-xt5XEJpn2piMSfvd1UFN6jrWXyaKCwikP4Pidcf+yfHTSzSpYhG3dcMktjNkQO3JiLCp+0bG0HoWGvz97K162w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.15.tgz", + "integrity": "sha512-TnWaxP6Bx2CojZEXAV2M01Yl13nYPpp0EtGpUrY+LMciKfIXiLL2r/SiSRpagE5Fp2gX+rflp/Os1VJDAyqymg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.15.tgz", + "integrity": "sha512-quISQDWqiB6Cqhjc3iWptXVZHNVENsWoI77L1qgGEHNIdLDLFnw3/AfY7DidAiiCIkGX/MjIdB3bbBZR/G2aJg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.15.tgz", + "integrity": "sha512-ObG76+vPlab65xzVUQbExmDU9FIeYLQ5k2LrQdR2Ud6hboR+ZobXpDoKEYXf/uOezOfIYmy2Ta3w0ejkTg9yxg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.15.tgz", + "integrity": "sha512-4WbBacRmk43pkb8/xts3wnOZMDKsPFyEH/oisCm2q3aLZND25ufvJKcDUpAu0cS+CBOL05dYa8D4U5OWECuH/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.15.tgz", + "integrity": "sha512-AbvmEiteEj1nf42nE8skdHv73NoR+EwXVSgPY6l39X12Ex8pzOwwfi3Kc8GAmjsnsaDEbk+aj9NyL3UeyHcTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.15.tgz", + "integrity": "sha512-+rzMVlvVgrXtFiS+ES78yWgKqpThgV19ISKD58Ck+YO5pO5KjyxLt7AWKsWMbY0R9yBDC82w6QVGz837AKQcHg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.15.tgz", + "integrity": "sha512-fPdEy7a8eQN9qOIK3Em9D3TO1z41JScJn8yxl/76mp4sAXFDfV4YXxsiptJcOwy6bGR+70ZSwFIZhTXzQeqwQg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.15.tgz", + "integrity": "sha512-sJ4yd6iXXdlgIMfIBXuVGp/NvmviEoMVWMOAGxtxhzLPp9LOj5k0pMEMZdjeMCl4C6Up+RM8T3Zgk+BMQ0bGcQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.7", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.15.tgz", + "integrity": "sha512-sJGE5faXnNQ1iXeqmRin7Ds/ru2fgCiaQZQQz3ZGIDtvbkeV85rAZ0QJFMDg0FrqsffZG96H1U9AQlNBRLsHVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.15.tgz", + "integrity": "sha512-NLeHE7jUV6HcFKS504bpOohyi01zPXi2PXmjFfkzTph8xRxDdxkRsXm/xDO5uV5K3brrE1cCwbUYmFUSHR3u1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.15.tgz", + "integrity": "sha512-B6s60MZRTUil+xKoZoGe6i0Iar5VuW+pmcGlda2FX+guDuQ1G1sjiIy1W0frneVpeL/ZjZ4KEgWZHNrIm++2qA==", + "dev": true, + "dependencies": { + "@tailwindcss/node": "4.1.15", + "@tailwindcss/oxide": "4.1.15", + "tailwindcss": "4.1.15" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/axios": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-2.0.1.tgz", + "integrity": "sha512-zQuvzWfUKQu9oNVi1o0RZAJCwhGsdhx4NEOyrVQwJHaWDseGP9tl7XUPLY2T8Cj6+IrZ6lmyxlR1KC8unf3RLA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^7.0.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", + "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.5", + "@rollup/rollup-android-arm64": "4.52.5", + "@rollup/rollup-darwin-arm64": "4.52.5", + "@rollup/rollup-darwin-x64": "4.52.5", + "@rollup/rollup-freebsd-arm64": "4.52.5", + "@rollup/rollup-freebsd-x64": "4.52.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", + "@rollup/rollup-linux-arm-musleabihf": "4.52.5", + "@rollup/rollup-linux-arm64-gnu": "4.52.5", + "@rollup/rollup-linux-arm64-musl": "4.52.5", + "@rollup/rollup-linux-loong64-gnu": "4.52.5", + "@rollup/rollup-linux-ppc64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-musl": "4.52.5", + "@rollup/rollup-linux-s390x-gnu": "4.52.5", + "@rollup/rollup-linux-x64-gnu": "4.52.5", + "@rollup/rollup-linux-x64-musl": "4.52.5", + "@rollup/rollup-openharmony-arm64": "4.52.5", + "@rollup/rollup-win32-arm64-msvc": "4.52.5", + "@rollup/rollup-win32-ia32-msvc": "4.52.5", + "@rollup/rollup-win32-x64-gnu": "4.52.5", + "@rollup/rollup-win32-x64-msvc": "4.52.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.15.tgz", + "integrity": "sha512-k2WLnWkYFkdpRv+Oby3EBXIyQC8/s1HOFMBUViwtAh6Z5uAozeUSMQlIsn/c6Q2iJzqG6aJT3wdPaRNj70iYxQ==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, + "node_modules/vite": { + "version": "7.1.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", + "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", + "dev": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", + "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + }, + "node_modules/vite-plugin-full-reload/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..af0db45 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json.schemastore.org/package.json", + "private": true, + "type": "module", + "scripts": { + "build": "vite build", + "dev": "vite" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.0", + "axios": "^1.11.0", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^2.0.0", + "tailwindcss": "^4.0.0", + "vite": "^7.0.7" + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..d703241 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,35 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + + + + diff --git a/project b/project new file mode 100644 index 0000000..046517b --- /dev/null +++ b/project @@ -0,0 +1,5 @@ +Пользователь регистрируется → получает токен +Запрашивает список компонентов → получает общие компоненты +Добавляет редкий компонент, которого нет в базе → создаёт приватный компонент +Редактирует его при необходимости. +Админ может вручную “повысить” компонент до публичного, если он актуальный. \ No newline at end of file diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..b574a59 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,25 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Handle X-XSRF-Token Header + RewriteCond %{HTTP:x-xsrf-token} . + RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..ee8f07e --- /dev/null +++ b/public/index.php @@ -0,0 +1,20 @@ +handleRequest(Request::capture()); diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/resources/css/app.css b/resources/css/app.css new file mode 100644 index 0000000..3e6abea --- /dev/null +++ b/resources/css/app.css @@ -0,0 +1,11 @@ +@import 'tailwindcss'; + +@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; +@source '../../storage/framework/views/*.php'; +@source '../**/*.blade.php'; +@source '../**/*.js'; + +@theme { + --font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; +} diff --git a/resources/js/app.js b/resources/js/app.js new file mode 100644 index 0000000..e59d6a0 --- /dev/null +++ b/resources/js/app.js @@ -0,0 +1 @@ +import './bootstrap'; diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js new file mode 100644 index 0000000..5f1390b --- /dev/null +++ b/resources/js/bootstrap.js @@ -0,0 +1,4 @@ +import axios from 'axios'; +window.axios = axios; + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; diff --git a/resources/views/emails/register.blade.php b/resources/views/emails/register.blade.php new file mode 100644 index 0000000..450336b --- /dev/null +++ b/resources/views/emails/register.blade.php @@ -0,0 +1,9 @@ + + + + +

Добро пожаловать на сайт

+ +

Привет, ты зарегистрирован, {{ $name }}

+ + \ No newline at end of file diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php new file mode 100644 index 0000000..b7355d7 --- /dev/null +++ b/resources/views/welcome.blade.php @@ -0,0 +1,277 @@ + + + + + + + {{ config('app.name', 'Laravel') }} + + + + + + + @if (file_exists(public_path('build/manifest.json')) || file_exists(public_path('hot'))) + @vite(['resources/css/app.css', 'resources/js/app.js']) + @else + + @endif + + +
+ @if (Route::has('login')) + + @endif +
+
+
+
+

Let's get started

+

Laravel has an incredibly rich ecosystem.
We suggest starting with the following.

+ + +
+
+ {{-- Laravel Logo --}} + + + + + + + + + + + {{-- Light Mode 12 SVG --}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{-- Dark Mode 12 SVG --}} + +
+
+
+
+ + @if (Route::has('login')) + + @endif + + diff --git a/routes/api.php b/routes/api.php new file mode 100644 index 0000000..cb1cf9e --- /dev/null +++ b/routes/api.php @@ -0,0 +1,61 @@ +>>>>>> origin/main + +Route::get('/users', function (Request $request) { + return $request->user(); +})->middleware('auth:sanctum'); + + +Route::get('components/{id}', [ComponentsController::class, 'show']); + + + + +Route::post('users', [UsersController::class, 'create']); + + + + +Route::post('/register', [AuthController::class, 'register']); +Route::post('/login', [AuthController::class, 'login']); + +// Защита маршрутов — только для авторизованных +Route::middleware('auth:sanctum')->group(function () { + Route::post('/logout', [AuthController::class, 'logout']); +}); + + + +Route::middleware('auth:sanctum')->group(function () { + Route::get('/components', [ComponentsController::class, 'index']); + Route::post('/components', [ComponentsController::class, 'store']); + Route::put('/components/{id}', [ComponentsController::class, 'update']); + Route::delete('/components/{id}', [ComponentsController::class, 'destroy']); +}); + +<<<<<<< HEAD +Route::middleware('auth:sanctum')->group(function () { + Route::get('/builds', [PCBuildsController::class, 'index']); + Route::post('/builds', [PCBuildsController::class, 'store']); + Route::get('/builds/{id}', [PCBuildsController::class, 'show']); + Route::put('/builds/{id}', [PCBuildsController::class, 'update']); + Route::delete('/builds/{id}', [PCBuildsController::class, 'destroy']); +}); + +Route::middleware('auth:sanctum')->group(function () { + Route::post('/ai/suggest', [AiController::class, 'suggest']); +}); +======= +>>>>>>> origin/main + + diff --git a/routes/console.php b/routes/console.php new file mode 100644 index 0000000..3c9adf1 --- /dev/null +++ b/routes/console.php @@ -0,0 +1,8 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote'); diff --git a/routes/web.php b/routes/web.php new file mode 100644 index 0000000..86a06c5 --- /dev/null +++ b/routes/web.php @@ -0,0 +1,7 @@ +get('/'); + + $response->assertStatus(200); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..fe1ffc2 --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..29fbfe9 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; +import tailwindcss from '@tailwindcss/vite'; + +export default defineConfig({ + plugins: [ + laravel({ + input: ['resources/css/app.css', 'resources/js/app.js'], + refresh: true, + }), + tailwindcss(), + ], +});