From c0f367954d2285ba47a082a8a9d4f70fa14138fd Mon Sep 17 00:00:00 2001 From: luorijun Date: Fri, 14 Mar 2025 12:40:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=A7=E5=93=81=E5=92=8C=E6=8F=90=E5=8F=96?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +- components.json | 21 + package.json | 14 +- pnpm-lock.yaml | 804 ++++++++++++++++++ public/collect/warn.svg | 10 + public/product/alipay.svg | 10 + public/product/banner.webp | Bin 0 -> 41068 bytes public/product/check.svg | 10 + public/product/wechat.svg | 16 + src/app/(home)/page.tsx | 227 ----- src/app/(root)/collect/form-section.tsx | 311 +++++++ src/app/(root)/collect/page.tsx | 19 + src/app/{(home) => (root)}/footer.tsx | 0 src/app/{(home) => (root)}/header.tsx | 2 +- src/app/(root)/layout.tsx | 22 + src/app/(root)/page.tsx | 215 +++++ src/app/(root)/product/combo.tsx | 43 + src/app/(root)/product/page.tsx | 259 ++++++ src/app/globals.css | 123 ++- src/app/layout.tsx | 2 +- src/components/animation/page-switcher.tsx | 0 src/components/bread-crumb.tsx | 63 ++ src/components/dropdown/example-structure.tsx | 27 - src/components/ui/button.tsx | 59 ++ src/components/ui/form.tsx | 167 ++++ src/components/ui/input.tsx | 21 + src/components/ui/label.tsx | 24 + src/components/ui/radio-group.tsx | 45 + src/components/ui/select.tsx | 185 ++++ src/lib/utils.ts | 6 + 30 files changed, 2449 insertions(+), 280 deletions(-) create mode 100644 components.json create mode 100644 public/collect/warn.svg create mode 100644 public/product/alipay.svg create mode 100644 public/product/banner.webp create mode 100644 public/product/check.svg create mode 100644 public/product/wechat.svg delete mode 100644 src/app/(home)/page.tsx create mode 100644 src/app/(root)/collect/form-section.tsx create mode 100644 src/app/(root)/collect/page.tsx rename src/app/{(home) => (root)}/footer.tsx (100%) rename src/app/{(home) => (root)}/header.tsx (99%) create mode 100644 src/app/(root)/layout.tsx create mode 100644 src/app/(root)/page.tsx create mode 100644 src/app/(root)/product/combo.tsx create mode 100644 src/app/(root)/product/page.tsx delete mode 100644 src/components/animation/page-switcher.tsx create mode 100644 src/components/bread-crumb.tsx delete mode 100644 src/components/dropdown/example-structure.tsx create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/form.tsx create mode 100644 src/components/ui/input.tsx create mode 100644 src/components/ui/label.tsx create mode 100644 src/components/ui/radio-group.tsx create mode 100644 src/components/ui/select.tsx create mode 100644 src/lib/utils.ts diff --git a/README.md b/README.md index a34fcf6..fe0604e 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,3 @@ -## 功能布局 +## TODO -### 首页 - -- 页头 - - LOGO - - 菜单 - - 登录/注册 -- 正文 - - 优势介绍 - - 数据展示 - - 产品推荐 - - 客户案例 - - 合作伙伴 - - 新闻动态 -- 页脚 - - 关于我们 - - 网站地图 - - 备案/版权信息 - -### 后台 - -### 授权 +首页页头菜单导航的 bug diff --git a/components.json b/components.json new file mode 100644 index 0000000..421c026 --- /dev/null +++ b/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/app/globals.css", + "baseColor": "gray", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/package.json b/package.json index 25f1b59..b89de23 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,22 @@ "lint": "next lint" }, "dependencies": { + "@hookform/resolvers": "^4.1.3", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-radio-group": "^1.2.3", + "@radix-ui/react-select": "^2.1.6", + "@radix-ui/react-slot": "^1.1.2", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.479.0", "motion": "^12.5.0", "next": "15.2.1", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "react-hook-form": "^7.54.2", + "tailwind-merge": "^3.0.2", + "tailwindcss-animate": "^1.0.7", + "zod": "^3.24.2" }, "devDependencies": { "@eslint/eslintrc": "^3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c918398..ffe2657 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,30 @@ importers: .: dependencies: + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2(react@19.0.0)) + '@radix-ui/react-label': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-radio-group': + specifier: ^1.2.3 + version: 1.2.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-select': + specifier: ^2.1.6 + version: 2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': + specifier: ^1.1.2 + version: 1.1.2(@types/react@19.0.10)(react@19.0.0) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + lucide-react: + specifier: ^0.479.0 + version: 0.479.0(react@19.0.0) motion: specifier: ^12.5.0 version: 12.5.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -20,6 +44,18 @@ importers: react-dom: specifier: ^19.0.0 version: 19.0.0(react@19.0.0) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@19.0.0) + tailwind-merge: + specifier: ^3.0.2 + version: 3.0.2 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@4.0.9) + zod: + specifier: ^3.24.2 + version: 3.24.2 devDependencies: '@eslint/eslintrc': specifier: ^3 @@ -98,6 +134,26 @@ packages: resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@hookform/resolvers@4.1.3': + resolution: {integrity: sha512-Jsv6UOWYTrEFJ/01ZrnwVXs7KDvP8XIo115i++5PWvNkNvkrsTfGiLS6w+eJ57CYtUtDQalUWovCZDHFJ8u1VQ==} + peerDependencies: + react-hook-form: ^7.0.0 + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -309,12 +365,310 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@radix-ui/number@1.1.0': + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + + '@radix-ui/primitive@1.1.1': + resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + + '@radix-ui/react-arrow@1.1.2': + resolution: {integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.2': + resolution: {integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.1': + resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.5': + resolution: {integrity: sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.2': + resolution: {integrity: sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.2': + resolution: {integrity: sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.2': + resolution: {integrity: sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.4': + resolution: {integrity: sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.2': + resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.2': + resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-radio-group@1.2.3': + resolution: {integrity: sha512-xtCsqt8Rp09FK50ItqEqTJ7Sxanz8EM8dnkVIhJrc/wkMMomSmXHvYbhv3E7Zx4oXh98aaLt9W679SUYXg4IDA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.2': + resolution: {integrity: sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.1.6': + resolution: {integrity: sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.1.2': + resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.0': + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.1.2': + resolution: {integrity: sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} '@rushstack/eslint-patch@1.10.5': resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} + '@standard-schema/utils@0.3.0': + resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -488,6 +842,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -583,9 +941,16 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -662,6 +1027,9 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -908,6 +1276,10 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -1221,6 +1593,11 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lucide-react@0.479.0: + resolution: {integrity: sha512-aBhNnveRhorBOK7uA4gDjgaf+YlHMdMhQ/3cupk6exM10hWlEU+2QtWYOfhXhjAsmdb6LeKR+NZnow4UxRRiTQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -1400,9 +1777,45 @@ packages: peerDependencies: react: ^19.0.0 + react-hook-form@7.54.2: + resolution: {integrity: sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.6.3: + resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react@19.0.0: resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} @@ -1568,6 +1981,14 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + tailwind-merge@3.0.2: + resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + tailwindcss@4.0.9: resolution: {integrity: sha512-12laZu+fv1ONDRoNR9ipTOpUD7RN9essRVkX36sjxuRUInpN7hIiHN4lBd/SIFjbISvnXzp8h/hXzmU8SQQYhw==} @@ -1630,6 +2051,26 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -1659,6 +2100,9 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + snapshots: '@alloc/quick-lru@5.2.0': {} @@ -1710,6 +2154,28 @@ snapshots: '@eslint/core': 0.12.0 levn: 0.4.1 + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/dom': 1.6.13 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@floating-ui/utils@0.2.9': {} + + '@hookform/resolvers@4.1.3(react-hook-form@7.54.2(react@19.0.0))': + dependencies: + '@standard-schema/utils': 0.3.0 + react-hook-form: 7.54.2(react@19.0.0) + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -1842,10 +2308,276 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@radix-ui/number@1.1.0': {} + + '@radix-ui/primitive@1.1.1': {} + + '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-collection@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-context@1.1.1(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-direction@1.1.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-id@1.1.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-label@2.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-popper@1.2.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-arrow': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/rect': 1.1.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-portal@1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-radio-group@1.2.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-roving-focus@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-select@2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.0.10)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/react-slot@1.1.2(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-use-previous@1.1.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-use-rect@1.1.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-use-size@1.1.0(@types/react@19.0.10)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.10 + + '@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) + + '@radix-ui/rect@1.1.0': {} + '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.10.5': {} + '@standard-schema/utils@0.3.0': {} + '@swc/counter@0.1.3': {} '@swc/helpers@0.5.15': @@ -2028,6 +2760,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.4: + dependencies: + tslib: 2.8.1 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -2151,8 +2887,14 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + client-only@0.0.1: {} + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -2228,6 +2970,8 @@ snapshots: detect-libc@2.0.3: optional: true + detect-node-es@1.1.0: {} + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -2630,6 +3374,8 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -2923,6 +3669,10 @@ snapshots: dependencies: js-tokens: 4.0.0 + lucide-react@0.479.0(react@19.0.0): + dependencies: + react: 19.0.0 + math-intrinsics@1.1.0: {} merge2@1.4.1: {} @@ -3098,8 +3848,39 @@ snapshots: react: 19.0.0 scheduler: 0.25.0 + react-hook-form@7.54.2(react@19.0.0): + dependencies: + react: 19.0.0 + react-is@16.13.1: {} + react-remove-scroll-bar@2.3.8(@types/react@19.0.10)(react@19.0.0): + dependencies: + react: 19.0.0 + react-style-singleton: 2.2.3(@types/react@19.0.10)(react@19.0.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.10 + + react-remove-scroll@2.6.3(@types/react@19.0.10)(react@19.0.0): + dependencies: + react: 19.0.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.0.10)(react@19.0.0) + react-style-singleton: 2.2.3(@types/react@19.0.10)(react@19.0.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.0.10)(react@19.0.0) + use-sidecar: 1.1.3(@types/react@19.0.10)(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.10 + + react-style-singleton@2.2.3(@types/react@19.0.10)(react@19.0.0): + dependencies: + get-nonce: 1.0.1 + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.10 + react@19.0.0: {} reflect.getprototypeof@1.0.10: @@ -3328,6 +4109,12 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + tailwind-merge@3.0.2: {} + + tailwindcss-animate@1.0.7(tailwindcss@4.0.9): + dependencies: + tailwindcss: 4.0.9 + tailwindcss@4.0.9: {} tapable@2.2.1: {} @@ -3406,6 +4193,21 @@ snapshots: dependencies: punycode: 2.3.1 + use-callback-ref@1.3.3(@types/react@19.0.10)(react@19.0.0): + dependencies: + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.10 + + use-sidecar@1.1.3(@types/react@19.0.10)(react@19.0.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.10 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -3453,3 +4255,5 @@ snapshots: word-wrap@1.2.5: {} yocto-queue@0.1.0: {} + + zod@3.24.2: {} diff --git a/public/collect/warn.svg b/public/collect/warn.svg new file mode 100644 index 0000000..bfd4e3e --- /dev/null +++ b/public/collect/warn.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/product/alipay.svg b/public/product/alipay.svg new file mode 100644 index 0000000..7fac633 --- /dev/null +++ b/public/product/alipay.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/product/banner.webp b/public/product/banner.webp new file mode 100644 index 0000000000000000000000000000000000000000..dda4c631903950d44126c4354414951827139131 GIT binary patch literal 41068 zcmdSAWmp_d@Gm+G3oHZ@+}+&*gy3$$o#5{7!4^w!f?IG2?(P~OSb{qQ4ek(h@4n}M zpXZzp_ulWfXQ#KOr=PZ}nyLC#kGi~!j71&*=txVbYOC_=q5%NF2|qbNKs*4*OG>Ja zfZ&$^Xym^f48P^*z>>jv)}J|8Sf4tC5U?z@!LMG=syu}(0_(lymQEknHg!8Qm2Io2|+b`o?$TSp9wG+VuvWX zmZ!2{xpM*mb4w^ z6CK8zZbkM(jJ@N}O-3rqt*op{76MPsEUZ|qs!eXAQEoq)`{Y%fERx&8Tib}=7UEd@ zN!Ia;NwoRD=DXqf*@~A=&)kozYp}q2%>p(%x zfp#>3w#|AIp`Srx{_EN(Vwd}7~gTlb%p+5 zGdK~l8GC0abWQ?SrOox>$>r^VTA!FKKdK|YzkZ9WuY@FkS%-s?`7%%Sf*)A@KOrVz zoQbYrAOesA;Cg`o<&=QSISpX;`!&#yg%Dg@&uwO6X=!0uOePDVp#dZOv1w#Fp&9YC z+( zir<$`{HN&uKTIypDu`Ug`HF_Z)h~YD!fm8+4- z+4))Pzi)MY;cNBr`@DQCHXYVSF)VYjDN0F7NfRDqAFihaeT1;WZ#i!;Svi57(ziCl zBN4#~c>N<-5@FPme{HC=;+c)9@ZWtonSjYupIsrZKBw)rSXTnj1R5ebwj^zjA~KB) z$qmU|km=lAUWw&&6gC1D7$L!!hA0eA+!~XrmU_fLJ@KP#4TJ*(3V}*UMbhwULn`JY zgW#51ryxUTt>g3Vu=&1fT%ndur8b?k44RyX@u62l5AW z^vVZxyICH3UWEd}SO7vK3n5}5V!>hw$xpa+3!@YxOsTOF!#IrD7BRI@179 zadc%gP6S-Xj4>U;H?jZ`6blp#k-!Kovx*+g@Eq5{9qRPRFQ!luF)^nhR-mA!4xv_< zwJCMJOk-xSiWd<5E^8S(7g}H+7MY8g-ez3dww4tCSpd? zw;92w)A8sAARej_@uOL5o9vI@MMB~8cHSN14&UdOL7W_z<)l)Ii-wYbq#%$IrBT%g z{!Enn&*C1XDOd%Jsu?kVH1lr4WWyCKNk{o508+g7DO}W;`KmJlH$;uo@Jy)w@HMp^ zF;2ML!73>5?TV$FjWneh9d}%sXR=x;3b^jQLdbIrA+8t>t&J3CIoq$yyv%R1p>Ie* z23)|b?Q4jIM!%TS(X4=P1$@Fj7PCYT=&|ys;SeNo5Dyc&8hxiCvK8^cw~xPC3(-pw zASV2zyS-}4@?_F9imisG?#Oq)^KDqLhzjM7JB2vFP$;y(a$4cP_GZZ{W7}=bmkltDw7#)Gdu?M*AHIu?hLGO>@b>&)X|YB@iE+C?NQRM@O{46YntaQ6p_xcz3-wfJKivfny}ORtEr_< zire%WXOHC;^UPO27+F=xD8Infxv}7L?5PR(?`vv>k`uOPK?WC3#!9##MCMT7zBQbT z31ls8{fhz@Feo-Jdd$a?t>@ueFcLRo_py|4{P7q6huqViYP%&9e0~l0f#$BVfR`4h zmn&H9V^H_ngL%s({a(LRTAd-pEurfxMa5lbdS4H*WU73^#EgjGh4DJP|b7VTYvY>EUi=O)G{XBJte@x^*meKfBk)SBvGCH^Lk_l=Rq^mBm* zN6>C_&y!yVY7F9nfev`{Z9M3S*G0n1V0QlnRvOrSoz zl>j5N+cYDfOD7W+kAJKphT`={m`rO7J;#S~zah_8n!L?!(wpg+=}OCvtMb(MTjM(Q z*uPiS>J8DO>WI~rCXduRtbjsIG&jRkk z$R8t9<}_U#8`bRkYAEK{2i@cfcm zCdgR#AMYr+huQ=xnd-;Q=xkpHW1}H+@uSB;EC>hPYcmOCnutLV2%r!ZOI})nJ4T5f zof1KVKv$@hUrL_wCKGd!8}S(QPH3;&BtXSOV*^Kdyfz@)6*lAB5kw05RaC2xNl1i6 z2;#xYS1nALAJq>)j^BExSWpkfjEd%pextF46$}wW4VJ}KP>)G~^vlt{IBZga%o3U0 z%fF|Ou4{cZ5G-y*wd4LtEkhAe`op`~Z=ccA?WBlarEA!DJ(JpZt2f-f8Pn7AHDT`fV9S_jl;5p55;9bjdPxOBFvU~S3*-S|Dl!+_ zh!7#fLy}c}r1EI3!o{ot)1%R9BWp-R=yH%H88oAOJ-aCos&uU(8(OqGQGh7h<%XLmPylD0|+P`w; zliAohd&4(SFnyfa>jF#*DaP5Nh}6-aXdp2{5J1JDu|CL?^oJ~hqu3jTjvAMoiK`wv zpK)@ul1EvpXg(o^CWN{Vj2mHA_<^y6i|D<&dg*09AO=u=h(1f%tE+kb$Oz7ZfBAG%q}?P(e41iF6`-tl|#GSg50;BO$pW#%`#jQ0*q(-tY1+IiR zZ)taLJ9Y8i!?WLz)XC#m>JV(U%QvW`0_!cS^1fCn#@UyAT! zk(@M?@Kkj$GF2PE1Q1TMaX%k4HF#4W37Zorzr;V1-OpKH8wbsjo%M{%x4df39geiV zu3i~;Je^Q`xt00uAC#b8ffdsC?O2+RH^CK`TR9S&w<@VcNPRmY0>2Bz~CHbdf?xZ_(Z%rBv*da!S^xqRqj`yO7V@wJ!@O4v#G@ z{I|PdC?bX~MbYH^cYhm9w!0^mg7j-2o8O?zaB~-iB8D+IM31yjhf(6>NJJ8|RQb$u zd!ocA>rVVG<8LFRk%eRcVrU2nr<4U!k=S&&g0Hv;u0QQK;ILPs+Z(Jl;*fhKuH#un980`#y!nc<1Csk3MC z7zzY_PQiJ02UGqU#4?L|&fCLQ6VqklQb(v|=6VR58BAX9z_yZ$Ct>$8Ao&HD7Ehq| z{VL!XR(M;kH~^*(Aw^&?d&WdcOkJ|D!@{2w?GulPR1B!0fI}I3*%Ag5%kKwGJ3oBq zE5jLS)T=#d4u$kx3%@#Kz~tgKQ{6)NZR;+FmW-!XAOnBO)5o`mYU!@`+b8?IV>S*y zZoZU@l*QF1XUad9Lk&(zv>70kil4xoLqp3jQT52Umr)>86eODxMM^BD4kLsOe~`!T z_1q7ZzKV?&R7NBQfWw4_CKSq@PknTU=3ZlPYa8)X3AzSEl8OpUixqXBNk5#MeioL+ zwm7XWH6f)PP+&o2)Q;hW;h}E604r2Vw_FD=g%e5akRn$D3RcW88vF(;sjvw5O|WXi zo~dsDqBQWavzwvOyTU*i4uwHzKLZGG$5R6j2_2x!qwjNIv9K*Ikq8gLN+bkJP>1GG zi{W6idpwoC>TFe48!c?AWnSa^0#NGK`X!o~Bl9xRs6ARS6l!|}12pq(Cs z_Ld`G{P2yIq|>&WEw#-M2qliUN~eR?tba1y#xxa(sT3+uHQU7sm$idbN=ZQ~qc})Z z(_~^R<9UM6bWAACCPV*G-n%eQj{qcJa27s`+3?>|o5j7}e^4{WqQgfmKgc#%moUc6 zAe4MtM)HTsBJvT4XLVtnxKLd zW~rR^YQZ%=aeDh-dSlNuug-C;e7O=e90V=n?&p}>>VTig_+U#zGEPn?078)9n+jkSq@NmqS8PH=QL8Xw$y=mG`^%j7jkLYQnb zLE&~S`2SulU{odpm^7LO$=~pTW7Mo8QeRbPp?Us5EciaAx+952r@#nTz5dS$ibb|& zP2rn3I~%PS+S*|9GAcMX60ljYkY(!h8{+f~#3$x>S*o9pOVz*Ng=2?@nc?$4P_WUz zW@yWdR)4->PORT4C)PR)0rIA5lxv*OUz>AQr;3QSs0(@pg*H2a)5U;LJYoe!(_SUJ z13vvv;b=(a1>{TG7Yevcn!iir#?|5P!mm<{hkeu6AKijJ;9jqQ?KqU0 zLD8|EN(XiZOO{O0z@t%S;X4rzKQkO| zaU7V8-$-y~_I~W%U`?AAa6C2KnD<)S5FRH%#ZsS%w@9Pb?M1p$&>~hr05DlM#jA&) zh!7dI-Omb5+|mHrdnzs+L@EFr)=GWZx2Jo^pIW_QSS0w011R^jZ(feW1Y}|`kF8C| zDRC6qmuZiG{Ygmq4d$Sdim@OhBvSHM4_kzoO8-hXEB@|gsOHENg2BS8O%!s_GM^!A zQ;hz1Q<^$Qo4SmZFHhIS?R*22t7ot+RvQoSKU?ZRwd z0Bc`?JhDu^d`=?F0!BGpjt8 zr+N*DD*?Q*8um<17-fV51C0@i4vV(NgfN<1j&u~Wba`}%27|Q0XTaP|x% zg-}Xpf!p^ry#@>wGlhPAQl!Pgj-g%qn@Z)z7P-W%xdnzwgmYJE(@Q~uB}CP~+HW{3lXV@oA~rogX#1$Ar^jUi)tyueu^l1EnFkYdQPdSR^wQEK zUofZ^{P?M$WPZt5!xYAnXPP|fA{AX{VuBYv*30ZqI#lZLV>9}~1sB@tgQ2UDuqaWK z*|o@nh9M~zL4_a@miqWFQ@M1P7~9PeN?8YGnSZ`^kFw^Na;he%yiu7sefA=^A>0aK zs$AXqK(Iypi4N#%C1}Y~A#XuS43lRI`^xN*IU=wicvYt@;>Zcgqi3 z^>W_REaXA3JhG5kh+*SHBvAdH0JkDcZB(^l(GxC(LqXuHU1I?+^hHOiokHhC{vI zzCzviyEK@c8vIK2^N$HdMBqM6+^oe;^bivX>6wDI5lltWHMwcJ5RC{&~fFSDfw=t*Nr8~EHN z;Xg8j)RQw(67`HPCJPAd_bxO$iAJye`V^wGqFV`MSQO}8=eT~znZ^J8hf@V3e%Pd! zv5=3Ug_yQiNlZNqoV64?6rasaHm5)fX$Ga~`M|pll5Nnr{hIlrQPZ``Xau}`F&R@H ztAmCcO6L!h0A=vac+$+n`KgaEJ-U49b_}7oNq>?MDu9f@Y}$WI%?C&jV@sHPq6341 zS=zq*;gnESYVsIC&9=&*L>K3!srFb=KC?t6Z^^5; z*d)YF2ht#|Q-43NBa^z0c5LLJfcRl<%NfJcz#yG-{Nc~vIX5xG#*-5KaCcy^DD%fo zLPFw}W825>!)q?)UyF8u8YBD(V-&KanU>)1cTo(+qS0bS<99>9C{wouoX;T?WNac} z2}olEr357^01Bf=&0MTqlwI{jp=xo|G81Jpd%%M`H$fLUqL|SAgPx$C^zZaaT~+g9i}Tpsb0_b1 z4{|S<1CnmRfy|`7wNRl7lk^@53jzyELQALco^bp=g3zPeDnZZ#SwtyehSuTJbc?J( zAi1jpKH2_lMr()h!>?0RHfpF?YE-PM86inw#-era2kze0!bGbaubl(&`7e4w#z7DB zx6^`4YWaC;8j^kg+JAM=7K&qjj7gg>Y3Auoor8Y;sv@Bp^W*w_2GQdv1Xm0I;@Z29 z4XYnk@9vbhw52OT{*a-XHTM(j|MW-TRvVR za4Q3I4N8z+>46>eJl(NQ2;Juq~|K4 z#xye}$#<>Woz}+jW6zyOFaA9@C-&cT@$h0`QY~BZ=cqWbn zk24|gA6t4X3Mo2OINto=&&j4?{9{@}Ry@V}huXTZeR{JyR?Z2Z7Q=ew0hC%Cr zeuR{EUe-EnS%EErt0I16`^we1f*?TV-PFm;iGTPUTbt+E-Be9Ya{($xz(cLun%149 z^3IF#$|Pcu6D-zsukMQG>{l5r`NPNG4)XPE5L+9~)|)&81OU*k{<31>9JgP`GzzzS zG%GDd&Z$bp#GqmTHJO*vOlrwNMJE{?F#!-D(?@rA+C;lr!lm0X^&?omRErLCHnB`* z;fn=LZ@f;$BdGE4>IXg~=6!Ue76TOh3N7=g$K~jC)l)*I)pG=o>~)P86fuH%nGb4F z1VgbTaC9`D3B+@{4I5V!8|2UpcR0Gckbv4$42q}IF1OL@ZEj#QZpl0eDfYluB^L~= zww`(TG%x+;<(9#4X?$(03dSoPeV}GJwvwBvIloF+2D?7 zI2Y7;;6IK>jts%@`dIw{!wleJ%?1I0|4f=Oyf36*Qn##sf_k1`xG|vd?>>=aUk5M1 zrNPO5q0%lBlW_8;%K@QrPIxuPQ73KYjYqAKpZ#%;ouE=~U3_7X|9jc>QCkS1<~A~C z!w++HE$Yr%qEQf^g}Q?0-+_5<6cBt+m=Rr8Gw&x^x?sScX?De*f=C$31+*II0rFKY_@~1VTqH80!*5~(pNuS zqiovz!~!}F@hm2C@GTerFI`O|H00H(+t(*+8mv)vahPf9v3&vQ# zQp>o-wQQ6_`Wopk5;ke)(Q{4z#C!|-rXDy$n?$9K_2U5B^m#2SXi17#O}_i+UrLY9 z3l9|MWRIflDQKdK?ZasF=NZy9+Pm{f(49PEFdSz;mkU5Cgzk3$=pt`{v)Kf0e?@myx8++AD2t^Z)f_@g9nsQfT=WP{Rue0RW`N&e zZGpj&TzygzIO#$fi+qg>d&IhF?2^%P--;tCzXg z?F+8X7nPoUI{r@>9e$`F6FllndFrbq53*;sutWt@{&&QZ6d6;2^B}$bD_{ao-LVF4$Q~F_)O@;oe-XUXFnH(+Ho38 zj!DQV#z7k4H+&K|M*2?t%cp`=>o*MTO{!`V9KqzA1=l@-xd72#;XHwa&3-KG)*jF&zlQ_M{z=7pIbx*myRBSuO1YnI*s0K~9=dT3XXxNNRfk3QusICXz)lSY`SkFs2{ySwu27ziO1R z?Ah{`L=VYMcI$QaSm6E9JAp>H(ow)porMoB-$xYT3NAOXBf{Ar^xAKDMe=mHV|82k z%WXZ}gt==S=<@rba(|v?bbYM`EnScYCI^>sX5&fPFaQ^)sZY-re0|4BWIxk_?r-T) z_Pn6gB@BF(Hxk@ES7{Ur>2@UBo|%@7q>lbdqkkc31=8Ps7k!u>RU00-HmS%4J$>?X z3s6dKSIM%nGNHNWv`xOLVVzptJT)1wG~<>LB+sr4hy?E)Roejw;G(c7eS-9FuP+F` z3mz4CdrqhVnqbwsf;GVjv}IOLgV%Gca|)K7QD4~dQRHJNnHv-03&B7>HApWylQNx1 z^O7serHCFBqxwxaaPGcPXZEUpv6x>dQy_iWqF+iQsh^H9+bYFFlrwvoRp@@_?VZpc zu}|;Ee$vFx5`rwG2>I)Y|BOUE^VCT^{l4SyJX(MAi#uStqvy7M|4kkC`~F1lRSLJW zW0$F8mxW`msbjcquzwP?l1^f<7Wr1x&$gSpV7zWMfwAD5=6$jcIv&YY6%Cd<{a*TM zx*r??x4iMQRpM+^BaIiNLD!dCf6}|uwhvtAyOtB+ATbD#S~YaPa4E_utG8H6QMb{W zEB|K3J-l{AwuUGCjzvu=nmZ5eP72mbLdHVJlh(AYxX(1NA^-+nJyXSZvi$Alw*c^R7dTGTWieH^m2t!b-~D7c{H4lofbJ0s z==E~)wG;);t>arh{%*`}LjYP=ve$jOS1&$3rmynQXb;5(49%eY*Gn4Qsn`qI{{aecPYu`hSl`lFn?DX9hR#fTt78Ov4fKBTjt{c&C52Xk717^q#n?nR5kI6T1o}ky z2`<;V{%kPpd6+fwy}2aIUA43#$7>!=NU0h(a<-^y`B10zk@+2ahkn5AUeiPnKVNHL zn-MdmGyo(GH7{2N>JqqbSH(|o08?JMcPKj99NSWSzaK~Mp67dB_Bs4-!z(t{HCB~| zZ?hgIvcF3f&+t@Tn?Yz?5hO^;1|bN+0GlZyE(Bo0v?t8`c#CSJ(`~<0&5+H@k zfA0p)iQs@<=@xU~NbfGd_$5oD)hZU_!}&w`{@u!wmSBgSwNCbOg|fbm z`0J&(?0VBpu$hs@usc!5ninCUA8Tp69Pe}g@U>&Dn6Hq(5-W11{cv{}1%rWOiz!6c zePBP}A0o?2`i?~EI!8}-M}YY^R5zd=4KAZlGH2lyL)8RU=(m^K-SR?8=r7h7d6Bl& zr9~Xk`X;T(+e1Erk(t{zm!GF&MyMkKZw&(5bZ)D?*+XgcvwA$+Yj5VPS1$|i zs-7=kb(h01l7RaRmb->i1I=M8|IA4lzuivWReDA&lUX+xJZuPNBBx|Y5dw%ZID(WF zm$qDOagSHQ8vr8EGUwB>Z!Etz9tj-@FL_guFqiSkYcID+^deBcQhVL5y8Ro#4-Rx? zpOrE!$pcfT0Mr+L3sLcb_b4Q+0z6~v?PQ4jTZsb=6V*ny%V{n4iXDDSlTC-SMmM5& z9M{gG#vtHdt@l}dLq&-x8{_`00k7w1RNeibg|nt`+awUczvHwK@Q4L1T(x3sEhpeu zxoe9I^|F}AsZI~Ah4`kHwvA_<#V>h(yKB5@#Kso>iT}l#1WSx@$+2s9#{dNY(!Xb0 zCtq%QRV~l49Y)B*jpqoM&m9fTRO*jp?&GW#mY}-_WA0!|;(r#Zv7lJY65D}PbRM+j zwX(GQrm9#Duldt=>^<$ihgli~UcT*QpRO!l@;6#|`G*b`nqZrHM-PRt;=AT3t`1Ka zHyetKG*XnNs;xCe%fqhdv+T>yGKzq|#oiBH1Pj{n0v9G#Os_|qcW>N9pJUq&vx6=% ztOGY-l|hF=r(LcUu(dk8GiRd>At47Je^E!4rW$f2tO|=%Fec_NrEEbgYB23r1cni9 zG|b-12O{P85=Vs6u{;mI0oE$#mLEJ_RvBM0a4_=tl+8 zY7sE`xi3qnev!fBbyCUbUZUWF7`1;zd^jM4b5o8pgw`z~gs;v1e`h*C5GkqKDt9x3 zTz~(09@HVy?3T%Yds98Yx!*?5YL%a8FG&t;X@)~Ze+uLKPUcOe;1+go=z0my9^`}D z`au^p*?ruze~^D*Bu*nY@!P7)j zYH<);zS;ZquTG`gVLKict>JC?jQ&m%DGcdEna{3;z3$RI_r5oN-Tg+TX9@Q2=8@wJ zy?e!oq@&O=z`jz&CcFH@gr=aH>W-#9TC?ID*i#Wi1;oD}EVXBl$HjeqX82Jdn+oIv zJ+8xo9>Xb~Cswk9d@W~+GgY&g%jnBw5->6_*~`Sl#nrM(_@b3xV;i_1qH`nm6k)={ zVnUgE1R1rica~^3Z}VkbCwWnM_Y)Gk4B;MIb-*ej<|Nmsh<=0ZnJc+TEC$d!S-spb zi3o^1?@m2ktyGX%z5+H&Tize@K~rrRbU;AtL4VHmbfB(JILlrHPE*yHXgu1?%T$Zb z!Rs-r&WjT~K3(wn%$F%6WVNKg+jBh#z(XrPKpAhRRssUxXw8donzPfTF{*g#IZP<< zjur=+Si;mTi^`|O>Z$$SmXH%H(l}*Yo<{zQ?q0^$^ZE8G!JA?9nJ;s;1yPG$wW3djVgT^_O&Y~MR~Kx{n_D!n!= zwn4?;5V?9Na=!luql_Umc=DOeUF{|`VbBQ}zJgit2)D==;)(rh3|t;23t}MaP{m_9 zcc!ShTYn}EWt}t-6mU5D&J%7_MCu2G(=OTwuwA(= z1eX_NOuAofy$!0Ld>XF_9Nuy2kiHMkeK`@_xQBgr7Fq6SJ1)1rk#@UTdp{)A&3)*Q zwYf473VWWo>UpXek6#ynWt@?dEm%)>=MS>kwJ}qU7Vl{y@HI7NG2a;)las%bwMF60 zb&iD~g$Xj?wjcC$P27YwJ`KN#H|h*LZwl&~-AJ|7b`mitO^8fJr9ot~kM<>$M?#At z3tjRM9Xe`8PYfTGD%syhoAJHSd_a{Z#zN1fo^a)9><80DHTTTSL+@j+~8cr7v^FeF)Ee@l3RP6)Ux}weMv0T5m!0=32xu+mp^V zAARi=2gOzU_ZBKjpQ-J(!0q7$1Wn$1&$M`vPN7%8x&5%p!~FLeBst_FmmGWm&XY(Q zF9md#=O<~xVcKNO1R0q5sE zk|~i@ea6^wqMP4`r9$AHF=P&o2NCQ2Cl8x-hJ7Q}X1J-uceS4p(RWZ)BXYGLbi1(p zG2q(yWnCY(O`y{CaNbG-yAD?FS9~xpNmTRf3Cw?Zx-Rcrb@lLUx|V+JD5zePywmUZ6Rd^e zngV(1rA0C3HZA*P;)m+2f};!4*RZ@s>RPN1HvBscR`@wWw!D_v7S=WyF^Rai?D9X< zDtV>TT`Cym5s--#Dy|l6f!;q$d-Lu+4fF6=;+F0ZZSvR#taYO%5cVlL>%X`7`IYr< z`zybnX@-Gg(>kAq14rQOXzwd@xH$E#RuOzLK-Zid`^GpbR1w-WsGwI@^cr`98vz*M zrPVEbg#dhA#G>`Rx8|BlY_=2P&!EDt^T_AGL_h>1AKxsK=eCHr2JSj{!r~{%&mMPc zdj73$>zR|=?U3^Q?&@xPcvANgsmyU&L)UR~dR$}k4zjuQ@CnQ*&vzTb(s8?3Vu&@` z@Vs5oIW#Ur3>-d4rj$5k(c6jsyw#DHIJBKZIN9tKtkEk0K6urOtF*9&A zKR-~G%EG`;I_2fQghv7fpmSq}cra7HEEeRowax2MSh)&pZK7~*_ua`Qt>{D6(ri+{ z%|a8`s}B?0R3z%+d>>*6UBmmaKQQvK-e`QH|AKUc%N@sviL0|S z#&ET-mhC3s`giPK=9$3A5vp}+ce${&v%m3|#oilFBM(oxkE1<3-a^d*ep3!SIKCZs z-klekj}Jdz*bV)g-nIo6cO1-iVGLhv{c#BwM0AZ(V~rV|p9-SLB2~wff-sOj9@dG2 zFlH^Zu6u$s?wp^Z&4d0l#ltoz{<8W}_+BKa{n+(A$=O$Vxo$D$)^SUqx?LgE2(`r8 z!lW!ME$HXa?Z~MbDpu5)G87X0^mzFrnxKILb{E>36-ItTY?$j^Qnaj@wTj6Msb19{ zx4Lb~-D_lk4v375Fu&r!aq%buo6?zSrRK4B4k#{*8!r47qpiGdt=64tr(p*fc&%Ft zpzxOHtb2QmwQXQLD({n93;*F~QtI$-?(n=ttgQR9>ZzSs&%mO+f0diVa%&;YbTDqv znEWSihmIntnYJ)$kfRxwfC*zC84y$KmvTDq8s?~w2LQkIr_aOAPZ~O~w_`40Pv*)F zzh%{NvH68nXz^X*F7L?Cg3bvgQm9JIq}$7zE>HjMwBDTbJiU5%TqFGN)bF$-(0_M( zxPHE(;N0R!8aCU3GBojFZ7JJd)tfQPv*!no%p@gF{#F!LX$qc345FC%(V7-4xrj(! zQv&g2*!q~_wC#!k_9fu)Fxz)`tY&@WZHk@YVX^B|{hQnlQP10z$0HxMg3S~Fpe$vq zf7j+#SiGBjGM03gyXx~Iq1@x+baM+<)+UY7Yx{J?SIwW85;GFsFUPD)jV_s<5NVY! zUrNf48SpuSJ%OT-|GQmG%;!-yjV5p+A+4)B-S3TW>;?>7Xa1O*m%~`HR->O5*d)rc z^jtQDHb+=Nz{~Y898m2(*yi~6^Gy%CMBv4?TF}!29q|3Sog?U830-0?#iOH4QPTfu ze!HToE}wX9DTe!!hDZ0S&!~(MmlxN!2%6YduRZPYFM(@Ag|M^TTtuj9(evbhj3ccB7eH%@V)Qyd;X&HE$|up z{rl|wMx&4WlY7xE4FZAih9Utz?5WFFGlxG7(AcYiIPH1+NY*8+|eT zZzs!XYpZ18+?=``1i+#8??lUR*UNow-m;J+^^))3u4MdzMa=Q^W8wCWgDmKxe?s&{lwrdss5-8E zTjeP!>X!=zN#u+I(&w&mUPrv+ zQyJ{v-f)oHVOHIWl~Y#c``!1#eiP4jHO&`HYkYD4&@Q{$ynH(v{sjl!ofzLEP4&Rk z?_SDKjD@t={~TYc4~wJn?b~;}NyFE$lXNV_=(3g}#tY6PHkm=9C-t&dpxKUsBH?3l zyS{og@|TD>Nmc<97Z{Am{K7y?Wc}ec$!7-01JMx^d@CZ*dGX>V`tKR#+qa|F@NKbc zTl(;+L3-7i8GG1f-~dvL$kDq%|0*-N_;w_~C9UIW^X^Q?X;1G+p2G8qCWIM>!-(Q$ zLZxRjJ=zYj`WmyBsLg^PEqiUM!|}Gw>a@;Im0g(PLiUaWiISfag_Yz2XLzbB-$@K; z<&S3*|78CS9t&x0FuK0b`C(WS(-F9R9jVrB{qQR2<)LTqFzD%@uc-e&YG~%Q`}e6Q z25-@z1-E;|v7|Q~Q_XYI@u|r**wnk`R7P~}n*1lQ)3n?5N1)2x&o$a!tTeAx_{3Ev zYM>;&?mg32O4Q8UHz(bJtyM2uI=Q~14Bw5{R35t!os+%4R|;>M%b?dZ9#pNAyCl)o zn@E4)*tRX^4h5{EQ#!cUEN8?9$6yEhB9Cu^x*t9M4Zp1Pv~J&TX$%`!>4g@9xp)sdvwIMv!EX|6#sy!(SSEP5KkP zpC6LK%9B&11f~qygn6&(1}SR?L~e%e4fm?7ZG*9-kGXen=c*;Ax?#pC zF9qwK^Ia|htJ3>iKyTj?9E3jpX$kbc50Dx2(B}B$Keg=rt)YeGmTcd_a;EF_+z`H} z`jW3*V5eSv`q?Q3=R2v4p>{>>9$S!a_fmnSU_E_7+a%nN>s#91x>749vUgbgi5#U% z#Ra{(lFAg6^O>($@dcn>o;v>jNOHQlE`E?zb)Rnio;nuk1^4RQoxNl&z-~L<7`wWX zBbLf@INtfs%)Ikxd{CK!A>&+3^~Zfr1NHs+hQ!bpGVXj*411Z`C6B9yO})fCpU56o z2-X;o-}YP`u#{mRO-)n(AipU^;Z0Gc)dHCKKCBoz3tf$RpT4-%T$kGn49w*)aZ*v) zGb`oKE4g~q@qx6331wv^sW|Ssr}y0V%dx|^H`-vaaJ%bwTFuzr-_hKcs)?X;o#vpI zj^(>ToEnkq`GN0^B~x`8OB`zwU#-;fGYOne(}H$mDFPqjpBJvO-}GE);0IlD5nopb zJ{ISCUC*Ulb({G!a*gr1hZiU5IAc!?<%Ypz_E_I7+dX!l2w3bE7NHH9-DNY`} zvSx2eF|Z+_*0Aa1Pc!r%ifk@)J3gr_0pq(APxH?e22F3|S-ftd9NUH<=U7u`joDev zUP<&9!f-UH+Q@aaw>PdbqwQNE=y!2(X6+6%yyoU|TheXqi{bi-^Qm*KCMAWNZ+w*l z!oRJ{^<1H#No-`v=l179*C&oRKM-(wMBr?{u+_Ze6y$NAq;euU`HQDs(CMa;f5cXs(^70+_!U0#H=Bt?v!vJ@Jsq4Kn|4@SY zzqiaYwfB6fR@39ggF7mL77w!PH@C*0Hln9Q_oI!U)dqsreSa0YIvT=xk60q$oEB7964 zFfO9!(EaNy`(iL<;t6ZwFXh@;{aY_2;1{}t)rGab(|y6wnJ?TeczJ(VyK;P7-eq`k zJmxAx4JE6jD&3yu4!9eJnO;WM;cKW3B1URa^9$=7PoVYMcA>#z_L{ujGVJ%WW5%sR zh^IN(r>5WI<`-SOIDCd4^4?xndOUxam-RpEfc*(xLQwrTcCzZ>RxJtmubuwRkS&HI zwNU^i(5SyKj|KvI<5~nht}PlN`M@4#Kb@>E8nMj?E#?NnPRmx7=VW-XyH6M?baS3i z7GO``R73*0VHvKl=V$XsCgVz1qvpD#_X&jh5UrxpeIpr?!22ujz-RmNpF0j)Rs!Jw z-3jB&oEp2mWN;K&J6=sY6TxH5smfQ96qX_$X<{$47#hHOc9NKYlyQ?3eb%^)7syk^ ztW#&7J#Ngvt@iibz=3Tqh+YuDj)!4~#?M2rXO`!Dw7YaO>~|$3A{jFeU0FBrIoU7w zEru@@HEYCo&0xx8Z6JXC?QH*^`h9_Hhfx5B_*3+nuMAzA|j$VEr+w{pNKmMWq z2;j<;@MRGRU5Cc!?4!;KkeuDN^ln0U$s;3dhU{p6rZygD#H)s+KxnYgc##&{62*^? z-W$W8{#X&olz!h_5C&5fIRr$IDJAm5dKE0_Yosbt<7Ni6M&mQuY3iC|ZtU6505QT* ze&Q(0gyoC=8&{UUMIO)X?;U>h_(=TAMkdVI{b;g)TBCdy1y_M^khapD)TROipx`*L{m780-ZfG2Kyh*-|e+tJzx2KC7I=Xzi+QTA)|CE>iiKtPD zV!$X0!FOc4m78etGB1eCm_8D)eDx&~z8R45C&V(~(W#akhr}+ATCh?Xm($1lbJ z)sf<`oTnO`R9OmL@yxyiQ(?y=+v`i1Dkb#2t%6{xuAAfu(U*Xv#krThLd-J&lScnoIA=Ub( zz+@d|OZ*pLyCjy!PMLxt&@)K*S8Xu7k` zr1~!Ya4&ItQ%QXrjjj8zVZHHIWwTa*shFEB_jBCuI&Dn{P17C%$LyS1Qjd~iA+1M@ z#8_iMRx3ZBrKJH4KRrZc7|gT1%1s+ z(HFg(DuX{O)mK)vj|+U9_Imi2=Jf;-1CH#5psNobj)hW2;HYTzKkM`+%9r{arfO*s z+FrcN1^Gj{Leor}>~fBi;yCx<1`wuID` zZ&U#mUQ7CSdR#}+0vg6Z|7@pd|KYzajp(nE$6d?vYRT?n1;YkEJo=0}yw!H~)I6fb zGfKa-EVVW-(QrM+>we$D=>GV1cy6s*bp=1F(lHH_&5?naZ7l%#O1~EV63G)su#S%v zEs=8EdXUkqS@s7Pic;L|k+TLYQnDh6@Bl#=n8Ft9#r$*#M+W@EXCP&$pm~>z)d?V> z&ILFoj%JTd)69k6FNCU$3Vgk`Zf7{+?ax!v;=5mH>wfkB>OuxKD1 zJG;VYo2N4QwL;ByndyDMnfCisdbBzdULidMfLXk1AOfV(B3g93OuMs3Hf=#mrY|Dtl^M5jy>PE%Z=+DBgR;|JYBfbKI^}n9n4g?+K#{6sn8pZ z{FlJksUs9#wH?R!^)H;@P6+4m6wn<+&uSG`m1ZD(5U4h|{k^GfLi2qRK{4>l3Ltv) z%@k$Y+gW5-*kr;UXVLpJVYDVF2|~S16U0)%3I{lN;DqAR8tl| z5Qvj6+A*0=rd#c}3%ndmrA6T!a=nNn`N-+kZI;Wu*Mlv^K^c#k3xDy&;+dv`LhmMS z50jNWpVVRrgcAma`q5N>!nwt7K1LBzByHf{F5L&<* zhg+^eNbxRRnoL0M=&M_j9R^gkU7&dU5p}%nSRLnAWVywAHlG_ohXS{M7lL?9B(KX= zx*%{?gytI2Tp1p*7zXMy1U0*z*3SEtrQmt9b}&}~H9KeNF!?ZfX5_@_j<*MHvx5-3 zC9X2&028}gM)S?s==l9kaQYUC?VJYT;Ik{+I|#TIz6BviOmkB#3hpFgHw{v zqIh_qpm~snvY-l*6t9yHGszDlgGj^H1{FSIhM$_yuwmt_57sQs4e&1;X)hQnXr&qk z*Pv40kA@v6k!`WZD&k{JOxg_h_9@5Tvwt2QAfD3y<{Hd)bcSZ9FNbThC@|8Jal}N}j&kylN+D|E@Q2m+G#mRMUgQ zrkVUy%-}sT8@cr_`)5EgOe%j#$meAroA6VY9m7ZGb{}16lWp|vT&ZwnU^|79lc(Dk zqYVEtTeLhPhAlTMgk1RNn#3t*kn)uhDDrxEYXoblnfOK zG)G2`K>8=!)ps~F1)l%{MrkXAYW^KATUqNuSeK7H`&lr$;-|OL6HBQ`OmN>O7gnDO zD6{%tp~}wh`!p^_KcM?I4Yuft2p%)t>FY*B3mZG~=ft~Q&ytx>3C|3RkM0?8P6X&P zpu}9o--+)6+WFsjqw$I||8$aTpMtU+Hl^g_FBmzpzuBkwi(LBlHy+dN6R5%w zulo9je^CH{{2rAm&6Z_>*G8^afy|S>zFY03WwtgHu++S$)57`=08V2SGMY<1zO$uA~JF&3}k}&7IPfsd*%RSwuw|vEY<7o&Jt0i zruS#8?4SLN(Fi!B(7ttP>DC(t9y$Z)`a4;L?bRMh%v#(pPco8UMR zR{ade;Q|TpSbeUQa4aLFrl_ER^sqGrBsTpCjU>V-XO#-ARSorfL<<5vSjzy#9cw9e z^v_8?hvrVBC>a`hzpXw!LtEk4mmD_>bWY&G@*$1x=Efu9uj3FW-Pv(;=I^n=k4ba= zxzAVVT<_W^c*&=9mjtjOz|B~m-_h3dQkB_M0?>TpIkkaN-&p*ogUo-Eo#=$@zje`z z69_Q2Pa<(~9RfVGbO4|sbZohOgl+!9b?AofzcCEd;rYrUEu?>HWr9n5GV7-Ey6E9< z`=((t)@~s}^23$?#N5ha-tY9(gi8JQo11?QkA68X&^(#`yjAXH$*tEf)hR2J&5-wH zsT}#JP9rWb9b$wIpDP|FIy4n}OZj-Z*5l^-XuTzkuHva*AoiP5{)WHTcJ6-~FMx)5 z!)Gh2CRu0MGQ|OSj@@B$aWcf{1Qd;p%3l!U6OA3Wc9`1p$sBH31z-Iw|yQf=g;H7`|ssT_SD4yk69RJBE@@I zp*b3QR+?g7X(TIaq)dW3GC`lnCYWRi5?ddR=vQYIE`DymRhVb5A+j@R?7rC?x~kUh z7Ypj-pyR$b$3WNcsHpPoUmuBEHFU!L&xN73tE1$vuf3v0jhhG!>R0nJAI7oi4w%>B zhZh$!-eXtBXoseav`l{@G~j$ibF>xR@a@aHzqMuaGbfoVYO`r%XlTkx1D#tCGten@ z0T@5`XmZ?#0yLHpX`9(Pd-rQ6kMHv${1Zd#UY#s99&+|o-ki|g{uXQ~khY)PDj@lD z%T)Wm2_u_lmi_sUqL)5>FZrW?nv0x#)8*4qebX*-K;Z$q9;d*@|+}i08!pdhfms#HG9DG4hbvJP3m-g8Zj!INqxHukowH{>#D0rh5DprfI|*EiNCatTB=!@Zhb-;K41umFz1ns9q;lI| zt~bxJKHN5yFa6(0zIVJO^26OV>CScXzDdmkxZS-{0(GvdR$p;z!?wS<9orKv%dmgb znzGWsQ@0bsib{X0W&aPE#fpG?3n+^n_W7NfXYgj7Gu~dupPbB7pA3&>N|I!k??=D6 zU75}7)<@Z=f9UReCc;4ZDz5zZcErS3rAB_0DlOg2dEfPY@`%8(Doa=Y$j%0XRwP`I zmvam?0nEm^&`ElT__#Fr?QXa>aO%-cx=Kn)xK5`wM@D8C`sYQd7_$5VtEL-lsujt~ z{i*9I!^$`yP}BPSQCK=48&EuXhIEl;1464(?p~JL;cKcuFYWi*wtiY0vzmMR z#J?0ZHL2E}jk`?ebQB8peroSc$Mpqx#(n&Ca)bD$IN^;2tQz#iOWb-smgi%r(A{b5 z=;)ZZ{6&jlzu!q^C-yw>2@!&=bqFME8MMnkg+u@DGxC$9P_-^ z^7)?2f4hIj4gj~)_oM6Xc%6L@Q%6rhwW=}#WEPg~$lqiE!&Knj@VwvVHwIVV`CzD_ zB)9JD=4AP{l>4FU#tAfoRK9I3eT@Y;lNQA_r#Fym~%#LejOZ89jG%ot?9_0(b zsI^o|6wj2V>G=R;^*Bn>b(X1uhc#F~^dNF?DC8tfkK3_gMsf&yxzS&xK)^_I{3LvH z>w2wbF0y`~v}$Z#cLBeeWZBMc)``&?09E5o07g9}^O92&B&zVM;0lH!^rSFN>1ySP zyUD1X8kxU(v6cWry~SXPP9LgGvm^MoVqMgQ5tNgM9wzRxVuG)T~JZ@}i* zo>gU23~=hl;l|OwFtga(AP;JYG-QDW5#e!?}?ikx{a#(yE3W= z0B?S&T`u(PLI7?9y1M7=K*-`=+l_D>+hjz$bq{{0hQwqhpdQNrW0M|SS-e_}czD_5 zUIwOR0F!rF%{Os$ml+)|F64r4|DLa|v_0s6#={G4wY#vphp0@kH}&~PKkuGK(F7NC z`rmxC5$Th7gn}4Y#P&Yw!qEuEADYOpnGr6F_jTDbemeEngf5eCBs#?C@$+eJC;NJ% ziS^I8`Ta@vnF|>uAD1U;x4hK;*kc7WzNXfM2alF{?GUurmDbg9Xea;vj~|Z@4%L}N z4mlUSNw?)Yx5%yj8RhCSl8VC?#EdhiQ$OgaHSx86dE|@h6Squ?lvssg1Sc7eNN1bP z*=FO}n)3iLCx(99qi!CH__AN7$XRKm*F^ZQ5pwTkM)!9$bvAVPW z_yr18$UzQO8E9VKOl`uJ(!{&J-lDGkYmoHxc4Zv`S^+z8z4vl&c+uS64?dYLAF;Y| ztE|f#oim`bZCu6e`aEjPoTJ0CYWhzhqi-G$udMUnZe7&kdE zAXL)g5~e#k*ouHmf8W2Ue3O&@4@I8og|EHt8ewsyNk*>znUulb610Euan+16a#;2*2ar1|M!k^JtB`q<*y*FsI^F)(aFYTkM>|NpKY1g&k^ z?f0!kl;7CaSndA!&)DL?tiw50d4WrOb=B-VF6L_q(&!st7|To+V5V4EG4Xf$x3$LB zb?tliSt-`NNc{i+Owzrh1WfQyf{`CmC@8#wkRVP^8jz{|6M`URpnZoe1t8w3%9Vo@ zL>56nu%UX4Ia)qp+3RM{6g|`CpQhzA_37k8Y0;_s4cFYl!PLx!&%$1>#eTA-|AS{a z+3%KL);`Svs|87fMt4T!ZedJ1$HIN@MQb*z7Jx_2;Kq5e8Ss3s58N+1@??{KON$$C z$MohqqQSLj6&kxMU03sK_CGYgQd|pgq*HI$qyT#A0I^E} zkh;3mT0iq>abn5-n*yszv=iaj1oSeWB9P-xd>%tw0VkxI|M^scx{4q(*ji+&_%xr4 zrnho3uy{$z3PXM4BM?l`4>e~>s&cT|Bit+!4D22TNS$psrT5y?N5gWF(<4Ls><)ev z4r4wQe=U`DzDM1Z&zC81O|dqb{qS+3Q*Ha1QtBXHgzr-IvumQ&t^96~6@P#NB)&eq2U5j(1s)Wvwv~CP)C`s7gH(lEDPS#4y1L#;GQoW98^l zC&2h*vRe&V?H?=xk%R~akh7OwCEed&s~QD>$U#!u+FZuHWC|W2y|uz| zI|lm|eiC7%bolw^J+!u|E4F^0A3mguek|Oj^=M3}tFh0TEK-JQLREL^uN3-+BY4T* z`}pVhEJ3P%ekN>co#B1FIOvDny7d35;pSW5KKS#F);|8wR+l!Cddk249Z;P)TW~)s zJRf|vN8{As;tim^=KFp!t{e|s+~2+R`H?sF=A!rU1IYeFrhO#<(A=$e9?ui?TC#kp z7mx_eBT0$depx!@OAm(ljbY7viwH6w9AVt*Vk2H=7T#(cmTL5n0D*uU^Gi(oa%J&a zxS|x#AFWsPn2%uJ{k>ctLMEc5v0@VGk&~Kw%>{_gl#Fuef3+K&7cEj{L*bd5Bj0sB z=Dp`y*($3I7fVKx8d`L(?}tfxf%J{S5kns70`vNvf7@3o(KC1*(;Y|t4F}(?O}qYH zIulY7|b(r zCM@+L-}OUE7`TG=R44#Vcl#&W(D3j`0F1ur8%X{!Kx{iKjl_CxDc3v`Gtp$mG*$@< z*j8EKA^$^+r^rweNs<_V#sSCx zI0~8%lY#0&kg6$zRx5jzuF7pESF%8GFU=lJbfl`?iSWDxji^|q@~a<_^d=HG0I~F= zmO8302G*o7P10XRYEWyN_{TVMZ3<(t8iXf*(7D|7n0?+5tS!HbSg8ShrK!M5xN=3h;*O`3}J(?0i# z3C+W{irC$BbdsP053&DSVZfVY!h6at$^%GW_^vu2h~BDDyGj^(E5iObeF<;c^@kb! zI@RCLi>^~(9Z#bD>yMV@aHgu#jgV^+pdj`6%$MfrKO|IW08l+mN*DiBx3?!7OFvM> z?b12oN4(A~mQ88qLY)9dkg_Etn^1kD1pNesi8w60JxD+u7K<35c;6GA{p#BcVY6U^ zLq8?4+>+x^TIHJ{RIFO6bwDF}ua5K@B z6!}@+Fa>j+c^l1F7K$*N8n5-scO3m2GZ7PQ-S>A|S;z2+zU|&Qg`4ycGXji?@IfIJ zbymcAQE)`a<3b^PQj$$(bp3zj7SOmkhBQXB&A4NAxCK5Kd?wNZfFs_8aNy zDgodpQpS*lnGXn<9_VKbBJO->r**X_2LM|c0R!_NdJpG%L9l_4 zaYPas-|e|;9^u;T&?^8sm@85-kR8!ayoYIE3l#dB8IwOuUJY#t>vL<=^rK zQeC(C?h;$1zCy|7x0W5mi!PHmCMglnB)LuJJJdTrNM{n?8P{<~`Ea zaC4Bw?R>ac>ZSv&Z^-bm#FwGr1rUq9TuJGm3gC?uFv#A1bmXG7+?^?YcU&vJOUa*Y zY^(gxXedmvbzU~scAHafucYXIrYeE$LpIntO2(h|4=F502ILn2zT zamhK{PxRjf#saP)f>hchz$aPPf$aO#Tr%m_xEVobY-Gt&Qp1}zIIwCxzaqr_MD^8{ z+d-{+l|$&0MCsJlk1ynyslTb)Mzkp_Dg_bjEiboEWwl+^u6Q0l^}D`2xa(^nqKtldkB*LL&z(=W&Weh~d)zh1&}YS=xCqm&X(9MFD)`KXPvPI=3D+E^f#DeN*y$ z@H)4X*!MsFH$CmPd^2$_p25!=_)NueACl?kHUB*;`X%gABXT29CyB$jFtX)!9zK~$uYjZfC>u2aJHlCOfn|}1rcXYEnI$(+F z;E~*$dr#MSxA!OHdL4v5kgcu{$#)#w7Rcv-qK3p$1^4T-&j(Ms0CQ!=f`@N%2W83_|#{>HFb5-j%AH7Fxmokf%s(E5d zsPsfcP_=OCi{OWcV~qBj%eR~dlHNWZ8*4|)IEhu(B9PGRQ!|3&-WB@)%2|0 ztlAOe157036evDUR~g>9+7yfB{IP77NvBIoMl90QMyQOIEP2^{>R?GMM#F+b4RH7$ zVV{F36llMoyHE2OeX{TOU+uv*O(`e;(%oz?W2`8xPwV#XIxyyQp*ZGq#U%77(}(_1 zwY>*7?=c*xYPNg?{_`G9Lltl2R@r_WdCf@HA~M@ve?lQ(-HA4Swgz={KXNM*Q!G0k zE?u6FNTFwFoh~*us=uAeZ={cn!~;N)t#u|5fQrWKw7$l^pXy!7vVsDK1Vv7>qe7id z1}pCV9ig4?W+xru!;u=n%z@73IBUd)d_+Xrrr%h;l9icYmO^>Dw27$C#BuXdGf59E zs^pUo?b3109p*&m9DmK3{8v+Do8KJXJRFhTpEz+tFB4WCf+cUV zxS_MYP5}ii~V$J5!!S7k!CCmXuj_U4j zHQnk2Q-yG>PMo}E{k*yUKcO8W2BLk`PHBVcxQvDi1sa8A{0BqZ>-Oa%eL{V^|Jm-jfc+Sa<+`}nEh93EGl zP4yZ5{Mk+bF;@)^9xh6dD2NDy86cu03Qv4yUsq~R#>9XTvrP%W;6W^Mdbcm2&igIj zchcL}K0F0XR!)RLnQG>&#x-lSd2^3;MsnZf;=kGxefQ-F%7e=zMCVkrkNC~@3+5;w zY3ab#`2c)+a4iv1E@L}y}#|9+!vSCSi#**Y!J_}WdGkT&?|GSFqDy^j-2LO5^G z2#wZOUJCzu$ncVacir6o?Li7rS zsrEIpc)`r|`7hNG2qrvg=x2)>oRc`d44yeSP1p-)tsn#uT5ZVw#?-IyU`F0hwa$jfn_Tc@PZ_&b7Tju4*Zg3_A z1b8mCpWmbOH*;={yS?3D|GeZR#^0y4TVAY9>pvw5+SqSGP`!BZ5~eYH{wc3H$^?#0 zll#oX(hnQBo&V3H1Iz7n$B&~Mz{5drl>XuBG_b?hs}Fle5kNz*cjt{{XmEbdxIO|* z^7c>d+Bd)wyKi?>YWhv42gZxRkcF&5I}nGInf7?|-NF>JjBtrfw-S(;s!W_MPB@jz z(S@65ro+)&64Yn{htCN)%aXDL6uf?Q$rRSx)&u2K6CgutLz!U7NGS{v)wjlUBRIG# zp0^$CZg-zAlI$LikJ{eQIDWMBcQi4>5rpCLOnq#qzd6nLtoPtB%l+l8M^7shNrFJY zU7*s9u--V`+Xfk-C=@Gajcmm8SWd$rQ{*=mXur!xW|$HJj!UTr4{stD_*ZW2oDlpv z^v1dr<6;4ld3?`bcD$L`a3^F8dvS3U3C9b3+M520zjY(2@AmfLW9eCi&p-$v22jzy z5{N0-AaQ3LsIiw}=_n6jv>D^xct1mD3AvJ<##4<)d zX{x2)`A(h95CImCn)`e%TyGCPep;}i1AC8r?ji3BS6uGrC*1EQ?g9xLw(e*5AGn^S znv9Lj0KlSF5>WpU2AI6|QHu-#fcl5=YQtBbh}p;CD!Z`T+=dr5~Oy-uu>s554}ro-IT6 z>96IUU}mQ>BY~>cvc3C@K+mJpqSv_iF)+rG0V}*<+Y|(6wNj%3OG;v0N7_+bwr9M} zJB~zVIA)Cjuk!{g#82igG4kavD<}dWh6&Bb3QC?tKl~PLm;4*Br6u!weWra019)+< zfe!V1#-;i@T>hub|J@U{a0wZ_cT zt1SN&wTI&;kM_lZ10S(}TmF6#hh~x|*A9g*bRgcN?-xUim-DRX6Dc$)d6;2xa&spI zh&GSm8Vni`zvT=niZMgDO!xV_Z@~niWRrh2k=FkO6NjzJ_X#b#$9wK)77M~%BNd5z zJD_}jG3R9nps{aGj3kVIgDYmt{cy1EfdPokW@3L+Bw-<13b|Qd@xC@h_ieo#*DvHM z9YU8=)g zNvHmbVS|rHJXtg@pT27CCfan?wthsGZc*W=deMNs`v38J-QkW zs@twhdyYV7<~n83X)34vyhYdN2)}E|cCGEyiD{iJ$&C7kvu^~CU;B3qVa{lsOOyk^ zhbKwC(_4}sG#xLGxjVKS+WqR%Xt6=Cy$&y$--oC(b{Jfx^*12Pyzm9|@o7S(=d}uu z=XxBe4u|PX%KH5|&%ou)T#?AGILi9ssb_=OCOzsp4j zo#Pl(jF%1y*p#*?C;9vOF#w$<=kh6!zC(C^ee5|skhlvs5ySzI6TqRmPer+7=6S1H z`bAjU?nVL0#0!qIYeZt%2Ys1^Xxai(NtHYbzA`b+1BeF4Xrm!WdEJe0;X5 zy7NbIa6I(%GnSX^MaC6g`+aKF-iv4HT0SFoerJy!ZfEpL#a-`Do{ildDso>R@*dnD ziJ`I2iNjAa#{lC)x52H4eZurOJBt7O+W+qQ-zYDioEsl_`t}nZpshqqqP~s zsGahC?SE<(1xjDa1eVQ*%p(jm?l-*37t?i5M=wS%5*_N2zeGo<@Dji`T1M+!v_-zB z@8N~q`2RT{+GWCh=1lua`ei&1PJFjUrwZFssKmZ|;|lfLc3Z1B;oJ!#EsV+=N1=UZ zw_g3%jy5`kT=&jqr@eEn9&JN`WfvJkvQGZL-hSx@m0!fijU%nBy`<%pG8LR=1B@Ji zz0S%1q2r%TY}}*bY<+cO-T*06CgVTq0RhMqo++>(z(qj=n9&MhGSH%E(3F z{=$OzYTVv#VV}j4Iro_N&zq;^mOqpwe3Ki%xmly)qnC$c2dAI8AIgO3CxPiGf-#>5 zMO~OLA>n___DBjI=N_cu61)^7QbGFx3u9sE>7zNlXebKBYf!S25&?|vQ7$xXM;g0) z;C}J_aYoVvXekpE701pxI0)n!{+TA>JNlIC@=~=Pn6ATf9+0PdHwFbhdS4+r#rC$F zA00aTpWlDrosStiC2Ze|4_GQo>ZtV@E&;z|b=4Wm@XWwHSAhId-&8n02dMDcRw>V_%~3K4CcU#6+85%Cd@-g(H~k zvywP!l2bpJp}PhLJ9602@(dBC{x>aT+w}VM#Zt?XkT!g8$;C^=AX8P9mX;&>>3dd* zfqMZ8(4QqK-0V3KnQ*{3HNx?PwIn{4$%YalEy~i$On5St$sj9; z3uUZlmHX5`@mAI)l_&rr>k=d&1zb}_B48X8b+6F&uy21C?$`WZQs_u7ziYGY0o!Hk!NbENJ#AF)nvk@UZ<%Bz~v z-QC@5EtmO8RzYZRz)w(5p!=2VGYa`G0hpwYM#o-6)-fFf)=%;`4nkNz2$ldfE8# zc8Xa&Se*H>6#ueJ3{q0U#-9Qzf(A3jpKHG2n=A^09;`Ek*+Qrmwb{3iF5{0 zfVeRl`Pu3}AXxZfO7n>9Lb74|DCjdpg@7rD>OYKQ38g|k7Ou9x?%6h838{QzgiiT< z-t^z_$aMSeJ9qmf?sT>yvJoRv0LI%w`XBew8_(l=lAD{Qo8`MuH|qaB=q)_a3&sIZ zP*NgTHUPw+bI*zdoafq&>!2?%w>W~#g-jf@hhxj!%!npTCZNxYj+ z;|)9#)6aVDtwyeAEmfW0LAyOqD@pTu`SV0+-uh!ka?%J=d|XDfqKZhu2i}4T?Ma;Y z5#<0VQvE;2s0J1RQI=Z4aU(Ao6i*g!$}#2tN&5X?S?n8gvlT*P(b7y@SkQ4%n?DL+ zIz1C)*$1Ys*677h9gnl2~@G z`6)?&9{wdoko0N&%6ZFi>pb(@@->@R=W5>@qMpj7s0h|qxZA0oXE?qsJM%JnSy_3^ z$?%+e(Z*3*e(Fu0TPkXV{M&F7OmT#wZ7s2>zrKvOqjz%8eLe+VA|13~{3 z&$hu~b2j_!`X5G;t=OGdT3UFrDlCAuKw|lgfF8bkx}rA+j!IiIbgHj~ooGAC}uKF5*6|1yKVn*4w=;wE`GF^SXgo>^>_dE_5y2nUqz1_Bmom40DWz)a6m>b z76u^(q`!3sKfg(Ix~Pw0#V?OFkh983GXti6T}N=cwjInT;h`io#cRrQ88BsuL1Ms8 ze(^J$7K3l`*ABnSQzT|r?xy-U>i4&YtTR7egh`O#o7T%jFb8vy>8}FH`fxIGGcuUb z{2y|Fv7!+ql8VTL+m8SFX32nfmqJ4?Q{!_nJ6>BM_<{L%G7YmJ|GR29H1^7IKP~Zt z4b&#%T9^mu|CSTFKZVyi%{TC z8I!-Zzm<7kpb29F19^Qnj{c?h>Urv5VXPWWarhurQDP1y5Q6Jac zPye@2dEe*ne=XsER!Qf+ z6Yu1E@gU}PHGI5GDJuftzIM0$;1D5nLfor;LJR~GF_viLOXtHG6@qOPF{7_(YZ-o9 zgPV&{4+aArSggk7F)zY5+*~n#F>P~44K~Ns7k)^&jUj^m67j+_fjMKU=gNu7F#z&P zvj~kJ(&kXlARglJ@CF&ynq|%;k->IJMe0H8Ue#X8G@O|Dizhz*A5Dz4MZ`}$?>E+Q zsEWT=x0T(RK^ioi+@`_Q8krz=Tph`OdAs0k9ek?p9{rA<078Pz_J-I z(Eu8TekQkC??hcpi?2=33@~n3Ik`T6y)B)E?WLoU2nQ~glrCEI9S`=O(D=5h*UPVA zlpZbBHQP^OwD~{n@G82y5p~a(i}5{)e>mTHyS!^#4@SZzWs2saJMOaDulHtptV#-? zD8VnFr+}FjEG?y^0R3D;_i)lFtEqmuczzU8ESCq0L_~RiP7!-??t@o_BM~~Fa(QqUeTc^U6WRDo^Uq9Fzg zjM7wPVYpwh;L42;fu7wmu8Kq%_#dGOqC|KM~1U#dF!j|zpt&(4;=wA}^nxYYCt0X(L~ z$X9hXO=SMs0mRG=$Jy=rUJdiEK_iY( zo8V926q1{q9&nIO^%GKjc!EA8p;2?4vs|CoBxk-RfL4C+Fz)7EN~D!J`L6Wu3PSYC z&{la?lh5pvg*tiuM<~s|2^Dx4c|6)|M38Lo`XB>GB0Fy{ZYZWqmykip$iiRo1P9<0 zs;k7l%U1u?Ps*l_48RSS!3|#nKH74Naq;B%7&5bRUI7$D`8=7f6f1em(Skqioe1d#|*}s+q8%4 zays7PVq*Jh5p)&T##+e0eneZxWrW)0m#kaSyLW~9A~qa){aCoYq;`9o<=>N}ldEi` zvXSb;p{O2Q$UiV+GYr?NO(8RDwqvYhYq75vA86cpQg}H6%;QIowU1sJKoCl9ur+v2 zm`0YAig^tm12Q{1h8L<2kx8h^{>jKl2_>hn&{E|dK*|6Eqqs2Ey1!X`0?aTi8~Yye97;n~&rUV;XNjwVW-C}@y1M;$K|S?s*B{o9Ce%c-?h$j0ZV zPL6aiZo#XU!3+^kzJ;Q4pr3LON>az1Li@X0l1&mzgnAcwIOZ+IdtDkjg&R+<R zW{v*S6gfdawnz0qZoSCI|Kd5_#cs#pOzMpG2svzk$5C|9@POg7JX`TE4RwIj&XgbB z`4t}nO@;vl=Pwckh!v`k^jMLfir2n^0gT{;yB{H`P{VK(qEXt0Pej6n&1_>Z^vm?S z2}}TnK`C!LTXhVF^dCzx%SFi~AQ8Iu;Os0*C{xmSEDHxIR&nxI%p9VZ)90r=SwxI_ zaHo~b{SMlu9M&sjnnV0lD&c6L#s)51>?CPKt}3hMC$h8ZCKvzK2HMjbzasKN+gcfh zmq<%oGB(nbei#WpbGf=sv0;PA+t0sRMyFT&TAcQN_U0Q}Fqred)6s4)wfEWbwv$_- zUB3FNW_)M#AokWNW^mNnC@Ye`xB+LbK6(=IuGzQXx4p!2s=~8v0qSWRe*?|(YMTh< zrt8!B>%IA%qcGbF9-g>9(2cvw+#T5%@T+kk8?N}h|)NnyvLn&4R4r!eq z&;T>4f4?{X&WzLt`48wzru*luNfqlGh`kam%2ag_0{`J?1d zlnI*@Pf(9l-@v`;P+ix%ejjU{bS$l@Mkv6Vzz5ST%r#;A>_Q;j^%y(;sl-iBsgtC5 zvsZQ9qP@x-&aN$5k)j3BHSu4B+Rn%8;`{G6TOA+$ypu<*+E3~HtPXFMm%JX1dZ(z< zKjREQ*-9D%#SS9h`Yztnb*%1iw=+97V9Bx5O^KHu2qp4E1X`%MHtvc%+E2C%W zk6O-CWy$gh{j->VB^0EsKEfCm9B$hkBpYE{uAGSeB(GGXE9OdSI+>2ek@YUfYY~%L z4v4LPs%MaeLdNS5rh4M6+K7nH5&Q^+EXr~7pB-Oh4;fNeR8Ls<23{Uy`-gd8>= z8Rrm|(N6xX5{=T33ZtwLZa|@#%FCjo@(PvJJ|^|wxIO(W5yX37WvR>;#b>whDk@-> z0uXp_A%n!Il6L!i8De+@2h=B`21@unVMtUJ+9VqW=Gs|JA*KaE!P#4vg!CW!;;9&h z8PK6Q3g==#PgoWn7VS?pdWFCao{}D>i!$>74tRPtTv|d@;zgk=cRVjRSW3^%t8CAG zp+<*2PpQDuzh0V5M_U1oTn!S?)}jYw*;vL-S;BDQl6kb@uTa0_q!GtsV{p(?cf}Mo zAaHT*mSN1YE5MdaUO%PFURo#fsT(`#iJIACHe7~KoHIw$Rt_?y1{LF!!U3EX-{L&R zZ~2MW|4KLr<>lP!?|0`eTNOjH6|5pYxH3JpF;EX0QE*~R)Xz>88W3q0ixbHfJX=F3nZk_MurQ~^F&5)eoV zisEYG9278%G@(ZdH)GO6zul@eW!t-|i$#U(M)r5t1wFARb*@>nh0i!QKp<#@tf76@ z_0@cG8Z&2b_c%=!UC06zmLT1!tdBvRt))(~e%VUc<{OKE;6{(*YOqW<3t*OJibX*c zgA|ZGFnVdG0W&rRV#-LwVoL#PjH~^eMJ!Mg04nssGutJ7|Uw@~5{D}!mH;qd@*W$2F7$*m(^J^rF z_z$FR&6`wAtS|Mu&_&1S)oAq4;oN?a`0YNhkX zk%^pPaT-}nwP4D)9Pl;?ci5-W=nH_X7RwU@^Y}b zT=qyb6*FH2LU;asJ`>X?I7SedNmJRxjZbEQ%A=cNo_dNnH+fsTzWej?=th+e zUve600A*4h)x1Wna-({;z?CKr%ZwdqXSs-Sy(>%+OQTshXtZwA&`@MnqxyoQ$g-xL zUQ)bc+g~!aZOm>!rq^5CxI-XSkUTe|Zo%`%(wK=W_xY=uA=2VdfMmItwn=2ethTqm z*WTK-m4D_Z?K9GU|Gd9OaRqgf{z9#OPAydBx8kwlsVi0mUwEvam7fd0e)Bws%eGtl zB|>QN6==ffB*PtOjj&zICHU`9)>bnoKJpWzVrZf6xDe(eVu2v$Lo^_AAQYBQdJ zf+Mlfrd)5OKgOowfYsW&oRIx@9j zc~R>|ODaOR$5AQ}*b;c0HgM@(pJ}wTh3&YK!-V<200SKS<3#{sPG=)fLLjEv6r*aY zwp*9=$`nXIhGI&#!bnz?OO8qcCrBVf004%_G?aLV%Vco!)BSKiy`HHYO?hsstts6U z$+f(we9*>qIU`3MG+QtlGO3j)R8frvO)!#4b<#A=E(@ausgMe)SppC^zAOD$p%W%q zP$cU!L$HK_Y7~kgFz`iUS-4QBmV1a64As1gY$61M_z4BCq=;^Me6BN}v7KQv!aC1+ zoB2O2USv|F%`}&ErJor9lu$6}8LX^Q8-Z33^8w+*qz7Ef5Qtd0(u9HqgpPR2BLWs= zjHc&RpWTxSmzuI5oQLaop`FpDE0h8g)MThurPaIa9PK%D$1tNk_v%>dSk@l*HNJYf zV^m!mJjo}mJnShv{9+42cHP;luC*@hzK6owDqKpzDB?h@YE=)$IHOpFso;`Pr4lI! z5PEZ2-6E4kCq1L0j=~jJgi(~(YM-2J2Sr_{S#j5CX2ggQVTv^bQ;i+I6Je4e z2nz}Zf^4(=cnq%U+Q`|JnX1VkD=lD9cVCN=kReclkU@xKaYt5Gw@%#wV1z&rAgq$y zXQal80Rg~O7W+-bn7zfd;t?B;C>DE+mky2tR(8|~T8=ALFylk|H=RdlAPE9R0F}V1 zhH9!hhLy|R?tZ!d{bpC7Es+~MI_}VxBkCAC_ zG64YC?+dR!yw%s9{g2aiuhT4CLWPB0m$JbX)g-foLSw2?Xe?4xYcZN^0Co@nlpq{w zLV=imQg|d80!K1)bAlq_BOxtec1Ojm5+IByCjC2HvE*V9h={n7p`cKsl~5sZD%fBk z61HhTpcoS`F^KHW2lywJ>WD!ZON6Tt(kc3K1o$co7Y_5GJPSg49z}#G0zg2Kf@-9~ zNqRM#OUzcut2_PnwR4}GJAA!S;w>*Qye9kd;pL{p?TGfaTsiHw=dwMQHiat?|~SD z01+zyf`C8kMLXAfR6gm<=-iiT0CUTl*4J)zIPJ}m0esVt{ zmKZn+>mIso-c{w4((?};TNw+S5E5Fd5P@Lz@L+0##K*}44Q80Fl2zYp2X}mYar?WY zTc4gdez!MU@}$i;p-{zgX-2!Xy~{&24JXX3Z7B{{u3(&05C#$L_m-S=msSkRsEQONj^jwZAUUj z+98NNUWh?;^&hHN+?oVbbcxl-#ny0zQ6T_BjhVfp>J0B>TWQtm^sAT7{NZQb{^H#5 z>%$ulySKc)a=2gHxj3RQR8rBmM3HeVTRYqxqKFA1+*Vq1m8Y|mc9wjO_FT5SatutM z5H_bLnN%$TRK3aE13)NSE6uv+ISO^l(>`50-zEfb*f$2-o=HU@Wg52MpSNEw2@n9F z2!V=ZX^22!y!X!)0*`pa5!ue3ymWl;!SZwxDxne-$pDgNgRpYwB*VbKKo~EBJqtzv zk{J=!G*B^uBuEx1iebbQ)ogJ^W8GmuutJd$IGU{PtS^&%tUs&H1)$jd`5)P-C}*yv zpKXj2GV-pYOg#dKI8vg;gZdS-`( zPIkPoDaJKdHyZ0kl_aZTj&;r$fl=)o7UgImAjl70H5v`YCKw9apPjht4?o|(+Km6G5{UW;T^ z$(1J4P>B=})r85WnlJ<--OMn$Lt|1?wkip3nGi4RT4#uXP7-YC*7BefB?Ju8!&U@p z90B?oGy(Ju2m&Jp2v_RC{P_7| zj)t$dE`4`$_xmHKU%vt{-cRew`2_ z6_V-6hA)6AKn^6@8 zximAb8X_>M5GW#v5Fr&2NK9f1smr#Kw=QoTD`qrmi_RPY$W~Uzf-nRG765q;by6x= zVk8w@F)}?)TINcmP^cCu2nfPLMSwyz)c~mwEvjJ%BajI*LZGIOL9s8f!}Y-v#VAZi zbLy>N-UJUcafPq~jMzhjbL6n)K^HPcM8Guss zBnsRt8C^xo2~OA)Pp;H3L6K3Fm|y^csVOmqoKTaj5C;$pfye@`CP|rkSA%VZD~;B}P(#A{|^I81FTCFK7&)m}IJji!j9`ixv=spco02 zXaN8)q6I(@2s=5~I9Z5Hg5p-BIEuOtNH*+?3iJ{|Rv{BGa7EyVqOU>32qBYaMk#4b z08OkkF(QzO1(rc@BE0&*Ek)}_=tZ&*nUTzhhQ=wLdvq7jS!|inLyV3Umd9LfIc*vd z38odhR?{k#7`3AkgF-@sG$2RR3-=!0zgo;rfiLho?KU|TMFf6%k|;{RV0BOf>B^pH9!bJ5lI{=Fb?M- zqgSz&Ri_qIieE_B)G8OYKYoV;LOFH_v!yx+9LYU+Bnd_UmH>=Uq=G9+7#}o#B&taU zkgV%W7=`}lBt#nD?;EyN{j$9!Ng@}c#10F@$V@DbghPFE%IKY zC2dcR06jy&7MeIx!a#{f1ulBah#;~m0p>0~`}aURJuvYPMO zX*^mQZ!2UXp`|3%E%OXdGOcojsfq>-Riua{YNDoSV=$UrJmOty(%k}pGp}X@V2LaB zkm}>W2|)=JSB#W)K>-vx3M0aV2`hBPU9DN>S7mjih(2_$V5_zirV#=l2>>Di6^$yDNWne0L=u%) zK_wIjwR$hmPY=TlK?MjJLL@|yhJq2QlOa$9!K6}&6^6XLyz)%r}hGO$h z)oiMBQ*DhODGX;vH2Mo?)f9^2Wko52toQ&2 zBYnYuk^uk+J_3x}SmE1NXOSHEl*mgYOKGK|a_y_a5VSEe3T0zuFFQ6q|BJi+iG@6;&)3K2>q7?79YnNNM3b5qLgt!R zow?4dCOVNLQ;vj;(|=#T(-lBM1ZA}RdwWz~e5hCjkEkY91O~%P$&@YA7VC? zEYeGG;(=G)=}vP1M$@8h{w6Ov-2hn@_>-Zn)cVq|vgp6(g1Q~6#F)HTbr2-%{ z=jwI$03h!BFxt5w2LLMo2LKL4g8LkpKZ|=dZ$uK#rmx7}oOhR}Hal_1)?TB8A=P+v z&w~Yv?)WGmNhlixE)ujjF_0O<9WDq#6ToC&4^7v`DJE(%lqk*i?s@m0_Wobb5P(cghWg@T zMLr?`kzx|Hiy#njr6+FR3%0tm0-Oj=MnN;C-O#$7=2)o!ngdV)uxJm!={`q);T!cm zXJR5owWAH7J6wqT!v7E=02Ks?aL=Q50Dzl^NHIo69C+lTy%XcOs5O5>Oj-J>0_Zsa zZ3ri3OU~*PYI}fg0E;Cp?MdG#kJ>{ZRAaT8iKv8wzz4V>AWq=9a7z|BcB3340>Oyj zgg{JFq<}A)XyU}eN*h3+PQs6BKuhwA5wQZusECLFJVFp6$#v&kxkFi% z)wa6sWLuRcP5>?to8!ZUR{#-!6&DPwtN=a73SlIo6BdN_98e&o8Y|rpavb#>NEM7N zye}3221W#e6#-F<6TnE5%|Y`>o9Tdh6mqV3bK#G^tydqBLYw00cs%n9RI37cUl0wbLG7X#xn< z+^QNGfKhu?7!*?si!2Qnx&ep)`r{yU6C>Ai+M^92s>Z?zzyQEP1>jMZBqDAU>O}^A zrZ2v(W(WkM+OZN*aUwV|P;ue{0dPv~MuY*vS6mz~mH6e%OhRxOLhU&DDE`SKJvjm% zJ$UH&x$s9{^?5(O{y!c~h4Y>|5XsqRniKrK_p{w0%#&KyPHBN@W?5Gn(>~m z;(rrV~irN<91e*dd=&PuU`-Vr|zhH-7lZ7-}L)Yq@25lQ_3yf0RRv=o9E$f z$C@q&trEmxM;*-p)J&h#9Zu?Ne*68GPGoeV0x&vzhBCt49Y|#LnJb4ydsF}-A|ggk z%@K%H85xNbw_6JRWCdz+%?t7S_dfstf>H13 zJ+J4ZpGPq=-MR0h_pows5&*<0A@YJrWL8NNBcO?#I|kVo2hq>adNZ29LqzxsMV?)Q1Pp{G~yf*_)aCJ+WP3}nhFV`UB? z`;QNuV!ZwGkO{uGy;!m7HLs{(mZkS}$7vweAzI|bWDIBdxX>jkT&)nT=wdU1K$c~yBu<(dM=x1E;hDRPT02G6Wq-w&#tFR+89|##I z83e#+WgEo+tYo|*7$LMl$ao||kO3G0igDtC02uR|sXXkxH#ye#gnwRqJ|Fk{7=6P+ zG)F}f1%xIwqk)79BIR>}S9c%fE0LWHVKFEf5Ud`Y_SmE7JYgx1la)@c^8%co#+v1U zz>?zt#zk-VN(N9&d#V8h%Toc3p2a-0N2D5rij`IEAXG#U)re%t62W!Hih(8~PN-^R zPM{rMV*K+#K=K4D5ls*xUKs(3nPy`Ng%3O%Y(!=zb!d(WBfUy_$s>Z5HY^Y+Wm>VY zGICPUh5>_fwD|)_lhKKa)m)XuXW>z_U50}*(M!@qJW55&qt#a<0hASsyd){wij|^% zh;M%N^?tmbV+8s}^)7@54pcOQP?2F!4q{p1Xdg<%YE(Q@|Fkcsac3N6(4CmY$#ot^ z7g0_kr}=7TX}RHWG>@UrE_W4#RnGy{&hpa{`B9P31_&Yul`Oc^&EwujcMw+9AQ&*< zKtyFT@qoZ^LYhV@;ntPo6tGPulEEN9m}Gr0knyHtlUL@-0s*jM;T1s>fRD84IaV^o zAo6rrtFN6C!iWcXR5}&Fd5o-_e+h5`RAVF(EKU;u0uZLGj{pd(4Jt0Ow`HD5 zS#tL6E57dI^_+v3d`Gd9fhGixoCpjw5n1#Sr*iZ$>$S&s1wzPuMOKW)@vN7MSS@5C zg`tSC%D*r-}*(1cH%AA&iMcHk`C!V8sGJP!Vwg=mwDqj%GO_vVR_tjc=Ox$Ou3{ zh|FfzoW)5<#HWd`L9m^Z5u3}ZpD$kBhIBU7owL33AoJ2J72*80( zWJCm100=~OaRaM=eSUlW=l-=L8XPdtCZY?-85SZ4z?>|c{gQ_pv^=RcfP9f5hNaCw z#mOVUf`l1VW3>*2KrC&P;o>kEA|ePGnZw@8G#Ewsv!@flz>2UPLelDxIy7OiaHbj6 z0ph+FsBXre`bIh*?aHl}PNVM+xVKBX>r-q8osSlMDd`5HZT#6|aC z+T)Q?Ol2`5fFVR>F%bk{`y2n=0Dqky?f>@I!CG4j8Ao^A_<$)iIy@K(Ve6A z@p5&?O62Obs7W4qq;mOk@(NHp<1=EdxNt(qs1N`$-V9)@;4)+nU^+IM@Jwd*2GQlkBKTIJvVs8BL|&>1E%D-IL=ZtZB~Ej4B8Xi3 zy64ezREj}}AUsk*?I8ijU-@qg00`cH`J?{-{bSNzYo;yTRL|(*bX9VNO6movZLHNt zXak5ah!9wCp$$R=P|e|NF9iqGj#W8MA_Q#!Do!%RsA$6=b!EVCIP$PIGSxU)shqrI z_quY*KQniuWn3eQk<$+qTDqf&CfyOK84&=2fhGt|%Hg7)qZ1i9 zQ>8wI)nHbEbcWUTJ~JINnnV*2U9$o>#cWJ1W4Vy@lvzn@&XI`v8VLZbVkdLkCpsL^ zCbvpx4grA>k&y`o=@CLjL<_5|t7`u%|Fs2g001C(|2e*URHg4;~s@ItF8M*{HIJijg(|Ks8Q)n(@ktumnVg5FTwpG!`PW z+&KsPG(?G|W)N;xK%0eDtQ`Q4mmBmOujd&37?h*}=uR=3FfcOem4pln0H9MDBd;{^ zp1!Bf031*%3D^Q7#5l&yZ=u~rA=IQe*Z@r`K2iaMsk2PfnTcgpt*nxD=Z>?gBa=&` jm*D5v84(%6J&z$^uUYa)H^{$sL3A{(e&^p800000-+G4! literal 0 HcmV?d00001 diff --git a/public/product/check.svg b/public/product/check.svg new file mode 100644 index 0000000..a7b9b97 --- /dev/null +++ b/public/product/check.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/product/wechat.svg b/public/product/wechat.svg new file mode 100644 index 0000000..e8ffeaf --- /dev/null +++ b/public/product/wechat.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/app/(home)/page.tsx b/src/app/(home)/page.tsx deleted file mode 100644 index fa3caeb..0000000 --- a/src/app/(home)/page.tsx +++ /dev/null @@ -1,227 +0,0 @@ -import {ReactNode} from 'react' -import Link from 'next/link' -import Header from '@/app/(home)/header' -import Wrap from '@/components/wrap' -import Image from 'next/image' -import Footer from './footer' - -export default function Home() { - return ( -
- {/* 页头 */} -
- - {/* 正文 */} -
- - {/* banner */} -
- -

安全,稳定,快速,合规的代理服务器

-

遍布全国的代理服务器节点为用户提供智能可靠的IP代理服务

- -
-

- {`checkbox`} - 全国200+城市节点 -

-

- {`checkbox`} - 300+城市级精准定位 -

-

- {`checkbox`} - 低延迟&高并发提取 -

-
- - -
-
- - {/* 数据展示 */} -
-
    -
  • -

    全国城市线路数量

    -

    350+

    -
    -
  • -
  • -

    每日更新IP数量

    -

    1,350,129

    -
    -
  • -
  • -

    用户量

    -

    26,578

    -
    -
  • -
  • -

    IP可用率

    -

    99%

    -
  • -
- {`map`} -
- - - {/* 优势 1 */} -
-
    - - - - -
-
- - {/* 优势 2 */} -
-
-
    - - - -
- {`s2-1-main`} -
- -
- {`s2-1-main`} -
    - - - -
-
-
- - {/* 行业资讯 */} -
-
- - -
- tumb -
-

- 我是标题 - 2025-03-04 -

-

- 我是内容我是内容我是内容我是内容我是内容我是容我是内容我是内容内容我是内容我是内容我是内我是内容我是内容我是内容我是内容我是内容... -

- -
-
- - -
-
-
- - {/* 页脚 */} -
-
- ) -} - -function Section(props: { - title: string - children: ReactNode -}) { - - return ( -
-
-

{props.title}

- {props.children} -
-
- ) -} - -function Sec3Item(props: { - icon: string, - title: string, - terms: { - icon: string, - text: string, - }[] -}) { - return ( -
  • - {`s1-1`} -

    {props.title}

    -
    - {props.terms.map((item, index) => { - return ( -

    - {`check`} - {item.text} -

    - ) - })} -
    -
  • - ) -} - -function Sec4Item(props: { - icon: string - title: string - description: string -}) { - return ( -
  • - {`s2-1-1`} -
    -

    {props.title}

    -

    {props.description}

    -
    -
  • - ) -} diff --git a/src/app/(root)/collect/form-section.tsx b/src/app/(root)/collect/form-section.tsx new file mode 100644 index 0000000..8df781f --- /dev/null +++ b/src/app/(root)/collect/form-section.tsx @@ -0,0 +1,311 @@ +'use client' +import { z } from 'zod' +import { useForm } from 'react-hook-form' +import { zodResolver } from '@hookform/resolvers/zod' +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form' +import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group' +import { Input } from '@/components/ui/input' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' +import { Button } from '@/components/ui/button' + +const schema = z.object({ + type: z.enum([`num`, `time`]), + order: z.number(), + region: z.string(), + provider: z.string(), + proto: z.string(), + distinct: z.string(), + format: z.enum([`txt`, `json`]), + separator: z.string(), + count: z.number(), +}) + +type FormSectionProps = {} + +export default function FormSection(props: FormSectionProps) { + + const form = useForm>({ + resolver: zodResolver(schema), + defaultValues: { + type: `num`, + order: 0, + region: ``, + provider: ``, + proto: ``, + distinct: ``, + format: `txt`, + separator: `,`, + count: 0, + }, + }) + + const onSubmit = (values: z.infer) => { + console.log(values) + // 在这里处理表单提交 + } + + return ( +
    + +
      +
    • + +
    • +
    • + +
    • +
    +

    + {`warn`} + 提取IP前需要将本机IP添加到白名单后才可使用 +

    + +
    + {/* 套餐类型 */} +
    + 套餐类型 + ( + + + +
    + + +
    +
    + + +
    +
    +
    + +
    + )} + /> +
    + + {/* 已购套餐 */} +
    + 已购套餐 + ( + + + + + + + )} + /> +
    + + {/* 地区筛选 */} +
    + 地区筛选 + ( + + + + + + + )} + /> +
    + + {/* 运营商筛选 */} +
    + 运营商筛选 + ( + + + + + + + )} + /> +
    + + {/* 协议类型 */} +
    + 协议类型 + ( + + + + + + + )} + /> +
    + + {/* 去重选项 */} +
    + 去重选项 + ( + + + + + + + )} + /> +
    + + {/* 导出格式 */} +
    + 导出格式 + ( + + + +
    + + +
    +
    + + +
    +
    +
    + +
    + )} + /> +
    + + {/* 分隔符 */} +
    + 分隔符 + ( + + + + + + + )} + /> +
    + + {/* 提取数量 */} +
    + 提取数量 + ( + + + field.onChange(Number(e.target.value))} + className="h-10" + placeholder="输入提取数量" + /> + + + + )} + /> +
    +
    + +
    + +
    +
    + + ) +} \ No newline at end of file diff --git a/src/app/(root)/collect/page.tsx b/src/app/(root)/collect/page.tsx new file mode 100644 index 0000000..bc44e1f --- /dev/null +++ b/src/app/(root)/collect/page.tsx @@ -0,0 +1,19 @@ +import BreadCrumb from '@/components/bread-crumb' +import Wrap from '@/components/wrap' +import FormSection from '@/app/(root)/collect/form-section' + +export type CollectPageProps = {} + +export default function CollectPage(props: CollectPageProps) { + return ( +
    + + +

    提取 IP

    + +
    +
    + ) +} diff --git a/src/app/(home)/footer.tsx b/src/app/(root)/footer.tsx similarity index 100% rename from src/app/(home)/footer.tsx rename to src/app/(root)/footer.tsx diff --git a/src/app/(home)/header.tsx b/src/app/(root)/header.tsx similarity index 99% rename from src/app/(home)/header.tsx rename to src/app/(root)/header.tsx index e41ed33..5bd68c7 100644 --- a/src/app/(home)/header.tsx +++ b/src/app/(root)/header.tsx @@ -134,7 +134,7 @@ export default function Header(props: HeaderProps) {
    {/* logo */} - + {`logo`} diff --git a/src/app/(root)/layout.tsx b/src/app/(root)/layout.tsx new file mode 100644 index 0000000..6d69514 --- /dev/null +++ b/src/app/(root)/layout.tsx @@ -0,0 +1,22 @@ +import Header from '@/app/(root)/header' +import Footer from '@/app/(root)/footer' +import {ReactNode} from 'react' + +export type RootLayoutProps = { + children: ReactNode +} + +export default function RootLayout(props: RootLayoutProps) { + return ( +
    + {/* 页头 */} +
    + + {/* 正文 */} + {props.children} + + {/* 页脚 */} +
    +
    + ) +} diff --git a/src/app/(root)/page.tsx b/src/app/(root)/page.tsx new file mode 100644 index 0000000..4382406 --- /dev/null +++ b/src/app/(root)/page.tsx @@ -0,0 +1,215 @@ +import {ReactNode} from 'react' +import Wrap from '@/components/wrap' +import Image from 'next/image' + +export default function Home() { + return ( +
    + + {/* banner */} +
    + +

    安全,稳定,快速,合规的代理服务器

    +

    遍布全国的代理服务器节点为用户提供智能可靠的IP代理服务

    + +
    +

    + {`checkbox`} + 全国200+城市节点 +

    +

    + {`checkbox`} + 300+城市级精准定位 +

    +

    + {`checkbox`} + 低延迟&高并发提取 +

    +
    + + +
    +
    + + {/* 数据展示 */} +
    +
      +
    • +

      全国城市线路数量

      +

      350+

      +
      +
    • +
    • +

      每日更新IP数量

      +

      1,350,129

      +
      +
    • +
    • +

      用户量

      +

      26,578

      +
      +
    • +
    • +

      IP可用率

      +

      99%

      +
    • +
    + {`map`} +
    + + + {/* 优势 1 */} +
    +
      + + + + +
    +
    + + {/* 优势 2 */} +
    +
    +
      + + + +
    + {`s2-1-main`} +
    + +
    + {`s2-1-main`} +
      + + + +
    +
    +
    + + {/* 行业资讯 */} +
    +
    + + +
    + tumb +
    +

    + 我是标题 + 2025-03-04 +

    +

    + 我是内容我是内容我是内容我是内容我是内容我是容我是内容我是内容内容我是内容我是内容我是内我是内容我是内容我是内容我是内容我是内容... +

    + +
    +
    + + +
    +
    +
    + ) +} + +function Section(props: { + title: string + children: ReactNode +}) { + + return ( +
    +
    +

    {props.title}

    + {props.children} +
    +
    + ) +} + +function Sec3Item(props: { + icon: string, + title: string, + terms: { + icon: string, + text: string, + }[] +}) { + return ( +
  • + {`s1-1`} +

    {props.title}

    +
    + {props.terms.map((item, index) => { + return ( +

    + {`check`} + {item.text} +

    + ) + })} +
    +
  • + ) +} + +function Sec4Item(props: { + icon: string + title: string + description: string +}) { + return ( +
  • + {`s2-1-1`} +
    +

    {props.title}

    +

    {props.description}

    +
    +
  • + ) +} diff --git a/src/app/(root)/product/combo.tsx b/src/app/(root)/product/combo.tsx new file mode 100644 index 0000000..213d0ff --- /dev/null +++ b/src/app/(root)/product/combo.tsx @@ -0,0 +1,43 @@ +'use client' +import {useState} from 'react' + +export function Combo(props: { + name: string + level?: { + number: number + discount: number + }[] +}) { + + const [open, setOpen] = useState(false) + + return ( +
  • +

    + {props.name} + +

    + {props.level && ( +
      + {props.level.map((item, index) => ( +
    • + {item.number} + 赠送 {item.discount} % +
    • + ))} +
    + )} +
  • + ) +} diff --git a/src/app/(root)/product/page.tsx b/src/app/(root)/product/page.tsx new file mode 100644 index 0000000..84dbb0e --- /dev/null +++ b/src/app/(root)/product/page.tsx @@ -0,0 +1,259 @@ +import BreadCrumb from '@/components/bread-crumb' +import Wrap from '@/components/wrap' +import {Combo} from '@/app/(root)/product/combo' + + +export type ProductPageProps = {} + +export default function ProductPage(props: ProductPageProps) { + return ( +
    + + + +

    多种套餐选择

    + +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    + +
    + +
    + +
    +
    +
    + ) +} + +function Left() { + return ( +
    + {`banner`} +

    包量套餐

    +
      + + + + + +
    +
    +

    包时套餐

    +
      +
    • + 7天 + 9折 +
    • +
    • + 30天 + 8折 +
    • +
    • + 90天 + 7折 +
    • +
    • + 180天 + 6折 +
    • +
    • + 360天 + 5折 +
    • +
    +
    + ) +} + +function Center() { + return ( +
    + +

    计费方式

    +
    + + +
    + +

    IP 时效

    +
    + + + + + +
    + + {/* 赠送 IP 数 */} +

    赠送IP总数

    +
    + + + +
    + + {/* 产品特性 */} +

    产品特性

    +
    +

    + {`check`} + 支持高并发提取 +

    +

    + {`check`} + 指定省份、城市或混播 +

    +

    + {`check`} + 账密+白名单验证 +

    +

    + {`check`} + 完备的API接口 +

    +

    + {`check`} + IP时效3-30分钟(可定制) +

    +

    + {`check`} + IP资源定期筛选 +

    +

    + {`check`} + 完备的API接口 +

    +

    + {`check`} + 包量/包时计费方式 +

    +

    + {`check`} + 每日去重量:500万 +

    +
    + + {/* 左右的边框 */} +
    +
    + ) +} + +function Right() { + return ( +
    +

    订单详情

    +
      +
    • + 套餐名称 + 包量套餐 +
    • +
    • + 套餐时长 + 3分钟 +
    • +
    • + 购买 IP 量 + 1000个 +
    • +
    • + 实到 IP 量 + 1000个 +
    • +
    • + 原价 + ¥50 +
    • +
    +
    +

    + 实付价格 + ¥50 +

    +
    + + +
    + +
    + ) +} diff --git a/src/app/globals.css b/src/app/globals.css index 1501140..d2549f7 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,5 +1,126 @@ @import "tailwindcss"; +@plugin "tailwindcss-animate"; + +@custom-variant dark (&:is(.dark *)); + body { - color: hsl(0, 0%, 20%); + color: hsl(0, 0%, 10%); +} + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.13 0.028 261.692); + --card: oklch(1 0 0); + --card-foreground: oklch(0.13 0.028 261.692); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.13 0.028 261.692); + --primary: oklch(0.21 0.034 264.665); + --primary-foreground: oklch(0.985 0.002 247.839); + --secondary: oklch(0.967 0.003 264.542); + --secondary-foreground: oklch(0.21 0.034 264.665); + --muted: oklch(0.967 0.003 264.542); + --muted-foreground: oklch(0.551 0.027 264.364); + --accent: oklch(0.967 0.003 264.542); + --accent-foreground: oklch(0.21 0.034 264.665); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.928 0.006 264.531); + --input: oklch(0.928 0.006 264.531); + --ring: oklch(0.707 0.022 261.325); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0.002 247.839); + --sidebar-foreground: oklch(0.13 0.028 261.692); + --sidebar-primary: oklch(0.21 0.034 264.665); + --sidebar-primary-foreground: oklch(0.985 0.002 247.839); + --sidebar-accent: oklch(0.967 0.003 264.542); + --sidebar-accent-foreground: oklch(0.21 0.034 264.665); + --sidebar-border: oklch(0.928 0.006 264.531); + --sidebar-ring: oklch(0.707 0.022 261.325); +} + +.dark { + --background: oklch(0.13 0.028 261.692); + --foreground: oklch(0.985 0.002 247.839); + --card: oklch(0.21 0.034 264.665); + --card-foreground: oklch(0.985 0.002 247.839); + --popover: oklch(0.21 0.034 264.665); + --popover-foreground: oklch(0.985 0.002 247.839); + --primary: oklch(0.928 0.006 264.531); + --primary-foreground: oklch(0.21 0.034 264.665); + --secondary: oklch(0.278 0.033 256.848); + --secondary-foreground: oklch(0.985 0.002 247.839); + --muted: oklch(0.278 0.033 256.848); + --muted-foreground: oklch(0.707 0.022 261.325); + --accent: oklch(0.278 0.033 256.848); + --accent-foreground: oklch(0.985 0.002 247.839); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.551 0.027 264.364); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.21 0.034 264.665); + --sidebar-foreground: oklch(0.985 0.002 247.839); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0.002 247.839); + --sidebar-accent: oklch(0.278 0.033 256.848); + --sidebar-accent-foreground: oklch(0.985 0.002 247.839); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.551 0.027 264.364); +} + +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + + body { + @apply bg-background text-foreground; + } } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index facb3ca..d1ab2d5 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -17,7 +17,7 @@ export default function RootLayout({ }>) { return ( - + {children} diff --git a/src/components/animation/page-switcher.tsx b/src/components/animation/page-switcher.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/components/bread-crumb.tsx b/src/components/bread-crumb.tsx new file mode 100644 index 0000000..fb6fada --- /dev/null +++ b/src/components/bread-crumb.tsx @@ -0,0 +1,63 @@ +import { ReactNode } from 'react' +import Link from 'next/link' + +export type BreadCrumbItem = { + label: string + href?: string + onClick?: () => void +} + +export type BreadCrumbProps = { + items: BreadCrumbItem[] + divider?: ReactNode + showHomeIcon?: boolean + className?: string +} + +export default function BreadCrumb({ + items, + divider = '/', + showHomeIcon = true, + className = '', +}: BreadCrumbProps) { + return ( + + ) +} diff --git a/src/components/dropdown/example-structure.tsx b/src/components/dropdown/example-structure.tsx deleted file mode 100644 index 06d7bca..0000000 --- a/src/components/dropdown/example-structure.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { useState } from 'react'; -import { motion, AnimatePresence } from 'framer-motion'; - -export const Dropdown = () => { - const [isOpen, setIsOpen] = useState(false); - - return ( -
    - - - - {isOpen && ( - - {/* 菜单内容 */} - - )} - -
    - ); -}; diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx new file mode 100644 index 0000000..a2df8dc --- /dev/null +++ b/src/components/ui/button.tsx @@ -0,0 +1,59 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", + destructive: + "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", + secondary: + "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", + ghost: + "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2 has-[>svg]:px-3", + sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", + lg: "h-10 rounded-md px-6 has-[>svg]:px-4", + icon: "size-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<"button"> & + VariantProps & { + asChild?: boolean + }) { + const Comp = asChild ? Slot : "button" + + return ( + + ) +} + +export { Button, buttonVariants } diff --git a/src/components/ui/form.tsx b/src/components/ui/form.tsx new file mode 100644 index 0000000..524b986 --- /dev/null +++ b/src/components/ui/form.tsx @@ -0,0 +1,167 @@ +"use client" + +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { Slot } from "@radix-ui/react-slot" +import { + Controller, + FormProvider, + useFormContext, + useFormState, + type ControllerProps, + type FieldPath, + type FieldValues, +} from "react-hook-form" + +import { cn } from "@/lib/utils" +import { Label } from "@/components/ui/label" + +const Form = FormProvider + +type FormFieldContextValue< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +> = { + name: TName +} + +const FormFieldContext = React.createContext( + {} as FormFieldContextValue +) + +const FormField = < + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +>({ + ...props +}: ControllerProps) => { + return ( + + + + ) +} + +const useFormField = () => { + const fieldContext = React.useContext(FormFieldContext) + const itemContext = React.useContext(FormItemContext) + const { getFieldState } = useFormContext() + const formState = useFormState({ name: fieldContext.name }) + const fieldState = getFieldState(fieldContext.name, formState) + + if (!fieldContext) { + throw new Error("useFormField should be used within ") + } + + const { id } = itemContext + + return { + id, + name: fieldContext.name, + formItemId: `${id}-form-item`, + formDescriptionId: `${id}-form-item-description`, + formMessageId: `${id}-form-item-message`, + ...fieldState, + } +} + +type FormItemContextValue = { + id: string +} + +const FormItemContext = React.createContext( + {} as FormItemContextValue +) + +function FormItem({ className, ...props }: React.ComponentProps<"div">) { + const id = React.useId() + + return ( + +
    + + ) +} + +function FormLabel({ + className, + ...props +}: React.ComponentProps) { + const { error, formItemId } = useFormField() + + return ( +