From ea12adebc61c80232297475b87903a9cb4476ca7 Mon Sep 17 00:00:00 2001 From: bicochan Date: Wed, 30 Jul 2025 15:40:12 +0900 Subject: [PATCH 01/36] =?UTF-8?q?[apps/cs]=20feat:=20=EC=8B=A0=EA=B7=9C=20?= =?UTF-8?q?=ED=91=B8=ED=84=B0=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/common/components/package.json | 1 + packages/common/components/src/api/site.ts | 2 +- .../common/components/src/ui/footer/index.tsx | 68 + .../common/components/src/ui/layout/base.tsx | 10 +- .../components/src/ui/layout/footer.tsx | 9 - .../common/components/src/ui/layout/vbase.tsx | 2 +- .../common/components/src/ui/lnb/index.tsx | 2 +- pnpm-lock.yaml | 10847 ++++++++++++++++ 8 files changed, 10923 insertions(+), 18 deletions(-) create mode 100644 packages/common/components/src/ui/footer/index.tsx delete mode 100644 packages/common/components/src/ui/layout/footer.tsx create mode 100644 pnpm-lock.yaml diff --git a/packages/common/components/package.json b/packages/common/components/package.json index 96d381605..3cef3b0f0 100644 --- a/packages/common/components/package.json +++ b/packages/common/components/package.json @@ -58,6 +58,7 @@ "clsx": "^2.1.1", "date-fns": "^3.6.0", "dayjs": "^1.11.13", + "embla-carousel-autoplay": "^8.6.0", "embla-carousel-react": "^8.6.0", "js-cookie": "^3.0.5", "lucide-react": "^0.474.0", diff --git a/packages/common/components/src/api/site.ts b/packages/common/components/src/api/site.ts index da4de293f..f08b7c0a0 100644 --- a/packages/common/components/src/api/site.ts +++ b/packages/common/components/src/api/site.ts @@ -36,5 +36,5 @@ export const getSiteInfo = async (siteId: string) => { }, }, ); - return response.json(); + return response.json() as Promise; }; diff --git a/packages/common/components/src/ui/footer/index.tsx b/packages/common/components/src/ui/footer/index.tsx new file mode 100644 index 000000000..a760be6a5 --- /dev/null +++ b/packages/common/components/src/ui/footer/index.tsx @@ -0,0 +1,68 @@ +import { useQuery } from "@tanstack/react-query"; +import Autoplay from "embla-carousel-autoplay"; +import { getConfig } from "@common/config"; +import { ENDPOINT } from "../../config"; +import { getSiteInfo } from "../../api"; +import { + Carousel, + CarouselContent, + CarouselItem, + CarouselNext, + CarouselPrevious, +} from "../carousel"; +import { useRef } from "react"; + +const appConfig = getConfig(); +const siteId = appConfig.SITE_ID ?? ""; + +export function Footer() { + const { data: siteInfo } = useQuery({ + queryKey: [ENDPOINT.CMS_SERVICE.SITES, siteId], + queryFn: () => getSiteInfo(siteId), + }); + + const plugin = useRef(Autoplay({ delay: 2000, stopOnInteraction: true })); + + return ( +
+
+
{siteInfo?.siteExpln ?? ""}
+

+ 전화: {siteInfo?.telNo ?? ""} / 팩스: {siteInfo?.faxNumber ?? ""} +

+

{siteInfo?.lwndCn ?? ""}

+

+ 본 시스템은 Chrome, Firefox, Safari, Edge 브라우저에 최적화되어 + 있습니다. +

+
+
+
+ 개인정보처리방침 + 이용약관 + 사이트맵 + 고객센터 +
+ + + {Array.from({ length: 10 }).map((_, i) => ( + +
+
+ {`${i + 1}번째 배너`} +
+
+
+ ))} +
+ + +
+
+
+ ); +} diff --git a/packages/common/components/src/ui/layout/base.tsx b/packages/common/components/src/ui/layout/base.tsx index 6eb1322b0..272390d35 100644 --- a/packages/common/components/src/ui/layout/base.tsx +++ b/packages/common/components/src/ui/layout/base.tsx @@ -6,7 +6,7 @@ import type { MenuItem } from "../../api"; import { SidebarProvider } from "../sidebar"; import { LNB } from "../lnb"; import { Header } from "../header"; -import { Footer } from "./footer"; +import { Footer } from "../footer"; import "./common.css"; export function BaseLayout({ @@ -27,15 +27,13 @@ export function BaseLayout({
-
+
-
-
- {children} -
+
+
{children}
diff --git a/packages/common/components/src/ui/layout/footer.tsx b/packages/common/components/src/ui/layout/footer.tsx deleted file mode 100644 index f49b960b2..000000000 --- a/packages/common/components/src/ui/layout/footer.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export function Footer() { - return ( -
-

- © 2025 Ona And All. All Rights Reserved. -

-
- ); -} diff --git a/packages/common/components/src/ui/layout/vbase.tsx b/packages/common/components/src/ui/layout/vbase.tsx index 48cc4639b..7868a412f 100644 --- a/packages/common/components/src/ui/layout/vbase.tsx +++ b/packages/common/components/src/ui/layout/vbase.tsx @@ -2,7 +2,7 @@ import { QueryProvider } from "../../provider/query-provider"; import { SidebarProvider } from "../sidebar"; import { LNB } from "../lnb"; import { Header } from "../header"; -import { Footer } from "./footer"; +import { Footer } from "../footer"; import "./common.css"; import type { QueryClient } from "@tanstack/react-query"; diff --git a/packages/common/components/src/ui/lnb/index.tsx b/packages/common/components/src/ui/lnb/index.tsx index 8f63a08f3..d7fabd39b 100644 --- a/packages/common/components/src/ui/lnb/index.tsx +++ b/packages/common/components/src/ui/lnb/index.tsx @@ -247,7 +247,7 @@ export function LNB({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..adb241611 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,10847 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + +importers: + + .: + dependencies: + chart.js: + specifier: ^4.4.8 + version: 4.4.8 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-chartjs-2: + specifier: ^5.3.0 + version: 5.3.0(chart.js@4.4.8)(react@18.3.1) + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + zustand: + specifier: ^5.0.3 + version: 5.0.3(@types/react@18.3.18)(react@18.3.1) + devDependencies: + '@types/node': + specifier: ^22.13.9 + version: 22.13.9 + '@types/react': + specifier: ^18.3.18 + version: 18.3.18 + '@types/react-dom': + specifier: ^18.3.5 + version: 18.3.5(@types/react@18.3.18) + turbo: + specifier: 2.4.2 + version: 2.4.2 + + apps/common/features: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../../../packages/common/assets + '@common/components': + specifier: workspace:* + version: link:../../../packages/common/components + '@common/config': + specifier: workspace:* + version: link:../../../packages/common/config + '@common/network': + specifier: workspace:* + version: link:../../../packages/common/network + '@fontsource-variable/noto-sans-kr': + specifier: ^5.2.5 + version: 5.2.5 + '@frontend-opensource/use-react-hooks': + specifier: ^1.1.4 + version: 1.1.4 + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2) + '@minoru/react-dnd-treeview': + specifier: ^3.5.0 + version: 3.5.0(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-icons': + specifier: ^1.3.2 + version: 1.3.2(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.2 + version: 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.67.1 + version: 5.67.1(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.75.5 + version: 5.75.5(@tanstack/react-query@5.67.1)(react@18.3.1) + '@tanstack/react-table': + specifier: ^8.21.2 + version: 8.21.2(react-dom@18.3.1)(react@18.3.1) + '@tinymce/tinymce-react': + specifier: ^6.1.0 + version: 6.1.0(react-dom@18.3.1)(react@18.3.1) + axios: + specifier: ^1.8.1 + version: 1.8.1 + chart.js: + specifier: ^4.4.8 + version: 4.4.8 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + next: + specifier: 15.3.0 + version: 15.3.0(react-dom@18.3.1)(react@18.3.1) + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@18.3.1)(react@18.3.1) + react-chartjs-2: + specifier: ^5.3.0 + version: 5.3.0(chart.js@4.4.8)(react@18.3.1) + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@22.13.9)(@types/react@18.3.18)(react@18.3.1) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@18.3.1) + sonner: + specifier: ^2.0.1 + version: 2.0.1(react-dom@18.3.1)(react@18.3.1) + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + tus-js-client: + specifier: ^4.3.1 + version: 4.3.1 + zod: + specifier: ^3.24.2 + version: 3.24.2 + zustand: + specifier: ^5.0.3 + version: 5.0.3(@types/react@18.3.18)(react@18.3.1) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + '@types/node': + specifier: ^22.13.1 + version: 22.13.9 + '@types/webpack': + specifier: ^5.28.5 + version: 5.28.5 + eslint: + specifier: ^9 + version: 9.21.0 + eslint-config-next: + specifier: 15.1.7 + version: 15.1.7(eslint@9.21.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.5.3 + prettier: + specifier: ^3.4.2 + version: 3.5.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.11(prettier@3.5.2) + steiger: + specifier: ^0.5.5 + version: 0.5.5(typescript@5.6.3) + tailwindcss: + specifier: ^3.4.1 + version: 3.4.17 + typescript: + specifier: ^5 + version: 5.6.3 + + apps/cs: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../../packages/common/assets + '@common/components': + specifier: workspace:* + version: link:../../packages/common/components + '@common/config': + specifier: workspace:* + version: link:../../packages/common/config + '@fontsource-variable/noto-sans-kr': + specifier: ^5.2.5 + version: 5.2.5 + '@frontend-opensource/use-react-hooks': + specifier: ^1.1.4 + version: 1.1.4 + '@fullcalendar/core': + specifier: ^6.1.17 + version: 6.1.17 + '@fullcalendar/daygrid': + specifier: ^6.1.17 + version: 6.1.17(@fullcalendar/core@6.1.17) + '@fullcalendar/interaction': + specifier: ^6.1.17 + version: 6.1.17(@fullcalendar/core@6.1.17) + '@fullcalendar/react': + specifier: ^6.1.17 + version: 6.1.17(@fullcalendar/core@6.1.17)(react-dom@18.3.1)(react@18.3.1) + '@fullcalendar/timegrid': + specifier: ^6.1.17 + version: 6.1.17(@fullcalendar/core@6.1.17) + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2) + '@minoru/react-dnd-treeview': + specifier: 3.5.1-alpha.1 + version: 3.5.1-alpha.1(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-icons': + specifier: ^1.3.2 + version: 1.3.2(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.2 + version: 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-tooltip': + specifier: ^1.1.8 + version: 1.1.8(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.67.1 + version: 5.67.1(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.75.5 + version: 5.75.5(@tanstack/react-query@5.67.1)(react@18.3.1) + '@tanstack/react-table': + specifier: ^8.21.2 + version: 8.21.2(react-dom@18.3.1)(react@18.3.1) + '@tinymce/tinymce-react': + specifier: ^6.1.0 + version: 6.1.0(react-dom@18.3.1)(react@18.3.1) + axios: + specifier: ^1.8.1 + version: 1.8.1 + chart.js: + specifier: ^4.4.8 + version: 4.4.8 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + lucide-react: + specifier: ^0.474.0 + version: 0.474.0(react@18.3.1) + next: + specifier: 15.3.0 + version: 15.3.0(react-dom@18.3.1)(react@18.3.1) + next-qrcode: + specifier: ^2.5.1 + version: 2.5.1(react@18.3.1) + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@18.3.1)(react@18.3.1) + react-chartjs-2: + specifier: ^5.3.0 + version: 5.3.0(chart.js@4.4.8)(react@18.3.1) + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@22.13.5)(@types/react@18.3.18)(react@18.3.1) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@18.3.1) + sonner: + specifier: ^2.0.1 + version: 2.0.1(react-dom@18.3.1)(react@18.3.1) + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + tus-js-client: + specifier: ^4.3.1 + version: 4.3.1 + zod: + specifier: ^3.24.2 + version: 3.24.2 + zustand: + specifier: ^5.0.3 + version: 5.0.3(@types/react@18.3.18)(react@18.3.1) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + '@types/node': + specifier: ^22.13.1 + version: 22.13.5 + '@types/webpack': + specifier: ^5.28.5 + version: 5.28.5 + eslint: + specifier: ^9 + version: 9.21.0 + eslint-config-next: + specifier: 15.1.7 + version: 15.1.7(eslint@9.21.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.5.3 + prettier: + specifier: ^3.4.2 + version: 3.5.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.11(prettier@3.5.2) + steiger: + specifier: ^0.5.5 + version: 0.5.5(typescript@5.6.3) + tailwindcss: + specifier: ^3.4.1 + version: 3.4.17 + typescript: + specifier: ^5 + version: 5.6.3 + + apps/dm: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../../packages/common/assets + '@common/business_components': + specifier: workspace:* + version: link:../../packages/common/business_components + '@common/components': + specifier: workspace:* + version: link:../../packages/common/components + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + js-sha512: + specifier: ^0.9.0 + version: 0.9.0 + lucide-react: + specifier: ^0.474.0 + version: 0.474.0(react@18.3.1) + next: + specifier: 15.1.7 + version: 15.1.7(react-dom@18.3.1)(react@18.3.1) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@18.3.1) + react-hot-toast: + specifier: ^2.5.2 + version: 2.5.2(react-dom@18.3.1)(react@18.3.1) + tailwind-merge: + specifier: ^3.0.1 + version: 3.0.2 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + zod: + specifier: ^3.24.2 + version: 3.24.2 + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + '@types/webpack': + specifier: ^5.28.5 + version: 5.28.5 + eslint: + specifier: ^9 + version: 9.21.0 + eslint-config-next: + specifier: 15.1.7 + version: 15.1.7(eslint@9.21.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.5.3 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.17 + typescript: + specifier: ^5 + version: 5.6.3 + + apps/fo: + dependencies: + '@common/business_components': + specifier: workspace:* + version: link:../../packages/common/business_components + '@common/components': + specifier: workspace:* + version: link:../../packages/common/components + '@tailwindcss/vite': + specifier: ^4.0.10 + version: 4.1.11(vite@6.2.0) + html2canvas: + specifier: ^1.4.1 + version: 1.4.1 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + next: + specifier: 15.1.7 + version: 15.1.7(react-dom@18.3.1)(react@18.3.1) + select: + specifier: ^1.1.2 + version: 1.1.2 + webpack: + specifier: ^5.98.0 + version: 5.98.0 + zustand: + specifier: ^5.0.3 + version: 5.0.3(@types/react@18.3.18)(react@18.3.1) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + eslint: + specifier: ^9 + version: 9.21.0 + eslint-config-next: + specifier: 15.1.7 + version: 15.1.7(eslint@9.21.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.5.3 + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17 + typescript: + specifier: ^5.6.3 + version: 5.6.3 + + apps/sn: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../../packages/common/assets + '@common/business_components': + specifier: workspace:* + version: link:../../packages/common/business_components + '@common/components': + specifier: workspace:* + version: link:../../packages/common/components + '@fontsource-variable/noto-sans-kr': + specifier: ^5.2.5 + version: 5.2.5 + '@frontend-opensource/use-react-hooks': + specifier: ^1.1.4 + version: 1.1.4 + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2) + '@minoru/react-dnd-treeview': + specifier: 3.5.1-alpha.1 + version: 3.5.1-alpha.1(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.2 + version: 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.67.1 + version: 5.67.1(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.75.5 + version: 5.75.5(@tanstack/react-query@5.67.1)(react@18.3.1) + '@tanstack/react-table': + specifier: ^8.21.2 + version: 8.21.2(react-dom@18.3.1)(react@18.3.1) + axios: + specifier: ^1.8.1 + version: 1.8.1 + chart.js: + specifier: ^4.4.8 + version: 4.4.8 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + moment: + specifier: ^2.30.1 + version: 2.30.1 + next: + specifier: 15.1.7 + version: 15.1.7(react-dom@18.3.1)(react@18.3.1) + react-chartjs-2: + specifier: ^5.3.0 + version: 5.3.0(chart.js@4.4.8)(react@18.3.1) + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@22.13.9)(@types/react@18.3.18)(react@18.3.1) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@18.3.1) + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + tus-js-client: + specifier: ^4.3.1 + version: 4.3.1 + zod: + specifier: ^3.24.2 + version: 3.24.2 + zustand: + specifier: ^5.0.3 + version: 5.0.3(@types/react@18.3.18)(react@18.3.1) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + '@faker-js/faker': + specifier: ^9.5.0 + version: 9.5.0 + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + '@types/node': + specifier: ^22.13.1 + version: 22.13.9 + '@types/webpack': + specifier: ^5.28.5 + version: 5.28.5 + eslint: + specifier: ^9 + version: 9.21.0 + eslint-config-next: + specifier: 15.1.7 + version: 15.1.7(eslint@9.21.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.5.3 + prettier: + specifier: ^3.4.2 + version: 3.5.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.11(prettier@3.5.2) + steiger: + specifier: ^0.5.5 + version: 0.5.5(typescript@5.6.3) + tailwindcss: + specifier: ^3.4.1 + version: 3.4.17 + typescript: + specifier: ^5 + version: 5.6.3 + + apps/wr: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../../packages/common/assets + '@common/business_components': + specifier: workspace:* + version: link:../../packages/common/business_components + '@common/components': + specifier: workspace:* + version: link:../../packages/common/components + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2) + '@tanstack/react-table': + specifier: ^8.21.2 + version: 8.21.2(react-dom@18.3.1)(react@18.3.1) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + i18next: + specifier: ^25.3.2 + version: 25.3.2(typescript@5.6.3) + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + lucide-react: + specifier: ^0.474.0 + version: 0.474.0(react@18.3.1) + moment: + specifier: ^2.30.1 + version: 2.30.1 + next: + specifier: 15.1.7 + version: 15.1.7(react-dom@18.3.1)(react@18.3.1) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@18.3.1) + react-hot-toast: + specifier: ^2.5.2 + version: 2.5.2(react-dom@18.3.1)(react@18.3.1) + react-i18next: + specifier: ^15.6.0 + version: 15.6.1(i18next@25.3.2)(react-dom@18.3.1)(react@18.3.1)(typescript@5.6.3) + tailwind-merge: + specifier: ^3.0.1 + version: 3.0.2 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + tus-js-client: + specifier: ^4.3.1 + version: 4.3.1 + zod: + specifier: ^3.24.2 + version: 3.24.2 + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + '@types/webpack': + specifier: ^5.28.5 + version: 5.28.5 + eslint: + specifier: ^9 + version: 9.21.0 + eslint-config-next: + specifier: 15.1.7 + version: 15.1.7(eslint@9.21.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.5.3 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.17 + typescript: + specifier: ^5 + version: 5.6.3 + + packages/common/assets: + devDependencies: + '@types/node': + specifier: ^20.11.0 + version: 20.17.19 + tsup: + specifier: ^8.0.1 + version: 8.3.6(postcss@8.5.3)(typescript@5.6.3) + typescript: + specifier: ^5.3.3 + version: 5.6.3 + + packages/common/business_components: + dependencies: + '@common/components': + specifier: workspace:* + version: link:../components + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2) + '@minoru/react-dnd-treeview': + specifier: 3.5.1-alpha.1 + version: 3.5.1-alpha.1(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-scroll-area': + specifier: ^1.2.3 + version: 1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-select': + specifier: ^2.1.6 + version: 2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.2 + version: 1.1.2(@types/react@18.3.18)(react@18.3.1) + axios: + specifier: 1.8.1 + version: 1.8.1 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + date-fns: + specifier: ^3.6.0 + version: 3.6.0 + libphonenumber-js: + specifier: ^1.12.9 + version: 1.12.10 + lucide-react: + specifier: ^0.474.0 + version: 0.474.0(react@18.3.1) + ol: + specifier: ^7.3.0 + version: 7.5.2 + ol-ext: + specifier: ^4.0.11 + version: 4.0.31(ol@7.5.2) + path: + specifier: ^0.12.7 + version: 0.12.7 + proj4: + specifier: ^2.9.0 + version: 2.15.0 + react-day-picker: + specifier: ^8.10.1 + version: 8.10.1(date-fns@3.6.0)(react@18.3.1) + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@22.13.9)(@types/react@18.3.18)(react@18.3.1) + react-dropzone: + specifier: ^14.3.8 + version: 14.3.8(react@18.3.1) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@18.3.1) + recharts: + specifier: ^2.15.1 + version: 2.15.1(react-dom@18.3.1)(react@18.3.1) + sonner: + specifier: ^2.0.1 + version: 2.0.1(react-dom@18.3.1)(react@18.3.1) + tailwind-merge: + specifier: ^3.0.1 + version: 3.0.2 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + xlsx: + specifier: ^0.18.5 + version: 0.18.5 + xlsx-populate: + specifier: ^1.21.0 + version: 1.21.0 + zod: + specifier: ^3.24.2 + version: 3.24.2 + devDependencies: + '@eslint/js': + specifier: ^9.17.0 + version: 9.21.0 + '@storybook/addon-essentials': + specifier: ^8.5.3 + version: 8.6.0(@types/react@18.3.18)(storybook@8.6.0) + '@storybook/addon-interactions': + specifier: ^8.5.3 + version: 8.6.0(storybook@8.6.0) + '@storybook/addon-onboarding': + specifier: ^8.5.3 + version: 8.6.0(storybook@8.6.0) + '@storybook/addon-themes': + specifier: ^8.5.4 + version: 8.6.0(storybook@8.6.0) + '@storybook/blocks': + specifier: ^8.5.3 + version: 8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0) + '@storybook/manager-api': + specifier: ^8.5.5 + version: 8.6.0(storybook@8.6.0) + '@storybook/react': + specifier: ^8.5.3 + version: 8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3) + '@storybook/react-vite': + specifier: ^8.5.3 + version: 8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3)(vite@6.2.0) + '@storybook/test': + specifier: ^8.5.3 + version: 8.6.0(storybook@8.6.0) + '@storybook/theming': + specifier: ^8.5.5 + version: 8.6.0(storybook@8.6.0) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@6.2.0) + '@xlsx/xlsx-populate': + specifier: ^0.0.8 + version: 0.0.8 + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.5.3) + eslint: + specifier: ^9.17.0 + version: 9.21.0 + eslint-plugin-react-hooks: + specifier: ^5.0.0 + version: 5.1.0(eslint@9.21.0) + eslint-plugin-react-refresh: + specifier: ^0.4.16 + version: 0.4.19(eslint@9.21.0) + eslint-plugin-storybook: + specifier: ^0.11.2 + version: 0.11.3(eslint@9.21.0)(typescript@5.6.3) + globals: + specifier: ^15.14.0 + version: 15.15.0 + postcss: + specifier: ^8.5.3 + version: 8.5.3 + prettier: + specifier: ^3.4.2 + version: 3.5.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.11(prettier@3.5.2) + storybook: + specifier: ^8.5.3 + version: 8.6.0(prettier@3.5.2) + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17 + tsup: + specifier: 8.3.6 + version: 8.3.6(postcss@8.5.3)(typescript@5.6.3) + typescript: + specifier: ~5.6.2 + version: 5.6.3 + typescript-eslint: + specifier: ^8.18.2 + version: 8.25.0(eslint@9.21.0)(typescript@5.6.3) + vite: + specifier: ^6.0.5 + version: 6.2.0(@types/node@22.13.9) + vite-tsconfig-paths: + specifier: 5.1.4 + version: 5.1.4(typescript@5.6.3)(vite@6.2.0) + + packages/common/components: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../assets + '@common/config': + specifier: workspace:* + version: link:../config + '@frontend-opensource/use-react-hooks': + specifier: ^1.1.4 + version: 1.1.4 + '@minoru/react-dnd-treeview': + specifier: ^3.5.0 + version: 3.5.0(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-accordion': + specifier: ^1.2.3 + version: 1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-checkbox': + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collapsible': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dialog': + specifier: ^1.1.6 + version: 1.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.6 + version: 2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-icons': + specifier: ^1.3.2 + version: 1.3.2(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-popover': + specifier: ^1.1.6 + version: 1.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-progress': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-radio-group': + specifier: ^1.2.2 + version: 1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-scroll-area': + specifier: ^1.2.3 + version: 1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-select': + specifier: ^2.1.6 + version: 2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-separator': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slider': + specifier: ^1.2.3 + version: 1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.2 + version: 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-switch': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tabs': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tooltip': + specifier: ^1.1.8 + version: 1.1.8(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-visually-hidden': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.67.1 + version: 5.67.1(react@18.3.1) + '@tanstack/react-table': + specifier: ^8.21.2 + version: 8.21.2(react-dom@18.3.1)(react@18.3.1) + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + axios: + specifier: ^1.8.1 + version: 1.8.1 + chart.js: + specifier: ^4.4.8 + version: 4.4.8 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + date-fns: + specifier: ^3.6.0 + version: 3.6.0 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + embla-carousel-autoplay: + specifier: ^8.6.0 + version: 8.6.0(embla-carousel@8.6.0) + embla-carousel-react: + specifier: ^8.6.0 + version: 8.6.0(react@18.3.1) + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + lucide-react: + specifier: ^0.474.0 + version: 0.474.0(react@18.3.1) + react-chartjs-2: + specifier: ^5.3.0 + version: 5.3.0(chart.js@4.4.8)(react@18.3.1) + react-day-picker: + specifier: ^9.7.0 + version: 9.7.0(react@18.3.1) + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@22.13.5)(@types/react@18.3.18)(react@18.3.1) + react-dnd-html5-backend: + specifier: ^16.0.1 + version: 16.0.1 + tailwind-merge: + specifier: ^3.0.1 + version: 3.0.2 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + devDependencies: + '@eslint/js': + specifier: ^9.17.0 + version: 9.21.0 + '@faker-js/faker': + specifier: ^9.5.0 + version: 9.5.0 + '@storybook/addon-essentials': + specifier: ^8.5.3 + version: 8.6.0(@types/react@18.3.18)(storybook@8.6.0) + '@storybook/addon-interactions': + specifier: ^8.5.3 + version: 8.6.0(storybook@8.6.0) + '@storybook/addon-onboarding': + specifier: ^8.5.3 + version: 8.6.0(storybook@8.6.0) + '@storybook/addon-themes': + specifier: ^8.5.4 + version: 8.6.0(storybook@8.6.0) + '@storybook/blocks': + specifier: ^8.5.3 + version: 8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0) + '@storybook/manager-api': + specifier: ^8.5.5 + version: 8.6.0(storybook@8.6.0) + '@storybook/react': + specifier: ^8.5.3 + version: 8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3) + '@storybook/react-vite': + specifier: ^8.5.3 + version: 8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3)(vite@6.2.0) + '@storybook/test': + specifier: ^8.5.3 + version: 8.6.0(storybook@8.6.0) + '@storybook/theming': + specifier: ^8.5.5 + version: 8.6.0(storybook@8.6.0) + '@types/node': + specifier: ^22.13.1 + version: 22.13.5 + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@6.2.0) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.5.3) + eslint: + specifier: ^9.17.0 + version: 9.21.0 + eslint-plugin-react-hooks: + specifier: ^5.0.0 + version: 5.1.0(eslint@9.21.0) + eslint-plugin-react-refresh: + specifier: ^0.4.16 + version: 0.4.19(eslint@9.21.0) + eslint-plugin-storybook: + specifier: ^0.11.2 + version: 0.11.3(eslint@9.21.0)(typescript@5.6.3) + globals: + specifier: ^15.14.0 + version: 15.15.0 + postcss: + specifier: ^8.5.1 + version: 8.5.3 + prettier: + specifier: ^3.4.2 + version: 3.5.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.11(prettier@3.5.2) + storybook: + specifier: ^8.5.3 + version: 8.6.0(prettier@3.5.2) + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17 + tsup: + specifier: 8.3.6 + version: 8.3.6(postcss@8.5.3)(typescript@5.6.3) + typescript: + specifier: ~5.6.2 + version: 5.6.3 + typescript-eslint: + specifier: ^8.18.2 + version: 8.25.0(eslint@9.21.0)(typescript@5.6.3) + vite: + specifier: ^6.0.5 + version: 6.2.0(@types/node@22.13.5) + vite-tsconfig-paths: + specifier: 5.1.4 + version: 5.1.4(typescript@5.6.3)(vite@6.2.0) + + packages/common/config: + devDependencies: + eslint: + specifier: ^9.8.0 + version: 9.21.0 + tsup: + specifier: ^8.2.3 + version: 8.3.6(postcss@8.5.3)(typescript@5.6.3) + typescript: + specifier: ^5.5.3 + version: 5.6.3 + vite: + specifier: ^5.3.5 + version: 5.4.18(@types/node@22.13.9) + + packages/common/network: + dependencies: + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + axios: + specifier: ^1.8.1 + version: 1.8.1 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + devDependencies: + '@types/node': + specifier: ^20.11.19 + version: 20.17.19 + typescript: + specifier: ^5.3.3 + version: 5.6.3 + +packages: + + /@adobe/css-tools@4.4.2: + resolution: {integrity: sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==} + dev: true + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + /@babel/code-frame@7.26.2: + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + dev: true + + /@babel/compat-data@7.26.8: + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.26.9: + resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helpers': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.26.9: + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + dev: true + + /@babel/helper-compilation-targets@7.26.5: + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-module-imports@7.25.9: + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9): + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-plugin-utils@7.26.5: + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-string-parser@7.25.9: + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.25.9: + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.25.9: + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.26.9: + resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + dev: true + + /@babel/parser@7.26.9: + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.26.9 + dev: true + + /@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.9): + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + dev: true + + /@babel/runtime@7.26.9: + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + + /@babel/runtime@7.28.2: + resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/template@7.26.9: + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + dev: true + + /@babel/traverse@7.26.9: + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.26.9: + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + dev: true + + /@clack/core@0.3.5: + resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + dev: true + + /@clack/prompts@0.8.2: + resolution: {integrity: sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==} + dependencies: + '@clack/core': 0.3.5 + picocolors: 1.1.1 + sisteransi: 1.0.5 + dev: true + + /@date-fns/tz@1.2.0: + resolution: {integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==} + dev: false + + /@dependents/detective-less@5.0.1: + resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} + engines: {node: '>=18'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.1 + dev: true + + /@emnapi/runtime@1.4.3: + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + dev: false + optional: true + + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/aix-ppc64@0.24.2: + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/aix-ppc64@0.25.0: + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + optional: true + + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.24.2: + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.25.0: + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.24.2: + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.25.0: + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.24.2: + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.25.0: + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.24.2: + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.25.0: + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.24.2: + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.25.0: + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.24.2: + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.25.0: + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.24.2: + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.25.0: + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.24.2: + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.25.0: + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.24.2: + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.25.0: + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.24.2: + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.25.0: + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.24.2: + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.25.0: + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.24.2: + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.25.0: + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.24.2: + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.25.0: + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.24.2: + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.25.0: + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.24.2: + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.25.0: + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.24.2: + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.25.0: + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/netbsd-arm64@0.24.2: + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-arm64@0.25.0: + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.24.2: + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.25.0: + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-arm64@0.24.2: + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-arm64@0.25.0: + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.24.2: + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.25.0: + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.24.2: + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.25.0: + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.24.2: + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.25.0: + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.24.2: + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.25.0: + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.24.2: + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.25.0: + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@eslint-community/eslint-utils@4.4.1(eslint@9.21.0): + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 9.21.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.12.1: + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/config-array@0.19.2: + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/core@0.12.0: + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@types/json-schema': 7.0.15 + dev: true + + /@eslint/eslintrc@3.3.0: + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@9.21.0: + resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@eslint/object-schema@2.1.6: + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@eslint/plugin-kit@0.2.7: + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/core': 0.12.0 + levn: 0.4.1 + dev: true + + /@faker-js/faker@9.5.0: + resolution: {integrity: sha512-3qbjLv+fzuuCg3umxc9/7YjrEXNaKwHgmig949nfyaTx8eL4FAsvFbu+1JcFUj1YAXofhaDn6JdEUBTYuk0Ssw==} + engines: {node: '>=18.0.0', npm: '>=9.0.0'} + deprecated: Please update to a newer version + dev: true + + /@feature-sliced/filesystem@2.4.0: + resolution: {integrity: sha512-aOFdPACNvkFXYb+gNHId8UCRD5fm7Z9/RV6JgBPlgEvm1QtLS4idg2XeHMDGnHrNRCS4ki+0RauxVZxm+g9pvw==} + dependencies: + typescript: 5.6.3 + dev: true + + /@feature-sliced/steiger-plugin@0.5.4(typescript@5.6.3): + resolution: {integrity: sha512-QzkIQUqNq94fv7aV0GY8wKmlFij9CtSQEIV+/0ed33SZGrv1FjUaySO4eHPlSCcH3Y+fH9nnpTaULtqRwwT7sw==} + dependencies: + '@feature-sliced/filesystem': 2.4.0 + fastest-levenshtein: 1.0.16 + lodash-es: 4.17.21 + pluralize: 8.0.0 + precinct: 12.2.0 + tsconfck: 3.1.5(typescript@5.6.3) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@floating-ui/core@1.6.9: + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + dependencies: + '@floating-ui/utils': 0.2.9 + dev: false + + /@floating-ui/dom@1.6.13: + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + dev: false + + /@floating-ui/react-dom@2.1.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + '@floating-ui/dom': 1.6.13 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@floating-ui/utils@0.2.9: + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + dev: false + + /@fontsource-variable/noto-sans-kr@5.2.5: + resolution: {integrity: sha512-dIJyVPIBRJXtvaFmQ6GKCV93J9Fx3O2Ym5C3gDRcz5zLpEigrnlEfBnsXBUv4aDBHEF/gm/Q07d40dddGxFytg==} + dev: false + + /@frontend-opensource/use-react-hooks@1.1.4: + resolution: {integrity: sha512-otCSyciL5MVCNNYmdDdg2lEL6rbZ3XX1meYQCzapUSC4V6qx2YxMk1kUbhwEM/+vdxhYzBHsVBGD0rZWl5cgrw==} + dependencies: + async-wave: 1.8.6 + fast-deep-equal: 3.1.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@fullcalendar/core@6.1.17: + resolution: {integrity: sha512-0W7lnIrv18ruJ5zeWBeNZXO8qCWlzxDdp9COFEsZnyNjiEhUVnrW/dPbjRKYpL0edGG0/Lhs0ghp1z/5ekt8ZA==} + dependencies: + preact: 10.12.1 + dev: false + + /@fullcalendar/daygrid@6.1.17(@fullcalendar/core@6.1.17): + resolution: {integrity: sha512-K7m+pd7oVJ9fW4h7CLDdDGJbc9szJ1xDU1DZ2ag+7oOo1aCNLv44CehzkkknM6r8EYlOOhgaelxQpKAI4glj7A==} + peerDependencies: + '@fullcalendar/core': ~6.1.17 + dependencies: + '@fullcalendar/core': 6.1.17 + dev: false + + /@fullcalendar/interaction@6.1.17(@fullcalendar/core@6.1.17): + resolution: {integrity: sha512-AudvQvgmJP2FU89wpSulUUjeWv24SuyCx8FzH2WIPVaYg+vDGGYarI7K6PcM3TH7B/CyaBjm5Rqw9lXgnwt5YA==} + peerDependencies: + '@fullcalendar/core': ~6.1.17 + dependencies: + '@fullcalendar/core': 6.1.17 + dev: false + + /@fullcalendar/react@6.1.17(@fullcalendar/core@6.1.17)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-AA8soHhlfRH5dUeqHnfAtzDiXa2vrgWocJSK/F5qzw/pOxc9MqpuoS/nQBROWtHHg6yQUg3DoGqOOhi7dmylXQ==} + peerDependencies: + '@fullcalendar/core': ~6.1.17 + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + '@fullcalendar/core': 6.1.17 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@fullcalendar/timegrid@6.1.17(@fullcalendar/core@6.1.17): + resolution: {integrity: sha512-K4PlA3L3lclLOs3IX8cvddeiJI9ZVMD7RA9IqaWwbvac771971foc9tFze9YY+Pqesf6S+vhS2dWtEVlERaGlQ==} + peerDependencies: + '@fullcalendar/core': ~6.1.17 + dependencies: + '@fullcalendar/core': 6.1.17 + '@fullcalendar/daygrid': 6.1.17(@fullcalendar/core@6.1.17) + dev: false + + /@hookform/resolvers@4.1.3(react-hook-form@7.54.2): + resolution: {integrity: sha512-Jsv6UOWYTrEFJ/01ZrnwVXs7KDvP8XIo115i++5PWvNkNvkrsTfGiLS6w+eJ57CYtUtDQalUWovCZDHFJ8u1VQ==} + peerDependencies: + react-hook-form: ^7.0.0 + dependencies: + '@standard-schema/utils': 0.3.0 + react-hook-form: 7.54.2(react@18.3.1) + dev: false + + /@humanfs/core@0.19.1: + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + dev: true + + /@humanfs/node@0.16.6: + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/retry@0.3.1: + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + dev: true + + /@humanwhocodes/retry@0.4.2: + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + dev: true + + /@img/sharp-darwin-arm64@0.33.5: + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-darwin-arm64@0.34.1: + resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.1.0 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.33.5: + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.34.1: + resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.1.0 + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.4: + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.1.0: + resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.4: + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.1.0: + resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.4: + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.1.0: + resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.0.5: + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.1.0: + resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-ppc64@1.1.0: + resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.4: + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.1.0: + resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.0.4: + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.1.0: + resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.4: + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.1.0: + resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.4: + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.1.0: + resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-linux-arm64@0.33.5: + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-arm64@0.34.1: + resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.1.0 + dev: false + optional: true + + /@img/sharp-linux-arm@0.33.5: + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + dev: false + optional: true + + /@img/sharp-linux-arm@0.34.1: + resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.1.0 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.33.5: + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.34.1: + resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.1.0 + dev: false + optional: true + + /@img/sharp-linux-x64@0.33.5: + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-x64@0.34.1: + resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.1.0 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.5: + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.34.1: + resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.33.5: + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.34.1: + resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + dev: false + optional: true + + /@img/sharp-wasm32@0.33.5: + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.4.3 + dev: false + optional: true + + /@img/sharp-wasm32@0.34.1: + resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.4.3 + dev: false + optional: true + + /@img/sharp-win32-ia32@0.33.5: + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-ia32@0.34.1: + resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.33.5: + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.34.1: + resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + + /@isaacs/fs-minipass@4.0.1: + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + dependencies: + minipass: 7.1.2 + dev: false + + /@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.6.3)(vite@6.2.0): + resolution: {integrity: sha512-qYDdL7fPwLRI+bJNurVcis+tNgJmvWjH4YTBGXTA8xMuxFrnAz6E5o35iyzyKbq5J5Lr8mJGfrR5GXl+WGwhgQ==} + peerDependencies: + typescript: '>= 4.3.x' + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + glob: 10.4.5 + magic-string: 0.27.0 + react-docgen-typescript: 2.2.2(typescript@5.6.3) + typescript: 5.6.3 + vite: 6.2.0(@types/node@22.13.5) + dev: true + + /@jridgewell/gen-mapping@0.3.8: + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + /@juggle/resize-observer@3.4.0: + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + dev: false + + /@kurkle/color@0.3.4: + resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} + dev: false + + /@mapbox/jsonlint-lines-primitives@2.0.2: + resolution: {integrity: sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==} + engines: {node: '>= 0.6'} + dev: false + + /@mapbox/mapbox-gl-style-spec@13.28.0: + resolution: {integrity: sha512-B8xM7Fp1nh5kejfIl4SWeY0gtIeewbuRencqO3cJDrCHZpaPg7uY+V8abuR+esMeuOjRl5cLhVTP40v+1ywxbg==} + hasBin: true + dependencies: + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/point-geometry': 0.1.0 + '@mapbox/unitbezier': 0.0.0 + csscolorparser: 1.0.3 + json-stringify-pretty-compact: 2.0.0 + minimist: 1.2.8 + rw: 1.3.3 + sort-object: 0.3.2 + dev: false + + /@mapbox/point-geometry@0.1.0: + resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} + dev: false + + /@mapbox/unitbezier@0.0.0: + resolution: {integrity: sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==} + dev: false + + /@mdx-js/react@3.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 18.3.18 + react: 18.3.1 + dev: true + + /@minoru/react-dnd-treeview@3.5.0(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-kDHGQ0UK18w6ie5EH68NynATSP9BAzNLmWBXuVSoaGkraWWFdEdAWqQxAZiMorAixFu40MzYkn2N9/Gam6q17w==} + peerDependencies: + react: ^18.3.1 + react-dnd: 15.x || 16.x + react-dom: ^18.3.1 + dependencies: + '@juggle/resize-observer': 3.4.0 + dnd-multi-backend: 8.1.2(dnd-core@16.0.1) + framer-motion: 11.18.2(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dnd: 16.0.1(@types/node@22.13.5)(@types/react@18.3.18)(react@18.3.1) + react-dnd-html5-backend: 16.0.1 + react-dnd-touch-backend: 16.0.1 + react-dom: 18.3.1(react@18.3.1) + react-use-measure: 2.1.7(react-dom@18.3.1)(react@18.3.1) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - dnd-core + dev: false + + /@minoru/react-dnd-treeview@3.5.1-alpha.1(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-XEKBjhyltG0gzn+ioZRwhlV7+Q/uVZqTMS/tAO3On/rPNuNgqWHROFsyGdHQS/DYoENGOG8JX03chCxExOgEpA==} + peerDependencies: + react: ^18.3.1 + react-dnd: 15.x || 16.x + react-dom: ^18.3.1 + dependencies: + '@juggle/resize-observer': 3.4.0 + dnd-multi-backend: 8.1.2(dnd-core@16.0.1) + framer-motion: 11.18.2(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dnd: 16.0.1(@types/node@22.13.5)(@types/react@18.3.18)(react@18.3.1) + react-dnd-html5-backend: 16.0.1 + react-dnd-touch-backend: 16.0.1 + react-dom: 18.3.1(react@18.3.1) + react-use-measure: 2.1.7(react-dom@18.3.1)(react@18.3.1) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - dnd-core + dev: false + + /@next/env@15.1.7: + resolution: {integrity: sha512-d9jnRrkuOH7Mhi+LHav2XW91HOgTAWHxjMPkXMGBc9B2b7614P7kjt8tAplRvJpbSt4nbO1lugcT/kAaWzjlLQ==} + dev: false + + /@next/env@15.3.0: + resolution: {integrity: sha512-6mDmHX24nWlHOlbwUiAOmMyY7KELimmi+ed8qWcJYjqXeC+G6JzPZ3QosOAfjNwgMIzwhXBiRiCgdh8axTTdTA==} + dev: false + + /@next/eslint-plugin-next@15.1.7: + resolution: {integrity: sha512-kRP7RjSxfTO13NE317ek3mSGzoZlI33nc/i5hs1KaWpK+egs85xg0DJ4p32QEiHnR0mVjuUfhRIun7awqfL7pQ==} + dependencies: + fast-glob: 3.3.1 + dev: true + + /@next/swc-darwin-arm64@15.1.7: + resolution: {integrity: sha512-hPFwzPJDpA8FGj7IKV3Yf1web3oz2YsR8du4amKw8d+jAOHfYHYFpMkoF6vgSY4W6vB29RtZEklK9ayinGiCmQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-arm64@15.3.0: + resolution: {integrity: sha512-PDQcByT0ZfF2q7QR9d+PNj3wlNN4K6Q8JoHMwFyk252gWo4gKt7BF8Y2+KBgDjTFBETXZ/TkBEUY7NIIY7A/Kw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@15.1.7: + resolution: {integrity: sha512-2qoas+fO3OQKkU0PBUfwTiw/EYpN+kdAx62cePRyY1LqKtP09Vp5UcUntfZYajop5fDFTjSxCHfZVRxzi+9FYQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@15.3.0: + resolution: {integrity: sha512-m+eO21yg80En8HJ5c49AOQpFDq+nP51nu88ZOMCorvw3g//8g1JSUsEiPSiFpJo1KCTQ+jm9H0hwXK49H/RmXg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@15.1.7: + resolution: {integrity: sha512-sKLLwDX709mPdzxMnRIXLIT9zaX2w0GUlkLYQnKGoXeWUhcvpCrK+yevcwCJPdTdxZEUA0mOXGLdPsGkudGdnA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@15.3.0: + resolution: {integrity: sha512-H0Kk04ZNzb6Aq/G6e0un4B3HekPnyy6D+eUBYPJv9Abx8KDYgNMWzKt4Qhj57HXV3sTTjsfc1Trc1SxuhQB+Tg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@15.1.7: + resolution: {integrity: sha512-zblK1OQbQWdC8fxdX4fpsHDw+VSpBPGEUX4PhSE9hkaWPrWoeIJn+baX53vbsbDRaDKd7bBNcXRovY1hEhFd7w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@15.3.0: + resolution: {integrity: sha512-k8GVkdMrh/+J9uIv/GpnHakzgDQhrprJ/FbGQvwWmstaeFG06nnAoZCJV+wO/bb603iKV1BXt4gHG+s2buJqZA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@15.1.7: + resolution: {integrity: sha512-GOzXutxuLvLHFDAPsMP2zDBMl1vfUHHpdNpFGhxu90jEzH6nNIgmtw/s1MDwpTOiM+MT5V8+I1hmVFeAUhkbgQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@15.3.0: + resolution: {integrity: sha512-ZMQ9yzDEts/vkpFLRAqfYO1wSpIJGlQNK9gZ09PgyjBJUmg8F/bb8fw2EXKgEaHbCc4gmqMpDfh+T07qUphp9A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@15.1.7: + resolution: {integrity: sha512-WrZ7jBhR7ATW1z5iEQ0ZJfE2twCNSXbpCSaAunF3BKcVeHFADSI/AW1y5Xt3DzTqPF1FzQlwQTewqetAABhZRQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@15.3.0: + resolution: {integrity: sha512-RFwq5VKYTw9TMr4T3e5HRP6T4RiAzfDJ6XsxH8j/ZeYq2aLsBqCkFzwMI0FmnSsLaUbOb46Uov0VvN3UciHX5A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@15.1.7: + resolution: {integrity: sha512-LDnj1f3OVbou1BqvvXVqouJZKcwq++mV2F+oFHptToZtScIEnhNRJAhJzqAtTE2dB31qDYL45xJwrc+bLeKM2Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@15.3.0: + resolution: {integrity: sha512-a7kUbqa/k09xPjfCl0RSVAvEjAkYBYxUzSVAzk2ptXiNEL+4bDBo9wNC43G/osLA/EOGzG4CuNRFnQyIHfkRgQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@15.1.7: + resolution: {integrity: sha512-dC01f1quuf97viOfW05/K8XYv2iuBgAxJZl7mbCKEjMgdQl5JjAKJ0D2qMKZCgPWDeFbFT0Q0nYWwytEW0DWTQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@15.3.0: + resolution: {integrity: sha512-vHUQS4YVGJPmpjn7r5lEZuMhK5UQBNBRSB+iGDvJjaNk649pTIcRluDWNb9siunyLLiu/LDPHfvxBtNamyuLTw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + /@nolyfill/is-core-module@1.0.39: + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + dev: true + + /@petamoriken/float16@3.9.2: + resolution: {integrity: sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==} + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + optional: true + + /@radix-ui/number@1.1.0: + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + dev: false + + /@radix-ui/primitive@1.1.1: + resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + dev: false + + /@radix-ui/react-accordion@1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-RIQ15mrcvqIkDARJeERSuXSry2N8uYnxkdDetpfmalT/+0ntOXLkFOsh9iwlAsCv+qcmhZjbdJogIm6WBa6c4A==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collapsible': 1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-arrow@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-checkbox@1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-collapsible@1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-jFSerheto1X03MUC0g6R7LedNW9EEGWdg9W1+MlpkMLwGkgkbUXLPBH/KIuWKXUoeYRVY11llqbTBDzuLg7qrw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-collection@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-context@1.1.1(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-dialog@1.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1) + dev: false + + /@radix-ui/react-direction@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-dropdown-menu@2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-menu': 2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-focus-scope@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-icons@1.3.2(react@18.3.1): + resolution: {integrity: sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==} + peerDependencies: + react: ^18.3.1 + dependencies: + react: 18.3.1 + dev: false + + /@radix-ui/react-id@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-label@2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-menu@2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1) + dev: false + + /@radix-ui/react-popover@1.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1) + dev: false + + /@radix-ui/react-popper@1.2.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-arrow': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-portal@1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-presence@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-primitive@2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-progress@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-u1IgJFQ4zNAUTjGdDL5dcl/U8ntOR6jsnhxKb5RKp5Ozwl88xKR9EqRZOe/Mk8tnx0x5tNUe2F+MzsyjqMg0MA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-radio-group@1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-xtCsqt8Rp09FK50ItqEqTJ7Sxanz8EM8dnkVIhJrc/wkMMomSmXHvYbhv3E7Zx4oXh98aaLt9W679SUYXg4IDA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-roving-focus@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-scroll-area@1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-l7+NNBfBYYJa9tNqVcP2AGvxdE3lmE6kFTBXdvHgUaZuy+4wGCL1Cl2AfaR7RKyimj7lZURGLwFO59k4eBnDJQ==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-select@2.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1) + dev: false + + /@radix-ui/react-separator@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-slider@1.2.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-nNrLAWLjGESnhqBqcCNW4w2nn7LxudyMzeB6VgdyAnFLC6kfQgnAjSL2v6UkQTnDctJBlxrmxfplWS4iYjdUTw==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-slot@1.1.2(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-switch@1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-tabs@1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-tooltip@1.1.8(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-previous@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-rect@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/rect': 1.1.0 + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-size@1.1.0(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + react: 18.3.1 + dev: false + + /@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==} + peerDependencies: + '@types/react': ^18.3.18 + '@types/react-dom': ^18.3.5 + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/rect@1.1.0: + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + dev: false + + /@react-dnd/asap@5.0.2: + resolution: {integrity: sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==} + dev: false + + /@react-dnd/invariant@4.0.2: + resolution: {integrity: sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==} + dev: false + + /@react-dnd/shallowequal@4.0.2: + resolution: {integrity: sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==} + dev: false + + /@rollup/pluginutils@5.1.4: + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + dev: true + + /@rollup/rollup-android-arm-eabi@4.34.8: + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@rollup/rollup-android-arm64@4.34.8: + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@rollup/rollup-darwin-arm64@4.34.8: + resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@rollup/rollup-darwin-x64@4.34.8: + resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@rollup/rollup-freebsd-arm64@4.34.8: + resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@rollup/rollup-freebsd-x64@4.34.8: + resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.34.8: + resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.34.8: + resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.34.8: + resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.34.8: + resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-loongarch64-gnu@4.34.8: + resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.34.8: + resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.34.8: + resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.34.8: + resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.34.8: + resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.34.8: + resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.34.8: + resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.34.8: + resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.34.8: + resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@rtsao/scc@1.1.0: + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + dev: true + + /@rushstack/eslint-patch@1.10.5: + resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} + dev: true + + /@sindresorhus/merge-streams@2.3.0: + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + dev: true + + /@standard-schema/utils@0.3.0: + resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + dev: false + + /@storybook/addon-actions@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-lI03stcI28wN8trjp7zx0PzN1NRxSpU/551slzEhSM0tghcLxcfLZR/wh4Jp0T68Obj7z//YXPttZ9PBFajs6w==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + '@types/uuid': 9.0.8 + dequal: 2.0.3 + polished: 4.3.1 + storybook: 8.6.0(prettier@3.5.2) + uuid: 9.0.1 + dev: true + + /@storybook/addon-backgrounds@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-MbMPjuC19jJBXqQext8rENBACLKujDn+MuxIbNYMmn2ljzeYFp87tVxzlCB7XY7rV0zvkHxH8N/zDnPl7pBTcQ==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + memoizerific: 1.11.3 + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-controls@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-oc+mssxmNY+D26jyJ+IZ1u8bmzveCO2wqpUl6vtLM5MruchZAHzHqa2ZIn+H9KOEqcKlYVDF5n6oEuprcnrsdg==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + dequal: 2.0.3 + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-docs@8.6.0(@types/react@18.3.18)(storybook@8.6.0): + resolution: {integrity: sha512-ytYn5ec2Tp62t9emjXgm4Ds+eG7SiSg/vNeOwM6L1lM2UCV2/XdzntbqlUb/FHehSXIv9eRJDSe5BBzPieUUaw==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@mdx-js/react': 3.1.0(@types/react@18.3.18)(react@18.3.1) + '@storybook/blocks': 8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0) + '@storybook/csf-plugin': 8.6.0(storybook@8.6.0) + '@storybook/react-dom-shim': 8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/addon-essentials@8.6.0(@types/react@18.3.18)(storybook@8.6.0): + resolution: {integrity: sha512-T3R9Q1hq6eJKy758gQgYEuAYxcddGZ8eGBLIyIJEgzpwsUnN5mF+rIqx8LoWxpWu/xiKzg17LqCBnJbLGkRZUA==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/addon-actions': 8.6.0(storybook@8.6.0) + '@storybook/addon-backgrounds': 8.6.0(storybook@8.6.0) + '@storybook/addon-controls': 8.6.0(storybook@8.6.0) + '@storybook/addon-docs': 8.6.0(@types/react@18.3.18)(storybook@8.6.0) + '@storybook/addon-highlight': 8.6.0(storybook@8.6.0) + '@storybook/addon-measure': 8.6.0(storybook@8.6.0) + '@storybook/addon-outline': 8.6.0(storybook@8.6.0) + '@storybook/addon-toolbars': 8.6.0(storybook@8.6.0) + '@storybook/addon-viewport': 8.6.0(storybook@8.6.0) + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/addon-highlight@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-xgSUzNV8ZpNDJ35bLz7wfg/q7/O/C5845wbZsn+PobUOWpOMOKeZwbGkO3Fh4+CWKeFuMhUpFiZSWkNgT+bV0g==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/addon-interactions@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-AgobFrUxmKgGHKeOismuLZdXlndP3ZDquHztiomfMiu01xOqNPxG0+xoCcegvftU7hKE+TlBRzhjCWg/bFz4LQ==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + '@storybook/instrumenter': 8.6.0(storybook@8.6.0) + '@storybook/test': 8.6.0(storybook@8.6.0) + polished: 4.3.1 + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-measure@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-ogc+VNLyXq8hGfI4Fkmh9i3JbxfiIViiINdBoldD6K0gId3yaqqrSwQ2vWhYIbfUuz+PsMxsoNS7MD4EiRXhPg==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.6.0(prettier@3.5.2) + tiny-invariant: 1.3.3 + dev: true + + /@storybook/addon-onboarding@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-UOOvYQlHKdY31YJwR+ECX7e/BNuhp4alcJmx1fuI7m6tXqTGLtioeMJEreh2jV3FDaaDqL4DL/1UfYXqNRMp+A==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/addon-outline@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-IWxrNNZOk5rtOdnLNyK7gpqi0g0rMGYl5ju37Glbfa7iG2J1VKofG2CbkUpVyVY0uiTXqkKkhOKlc9zELhLQSg==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-themes@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-dKUjFgHP9Fd2fxrXcUUjev5X3cGqVvVogzh+nCRA/QlZgf3NzA8J2VPtqtFMX3ex+vaozGsrEKrk+LQTK1B7SA==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-toolbars@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-Mg0V9RrnDt/IQe+zjggGS+4Otkv4YFqyjL/ygwnV6aKGgzL5zFpC+5rf8MeBEvNeol9+THC/XltN/Xf+jbtLEQ==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/addon-viewport@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-sVDF3gIjGdvfBdCM/jEBu6Nd5GlqITKBtdySiQdNDl5JI4ak77ZM+T+VQmJxB4sIqvCjWzCbQqUC45nymVObug==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + memoizerific: 1.11.3 + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/blocks@8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0): + resolution: {integrity: sha512-3PNxlB5Ooj8CIhttbDxeV6kW7ui+2GEdTngtqhnsUHVjzeTKpilsk2lviOeUzqlyq5FDK+rhpZ3L3DJ9pDvioA==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + storybook: ^8.6.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/icons': 1.3.2(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + dev: true + + /@storybook/builder-vite@8.6.0(storybook@8.6.0)(vite@6.2.0): + resolution: {integrity: sha512-Bdc5fXLJbPdQo2eJ3dDNhfhWuQOME2KWvrixnsfo57IOhDa5B81jVcDBQIIgB9K1NQDRGyaWfYCcKZqy16yPlQ==} + peerDependencies: + storybook: ^8.6.0 + vite: ^4.0.0 || ^5.0.0 || ^6.0.0 + dependencies: + '@storybook/csf-plugin': 8.6.0(storybook@8.6.0) + browser-assert: 1.2.1 + storybook: 8.6.0(prettier@3.5.2) + ts-dedent: 2.2.0 + vite: 6.2.0(@types/node@22.13.5) + dev: true + + /@storybook/components@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-k5MQAuLPt5KOaa5J4QvX/WKucaiFTMJiEX5lsSaY6qON6Sx8PtnLQxVwWF7BIMW/jLpd94BUxrVjVrQKlwoLKQ==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/core@8.6.0(prettier@3.5.2)(storybook@8.6.0): + resolution: {integrity: sha512-UzVo2sNz8PZuDp++/R9NBtjupSXhvxS8lptYcwtk51b6MvcM4AL/b4V3PGryOVJDru9sMwz+pzaj7Jg8RVFMJA==} + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + dependencies: + '@storybook/theming': 8.6.0(storybook@8.6.0) + better-opn: 3.0.2 + browser-assert: 1.2.1 + esbuild: 0.25.0 + esbuild-register: 3.6.0(esbuild@0.25.0) + jsdoc-type-pratt-parser: 4.1.0 + prettier: 3.5.2 + process: 0.11.10 + recast: 0.23.10 + semver: 7.7.1 + util: 0.12.5 + ws: 8.18.1 + transitivePeerDependencies: + - bufferutil + - storybook + - supports-color + - utf-8-validate + dev: true + + /@storybook/csf-plugin@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-Cd7LL4XQ8ccUDzJGxVyuzgsYuRYS5LVL4/ZNmAxikz9LtVrVFI/4RgFa5MvlQZc0twreoLtztFskziny8OiJUQ==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + unplugin: 1.16.1 + dev: true + + /@storybook/csf@0.1.13: + resolution: {integrity: sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==} + dependencies: + type-fest: 2.19.0 + dev: true + + /@storybook/global@5.0.0: + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + dev: true + + /@storybook/icons@1.3.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-t3xcbCKkPvqyef8urBM0j/nP6sKtnlRkVgC+8JTbTAZQjaTmOjes3byEgzs89p4B/K6cJsg9wLW2k3SknLtYJw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: true + + /@storybook/instrumenter@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-eEY/Hfa3Vj5Nv4vHRHlSqjoyW6oAKNK3rKIXfL/eawQwb7rKhzijDLG5YBH44Hh7dEPIqUp0LEdgpyIY7GXezg==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + '@vitest/utils': 2.1.9 + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/manager-api@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-ddBibYrO3yQCdtZBqQYqfABjR9eS+llvt2NFDajfyQw+zmuNIZfw4BDGKH1WHE4wm/kXmlFFhPHXaHgAPTRPfQ==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/preview-api@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-c/sZj4Tb+DtdCndcjoFUneUwl2XUdQckqN4nf1SuIJ/BXRbAexlD04fvPJ4wzmwUNg8EQF7BhTWVNDa1RvJz2w==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/react-dom-shim@8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0): + resolution: {integrity: sha512-5Y+vMHhcx0xnaNsLQMbkmjc3zkDn/fGBNsiLH2e4POvW3ZQvOxjoyxAsEQaKwLtFgsdCFSd2tR89F6ItYrA2JQ==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + storybook: ^8.6.0 + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/react-vite@8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3)(vite@6.2.0): + resolution: {integrity: sha512-uDQyf2u0Zki4qIavOu2jyGIlvmUOsgCpHXY+7KHr542ZIkXI3mGOi5/rwUxgNSHGD3JloYGdlt+4Md+9i5xEbA==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@storybook/test': 8.6.0 + react: ^18.3.1 + react-dom: ^18.3.1 + storybook: ^8.6.0 + vite: ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + '@storybook/test': + optional: true + dependencies: + '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.6.3)(vite@6.2.0) + '@rollup/pluginutils': 5.1.4 + '@storybook/builder-vite': 8.6.0(storybook@8.6.0)(vite@6.2.0) + '@storybook/react': 8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3) + '@storybook/test': 8.6.0(storybook@8.6.0) + find-up: 5.0.0 + magic-string: 0.30.17 + react: 18.3.1 + react-docgen: 7.1.1 + react-dom: 18.3.1(react@18.3.1) + resolve: 1.22.10 + storybook: 8.6.0(prettier@3.5.2) + tsconfig-paths: 4.2.0 + vite: 6.2.0(@types/node@22.13.5) + transitivePeerDependencies: + - rollup + - supports-color + - typescript + dev: true + + /@storybook/react@8.6.0(@storybook/test@8.6.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0)(typescript@5.6.3): + resolution: {integrity: sha512-go0KhCFcOhxkTdaMCxeuJxmc/5CaiaO76+SBzIoPIMWEh9tZQmKb+vojdKcFZswHjZV3zA1uJFUzyympspRffA==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@storybook/test': 8.6.0 + react: ^18.3.1 + react-dom: ^18.3.1 + storybook: ^8.6.0 + typescript: '>= 4.2.x' + peerDependenciesMeta: + '@storybook/test': + optional: true + typescript: + optional: true + dependencies: + '@storybook/components': 8.6.0(storybook@8.6.0) + '@storybook/global': 5.0.0 + '@storybook/manager-api': 8.6.0(storybook@8.6.0) + '@storybook/preview-api': 8.6.0(storybook@8.6.0) + '@storybook/react-dom-shim': 8.6.0(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.0) + '@storybook/test': 8.6.0(storybook@8.6.0) + '@storybook/theming': 8.6.0(storybook@8.6.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + storybook: 8.6.0(prettier@3.5.2) + typescript: 5.6.3 + dev: true + + /@storybook/test@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-qiiv4wh4FoxTb1PoiA/noo9HcLDqfTwL0svMoNpTy2Bxm6xajgg5zYmmIT4pKyQkMd9pfKKQKILok31VxAj8vw==} + peerDependencies: + storybook: ^8.6.0 + dependencies: + '@storybook/global': 5.0.0 + '@storybook/instrumenter': 8.6.0(storybook@8.6.0) + '@testing-library/dom': 10.4.0 + '@testing-library/jest-dom': 6.5.0 + '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) + '@vitest/expect': 2.0.5 + '@vitest/spy': 2.0.5 + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@storybook/theming@8.6.0(storybook@8.6.0): + resolution: {integrity: sha512-te7dl0ZXnEyKS4LW+QHc3MP7nurWhWhmClY7G2WKNW9eHenb9zvXkcAQt6c4OWhrJi01CAYoXmZNJP0jEzxRRQ==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + dependencies: + storybook: 8.6.0(prettier@3.5.2) + dev: true + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: false + + /@swc/helpers@0.5.15: + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + dependencies: + tslib: 2.8.1 + dev: false + + /@tailwindcss/node@4.1.11: + resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + dependencies: + '@ampproject/remapping': 2.3.0 + enhanced-resolve: 5.18.1 + jiti: 2.5.1 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.11 + dev: false + + /@tailwindcss/oxide-android-arm64@4.1.11: + resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-darwin-arm64@4.1.11: + resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-darwin-x64@4.1.11: + resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-freebsd-x64@4.1.11: + resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11: + resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-linux-arm64-gnu@4.1.11: + resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-linux-arm64-musl@4.1.11: + resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-linux-x64-gnu@4.1.11: + resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-linux-x64-musl@4.1.11: + resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-wasm32-wasi@4.1.11: + resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + requiresBuild: true + dev: false + optional: true + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + /@tailwindcss/oxide-win32-arm64-msvc@4.1.11: + resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide-win32-x64-msvc@4.1.11: + resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@tailwindcss/oxide@4.1.11: + resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} + engines: {node: '>= 10'} + requiresBuild: true + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-x64': 4.1.11 + '@tailwindcss/oxide-freebsd-x64': 4.1.11 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-x64-musl': 4.1.11 + '@tailwindcss/oxide-wasm32-wasi': 4.1.11 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 + dev: false + + /@tailwindcss/vite@4.1.11(vite@6.2.0): + resolution: {integrity: sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + dependencies: + '@tailwindcss/node': 4.1.11 + '@tailwindcss/oxide': 4.1.11 + tailwindcss: 4.1.11 + vite: 6.2.0(@types/node@22.13.9) + dev: false + + /@tanstack/query-core@5.67.1: + resolution: {integrity: sha512-AkFmuukVejyqVIjEQoFhLb3q+xHl7JG8G9cANWTMe3s8iKzD9j1VBSYXgCjy6vm6xM8cUCR9zP2yqWxY9pTWOA==} + dev: false + + /@tanstack/query-devtools@5.74.7: + resolution: {integrity: sha512-nSNlfuGdnHf4yB0S+BoNYOE1o3oAH093weAYZolIHfS2stulyA/gWfSk/9H4ZFk5mAAHb5vNqAeJOmbdcGPEQw==} + dev: false + + /@tanstack/react-query-devtools@5.75.5(@tanstack/react-query@5.67.1)(react@18.3.1): + resolution: {integrity: sha512-S31U00nJOQIbxydRH1kOwdLRaLBrda8O5QjzmgkRg60UZzPGdbI6+873Qa0YGUfPeILDbR2ukgWyg7CJQPy4iA==} + peerDependencies: + '@tanstack/react-query': ^5.75.5 + react: ^18.3.1 + dependencies: + '@tanstack/query-devtools': 5.74.7 + '@tanstack/react-query': 5.67.1(react@18.3.1) + react: 18.3.1 + dev: false + + /@tanstack/react-query@5.67.1(react@18.3.1): + resolution: {integrity: sha512-fH5u4JLwB6A+wLFdi8wWBWAYoJV5deYif2OveJ26ktAWjU499uvVFS1wPWnyEyq5LvZX1MZInvv9QRaIZANRaQ==} + peerDependencies: + react: ^18.3.1 + dependencies: + '@tanstack/query-core': 5.67.1 + react: 18.3.1 + dev: false + + /@tanstack/react-table@8.21.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-11tNlEDTdIhMJba2RBH+ecJ9l1zgS2kjmexDPAraulc8jeNA4xocSNeyzextT0XJyASil4XsCYlJmf5jEWAtYg==} + engines: {node: '>=12'} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + '@tanstack/table-core': 8.21.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@tanstack/table-core@8.21.2: + resolution: {integrity: sha512-uvXk/U4cBiFMxt+p9/G7yUWI/UbHYbyghLCjlpWZ3mLeIZiUBSKcUnw9UnKkdRz7Z/N4UBuFLWQdJCjUe7HjvA==} + engines: {node: '>=12'} + dev: false + + /@testing-library/dom@10.4.0: + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/runtime': 7.26.9 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: true + + /@testing-library/jest-dom@6.5.0: + resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + dependencies: + '@adobe/css-tools': 4.4.2 + aria-query: 5.3.2 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + dev: true + + /@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0): + resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + dependencies: + '@testing-library/dom': 10.4.0 + dev: true + + /@tinymce/tinymce-react@6.1.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-K0MP3yYVKe8+etUwsg6zyRq+q9TGLaVf005WiBHiB8JZEomAwbBPERGunhU9uOqNQ5gJs8yVOPZ68Xcd1UHclA==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + tinymce: ^7.0.0 || ^6.0.0 || ^5.5.1 + peerDependenciesMeta: + tinymce: + optional: true + dependencies: + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@types/aria-query@5.0.4: + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + dev: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.26.9 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + dev: true + + /@types/babel__traverse@7.20.6: + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + dependencies: + '@babel/types': 7.26.9 + dev: true + + /@types/d3-array@3.2.1: + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + dev: false + + /@types/d3-color@3.1.3: + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + dev: false + + /@types/d3-ease@3.0.2: + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + dev: false + + /@types/d3-interpolate@3.0.4: + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + dependencies: + '@types/d3-color': 3.1.3 + dev: false + + /@types/d3-path@3.1.1: + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + dev: false + + /@types/d3-scale@4.0.9: + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + dependencies: + '@types/d3-time': 3.0.4 + dev: false + + /@types/d3-shape@3.1.7: + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + dependencies: + '@types/d3-path': 3.1.1 + dev: false + + /@types/d3-time@3.0.4: + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + dev: false + + /@types/d3-timer@3.0.2: + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + dev: false + + /@types/doctrine@0.0.9: + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + dev: true + + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 + + /@types/eslint@9.6.1: + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + + /@types/estree@1.0.6: + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + /@types/js-cookie@3.0.6: + resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==} + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/mdx@2.0.13: + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + dev: true + + /@types/node@20.17.19: + resolution: {integrity: sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==} + dependencies: + undici-types: 6.19.8 + dev: true + + /@types/node@22.13.5: + resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==} + dependencies: + undici-types: 6.20.0 + + /@types/node@22.13.9: + resolution: {integrity: sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==} + dependencies: + undici-types: 6.20.0 + + /@types/prop-types@15.7.14: + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + + /@types/react-dom@18.3.5(@types/react@18.3.18): + resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + peerDependencies: + '@types/react': ^18.3.18 + dependencies: + '@types/react': 18.3.18 + + /@types/react@18.3.18: + resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} + dependencies: + '@types/prop-types': 15.7.14 + csstype: 3.1.3 + + /@types/resolve@1.20.6: + resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} + dev: true + + /@types/uuid@9.0.8: + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + dev: true + + /@types/webpack@5.28.5: + resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} + dependencies: + '@types/node': 22.13.9 + tapable: 2.2.1 + webpack: 5.98.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + dev: true + + /@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0)(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.25.0 + eslint: 9.21.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.0.1(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.25.0 + debug: 4.4.0 + eslint: 9.21.0 + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@8.25.0: + resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 + dev: true + + /@typescript-eslint/type-utils@8.25.0(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + debug: 4.4.0 + eslint: 9.21.0 + ts-api-utils: 2.0.1(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@8.25.0: + resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@typescript-eslint/typescript-estree@8.25.0(typescript@5.6.3): + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3): + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@8.25.0(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.6.3) + eslint: 9.21.0 + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/visitor-keys@8.25.0: + resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.25.0 + eslint-visitor-keys: 4.2.0 + dev: true + + /@vitejs/plugin-react@4.3.4(vite@6.2.0): + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + dependencies: + '@babel/core': 7.26.9 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.9) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 6.2.0(@types/node@22.13.5) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@2.0.5: + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + dependencies: + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.2.0 + tinyrainbow: 1.2.0 + dev: true + + /@vitest/pretty-format@2.0.5: + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + dependencies: + tinyrainbow: 1.2.0 + dev: true + + /@vitest/pretty-format@2.1.9: + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + dependencies: + tinyrainbow: 1.2.0 + dev: true + + /@vitest/spy@2.0.5: + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + dependencies: + tinyspy: 3.0.2 + dev: true + + /@vitest/utils@2.0.5: + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + dependencies: + '@vitest/pretty-format': 2.0.5 + estree-walker: 3.0.3 + loupe: 3.1.3 + tinyrainbow: 1.2.0 + dev: true + + /@vitest/utils@2.1.9: + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + dependencies: + '@vitest/pretty-format': 2.1.9 + loupe: 3.1.3 + tinyrainbow: 1.2.0 + dev: true + + /@vue/compiler-core@3.5.13: + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + dependencies: + '@babel/parser': 7.26.9 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + dev: true + + /@vue/compiler-dom@3.5.13: + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + dev: true + + /@vue/compiler-sfc@3.5.13: + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + dependencies: + '@babel/parser': 7.26.9 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.3 + source-map-js: 1.2.1 + dev: true + + /@vue/compiler-ssr@3.5.13: + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + dev: true + + /@vue/shared@3.5.13: + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + dev: true + + /@webassemblyjs/ast@1.14.1: + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + /@webassemblyjs/floating-point-hex-parser@1.13.2: + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + /@webassemblyjs/helper-api-error@1.13.2: + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + /@webassemblyjs/helper-buffer@1.14.1: + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + /@webassemblyjs/helper-numbers@1.13.2: + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + /@webassemblyjs/helper-wasm-bytecode@1.13.2: + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + /@webassemblyjs/helper-wasm-section@1.14.1: + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + /@webassemblyjs/ieee754@1.13.2: + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + dependencies: + '@xtuc/ieee754': 1.2.0 + + /@webassemblyjs/leb128@1.13.2: + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + dependencies: + '@xtuc/long': 4.2.2 + + /@webassemblyjs/utf8@1.13.2: + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + /@webassemblyjs/wasm-edit@1.14.1: + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + /@webassemblyjs/wasm-gen@1.14.1: + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + /@webassemblyjs/wasm-opt@1.14.1: + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + /@webassemblyjs/wasm-parser@1.14.1: + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + /@webassemblyjs/wast-printer@1.14.1: + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + /@xlsx/xlsx-populate@0.0.8: + resolution: {integrity: sha512-6yu24ePaO3cnAuti77FhVPZvKkzUt6s6x3zJ9wiuBSjR0ImWu7l/SgePelZaf8Oty4SP4rg4vznQVCGQtfzu2A==} + engines: {node: '>=16'} + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + /acorn-jsx@5.3.2(acorn@8.14.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.14.0 + dev: true + + /acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + /adler-32@1.3.1: + resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} + engines: {node: '>=0.8'} + dev: false + + /ajv-formats@2.1.1(ajv@8.17.1): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.17.1 + + /ajv-keywords@5.1.0(ajv@8.17.1): + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + dependencies: + tslib: 2.8.1 + dev: false + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: true + + /aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + dev: true + + /array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + dev: true + + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + dev: true + + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + dev: true + + /arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + dev: true + + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + dev: true + + /ast-module-types@6.0.1: + resolution: {integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==} + engines: {node: '>=18'} + dev: true + + /ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + dev: true + + /ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + dependencies: + tslib: 2.8.1 + dev: true + + /async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + dev: true + + /async-wave@1.8.6: + resolution: {integrity: sha512-wqWvr0Mrc1TrY92hN9MV0Xebxa6kt+T7QtjZ7FEMv+RUBa/Hfpz/UOgz0rB+7uqVK8TuBSXykOyU/k9gogdLkw==} + dependencies: + is-promise: 4.0.0 + lodash.add: 3.7.0 + lodash.clonedeep: 4.5.0 + lodash.isequal: 4.5.0 + lodash.isfunction: 3.0.9 + lodash.size: 4.2.0 + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /attr-accept@2.2.5: + resolution: {integrity: sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==} + engines: {node: '>=4'} + dev: false + + /autoprefixer@10.4.20(postcss@8.5.3): + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.24.4 + caniuse-lite: 1.0.30001701 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.1.0 + dev: true + + /axe-core@4.10.2: + resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} + engines: {node: '>=4'} + dev: true + + /axios@1.8.1: + resolution: {integrity: sha512-NN+fvwH/kV01dYUQ3PTOZns4LWtWhOFCAhQ/pHb88WQ1hNe5V/dvFwc4VJcDL11LT9xSX0QtsR8sWUuyOuOq7g==} + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + + /better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + dependencies: + open: 8.4.2 + dev: true + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + + /browser-assert@1.2.1: + resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + dev: true + + /browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001701 + electron-to-chromium: 1.5.107 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /bundle-require@5.1.0(esbuild@0.24.2): + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + dependencies: + esbuild: 0.24.2 + load-tsconfig: 0.2.5 + dev: true + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + dev: true + + /call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: false + + /caniuse-lite@1.0.30001701: + resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} + + /cfb@1.2.2: + resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} + engines: {node: '>=0.8'} + dependencies: + adler-32: 1.3.1 + crc-32: 1.2.2 + dev: false + + /chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + dev: true + + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chart.js@4.4.8: + resolution: {integrity: sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA==} + engines: {pnpm: '>=8'} + dependencies: + '@kurkle/color': 0.3.4 + dev: false + + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + dev: true + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + dependencies: + readdirp: 4.1.2 + dev: true + + /chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + dev: false + + /chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + /class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + dependencies: + clsx: 2.1.1 + dev: false + + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + dev: false + + /codepage@1.15.0: + resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} + engines: {node: '>=0.8'} + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + requiresBuild: true + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + optional: true + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + requiresBuild: true + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + optional: true + + /combine-errors@3.0.3: + resolution: {integrity: sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==} + dependencies: + custom-error-instance: 2.1.1 + lodash.uniqby: 4.5.0 + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /consola@3.4.0: + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /cosmiconfig@9.0.0(typescript@5.6.3): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 5.6.3 + dev: true + + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + + /cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /css-line-break@2.1.0: + resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + dependencies: + utrie: 1.0.2 + dev: false + + /css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + dev: true + + /csscolorparser@1.0.3: + resolution: {integrity: sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==} + dev: false + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /custom-error-instance@2.1.1: + resolution: {integrity: sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==} + dev: false + + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + dependencies: + internmap: 2.0.3 + dev: false + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false + + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false + + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + dev: false + + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: false + + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + dependencies: + d3-time: 3.1.0 + dev: false + + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false + + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /date-fns-jalali@4.1.0-0: + resolution: {integrity: sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==} + dev: false + + /date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + dev: false + + /date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + dev: false + + /dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dev: false + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: false + + /decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + dev: false + + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: true + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + requiresBuild: true + dev: false + + /detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + dev: false + + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + + /detective-amd@6.0.1: + resolution: {integrity: sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==} + engines: {node: '>=18'} + hasBin: true + dependencies: + ast-module-types: 6.0.1 + escodegen: 2.1.0 + get-amd-module-type: 6.0.1 + node-source-walk: 7.0.1 + dev: true + + /detective-cjs@6.0.1: + resolution: {integrity: sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==} + engines: {node: '>=18'} + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + dev: true + + /detective-es6@5.0.1: + resolution: {integrity: sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==} + engines: {node: '>=18'} + dependencies: + node-source-walk: 7.0.1 + dev: true + + /detective-postcss@7.0.1(postcss@8.5.3): + resolution: {integrity: sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==} + engines: {node: ^14.0.0 || >=16.0.0} + peerDependencies: + postcss: ^8.4.47 + dependencies: + is-url: 1.2.4 + postcss: 8.5.3 + postcss-values-parser: 6.0.2(postcss@8.5.3) + dev: true + + /detective-sass@6.0.1: + resolution: {integrity: sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==} + engines: {node: '>=18'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.1 + dev: true + + /detective-scss@5.0.1: + resolution: {integrity: sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==} + engines: {node: '>=18'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.1 + dev: true + + /detective-stylus@5.0.1: + resolution: {integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==} + engines: {node: '>=18'} + dev: true + + /detective-typescript@14.0.0(typescript@5.7.3): + resolution: {integrity: sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 + dependencies: + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /detective-vue2@2.2.0(typescript@5.7.3): + resolution: {integrity: sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 + dependencies: + '@dependents/detective-less': 5.0.1 + '@vue/compiler-sfc': 3.5.13 + detective-es6: 5.0.1 + detective-sass: 6.0.1 + detective-scss: 5.0.1 + detective-stylus: 5.0.1 + detective-typescript: 14.0.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + /dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dev: false + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + /dnd-core@16.0.1: + resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==} + dependencies: + '@react-dnd/asap': 5.0.2 + '@react-dnd/invariant': 4.0.2 + redux: 4.2.1 + dev: false + + /dnd-multi-backend@8.1.2(dnd-core@16.0.1): + resolution: {integrity: sha512-KPDVEsiM+6gNEegqZYTWJQgJxYV4vB91tUrvoKJjaS0wwWqT/jNU0P7xJAwCue/cbasJNvk2dFZH7tC+bjX1Rg==} + peerDependencies: + dnd-core: ^16.0.1 + dependencies: + dnd-core: 16.0.1 + dev: false + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dev: true + + /dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dev: true + + /dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dependencies: + '@babel/runtime': 7.26.9 + csstype: 3.1.3 + dev: false + + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + /earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + /effector@23.3.0: + resolution: {integrity: sha512-ZnQ3POaNARlxT9+kxrK58PO/xmStBdxfPq0rceglENg8Ryxx/yx+1RsV/ziznrFPhLkZYc7NdDA1OKxnMW98/g==} + engines: {node: '>=11.0.0'} + dev: true + + /electron-to-chromium@1.5.107: + resolution: {integrity: sha512-dJr1o6yCntRkXElnhsHh1bAV19bo/hKyFf7tCcWgpXbuFIF0Lakjgqv5LRfSDaNzAII8Fnxg2tqgHkgCvxdbxw==} + + /embla-carousel-autoplay@8.6.0(embla-carousel@8.6.0): + resolution: {integrity: sha512-OBu5G3nwaSXkZCo1A6LTaFMZ8EpkYbwIaH+bPqdBnDGQ2fh4+NbzjXjs2SktoPNKCtflfVMc75njaDHOYXcrsA==} + peerDependencies: + embla-carousel: 8.6.0 + dependencies: + embla-carousel: 8.6.0 + dev: false + + /embla-carousel-react@8.6.0(react@18.3.1): + resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} + peerDependencies: + react: ^18.3.1 + dependencies: + embla-carousel: 8.6.0 + embla-carousel-reactive-utils: 8.6.0(embla-carousel@8.6.0) + react: 18.3.1 + dev: false + + /embla-carousel-reactive-utils@8.6.0(embla-carousel@8.6.0): + resolution: {integrity: sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==} + peerDependencies: + embla-carousel: 8.6.0 + dependencies: + embla-carousel: 8.6.0 + dev: false + + /embla-carousel@8.6.0: + resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /empathic@1.0.0: + resolution: {integrity: sha512-qtKgI1Mv8rTacvpaTkh28HM2Lbf+IOjXb7rhpt/42kZxRm8TBb/IVlo5iL2ztT19kc/EHAFN0fZ641avlXAgdg==} + engines: {node: '>=16'} + dev: true + + /enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 + dev: true + + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + /es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + dev: true + + /es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + + /es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + + /es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + /es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + dev: true + + /esbuild-register@3.6.0(esbuild@0.25.0): + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + dependencies: + debug: 4.4.0 + esbuild: 0.25.0 + transitivePeerDependencies: + - supports-color + dev: true + + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + dev: true + + /esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + dev: true + + /esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 + + /escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-next@15.1.7(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-zXoMnYUIy3XHaAoOhrcYkT9UQWvXqWju2K7NNsmb5wd/7XESDwof61eUdW4QhERr3eJ9Ko/vnXqIrj8kk/drYw==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 15.1.7 + '@rushstack/eslint-patch': 1.10.5 + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0)(eslint@9.21.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + eslint: 9.21.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0) + eslint-plugin-react: 7.37.4(eslint@9.21.0) + eslint-plugin-react-hooks: 5.1.0(eslint@9.21.0) + typescript: 5.6.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0): + resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.0 + enhanced-resolve: 5.18.1 + eslint: 9.21.0 + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) + get-tsconfig: 4.10.0 + is-bun-module: 1.3.0 + stable-hash: 0.0.4 + tinyglobby: 0.2.12 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0): + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + debug: 3.2.7 + eslint: 9.21.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0): + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@rtsao/scc': 1.1.0 + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.21.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0): + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.10.2 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.21.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + dev: true + + /eslint-plugin-react-hooks@5.1.0(eslint@9.21.0): + resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + dependencies: + eslint: 9.21.0 + dev: true + + /eslint-plugin-react-refresh@0.4.19(eslint@9.21.0): + resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==} + peerDependencies: + eslint: '>=8.40' + dependencies: + eslint: 9.21.0 + dev: true + + /eslint-plugin-react@7.37.4(eslint@9.21.0): + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 9.21.0 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + dev: true + + /eslint-plugin-storybook@0.11.3(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-gDBnBZiyk4ZG7OMSJRaHBcuJ8TMCXgMIQ3HB/XvtN0SvSio2ZOIeYD3yGj39g/DbyCe/Bg02j/ip9tWlDEs82A==} + engines: {node: '>= 18'} + peerDependencies: + eslint: '>=8' + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@storybook/csf': 0.1.13 + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + eslint: 9.21.0 + ts-dedent: 2.2.0 + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /eslint@9.21.0: + resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.2 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.21.0 + '@eslint/plugin-kit': 0.2.7 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.6 + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-equals@5.2.2: + resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} + engines: {node: '>=6.0.0'} + dev: false + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + dev: true + + /fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + dev: true + + /fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + dependencies: + reusify: 1.1.0 + + /fdir@6.4.3(picomatch@4.0.2): + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + dependencies: + picomatch: 4.0.2 + dev: true + + /file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + dependencies: + flat-cache: 4.0.1 + dev: true + + /file-selector@2.1.2: + resolution: {integrity: sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==} + engines: {node: '>= 12'} + dependencies: + tslib: 2.8.1 + dev: false + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + dev: true + + /flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + dev: true + + /follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + dev: true + + /foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + /form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + dev: false + + /frac@1.1.2: + resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} + engines: {node: '>=0.8'} + dev: false + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + + /framer-motion@11.18.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + motion-dom: 11.18.1 + motion-utils: 11.18.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.8.1 + dev: false + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /geotiff@2.1.3: + resolution: {integrity: sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA==} + engines: {node: '>=10.19'} + dependencies: + '@petamoriken/float16': 3.9.2 + lerc: 3.0.0 + pako: 2.1.0 + parse-headers: 2.0.6 + quick-lru: 6.1.2 + web-worker: 1.5.0 + xml-utils: 1.10.2 + zstddec: 0.1.0 + dev: false + + /get-amd-module-type@6.0.1: + resolution: {integrity: sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==} + engines: {node: '>=18'} + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + /get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + dev: true + + /get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + dev: true + + /globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + dev: true + + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + dev: true + + /globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.3 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /gonzales-pe@4.3.0: + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /goober@2.1.16(csstype@3.1.3): + resolution: {integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==} + peerDependencies: + csstype: ^3.0.10 + dependencies: + csstype: 3.1.3 + dev: false + + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.1 + dev: true + + /has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + dev: true + + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.1.0 + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + dependencies: + void-elements: 3.1.0 + dev: false + + /html2canvas@1.4.1: + resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} + engines: {node: '>=8.0.0'} + dependencies: + css-line-break: 2.1.0 + text-segmentation: 1.0.3 + dev: false + + /i18next@25.3.2(typescript@5.6.3): + resolution: {integrity: sha512-JSnbZDxRVbphc5jiptxr3o2zocy5dEqpVm9qCGdJwRNO+9saUJS0/u4LnM/13C23fUEWxAylPqKU/NpMV/IjqA==} + peerDependencies: + typescript: ^5 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/runtime': 7.28.2 + typescript: 5.6.3 + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + dev: true + + /ignore@7.0.3: + resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} + engines: {node: '>= 4'} + dev: true + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /immer@10.1.1: + resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + dev: true + + /import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + dev: true + + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false + + /is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.3.0 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + requiresBuild: true + dev: false + optional: true + + /is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + dependencies: + async-function: 1.0.0 + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + + /is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + dependencies: + has-bigints: 1.1.0 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + + /is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-bun-module@1.3.0: + resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} + dependencies: + semver: 7.7.1 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + + /is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + dev: false + + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: true + + /is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + dev: true + + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.18 + dev: true + + /is-url-superb@4.0.0: + resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} + engines: {node: '>=10'} + dev: true + + /is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: true + + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: true + + /is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + dev: true + + /is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.3.0 + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + dev: true + + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 22.13.9 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + /jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + hasBin: true + dev: false + + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: true + + /js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + dev: false + + /js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + dev: false + + /js-sha512@0.9.0: + resolution: {integrity: sha512-mirki9WS/SUahm+1TbAPkqvbCiCfOAAsyXeHxK1UkullnJVVqoJG2pL9ObvT05CN+tM7fxhfYm0NbXn+1hWoZg==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + engines: {node: '>=12.0.0'} + dev: true + + /jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-pretty-compact@2.0.0: + resolution: {integrity: sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==} + dev: false + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + dev: true + + /jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + dev: true + + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + dependencies: + language-subtag-registry: 0.3.23 + dev: true + + /lerc@3.0.0: + resolution: {integrity: sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==} + dev: false + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /libphonenumber-js@1.12.10: + resolution: {integrity: sha512-E91vHJD61jekHHR/RF/E83T/CMoaLXT7cwYA75T4gim4FZjnM6hbJjVIGg7chqlSqRsSvQ3izGmOjHy1SQzcGQ==} + dev: false + + /lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: false + + /lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 2.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + dev: false + + /lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: true + + /lodash._baseiteratee@4.7.0: + resolution: {integrity: sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==} + dependencies: + lodash._stringtopath: 4.8.0 + dev: false + + /lodash._basetostring@4.12.0: + resolution: {integrity: sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw==} + dev: false + + /lodash._baseuniq@4.6.0: + resolution: {integrity: sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==} + dependencies: + lodash._createset: 4.0.3 + lodash._root: 3.0.1 + dev: false + + /lodash._createset@4.0.3: + resolution: {integrity: sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA==} + dev: false + + /lodash._root@3.0.1: + resolution: {integrity: sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==} + dev: false + + /lodash._stringtopath@4.8.0: + resolution: {integrity: sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==} + dependencies: + lodash._basetostring: 4.12.0 + dev: false + + /lodash.add@3.7.0: + resolution: {integrity: sha512-/uxUZkB6vYiPoGSXADJJE+Ee4W2vU+bxZOFdvJdx+mDgv+qyAO76sWD84Q4FxsMgTjC1+gVFC9YNhdG243QRDw==} + dev: false + + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: false + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + dev: false + + /lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.size@4.2.0: + resolution: {integrity: sha512-wbu3SF1XC5ijqm0piNxw59yCbuUf2kaShumYBLWUrcCvwh6C8odz6SY/wGVzCWTQTFL/1Ygbvqg2eLtspUVVAQ==} + dev: false + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: false + + /lodash.uniqby@4.5.0: + resolution: {integrity: sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==} + dependencies: + lodash._baseiteratee: 4.7.0 + lodash._baseuniq: 4.6.0 + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + dev: true + + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lucide-react@0.474.0(react@18.3.1): + resolution: {integrity: sha512-CmghgHkh0OJNmxGKWc0qfPJCYHASPMVSyGY8fj3xgk4v84ItqDg64JNKFZn5hC6E0vHi6gxnbCgwhyVB09wQtA==} + peerDependencies: + react: ^18.3.1 + dependencies: + react: 18.3.1 + dev: false + + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: true + + /magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true + + /magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + /map-or-similar@1.5.0: + resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + dev: true + + /mapbox-to-css-font@2.4.5: + resolution: {integrity: sha512-VJ6nB8emkO9VODI0Fk+TQ/0zKBTqmf/Pkt8Xv0kHstoc0iXRajA00DAid4Kc3K5xeFIOoiZrVxijEzj0GLVO2w==} + dev: false + + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + /memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + dependencies: + map-or-similar: 1.5.0 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /mgrs@1.0.0: + resolution: {integrity: sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==} + dev: false + + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + /minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + dependencies: + minipass: 7.1.2 + dev: false + + /mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /module-definition@6.0.1: + resolution: {integrity: sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==} + engines: {node: '>=18'} + hasBin: true + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + dev: true + + /moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + dev: false + + /motion-dom@11.18.1: + resolution: {integrity: sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==} + dependencies: + motion-utils: 11.18.1 + dev: false + + /motion-utils@11.18.1: + resolution: {integrity: sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + /nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /next-qrcode@2.5.1(react@18.3.1): + resolution: {integrity: sha512-ibiS1+p+myjurC1obVIgo7UCjFhxm0SNYTkikahQVmnyzlfREOdUCf2f77Vbz6W6q2zfx5Eww2/20vbgkLNdLw==} + engines: {node: '>=8', npm: '>=5'} + peerDependencies: + react: ^18.3.1 + dependencies: + qrcode: 1.5.4 + react: 18.3.1 + dev: false + + /next-themes@0.4.6(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /next@15.1.7(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-GNeINPGS9c6OZKCvKypbL8GTsT5GhWPp4DM0fzkXJuXMilOO2EeFxuAY6JZbtk6XIl6Ws10ag3xRINDjSO5+wg==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.3.1 + react-dom: ^18.3.1 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + dependencies: + '@next/env': 15.1.7 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001701 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.1.7 + '@next/swc-darwin-x64': 15.1.7 + '@next/swc-linux-arm64-gnu': 15.1.7 + '@next/swc-linux-arm64-musl': 15.1.7 + '@next/swc-linux-x64-gnu': 15.1.7 + '@next/swc-linux-x64-musl': 15.1.7 + '@next/swc-win32-arm64-msvc': 15.1.7 + '@next/swc-win32-x64-msvc': 15.1.7 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /next@15.3.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-k0MgP6BsK8cZ73wRjMazl2y2UcXj49ZXLDEgx6BikWuby/CN+nh81qFFI16edgd7xYpe/jj2OZEIwCoqnzz0bQ==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.3.1 + react-dom: ^18.3.1 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + dependencies: + '@next/env': 15.3.0 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001701 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.3.0 + '@next/swc-darwin-x64': 15.3.0 + '@next/swc-linux-arm64-gnu': 15.3.0 + '@next/swc-linux-arm64-musl': 15.3.0 + '@next/swc-linux-x64-gnu': 15.3.0 + '@next/swc-linux-x64-musl': 15.3.0 + '@next/swc-win32-arm64-msvc': 15.3.0 + '@next/swc-win32-x64-msvc': 15.3.0 + sharp: 0.34.1 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + /node-source-walk@7.0.1: + resolution: {integrity: sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==} + engines: {node: '>=18'} + dependencies: + '@babel/parser': 7.26.9 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + /object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + dev: true + + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + dev: true + + /object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /ol-ext@4.0.31(ol@7.5.2): + resolution: {integrity: sha512-byh26JcXZggkLUY79+c29cxf2ovkkwz5niWJzOIN+dLPDJ+ogSn0y4Wl8fIS9O2JtQff5/cInHRImgZBvl+N1g==} + peerDependencies: + ol: '>= 5.3.0' + dependencies: + ol: 7.5.2 + dev: false + + /ol-mapbox-style@10.7.0: + resolution: {integrity: sha512-S/UdYBuOjrotcR95Iq9AejGYbifKeZE85D9VtH11ryJLQPTZXZSW1J5bIXcr4AlAH6tyjPPHTK34AdkwB32Myw==} + dependencies: + '@mapbox/mapbox-gl-style-spec': 13.28.0 + mapbox-to-css-font: 2.4.5 + ol: 7.5.2 + dev: false + + /ol@7.5.2: + resolution: {integrity: sha512-HJbb3CxXrksM6ct367LsP3N+uh+iBBMdP3DeGGipdV9YAYTP0vTJzqGnoqQ6C2IW4qf8krw9yuyQbc9fjOIaOQ==} + dependencies: + earcut: 2.2.4 + geotiff: 2.1.3 + ol-mapbox-style: 10.7.0 + pbf: 3.2.1 + rbush: 3.0.1 + dev: false + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + dev: true + + /own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: false + + /package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + + /pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-headers@2.0.6: + resolution: {integrity: sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==} + dev: false + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + /path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + dev: true + + /path@0.12.7: + resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + dependencies: + process: 0.11.10 + util: 0.10.4 + dev: false + + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + dev: true + + /patronum@2.3.0(effector@23.3.0): + resolution: {integrity: sha512-BfKIOpoymVz6XnkOn8Fi5QZ1a3r/3lXdd8BcdHmYDbIXPTIRnD1EPFBFev/DheWnOge6/ZswEqgNF2ANLGOxLw==} + peerDependencies: + effector: ^23 + dependencies: + effector: 23.3.0 + dev: true + + /pbf@3.2.1: + resolution: {integrity: sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==} + hasBin: true + dependencies: + ieee754: 1.2.1 + resolve-protobuf-schema: 2.1.0 + dev: false + + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + + /pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + dev: false + + /polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + dependencies: + '@babel/runtime': 7.26.9 + dev: true + + /possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + dev: true + + /postcss-import@15.1.0(postcss@8.5.3): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + /postcss-js@4.0.1(postcss@8.5.3): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.3 + + /postcss-load-config@4.0.2(postcss@8.5.3): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.3 + postcss: 8.5.3 + yaml: 2.7.0 + + /postcss-load-config@6.0.1(postcss@8.5.3): + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + dependencies: + lilconfig: 3.1.3 + postcss: 8.5.3 + dev: true + + /postcss-nested@6.2.0(postcss@8.5.3): + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 + + /postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss-values-parser@6.0.2(postcss@8.5.3): + resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} + engines: {node: '>=10'} + peerDependencies: + postcss: ^8.2.9 + dependencies: + color-name: 1.1.4 + is-url-superb: 4.0.0 + postcss: 8.5.3 + quote-unquote: 1.0.0 + dev: true + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + dev: false + + /postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + /preact@10.12.1: + resolution: {integrity: sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==} + dev: false + + /precinct@12.2.0: + resolution: {integrity: sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==} + engines: {node: '>=18'} + hasBin: true + dependencies: + '@dependents/detective-less': 5.0.1 + commander: 12.1.0 + detective-amd: 6.0.1 + detective-cjs: 6.0.1 + detective-es6: 5.0.1 + detective-postcss: 7.0.1(postcss@8.5.3) + detective-sass: 6.0.1 + detective-scss: 5.0.1 + detective-stylus: 5.0.1 + detective-typescript: 14.0.0(typescript@5.7.3) + detective-vue2: 2.2.0(typescript@5.7.3) + module-definition: 6.0.1 + node-source-walk: 7.0.1 + postcss: 8.5.3 + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-plugin-tailwindcss@0.6.11(prettier@3.5.2): + resolution: {integrity: sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + dependencies: + prettier: 3.5.2 + dev: true + + /prettier@3.5.2: + resolution: {integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prexit@2.3.0: + resolution: {integrity: sha512-mX+LIbtS0anKtl2PykYabxninwloblUQMRO6CubeSmjxb+kKlATuJoH9UeN8NLE4TgIEFWfBXw7V3GkWbBrSmg==} + engines: {node: '>=12'} + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + /proj4@2.15.0: + resolution: {integrity: sha512-LqCNEcPdI03BrCHxPLj29vsd5afsm+0sV1H/O3nTDKrv8/LA01ea1z4QADDMjUqxSXWnrmmQDjqFm1J/uZ5RLw==} + dependencies: + mgrs: 1.0.0 + wkt-parser: 1.4.0 + dev: false + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + dev: false + + /protocol-buffers-schema@3.6.0: + resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + dev: false + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /quick-lru@6.1.2: + resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} + engines: {node: '>=12'} + dev: false + + /quickselect@2.0.0: + resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} + dev: false + + /quote-unquote@1.0.0: + resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /rbush@3.0.1: + resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==} + dependencies: + quickselect: 2.0.0 + dev: false + + /react-chartjs-2@5.3.0(chart.js@4.4.8)(react@18.3.1): + resolution: {integrity: sha512-UfZZFnDsERI3c3CZGxzvNJd02SHjaSJ8kgW1djn65H1KK8rehwTjyrRKOG3VTMG8wtHZ5rgAO5oTHtHi9GCCmw==} + peerDependencies: + chart.js: ^4.1.1 + react: ^18.3.1 + dependencies: + chart.js: 4.4.8 + react: 18.3.1 + dev: false + + /react-day-picker@8.10.1(date-fns@3.6.0)(react@18.3.1): + resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==} + peerDependencies: + date-fns: ^2.28.0 || ^3.0.0 + react: ^18.3.1 + dependencies: + date-fns: 3.6.0 + react: 18.3.1 + dev: false + + /react-day-picker@9.7.0(react@18.3.1): + resolution: {integrity: sha512-urlK4C9XJZVpQ81tmVgd2O7lZ0VQldZeHzNejbwLWZSkzHH498KnArT0EHNfKBOWwKc935iMLGZdxXPRISzUxQ==} + engines: {node: '>=18'} + peerDependencies: + react: ^18.3.1 + dependencies: + '@date-fns/tz': 1.2.0 + date-fns: 4.1.0 + date-fns-jalali: 4.1.0-0 + react: 18.3.1 + dev: false + + /react-dnd-html5-backend@16.0.1: + resolution: {integrity: sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==} + dependencies: + dnd-core: 16.0.1 + dev: false + + /react-dnd-touch-backend@16.0.1: + resolution: {integrity: sha512-NonoCABzzjyWGZuDxSG77dbgMZ2Wad7eQiCd/ECtsR2/NBLTjGksPUx9UPezZ1nQ/L7iD130Tz3RUshL/ClKLA==} + dependencies: + '@react-dnd/invariant': 4.0.2 + dnd-core: 16.0.1 + dev: false + + /react-dnd@16.0.1(@types/node@22.13.5)(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==} + peerDependencies: + '@types/hoist-non-react-statics': '>= 3.3.1' + '@types/node': '>= 12' + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/hoist-non-react-statics': + optional: true + '@types/node': + optional: true + '@types/react': + optional: true + dependencies: + '@react-dnd/invariant': 4.0.2 + '@react-dnd/shallowequal': 4.0.2 + '@types/node': 22.13.5 + '@types/react': 18.3.18 + dnd-core: 16.0.1 + fast-deep-equal: 3.1.3 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + dev: false + + /react-dnd@16.0.1(@types/node@22.13.9)(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==} + peerDependencies: + '@types/hoist-non-react-statics': '>= 3.3.1' + '@types/node': '>= 12' + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/hoist-non-react-statics': + optional: true + '@types/node': + optional: true + '@types/react': + optional: true + dependencies: + '@react-dnd/invariant': 4.0.2 + '@react-dnd/shallowequal': 4.0.2 + '@types/node': 22.13.9 + '@types/react': 18.3.18 + dnd-core: 16.0.1 + fast-deep-equal: 3.1.3 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + dev: false + + /react-docgen-typescript@2.2.2(typescript@5.6.3): + resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} + peerDependencies: + typescript: '>= 4.3.x' + dependencies: + typescript: 5.6.3 + dev: true + + /react-docgen@7.1.1: + resolution: {integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==} + engines: {node: '>=16.14.0'} + dependencies: + '@babel/core': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + '@types/doctrine': 0.0.9 + '@types/resolve': 1.20.6 + doctrine: 3.0.0 + resolve: 1.22.10 + strip-indent: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + /react-dropzone@14.3.8(react@18.3.1): + resolution: {integrity: sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==} + engines: {node: '>= 10.13'} + peerDependencies: + react: ^18.3.1 + dependencies: + attr-accept: 2.2.5 + file-selector: 2.1.2 + prop-types: 15.8.1 + react: 18.3.1 + dev: false + + /react-hook-form@7.54.2(react@18.3.1): + resolution: {integrity: sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.3.1 + dependencies: + react: 18.3.1 + dev: false + + /react-hot-toast@2.5.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Tun3BbCxzmXXM7C+NI4qiv6lT0uwGh4oAfeJyNOjYUejTsm35mK9iCaYLGv8cBz9L5YxZLx/2ii7zsIwPtPUdw==} + engines: {node: '>=10'} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + csstype: 3.1.3 + goober: 2.1.16(csstype@3.1.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react-i18next@15.6.1(i18next@25.3.2)(react-dom@18.3.1)(react@18.3.1)(typescript@5.6.3): + resolution: {integrity: sha512-uGrzSsOUUe2sDBG/+FJq2J1MM+Y4368/QW8OLEKSFvnDflHBbZhSd1u3UkW0Z06rMhZmnB/AQrhCpYfE5/5XNg==} + peerDependencies: + i18next: '>= 23.2.3' + react: ^18.3.1 + react-dom: '*' + react-native: '*' + typescript: ^5 + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + typescript: + optional: true + dependencies: + '@babel/runtime': 7.28.2 + html-parse-stringify: 3.0.1 + i18next: 25.3.2(typescript@5.6.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + typescript: 5.6.3 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + dev: false + + /react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + dev: true + + /react-remove-scroll-bar@2.3.8(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + tslib: 2.8.1 + dev: false + + /react-remove-scroll@2.6.3(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.18)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.18)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.18)(react@18.3.1) + dev: false + + /react-smooth@4.0.4(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + fast-equals: 5.2.2 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) + dev: false + + /react-style-singleton@2.2.3(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + get-nonce: 1.0.1 + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + '@babel/runtime': 7.26.9 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react-use-measure@2.1.7(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + peerDependenciesMeta: + react-dom: + optional: true + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + dev: true + + /recast@0.23.10: + resolution: {integrity: sha512-mbCmRMJUKCJ1h41V0cu2C26ULBURwuoZ34C9rChjcDaeJ/4Kv5al3O2HPwTs2m0wQ1vGhMY+tguhzU1aE8md1A==} + engines: {node: '>= 4'} + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + dev: true + + /recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + dependencies: + decimal.js-light: 2.5.1 + dev: false + + /recharts@2.15.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-v8PUTUlyiDe56qUj82w/EDVuzEFXwEHp9/xOowGAZwfLjB9uAy3GllQVIYMWF6nU+qibx85WF75zD7AjqoT54Q==} + engines: {node: '>=14'} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + clsx: 2.1.1 + eventemitter3: 4.0.7 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + react-smooth: 4.0.4(react-dom@18.3.1)(react@18.3.1) + recharts-scale: 0.4.5 + tiny-invariant: 1.3.3 + victory-vendor: 36.9.2 + dev: false + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + dependencies: + '@babel/runtime': 7.26.9 + dev: false + + /reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + dev: true + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + /regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve-protobuf-schema@2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + dependencies: + protocol-buffers-schema: 3.6.0 + dev: false + + /resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: false + + /reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rollup@4.34.8: + resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.8 + '@rollup/rollup-android-arm64': 4.34.8 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-darwin-x64': 4.34.8 + '@rollup/rollup-freebsd-arm64': 4.34.8 + '@rollup/rollup-freebsd-x64': 4.34.8 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 + '@rollup/rollup-linux-arm-musleabihf': 4.34.8 + '@rollup/rollup-linux-arm64-gnu': 4.34.8 + '@rollup/rollup-linux-arm64-musl': 4.34.8 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 + '@rollup/rollup-linux-riscv64-gnu': 4.34.8 + '@rollup/rollup-linux-s390x-gnu': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 + '@rollup/rollup-linux-x64-musl': 4.34.8 + '@rollup/rollup-win32-arm64-msvc': 4.34.8 + '@rollup/rollup-win32-ia32-msvc': 4.34.8 + '@rollup/rollup-win32-x64-msvc': 4.34.8 + fsevents: 2.3.3 + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: false + + /safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + dev: true + + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + dev: true + + /sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + dev: false + + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + dependencies: + loose-envify: 1.4.0 + + /schema-utils@4.3.0: + resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + /select@1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + dev: true + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false + + /sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + dev: false + optional: true + + /sharp@0.34.1: + resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.1 + '@img/sharp-darwin-x64': 0.34.1 + '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-linux-arm': 0.34.1 + '@img/sharp-linux-arm64': 0.34.1 + '@img/sharp-linux-s390x': 0.34.1 + '@img/sharp-linux-x64': 0.34.1 + '@img/sharp-linuxmusl-arm64': 0.34.1 + '@img/sharp-linuxmusl-x64': 0.34.1 + '@img/sharp-wasm32': 0.34.1 + '@img/sharp-win32-ia32': 0.34.1 + '@img/sharp-win32-x64': 0.34.1 + dev: false + optional: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + dev: true + + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + requiresBuild: true + dependencies: + is-arrayish: 0.3.2 + dev: false + optional: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + dev: true + + /sonner@2.0.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-FRBphaehZ5tLdLcQ8g2WOIRE+Y7BCfWi5Zyd8bCvBjiW8TxxAyoWZIxS661Yz6TGPqFQ4VLzOF89WEYhfynSFQ==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /sort-asc@0.1.0: + resolution: {integrity: sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw==} + engines: {node: '>=0.10.0'} + dev: false + + /sort-desc@0.1.1: + resolution: {integrity: sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==} + engines: {node: '>=0.10.0'} + dev: false + + /sort-object@0.3.2: + resolution: {integrity: sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA==} + engines: {node: '>=0.10.0'} + dependencies: + sort-asc: 0.1.0 + sort-desc: 0.1.1 + dev: false + + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: true + + /ssf@0.11.2: + resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} + engines: {node: '>=0.8'} + dependencies: + frac: 1.1.2 + dev: false + + /stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + dev: true + + /steiger@0.5.5(typescript@5.6.3): + resolution: {integrity: sha512-d4eZwqJjfG7dKgwXKBwmZsNWSRqeQrRpEvEr58rhMmNbICcQsJ8cpK9n6nuish3kNjKyYzx6t2TpQYEO26xTFA==} + hasBin: true + dependencies: + '@clack/prompts': 0.8.2 + '@feature-sliced/steiger-plugin': 0.5.4(typescript@5.6.3) + chokidar: 4.0.3 + cosmiconfig: 9.0.0(typescript@5.6.3) + effector: 23.3.0 + empathic: 1.0.0 + fastest-levenshtein: 1.0.16 + globby: 14.1.0 + immer: 10.1.1 + lodash-es: 4.17.21 + micromatch: 4.0.8 + patronum: 2.3.0(effector@23.3.0) + picocolors: 1.1.1 + prexit: 2.3.0 + yargs: 17.7.2 + zod: 3.24.2 + zod-validation-error: 3.4.0(zod@3.24.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /storybook@8.6.0(prettier@3.5.2): + resolution: {integrity: sha512-NEHCK2nXogw7WxAkJfMwPnc5Cmh/KqVNrdaFeXBAKhC2Zr1FTZIiCR5nSUT85run44Wkpmo7qvUoKvII9GOWbA==} + hasBin: true + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + dependencies: + '@storybook/core': 8.6.0(prettier@3.5.2)(storybook@8.6.0) + prettier: 3.5.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + /string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + dev: true + + /string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + dev: true + + /string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.9 + dev: true + + /string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + dev: true + + /string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.1.0 + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /styled-jsx@5.1.6(react@18.3.1): + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: ^18.3.1 + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 18.3.1 + dev: false + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /tailwind-merge@3.0.2: + resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} + dev: false + + /tailwindcss-animate@1.0.7(tailwindcss@3.4.17): + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + tailwindcss: 3.4.17 + dev: false + + /tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + /tailwindcss@4.1.11: + resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + dev: false + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + /tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + dev: false + + /terser-webpack-plugin@5.3.13(webpack@5.98.0): + resolution: {integrity: sha512-JG3pBixF6kx2o0Yfz2K6pqh72DpwTI08nooHd06tcj5WyIt5SsSiUYqRT+kemrGUNSuSzVhwfZ28aO8gogajNQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.0 + serialize-javascript: 6.0.2 + terser: 5.39.0 + webpack: 5.98.0 + + /terser@5.39.0: + resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + /text-segmentation@1.0.3: + resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} + dependencies: + utrie: 1.0.2 + dev: false + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + + /tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + /tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + dev: true + + /tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + dev: true + + /tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: true + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /ts-api-utils@2.0.1(typescript@5.6.3): + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + dependencies: + typescript: 5.6.3 + dev: true + + /ts-api-utils@2.0.1(typescript@5.7.3): + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + dependencies: + typescript: 5.7.3 + dev: true + + /ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: true + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + /tsconfck@3.1.5(typescript@5.6.3): + resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.6.3 + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + /tsup@8.3.6(postcss@8.5.3)(typescript@5.6.3): + resolution: {integrity: sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + dependencies: + bundle-require: 5.1.0(esbuild@0.24.2) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.0 + debug: 4.4.0 + esbuild: 0.24.2 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-load-config: 6.0.1(postcss@8.5.3) + resolve-from: 5.0.0 + rollup: 4.34.8 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.12 + tree-kill: 1.2.2 + typescript: 5.6.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + dev: true + + /turbo-darwin-64@2.4.2: + resolution: {integrity: sha512-HFfemyWB60CJtEvVQj9yby5rkkWw9fLAdLtAPGtPQoU3tKh8t/uzCAZKso2aPVbib9vGUuGbPGoGpaRXdVhj5g==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /turbo-darwin-arm64@2.4.2: + resolution: {integrity: sha512-uwSx1dsBSSFeEC0nxyx2O219FEsS/haiESaWwE9JI8mHkQK61s6w6fN2G586krKxyNam4AIxRltleL+O2Em94g==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-64@2.4.2: + resolution: {integrity: sha512-Fy/uL8z/LAYcPbm7a1LwFnTY9pIi5FAi12iuHsgB7zHjdh4eeIKS2NIg4nroAmTcUTUZ0/cVTo4bDOCUcS3aKw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-arm64@2.4.2: + resolution: {integrity: sha512-AEA0d8h5W/K6iiXfEgiNwWt0yqRL1NpBs8zQCLdc4/L7WeYeJW3sORWX8zt7xhutF/KW9gTm8ehKpiK6cCIsAA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-windows-64@2.4.2: + resolution: {integrity: sha512-CybtIZ9wRgnnNFVN9En9G+rxsO+mwU81fvW4RpE8BWyNEkhQ8J28qYf4PaimueMxGHHp/28i/G7Kcdn2GAWG0g==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /turbo-windows-arm64@2.4.2: + resolution: {integrity: sha512-7V0yneVPL8Y3TgrkUIjw7Odmwu1tHnyIiPHFM7eFcA7U+H6hPXyCxge7nC3wOKfjhKCQqUm+Vf/k6kjmLz5G4g==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /turbo@2.4.2: + resolution: {integrity: sha512-Qxi0ioQCxMRUCcHKHZkTnYH8e7XCpNfg9QiJcyfWIc+ZXeaCjzV5rCGlbQlTXMAtI8qgfP8fZADv3CFtPwqdPQ==} + hasBin: true + optionalDependencies: + turbo-darwin-64: 2.4.2 + turbo-darwin-arm64: 2.4.2 + turbo-linux-64: 2.4.2 + turbo-linux-arm64: 2.4.2 + turbo-windows-64: 2.4.2 + turbo-windows-arm64: 2.4.2 + dev: true + + /tus-js-client@4.3.1: + resolution: {integrity: sha512-ZLeYmjrkaU1fUsKbIi8JML52uAocjEZtBx4DKjRrqzrZa0O4MYwT6db+oqePlspV+FxXJAyFBc/L5gwUi2OFsg==} + engines: {node: '>=18'} + dependencies: + buffer-from: 1.1.2 + combine-errors: 3.0.3 + is-stream: 2.0.1 + js-base64: 3.7.7 + lodash.throttle: 4.1.1 + proper-lockfile: 4.1.2 + url-parse: 1.5.10 + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: true + + /typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + dev: true + + /typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + dev: true + + /typescript-eslint@8.25.0(eslint@9.21.0)(typescript@5.6.3): + resolution: {integrity: sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0)(eslint@9.21.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.6.3) + eslint: 9.21.0 + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + dev: true + + /typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + /typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + dev: true + + /undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + dev: true + + /undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + /unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + dev: true + + /unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + dev: true + + /update-browserslist-db@1.1.3(browserslist@4.24.4): + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /use-callback-ref@1.3.3(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /use-sidecar@1.1.3(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^18.3.18 + react: ^18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.18 + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + dependencies: + inherits: 2.0.3 + dev: false + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.18 + dev: true + + /utrie@1.0.2: + resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} + dependencies: + base64-arraybuffer: 1.0.2 + dev: false + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: true + + /victory-vendor@36.9.2: + resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-ease': 3.0.2 + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + dev: false + + /vite-tsconfig-paths@5.1.4(typescript@5.6.3)(vite@6.2.0): + resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.4.0 + globrex: 0.1.2 + tsconfck: 3.1.5(typescript@5.6.3) + vite: 6.2.0(@types/node@22.13.5) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@5.4.18(@types/node@22.13.9): + resolution: {integrity: sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 22.13.9 + esbuild: 0.21.5 + postcss: 8.5.3 + rollup: 4.34.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vite@6.2.0(@types/node@22.13.5): + resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + dependencies: + '@types/node': 22.13.5 + esbuild: 0.25.0 + postcss: 8.5.3 + rollup: 4.34.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vite@6.2.0(@types/node@22.13.9): + resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + dependencies: + '@types/node': 22.13.9 + esbuild: 0.25.0 + postcss: 8.5.3 + rollup: 4.34.8 + optionalDependencies: + fsevents: 2.3.3 + + /void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + dev: false + + /watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + /web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + dev: false + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + /webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + dev: true + + /webpack@5.98.0: + resolution: {integrity: sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.0 + browserslist: 4.24.4 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.1 + es-module-lexer: 1.6.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.13(webpack@5.98.0) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + + /which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + dev: true + + /which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + dev: true + + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + dev: true + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: false + + /which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.5 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wkt-parser@1.4.0: + resolution: {integrity: sha512-qpwO7Ihds/YYDTi1aADFTI1Sm9YC/tTe3SHD24EeIlZxy7Ik6a1b4HOz7jAi0xdUAw487duqpo8OGu+Tf4nwlQ==} + dev: false + + /wmf@1.0.2: + resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} + engines: {node: '>=0.8'} + dev: false + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /word@0.3.0: + resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} + engines: {node: '>=0.8'} + dev: false + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + /ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xlsx-populate@1.21.0: + resolution: {integrity: sha512-8v2Gm8BehXo6LU7KT802QoXTPkYY1SKk5V8g/UuYZnNB3JzXqud/P99Pxr2yXeKyt+sKlCatmidz6jQNie1hRw==} + dependencies: + cfb: 1.2.2 + jszip: 3.10.1 + lodash: 4.17.21 + sax: 1.4.1 + dev: false + + /xlsx@0.18.5: + resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} + engines: {node: '>=0.8'} + hasBin: true + dependencies: + adler-32: 1.3.1 + cfb: 1.2.2 + codepage: 1.15.0 + crc-32: 1.2.2 + ssf: 0.11.2 + wmf: 1.0.2 + word: 0.3.0 + dev: false + + /xml-utils@1.10.2: + resolution: {integrity: sha512-RqM+2o1RYs6T8+3DzDSoTRAUfrvaejbVHcp3+thnAtDKo8LskR+HomLajEy5UjTz24rpka7AxVBRR3g2wTUkJA==} + dev: false + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + dev: false + + /yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: false + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /zod-validation-error@3.4.0(zod@3.24.2): + resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.18.0 + dependencies: + zod: 3.24.2 + dev: true + + /zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + + /zstddec@0.1.0: + resolution: {integrity: sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==} + dev: false + + /zustand@5.0.3(@types/react@18.3.18)(react@18.3.1): + resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': ^18.3.18 + immer: '>=9.0.6' + react: ^18.3.1 + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + dependencies: + '@types/react': 18.3.18 + react: 18.3.1 + dev: false From 5a3eb041dc7fa9e9e104a3662ed72474f9de0e4c Mon Sep 17 00:00:00 2001 From: bicochan Date: Wed, 30 Jul 2025 16:02:59 +0900 Subject: [PATCH 02/36] =?UTF-8?q?[apps/cs]=20chore:=20InputDateRangePicker?= =?UTF-8?q?=20=EA=B2=BD=EA=B3=A0=20=EB=AC=B8=EA=B5=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/src/shared/ui/input-date-range-picker.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/cs/src/shared/ui/input-date-range-picker.tsx b/apps/cs/src/shared/ui/input-date-range-picker.tsx index 9f574661e..1ee2bc5e1 100644 --- a/apps/cs/src/shared/ui/input-date-range-picker.tsx +++ b/apps/cs/src/shared/ui/input-date-range-picker.tsx @@ -20,7 +20,7 @@ function InputDateRangePicker({ useEffect(() => { if (dateRange.from && dateRange.to && dateRange.from > dateRange.to) { - alert("시작일보다 종료일이 커야 합니다."); + alert("종료일이 시작일보다 이전일 수 없습니다."); setDateRange({ ...dateRange, to: dateRange.from }); } }, [dateRange]); From 1f33f55079fbad386053ff0117895f0550429e1b Mon Sep 17 00:00:00 2001 From: bicochan Date: Wed, 30 Jul 2025 16:04:51 +0900 Subject: [PATCH 03/36] =?UTF-8?q?[apps/cs]=20design:=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=ED=8C=90=20=ED=86=B5=EA=B3=84=20=EB=A0=88=EC=9D=B4=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board-statistics/page.tsx | 2 + .../api/board-statistics-service.ts | 57 +++ apps/cs/src/pages/board-statistics/index.ts | 1 + .../model/board-statistics-interface.ts | 42 ++ .../board-statistics/model/chart-data.ts | 130 +++++++ .../ui/board-statistics-page.tsx | 358 ++++++++++++++++++ 6 files changed, 590 insertions(+) create mode 100644 apps/cs/app/(with-base-layout)/board-statistics/page.tsx create mode 100644 apps/cs/src/pages/board-statistics/api/board-statistics-service.ts create mode 100644 apps/cs/src/pages/board-statistics/index.ts create mode 100644 apps/cs/src/pages/board-statistics/model/board-statistics-interface.ts create mode 100644 apps/cs/src/pages/board-statistics/model/chart-data.ts create mode 100644 apps/cs/src/pages/board-statistics/ui/board-statistics-page.tsx diff --git a/apps/cs/app/(with-base-layout)/board-statistics/page.tsx b/apps/cs/app/(with-base-layout)/board-statistics/page.tsx new file mode 100644 index 000000000..02821377f --- /dev/null +++ b/apps/cs/app/(with-base-layout)/board-statistics/page.tsx @@ -0,0 +1,2 @@ +import { BoardStatisticsPage } from "@/pages/board-statistics"; +export default BoardStatisticsPage; diff --git a/apps/cs/src/pages/board-statistics/api/board-statistics-service.ts b/apps/cs/src/pages/board-statistics/api/board-statistics-service.ts new file mode 100644 index 000000000..1897e39ba --- /dev/null +++ b/apps/cs/src/pages/board-statistics/api/board-statistics-service.ts @@ -0,0 +1,57 @@ +import { client } from "@/shared/api"; +import { ENDPOINT } from "@/shared/config"; +import { + type BoardStatisticsParams, + type BoardStatistics, + type BoardStatisticsService, +} from "../model/board-statistics-interface"; + +// 임시 모의 데이터 +const mockBoardStatisticsData: BoardStatistics = { + totalPosts: 2456, + totalComments: 156, + averageRating: 4.2, + totalViews: 45678, + dayList: [ + { date: "1월", posts: 10, comments: 5, views: 800 }, + { date: "2월", posts: 15, comments: 8, views: 1200 }, + { date: "3월", posts: 12, comments: 10, views: 1000 }, + { date: "4월", posts: 18, comments: 15, views: 1500 }, + { date: "5월", posts: 22, comments: 20, views: 1800 }, + { date: "6월", posts: 20, comments: 18, views: 1600 }, + { date: "7월", posts: 25, comments: 22, views: 2000 }, + ], + boardList: [ + { boardType: "notice", boardName: "공지사항", count: 45 }, + { boardType: "faq", boardName: "FAQ", count: 120 }, + { boardType: "qna", boardName: "Q&A", count: 180 }, + { boardType: "free", boardName: "자유게시판", count: 95 }, + ], + statusList: [ + { status: "completed", statusName: "답변완료", count: 75 }, + { status: "waiting", statusName: "답변대기", count: 25 }, + ], +}; + +class BoardStatisticsApiService implements BoardStatisticsService { + async getBoardStatistics( + params: BoardStatisticsParams, + ): Promise { + try { + // 실제 API 연동 시 아래 코드 사용 + // const response = await client.get( + // `${ENDPOINT.CMS_SERVICE.BOARD_STATISTICS}`, + // { params }, + // ); + // return response.data; + + // 임시 모의 데이터 반환 + return Promise.resolve(mockBoardStatisticsData); + } catch (error) { + console.error("게시판 통계 데이터 조회 실패:", error); + throw error; + } + } +} + +export const BoardStatisticsApi = new BoardStatisticsApiService(); diff --git a/apps/cs/src/pages/board-statistics/index.ts b/apps/cs/src/pages/board-statistics/index.ts new file mode 100644 index 000000000..8ed0e1033 --- /dev/null +++ b/apps/cs/src/pages/board-statistics/index.ts @@ -0,0 +1 @@ +export { BoardStatisticsPage } from "./ui/board-statistics-page"; diff --git a/apps/cs/src/pages/board-statistics/model/board-statistics-interface.ts b/apps/cs/src/pages/board-statistics/model/board-statistics-interface.ts new file mode 100644 index 000000000..8ec52dabf --- /dev/null +++ b/apps/cs/src/pages/board-statistics/model/board-statistics-interface.ts @@ -0,0 +1,42 @@ +import type { PageableList, PageableParams } from "@/shared/model"; + +export interface BoardStatisticsParams extends PageableParams { + keywordType?: string; + keyword?: string; + siteId?: string; + startDate?: string; + endDate?: string; +} + +export interface BoardStatistics { + totalPosts: number; + totalComments: number; + averageRating: number; + totalViews: number; + dayList: DayStatistics[]; + boardList: BoardTypeStatistics[]; + statusList: StatusStatistics[]; +} + +interface DayStatistics { + date: string; + posts: number; + comments: number; + views: number; +} + +interface BoardTypeStatistics { + boardType: string; + boardName: string; + count: number; +} + +interface StatusStatistics { + status: string; + statusName: string; + count: number; +} + +export interface BoardStatisticsService { + getBoardStatistics(params: BoardStatisticsParams): Promise; +} diff --git a/apps/cs/src/pages/board-statistics/model/chart-data.ts b/apps/cs/src/pages/board-statistics/model/chart-data.ts new file mode 100644 index 000000000..2a9b6671f --- /dev/null +++ b/apps/cs/src/pages/board-statistics/model/chart-data.ts @@ -0,0 +1,130 @@ +import type { ChartData, ChartOptions } from "chart.js"; +import { getCssVariableValue } from "@common/components"; +import type { BoardStatistics } from "./board-statistics-interface"; + +export const chartData = { + day: ( + data: BoardStatistics, + ): { + data: ChartData<"line">; + options: ChartOptions<"line">; + } => { + return { + data: { + labels: data.dayList.map((item) => item.date), + datasets: [ + { + type: "line", + label: "신규게시물", + data: data.dayList.map((item) => item.posts), + borderColor: getCssVariableValue("--chart-1"), + backgroundColor: "rgba(59, 130, 246, 0.1)", + tension: 0.4, + }, + { + type: "line", + label: "답변대기", + data: data.dayList.map((item) => item.comments), + borderColor: getCssVariableValue("--chart-2"), + backgroundColor: "rgba(236, 72, 153, 0.1)", + tension: 0.4, + }, + { + type: "line", + label: "조회수", + data: data.dayList.map((item) => item.views), + borderColor: getCssVariableValue("--chart-3"), + backgroundColor: "rgba(168, 85, 247, 0.1)", + tension: 0.4, + hidden: true, + }, + ], + }, + options: { + maintainAspectRatio: false, + responsive: true, + plugins: { + legend: { + position: "bottom", + }, + }, + scales: { + y: { + ticks: { + precision: 0, + }, + }, + }, + }, + }; + }, + + board: ( + data: BoardStatistics, + ): { + data: ChartData<"bar">; + options: ChartOptions<"bar">; + } => { + return { + data: { + labels: data.boardList.map((item) => item.boardName), + datasets: [ + { + type: "bar", + label: "게시판별 분포", + data: data.boardList.map((item) => item.count), + backgroundColor: data.boardList.map((_, index) => + getCssVariableValue(`--chart-${(index % 5) + 1}`), + ), + }, + ], + }, + options: { + maintainAspectRatio: false, + indexAxis: "y", + scales: { + x: { + ticks: { + precision: 0, + }, + }, + }, + plugins: { + legend: { + display: false, + }, + }, + }, + }; + }, + + status: ( + data: BoardStatistics, + ): { + data: ChartData<"doughnut">; + options: ChartOptions<"doughnut">; + } => { + return { + data: { + labels: data.statusList.map((item) => item.statusName), + datasets: [ + { + type: "doughnut", + data: data.statusList.map((item) => item.count), + backgroundColor: data.statusList.map((_, index) => + getCssVariableValue(`--chart-${(index % 5) + 1}`), + ), + }, + ], + }, + options: { + maintainAspectRatio: false, + plugins: { + legend: { + position: "bottom", + }, + }, + }, + }; + }, +}; diff --git a/apps/cs/src/pages/board-statistics/ui/board-statistics-page.tsx b/apps/cs/src/pages/board-statistics/ui/board-statistics-page.tsx new file mode 100644 index 000000000..d879c34d6 --- /dev/null +++ b/apps/cs/src/pages/board-statistics/ui/board-statistics-page.tsx @@ -0,0 +1,358 @@ +"use client"; + +import dayjs from "dayjs"; +import { useState } from "react"; +import { keepPreviousData, useQuery } from "@tanstack/react-query"; +import { + Chart as ChartJS, + CategoryScale, + LinearScale, + PointElement, + LineElement, + BarElement, + ArcElement, + Filler, + Legend, + Tooltip, +} from "chart.js"; +import { Bar, Doughnut, Line } from "react-chartjs-2"; +import { + Button, + Label, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@common/components"; +import { SiteSelect } from "@/entities/site"; +import { ENDPOINT } from "@/shared/config"; +import { NoData } from "@/shared/ui/no-data"; +import { InputDateRangePicker } from "@/shared/ui/input-date-range-picker"; +import { BoardStatisticsApi } from "../api/board-statistics-service"; +import { chartData } from "../model/chart-data"; +import type { BoardStatisticsParams } from "../model/board-statistics-interface"; + +ChartJS.register( + CategoryScale, + LinearScale, + PointElement, + LineElement, + BarElement, + ArcElement, + Filler, + Legend, + Tooltip, +); + +type DateRange = { + from?: Date | undefined; + to?: Date | undefined; +}; + +function BoardStatisticsPage() { + const defaultDateRange: DateRange = { + from: dayjs().subtract(7, "day").toDate(), + to: dayjs().toDate(), + }; + + const [siteId, setSiteId] = useState(""); + const [presetDateRange, setPresetDateRange] = useState("1W"); + const [dateRange, setDateRange] = useState(defaultDateRange); + const [searchParams, setSearchParams] = useState({ + siteId: "", + startDate: dayjs(defaultDateRange.from).format("YYYY-MM-DD"), + endDate: dayjs(defaultDateRange.to).format("YYYY-MM-DD"), + }); + + const { data: boardStatisticsData } = useQuery({ + queryKey: ["board-statistics", searchParams], + queryFn: () => + BoardStatisticsApi.getBoardStatistics({ + ...searchParams, + }), + placeholderData: keepPreviousData, + }); + + const handlePresetDateRange = (value: string) => { + let presetDateRange: DateRange; + switch (value) { + case "1W": + presetDateRange = { + from: dayjs().subtract(7, "day").toDate(), + to: dayjs().toDate(), + }; + break; + case "1M": + presetDateRange = { + from: dayjs().subtract(30, "day").toDate(), + to: dayjs().toDate(), + }; + break; + case "3M": + presetDateRange = { + from: dayjs().subtract(90, "day").toDate(), + to: dayjs().toDate(), + }; + break; + default: + presetDateRange = defaultDateRange; + } + setPresetDateRange(value); + setDateRange(presetDateRange); + }; + + const handleDateRangeChange = (dateRange: DateRange) => { + setDateRange(dateRange); + setPresetDateRange(""); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + const params: BoardStatisticsParams = { + siteId, + startDate: dateRange.from + ? dayjs(dateRange.from).format("YYYY-MM-DD") + : "", + endDate: dateRange.to ? dayjs(dateRange.to).format("YYYY-MM-DD") : "", + }; + setSearchParams(params); + }; + + const handleReset = () => { + setSiteId(""); + setDateRange(defaultDateRange); + setPresetDateRange("1W"); + setSearchParams({ + siteId: "", + startDate: dayjs(defaultDateRange.from).format("YYYY-MM-DD"), + endDate: dayjs(defaultDateRange.to).format("YYYY-MM-DD"), + }); + }; + + return ( +
+
+
+ + + + + setSiteId(value)} + /> + + + +
+ + {/* 주요 지표 카드 */} +
+
+
+

총 게시물

+
+
+ {boardStatisticsData?.totalPosts.toLocaleString() || 0} +
+
+ +
+
+
+
+ +
+
+

답변대기

+
+
+ {boardStatisticsData?.totalComments.toLocaleString() || 0} +
+
+ +
+
+
+
+ +
+
+

평균평점

+
+
+ {boardStatisticsData?.averageRating.toFixed(1) || 0} +
+
+ +
+
+
+
+ +
+
+

총 조회수

+
+
+ {boardStatisticsData?.totalViews.toLocaleString() || 0} +
+
+ +
+
+
+
+
+ + {/* 차트 영역 */} +
+
+
+

일별 게시물 현황

+
+
+ {boardStatisticsData?.dayList?.length ? ( + + ) : ( + + )} +
+
+ +
+
+
+

답변상태

+
+
+ {boardStatisticsData?.statusList?.length ? ( + + ) : ( + + )} +
+
+ +
+
+

게시판별 분포

+
+
+ {boardStatisticsData?.boardList?.length ? ( + + ) : ( + + )} +
+
+
+
+
+ ); +} + +export { BoardStatisticsPage }; From 80156bd349f3c658cf2aa71c4807699771105f8f Mon Sep 17 00:00:00 2001 From: JIeunhuh Date: Thu, 31 Jul 2025 10:02:21 +0900 Subject: [PATCH 04/36] =?UTF-8?q?=ED=8C=9D=EC=97=85=20=ED=98=84=ED=99=A9?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=EC=82=AC=ED=95=AD=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?(=EC=8B=9C=EC=84=A4=EB=AC=BC=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C?= =?UTF-8?q?=20api=20=EB=AA=A8=EB=91=90=20=EC=A1=B0=ED=9A=8C=20=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EB=B6=80=EB=B6=84=20=EC=9E=91=EC=97=85=20=EC=A4=91?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/map/mainMap/page.tsx | 27 ++-- apps/wr/app/map/newWindowPopup.tsx | 206 +++++++++++++++-------------- 2 files changed, 126 insertions(+), 107 deletions(-) diff --git a/apps/wr/app/map/mainMap/page.tsx b/apps/wr/app/map/mainMap/page.tsx index cc71e69aa..c9d58c422 100644 --- a/apps/wr/app/map/mainMap/page.tsx +++ b/apps/wr/app/map/mainMap/page.tsx @@ -11,7 +11,7 @@ const Map = () => { const gisMaps = useRef(null); const [isOpen, setIsOpen] = useState(false); // 팝업 열기/닫기 상태 const [isSearchModalOpen, setIsSearchModalOpen] = useState(true); // SearchModal 열림 상태 - const [featureData, setFeatureData] = useState(null); // 선택된 피쳐 데이터 + const [featureData, setFeatureData] = useState(null); // 선택된 피쳐 데이터 const [checkedLayers, setCheckedLayers] = useState([]); const [checkedLayersData, setCheckedLayersData] = useState([]); @@ -114,7 +114,9 @@ const Map = () => { } else { console.warn("OpenLayers Feature를 찾을 수 없습니다:", data); } - + const currentId = data?.fid || data?.id || data?.ftrIdn; + const lastId = featureData?.fid || featureData?.id || featureData?.ftrIdn; + if (featureData && currentId === lastId) return; // 이전과 같으면 무시 setFeatureData(data); setIsOpen(true); setIsSearchModalOpen(false); @@ -130,7 +132,17 @@ const Map = () => { // /> // ); // }; - + const renderDetailView = useCallback( + (props: any) => ( + + ), + [handlePopupClose, checkedLayers, checkedLayersData] // 필요 시 의존성 넣기 + ); return (
{ gisMaps={gisMaps} isMiniMap={false} searchView={undefined} - detailView={(props: any) => ( - - )} + detailView={renderDetailView} onFeatureSelect={onFeatureSelect} setIsOpen={setIsOpen} setFeatureData={setFeatureData} diff --git a/apps/wr/app/map/newWindowPopup.tsx b/apps/wr/app/map/newWindowPopup.tsx index 76529b31b..ea13d85de 100644 --- a/apps/wr/app/map/newWindowPopup.tsx +++ b/apps/wr/app/map/newWindowPopup.tsx @@ -15,7 +15,7 @@ import { useGisContext } from "@common/business_components/ui/map/Gis"; import type { DemandCompType } from '@common/business_components/ui/sdmInsertForm/form'; import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; import moment from 'moment'; -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; interface NewWindowPopupProps { featureData: any; @@ -87,7 +87,7 @@ const NewWindowPopup: React.FC = ({ pbnst, pubHasuInit, } = useWrStore((state) => state); - const { pubFacHeadList, pbnstHasuRes } = pbnst; + const { pubFacHeadList, pbnstHasuRes, pbnstHasuResCount } = pbnst; const [hasuList, setHasuList] = useState(pbnstHasuRes || []); const [isRuseReg, setIsRuseReg] = useState<{ data: any | undefined; @@ -100,11 +100,6 @@ const NewWindowPopup: React.FC = ({ coSttn, coSttnInit, coSttnSearch, - // getDemandCompList, - // regDemandCompany, - // updateDemandCompany, - // coSttnTxtSearch, - // demandCompList, } = useWrStore((state) => state); const [mngTable, setMngTable] = useState(); const [mngPage, setMngPage] = useState(1); @@ -112,11 +107,11 @@ const NewWindowPopup: React.FC = ({ const [isDmdModal, setIsDmdModal] = useState<{ isMoal: boolean; data: any | undefined; - }>({ isMoal: false, data: undefined}); + }>({ isMoal: false, data: undefined }); const [mngList, setMngList] = useState(coSttnRes || []); ///////////////////////////////////////////// 피쳐데이터 선택 시 각 시설별 데이터 처리 /////////////////////////////////////////////// const getSelectedLayers = () => { - console.log(1) + console.trace('호출확인',1) let result = null; const layers = gisMap ? gisMap.getLayers().getArray().filter((l: any) => l.getVisible()) : []; // gisMap이 null인지 확인 후 레이어 가져오기 let featureLayer: { get: (key: string) => any } = { get: () => null }; @@ -128,8 +123,6 @@ const NewWindowPopup: React.FC = ({ } }); result = featureLayer.get('lyrNm'); - console.log(result) - return result; }; const fetchpbnstDetail = async (featureCd: string) => { @@ -143,7 +136,7 @@ const NewWindowPopup: React.FC = ({ }; const fetchHasuDetail = async (featureCd: string, data: string) => { try { - const rainRes = await postFectch(`/prcsFclt/ruseInfo/1/10/A/0/0/1/SW/${featureCd}`, [data], fetchType.COMMON) + const rainRes = await postFectch(`/prcsFclt/ruseInfo/1/20/A/0/0/1/SW/${featureCd}`, [data], fetchType.COMMON) setHasuList( rainRes.data.map((item: any) => { return { @@ -166,7 +159,7 @@ const NewWindowPopup: React.FC = ({ const res = await getFetch(fetchType.WR, `/reuseFc/waterreuseFc/1/20/0/${featureCd}`) setRswtrList(res) } - else if(layerNm =='수요처'){ //수요처 + else if (layerNm == '수요처') { //수요처 const res = await getFetch(fetchType.WR, `/reuseFc/request/1/20/0/${featureCd}`) setMngList(res) } @@ -190,36 +183,43 @@ const NewWindowPopup: React.FC = ({ if (htdflList.length > 0) setHtdflDetailModal({ isOpen: true, data: htdflList[0] }); }, [htdflList]) useEffect(() => { - if(mngList.length > 0) setIsDmdModal({ isMoal: true, data: [mngList[0]] }); - },[mngList]) + if (mngList.length > 0) setIsDmdModal({ isMoal: true, data: [mngList[0]] }); + }, [mngList]) + const lastCalledIdRef = useRef(null); + const [layerId, setLayerId] = useState(); +useEffect(() => { + const layers = getSelectedLayers(); + setLayerId(layers); +}, []); // 최초 렌더링 시 호출 - const layerId = getSelectedLayers(); - console.log(layerId) - if (featureData && typeof featureData.getProperties === "function") { - const selectedVal = featureData.getProperties(); - let featureCd = layerId == '하수재이용시설' ? selectedVal?.swtrmt_fclt_cd : layerId == '빗물이용시설' || layerId == '중수도시설' || layerId == '온배수시설' || layerId == '수요처' ? selectedVal?.bdst_nm : layerId == '하수처리시설' ? selectedVal?.swtrmt_fclt_nm : null; - if (featureCd && featureCd !== fcltPk) { - if (layerId == '하수재이용시설') { - featureCd = selectedVal?.swtrmt_fclt_cd; - setFcltPk(featureCd); // 현재 호출된 featureCd 저장 - setActiveTab(featureCd) - fetchpbnstDetail(featureCd); // 상세정보 - } - else if (layerId == '하수처리시설') { - featureCd = selectedVal?.swtrmt_fclt_nm; - setFcltPk(featureCd); // 현재 호출된 featureCd 저장 - fetchHasuDetail(featureCd, selectedVal?.swtrmt_fclt_cd); - } - else { - featureCd = selectedVal?.bdst_nm; - setFcltPk(featureCd) - if (layerId) { - detainSttn(featureCd, layerId); - } - } - setViewMode("detail") + useEffect(() => { + if (!featureData || typeof featureData.getProperties !== "function" || featureData.getProperties() == '') return; + const selectedProps = featureData.getProperties(); + const currentId = featureData.getId?.() || selectedProps?.id || selectedProps?.fid; + // 유효하지 않은 ID는 아예 무시 + if (!currentId || typeof currentId !== 'string') return; + // 이전과 동일하면 무시 + if (!currentId || currentId === lastCalledIdRef.current) return; + lastCalledIdRef.current = currentId // 새로운 피처일 때만 API 호출 + const layerId = getSelectedLayers?.(); + if (!layerId || typeof layerId !== 'string') return; + const featureCd = + layerId === '하수재이용시설' ? selectedProps?.swtrmt_fclt_cd : + ['빗물이용시설', '중수도시설', '온배수시설', '수요처'].includes(layerId) ? selectedProps?.bdst_nm : + layerId === '하수처리시설' ? selectedProps?.swtrmt_fclt_nm : + null; + if (!featureCd || featureCd === fcltPk) return; + if (layerId === '하수재이용시설') { + fetchpbnstDetail(featureCd); + } else if (layerId === '하수처리시설') { + fetchHasuDetail(featureCd, selectedProps?.swtrmt_fclt_cd); + } else { + detainSttn(featureCd, layerId); } - } else if (layerId === null && seletectedLayerNm) { setViewMode("list") } + setFcltPk(featureCd); + setViewMode("detail"); + setActiveTab(featureCd); + }, [featureData]); ///////////////////////////////////////////// 피쳐데이터 선택 시 각 시설별 데이터 처리 /////////////////////////////////////////////// ///////////////////////////////////////////// 하수재이용시설 ////////////////////////////////////////////////// @@ -238,12 +238,14 @@ const NewWindowPopup: React.FC = ({ // 재이용 현황 초기값 useEffect(() => { - if (!pbnstSttn.isInit) { + if (!pbnstSttn.isInit && seletectedLayerNm === '하수재이용시설') { getFlcts() } }, [seletectedLayerNm, pbnstSttn.isInit, getFlcts]); useEffect(() => { - pbnSttnInit("1", "15", { + if(seletectedLayerNm !== '하수재이용시설') return; + console.trace('check', 1) + pbnSttnInit("1", "20", { partValue: "A", sidoValue: '0', sigunValue: "0", @@ -254,7 +256,7 @@ const NewWindowPopup: React.FC = ({ sidoText: "", sigunText: "" }, String(new Date().getFullYear()), pbnstSttn.fclts); - }, [fclts, pbnSttnInit, pbnstSttn.fclts]) + }, [fclts, pbnSttnInit, pbnstSttn.fclts, seletectedLayerNm]) useEffect(() => { setBdstTable(pbnstSttn.pbnstSttnRes); }, [seletectedLayerNm, pbnstSttn.pbnstSttnRes]); @@ -271,10 +273,11 @@ const NewWindowPopup: React.FC = ({ // 재이용시설 조회 // 재이용시설 페이징처리 관련 함수 const onPageChangeHandler = useCallback((page: number) => { + if(seletectedLayerNm!== '하수재이용시설') return; pbnstSttnSearch( false, String(page), - String(13), + String(20), { partValue: "A", sidoValue: "0", @@ -318,6 +321,7 @@ const NewWindowPopup: React.FC = ({ useEffect(() => { + if(seletectedLayerNm !== '빗물이용시설') return; if (!rainSttn.isInit) { rainSttnInit(false, 1, "20", "0", '', code.cityCd, code.sggCd); } @@ -355,6 +359,7 @@ const NewWindowPopup: React.FC = ({ }, [code, rainSttnRes, rainSttn.rainSttHeadList]); useEffect(() => { + if(seletectedLayerNm !== '빗물이용시설') return; rainSttnSearch(false, rainPage, "20", '', '', code.cityCd, code.sggCd); }, [code.cityCd, code.sggCd, rainPage, rainSttnSearch]); ///////////////////////////////////////////// 빗물 재이용 ////////////////////////////////////////////////// @@ -370,12 +375,14 @@ const NewWindowPopup: React.FC = ({ } } useEffect(() => { + if(seletectedLayerNm !== '중수도시설') return; if (!rswtSttn.isInit) { rswtSttnInit(false, 1, "20", "0", '', code.cityCd, code.sggCd); } }, [code.cityCd, code.sggCd, rswtSttn.isInit, rswtSttnInit]); useEffect(() => { + if(seletectedLayerNm !== '중수도시설') return; const data = tableData(rswtSttnRes, { code }); const chData = data .map((item: customRswtBdst) => { @@ -409,6 +416,7 @@ const NewWindowPopup: React.FC = ({ // }, [rswtSttn.excelList]) useEffect(() => { + if(seletectedLayerNm !== '중수도시설') return; rswtSttnSearch(false, rswtrPage, "20", '', '', code.cityCd, code.sggCd); }, [code.cityCd, code.sggCd, rswtSttnSearch, rswtrPage]); ///////////////////////////////////////////// 중수도 시설 ////////////////////////////////////////////////// @@ -422,12 +430,14 @@ const NewWindowPopup: React.FC = ({ } }; useEffect(() => { + if(seletectedLayerNm !== '온배수시설') return; if (!htdflSttn.isInit) { initHtdfl(false, 1, "20", "0", '', code.cityCd, code.sggCd); } }, [code.cityCd, code.sggCd, htdflSttn.isInit, initHtdfl]); useEffect(() => { + if(seletectedLayerNm !== '온배수시설') return; const data = tableData(htdflSttnRes, { code }); const chData = data .map((item: any) => ({ @@ -441,6 +451,7 @@ const NewWindowPopup: React.FC = ({ }, [code, htdflSttnRes, htdflSttn.htdflSttHeadList]); useEffect(() => { + if(seletectedLayerNm !== '온배수시설') return; htdflSttnSearch(true, htdflPage, "20", '', '', code.cityCd, code.sggCd); }, [code.cityCd, code.sggCd, htdflPage, htdflSttnSearch]); ///////////////////////////////////////////// 온배수 시설 ////////////////////////////////////////////////// @@ -452,6 +463,7 @@ const NewWindowPopup: React.FC = ({ } }, [code, pbnstHasuRes]); useEffect(() => { + if(seletectedLayerNm !== '하수처리시설') return; if (!pbnst.isInit) { pubHasuInit("1", "0"); } @@ -470,8 +482,9 @@ const NewWindowPopup: React.FC = ({ ///////////////////////////////////////////// 수요처 관리 ////////////////////////////////////////////////// useEffect(() => { + if(seletectedLayerNm !== '수요처') return; if (!coSttn.isInit) { - coSttnInit("1", "13", "0"); + coSttnInit("1", "20", "0"); } }, [coSttn.isInit, coSttnInit]); const coMngCellClick = (index: number | undefined) => { @@ -481,6 +494,7 @@ const NewWindowPopup: React.FC = ({ } }; useEffect(() => { + if(seletectedLayerNm !== '수요처') return; if (coSttnRes) { if (coSttnRes?.length > 0 && code.cityCd.length > 0) { const data = tableData(coSttnRes, { code }); @@ -496,21 +510,21 @@ const NewWindowPopup: React.FC = ({ } }, [coSttnRes, code]); useEffect(() => { - coSttnSearch(String(mngPage), "13", String(0)); + if(seletectedLayerNm !== '수요처') return; + coSttnSearch(String(mngPage), "20", String(0)); }, [coSttnSearch, mngPage]); ///////////////////////////////////////////// 수요처 관리 ////////////////////////////////////////////////// // 체크된 레이어에 따른 조건부 컴포넌트 렌더링 함수 const renderConditionalContent = () => { const actTabData = tabData.find((tab) => tab.id === activeTab); - let layerId: string | undefined | null = getSelectedLayers(); if (layerId === null || layerId === undefined) { - layerId = seletectedLayerNm || ''; + setLayerId(seletectedLayerNm || ''); } //하수처리시설 const isPrcsFclt = layerId == '하수처리시설' // 재이용시설 - const isPbnst = layerId == '재이용시설'; + const isPbnst = layerId == '하수재이용시설'; // 빗물이용시설 const isRain = layerId == '빗물이용시설'; // 중수도시설 @@ -518,7 +532,7 @@ const NewWindowPopup: React.FC = ({ // 온배수시설 const isHtdfl = layerId == '온배수시설'; // 수요처관리 - const isReuseMng = layerId == '수요처관리'; + const isReuseMng = layerId == '수요처'; if (isPrcsFclt) { if (viewMode == 'list') { return ( @@ -530,8 +544,8 @@ const NewWindowPopup: React.FC = ({ = ({ } if (isReuseMng) { if (viewMode == 'detail') { - return ( -
-
- - </div> - {/* 높이 조정 */} - <UiTable - tableData={isDmdModal?.data || []} - headlist={coSttHeadList.slice(0, 3)} - pageSize={1} - total={0} - headName={"위치정보"} - cellClick={() => { }} - onPageChange={() => { }} - /> - <UiTable - tableData={isDmdModal?.data || []} - headlist={coSttHeadList.slice(3)} - pageSize={1} - total={0} - headName={"기본정보"} - cellClick={() => { }} - onPageChange={() => { }} - /> + return ( + <div style={{ overflowX: 'hidden' }}> + <div className="flex justify-between items-center mb-4"> + <Title title="수요처 상세정보" /> </div> - ) - } else if(viewMode == 'list') { - return ( <div> + {/* 높이 조정 */} + <UiTable + tableData={isDmdModal?.data || []} + headlist={coSttHeadList.slice(0, 3)} + pageSize={1} + total={0} + headName={"위치정보"} + cellClick={() => { }} + onPageChange={() => { }} + /> + <UiTable + tableData={isDmdModal?.data || []} + headlist={coSttHeadList.slice(3)} + pageSize={1} + total={0} + headName={"기본정보"} + cellClick={() => { }} + onPageChange={() => { }} + /> + </div> + ) + } else if (viewMode == 'list') { + return (<div> <div className="flex justify-between items-center"> - <Title title="수요처 현황" /> - </div> - <UiTable - headName={[]} - tableData={mngTable || []} - headlist={coSttHeadList} - pageSize={20} - total={coSttnResCount + 10 || 0} - cellClick={(index: number | undefined) => { - coMngCellClick(index); - // setUpdateData(coSttnRes[index as number]); - }} - onPageChange={(page) => { - setMngPage(page); - }} - ></UiTable></div>) + <Title title="수요처 현황" /> + </div> + <UiTable + headName={[]} + tableData={mngTable || []} + headlist={coSttHeadList} + pageSize={20} + total={coSttnResCount + 10 || 0} + cellClick={(index: number | undefined) => { + coMngCellClick(index); + // setUpdateData(coSttnRes[index as number]); + }} + onPageChange={(page) => { + setMngPage(page); + }} + ></UiTable></div>) } } return null; // 조건에 맞는 콘텐츠가 없을 경우 From 713928e7947602142c2853abb8894a39d28634ea Mon Sep 17 00:00:00 2001 From: bicochan <chanii8@naver.com> Date: Thu, 31 Jul 2025 10:37:47 +0900 Subject: [PATCH 05/36] =?UTF-8?q?[apps/cs]=20refactor:=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/common/components/src/ui/lnb/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/common/components/src/ui/lnb/index.tsx b/packages/common/components/src/ui/lnb/index.tsx index d7fabd39b..dee4356f6 100644 --- a/packages/common/components/src/ui/lnb/index.tsx +++ b/packages/common/components/src/ui/lnb/index.tsx @@ -67,7 +67,7 @@ export function LNB({ const { data: previewTreeMenuListData } = useQuery({ queryKey: [ENDPOINT.CMS_SERVICE.MENUS, siteId, "preview"], queryFn: () => getPreviewTreeMenuList(siteId), - enabled: isLoggedIn && previewMode, + enabled: isLoggedIn && !!previewMode, }); const { data: anonymousMenuListData } = useQuery({ From 26f222525d8a671e0ddcac0729c893e575da07b3 Mon Sep 17 00:00:00 2001 From: bicochan <chanii8@naver.com> Date: Thu, 31 Jul 2025 11:48:27 +0900 Subject: [PATCH 06/36] =?UTF-8?q?[apps/cs]=20refactor:=20=EC=A0=91?= =?UTF-8?q?=EC=86=8D=20=EB=A1=9C=EA=B7=B8=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/src/app/index.tsx | 2 +- apps/cs/src/app/providers/index.ts | 1 - .../api/connection-log-service.ts | 20 +++++++++++++++---- apps/cs/src/entities/connection-log/index.ts | 6 ++++++ .../model/connection-log-interface.ts | 20 +++++++++++++++++-- .../pages/user-statistics/model/chart-data.ts | 2 +- .../user-statistics/model/table-columns.ts | 2 +- .../ui/user-statistics-page.tsx | 8 +++++--- 8 files changed, 48 insertions(+), 13 deletions(-) delete mode 100644 apps/cs/src/app/providers/index.ts rename apps/cs/src/{pages/user-statistics => entities/connection-log}/api/connection-log-service.ts (63%) create mode 100644 apps/cs/src/entities/connection-log/index.ts rename apps/cs/src/{pages/user-statistics => entities/connection-log}/model/connection-log-interface.ts (74%) diff --git a/apps/cs/src/app/index.tsx b/apps/cs/src/app/index.tsx index 692b55ef0..6ba1e325a 100644 --- a/apps/cs/src/app/index.tsx +++ b/apps/cs/src/app/index.tsx @@ -2,8 +2,8 @@ import "./styles/base.css"; import "./styles/components.css"; import "@fontsource-variable/noto-sans-kr"; -import { AppProvider } from "./providers"; import { cookies } from "next/headers"; +import { AppProvider } from "./providers/app-provider"; const App = async ({ children }: Readonly<{ children: React.ReactNode }>) => { const theme = (await cookies()).get("site-theme-key"); diff --git a/apps/cs/src/app/providers/index.ts b/apps/cs/src/app/providers/index.ts deleted file mode 100644 index 15f99b7fd..000000000 --- a/apps/cs/src/app/providers/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { AppProvider } from "./app-provider"; diff --git a/apps/cs/src/pages/user-statistics/api/connection-log-service.ts b/apps/cs/src/entities/connection-log/api/connection-log-service.ts similarity index 63% rename from apps/cs/src/pages/user-statistics/api/connection-log-service.ts rename to apps/cs/src/entities/connection-log/api/connection-log-service.ts index 0e2daeb5b..0b4cc55ad 100644 --- a/apps/cs/src/pages/user-statistics/api/connection-log-service.ts +++ b/apps/cs/src/entities/connection-log/api/connection-log-service.ts @@ -2,17 +2,19 @@ import { client } from "@/shared/api"; import { ENDPOINT } from "@/shared/config"; import { type ConnectionLogParams, - type ConnectionLogList, type ConnectionStatisticsParams, type ConnectionStatistics, type ConnectionLogService, + type ConnectionLogPageList, + type ConnectionLogPayload, + type ConnectionLog, } from "../model/connection-log-interface"; class ConnectionLogApiService implements ConnectionLogService { - async getConnectionLog( + async getConnectionLogPage( params: ConnectionLogParams, - ): Promise<ConnectionLogList> { - const response = await client.get<ConnectionLogList>( + ): Promise<ConnectionLogPageList> { + const response = await client.get<ConnectionLogPageList>( `${ENDPOINT.CMS_SERVICE.CONNECTION_LOG}`, { params }, ); @@ -28,6 +30,16 @@ class ConnectionLogApiService implements ConnectionLogService { ); return response.data; } + + async saveConnectionLog( + payload: ConnectionLogPayload, + ): Promise<ConnectionLog> { + const response = await client.post<ConnectionLog>( + `${ENDPOINT.CMS_SERVICE.CONNECTION_LOG}`, + payload, + ); + return response.data; + } } export const ConnectionLogApi = new ConnectionLogApiService(); diff --git a/apps/cs/src/entities/connection-log/index.ts b/apps/cs/src/entities/connection-log/index.ts new file mode 100644 index 000000000..d9c61a988 --- /dev/null +++ b/apps/cs/src/entities/connection-log/index.ts @@ -0,0 +1,6 @@ +export { ConnectionLogApi } from "./api/connection-log-service"; +export type { + ConnectionLog, + ConnectionStatistics, + ConnectionStatisticsParams, +} from "./model/connection-log-interface"; diff --git a/apps/cs/src/pages/user-statistics/model/connection-log-interface.ts b/apps/cs/src/entities/connection-log/model/connection-log-interface.ts similarity index 74% rename from apps/cs/src/pages/user-statistics/model/connection-log-interface.ts rename to apps/cs/src/entities/connection-log/model/connection-log-interface.ts index 6fbf4dc15..aed70873f 100644 --- a/apps/cs/src/pages/user-statistics/model/connection-log-interface.ts +++ b/apps/cs/src/entities/connection-log/model/connection-log-interface.ts @@ -22,11 +22,24 @@ export interface ConnectionLog { menuCd: number; siteId: string; urlPath: string; +} + +export interface ConnectionLogList extends ConnectionLog { siteNm: string; menuNm: string; wbsrKndNm: string; } +export interface ConnectionLogPayload { + cntnId?: string; + cntnIp?: string; + cntnRgn?: string; + wbsrKnd?: string; + menuCd?: number; + siteId?: string; + urlPath: string; +} + export interface ConnectionStatisticsParams { keywordType?: string; keyword?: string; @@ -62,11 +75,14 @@ export interface ConnectionStatistics { browserList: BrowserConnectionStatistics[]; } -export type ConnectionLogList = PageableList<ConnectionLog>; +export type ConnectionLogPageList = PageableList<ConnectionLog>; export interface ConnectionLogService { - getConnectionLog(params: ConnectionLogParams): Promise<ConnectionLogList>; + getConnectionLogPage( + params: ConnectionLogParams, + ): Promise<ConnectionLogPageList>; getConnectionStatistics( params: ConnectionStatisticsParams, ): Promise<ConnectionStatistics>; + saveConnectionLog(payload: ConnectionLogPayload): Promise<ConnectionLog>; } diff --git a/apps/cs/src/pages/user-statistics/model/chart-data.ts b/apps/cs/src/pages/user-statistics/model/chart-data.ts index 455dcac56..87a5322c1 100644 --- a/apps/cs/src/pages/user-statistics/model/chart-data.ts +++ b/apps/cs/src/pages/user-statistics/model/chart-data.ts @@ -1,6 +1,6 @@ import type { ChartData, ChartOptions } from "chart.js"; import { getCssVariableValue } from "@common/components"; -import type { ConnectionStatistics } from "./connection-log-interface"; +import type { ConnectionStatistics } from "@/entities/connection-log"; export const chartData = { day: ( diff --git a/apps/cs/src/pages/user-statistics/model/table-columns.ts b/apps/cs/src/pages/user-statistics/model/table-columns.ts index 09fe58adf..8530345d3 100644 --- a/apps/cs/src/pages/user-statistics/model/table-columns.ts +++ b/apps/cs/src/pages/user-statistics/model/table-columns.ts @@ -1,5 +1,5 @@ import type { ColumnDef } from "@tanstack/react-table"; -import type { ConnectionLog } from "./connection-log-interface"; +import type { ConnectionLog } from "@/entities/connection-log"; import dayjs from "dayjs"; export const columns: ColumnDef<ConnectionLog>[] = [ diff --git a/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx b/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx index 801ca5eb0..9ddfdd124 100644 --- a/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx +++ b/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx @@ -27,15 +27,17 @@ import { SelectTrigger, SelectValue, } from "@common/components"; +import { + ConnectionLogApi, + type ConnectionStatisticsParams, +} from "@/entities/connection-log"; import { SiteSelect } from "@/entities/site"; import { useDataTable } from "@/shared/lib"; import { ENDPOINT } from "@/shared/config"; import { NoData } from "@/shared/ui/no-data"; import { InputDateRangePicker } from "@/shared/ui/input-date-range-picker"; -import { ConnectionLogApi } from "../api/connection-log-service"; import { chartData } from "../model/chart-data"; import { columns } from "../model/table-columns"; -import type { ConnectionStatisticsParams } from "../model/connection-log-interface"; ChartJS.register( CategoryScale, @@ -80,7 +82,7 @@ function UserStatisticsPage() { const query = useQuery({ queryKey: [ENDPOINT.CMS_SERVICE.CONNECTION_LOG, searchParams], queryFn: () => - ConnectionLogApi.getConnectionLog({ + ConnectionLogApi.getConnectionLogPage({ ...searchParams, }), placeholderData: keepPreviousData, From 3f85aa676c722d92b4d34cd4e368d857aa666e41 Mon Sep 17 00:00:00 2001 From: bicochan <chanii8@naver.com> Date: Thu, 31 Jul 2025 12:45:01 +0900 Subject: [PATCH 07/36] =?UTF-8?q?[common/components]=20feat:=20=EC=A0=91?= =?UTF-8?q?=EC=86=8D=20=EB=A1=9C=EA=B7=B8=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/src/api/connection-log.ts | 34 +++++++++++++++++++ packages/common/components/src/api/index.ts | 1 + packages/common/components/src/config/api.ts | 1 + .../common/components/src/ui/lnb/index.tsx | 15 +++++++- 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 packages/common/components/src/api/connection-log.ts diff --git a/packages/common/components/src/api/connection-log.ts b/packages/common/components/src/api/connection-log.ts new file mode 100644 index 000000000..b421b7cb3 --- /dev/null +++ b/packages/common/components/src/api/connection-log.ts @@ -0,0 +1,34 @@ +import { ENDPOINT } from "../config"; +import { getApiClient } from "./client"; + +export interface ConnectionLog { + cntnSn: number; + cntnDt: string; + cntnId: string; + cntnIp: string; + cntnRgn: string; + wbsrKnd: string; + menuCd: number; + siteId: string; + urlPath: string; +} + +export interface ConnectionLogPayload { + cntnId?: string; + cntnIp?: string; + cntnRgn?: string; + wbsrKnd?: string; + menuCd?: number | null; + siteId?: string; + urlPath: string; +} + +const client = getApiClient(); + +export const saveConnectionLog = async (payload: ConnectionLogPayload) => { + const response = await client.post<ConnectionLog>( + `${ENDPOINT.CMS_SERVICE.CONNECTION_LOG}`, + payload, + ); + return response.data; +}; diff --git a/packages/common/components/src/api/index.ts b/packages/common/components/src/api/index.ts index 10d68732c..d569765c2 100644 --- a/packages/common/components/src/api/index.ts +++ b/packages/common/components/src/api/index.ts @@ -1,4 +1,5 @@ export * from "./client"; +export * from "./connection-log"; export * from "./menu"; export * from "./popup"; export * from "./site"; diff --git a/packages/common/components/src/config/api.ts b/packages/common/components/src/config/api.ts index 6772182fb..a12ff5887 100644 --- a/packages/common/components/src/config/api.ts +++ b/packages/common/components/src/config/api.ts @@ -6,6 +6,7 @@ export const ENDPOINT = { SITES: "/cms-service/api/v1/sites", POPUPS: "/cms-service/api/v1/popups", IPS: "/cms-service/api/v1/site-ips", + CONNECTION_LOG: "/cms-service/api/v1/cntnlog", }, USER_SERVICE: { USERS: "/user-service/api/v1/users", diff --git a/packages/common/components/src/ui/lnb/index.tsx b/packages/common/components/src/ui/lnb/index.tsx index dee4356f6..8e3c2aebf 100644 --- a/packages/common/components/src/ui/lnb/index.tsx +++ b/packages/common/components/src/ui/lnb/index.tsx @@ -3,6 +3,7 @@ import { useState, useEffect, useRef } from "react"; import { useQuery } from "@tanstack/react-query"; import { ChevronRight } from "lucide-react"; +import { useDetectDevice } from "@frontend-opensource/use-react-hooks"; import { getConfig } from "@common/config"; import { getParentIds } from "./lib"; import { @@ -24,9 +25,10 @@ import { import { ENDPOINT } from "../../config"; import { cn, getCookie, setCookie } from "../../lib"; import { - getAnonymouseMenuList, getMenuList, getPreviewTreeMenuList, + getAnonymouseMenuList, + saveConnectionLog, type MenuItem, } from "../../api"; @@ -55,6 +57,7 @@ export function LNB({ const [defaultOpenMenuIds, setDefaultOpenMenuIds] = useState<number[]>([]); const [currentMenuCode, setCurrentMenuCode] = useState<number | null>(null); const prevPathRef = useRef(currentPath); + const { browser } = useDetectDevice(); const siteId = propSiteId ?? appSiteId; @@ -125,6 +128,16 @@ export function LNB({ } if (matchedMenuCode) setCurrentMenuCode(matchedMenuCode); + + // 접속 로그 저장 + saveConnectionLog({ + cntnId: userId, + cntnRgn: navigator.language, + wbsrKnd: browser, + menuCd: matchedMenuCode, + siteId, + urlPath: currentPath, + }); }, [menuList, currentPath]); function MenuItem({ From 8bb3253aa585a40f23e040fbe2c632a067f9bd73 Mon Sep 17 00:00:00 2001 From: bicochan <chanii8@naver.com> Date: Thu, 31 Jul 2025 12:45:27 +0900 Subject: [PATCH 08/36] =?UTF-8?q?[apps/cs]=20chore:=20=EC=A0=91=EC=86=8D?= =?UTF-8?q?=EC=9E=90=20=ED=86=B5=EA=B3=84=20=ED=85=8C=EC=9D=B4=EB=B8=94=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx b/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx index 9ddfdd124..b4c821551 100644 --- a/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx +++ b/apps/cs/src/pages/user-statistics/ui/user-statistics-page.tsx @@ -80,10 +80,12 @@ function UserStatisticsPage() { }); const query = useQuery({ - queryKey: [ENDPOINT.CMS_SERVICE.CONNECTION_LOG, searchParams], + queryKey: [ENDPOINT.CMS_SERVICE.CONNECTION_LOG, searchParams, pagination], queryFn: () => ConnectionLogApi.getConnectionLogPage({ ...searchParams, + page: pagination.pageIndex, + size: pagination.pageSize, }), placeholderData: keepPreviousData, }); From 7ee7a0fc69891b0e62589f9fb7fb0406f4c4ff0d Mon Sep 17 00:00:00 2001 From: JIeunhuh <entks301@naver.com> Date: Thu, 31 Jul 2025 14:38:14 +0900 Subject: [PATCH 09/36] =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=E3=85=8C?= =?UTF-8?q?=ED=8A=B8=20=EB=B6=84=EB=A6=AC=EC=A4=91=20..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/map/components/hasuFacility.tsx | 89 +++++ apps/wr/app/map/components/reuseFacility.tsx | 147 ++++++++ apps/wr/app/map/mainMap/page.tsx | 3 +- apps/wr/app/map/newWindowPopup.tsx | 356 +++---------------- apps/wr/app/map/util.ts | 58 +++ 5 files changed, 344 insertions(+), 309 deletions(-) create mode 100644 apps/wr/app/map/components/hasuFacility.tsx create mode 100644 apps/wr/app/map/components/reuseFacility.tsx create mode 100644 apps/wr/app/map/util.ts diff --git a/apps/wr/app/map/components/hasuFacility.tsx b/apps/wr/app/map/components/hasuFacility.tsx new file mode 100644 index 000000000..d93d4c30a --- /dev/null +++ b/apps/wr/app/map/components/hasuFacility.tsx @@ -0,0 +1,89 @@ +import { useWrStore } from "@/app/store"; +import type { pubHasuType } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; +import { tableData } from "@/components/lib/func/commom"; +import { Title, UiTable } from "@common/business_components/ui"; +import { useEffect, useState } from "react"; +interface Props { + seletectedLayerNm: string; + viewMode: 'list' | 'detail' | 'nothing'; + onFeatureSelect: (feature: any) => void; + onClose: () => void; + isRuseReg: { data: any | undefined }; +} +const HasuFacility = ({ seletectedLayerNm, viewMode, onClose, onFeatureSelect, isRuseReg }: Props) => { + const { + code, + pbnst, + pubHasuInit, + } = useWrStore((state) => state); + const { pubFacHeadList, pbnstHasuRes, pbnstHasuResCount } = pbnst; + const [hasuTable, setHasuTable] = useState<pubHasuType[]>(); + const [hasuPage, setHasuPage] = useState<number>(1); + useEffect(() => { + if (code.sggCd.length && pbnstHasuRes.length > 0) { + setHasuTable(tableData(pbnstHasuRes, { code })); + } + }, [code, pbnstHasuRes]); + useEffect(() => { + if (seletectedLayerNm !== '하수처리시설') return; + if (!pbnst.isInit) { + pubHasuInit("1", "0"); + } + }, [pbnst.isInit, pubHasuInit]); + useEffect(() => { + if (seletectedLayerNm !== '하수처리시설') return; + pubHasuInit(String(hasuPage), "0"); + }, [hasuPage, pubHasuInit]); + + const hasuCellClick = (index: number | undefined) => { + if (index !== undefined && pbnstHasuRes !== undefined) { + onFeatureSelect(pbnstHasuRes[index]); + onClose(); + } + }; + return (viewMode == 'list' ? ( + <div style={{ overflowY: 'auto' }}> + <div className="flex justify-between items-center mb-4"> + <Title title="하수처리시설 현황" /> + </div> + {/* 높이 조정 */} + <UiTable + tableData={hasuTable || []} + headlist={pubFacHeadList} + pageSize={11} + total={pbnstHasuResCount || 0} + headName={""} + cellClick={hasuCellClick} + onPageChange={setHasuPage} + /> + </div> + ) : + ( + <div style={{ overflowX: 'hidden' }}> + <div className="flex justify-between items-center mb-4"> + <Title title="하수처리시설 상세정보" /> + </div> + {/* 높이 조정 */} + <UiTable + tableData={isRuseReg?.data || []} + headlist={pubFacHeadList.slice(0, 4)} + pageSize={1} + total={0} + headName={"위치정보"} + cellClick={() => { }} + onPageChange={() => { }} + /> + <UiTable + tableData={isRuseReg?.data || []} + headlist={pubFacHeadList.slice(4)} + pageSize={1} + total={0} + headName={"기본정보"} + cellClick={() => { }} + onPageChange={() => { }} + /> + </div> + ) + ) +} +export default HasuFacility; \ No newline at end of file diff --git a/apps/wr/app/map/components/reuseFacility.tsx b/apps/wr/app/map/components/reuseFacility.tsx new file mode 100644 index 000000000..dd18a657e --- /dev/null +++ b/apps/wr/app/map/components/reuseFacility.tsx @@ -0,0 +1,147 @@ +import { useWrStore } from "@/app/store"; +import type { customPbnst } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; +import type { WaterReuseFacility } from "@/app/store/ruseFcltMng/fcltSttn/pbnstSttn/type"; +import { PbnstSttnModal } from "@/components/ui/modal/sttn/pbnstSttnModal/pbnstSttnModal"; +import { Title, UITab, UiTable } from "@common/business_components/ui"; +import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; +import { useState, useEffect, useCallback } from "react"; +interface Props { + seletectedLayerNm: string; + viewMode: 'list' | 'detail' | 'nothing'; + setFcltPk: (pk: string) => void; + onFeatureSelect: (feature: any) => void; + onClose: () => void; + actTabData: { id: string; name: string; data: any } | undefined; + tabData: { id: string; name: string; data: any }[]; +} +const ResueFacility = ({ viewMode, seletectedLayerNm, tabData, actTabData, setFcltPk, onFeatureSelect, onClose}: Props) => { + const [activeTab, setActiveTab] = useState<string>(''); // 현재 활성화된 탭 + // 하수재이용시설 변수 + const { + pbnstSttn, + pbnstSttnSearch, + pbnSttnInit, + getFlcts + } = useWrStore((state) => state); + const { fclts, pbnstSttnResCount } = pbnstSttn + const [bdstTable, setBdstTable] = useState<WaterReuseFacility[]>() + // 재이용시설 cellClick 이벤트 (상세정보) + const pbnstCellClick = (index: number | undefined) => { + if ( + index !== undefined && + pbnstSttn.pbnstSttnRes && + pbnstSttn.pbnstSttnRes[index] + ) { + setFcltPk(pbnstSttn.pbnstSttnRes[index].pbnstRuseFcltId); + onFeatureSelect(pbnstSttn.pbnstSttnRes[index]); + onClose() + } + }; + + // 재이용 현황 초기값 + useEffect(() => { + console.log('재이용시설 초기값 호출', viewMode) + if (seletectedLayerNm !== '하수재이용시설') return; + if (!pbnstSttn.isInit) { + getFlcts() + } + }, [seletectedLayerNm, pbnstSttn.isInit]); + useEffect(() => { + if (seletectedLayerNm !== '하수재이용시설') return; + pbnSttnInit("1", "20", { + partValue: "A", + sidoValue: '0', + sigunValue: "0", + regionValue: "", + unitWaterShedValue: "", + middleRegionValue: "", + envPartValue: "", + sidoText: "", + sigunText: "" + }, String(new Date().getFullYear()), pbnstSttn.fclts); + }, [fclts, pbnSttnInit, pbnstSttn.fclts, seletectedLayerNm]) + useEffect(() => { + setBdstTable(pbnstSttn.pbnstSttnRes); + }, [seletectedLayerNm, pbnstSttn.pbnstSttnRes]); + + // 재이용시설 조회 + // 재이용시설 페이징처리 관련 함수 + const onPageChangeHandler = useCallback((page: number) => { + if (seletectedLayerNm !== '하수재이용시설') return; + pbnstSttnSearch( + false, + String(page), + String(20), + { + partValue: "A", + sidoValue: "0", + sigunValue: "0", + regionValue: "", + unitWaterShedValue: "", + middleRegionValue: "", + envPartValue: "", + sidoText: "", + sigunText: "", + }, + "", + String(new Date().getFullYear()), fclts + ); + }, [fclts, pbnstSttnSearch]); + // FIXME: 윤선화차장님 요구사항으로 엑셀 다운로드 삭제. + // const excelClick = useCallback(() => { + // // if (codeData) pbnstSttnSearch(1, "10000", codeData); + // excelDownload( + // [[]], + // "하수재이용시설 현황", + // "sample_pbnstSttn.xlsx", + // "A1:U2" + // ); + // }, [pbnstSttnSearch]); + return ( + viewMode == 'detail' ? + // 재이용시설 상세 + <> + <div className="flex justify-between items-center mb-4"> + <Title title="하수재이용시설 상세정보" /> + </div> + <div className="flex justify-between items-center mb-8"> + <UITab + defaultValue={activeTab} + tabList={tabData.map((tab) => ({ + value: tab.id, + label: tab.name, + onClick: () => setActiveTab(tab.id), + }))} + /> + </div> + <PbnstSttnModal + data={actTabData?.data[0] || ({} as customPbnst)} + titleVisible={false} + /> + </> : + <div style={{ overflowY: 'auto' }}> + <div className="flex justify-between items-center"> + <Title title="하수재이용시설 현황" /> + {/* <div className="flex gap-2 mt-8"> + <Button className={btnClass} color="primary" onClick={excelClick}> + 엑셀다운로드 + </Button> + </div> */} + </div> + <UiTable + headName={[]} + tableData={bdstTable || []} + headlist={pbnstSttn.pbnstSttHeadList} + pageSize={20} + total={pbnstSttnResCount || 0} + cellClick={(index: number | undefined) => { + pbnstCellClick(index); + }} + onPageChange={onPageChangeHandler} + > + <HeadMakeColSpan upHeadList={pbnstSttn.pbnstSttNodeList} /> + </UiTable> + </div> + ) +} +export default ResueFacility; \ No newline at end of file diff --git a/apps/wr/app/map/mainMap/page.tsx b/apps/wr/app/map/mainMap/page.tsx index c9d58c422..56c9e823d 100644 --- a/apps/wr/app/map/mainMap/page.tsx +++ b/apps/wr/app/map/mainMap/page.tsx @@ -135,13 +135,14 @@ const Map = () => { const renderDetailView = useCallback( (props: any) => ( <NewWindowPopup + key={featureData?.fid || featureData?.id || featureData?.ftrIdn} onClose={handlePopupClose} checkedLayers={checkedLayers} checkedLayersData={checkedLayersData} {...props} /> ), - [handlePopupClose, checkedLayers, checkedLayersData] // 필요 시 의존성 넣기 + [checkedLayers, checkedLayersData] // 필요 시 의존성 넣기 ); return ( <div className="bg-container"> diff --git a/apps/wr/app/map/newWindowPopup.tsx b/apps/wr/app/map/newWindowPopup.tsx index ea13d85de..d8e6b6338 100644 --- a/apps/wr/app/map/newWindowPopup.tsx +++ b/apps/wr/app/map/newWindowPopup.tsx @@ -2,20 +2,20 @@ import NewWindowPortal from '@/app/map/newWindowPortal'; import { useWrStore } from "@/app/store"; import type { customHtdflBdst } from "@/app/store/ruseFcltMng/fcltReg/htdflReg"; -import type { customPbnst, pubHasuType } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; +import type { pubHasuType } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; import type { customRainBdst } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import type { customRswtBdst } from "@/app/store/ruseFcltMng/fcltReg/rswtReg"; -import type { WaterReuseFacility } from "@/app/store/ruseFcltMng/fcltSttn/pbnstSttn/type"; -import { fetchType, getFetch, postFectch } from "@/components/lib/api"; import { formatPhoneNumber, tableData } from "@/components/lib/func/commom"; -import { PbnstSttnModal } from "@/components/ui/modal/sttn/pbnstSttnModal/pbnstSttnModal"; import SttnDetailModal from "@/components/ui/modal/sttn/sttnDetailModal/sttnDetailModal"; -import { Title, UITab, UiTable } from '@common/business_components'; +import { Title, UiTable } from '@common/business_components'; import { useGisContext } from "@common/business_components/ui/map/Gis"; import type { DemandCompType } from '@common/business_components/ui/sdmInsertForm/form'; import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; import moment from 'moment'; import React, { useCallback, useEffect, useRef, useState } from 'react'; +import ResueFacility from './components/reuseFacility'; +import { detainSttn, fetchHasuDetail, fetchpbnstDetail } from './util'; +import HasuFacility from './components/hasuFacility'; interface NewWindowPopupProps { featureData: any; @@ -44,15 +44,7 @@ const NewWindowPopup: React.FC<NewWindowPopupProps> = ({ }, [onClose]); // 하수재이용시설 변수 - const { - code, - pbnstSttn, - pbnstSttnSearch, - pbnSttnInit, - getFlcts - } = useWrStore((state) => state); - const { fclts, pbnstSttnResCount } = pbnstSttn - const [bdstTable, setBdstTable] = useState<WaterReuseFacility[]>() + const {code} = useWrStore((state) => state); // 빗물재이용시설 변수 const { rainSttn, rainSttnSearch, rainSttnInit } = useWrStore( @@ -82,18 +74,11 @@ const NewWindowPopup: React.FC<NewWindowPopupProps> = ({ const [htdflPage, setHtdflPage] = useState(1) const [htdflList, setHtdflList] = useState<customHtdflBdst[]>(htdflSttnRes || []); - //하수처리시설 변수 - const { - pbnst, - pubHasuInit, - } = useWrStore((state) => state); - const { pubFacHeadList, pbnstHasuRes, pbnstHasuResCount } = pbnst; - const [hasuList, setHasuList] = useState<pubHasuType[]>(pbnstHasuRes || []); + // 하수처리시설 변수 + const [hasuList, setHasuList] = useState<pubHasuType[]>([]); const [isRuseReg, setIsRuseReg] = useState<{ data: any | undefined; }>({ data: undefined }); - const [hasuTable, setHasuTable] = useState<pubHasuType[]>(); - const [hasuPage, setHasuPage] = useState<number>(1); // 수요처관리 변수 const { @@ -111,7 +96,7 @@ const NewWindowPopup: React.FC<NewWindowPopupProps> = ({ const [mngList, setMngList] = useState<DemandCompType[]>(coSttnRes || []); ///////////////////////////////////////////// 피쳐데이터 선택 시 각 시설별 데이터 처리 /////////////////////////////////////////////// const getSelectedLayers = () => { - console.trace('호출확인',1) + console.trace('호출확인', 1) let result = null; const layers = gisMap ? gisMap.getLayers().getArray().filter((l: any) => l.getVisible()) : []; // gisMap이 null인지 확인 후 레이어 가져오기 let featureLayer: { get: (key: string) => any } = { get: () => null }; @@ -125,50 +110,6 @@ const NewWindowPopup: React.FC<NewWindowPopupProps> = ({ result = featureLayer.get('lyrNm'); return result; }; - const fetchpbnstDetail = async (featureCd: string) => { - try { - const response = await getFetch("wr", `/reuseFc/pubFc/${featureCd}`); - // 중복 데이터 추가 방지 - setTabDataFunc(response, featureCd); - } catch (error) { - console.error("Error fetching data:", error); - } - }; - const fetchHasuDetail = async (featureCd: string, data: string) => { - try { - const rainRes = await postFectch(`/prcsFclt/ruseInfo/1/20/A/0/0/1/SW/${featureCd}`, [data], fetchType.COMMON) - setHasuList( - rainRes.data.map((item: any) => { - return { - ...item, - fctCpc: Number(item.fctCpc) || 0, - ruse: item.ruse === false ? "N" : "Y", - }; - }) - ) - } catch (error) { - console.error("Error fetching data:", error); - } - }; - const detainSttn = async (featureCd: string, layerNm: string) => { - if (layerNm == '빗물이용시설') { //빗물이용시설 - const res = await getFetch(fetchType.WR, `/reuseFc/rainyInfoList/1/20/0/${featureCd}`) - setRainList(res) - } - else if (layerNm == '중수도시설') { //중수도 시설 - const res = await getFetch(fetchType.WR, `/reuseFc/waterreuseFc/1/20/0/${featureCd}`) - setRswtrList(res) - } - else if (layerNm == '수요처') { //수요처 - const res = await getFetch(fetchType.WR, `/reuseFc/request/1/20/0/${featureCd}`) - setMngList(res) - } - else { - const res = await getFetch(fetchType.WR, `/drain/facilityList/1/20/0/${featureCd}`) - setHtdflList(res) - setHtdflDetailModal({ isOpen: true, data: htdflSttnRes[0] }); - } - } // 상세 목록 데이터 상태 처리 useEffect(() => { if (hasuList.length > 0) setIsRuseReg({ data: [hasuList[0]] }); @@ -186,12 +127,11 @@ const NewWindowPopup: React.FC<NewWindowPopupProps> = ({ if (mngList.length > 0) setIsDmdModal({ isMoal: true, data: [mngList[0]] }); }, [mngList]) const lastCalledIdRef = useRef<string | null>(null); - const [layerId, setLayerId] = useState<string|null>(); -useEffect(() => { - const layers = getSelectedLayers(); - setLayerId(layers); -}, []); // 최초 렌더링 시 호출 - + const [layerId, setLayerId] = useState<string | null>(); + useEffect(() => { + const layers = getSelectedLayers(); + setLayerId(layers); + }, []); // 최초 렌더링 시 호출 useEffect(() => { if (!featureData || typeof featureData.getProperties !== "function" || featureData.getProperties() == '') return; const selectedProps = featureData.getProperties(); @@ -205,106 +145,28 @@ useEffect(() => { if (!layerId || typeof layerId !== 'string') return; const featureCd = layerId === '하수재이용시설' ? selectedProps?.swtrmt_fclt_cd : - ['빗물이용시설', '중수도시설', '온배수시설', '수요처'].includes(layerId) ? selectedProps?.bdst_nm : - layerId === '하수처리시설' ? selectedProps?.swtrmt_fclt_nm : - null; + ['빗물이용시설', '중수도시설', '온배수시설', '수요처'].includes(layerId) ? selectedProps?.bdst_nm : + layerId === '하수처리시설' ? selectedProps?.swtrmt_fclt_nm : + null; if (!featureCd || featureCd === fcltPk) return; - if (layerId === '하수재이용시설') { - fetchpbnstDetail(featureCd); - } else if (layerId === '하수처리시설') { - fetchHasuDetail(featureCd, selectedProps?.swtrmt_fclt_cd); - } else { - detainSttn(featureCd, layerId); - } setFcltPk(featureCd); - setViewMode("detail"); setActiveTab(featureCd); + setViewMode("detail"); + if (layerId === '하수재이용시설') { + fetchpbnstDetail(featureCd, setTabData); + } else if (layerId === '하수처리시설') { + fetchHasuDetail(featureCd, selectedProps?.swtrmt_fclt_cd).then((data) => { setHasuList(data) }) + } else { + detainSttn(featureCd, layerId).then((res) => { + if (layerId === '빗물이용시설') setRainList(res); + else if (layerId === '중수도시설') setRswtrList(res); + else if (layerId === '온배수시설'){ setHtdflList(res); setHtdflDetailModal({ isOpen: true, data: htdflSttnRes[0] });} + else if (layerId === '수요처') setMngList(res); + }); + } }, [featureData]); ///////////////////////////////////////////// 피쳐데이터 선택 시 각 시설별 데이터 처리 /////////////////////////////////////////////// - ///////////////////////////////////////////// 하수재이용시설 ////////////////////////////////////////////////// - // 재이용시설 cellClick 이벤트 (상세정보) - const pbnstCellClick = (index: number | undefined) => { - if ( - index !== undefined && - pbnstSttn.pbnstSttnRes && - pbnstSttn.pbnstSttnRes[index] - ) { - setFcltPk(pbnstSttn.pbnstSttnRes[index].pbnstRuseFcltId); - onFeatureSelect(pbnstSttn.pbnstSttnRes[index]); - onClose() - } - }; - - // 재이용 현황 초기값 - useEffect(() => { - if (!pbnstSttn.isInit && seletectedLayerNm === '하수재이용시설') { - getFlcts() - } - }, [seletectedLayerNm, pbnstSttn.isInit, getFlcts]); - useEffect(() => { - if(seletectedLayerNm !== '하수재이용시설') return; - console.trace('check', 1) - pbnSttnInit("1", "20", { - partValue: "A", - sidoValue: '0', - sigunValue: "0", - regionValue: "", - unitWaterShedValue: "", - middleRegionValue: "", - envPartValue: "", - sidoText: "", - sigunText: "" - }, String(new Date().getFullYear()), pbnstSttn.fclts); - }, [fclts, pbnSttnInit, pbnstSttn.fclts, seletectedLayerNm]) - useEffect(() => { - setBdstTable(pbnstSttn.pbnstSttnRes); - }, [seletectedLayerNm, pbnstSttn.pbnstSttnRes]); - - // 재이용시설 상세정보 - const setTabDataFunc = (res: any, pk: string) => { - setTabData((prev) => { - if (prev.some((tab) => tab.id === pk)) { - return prev; // 이미 존재하는 탭이면 추가하지 않음 - } - return [...prev, { id: pk, name: `재이용시설 ${prev.length + 1}`, data: res }]; - }); - } - // 재이용시설 조회 - // 재이용시설 페이징처리 관련 함수 - const onPageChangeHandler = useCallback((page: number) => { - if(seletectedLayerNm!== '하수재이용시설') return; - pbnstSttnSearch( - false, - String(page), - String(20), - { - partValue: "A", - sidoValue: "0", - sigunValue: "0", - regionValue: "", - unitWaterShedValue: "", - middleRegionValue: "", - envPartValue: "", - sidoText: "", - sigunText: "", - }, - "", - String(new Date().getFullYear()), fclts - ); - }, [fclts, pbnstSttnSearch]); - // FIXME: 윤선화차장님 요구사항으로 엑셀 다운로드 삭제. - // const excelClick = useCallback(() => { - // // if (codeData) pbnstSttnSearch(1, "10000", codeData); - // excelDownload( - // [[]], - // "하수재이용시설 현황", - // "sample_pbnstSttn.xlsx", - // "A1:U2" - // ); - // }, [pbnstSttnSearch]); - ///////////////////////////////////////////// 하수재이용시설 ////////////////////////////////////////////////// - ///////////////////////////////////////////// 빗물 재이용 ////////////////////////////////////////////////// // 빗물재이용시설 cellClick 이벤트 (상세정보) const rainCellClick = (index: number | undefined, headId: string) => { @@ -321,7 +183,7 @@ useEffect(() => { useEffect(() => { - if(seletectedLayerNm !== '빗물이용시설') return; + if (seletectedLayerNm !== '빗물이용시설') return; if (!rainSttn.isInit) { rainSttnInit(false, 1, "20", "0", '', code.cityCd, code.sggCd); } @@ -359,7 +221,7 @@ useEffect(() => { }, [code, rainSttnRes, rainSttn.rainSttHeadList]); useEffect(() => { - if(seletectedLayerNm !== '빗물이용시설') return; + if (seletectedLayerNm !== '빗물이용시설') return; rainSttnSearch(false, rainPage, "20", '', '', code.cityCd, code.sggCd); }, [code.cityCd, code.sggCd, rainPage, rainSttnSearch]); ///////////////////////////////////////////// 빗물 재이용 ////////////////////////////////////////////////// @@ -375,14 +237,14 @@ useEffect(() => { } } useEffect(() => { - if(seletectedLayerNm !== '중수도시설') return; + if (seletectedLayerNm !== '중수도시설') return; if (!rswtSttn.isInit) { rswtSttnInit(false, 1, "20", "0", '', code.cityCd, code.sggCd); } }, [code.cityCd, code.sggCd, rswtSttn.isInit, rswtSttnInit]); useEffect(() => { - if(seletectedLayerNm !== '중수도시설') return; + if (seletectedLayerNm !== '중수도시설') return; const data = tableData(rswtSttnRes, { code }); const chData = data .map((item: customRswtBdst) => { @@ -416,7 +278,7 @@ useEffect(() => { // }, [rswtSttn.excelList]) useEffect(() => { - if(seletectedLayerNm !== '중수도시설') return; + if (seletectedLayerNm !== '중수도시설') return; rswtSttnSearch(false, rswtrPage, "20", '', '', code.cityCd, code.sggCd); }, [code.cityCd, code.sggCd, rswtSttnSearch, rswtrPage]); ///////////////////////////////////////////// 중수도 시설 ////////////////////////////////////////////////// @@ -430,14 +292,14 @@ useEffect(() => { } }; useEffect(() => { - if(seletectedLayerNm !== '온배수시설') return; + if (seletectedLayerNm !== '온배수시설') return; if (!htdflSttn.isInit) { initHtdfl(false, 1, "20", "0", '', code.cityCd, code.sggCd); } }, [code.cityCd, code.sggCd, htdflSttn.isInit, initHtdfl]); useEffect(() => { - if(seletectedLayerNm !== '온배수시설') return; + if (seletectedLayerNm !== '온배수시설') return; const data = tableData(htdflSttnRes, { code }); const chData = data .map((item: any) => ({ @@ -451,38 +313,14 @@ useEffect(() => { }, [code, htdflSttnRes, htdflSttn.htdflSttHeadList]); useEffect(() => { - if(seletectedLayerNm !== '온배수시설') return; + if (seletectedLayerNm !== '온배수시설') return; htdflSttnSearch(true, htdflPage, "20", '', '', code.cityCd, code.sggCd); }, [code.cityCd, code.sggCd, htdflPage, htdflSttnSearch]); ///////////////////////////////////////////// 온배수 시설 ////////////////////////////////////////////////// - ///////////////////////////////////////////// 하수처리 시설 ////////////////////////////////////////////////// - useEffect(() => { - if (code.sggCd.length && pbnstHasuRes.length > 0) { - setHasuTable(tableData(pbnstHasuRes, { code })); - } - }, [code, pbnstHasuRes]); - useEffect(() => { - if(seletectedLayerNm !== '하수처리시설') return; - if (!pbnst.isInit) { - pubHasuInit("1", "0"); - } - }, [pbnst.isInit, pubHasuInit]); - useEffect(() => { - pubHasuInit(String(hasuPage), "0"); - }, [hasuPage, pubHasuInit]); - - const hasuCellClick = (index: number | undefined) => { - if (index !== undefined && pbnstHasuRes !== undefined) { - onFeatureSelect(pbnstHasuRes[index]); - onClose(); - } - }; - ///////////////////////////////////////////// 하수처리 시설 ////////////////////////////////////////////////// - ///////////////////////////////////////////// 수요처 관리 ////////////////////////////////////////////////// useEffect(() => { - if(seletectedLayerNm !== '수요처') return; + if (seletectedLayerNm !== '수요처') return; if (!coSttn.isInit) { coSttnInit("1", "20", "0"); } @@ -494,7 +332,7 @@ useEffect(() => { } }; useEffect(() => { - if(seletectedLayerNm !== '수요처') return; + if (seletectedLayerNm !== '수요처') return; if (coSttnRes) { if (coSttnRes?.length > 0 && code.cityCd.length > 0) { const data = tableData(coSttnRes, { code }); @@ -510,7 +348,7 @@ useEffect(() => { } }, [coSttnRes, code]); useEffect(() => { - if(seletectedLayerNm !== '수요처') return; + if (seletectedLayerNm !== '수요처') return; coSttnSearch(String(mngPage), "20", String(0)); }, [coSttnSearch, mngPage]); ///////////////////////////////////////////// 수요처 관리 ////////////////////////////////////////////////// @@ -521,10 +359,6 @@ useEffect(() => { if (layerId === null || layerId === undefined) { setLayerId(seletectedLayerNm || ''); } - //하수처리시설 - const isPrcsFclt = layerId == '하수처리시설' - // 재이용시설 - const isPbnst = layerId == '하수재이용시설'; // 빗물이용시설 const isRain = layerId == '빗물이용시설'; // 중수도시설 @@ -533,108 +367,14 @@ useEffect(() => { const isHtdfl = layerId == '온배수시설'; // 수요처관리 const isReuseMng = layerId == '수요처'; - if (isPrcsFclt) { - if (viewMode == 'list') { - return ( - <div style={{ overflowY: 'auto' }}> - <div className="flex justify-between items-center mb-4"> - <Title title="하수처리시설 현황" /> - </div> - {/* 높이 조정 */} - <UiTable - tableData={hasuTable || []} - headlist={pubFacHeadList} - pageSize={11} - total={pbnstHasuResCount || 0} - headName={""} - cellClick={hasuCellClick} - onPageChange={setHasuPage} - /> - </div> - ) - } else { - return ( - <div style={{ overflowX: 'hidden' }}> - <div className="flex justify-between items-center mb-4"> - <Title title="하수처리시설 상세정보" /> - </div> - {/* 높이 조정 */} - <UiTable - tableData={isRuseReg?.data || []} - headlist={pubFacHeadList.slice(0, 4)} - pageSize={1} - total={0} - headName={"위치정보"} - cellClick={() => { }} - onPageChange={() => { }} - /> - <UiTable - tableData={isRuseReg?.data || []} - headlist={pubFacHeadList.slice(4)} - pageSize={1} - total={0} - headName={"기본정보"} - cellClick={() => { }} - onPageChange={() => { }} - /> - </div> - ) - } + switch (layerId) { + case '하수재이용시설': + return (<ResueFacility viewMode={viewMode} seletectedLayerNm={layerId} tabData={tabData} actTabData={actTabData} setFcltPk={setFcltPk} onFeatureSelect={onFeatureSelect} onClose={onClose} />) + case '하수처리시설': + return(<HasuFacility seletectedLayerNm={layerId} viewMode={viewMode} onFeatureSelect={onFeatureSelect} onClose={onClose} isRuseReg={isRuseReg}/>) + default: + break; } - if (isPbnst) { - if (viewMode == 'detail') { - // 재이용시설 상세 - return ( - <> - <div className="flex justify-between items-center mb-4"> - <Title title="하수재이용시설 상세정보" /> - </div> - <div className="flex justify-between items-center mb-8"> - <UITab - defaultValue={activeTab} - tabList={tabData.map((tab) => ({ - value: tab.id, - label: tab.name, - onClick: () => setActiveTab(tab.id), - }))} - /> - </div> - <PbnstSttnModal - data={actTabData?.data[0] || ({} as customPbnst)} - titleVisible={false} - /> - </> - ); - } else { - // 재이용시설 목록 - return ( - <div style={{ overflowY: 'auto' }}> - <div className="flex justify-between items-center"> - <Title title="하수재이용시설 현황" /> - {/* <div className="flex gap-2 mt-8"> - <Button className={btnClass} color="primary" onClick={excelClick}> - 엑셀다운로드 - </Button> - </div> */} - </div> - <UiTable - headName={[]} - tableData={bdstTable || []} - headlist={pbnstSttn.pbnstSttHeadList} - pageSize={20} - total={pbnstSttnResCount || 0} - cellClick={(index: number | undefined) => { - pbnstCellClick(index); - }} - onPageChange={onPageChangeHandler} - > - <HeadMakeColSpan upHeadList={pbnstSttn.pbnstSttNodeList} /> - </UiTable> - </div> - ); - } - } - if (isRain) { if (viewMode == 'detail') { // 빗물이용시설 상세 diff --git a/apps/wr/app/map/util.ts b/apps/wr/app/map/util.ts new file mode 100644 index 000000000..e3428b300 --- /dev/null +++ b/apps/wr/app/map/util.ts @@ -0,0 +1,58 @@ +import { getFetch, postFectch, fetchType } from "@/components/lib/api"; + +const fetchpbnstDetail = async (featureCd: string, setTabData: any) => { + try { + const response = await getFetch("wr", `/reuseFc/pubFc/${featureCd}`); + // 중복 데이터 추가 방지 + setTabDataFunc(response, featureCd, setTabData); + } catch (error) { + console.error("Error fetching data:", error); + } +}; +const fetchHasuDetail = async (featureCd: string, data: string) => { + try { + const rainRes = await postFectch(`/prcsFclt/ruseInfo/1/20/A/0/0/1/SW/${featureCd}`, [data], fetchType.COMMON) + // setHasuList + const filteredData = rainRes.data.map((item: any) => { + return { + ...item, + fctCpc: Number(item.fctCpc) || 0, + ruse: item.ruse === false ? "N" : "Y", + }; + }) + return filteredData + } catch (error) { + console.error("Error fetching data:", error); + } +}; +// 재이용시설 상세정보 +const setTabDataFunc = (res: any, pk: string, setTabData: any) => { + setTabData((prev) => { + if (prev.some((tab) => tab.id === pk)) { + return prev; // 이미 존재하는 탭이면 추가하지 않음 + } + return [...prev, { id: pk, name: `재이용시설 ${prev.length + 1}`, data: res }]; + }); +} + +const detainSttn = async (featureCd: string, layerNm: string) => { + if (layerNm == '빗물이용시설') { //빗물이용시설 + const res = await getFetch(fetchType.WR, `/reuseFc/rainyInfoList/1/20/0/${featureCd}`) + return res + } + else if (layerNm == '중수도시설') { //중수도 시설 + const res = await getFetch(fetchType.WR, `/reuseFc/waterreuseFc/1/20/0/${featureCd}`) + return res + } + else if (layerNm == '수요처') { //수요처 + const res = await getFetch(fetchType.WR, `/reuseFc/request/1/20/0/${featureCd}`) + return res + } + else { + const res = await getFetch(fetchType.WR, `/drain/facilityList/1/20/0/${featureCd}`) + return res + // setHtdflDetailModal({ isOpen: true, data: htdflSttnRes[0] }); + } +} + +export { fetchHasuDetail, fetchpbnstDetail, detainSttn }; \ No newline at end of file From 33ad044ed34fe78bfe832c09c1128385a3fc285e Mon Sep 17 00:00:00 2001 From: jyha00 <jyha@mind-one.co.kr> Date: Thu, 31 Jul 2025 15:01:36 +0900 Subject: [PATCH 10/36] =?UTF-8?q?=EB=8C=80=EB=AF=BC=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/(base-layout)/pages/wrAbout/page.tsx | 4 ++-- apps/dm/app/layout.tsx | 3 +++ apps/dm/public/img/wrAbout/img_02_1.png | Bin 72043 -> 35450 bytes 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/dm/app/(base-layout)/pages/wrAbout/page.tsx b/apps/dm/app/(base-layout)/pages/wrAbout/page.tsx index 04dfa58df..da3324ffc 100644 --- a/apps/dm/app/(base-layout)/pages/wrAbout/page.tsx +++ b/apps/dm/app/(base-layout)/pages/wrAbout/page.tsx @@ -131,7 +131,7 @@ export default function WrAboutPage() { 물재이용 필요성 </h2> <section aria-labelledby="card2-desc" className="bg-white border border-gray-300 rounded-xl p-[60px] pt-[70px] pb-[70px] "> - <h1 id="card2-desc" className="font-NotoSansKR text-[#ED5534] text-5xl font-semibold mb-8">물 재이용, 왜 필요한가요?</h1> + <h1 id="card2-desc" className="font-NotoSansKR text-[#D63F1F] text-5xl font-semibold mb-8">물 재이용, 왜 필요한가요?</h1> <p className="font-NotoSansKR text-2xl font-normal mb-10 leading-relaxed"> 빗물, 중수, 하수처리수는 지속적으로 이용 가능한 순환자원입니다.<br /> 물 재이용을 통한 효율적인 수자원 활용은 물 스트레스국가인 우리나라에서<br />가뭄대응능력 향상 및 하천수질보전을 위해 반드시 필요한 일입니다. @@ -237,7 +237,7 @@ export default function WrAboutPage() { 하수 재이용 </h2> <section aria-labelledby="card5-desc" className="bg-white border border-gray-300 rounded-xl p-[60px] pt-[70px] pb-[70px] "> - <h1 id="card5-desc" className="font-NotoSansKR leading-snug text-[#0099A4] text-5xl font-bold mb-6">아직 할 일이 많은 하수처리수,<br />풍족하게 재이용할 수 있어요!</h1> + <h1 id="card5-desc" className="font-NotoSansKR leading-snug text-[#00818A] text-5xl font-bold mb-6">아직 할 일이 많은 하수처리수,<br />풍족하게 재이용할 수 있어요!</h1> <p className="font-NotoSansKR text-2xl mb-10 leading-relaxed">사용하고 버려져 공공하수처리장으로 모여든 물은<br />용도에 맞는 처리 후 재이용 할 수 있습니다.</p> <Image src="/img/wrAbout/img_05_1.png" diff --git a/apps/dm/app/layout.tsx b/apps/dm/app/layout.tsx index af4dcaf1d..152a069f2 100644 --- a/apps/dm/app/layout.tsx +++ b/apps/dm/app/layout.tsx @@ -8,6 +8,9 @@ export default function RootLayout({ }>) { return ( <html lang="ko"> + <head> + <title>물재이용 대민 + {children} diff --git a/apps/dm/public/img/wrAbout/img_02_1.png b/apps/dm/public/img/wrAbout/img_02_1.png index 3d61c6e5db7ef6ef3945d06b9f009328a66d057d..aa1c8ee5ad583defcd4465034474b9cfb4d8760a 100644 GIT binary patch literal 35450 zcmbSygYKp#Y=7xJaMEggHR!;(sv)PsyHI7w0Zu-VZlL^z>%h;>M%4r-vn3l zhX#84kS6id#q>#k3~g3JJ#h9>{ZR4_LWKfB!DR*PiTy2@v_&U?LzRJ`eC%-Ras9dN zCH~(vsQZh}0>PI8Jm_I{0HynEs+cS3$@SOrU%Ys4dj~2q&03)&Xx_S*)I~RYcjE1@ z=;IH^4OI61REbL*t%cFFLSo0aJr2YBMFk!rh`Il&UCne?1+(1t>ezRpI&pwk{C1|M z04}0KfM<6M+n4~3o#`v>f-YqkrRZbxnswsYJxK}@7Lw{5U*18;qGrA2)*~Sf=C+^q z%i)&aCQ~B4Bi-}+{F0Ywt58wP*t%OJB=8>$~o+0RfprNXZ!xook z6M00-@BLPNv-d9-NPqvG3>j_z+_Mu?M?A&~{3a$>biL1yj1V+L`jRaSKa$dS&Fw37 zF-2@!j~(Uy*AgHPiy~51vX&A;DtzF#ns|Cj@bx zryG+7`z<|dfeJ7=T$O3_U1TR?DlgT

^=pr-o{^Z*Xs##f6V^IQ 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 Date: Thu, 31 Jul 2025 17:00:08 +0900 Subject: [PATCH 11/36] =?UTF-8?q?=ED=8C=9D=EC=97=85=EB=B3=84=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20?= =?UTF-8?q?=EC=8B=9C=EC=84=A4=20=EC=84=A0=ED=83=9D=EC=8B=9C=20=ED=95=B4?= =?UTF-8?q?=EB=8B=B9=20api=EB=A7=8C=20=ED=98=B8=EC=B6=9C=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => layerPopup}/hasuFacility.tsx | 4 +- .../components/layerPopup/htdflFacility.tsx | 83 +++ .../components/layerPopup/rainFacility.tsx | 105 ++++ .../{ => layerPopup}/reuseFacility.tsx | 7 +- .../layerPopup/reuseMngFacility.tsx | 103 ++++ .../components/layerPopup/rswtFacility.tsx | 107 ++++ apps/wr/app/map/components/newWindowPopup.tsx | 186 ++++++ .../map/{ => components}/newWindowPortal.tsx | 0 apps/wr/app/map/mainMap/page.tsx | 17 +- apps/wr/app/map/newWindowPopup.tsx | 552 ------------------ apps/wr/app/map/popup/page.tsx | 2 +- 11 files changed, 597 insertions(+), 569 deletions(-) rename apps/wr/app/map/components/{ => layerPopup}/hasuFacility.tsx (94%) create mode 100644 apps/wr/app/map/components/layerPopup/htdflFacility.tsx create mode 100644 apps/wr/app/map/components/layerPopup/rainFacility.tsx rename apps/wr/app/map/components/{ => layerPopup}/reuseFacility.tsx (95%) create mode 100644 apps/wr/app/map/components/layerPopup/reuseMngFacility.tsx create mode 100644 apps/wr/app/map/components/layerPopup/rswtFacility.tsx create mode 100644 apps/wr/app/map/components/newWindowPopup.tsx rename apps/wr/app/map/{ => components}/newWindowPortal.tsx (100%) delete mode 100644 apps/wr/app/map/newWindowPopup.tsx diff --git a/apps/wr/app/map/components/hasuFacility.tsx b/apps/wr/app/map/components/layerPopup/hasuFacility.tsx similarity index 94% rename from apps/wr/app/map/components/hasuFacility.tsx rename to apps/wr/app/map/components/layerPopup/hasuFacility.tsx index d93d4c30a..5a10ce3ed 100644 --- a/apps/wr/app/map/components/hasuFacility.tsx +++ b/apps/wr/app/map/components/layerPopup/hasuFacility.tsx @@ -25,13 +25,13 @@ const HasuFacility = ({ seletectedLayerNm, viewMode, onClose, onFeatureSelect, i } }, [code, pbnstHasuRes]); useEffect(() => { - if (seletectedLayerNm !== '하수처리시설') return; + if (seletectedLayerNm !== '하수처리시설' || viewMode != 'list') return; if (!pbnst.isInit) { pubHasuInit("1", "0"); } }, [pbnst.isInit, pubHasuInit]); useEffect(() => { - if (seletectedLayerNm !== '하수처리시설') return; + if (seletectedLayerNm !== '하수처리시설' || viewMode != 'list') return; pubHasuInit(String(hasuPage), "0"); }, [hasuPage, pubHasuInit]); diff --git a/apps/wr/app/map/components/layerPopup/htdflFacility.tsx b/apps/wr/app/map/components/layerPopup/htdflFacility.tsx new file mode 100644 index 000000000..fe4bef25a --- /dev/null +++ b/apps/wr/app/map/components/layerPopup/htdflFacility.tsx @@ -0,0 +1,83 @@ +import { useWrStore } from '@/app/store'; +import type { customHtdflBdst } from '@/app/store/ruseFcltMng/fcltReg/htdflReg'; +import { tableData } from '@/components/lib/func/commom'; +import SttnDetailModal from '@/components/ui/modal/sttn/sttnDetailModal/sttnDetailModal'; +import { Title, UiTable } from '@common/business_components/ui'; +import { HeadMakeColSpan } from '@common/business_components/ui/table/HeadMakeColSpan'; +import React, { useEffect, useState } from 'react' +interface Props { + seletectedLayerNm: string; + viewMode: 'list' | 'detail' | 'nothing'; + onFeatureSelect: (feature: any) => void; + onClose: () => void; + htdflDetailModal: { isOpen: boolean; data: customHtdflBdst | undefined }; +} +const HtdflFacility = ({ seletectedLayerNm, viewMode, onFeatureSelect, onClose, htdflDetailModal }: Props) => { + const { code, htdflSttn, htdflSttnSearch, initHtdfl } = useWrStore((state) => state); + const { htdflSttnRes, htdflSttnResCount } = htdflSttn; + const [htdflTable, setHtdflTable] = useState(); + const [htdflPage, setHtdflPage] = useState(1) + // 온배수시설 cellClick 이벤트 (상세정보) + const htdflCellClick = (index: number | undefined) => { + if (index !== undefined && htdflTable !== undefined) { + onFeatureSelect(htdflTable[index]); + onClose(); + } + }; + useEffect(() => { + if (seletectedLayerNm !== '온배수시설' || viewMode != 'list') return; + if (!htdflSttn.isInit) { + initHtdfl(false, 1, "20", "0", '', code.cityCd, code.sggCd); + } + }, [code.cityCd, code.sggCd, htdflSttn.isInit, initHtdfl]); + + useEffect(() => { + if (seletectedLayerNm !== '온배수시설' || viewMode != 'list') return; + const data = tableData(htdflSttnRes, { code }); + const chData = data + .map((item: any) => ({ + ...item, + ...item.reuseBuilding[0], + ...item.reuseBuilding[0].htdflObj, + chBuildingYn: item.chgBuilding[0]?.bdstChgNm !== null ? "Y" : "N", + })) + .filter((item: any) => item.htdflObj !== undefined); + setHtdflTable(chData); + }, [code, htdflSttnRes, htdflSttn.htdflSttHeadList]); + + useEffect(() => { + if (seletectedLayerNm !== '온배수시설' || viewMode != 'list') return; + htdflSttnSearch(true, htdflPage, "20", '', '', code.cityCd, code.sggCd); + }, [code.cityCd, code.sggCd, htdflPage, htdflSttnSearch]); + return ( + viewMode == 'detail' ? ( + + ) : ( +

+
+ + {/* <div className="flex gap-2 mt-8"> + <Button className={btnClass} color="primary" onClick={excelClick}> + 엑셀다운로드 + </Button> + </div> */} + </div> + <UiTable + headName={[]} + tableData={htdflTable || []} + headlist={htdflSttn.htdflSttHeadList} + pageSize={20} + total={htdflSttnResCount || 0} + cellClick={(index: number | undefined) => { + htdflCellClick(index ?? undefined); + }} + onPageChange={setHtdflPage} + > + <HeadMakeColSpan upHeadList={htdflSttn.htdflSttNodeList} /> + </UiTable> + </div> + ) + ) +} + +export default HtdflFacility \ No newline at end of file diff --git a/apps/wr/app/map/components/layerPopup/rainFacility.tsx b/apps/wr/app/map/components/layerPopup/rainFacility.tsx new file mode 100644 index 000000000..54b51e8a6 --- /dev/null +++ b/apps/wr/app/map/components/layerPopup/rainFacility.tsx @@ -0,0 +1,105 @@ +import { useWrStore } from "@/app/store"; +import type { customRainBdst } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; +import { tableData } from "@/components/lib/func/commom"; +import SttnDetailModal from "@/components/ui/modal/sttn/sttnDetailModal/sttnDetailModal"; +import { Title, UiTable } from "@common/business_components/ui"; +import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; +import { useEffect, useState } from "react"; +interface Props { + seletectedLayerNm: string; + viewMode: 'list' | 'detail' | 'nothing'; + onFeatureSelect: (feature: any) => void; + onClose: () => void; + rainDetailModal: { isOpen: boolean; data: customRainBdst | undefined }; +} +const RainFacility = ({seletectedLayerNm,viewMode,onFeatureSelect,onClose,rainDetailModal}:Props) => { + // 빗물재이용시설 변수 + const { code, rainSttn, rainSttnSearch, rainSttnInit } = useWrStore( + (state) => state + ); + const { rainSttnRes, rainSttnResCount } = rainSttn; + const [rainTable, setRainTable] = useState<customRainBdst[]>(); + const [rainPage, setRainPage] = useState(1) + + // 빗물재이용시설 cellClick 이벤트 (상세정보) + const rainCellClick = (index: number | undefined, headId: string) => { + if ( + index !== undefined && + rainTable !== undefined && + headId !== 'chBuildingYn') { + onFeatureSelect(rainTable[index]); + onClose(); + } + } + useEffect(() => { + if (seletectedLayerNm !== '빗물이용시설' || viewMode != 'list') return; + console.log('빗물이용시설 초기값 호출', viewMode) + if (!rainSttn.isInit) { + rainSttnInit(false, 1, "20", "0", '', code.cityCd, code.sggCd); + } + }, [code.cityCd, code.sggCd, rainSttn.isInit, rainSttnInit]); + + useEffect(() => { + const data = tableData(rainSttnRes, { code }); + const chData = data + .map((item: any) => { + return { + ...item, + ...item.reuseBuilding[0], + ...item.reuseBuilding[0].rainyObj, + dtfcltCpct: item.reuseBuilding[0].rainyObj.dtfcltCpct === -1 + ? "확인불가" + : item.reuseBuilding[0].rainyObj.dtfcltCpct, + instlCst: item.reuseBuilding[0].instlCst === -1 + ? "확인불가" + : item.reuseBuilding[0].instlCst, + instlCstSprtAmt: item.reuseBuilding[0].instlCstSprtAmt === -1 + ? "확인불가" + : item.reuseBuilding[0].instlCstSprtAmt, + chBuildingYn: item.chgBuilding[0]?.bdstChgNm !== null ? "Y" : "N", + pntfColArea: item.reuseBuilding[0].rainyObj.pntfColArea === -1 + ? "확인불가" + : item.reuseBuilding[0].rainyObj.pntfColArea, + filtrTrtmfctCpct: item.reuseBuilding[0].rainyObj.filtrTrtmfctCpct === -1 + ? "확인불가" + : item.reuseBuilding[0].rainyObj.filtrTrtmfctCpct, + archArea: Math.floor(item.archArea) === -1 ? "확인불가" : item.archArea, + }; + }) + .filter((item: any) => item.rainyObj !== undefined); + setRainTable(chData); + }, [code, rainSttnRes, rainSttn.rainSttHeadList]); + + useEffect(() => { + if (seletectedLayerNm !== '빗물이용시설' || viewMode != 'list') return; + rainSttnSearch(false, rainPage, "20", '', '', code.cityCd, code.sggCd); + }, [code.cityCd, code.sggCd, rainPage, rainSttnSearch]); + return (viewMode == 'detail' ? + (<SttnDetailModal type={"RNB"} formObj={rainDetailModal.data as customRainBdst} />) + : ( + <> + <div className="flex justify-between items-center"> + <Title title="빗물이용시설 현황" /> + {/* <div className="flex gap-2 mt-8"> + <Button className={btnClass} color="primary" onClick={excelClick}> + 엑셀다운로드 + </Button> + </div> */} + </div> + <UiTable + headName={[]} + tableData={rainTable || []} + headlist={rainSttn.rainSttHeadList} + pageSize={20} + total={rainSttnResCount} + cellClick={(index: number | undefined, headId: string) => { + rainCellClick(index ?? undefined, headId); + }} + onPageChange={setRainPage} + > + <HeadMakeColSpan upHeadList={rainSttn.rainSttNodeList} /> + </UiTable> + </> + )) +} +export default RainFacility; \ No newline at end of file diff --git a/apps/wr/app/map/components/reuseFacility.tsx b/apps/wr/app/map/components/layerPopup/reuseFacility.tsx similarity index 95% rename from apps/wr/app/map/components/reuseFacility.tsx rename to apps/wr/app/map/components/layerPopup/reuseFacility.tsx index dd18a657e..152d37999 100644 --- a/apps/wr/app/map/components/reuseFacility.tsx +++ b/apps/wr/app/map/components/layerPopup/reuseFacility.tsx @@ -40,14 +40,13 @@ const ResueFacility = ({ viewMode, seletectedLayerNm, tabData, actTabData, setFc // 재이용 현황 초기값 useEffect(() => { - console.log('재이용시설 초기값 호출', viewMode) - if (seletectedLayerNm !== '하수재이용시설') return; + if (seletectedLayerNm !== '하수재이용시설' || viewMode !='list') return; if (!pbnstSttn.isInit) { getFlcts() } }, [seletectedLayerNm, pbnstSttn.isInit]); useEffect(() => { - if (seletectedLayerNm !== '하수재이용시설') return; + if (seletectedLayerNm !== '하수재이용시설' || viewMode !='list') return; pbnSttnInit("1", "20", { partValue: "A", sidoValue: '0', @@ -67,7 +66,7 @@ const ResueFacility = ({ viewMode, seletectedLayerNm, tabData, actTabData, setFc // 재이용시설 조회 // 재이용시설 페이징처리 관련 함수 const onPageChangeHandler = useCallback((page: number) => { - if (seletectedLayerNm !== '하수재이용시설') return; + if (seletectedLayerNm !== '하수재이용시설' || viewMode !='list') return; pbnstSttnSearch( false, String(page), diff --git a/apps/wr/app/map/components/layerPopup/reuseMngFacility.tsx b/apps/wr/app/map/components/layerPopup/reuseMngFacility.tsx new file mode 100644 index 000000000..9030493ff --- /dev/null +++ b/apps/wr/app/map/components/layerPopup/reuseMngFacility.tsx @@ -0,0 +1,103 @@ +import { useWrStore } from '@/app/store'; +import { tableData, formatPhoneNumber } from '@/components/lib/func/commom'; +import { Title, UiTable } from '@common/business_components/ui'; +import type { DemandCompType } from '@common/business_components/ui/sdmInsertForm/form'; +import moment from 'moment'; +import React, { useEffect, useState } from 'react' +interface Props { + seletectedLayerNm: string; + viewMode: 'list' | 'detail' | 'nothing'; + onFeatureSelect: (feature: any) => void; + onClose: () => void; + isDmdModal: { data: any | undefined }; +} +const ReuseMngFacility = ({seletectedLayerNm, viewMode, onFeatureSelect, onClose, isDmdModal}:Props) => { + const { code, + coSttn, + coSttnInit, + coSttnSearch, + } = useWrStore((state) => state); + const [mngTable, setMngTable] = useState<DemandCompType[]>(); + const [mngPage, setMngPage] = useState(1); + const { coSttnRes, coSttnResCount, coSttHeadList } = coSttn; + useEffect(() => { + if (seletectedLayerNm !== '수요처' || viewMode != 'list') return; + if (!coSttn.isInit) { + coSttnInit("1", "20", "0"); + } + }, [coSttn.isInit, coSttnInit]); + const coMngCellClick = (index: number | undefined) => { + if (index !== undefined && mngTable !== undefined) { + onFeatureSelect(mngTable[index]); + onClose(); + } + }; + useEffect(() => { + if (seletectedLayerNm !== '수요처' || viewMode!='list') return; + if (coSttnRes) { + if (coSttnRes?.length > 0 && code.cityCd.length > 0) { + const data = tableData(coSttnRes, { code }); + const chData = data.map((item: any) => ({ + ...item, + telno: formatPhoneNumber(item.telno || undefined), + regDt: moment(item.regDt).format("YYYY-MM-DD"), + dmdInfoId: `${item.dmdInfoId.slice(0, 3)}-${item.dmdInfoId.slice(3, 5)}-${item.dmdInfoId.slice(5, 10)}-${item.dmdInfoId.slice(10)}` + })); + // .filter((item: any) => item !== undefined); + setMngTable(chData); + } + } + }, [coSttnRes, code]); + useEffect(() => { + if (seletectedLayerNm !== '수요처' || viewMode!='list') return; + coSttnSearch(String(mngPage), "20", String(0)); + }, [coSttnSearch, mngPage]); + return ( + viewMode == 'detail' + ? ( + <div style={{ overflowX: 'hidden' }}> + <div className="flex justify-between items-center mb-4"> + <Title title="수요처 상세정보" /> + </div> + {/* 높이 조정 */} + <UiTable + tableData={isDmdModal?.data || []} + headlist={coSttHeadList.slice(0, 3)} + pageSize={1} + total={0} + headName={"위치정보"} + cellClick={() => { }} + onPageChange={() => { }} + /> + <UiTable + tableData={isDmdModal?.data || []} + headlist={coSttHeadList.slice(3)} + pageSize={1} + total={0} + headName={"기본정보"} + cellClick={() => { }} + onPageChange={() => { }} + /> + </div> + ) : (<div> + <div className="flex justify-between items-center"> + <Title title="수요처 현황" /> + </div> + <UiTable + headName={[]} + tableData={mngTable || []} + headlist={coSttHeadList} + pageSize={20} + total={coSttnResCount + 10 || 0} + cellClick={(index: number | undefined) => { + coMngCellClick(index); + // setUpdateData(coSttnRes[index as number]); + }} + onPageChange={(page) => { + setMngPage(page); + }} + ></UiTable></div>) + ) +} + +export default ReuseMngFacility \ No newline at end of file diff --git a/apps/wr/app/map/components/layerPopup/rswtFacility.tsx b/apps/wr/app/map/components/layerPopup/rswtFacility.tsx new file mode 100644 index 000000000..dc2537c95 --- /dev/null +++ b/apps/wr/app/map/components/layerPopup/rswtFacility.tsx @@ -0,0 +1,107 @@ +import { useWrStore } from "@/app/store"; +import type { customRswtBdst } from "@/app/store/ruseFcltMng/fcltReg/rswtReg"; +import { tableData } from "@/components/lib/func/commom"; +import SttnDetailModal from "@/components/ui/modal/sttn/sttnDetailModal/sttnDetailModal"; +import { Title, UiTable } from "@common/business_components/ui"; +import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; +import { useEffect, useState } from "react"; +interface Props { + seletectedLayerNm: string; + viewMode: 'list' | 'detail' | 'nothing'; + onFeatureSelect: (feature: any) => void; + onClose: () => void; + rswtrDetailModal: { isOpen: boolean; data: customRswtBdst | undefined }; +} +const RswtFacility = ({ seletectedLayerNm, viewMode, onFeatureSelect, onClose, rswtrDetailModal }: Props) => { + const { code, rswtSttn, rswtSttnSearch, rswtSttnInit } = useWrStore( + (state) => state + ); + const { rswtSttnRes, rswtSttnResCount } = rswtSttn; + const [rswtrTable, setRswtrTable] = useState<customRswtBdst[]>() + const [rswtrPage, setRswtrPage] = useState(1); + // 중수도시설 cellClick 이벤트 (상세정보) + const rswtCellClick = (index: number | undefined, headId: string) => { + if (headId !== 'chBuildingYn' && index !== undefined && rswtrTable !== undefined) { + // setRswtrDetailModal({ isOpen: true, data: rswtrTable[index] }); + // setViewMode('detail') + onFeatureSelect(rswtrTable[index]); + onClose(); + } + } + useEffect(() => { + if (seletectedLayerNm !== '중수도시설' || viewMode != 'list') return; + if (!rswtSttn.isInit) { + rswtSttnInit(false, 1, "20", "0", '', code.cityCd, code.sggCd); + } + }, [code.cityCd, code.sggCd, rswtSttn.isInit, rswtSttnInit]); + + useEffect(() => { + if (seletectedLayerNm !== '중수도시설' || viewMode != 'list') return; + const data = tableData(rswtSttnRes, { code }); + const chData = data + .map((item: customRswtBdst) => { + return { + ...item, + ...item.reuseBuilding[0], + ...item.reuseBuilding[0]?.rswtrObj, + chBuildingYn: item?.chgBuilding[0]?.bdstChgNm !== null && item?.chgBuilding.length > 0 ? 'Y' : 'N', + instlCst: item.reuseBuilding[0]?.instlCst === -1 ? "확인불가" : item.reuseBuilding[0]?.instlCst, + instlCstSprtAmt: item.reuseBuilding[0]?.instlCstSprtAmt === -1 ? "확인불가" : item.reuseBuilding[0]?.instlCstSprtAmt, + archArea: item?.archArea.split('.')[0] !== '-1' ? item?.archArea.split('.')[0] : '확인불가' + } + }) + .filter( + (item: customRswtBdst) => + item.reuseBuilding[0]?.rswtrObj !== undefined + ); + setRswtrTable(chData); + }, [code, rswtSttnRes]); + // FIXME: 윤선화 차장님 요구사항으로 엑셀 다운로드 삭제. + // const rswtSttnExcelDownload = useCallback(() => { + // if (rswtSttn.excelList.length > 0) { + // if (rswtSttn.excelList.length === 0) return; + // excelDownload( + // rswtSttn.excelList, + // "중수도시설 현황", + // "sample_rswtSttn.xlsx", + // "A1:W3", + // ); + // } + // }, [rswtSttn.excelList]) + + useEffect(() => { + if (seletectedLayerNm !== '중수도시설' || viewMode != 'list') return; + rswtSttnSearch(false, rswtrPage, "20", '', '', code.cityCd, code.sggCd); + }, [code.cityCd, code.sggCd, rswtSttnSearch, rswtrPage]); + return ( + viewMode == 'detail' ? + // 중수도시설 상세 + ( + <SttnDetailModal type={"RST"} formObj={rswtrDetailModal.data as customRswtBdst} /> + ) : ( + <div style={{ overflowY: 'auto' }}> + <div className="flex justify-between items-center"> + <Title title="중수도시설 현황" /> + {/* <div className="flex gap-2 mt-8"> + <Button className={btnClass} color="primary" onClick={rswtSttnExcelDownload}> + 엑셀다운로드 + </Button> + </div> */} + </div> + <UiTable + headName={[]} + tableData={rswtrTable || []} + headlist={rswtSttn.rswtSttHeadList} + pageSize={20} + total={rswtSttnResCount} + cellClick={(index: number | undefined, headId: string) => { + rswtCellClick(index, headId); + }} + onPageChange={setRswtrPage} + > + <HeadMakeColSpan upHeadList={rswtSttn.rswtSttNodeList} /> + </UiTable> + </div> + )) +} +export default RswtFacility; \ No newline at end of file diff --git a/apps/wr/app/map/components/newWindowPopup.tsx b/apps/wr/app/map/components/newWindowPopup.tsx new file mode 100644 index 000000000..bcc0e6ec3 --- /dev/null +++ b/apps/wr/app/map/components/newWindowPopup.tsx @@ -0,0 +1,186 @@ +"use client" +import NewWindowPortal from '@/app/map/components/newWindowPortal'; +import type { customHtdflBdst } from "@/app/store/ruseFcltMng/fcltReg/htdflReg"; +import type { pubHasuType } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; +import type { customRainBdst } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; +import type { customRswtBdst } from "@/app/store/ruseFcltMng/fcltReg/rswtReg"; +import { useGisContext } from "@common/business_components/ui/map/Gis"; +import type { DemandCompType } from '@common/business_components/ui/sdmInsertForm/form'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import ResueFacility from './layerPopup/reuseFacility'; +import { detainSttn, fetchHasuDetail, fetchpbnstDetail } from '../util'; +import HasuFacility from './layerPopup/hasuFacility'; +import RainFacility from './layerPopup/rainFacility'; +import RswtFacility from './layerPopup/rswtFacility'; +import HtdflFacility from './layerPopup/htdflFacility'; +import ReuseMngFacility from './layerPopup/reuseMngFacility'; + +interface NewWindowPopupProps { + featureData: any; + seletectedLayerNm?: string + viewMode?: 'list' | 'detail' | 'nothing' + onFeatureSelect: (data: any) => void; + onClose: () => void; +} + +const NewWindowPopup: React.FC<NewWindowPopupProps> = ({ + featureData, + seletectedLayerNm, + onFeatureSelect, + onClose +}) => { + const { gisMap } = useGisContext() as unknown as { checkedLayerIds: React.MutableRefObject<number[]>; treeData: { lyrSn: number }[] | null; gisCore: any; gisMap: any; }; + const [tabData, setTabData] = useState<{ id: string; name: string; data: any }[]>([]); + const [activeTab, setActiveTab] = useState<string>('0'); + const [viewMode, setViewMode] = useState<'list' | 'detail' | 'nothing'>('list'); + const [fcltPk, setFcltPk] = useState<string>(''); + + + // onClose 함수를 useCallback으로 메모이제이션 + const memoizedOnClose = useCallback(() => { + onClose(); + }, [onClose]); + + // 빗물재이용시설 변수 + const [rainDetailModal, setRainDetailModal] = useState<{ isOpen: boolean, data: customRainBdst | undefined }>({ data: undefined, isOpen: false }); + const [rainList, setRainList] = useState<customRainBdst[]>([]); + + // 중수도시설 변수 + const [rswtrDetailModal, setRswtrDetailModal] = useState<{ isOpen: boolean, data: customRswtBdst | undefined }>({ data: undefined, isOpen: false }); + const [rswtrList, setRswtrList] = useState<customRswtBdst[]>([]); + + // 온배수시설 변수 + const [htdflDetailModal, setHtdflDetailModal] = useState<{ isOpen: boolean, data: customHtdflBdst | undefined }>({ data: undefined, isOpen: false }); + const [htdflList, setHtdflList] = useState<customHtdflBdst[]>([]); + + // 하수처리시설 변수 + const [hasuList, setHasuList] = useState<pubHasuType[]>([]); + const [isRuseReg, setIsRuseReg] = useState<{ + data: any | undefined; + }>({ data: undefined }); + + // 수요처관리 변수 + const [isDmdModal, setIsDmdModal] = useState<{ + isMoal: boolean; + data: any | undefined; + }>({ isMoal: false, data: undefined }); + const [mngList, setMngList] = useState<DemandCompType[]>([]); + + ///////////////////////////////////////////// 피쳐데이터 선택 시 각 시설별 데이터 처리 /////////////////////////////////////////////// + const getSelectedLayers = () => { + console.trace('호출확인', 1) + let result = null; + const layers = gisMap ? gisMap.getLayers().getArray().filter((l: any) => l.getVisible()) : []; // gisMap이 null인지 확인 후 레이어 가져오기 + let featureLayer: { get: (key: string) => any } = { get: () => null }; + layers.forEach((layer: any) => { + const source = layer.getSource(); + if (source && source.hasFeature && featureData + && typeof featureData.getId === 'function' && source.hasFeature(featureData)) { + featureLayer = layer; // 피처가 속한 레이어 찾기) + } + }); + result = featureLayer.get('lyrNm'); + return result; + }; + // 상세 목록 데이터 상태 처리 + useEffect(() => { + if (hasuList.length > 0) setIsRuseReg({ data: [hasuList[0]] }); + }, [hasuList]) + useEffect(() => { + if (rainList.length > 0) setRainDetailModal({ isOpen: true, data: rainList[0] }); + }, [rainList]) + useEffect(() => { + if (rswtrList.length > 0) setRswtrDetailModal({ isOpen: true, data: rswtrList[0] }); + }, [rswtrList]) + useEffect(() => { + if (htdflList.length > 0) setHtdflDetailModal({ isOpen: true, data: htdflList[0] }); + }, [htdflList]) + useEffect(() => { + if (mngList.length > 0) setIsDmdModal({ isMoal: true, data: [mngList[0]] }); + }, [mngList]) + + const lastCalledIdRef = useRef<string | null>(null); + const [layerId, setLayerId] = useState<string | null>(); + + useEffect(() => { + const layers = getSelectedLayers(); + setLayerId(layers); + }, []); // 최초 렌더링 시 호출 + + // 피쳐 데이터가 변경될 때마다 호출 + useEffect(() => { + if (!featureData || typeof featureData.getProperties !== "function" || featureData.getProperties() == '') return; + const selectedProps = featureData.getProperties(); + const currentId = featureData.getId?.() || selectedProps?.id || selectedProps?.fid; + // 유효하지 않은 ID는 아예 무시 + if (!currentId || typeof currentId !== 'string') return; + // 이전과 동일하면 무시 + if (!currentId || currentId === lastCalledIdRef.current) return; + lastCalledIdRef.current = currentId // 새로운 피처일 때만 API 호출 + const layerId = getSelectedLayers?.(); + if (!layerId || typeof layerId !== 'string') return; + const featureCd = + layerId === '하수재이용시설' ? selectedProps?.swtrmt_fclt_cd : + ['빗물이용시설', '중수도시설', '온배수시설', '수요처'].includes(layerId) ? selectedProps?.bdst_nm : + layerId === '하수처리시설' ? selectedProps?.swtrmt_fclt_nm : + null; + if (!featureCd || featureCd === fcltPk) return; + setFcltPk(featureCd); + setActiveTab(featureCd); + setViewMode("detail"); + if (layerId === '하수재이용시설') { + fetchpbnstDetail(featureCd, setTabData); + } else if (layerId === '하수처리시설') { + fetchHasuDetail(featureCd, selectedProps?.swtrmt_fclt_cd).then((data) => { setHasuList(data) }) + } else { + detainSttn(featureCd, layerId).then((res) => { + if (layerId === '빗물이용시설') setRainList(res); + else if (layerId === '중수도시설') setRswtrList(res); + else if (layerId === '온배수시설') { setHtdflList(res); setHtdflDetailModal({ isOpen: true, data: res[0] }); } + else if (layerId === '수요처') setMngList(res); + }); + } + }, [featureData]); + ///////////////////////////////////////////// 피쳐데이터 선택 시 각 시설별 데이터 처리 /////////////////////////////////////////////// + + // 체크된 레이어에 따른 조건부 컴포넌트 렌더링 함수 + const renderConditionalContent = () => { + const actTabData = tabData.find((tab) => tab.id === activeTab); + if (layerId === null || layerId === undefined) { + setLayerId(seletectedLayerNm || ''); + } + switch (layerId) { + case '하수재이용시설': + return (<ResueFacility viewMode={viewMode} seletectedLayerNm={layerId} tabData={tabData} actTabData={actTabData} setFcltPk={setFcltPk} onFeatureSelect={onFeatureSelect} onClose={onClose} />) + case '하수처리시설': + return (<HasuFacility seletectedLayerNm={layerId} viewMode={viewMode} onFeatureSelect={onFeatureSelect} onClose={onClose} isRuseReg={isRuseReg} />) + case '빗물이용시설': + return (<RainFacility seletectedLayerNm={layerId} viewMode={viewMode} onFeatureSelect={onFeatureSelect} onClose={onClose} rainDetailModal={rainDetailModal} />) + case '중수도시설': + return (<RswtFacility seletectedLayerNm={layerId} viewMode={viewMode} onFeatureSelect={onFeatureSelect} onClose={onClose} rswtrDetailModal={rswtrDetailModal} />) + case '온배수시설': + return (<HtdflFacility seletectedLayerNm={layerId} viewMode={viewMode} onFeatureSelect={onFeatureSelect} onClose={onClose} htdflDetailModal={htdflDetailModal} />) + case '수요처': + return(<ReuseMngFacility seletectedLayerNm={layerId} viewMode={viewMode} onFeatureSelect={onFeatureSelect} onClose={onClose} isDmdModal={isDmdModal} />) + default: + break; + } + return null; // 조건에 맞는 콘텐츠가 없을 경우 + }; + + return ( + viewMode == 'nothing' ? <></> : + <NewWindowPortal + onClose={memoizedOnClose} + title="시설 상세 정보" + width={viewMode == 'list' ? window.screen.availWidth : 1100} + height={viewMode == 'list' ? window.screen.availHeight : layerId == '하수처리시설' && viewMode == 'detail' ? 450 : 900} + scrollbars='yes' + resizable='no'> + {/* 체크된 레이어에 따른 조건부 렌더링 */} + {renderConditionalContent()} + </NewWindowPortal> + ); +}; + +export default NewWindowPopup; \ No newline at end of file diff --git a/apps/wr/app/map/newWindowPortal.tsx b/apps/wr/app/map/components/newWindowPortal.tsx similarity index 100% rename from apps/wr/app/map/newWindowPortal.tsx rename to apps/wr/app/map/components/newWindowPortal.tsx diff --git a/apps/wr/app/map/mainMap/page.tsx b/apps/wr/app/map/mainMap/page.tsx index 56c9e823d..96785f8b3 100644 --- a/apps/wr/app/map/mainMap/page.tsx +++ b/apps/wr/app/map/mainMap/page.tsx @@ -3,7 +3,7 @@ import Gis from "@common/business_components/ui/map/Gis"; import { useEffect, useRef, useState, useCallback } from "react"; import { mapService } from "../service"; -import NewWindowPopup from "../newWindowPopup"; +import NewWindowPopup from "../components/newWindowPopup"; import GisApp from "@common/business_components/ui/map/lib/gis.core"; const Map = () => { @@ -61,30 +61,27 @@ const Map = () => { // 2. data가 OpenLayers Feature 인스턴스인지 확인 let foundFeature: any = null; - console.log(data) - //console.log(data.getId()) let featureId = data.fid; const layerName = data.layerNm; - - if (layerName === "재이용시설") { + console.log("선택된 레이어 이름:", data, layerName); + if (layerName === "하수재이용시설") { // 재이용시설 featureId = `${layerName}.${data.searchPk}`; } else if ( //빗물이용시설, 중수도시설 layerName === "빗물이용시설" || - layerName == "tb_wr_rswtr_fclt" + layerName == "중수도시설" ) { featureId = `${layerName}.${data.bdstInfoSn}`; - } else if (layerName === "tb_il_swage_prcs_fclt") { //하수처리시설 + } else if (layerName === "하수처리시설") { //하수처리시설 featureId = `${layerName}.${data.bscFctCd}`; - } else if (layerName === "tb_wr_htdfl_fclt") { //온배수시설 + } else if (layerName === "온배수시설") { //온배수시설 featureId = `${layerName}.${data.bdstRuseFcltSn}`; - } else if (layerName == "tb_wr_ruse_fclt_dmd_co") { //수요처 + } else if (layerName == "수요처") { //수요처 featureId = `${layerName}.${data.dmdInfoId.replaceAll("-", "")}`; } else { console.warn("해당 레이어에 대한 featureId 매핑 없음", layerName); featureId = `${layerName}.${data.fid || data.id || data.ftrIdn}`; } - map .getLayers() .getArray() diff --git a/apps/wr/app/map/newWindowPopup.tsx b/apps/wr/app/map/newWindowPopup.tsx deleted file mode 100644 index d8e6b6338..000000000 --- a/apps/wr/app/map/newWindowPopup.tsx +++ /dev/null @@ -1,552 +0,0 @@ -"use client" -import NewWindowPortal from '@/app/map/newWindowPortal'; -import { useWrStore } from "@/app/store"; -import type { customHtdflBdst } from "@/app/store/ruseFcltMng/fcltReg/htdflReg"; -import type { pubHasuType } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; -import type { customRainBdst } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; -import type { customRswtBdst } from "@/app/store/ruseFcltMng/fcltReg/rswtReg"; -import { formatPhoneNumber, tableData } from "@/components/lib/func/commom"; -import SttnDetailModal from "@/components/ui/modal/sttn/sttnDetailModal/sttnDetailModal"; -import { Title, UiTable } from '@common/business_components'; -import { useGisContext } from "@common/business_components/ui/map/Gis"; -import type { DemandCompType } from '@common/business_components/ui/sdmInsertForm/form'; -import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; -import moment from 'moment'; -import React, { useCallback, useEffect, useRef, useState } from 'react'; -import ResueFacility from './components/reuseFacility'; -import { detainSttn, fetchHasuDetail, fetchpbnstDetail } from './util'; -import HasuFacility from './components/hasuFacility'; - -interface NewWindowPopupProps { - featureData: any; - seletectedLayerNm?: string - viewMode?: 'list' | 'detail' | 'nothing' - onFeatureSelect: (data: any) => void; - onClose: () => void; -} - -const NewWindowPopup: React.FC<NewWindowPopupProps> = ({ - featureData, - seletectedLayerNm, - onFeatureSelect, - onClose -}) => { - const { gisMap } = useGisContext() as unknown as { checkedLayerIds: React.MutableRefObject<number[]>; treeData: { lyrSn: number }[] | null; gisCore: any; gisMap: any; }; - const [tabData, setTabData] = useState<{ id: string; name: string; data: any }[]>([]); - const [activeTab, setActiveTab] = useState<string>('0'); - const [viewMode, setViewMode] = useState<'list' | 'detail' | 'nothing'>('list'); - const [fcltPk, setFcltPk] = useState<string>(''); - - - // onClose 함수를 useCallback으로 메모이제이션 - const memoizedOnClose = useCallback(() => { - onClose(); - }, [onClose]); - - // 하수재이용시설 변수 - const {code} = useWrStore((state) => state); - - // 빗물재이용시설 변수 - const { rainSttn, rainSttnSearch, rainSttnInit } = useWrStore( - (state) => state - ); - const { rainSttnRes, rainSttnResCount } = rainSttn; - const [rainTable, setRainTable] = useState<customRainBdst[]>(); - const [rainPage, setRainPage] = useState(1) - const [rainDetailModal, setRainDetailModal] = useState<{ isOpen: boolean, data: customRainBdst | undefined }>({ data: undefined, isOpen: false }); - const [rainList, setRainList] = useState<customRainBdst[]>(rainSttnRes || []); - - // 중수도시설 변수 - const { rswtSttn, rswtSttnSearch, rswtSttnInit } = useWrStore( - (state) => state - ); - const { rswtSttnRes, rswtSttnResCount } = rswtSttn; - const [rswtrTable, setRswtrTable] = useState<customRswtBdst[]>(); - const [rswtrDetailModal, setRswtrDetailModal] = useState<{ isOpen: boolean, data: customRswtBdst | undefined }>({ data: undefined, isOpen: false }); - const [rswtrPage, setRswtrPage] = useState(1); - const [rswtrList, setRswtrList] = useState<customRswtBdst[]>(rswtSttnRes || []); - - // 온배수시설 변수 - const { htdflSttn, htdflSttnSearch, initHtdfl } = useWrStore((state) => state); - const { htdflSttnRes, htdflSttnResCount } = htdflSttn; - const [htdflTable, setHtdflTable] = useState<customHtdflBdst[]>(); - const [htdflDetailModal, setHtdflDetailModal] = useState<{ isOpen: boolean, data: customHtdflBdst | undefined }>({ data: undefined, isOpen: false }); - const [htdflPage, setHtdflPage] = useState(1) - const [htdflList, setHtdflList] = useState<customHtdflBdst[]>(htdflSttnRes || []); - - // 하수처리시설 변수 - const [hasuList, setHasuList] = useState<pubHasuType[]>([]); - const [isRuseReg, setIsRuseReg] = useState<{ - data: any | undefined; - }>({ data: undefined }); - - // 수요처관리 변수 - const { - coSttn, - coSttnInit, - coSttnSearch, - } = useWrStore((state) => state); - const [mngTable, setMngTable] = useState<DemandCompType[]>(); - const [mngPage, setMngPage] = useState(1); - const { coSttnRes, coSttnResCount, coSttHeadList } = coSttn; - const [isDmdModal, setIsDmdModal] = useState<{ - isMoal: boolean; - data: any | undefined; - }>({ isMoal: false, data: undefined }); - const [mngList, setMngList] = useState<DemandCompType[]>(coSttnRes || []); - ///////////////////////////////////////////// 피쳐데이터 선택 시 각 시설별 데이터 처리 /////////////////////////////////////////////// - const getSelectedLayers = () => { - console.trace('호출확인', 1) - let result = null; - const layers = gisMap ? gisMap.getLayers().getArray().filter((l: any) => l.getVisible()) : []; // gisMap이 null인지 확인 후 레이어 가져오기 - let featureLayer: { get: (key: string) => any } = { get: () => null }; - layers.forEach((layer: any) => { - const source = layer.getSource(); - if (source && source.hasFeature && featureData - && typeof featureData.getId === 'function' && source.hasFeature(featureData)) { - featureLayer = layer; // 피처가 속한 레이어 찾기) - } - }); - result = featureLayer.get('lyrNm'); - return result; - }; - // 상세 목록 데이터 상태 처리 - useEffect(() => { - if (hasuList.length > 0) setIsRuseReg({ data: [hasuList[0]] }); - }, [hasuList]) - useEffect(() => { - if (rainList.length > 0) setRainDetailModal({ isOpen: true, data: rainList[0] }); - }, [rainList]) - useEffect(() => { - if (rswtrList.length > 0) setRswtrDetailModal({ isOpen: true, data: rswtrList[0] }); - }, [rswtrList]) - useEffect(() => { - if (htdflList.length > 0) setHtdflDetailModal({ isOpen: true, data: htdflList[0] }); - }, [htdflList]) - useEffect(() => { - if (mngList.length > 0) setIsDmdModal({ isMoal: true, data: [mngList[0]] }); - }, [mngList]) - const lastCalledIdRef = useRef<string | null>(null); - const [layerId, setLayerId] = useState<string | null>(); - useEffect(() => { - const layers = getSelectedLayers(); - setLayerId(layers); - }, []); // 최초 렌더링 시 호출 - useEffect(() => { - if (!featureData || typeof featureData.getProperties !== "function" || featureData.getProperties() == '') return; - const selectedProps = featureData.getProperties(); - const currentId = featureData.getId?.() || selectedProps?.id || selectedProps?.fid; - // 유효하지 않은 ID는 아예 무시 - if (!currentId || typeof currentId !== 'string') return; - // 이전과 동일하면 무시 - if (!currentId || currentId === lastCalledIdRef.current) return; - lastCalledIdRef.current = currentId // 새로운 피처일 때만 API 호출 - const layerId = getSelectedLayers?.(); - if (!layerId || typeof layerId !== 'string') return; - const featureCd = - layerId === '하수재이용시설' ? selectedProps?.swtrmt_fclt_cd : - ['빗물이용시설', '중수도시설', '온배수시설', '수요처'].includes(layerId) ? selectedProps?.bdst_nm : - layerId === '하수처리시설' ? selectedProps?.swtrmt_fclt_nm : - null; - if (!featureCd || featureCd === fcltPk) return; - setFcltPk(featureCd); - setActiveTab(featureCd); - setViewMode("detail"); - if (layerId === '하수재이용시설') { - fetchpbnstDetail(featureCd, setTabData); - } else if (layerId === '하수처리시설') { - fetchHasuDetail(featureCd, selectedProps?.swtrmt_fclt_cd).then((data) => { setHasuList(data) }) - } else { - detainSttn(featureCd, layerId).then((res) => { - if (layerId === '빗물이용시설') setRainList(res); - else if (layerId === '중수도시설') setRswtrList(res); - else if (layerId === '온배수시설'){ setHtdflList(res); setHtdflDetailModal({ isOpen: true, data: htdflSttnRes[0] });} - else if (layerId === '수요처') setMngList(res); - }); - } - }, [featureData]); - ///////////////////////////////////////////// 피쳐데이터 선택 시 각 시설별 데이터 처리 /////////////////////////////////////////////// - - ///////////////////////////////////////////// 빗물 재이용 ////////////////////////////////////////////////// - // 빗물재이용시설 cellClick 이벤트 (상세정보) - const rainCellClick = (index: number | undefined, headId: string) => { - if ( - index !== undefined && - rainTable !== undefined && - headId !== 'chBuildingYn') { - // setRainDetailModal({ isOpen: true, data: rainTable[index] }) - // setViewMode('detail') - onFeatureSelect(rainTable[index]); - onClose(); - } - } - - - useEffect(() => { - if (seletectedLayerNm !== '빗물이용시설') return; - if (!rainSttn.isInit) { - rainSttnInit(false, 1, "20", "0", '', code.cityCd, code.sggCd); - } - }, [code.cityCd, code.sggCd, rainSttn.isInit, rainSttnInit]); - - useEffect(() => { - const data = tableData(rainSttnRes, { code }); - const chData = data - .map((item: any) => { - return { - ...item, - ...item.reuseBuilding[0], - ...item.reuseBuilding[0].rainyObj, - dtfcltCpct: item.reuseBuilding[0].rainyObj.dtfcltCpct === -1 - ? "확인불가" - : item.reuseBuilding[0].rainyObj.dtfcltCpct, - instlCst: item.reuseBuilding[0].instlCst === -1 - ? "확인불가" - : item.reuseBuilding[0].instlCst, - instlCstSprtAmt: item.reuseBuilding[0].instlCstSprtAmt === -1 - ? "확인불가" - : item.reuseBuilding[0].instlCstSprtAmt, - chBuildingYn: item.chgBuilding[0]?.bdstChgNm !== null ? "Y" : "N", - pntfColArea: item.reuseBuilding[0].rainyObj.pntfColArea === -1 - ? "확인불가" - : item.reuseBuilding[0].rainyObj.pntfColArea, - filtrTrtmfctCpct: item.reuseBuilding[0].rainyObj.filtrTrtmfctCpct === -1 - ? "확인불가" - : item.reuseBuilding[0].rainyObj.filtrTrtmfctCpct, - archArea: Math.floor(item.archArea) === -1 ? "확인불가" : item.archArea, - }; - }) - .filter((item: any) => item.rainyObj !== undefined); - setRainTable(chData); - }, [code, rainSttnRes, rainSttn.rainSttHeadList]); - - useEffect(() => { - if (seletectedLayerNm !== '빗물이용시설') return; - rainSttnSearch(false, rainPage, "20", '', '', code.cityCd, code.sggCd); - }, [code.cityCd, code.sggCd, rainPage, rainSttnSearch]); - ///////////////////////////////////////////// 빗물 재이용 ////////////////////////////////////////////////// - - ///////////////////////////////////////////// 중수도 시설 ////////////////////////////////////////////////// - // 중수도시설 cellClick 이벤트 (상세정보) - const rswtCellClick = (index: number | undefined, headId: string) => { - if (headId !== 'chBuildingYn' && index !== undefined && rswtrTable !== undefined) { - // setRswtrDetailModal({ isOpen: true, data: rswtrTable[index] }); - // setViewMode('detail') - onFeatureSelect(rswtrTable[index]); - onClose(); - } - } - useEffect(() => { - if (seletectedLayerNm !== '중수도시설') return; - if (!rswtSttn.isInit) { - rswtSttnInit(false, 1, "20", "0", '', code.cityCd, code.sggCd); - } - }, [code.cityCd, code.sggCd, rswtSttn.isInit, rswtSttnInit]); - - useEffect(() => { - if (seletectedLayerNm !== '중수도시설') return; - const data = tableData(rswtSttnRes, { code }); - const chData = data - .map((item: customRswtBdst) => { - return { - ...item, - ...item.reuseBuilding[0], - ...item.reuseBuilding[0]?.rswtrObj, - chBuildingYn: item?.chgBuilding[0]?.bdstChgNm !== null && item?.chgBuilding.length > 0 ? 'Y' : 'N', - instlCst: item.reuseBuilding[0]?.instlCst === -1 ? "확인불가" : item.reuseBuilding[0]?.instlCst, - instlCstSprtAmt: item.reuseBuilding[0]?.instlCstSprtAmt === -1 ? "확인불가" : item.reuseBuilding[0]?.instlCstSprtAmt, - archArea: item?.archArea.split('.')[0] !== '-1' ? item?.archArea.split('.')[0] : '확인불가' - } - }) - .filter( - (item: customRswtBdst) => - item.reuseBuilding[0]?.rswtrObj !== undefined - ); - setRswtrTable(chData); - }, [code, rswtSttnRes]); - // FIXME: 윤선화 차장님 요구사항으로 엑셀 다운로드 삭제. - // const rswtSttnExcelDownload = useCallback(() => { - // if (rswtSttn.excelList.length > 0) { - // if (rswtSttn.excelList.length === 0) return; - // excelDownload( - // rswtSttn.excelList, - // "중수도시설 현황", - // "sample_rswtSttn.xlsx", - // "A1:W3", - // ); - // } - // }, [rswtSttn.excelList]) - - useEffect(() => { - if (seletectedLayerNm !== '중수도시설') return; - rswtSttnSearch(false, rswtrPage, "20", '', '', code.cityCd, code.sggCd); - }, [code.cityCd, code.sggCd, rswtSttnSearch, rswtrPage]); - ///////////////////////////////////////////// 중수도 시설 ////////////////////////////////////////////////// - - ///////////////////////////////////////////// 온배수 시설 ////////////////////////////////////////////////// - // 온배수시설 cellClick 이벤트 (상세정보) - const htdflCellClick = (index: number | undefined) => { - if (index !== undefined && htdflTable !== undefined) { - onFeatureSelect(htdflTable[index]); - onClose(); - } - }; - useEffect(() => { - if (seletectedLayerNm !== '온배수시설') return; - if (!htdflSttn.isInit) { - initHtdfl(false, 1, "20", "0", '', code.cityCd, code.sggCd); - } - }, [code.cityCd, code.sggCd, htdflSttn.isInit, initHtdfl]); - - useEffect(() => { - if (seletectedLayerNm !== '온배수시설') return; - const data = tableData(htdflSttnRes, { code }); - const chData = data - .map((item: any) => ({ - ...item, - ...item.reuseBuilding[0], - ...item.reuseBuilding[0].htdflObj, - chBuildingYn: item.chgBuilding[0]?.bdstChgNm !== null ? "Y" : "N", - })) - .filter((item: any) => item.htdflObj !== undefined); - setHtdflTable(chData); - }, [code, htdflSttnRes, htdflSttn.htdflSttHeadList]); - - useEffect(() => { - if (seletectedLayerNm !== '온배수시설') return; - htdflSttnSearch(true, htdflPage, "20", '', '', code.cityCd, code.sggCd); - }, [code.cityCd, code.sggCd, htdflPage, htdflSttnSearch]); - ///////////////////////////////////////////// 온배수 시설 ////////////////////////////////////////////////// - - ///////////////////////////////////////////// 수요처 관리 ////////////////////////////////////////////////// - useEffect(() => { - if (seletectedLayerNm !== '수요처') return; - if (!coSttn.isInit) { - coSttnInit("1", "20", "0"); - } - }, [coSttn.isInit, coSttnInit]); - const coMngCellClick = (index: number | undefined) => { - if (index !== undefined && mngTable !== undefined) { - onFeatureSelect(mngTable[index]); - onClose(); - } - }; - useEffect(() => { - if (seletectedLayerNm !== '수요처') return; - if (coSttnRes) { - if (coSttnRes?.length > 0 && code.cityCd.length > 0) { - const data = tableData(coSttnRes, { code }); - const chData = data.map((item: any) => ({ - ...item, - telno: formatPhoneNumber(item.telno || undefined), - regDt: moment(item.regDt).format("YYYY-MM-DD"), - dmdInfoId: `${item.dmdInfoId.slice(0, 3)}-${item.dmdInfoId.slice(3, 5)}-${item.dmdInfoId.slice(5, 10)}-${item.dmdInfoId.slice(10)}` - })); - // .filter((item: any) => item !== undefined); - setMngTable(chData); - } - } - }, [coSttnRes, code]); - useEffect(() => { - if (seletectedLayerNm !== '수요처') return; - coSttnSearch(String(mngPage), "20", String(0)); - }, [coSttnSearch, mngPage]); - ///////////////////////////////////////////// 수요처 관리 ////////////////////////////////////////////////// - - // 체크된 레이어에 따른 조건부 컴포넌트 렌더링 함수 - const renderConditionalContent = () => { - const actTabData = tabData.find((tab) => tab.id === activeTab); - if (layerId === null || layerId === undefined) { - setLayerId(seletectedLayerNm || ''); - } - // 빗물이용시설 - const isRain = layerId == '빗물이용시설'; - // 중수도시설 - const isRswt = layerId == '중수도시설'; - // 온배수시설 - const isHtdfl = layerId == '온배수시설'; - // 수요처관리 - const isReuseMng = layerId == '수요처'; - switch (layerId) { - case '하수재이용시설': - return (<ResueFacility viewMode={viewMode} seletectedLayerNm={layerId} tabData={tabData} actTabData={actTabData} setFcltPk={setFcltPk} onFeatureSelect={onFeatureSelect} onClose={onClose} />) - case '하수처리시설': - return(<HasuFacility seletectedLayerNm={layerId} viewMode={viewMode} onFeatureSelect={onFeatureSelect} onClose={onClose} isRuseReg={isRuseReg}/>) - default: - break; - } - if (isRain) { - if (viewMode == 'detail') { - // 빗물이용시설 상세 - return ( - <SttnDetailModal type={"RNB"} formObj={rainDetailModal.data as customRainBdst} /> - ); - } else { - // 빗물이용시설 목록 - return ( - <> - <div className="flex justify-between items-center"> - <Title title="빗물이용시설 현황" /> - {/* <div className="flex gap-2 mt-8"> - <Button className={btnClass} color="primary" onClick={excelClick}> - 엑셀다운로드 - </Button> - </div> */} - </div> - <UiTable - headName={[]} - tableData={rainTable || []} - headlist={rainSttn.rainSttHeadList} - pageSize={20} - total={rainSttnResCount} - cellClick={(index: number | undefined, headId: string) => { - rainCellClick(index ?? undefined, headId); - }} - onPageChange={setRainPage} - > - <HeadMakeColSpan upHeadList={rainSttn.rainSttNodeList} /> - </UiTable> - </> - ); - } - } - - if (isRswt) { - if (viewMode == 'detail') { - // 중수도시설 상세 - return ( - <SttnDetailModal type={"RST"} formObj={rswtrDetailModal.data as customRswtBdst} /> - ); - } else { - // 중수도시설 목록 - return ( - <div style={{ overflowY: 'auto' }}> - <div className="flex justify-between items-center"> - <Title title="중수도시설 현황" /> - {/* <div className="flex gap-2 mt-8"> - <Button className={btnClass} color="primary" onClick={rswtSttnExcelDownload}> - 엑셀다운로드 - </Button> - </div> */} - </div> - <UiTable - headName={[]} - tableData={rswtrTable || []} - headlist={rswtSttn.rswtSttHeadList} - pageSize={20} - total={rswtSttnResCount} - cellClick={(index: number | undefined, headId: string) => { - rswtCellClick(index, headId); - }} - onPageChange={setRswtrPage} - > - <HeadMakeColSpan upHeadList={rswtSttn.rswtSttNodeList} /> - </UiTable> - </div> - ); - } - } - - if (isHtdfl) { - if (viewMode == 'detail') { - // 온배수시설 상세 - return ( - <SttnDetailModal type={"HTB"} formObj={htdflDetailModal.data as customHtdflBdst} /> - ); - } else { - // 온배수시설 목록 - return ( - <div style={{ overflowY: 'auto' }}> - <div className="flex justify-between items-center"> - <Title title="온배수시설 현황" /> - {/* <div className="flex gap-2 mt-8"> - <Button className={btnClass} color="primary" onClick={excelClick}> - 엑셀다운로드 - </Button> - </div> */} - </div> - <UiTable - headName={[]} - tableData={htdflTable || []} - headlist={htdflSttn.htdflSttHeadList} - pageSize={20} - total={htdflSttnResCount || 0} - cellClick={(index: number | undefined) => { - htdflCellClick(index ?? undefined); - }} - onPageChange={setHtdflPage} - > - <HeadMakeColSpan upHeadList={htdflSttn.htdflSttNodeList} /> - </UiTable> - </div> - ); - } - } - if (isReuseMng) { - if (viewMode == 'detail') { - return ( - <div style={{ overflowX: 'hidden' }}> - <div className="flex justify-between items-center mb-4"> - <Title title="수요처 상세정보" /> - </div> - {/* 높이 조정 */} - <UiTable - tableData={isDmdModal?.data || []} - headlist={coSttHeadList.slice(0, 3)} - pageSize={1} - total={0} - headName={"위치정보"} - cellClick={() => { }} - onPageChange={() => { }} - /> - <UiTable - tableData={isDmdModal?.data || []} - headlist={coSttHeadList.slice(3)} - pageSize={1} - total={0} - headName={"기본정보"} - cellClick={() => { }} - onPageChange={() => { }} - /> - </div> - ) - } else if (viewMode == 'list') { - return (<div> - <div className="flex justify-between items-center"> - <Title title="수요처 현황" /> - </div> - <UiTable - headName={[]} - tableData={mngTable || []} - headlist={coSttHeadList} - pageSize={20} - total={coSttnResCount + 10 || 0} - cellClick={(index: number | undefined) => { - coMngCellClick(index); - // setUpdateData(coSttnRes[index as number]); - }} - onPageChange={(page) => { - setMngPage(page); - }} - ></UiTable></div>) - } - } - return null; // 조건에 맞는 콘텐츠가 없을 경우 - }; - - return ( - viewMode == 'nothing' ? <></> : - <NewWindowPortal - onClose={memoizedOnClose} - title="시설 상세 정보" - width={viewMode == 'list' ? window.screen.availWidth : 1100} - height={viewMode == 'list' ? window.screen.availHeight : layerId == '하수처리시설' && viewMode == 'detail' ? 450 : 900} - scrollbars='yes' - resizable='no'> - {/* 체크된 레이어에 따른 조건부 렌더링 */} - {renderConditionalContent()} - </NewWindowPortal> - ); -}; - -export default NewWindowPopup; \ No newline at end of file diff --git a/apps/wr/app/map/popup/page.tsx b/apps/wr/app/map/popup/page.tsx index 80830aa90..c7b23461f 100644 --- a/apps/wr/app/map/popup/page.tsx +++ b/apps/wr/app/map/popup/page.tsx @@ -3,7 +3,7 @@ import Gis from "@common/business_components/ui/map/Gis"; import { useEffect, useRef, useState, useCallback } from "react"; import { mapService } from "../service"; -import NewWindowPopup from "../newWindowPopup"; +import NewWindowPopup from "../components/newWindowPopup"; import GisApp from "@common/business_components/ui/map/lib/gis.core"; const Map = () => { From 96448b642785afd83dbc00a3ab58fc6ec7593fd6 Mon Sep 17 00:00:00 2001 From: jyha00 <jyha@mind-one.co.kr> Date: Thu, 31 Jul 2025 17:50:05 +0900 Subject: [PATCH 12/36] =?UTF-8?q?=EC=88=98=EC=9A=94=EC=B2=98=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EC=8B=9C=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=B4=88=EA=B8=B0=ED=99=94=20=EC=9A=94=EC=B2=AD=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ui/sdmLoginForm/component.tsx | 147 ++++++++++-------- 1 file changed, 84 insertions(+), 63 deletions(-) diff --git a/apps/dm/components/ui/sdmLoginForm/component.tsx b/apps/dm/components/ui/sdmLoginForm/component.tsx index dd764844b..6f4e2c959 100644 --- a/apps/dm/components/ui/sdmLoginForm/component.tsx +++ b/apps/dm/components/ui/sdmLoginForm/component.tsx @@ -4,8 +4,9 @@ import type { DemandCompType } from "@common/business_components/ui/sdmInsertFor import { Button, Input } from "@common/components"; import { zodResolver } from "@hookform/resolvers/zod"; import { sha512 } from 'js-sha512'; -import { useEffect, useState, useMemo } from "react"; +import { useEffect, useMemo, useState } from "react"; import { FormProvider, useForm, type ControllerRenderProps } from "react-hook-form"; +import toast from "react-hot-toast"; import * as z from "zod"; export function SdmLoginForm() { @@ -15,10 +16,10 @@ export function SdmLoginForm() { const formatBusinessNumber = (value: string) => { // 숫자만 추출 const digitsOnly = value.replace(/\D/g, ""); - + // 10자리까지만 처리 const limitedDigits = digitsOnly.slice(0, 10); - + // 3-2-5 형식으로 포맷팅 if (limitedDigits.length <= 3) { return limitedDigits; @@ -28,18 +29,18 @@ export function SdmLoginForm() { return `${limitedDigits.slice(0, 3)}-${limitedDigits.slice(3, 5)}-${limitedDigits.slice(5)}`; } }; - + // 스키마를 useMemo로 최적화 const sdmLoginFormSchema = useMemo(() => z.object({ dmdInfoId: z.string() .min(1, "사업자등록번호를 입력해주세요") .regex(/^\d{10}$/, "사업자등록번호는 10자리 숫자만 입력 가능합니다"), - bznmTotNo: isBznmTotNoDisabled + bznmTotNo: isBznmTotNoDisabled ? z.string().optional() : z.string().length(4, "종사업자등록번호는 4자리 숫자만 입력 가능합니다"), password: z.string() .min(1, "비밀번호를 입력해주세요") - .min(8, "비밀번호는 8자 이상 입력해주세요") + .min(8, "비밀번호는 8자 이상 입력해주세요") .max(16, "비밀번호는 16자 이내로 입력해주세요"), rgtr: z.string().optional(), dmdAplyPswd: z.string().optional(), @@ -47,7 +48,7 @@ export function SdmLoginForm() { type FormData = z.infer<typeof sdmLoginFormSchema>; type FieldComponent = (field: ControllerRenderProps<FormData, keyof FormData>) => JSX.Element; - + const formSchema = sdmLoginFormSchema; useEffect(() => { @@ -72,6 +73,23 @@ export function SdmLoginForm() { setIsBznmTotNoDisabled(checked); }; + const initPassword = () => { + toast( + () => ( + <div className="flex flex-col items-center"> + <div className="text-2xl mb-2"> + 관리자(031-0000-0000)에게 비밀번호 초기화 요청을 유선으로 하시기 바랍니다. + </div> + </div> + ), + { + id: "pwd-reset", + duration: 5000, + position: "top-center", + } + ); + } + const handleLogin = () => { const data = form.getValues(); const passwordStr = sha512.hex(data.password) @@ -82,61 +100,61 @@ export function SdmLoginForm() { } actionLogin(param as unknown as DemandCompType); }; - + const formFields: Array<{ name: keyof FormData; label: string; component: FieldComponent | undefined; }> = [ - { - name: "dmdInfoId", - label: "사업자등록번호", - component: (field) => ( - <Input - placeholder="사업자등록번호를 입력하세요" - type="text" - className="!mt-5 !mb-5 !text-xl text-gray-600" - {...field} - value={formatBusinessNumber(field.value as string)} - onChange={(e) => { - const dmdId = e.target.value.replace(/\D/g, "").slice(0, 10); - field.onChange(dmdId); - }} - /> - ) - }, - { - name: "bznmTotNo", - label: BZNM_TOT_NO || "종사업자등록번호", - component: (field) => ( - <FormUi - label="종사업자등록번호" - onCheckboxChange={handleCheckboxChange} - isDisabled={isBznmTotNoDisabled} - > - <Input - placeholder="여러사업장이 있을 경우 입력해주세요" + { + name: "dmdInfoId", + label: "사업자등록번호", + component: (field) => ( + <Input + placeholder="사업자등록번호를 입력하세요" type="text" - className="!mt-5 !text-xl text-gray-600" - disabled={isBznmTotNoDisabled} + className="!mt-5 !mb-5 !text-xl text-gray-600" + {...field} + value={formatBusinessNumber(field.value as string)} + onChange={(e) => { + const dmdId = e.target.value.replace(/\D/g, "").slice(0, 10); + field.onChange(dmdId); + }} + /> + ) + }, + { + name: "bznmTotNo", + label: BZNM_TOT_NO || "종사업자등록번호", + component: (field) => ( + <FormUi + label="종사업자등록번호" + onCheckboxChange={handleCheckboxChange} + isDisabled={isBznmTotNoDisabled} + > + <Input + placeholder="여러사업장이 있을 경우 입력해주세요" + type="text" + className="!mt-5 !text-xl text-gray-600" + disabled={isBznmTotNoDisabled} + {...field} + /> + </FormUi> + ) + }, + { + name: "password", + label: "비밀번호", + component: (field) => ( + <Input + placeholder="비밀번호를 입력하세요" + type="password" + className="!mt-5 !mb-5 !text-xl text-gray-600" {...field} /> - </FormUi> - ) - }, - { - name: "password", - label: "비밀번호", - component: (field) => ( - <Input - placeholder="비밀번호를 입력하세요" - type="password" - className="!mt-5 !mb-5 !text-xl text-gray-600" - {...field} - /> - ) - } - ]; + ) + } + ]; return ( <> @@ -148,11 +166,11 @@ export function SdmLoginForm() { control={form.control} name={name} render={({ field }) => ( - label==='종사업자등록번호' ? - <> + label === '종사업자등록번호' ? + <> {component && component(field)} </> - : <FormUi label={label}> + : <FormUi label={label}> {component && component(field)} </FormUi> )} @@ -160,12 +178,15 @@ export function SdmLoginForm() { ))} </FormProvider> <div className="flex justify-center pt-4"> - <Button - onClick={handleLogin} - className="w-32 bg-blue-600 hover:bg-blue-700 text-white font-semibold py-2 px-4 rounded-md transition-colors duration-200" - > - 로그인 - </Button> + <div className="flex flex-col items-center"> + <Button + onClick={handleLogin} + className="w-32 bg-blue-600 hover:bg-blue-700 text-white font-semibold py-2 px-4 rounded-md transition-colors duration-200" + > + 로그인 + </Button> + <div className="text-xl mt-2 text-gray-400" onClick={initPassword}>비밀번호 초기화 요청</div> + </div> </div> </div> </> From fb9dacd60c090a561d27a545183b93cfa761c1b8 Mon Sep 17 00:00:00 2001 From: JIeunhuh <entks301@naver.com> Date: Thu, 31 Jul 2025 17:58:33 +0900 Subject: [PATCH 13/36] =?UTF-8?q?=ED=8C=9D=EC=97=85=20=ED=81=AC=EA=B8=B0?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/map/components/newWindowPopup.tsx | 11 ++++------- .../wr/app/map/components/newWindowPortal.tsx | 19 ++++++++++++++----- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/apps/wr/app/map/components/newWindowPopup.tsx b/apps/wr/app/map/components/newWindowPopup.tsx index bcc0e6ec3..21d31b984 100644 --- a/apps/wr/app/map/components/newWindowPopup.tsx +++ b/apps/wr/app/map/components/newWindowPopup.tsx @@ -18,7 +18,6 @@ import ReuseMngFacility from './layerPopup/reuseMngFacility'; interface NewWindowPopupProps { featureData: any; seletectedLayerNm?: string - viewMode?: 'list' | 'detail' | 'nothing' onFeatureSelect: (data: any) => void; onClose: () => void; } @@ -125,9 +124,6 @@ const NewWindowPopup: React.FC<NewWindowPopupProps> = ({ layerId === '하수처리시설' ? selectedProps?.swtrmt_fclt_nm : null; if (!featureCd || featureCd === fcltPk) return; - setFcltPk(featureCd); - setActiveTab(featureCd); - setViewMode("detail"); if (layerId === '하수재이용시설') { fetchpbnstDetail(featureCd, setTabData); } else if (layerId === '하수처리시설') { @@ -140,6 +136,9 @@ const NewWindowPopup: React.FC<NewWindowPopupProps> = ({ else if (layerId === '수요처') setMngList(res); }); } + setFcltPk(featureCd); + setActiveTab(featureCd); + setViewMode("detail"); }, [featureData]); ///////////////////////////////////////////// 피쳐데이터 선택 시 각 시설별 데이터 처리 /////////////////////////////////////////////// @@ -167,15 +166,13 @@ const NewWindowPopup: React.FC<NewWindowPopupProps> = ({ } return null; // 조건에 맞는 콘텐츠가 없을 경우 }; - return ( viewMode == 'nothing' ? <></> : <NewWindowPortal onClose={memoizedOnClose} title="시설 상세 정보" - width={viewMode == 'list' ? window.screen.availWidth : 1100} - height={viewMode == 'list' ? window.screen.availHeight : layerId == '하수처리시설' && viewMode == 'detail' ? 450 : 900} scrollbars='yes' + viewMode={viewMode} resizable='no'> {/* 체크된 레이어에 따른 조건부 렌더링 */} {renderConditionalContent()} diff --git a/apps/wr/app/map/components/newWindowPortal.tsx b/apps/wr/app/map/components/newWindowPortal.tsx index b8da17d7b..119e3a52b 100644 --- a/apps/wr/app/map/components/newWindowPortal.tsx +++ b/apps/wr/app/map/components/newWindowPortal.tsx @@ -31,9 +31,10 @@ interface NewWindowPortalProps { height?: number; resizable?: string; scrollbars?: string; + viewMode?: 'list' | 'detail' | 'nothing'; } -const NewWindowPortal: React.FC<NewWindowPortalProps> = ({ children, onClose, title = "", width = 900, height = 800, resizable = "yes", scrollbars = "yes" }) => { +const NewWindowPortal: React.FC<NewWindowPortalProps> = ({ children, onClose, title = "", resizable = "yes", scrollbars = "yes", viewMode }) => { const [container, setContainer] = useState<HTMLElement | null>(null); const newWindowRef = useRef<Window | null>(null); const onCloseRef = useRef(onClose); @@ -46,7 +47,15 @@ const NewWindowPortal: React.FC<NewWindowPortalProps> = ({ children, onClose, ti const handleUnload = useCallback(() => { onCloseRef.current(); }, []); - + useEffect(() => { + if (newWindowRef.current) { + if (viewMode == 'detail') { + newWindowRef.current.resizeTo(1100, 700); + } else { + newWindowRef.current.resizeTo(screen.availWidth, screen.availHeight); + } + } + }, [viewMode]); useEffect(() => { // 이미 창이 열려있으면 새로 열지 않음 if (newWindowRef.current && !newWindowRef.current.closed) return; @@ -57,11 +66,11 @@ const NewWindowPortal: React.FC<NewWindowPortalProps> = ({ children, onClose, ti const screenHeight = window.innerHeight ?? document.documentElement.clientHeight; // 중앙 위치 계산 - const left = screenLeft + (screenWidth - width) / 2; - const top = screenTop + (screenHeight - height) / 2; + const left = screenLeft + (screenWidth - window.screen.width) / 2; + const top = screenTop + (screenHeight - window.screen.height) / 2; // 1. 새 창을 열고 참조를 저장합니다. - const popupOptions = `width=${width},height=${height},left=${left}, top=${top}, resizable=${resizable},scrollbars=${scrollbars}`; + const popupOptions = `width=${window.screen.width},height=${window.screen.height},left=${left}, top=${top}, resizable=${resizable},scrollbars=${scrollbars}`; newWindowRef.current = window.open('', title, popupOptions); if (newWindowRef.current) { From d23f928ddb56271fb9db7cca57c00c82d66b319f Mon Sep 17 00:00:00 2001 From: jyha00 <jyha@mind-one.co.kr> Date: Thu, 31 Jul 2025 19:53:17 +0900 Subject: [PATCH 14/36] =?UTF-8?q?=EC=88=98=EC=9A=94=EC=B2=98=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/coMng/coSttn/page.tsx | 35 ++++-- apps/wr/app/store/matDmd/coSttn/index.tsx | 135 +++++++++++++--------- apps/wr/public/locales/ko/message.json | 24 ++-- 3 files changed, 118 insertions(+), 76 deletions(-) diff --git a/apps/wr/app/matMng/coMng/coSttn/page.tsx b/apps/wr/app/matMng/coMng/coSttn/page.tsx index 8e2705450..1dbf511eb 100644 --- a/apps/wr/app/matMng/coMng/coSttn/page.tsx +++ b/apps/wr/app/matMng/coMng/coSttn/page.tsx @@ -5,6 +5,7 @@ import { btnClass } from "@/app/store/common/code"; import { excelCoSttnParsing } from "@/app/store/matDmd/coSttn/excel"; import { fetchType, getFetch } from "@/components/lib/api"; import { + confirmToast, excelDownload, formatPhoneNumber, getCity, @@ -30,6 +31,7 @@ import { Button } from "@common/components/ui"; import moment from "moment"; import { useCallback, useEffect, useState } from "react"; import toast, { Toaster } from "react-hot-toast"; +import { useTranslation } from "react-i18next"; export default function CoSttn() { const { @@ -43,6 +45,7 @@ export default function CoSttn() { updateDemandCompany, coSttnTxtSearch, demandCompList, + coSttnPwInit, } = useWrStore((state) => state); const { regAuthrtYn, mdfcnAuthrtYn } = auth; @@ -103,9 +106,8 @@ export default function CoSttn() { ...item, telno: formatPhoneNumber(item.telno || undefined), regDt: moment(item.regDt).format("YYYY-MM-DD"), - dmdInfoId: `${item.dmdInfoId.slice(0, 3)}-${item.dmdInfoId.slice(3, 5)}-${item.dmdInfoId.slice(5,10)}-${item.dmdInfoId.slice(10)}` - })); - console.log("chData:", chData) + dmdInfoId: `${item.dmdInfoId.slice(0, 3)}-${item.dmdInfoId.slice(3, 5)}-${item.dmdInfoId.slice(5, 10)}-${item.dmdInfoId.slice(10)}` + })); // .filter((item: any) => item !== undefined); setBdstTable(chData); } else if (coSttnRes?.length == 0) { @@ -156,6 +158,18 @@ export default function CoSttn() { } } }; + const { t } = useTranslation('base'); + const initPassword = () => { + if (upadateData) { + const dmdInfoId = upadateData.dmdInfoId; + const handleConfirm = () => { + coSttnPwInit(dmdInfoId); + }; + confirmToast(t('isInitPw'), handleConfirm); + } else { + toast.error("비밀번호 초기화를 원하는 행을 선택해주세요.") + } + } return ( <> @@ -167,7 +181,7 @@ export default function CoSttn() { <SearchFormLeft> <div className="col-span-10 flex flex-row"> <SelectBox - className="col-span-2 w-1/6 h-full text-2xl" + className="col-span-3 w-1/6 h-full text-2xl" label="시도" selectClass={""} selectArray={code.cityCd || []} @@ -178,7 +192,7 @@ export default function CoSttn() { value={objSearch.city} /> <SelectBox - className="col-span-2 w-1/6 h-full text-2xl" + className="col-span-3 w-1/6 h-full text-2xl" label="시군구" selectClass={""} selectArray={selectSgg || []} @@ -195,7 +209,7 @@ export default function CoSttn() { /> </div> </SearchFormLeft> - <SearchFormRight className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2 "> + <SearchFormRight className="w-3/12 mx-5 flex flex-col items-center justify-center space-x-2 "> <div className="flex flex-row space-x-2"> <Button className="mt-2" size={"sm"} onClick={searchClick}> 조회 @@ -236,6 +250,13 @@ export default function CoSttn() { > 다운로드 </Button> + <Button + size={"sm"} + className={`${btnClass}`} + onClick={(initPassword)} + > + 비밀번호 초기화 + </Button> </div> </SearchFormRight> </SearchDiv> @@ -286,9 +307,7 @@ export default function CoSttn() { objSearch.sgg && objSearch.sgg !== "0" ? objSearch.sgg : objSearch.city; - console.log("data ", data); if (upadateData?.dmdInfoId) { - console.log("data ", data); await updateDemandCompany(data as DemandCompType); coSttnInit("1", "13", String(con)); setIsDmdModal({ diff --git a/apps/wr/app/store/matDmd/coSttn/index.tsx b/apps/wr/app/store/matDmd/coSttn/index.tsx index 1e20e8a76..1f7b2c54b 100644 --- a/apps/wr/app/store/matDmd/coSttn/index.tsx +++ b/apps/wr/app/store/matDmd/coSttn/index.tsx @@ -1,7 +1,8 @@ import type { CommonTableProps } from "@/app/store/common/type/header"; -import { fetchType, getFetchWithCount } from "@/components/lib/api"; +import { fetchType, getFetchWithCount, putFectch } from "@/components/lib/api"; import type { DemandCompType } from "@common/business_components/ui/sdmInsertForm/form"; import { coSttHeadListExport, coSttNodeListExport } from "./headList"; +import toast from "react-hot-toast"; // 테이블 헤드 리스트 const coSttNodeList = coSttNodeListExport; @@ -21,9 +22,10 @@ export type coSttnState = { }; type coSttnActions = { - coSttnInit:(pageNo:string, pageCnt:string, con: string) => void; - coSttnSearch: (pageNo:string, pageCnt:string, con: string) => void; - coSttnTxtSearch:(pageNo:string, pageCnt:string, con: string,txt:string) => void; + coSttnInit: (pageNo: string, pageCnt: string, con: string) => void; + coSttnSearch: (pageNo: string, pageCnt: string, con: string) => void; + coSttnTxtSearch: (pageNo: string, pageCnt: string, con: string, txt: string) => void; + coSttnPwInit: (dmdInfoId: string) => void; }; export type coSttnType = coSttnState & coSttnActions; @@ -44,7 +46,7 @@ export const coSttnActionsExport: (set: any) => coSttnActions = ( set: any ) => { return { - coSttnInit: async (pageNo:string, pageCnt:string, con: string) => { + coSttnInit: async (pageNo: string, pageCnt: string, con: string) => { try { const coSttnRes = await getFetchWithCount( @@ -67,56 +69,81 @@ export const coSttnActionsExport: (set: any) => coSttnActions = ( console.log(e) } }, - coSttnSearch: async (pageNo:string, pageCnt:string, con: string) => { - try { - const coSttnRes = await getFetchWithCount( - fetchType.WR, - `/reuseFc/request/${pageNo}/${pageCnt}/${con}` - ); - if (Number(pageCnt) >= 10000) { - set((state: coSttnState) => { - return { - ...state, - coSttn: { - ...state.coSttn, - excelList: coSttnRes.data, - //isInit: false, - }, - }; - }); - } else - set((state: coSttnState) => { - return { - ...state, - coSttn: { - ...state.coSttn, - coSttnRes: coSttnRes.data, - isInit: false, - coSttnResCount : coSttnRes.count, - }, - }; - }); - } catch (erTxt) { - console.log("error", erTxt); - } - }, - coSttnTxtSearch: async (pageNo:string, pageCnt:string, con: string, txt: string) => { - try { - const coSttnRes = await getFetchWithCount( - fetchType.WR, - `/reuseFc/request/${pageNo}/${pageCnt}/${con}/${txt}`) - set((state: coSttnState) => { - return { - ...state, - coSttn: { - ...state.coSttn, - coSttnRes: coSttnRes.data, - coSttnResCount: coSttnRes.count, - isInit: false, - }}}) - } catch (erTxt) { - console.log("error", erTxt); + coSttnSearch: async (pageNo: string, pageCnt: string, con: string) => { + try { + const coSttnRes = await getFetchWithCount( + fetchType.WR, + `/reuseFc/request/${pageNo}/${pageCnt}/${con}` + ); + if (Number(pageCnt) >= 10000) { + set((state: coSttnState) => { + return { + ...state, + coSttn: { + ...state.coSttn, + excelList: coSttnRes.data, + //isInit: false, + }, + }; + }); + } else + set((state: coSttnState) => { + return { + ...state, + coSttn: { + ...state.coSttn, + coSttnRes: coSttnRes.data, + isInit: false, + coSttnResCount: coSttnRes.count, + }, + }; + }); + } catch (erTxt) { + console.log("error", erTxt); + } + }, + coSttnTxtSearch: async (pageNo: string, pageCnt: string, con: string, txt: string) => { + try { + const coSttnRes = await getFetchWithCount( + fetchType.WR, + `/reuseFc/request/${pageNo}/${pageCnt}/${con}/${txt}`) + set((state: coSttnState) => { + return { + ...state, + coSttn: { + ...state.coSttn, + coSttnRes: coSttnRes.data, + coSttnResCount: coSttnRes.count, + isInit: false, + } } + }) + } catch (erTxt) { + console.log("error", erTxt); + } + }, + coSttnPwInit: async (dmdInfoId: string) => { + try { + const response = await putFectch(`/reuseFc/request/chgPassword/${dmdInfoId}`,[]) + if (response.status === 200) { + toast.success('비밀번호가 초기화 되었습니다.') + } else { + toast.error('비밀번호 초기화에 실패하였습니다') } + set((state: coSttnState) => { + return { + ...state, + coSttn: { + ...state.coSttn, + isInit: false, + } + } + }); + } catch (err) { + console.log(err); + toast.error('비밀번호 초기화에 실패하였습니다.') + + } + } } } \ No newline at end of file diff --git a/apps/wr/public/locales/ko/message.json b/apps/wr/public/locales/ko/message.json index d3c55de5e..859df00cf 100644 --- a/apps/wr/public/locales/ko/message.json +++ b/apps/wr/public/locales/ko/message.json @@ -1,10 +1,10 @@ { - "deleteMsg" : "{{name}}가 삭제되었습니다.", + "deleteMsg": "{{name}}가 삭제되었습니다.", "insertMsg": "{{name}}가 저장되었습니다.", "updateMsg": "{{name}}가 수정되었습니다.", - "errorMsg": "{{name}} 중 오류가 발생했습니다.", + "errorMsg": "{{name}} 중 오류가 발생했습니다.", "fileErrMsg": "빈 파일 또는 파일 오류입니다.", - "selectErrMsg": "{{name}}을(를) 선택해주세요.", + "selectErrMsg": "{{name}}을(를) 선택해주세요.", "noChangedErrMsg": "변경사항이 없습니다.", "dateErrMsg": "시작년도를 종료년도 이후로 설정할 수 없습니다.", "fileDateErrMsg": "파일업로드 이전에 등록년도를 작성해주세요.", @@ -12,19 +12,15 @@ "isUpdateMsg": "수정한 정보를 저장하시겠습니까?", "isInsertMsg": "등록하시겠습니까?", "isUpdatetMsg": "수정하시겠습니까?", - "matchFinishMsg" : "{{name}}이(가) 완료되었습니다.", + "matchFinishMsg": "{{name}}이(가) 완료되었습니다.", "excelDownErrMsg": "다운로드할 데이터가 없습니다.", - "isMatchFinishMsg":" 매칭완료를 진행하시겠습니까?", - "isNotMatchFinishMsg":"검토완료중 매칭완료 여부를 체크한 항목이 없습니다.", - "canNotChangeMatStateMsg":"매칭완료된 항목은 상태를 변경할 수 없습니다.", - - - + "isMatchFinishMsg": " 매칭완료를 진행하시겠습니까?", + "isNotMatchFinishMsg": "검토완료중 매칭완료 여부를 체크한 항목이 없습니다.", + "canNotChangeMatStateMsg": "매칭완료된 항목은 상태를 변경할 수 없습니다.", + "isInitPw": "비밀번호를 초기화하시겠습니까?", "alreadyInsertedErrMsg": "사업자번호 {{num}}(은)는 이미 등록되었습니다. 다시 등록해주세요.", "saveRowErrMsg": "수정을 원하는 행을 선택하고 저장버튼을 눌러주세요.", - "costCalcErrMsg":"공사비 계산 진행 후 저장을 눌러주세요", + "costCalcErrMsg": "공사비 계산 진행 후 저장을 눌러주세요", "maxYearErrMsg": "최대 {{year}}년까지 선택가능합니다.", "checkQtyMsg": "요구수량(m³/일)을 확인해주세요 계산할 수 없습니다." - -} - +} \ No newline at end of file From 96a50e4f5a48311f7a3b34560ae846e81111f873 Mon Sep 17 00:00:00 2001 From: jyha00 <jyha@mind-one.co.kr> Date: Thu, 31 Jul 2025 20:01:25 +0900 Subject: [PATCH 15/36] =?UTF-8?q?=EC=88=98=EC=9A=94=EC=B2=98=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94=20=EC=9A=94=EC=B2=AD=20cursor-point?= =?UTF-8?q?er=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/dm/components/ui/sdmLoginForm/component.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dm/components/ui/sdmLoginForm/component.tsx b/apps/dm/components/ui/sdmLoginForm/component.tsx index 6f4e2c959..75852a4da 100644 --- a/apps/dm/components/ui/sdmLoginForm/component.tsx +++ b/apps/dm/components/ui/sdmLoginForm/component.tsx @@ -185,7 +185,7 @@ export function SdmLoginForm() { > 로그인 </Button> - <div className="text-xl mt-2 text-gray-400" onClick={initPassword}>비밀번호 초기화 요청</div> + <div className="text-xl mt-2 text-gray-400 cursor-pointer" onClick={initPassword}>비밀번호 초기화 요청</div> </div> </div> </div> From cb0f3160230da1d5a70e0e527e62bfe0af0d6d04 Mon Sep 17 00:00:00 2001 From: jyha00 <jyha@mind-one.co.kr> Date: Thu, 31 Jul 2025 20:11:10 +0900 Subject: [PATCH 16/36] =?UTF-8?q?=EC=88=98=EC=9A=94=EC=B2=98=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94=20=EC=B6=94=EA=B0=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/coMng/coSttn/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/wr/app/matMng/coMng/coSttn/page.tsx b/apps/wr/app/matMng/coMng/coSttn/page.tsx index 1dbf511eb..75e1ecff7 100644 --- a/apps/wr/app/matMng/coMng/coSttn/page.tsx +++ b/apps/wr/app/matMng/coMng/coSttn/page.tsx @@ -192,7 +192,7 @@ export default function CoSttn() { value={objSearch.city} /> <SelectBox - className="col-span-3 w-1/6 h-full text-2xl" + className="col-span-3 w-1/6 h-full text-2xl ml-4" label="시군구" selectClass={""} selectArray={selectSgg || []} @@ -200,7 +200,7 @@ export default function CoSttn() { value={objSearch.sgg} /> <SearchInput - className={"!text-3xl"} + className={"!text-3xl ml-4"} label="회사명" textValue={seartchTxt ?? ""} setText={(e) => { From 8eea3c75aa82327ae5d670640afc242933766332 Mon Sep 17 00:00:00 2001 From: leedj312 <dlehd467@gmail.com> Date: Thu, 31 Jul 2025 20:16:38 +0900 Subject: [PATCH 17/36] =?UTF-8?q?=EC=88=98=EC=9A=94=EB=A7=A4=EC=B9=AD=20?= =?UTF-8?q?=EA=B2=80=ED=86=A0=20=EC=9D=B4=EC=83=81=20=EC=9D=B4=ED=95=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/coMat/coMatRvw/page.tsx | 307 +++++++++++++-------- 1 file changed, 185 insertions(+), 122 deletions(-) diff --git a/apps/wr/app/matMng/coMat/coMatRvw/page.tsx b/apps/wr/app/matMng/coMat/coMatRvw/page.tsx index ff35b95c5..996b624d8 100644 --- a/apps/wr/app/matMng/coMat/coMatRvw/page.tsx +++ b/apps/wr/app/matMng/coMat/coMatRvw/page.tsx @@ -376,87 +376,116 @@ export default function CoMatRvw() { <div className="col-span-12 w-full"> <h1 className={formH1Class}>요구수질</h1> </div> - <div className="col-span-3 mt-4"> + <div className="col-span-2 mt-4"> <FormField control={form.control} name="grssClfg" render={({ field }) => ( - <FormUi label="총대장균군수 (개/100ml)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - readOnly - /> + <FormUi label={"총대장균군수(개/mg)"}> + <div className="flex items-center gap-2"> + <div className="relative flex-1 min-w-0"> + <Input + type="text" + className="w-full pr-16 border py-2 text-right rounded-md" + placeholder="" + value={ + field.value != -1 + ? `${field.value}` + : "불검출" + } + readOnly + /> + {/* TODO: 총대장균군수 확인 필요*/} + {field.value != -1 ? ( + <span className="text-xl absolute inset-y-0 right-3 flex items-center text-gray-500 pointer-events-none"> + 이하 + </span> + ) : ( + <></> + )} + </div> + </div> </FormUi> )} /> </div> - <div className="col-span-3 mt-4"> + <div className="col-span-2 mt-4"> <FormField control={form.control} name="combResdch" render={({ field }) => ( - <FormUi label="결합잔류염소(mg/L)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - readOnly - /> + <FormUi label={"결합잔류염소(mg/L)"}> + <div className="flex items-center gap-2"> + <div className="relative flex-1 min-w-0"> + <Input + type="text" + className="w-full pr-16 border py-2 text-right rounded-md" + placeholder="" + value={field.value ?? ""} + readOnly + /> + <span className="text-xl absolute inset-y-0 right-3 flex items-center text-gray-500 pointer-events-none"> + 이상 + </span> + </div> + </div> </FormUi> )} /> </div> - <div className="col-span-3 mt-4"> + <div className="col-span-2 mt-4"> <FormField control={form.control} name="trbt" render={({ field }) => ( <FormUi label="탁도(NTU)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - readOnly - /> + <div className="flex items-center gap-2"> + <div className="relative flex-1 min-w-0"> + <Input + placeholder="" + className="w-full pr-16 border py-2 text-right rounded-md" + type="text" + value={field.value ?? 0} + readOnly + /> + <span className=" text-xl absolute inset-y-0 right-3 flex items-center text-gray-500 pointer-events-none"> + 이하 + </span> + </div> + </div> </FormUi> )} /> </div> - <div className="col-span-3 mt-4"> + <div className="col-span-2 mt-4"> <FormField control={form.control} name="blgcOxygDmndQnt" render={({ field }) => ( <FormUi label="생물학적 산소요구량(BOD)(mg/L)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - readOnly - /> + <div className="flex items-center gap-2"> + <div className="relative flex-1 min-w-0"> + <Input + placeholder="" + type="text" + className="w-full pr-16 border py-2 text-right rounded-md" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? ""} + readOnly + /> + <span className="text-xl absolute inset-y-0 right-3 flex items-center text-gray-500 pointer-events-none"> + 이하 + </span> + </div> + </div> </FormUi> )} /> </div> - <div className="col-span-3 mt-4"> + <div className="col-span-2 mt-4"> <FormField control={form.control} name="smll" @@ -464,138 +493,172 @@ export default function CoMatRvw() { <FormUi label="냄새"> <Input placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} + type="text" + value={field.value ?? ""} readOnly /> </FormUi> )} /> </div> - <div className="col-span-3 mt-4"> + <div className="col-span-2 mt-4"> <FormField control={form.control} name="crmty" render={({ field }) => ( <FormUi label="색도(도)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - readOnly - /> + <div className="flex items-center gap-2"> + <div className="relative flex-1 min-w-0"> + <Input + placeholder="" + className="w-full pr-16 border py-2 text-right rounded-md" + type="text" + step="0.1" + value={field.value ?? ""} + readOnly + /> + <span className="text-xl absolute inset-y-0 right-3 flex items-center text-gray-500 pointer-events-none"> + 이하 + </span> + </div> + </div> </FormUi> )} /> </div> - <div className="col-span-3 mt-4"> + <div className="col-span-2 mt-4"> <FormField control={form.control} name="tn" render={({ field }) => ( - <FormUi label="총질소 (T-N)(mg/L)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - readOnly - /> + <FormUi label="총질소(T-N)(mg/L)"> + <div className="flex items-center gap-2"> + <div className="relative flex-1 min-w-0"> + <Input + placeholder="" + className="w-full pr-16 border py-2 text-right rounded-md" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + readOnly + /> + <span className="text-xl absolute inset-y-0 right-3 flex items-center text-gray-500 pointer-events-none"> + 이하 + </span> + </div> + </div> </FormUi> )} /> </div> - <div className="col-span-3 mt-4"> + <div className="col-span-2 mt-4"> <FormField control={form.control} name="tph" render={({ field }) => ( <FormUi label="총인(T-P)(mg/L)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - readOnly - /> + <div className="flex items-center gap-2"> + <div className="relative flex-1 min-w-0"> + <Input + placeholder="" + className="w-full pr-16 border py-2 text-right rounded-md" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + readOnly + /> + <span className="text-xl absolute inset-y-0 right-3 flex items-center text-gray-500 pointer-events-none"> + 이하 + </span> + </div> + </div> </FormUi> )} /> </div> - <div className="col-span-3 mt-4"> + <div className="col-span-2 mt-4"> <FormField control={form.control} name="ph" render={({ field }) => ( - <FormUi label="수소이온농도(pH)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - readOnly - /> + <FormUi label="수소이온농도(PH)"> + <div className="flex items-center gap-2"> + <div className="relative flex-1 min-w-0"> + <Input + placeholder="" + className="w-full pr-16 border py-2 text-right rounded-md" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + readOnly + /> + </div> + </div> </FormUi> )} /> </div> - <div className="col-span-3 mt-4"> + <div className="col-span-2 mt-4"> <FormField control={form.control} name="clIonQnt" render={({ field }) => ( <FormUi label="염화물(mgCL/L)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - readOnly - /> + <div className="flex items-center gap-2"> + <div className="relative flex-1 min-w-0"> + <Input + placeholder="" + className="w-full pr-16 border py-2 text-right rounded-md" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + readOnly + /> + <span className="text-xl absolute inset-y-0 right-3 flex items-center text-gray-500 pointer-events-none"> + 이하 + </span> + </div> + </div> </FormUi> )} /> </div> - <div className="col-span-3 mt-4"> + <div className="col-span-2 mt-4"> <FormField control={form.control} name="cdtnv" render={({ field }) => ( <FormUi label="전기전도도(㎲/cm)"> - <Input - placeholder="" - type="number" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - readOnly - /> + <div className="flex items-center gap-2"> + <div className="relative flex-1 min-w-0"> + <Input + placeholder="" + className="w-full pr-16 border py-2 text-right rounded-md" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + readOnly + /> + <span className="text-xl absolute inset-y-0 right-3 flex items-center text-gray-500 pointer-events-none"> + 이하 + </span> + </div> + </div> </FormUi> )} /> </div> - <div className="col-span-3 mt-4"> + <div className="col-span-2 mt-4"> <FormField control={form.control} name="rmrk" @@ -648,7 +711,7 @@ export default function CoMatRvw() { form={form} type={"mat"} selectionVersion={selectionVersion} - readonly={regAuthrtYn ==="N"} + readonly={regAuthrtYn === "N"} /> </ListDiv> {/* </ScrollArea> */} From e54a0d0ef8e2c27aa710860cd1b4bbe8c1055da7 Mon Sep 17 00:00:00 2001 From: leedj312 <dlehd467@gmail.com> Date: Fri, 1 Aug 2025 11:37:23 +0900 Subject: [PATCH 18/36] =?UTF-8?q?=EC=88=98=EC=9A=94=EC=8B=A0=EC=B2=AD?= =?UTF-8?q?=ED=98=84=ED=99=A9=20=EC=9D=B4=EC=83=81/=EC=9D=B4=ED=95=98=20?= =?UTF-8?q?=EC=9E=91=EC=97=85=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/sdmMng/sdmApplyList/page.tsx | 20 +++++++++---------- apps/dm/app/store/sdmMng/index.tsx | 1 - .../ui/sdmInfoInsertForm/component.tsx | 2 -- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/apps/dm/app/(base-layout)/pages/sdmMng/sdmApplyList/page.tsx b/apps/dm/app/(base-layout)/pages/sdmMng/sdmApplyList/page.tsx index ee86a9df5..9c2f6201e 100644 --- a/apps/dm/app/(base-layout)/pages/sdmMng/sdmApplyList/page.tsx +++ b/apps/dm/app/(base-layout)/pages/sdmMng/sdmApplyList/page.tsx @@ -123,33 +123,33 @@ export default function SdmApplyList({}: SdmApplyProps) { </TableRow> <TableRow> <TableCell colSpan={1} className={TABLE_STYLES.header}>총대장균군수(개/100ml)</TableCell> - <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.grssClfg ?? ''} format="number"/>}</TableCell> + <TableCell colSpan={1} className={TABLE_STYLES.cell}>{ sdmApplyDetail?.grssClfg!=-1?<TransValueFormat value={sdmApplyDetail?.grssClfg ?? ''} format="number"/>:''} {sdmApplyDetail?.grssClfg?sdmApplyDetail.grssClfg!=-1? '이하':'불검출':'-'} </TableCell> <TableCell colSpan={1} className={TABLE_STYLES.header}>결합잔류염소(mg/L)​</TableCell> - <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.combResdch ?? ''} format="number"/>}</TableCell> + <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.combResdch ?? ''} format="number"/>} {sdmApplyDetail?.combResdch?'이하':'-'}</TableCell> <TableCell colSpan={1} className={TABLE_STYLES.header}>탁도(NTU)</TableCell> - <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.trbt ?? ''} format="number"/>}</TableCell> + <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.trbt ?? ''} format="number"/>} {sdmApplyDetail?.trbt?'이하':'-'}</TableCell> </TableRow> <TableRow> <TableCell colSpan={1} className={TABLE_STYLES.header}>생물학적 산소요구량(BOD)(mg/L)</TableCell> - <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.blgcOxygDmndQnt ?? ''} format="number"/>}</TableCell> + <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.blgcOxygDmndQnt ?? ''} format="number"/>} {sdmApplyDetail?.blgcOxygDmndQnt?'이하':'-'}</TableCell> <TableCell colSpan={1} className={TABLE_STYLES.header}>냄새</TableCell> - <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.smll} format="number"/>}</TableCell> + <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.smll} format="number"/>} {sdmApplyDetail?.smll?'이하':'-'}</TableCell> <TableCell colSpan={1} className={TABLE_STYLES.header}>색도(도)</TableCell> - <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.crmty ?? ''} format="number"/>}</TableCell> + <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.crmty ?? ''} format="number"/>} {sdmApplyDetail?.crmty?'이하':'-'}</TableCell> </TableRow> <TableRow> <TableCell colSpan={1} className={TABLE_STYLES.header}>총질소(T-N)(mg/L)</TableCell> - <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.tn ?? ''} format="number"/>}</TableCell> + <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.tn ?? ''} format="number"/>} {sdmApplyDetail?.tn?'이하':'-'}</TableCell> <TableCell colSpan={1} className={TABLE_STYLES.header}>총인(T-P)(mg/L)​</TableCell> - <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.tph ?? ''} format="number"/>}</TableCell> + <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.tph ?? ''} format="number"/>} {sdmApplyDetail?.tph?'이하':'-'}</TableCell> <TableCell colSpan={1} className={TABLE_STYLES.header}>수소이온농도(pH)​</TableCell> <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.ph} format="number"/>}</TableCell> </TableRow> <TableRow> <TableCell colSpan={1} className={TABLE_STYLES.header}>염화물(mgCL/L)​</TableCell> - <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.clIonQnt ?? ''} format="number"/>}</TableCell> + <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.clIonQnt ?? ''} format="number"/>} {sdmApplyDetail?.clIonQnt?'이하':'-'}</TableCell> <TableCell colSpan={1} className={TABLE_STYLES.header}>전기전도도(㎲/cm)​</TableCell> - <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.cdtnv ?? ''} format="number"/>}</TableCell> + <TableCell colSpan={1} className={TABLE_STYLES.cell}>{<TransValueFormat value={sdmApplyDetail?.cdtnv ?? ''} format="number"/>} {sdmApplyDetail?.cdtnv?'이하':'-'}</TableCell> <TableCell colSpan={1} className={TABLE_STYLES.header}>비고</TableCell> <TableCell colSpan={1} className={TABLE_STYLES.cell}>{sdmApplyDetail?.rmrk}</TableCell> </TableRow> diff --git a/apps/dm/app/store/sdmMng/index.tsx b/apps/dm/app/store/sdmMng/index.tsx index d68a34e2f..6a6628339 100644 --- a/apps/dm/app/store/sdmMng/index.tsx +++ b/apps/dm/app/store/sdmMng/index.tsx @@ -298,7 +298,6 @@ const useTypesData : SelectDataType[] = [ { text: "농업_간접용수", val: "농업_간접용수" }, { text: "농업_직접용수", val: "농업_직접용수" }, { text: "하천", val: "하천" }, - { text: "지하수", val: "지하수" }, { text: "공업", val: "공업" }, ]; diff --git a/apps/dm/components/ui/sdmInfoInsertForm/component.tsx b/apps/dm/components/ui/sdmInfoInsertForm/component.tsx index 478c61ac3..7d6c41f24 100644 --- a/apps/dm/components/ui/sdmInfoInsertForm/component.tsx +++ b/apps/dm/components/ui/sdmInfoInsertForm/component.tsx @@ -159,8 +159,6 @@ export function SdmInfoRegForm({ // Apply default values const defaults = defaultRules[usePurpose]; - console.log("usePurpose", usePurpose); - console.log("defaults", defaults); if (defaults) { Object.entries(defaults).forEach(([field, value]) => { form.setValue(field as keyof FormData, value, { shouldDirty: true }); From 312c06be3149251faab90fa11bb430c00573f760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=80=EC=B2=A0?= <jcchoi@onasys.co.kr> Date: Fri, 1 Aug 2025 14:29:58 +0900 Subject: [PATCH 19/36] =?UTF-8?q?=EB=A9=94=EB=89=B4=20INFO=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B0=9C=EC=9D=B8=EC=A0=95=EB=B3=B4=EC=A0=9C=EA=B3=B5=EB=8F=99?= =?UTF-8?q?=EC=9D=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/src/pages/menu/ui/base-menu-form.tsx | 18 +++++- apps/cs/src/pages/menu/ui/type-menu-form.tsx | 58 +++++++++++++++---- .../pages/survey/ui/view-survey-article.tsx | 23 ++++++++ apps/cs/src/shared/ui/info-tooltip.tsx | 9 ++- 4 files changed, 94 insertions(+), 14 deletions(-) diff --git a/apps/cs/src/pages/menu/ui/base-menu-form.tsx b/apps/cs/src/pages/menu/ui/base-menu-form.tsx index ff27db932..b36179ac8 100644 --- a/apps/cs/src/pages/menu/ui/base-menu-form.tsx +++ b/apps/cs/src/pages/menu/ui/base-menu-form.tsx @@ -64,7 +64,10 @@ function BaseMenuForm({ form, menuCd }: BaseMenuFormProps) { </TableCell> </TableRow> <TableRow> - <TableHead>메뉴 영문명</TableHead> + <TableHead> + 메뉴 영문명 + <InfoTooltip text="메뉴 영문명을 입력하십시오." /> + </TableHead> <TableCell className="border"> <FormField control={form.control} @@ -85,7 +88,18 @@ function BaseMenuForm({ form, menuCd }: BaseMenuFormProps) { </TableCell> </TableRow> <TableRow> - <TableHead data-required>메뉴 유형</TableHead> + <TableHead data-required> + 메뉴 유형 + <InfoTooltip + text="메뉴 유형을 선택하십시오.\n + 빈메뉴 : 메뉴가 비어있는 경우\n + 내부링크 : 내부 페이지로 연결되는 메뉴 표시\n + 외부링크 : 외부 URL로 연결되는 메뉴 표시\n + 콘텐츠 : 콘텐츠 페이지로 연결되는 메뉴 표시\n + 게시판 : 게시판 페이지로 연결되는 메뉴 표시\n + 하단메뉴 : 하단 메뉴로 표시되는 경우" + /> + </TableHead> <TableCell className="border"> <FormField control={form.control} diff --git a/apps/cs/src/pages/menu/ui/type-menu-form.tsx b/apps/cs/src/pages/menu/ui/type-menu-form.tsx index 41c0741e8..b64b6063c 100644 --- a/apps/cs/src/pages/menu/ui/type-menu-form.tsx +++ b/apps/cs/src/pages/menu/ui/type-menu-form.tsx @@ -17,6 +17,7 @@ import type { BoardPopup } from "@/entities/board"; import type { Contents } from "@/entities/content"; import type { TreeUser } from "@/entities/user-organization"; import type { MenuFormData, MenuType } from "@/entities/menu"; +import { InfoTooltip } from "@/shared/ui/info-tooltip"; import { FormItem, FormControl, FormField } from "@/shared/ui/form"; import { OrganizationSearchDialog } from "./organization-search-dialog"; import { ContentSearchDialog } from "./content-search-dialog"; @@ -75,7 +76,10 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { <TableBody> {menuType === "CONTENTS" && ( <TableRow> - <TableHead>콘텐츠</TableHead> + <TableHead data-required> + 콘텐츠 + <InfoTooltip text="메뉴에 표시될 콘텐츠를 조회 후 선택하십시오. 콘텐츠 선택시 해당 게시판에 메뉴에 링크됩니다." /> + </TableHead> <TableCell className="border"> <div className="flex items-center gap-2"> <div className="h-[3.2rem] w-1/2 cursor-not-allowed overflow-hidden whitespace-nowrap break-keep rounded-md border border-input bg-form px-3 py-2 text-[1.3rem] opacity-50"> @@ -92,7 +96,10 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { )} {menuType === "BOARD" && ( <TableRow> - <TableHead>게시판</TableHead> + <TableHead data-required> + 게시판 + <InfoTooltip text="메뉴에 표시될 게시판을 조회 후 선택하십시오. 게시판 선택시 해당 게시판에 메뉴에 링크됩니다." /> + </TableHead> <TableCell className="border"> <div className="flex items-center gap-2"> <div className="h-[3.2rem] w-1/2 cursor-not-allowed overflow-hidden whitespace-nowrap break-keep rounded-md border border-input bg-form px-3 py-2 text-[1.3rem] opacity-50"> @@ -110,7 +117,10 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { menuType === "INSIDE" || menuType === "OUTSIDE") && ( <TableRow> - <TableHead>연결 URL</TableHead> + <TableHead data-required> + 연결 URL + <InfoTooltip text="메뉴 클릭시 연결될 URL을 입력하여 주십시오." /> + </TableHead> <TableCell className="border"> <FormField control={form.control} @@ -139,7 +149,12 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { menuType === "INSIDE" || menuType === "OUTSIDE") && ( <TableRow> - <TableHead>연결 형태</TableHead> + <TableHead> + 연결 형태 + <InfoTooltip + text="메뉴 클릭시 클릭된 링크가 열릴 창을 선택하여 주십시오. 현재창 : 현재 윈도우창에 그대로 링크된 메뉴 표시 새창 : 새 윈도우 창을 열어서 메뉴 표시" + /> + </TableHead> <TableCell className="border"> <FormField control={form.control} @@ -171,7 +186,10 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { )} {(menuType === "CONTENTS" || menuType === "BOARD") && ( <TableRow> - <TableHead data-required>메뉴 평가 사용 여부</TableHead> + <TableHead data-required> + 메뉴 평가 사용 여부 + <InfoTooltip text="메뉴 평가 사용 여부를 선택하십시오. 사용시 콘텐츠 하단에 메뉴 평가 영역이 표시됩니다." /> + </TableHead> <TableCell className="border"> <FormField control={form.control} @@ -204,7 +222,10 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { {/* 메뉴 유형 공통 폼 S */} <TableRow> - <TableHead>메뉴 서브명</TableHead> + <TableHead> + 메뉴 서브명 + <InfoTooltip text="메뉴 서브명을 입력하십시오. 사이트맵에서 다른 이름으로 사용할 경우 입력하십시오." /> + </TableHead> <TableCell className="border"> <FormField control={form.control} @@ -225,7 +246,10 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { </TableCell> </TableRow> <TableRow> - <TableHead>메뉴 아이콘</TableHead> + <TableHead> + 메뉴 아이콘 + <InfoTooltip text="메뉴 아이콘을 선택하십시오. 메뉴트리에 표시됩니다." /> + </TableHead> <TableCell className="border"> <div className="flex gap-2"> <div className="h-[3.2rem] w-[21.5rem] cursor-not-allowed rounded-md border border-input bg-form px-3 py-2 text-[1.3rem] opacity-50"> @@ -237,7 +261,10 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { </TableCell> </TableRow> <TableRow> - <TableHead data-required>출력 여부</TableHead> + <TableHead data-required> + 사이트맵 출력 여부 + <InfoTooltip text="출력 여부를 선택하십시오. 사용시 사이트맵에 출력됩니다." /> + </TableHead> <TableCell className="border"> <FormField control={form.control} @@ -268,7 +295,10 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { </TableCell> </TableRow> <TableRow> - <TableHead data-required>사용 여부</TableHead> + <TableHead data-required> + 사용 여부 + <InfoTooltip text="사용여부을 선택하십시오." /> + </TableHead> <TableCell className="border"> <FormField control={form.control} @@ -303,7 +333,10 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { {(menuType === "CONTENTS" || menuType === "BOARD") && ( <> <TableRow> - <TableHead>QR코드</TableHead> + <TableHead> + QR코드 + <InfoTooltip text="QR 코드 사용여부를 선택하십시오. 사용시 QR 코드 출력팝업이 표시됩니다." /> + </TableHead> <TableCell className="border"> <FormField control={form.control} @@ -338,7 +371,10 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { </TableCell> </TableRow> <TableRow> - <TableHead>담당자</TableHead> + <TableHead> + 담당자 + <InfoTooltip text="메뉴 담당자를 조회 후 선택하십시오.메뉴 클릭시 하단 영역에 담당자가 표시됩니다." /> + </TableHead> <TableCell className="border"> <div className="flex items-center gap-6"> <div className="flex items-center gap-2"> diff --git a/apps/cs/src/pages/survey/ui/view-survey-article.tsx b/apps/cs/src/pages/survey/ui/view-survey-article.tsx index 58f52d090..5caf6d129 100644 --- a/apps/cs/src/pages/survey/ui/view-survey-article.tsx +++ b/apps/cs/src/pages/survey/ui/view-survey-article.tsx @@ -187,8 +187,31 @@ function ViewSurveyArticle({ srvySn }: { srvySn: string }) { )} /> </div> + </div> </div> + + {/* 개인정보제공동의 */} + <div className="mt-6 p-4 border border-gray-200 rounded-md bg-gray-50"> + <div className="flex items-start gap-3"> + <Checkbox + id="privacy-consent" + className="mt-1" + required + /> + <div className="flex-1"> + <Label htmlFor="privacy-consent" className="text-[1.3rem] font-medium"> + 개인정보제공동의 + </Label> + <p className="mt-2 text-[1.0rem] text-gray-600 leading-relaxed"> + 본 설문조사에서 수집된 개인정보는 설문조사 목적으로만 사용되며, + 통계 처리 및 연구 목적으로 활용됩니다. 제공된 정보는 안전하게 보호되며, + 동의하지 않으시면 설문 참여가 제한됩니다. + </p> + </div> + </div> + </div> + <hr className="my-8" /> <div className="h-[8rem] overflow-auto rounded-sm bg-accent p-4 text-accent-foreground"> {userSurvey?.srvyWrtGdCn} diff --git a/apps/cs/src/shared/ui/info-tooltip.tsx b/apps/cs/src/shared/ui/info-tooltip.tsx index 11cb33e07..2c43ecf9c 100644 --- a/apps/cs/src/shared/ui/info-tooltip.tsx +++ b/apps/cs/src/shared/ui/info-tooltip.tsx @@ -7,7 +7,14 @@ function InfoTooltip({ text }: { text: string }) { <i className="diveicon di-info-circle" /> </TooltipTrigger> <TooltipContent> - <p>{text}</p> + <p> + {text.split("\n").map((line, idx) => ( + <span key={idx}> + {line} + {idx !== text.split("\n").length - 1 && <br />} + </span> + ))} + </p> </TooltipContent> </Tooltip> ); From f5a49a44c476118f8445dab36e5814cd96b51718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=80=EC=B2=A0?= <jcchoi@onasys.co.kr> Date: Fri, 1 Aug 2025 14:34:19 +0900 Subject: [PATCH 20/36] =?UTF-8?q?=EA=B3=B5=ED=86=B5=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=202FA=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cm/.env.example | 7 + apps/cm/.gitignore | 41 +++ apps/cm/.prettierrc | 3 + apps/cm/app/api/auth/logout/route.ts | 17 + apps/cm/app/api/proxy/[...url]/route.ts | 145 ++++++++ apps/cm/app/auth/login/page.tsx | 2 + apps/cm/app/dashboard/page.tsx | 2 + apps/cm/app/layout.tsx | 8 + apps/cm/eslint.config.mjs | 21 ++ apps/cm/middleware.ts | 79 +++++ apps/cm/next.config.ts | 40 +++ apps/cm/package.json | 63 ++++ apps/cm/pages/.gitkeep | 0 apps/cm/postcss.config.mjs | 8 + apps/cm/public/favicon.ico | Bin 0 -> 4286 bytes apps/cm/public/images/bg_login.jpg | Bin 0 -> 135228 bytes apps/cm/public/images/img_cc_by.png | Bin 0 -> 4498 bytes apps/cm/public/images/img_cc_by_nc.png | Bin 0 -> 5637 bytes apps/cm/public/images/img_cc_by_nc_nd.png | Bin 0 -> 6651 bytes apps/cm/public/images/img_cc_by_nc_sa.png | Bin 0 -> 6694 bytes apps/cm/public/images/img_cc_by_nd.png | Bin 0 -> 5510 bytes apps/cm/public/images/img_cc_by_sa.png | Bin 0 -> 5668 bytes apps/cm/public/images/img_opentype01.png | Bin 0 -> 3246 bytes apps/cm/public/images/img_opentype02.png | Bin 0 -> 3628 bytes apps/cm/public/images/img_opentype03.png | Bin 0 -> 3605 bytes apps/cm/public/images/img_opentype04.png | Bin 0 -> 4117 bytes apps/cm/src/app/index.tsx | 20 ++ apps/cm/src/app/providers/app-provider.tsx | 49 +++ apps/cm/src/app/providers/index.ts | 1 + apps/cm/src/app/styles/base.css | 21 ++ apps/cm/src/app/styles/components.css | 129 ++++++++ .../cm/src/entities/auth/api/login-service.ts | 85 +++++ apps/cm/src/entities/auth/index.ts | 2 + .../cm/src/entities/auth/lib/auth-wrapper.tsx | 49 +++ .../cm/src/entities/auth/lib/token-manager.ts | 59 ++++ .../entities/auth/model/login-interface.ts | 9 + .../cm/src/entities/menu-authority/@x/menu.ts | 1 + .../src/entities/menu-authority/@x/posting.ts | 1 + .../api/menu-authority-service.ts | 50 +++ apps/cm/src/entities/menu-authority/index.ts | 9 + .../model/menu-authority-interface.ts | 51 +++ .../model/menu-authority-table-columns.tsx | 117 +++++++ .../menu-authority/ui/authority-button.tsx | 26 ++ .../ui/management-authority-dialog.tsx | 101 ++++++ apps/cm/src/entities/menu/api/menu-service.ts | 79 +++++ apps/cm/src/entities/menu/index.ts | 12 + .../cm/src/entities/menu/lib/menu-wrapper.tsx | 58 ++++ apps/cm/src/entities/menu/lib/utils.ts | 20 ++ .../src/entities/menu/model/menu-interface.ts | 107 ++++++ apps/cm/src/pages/auth/login/index.ts | 1 + apps/cm/src/pages/auth/login/ui/OtpModal.tsx | 153 +++++++++ .../cm/src/pages/auth/login/ui/TwoFAModal.tsx | 198 +++++++++++ .../cm/src/pages/auth/login/ui/login-page.tsx | 276 ++++++++++++++++ apps/cm/src/pages/auth/login/ui/login.css | 311 ++++++++++++++++++ apps/cm/src/pages/dashboard/index.ts | 1 + .../src/pages/dashboard/ui/dashboard-page.tsx | 94 ++++++ apps/cm/src/shared/api/client.ts | 11 + apps/cm/src/shared/api/index.ts | 1 + apps/cm/src/shared/config/api.ts | 73 ++++ apps/cm/src/shared/config/env.ts | 11 + apps/cm/src/shared/config/index.ts | 2 + apps/cm/src/shared/lib/cookie.ts | 29 ++ apps/cm/src/shared/lib/index.ts | 8 + apps/cm/src/shared/lib/match-query-status.ts | 65 ++++ apps/cm/src/shared/lib/use-alert-store.ts | 14 + .../cm/src/shared/lib/use-attachment-store.ts | 14 + apps/cm/src/shared/lib/use-data-table.tsx | 42 +++ apps/cm/src/shared/lib/use-menu-store.ts | 14 + .../src/shared/lib/use-mutation-wrapper.tsx | 29 ++ apps/cm/src/shared/lib/use-prompt.tsx | 26 ++ apps/cm/src/shared/lib/use-select-prompt.tsx | 48 +++ apps/cm/src/shared/lib/use-tus.ts | 90 +++++ apps/cm/src/shared/lib/use-user-store.ts | 14 + apps/cm/src/shared/model/api-interface.ts | 34 ++ apps/cm/src/shared/model/index.ts | 1 + apps/cm/src/shared/providers/index.ts | 2 + .../src/shared/providers/prompt-provider.tsx | 61 ++++ .../src/shared/providers/store-provider.tsx | 38 +++ apps/cm/src/shared/store/alert-store.ts | 25 ++ apps/cm/src/shared/store/attachment-store.ts | 25 ++ apps/cm/src/shared/store/index.ts | 4 + apps/cm/src/shared/store/menu-store.ts | 93 ++++++ apps/cm/src/shared/store/user-store.ts | 57 ++++ apps/cm/src/shared/ui/alert-dialog.tsx | 34 ++ apps/cm/src/shared/ui/confirm-dialog.tsx | 48 +++ apps/cm/src/shared/ui/form.tsx | 175 ++++++++++ .../cm/src/shared/ui/grid-view-data-table.tsx | 158 +++++++++ apps/cm/src/shared/ui/info-tooltip.tsx | 23 ++ .../src/shared/ui/input-date-range-picker.tsx | 47 +++ apps/cm/src/shared/ui/no-data.tsx | 17 + apps/cm/src/shared/ui/page-layout.tsx | 22 ++ apps/cm/src/shared/ui/prompt-dialog.tsx | 49 +++ .../cm/src/shared/ui/select-prompt-dialog.tsx | 68 ++++ apps/cm/src/shared/ui/skeleton-page.tsx | 14 + apps/cm/src/shared/ui/sonner.tsx | 25 ++ apps/cm/src/shared/ui/tooltip.tsx | 61 ++++ apps/cm/src/widgets/dnd-tree/index.ts | 2 + .../src/widgets/dnd-tree/ui/custom-node.tsx | 105 ++++++ apps/cm/src/widgets/dnd-tree/ui/dnd-tree.tsx | 138 ++++++++ .../src/widgets/dnd-tree/ui/editable-node.tsx | 44 +++ apps/cm/src/widgets/form-wrapper/index.ts | 1 + .../widgets/form-wrapper/ui/form-wrapper.tsx | 63 ++++ apps/cm/start_cs.sh | 25 ++ apps/cm/tailwind.config.ts | 27 ++ apps/cm/tsconfig.json | 47 +++ pnpm-lock.yaml | 162 ++++++++- 106 files changed, 4705 insertions(+), 7 deletions(-) create mode 100644 apps/cm/.env.example create mode 100644 apps/cm/.gitignore create mode 100644 apps/cm/.prettierrc create mode 100644 apps/cm/app/api/auth/logout/route.ts create mode 100644 apps/cm/app/api/proxy/[...url]/route.ts create mode 100644 apps/cm/app/auth/login/page.tsx create mode 100644 apps/cm/app/dashboard/page.tsx create mode 100644 apps/cm/app/layout.tsx create mode 100644 apps/cm/eslint.config.mjs create mode 100644 apps/cm/middleware.ts create mode 100644 apps/cm/next.config.ts create mode 100644 apps/cm/package.json create mode 100644 apps/cm/pages/.gitkeep create mode 100644 apps/cm/postcss.config.mjs create mode 100644 apps/cm/public/favicon.ico create mode 100644 apps/cm/public/images/bg_login.jpg create mode 100644 apps/cm/public/images/img_cc_by.png create mode 100644 apps/cm/public/images/img_cc_by_nc.png create mode 100644 apps/cm/public/images/img_cc_by_nc_nd.png create mode 100644 apps/cm/public/images/img_cc_by_nc_sa.png create mode 100644 apps/cm/public/images/img_cc_by_nd.png create mode 100644 apps/cm/public/images/img_cc_by_sa.png create mode 100644 apps/cm/public/images/img_opentype01.png create mode 100644 apps/cm/public/images/img_opentype02.png create mode 100644 apps/cm/public/images/img_opentype03.png create mode 100644 apps/cm/public/images/img_opentype04.png create mode 100644 apps/cm/src/app/index.tsx create mode 100644 apps/cm/src/app/providers/app-provider.tsx create mode 100644 apps/cm/src/app/providers/index.ts create mode 100644 apps/cm/src/app/styles/base.css create mode 100644 apps/cm/src/app/styles/components.css create mode 100644 apps/cm/src/entities/auth/api/login-service.ts create mode 100644 apps/cm/src/entities/auth/index.ts create mode 100644 apps/cm/src/entities/auth/lib/auth-wrapper.tsx create mode 100644 apps/cm/src/entities/auth/lib/token-manager.ts create mode 100644 apps/cm/src/entities/auth/model/login-interface.ts create mode 100644 apps/cm/src/entities/menu-authority/@x/menu.ts create mode 100644 apps/cm/src/entities/menu-authority/@x/posting.ts create mode 100644 apps/cm/src/entities/menu-authority/api/menu-authority-service.ts create mode 100644 apps/cm/src/entities/menu-authority/index.ts create mode 100644 apps/cm/src/entities/menu-authority/model/menu-authority-interface.ts create mode 100644 apps/cm/src/entities/menu-authority/model/menu-authority-table-columns.tsx create mode 100644 apps/cm/src/entities/menu-authority/ui/authority-button.tsx create mode 100644 apps/cm/src/entities/menu-authority/ui/management-authority-dialog.tsx create mode 100644 apps/cm/src/entities/menu/api/menu-service.ts create mode 100644 apps/cm/src/entities/menu/index.ts create mode 100644 apps/cm/src/entities/menu/lib/menu-wrapper.tsx create mode 100644 apps/cm/src/entities/menu/lib/utils.ts create mode 100644 apps/cm/src/entities/menu/model/menu-interface.ts create mode 100644 apps/cm/src/pages/auth/login/index.ts create mode 100644 apps/cm/src/pages/auth/login/ui/OtpModal.tsx create mode 100644 apps/cm/src/pages/auth/login/ui/TwoFAModal.tsx create mode 100644 apps/cm/src/pages/auth/login/ui/login-page.tsx create mode 100644 apps/cm/src/pages/auth/login/ui/login.css create mode 100644 apps/cm/src/pages/dashboard/index.ts create mode 100644 apps/cm/src/pages/dashboard/ui/dashboard-page.tsx create mode 100644 apps/cm/src/shared/api/client.ts create mode 100644 apps/cm/src/shared/api/index.ts create mode 100644 apps/cm/src/shared/config/api.ts create mode 100644 apps/cm/src/shared/config/env.ts create mode 100644 apps/cm/src/shared/config/index.ts create mode 100644 apps/cm/src/shared/lib/cookie.ts create mode 100644 apps/cm/src/shared/lib/index.ts create mode 100644 apps/cm/src/shared/lib/match-query-status.ts create mode 100644 apps/cm/src/shared/lib/use-alert-store.ts create mode 100644 apps/cm/src/shared/lib/use-attachment-store.ts create mode 100644 apps/cm/src/shared/lib/use-data-table.tsx create mode 100644 apps/cm/src/shared/lib/use-menu-store.ts create mode 100644 apps/cm/src/shared/lib/use-mutation-wrapper.tsx create mode 100644 apps/cm/src/shared/lib/use-prompt.tsx create mode 100644 apps/cm/src/shared/lib/use-select-prompt.tsx create mode 100644 apps/cm/src/shared/lib/use-tus.ts create mode 100644 apps/cm/src/shared/lib/use-user-store.ts create mode 100644 apps/cm/src/shared/model/api-interface.ts create mode 100644 apps/cm/src/shared/model/index.ts create mode 100644 apps/cm/src/shared/providers/index.ts create mode 100644 apps/cm/src/shared/providers/prompt-provider.tsx create mode 100644 apps/cm/src/shared/providers/store-provider.tsx create mode 100644 apps/cm/src/shared/store/alert-store.ts create mode 100644 apps/cm/src/shared/store/attachment-store.ts create mode 100644 apps/cm/src/shared/store/index.ts create mode 100644 apps/cm/src/shared/store/menu-store.ts create mode 100644 apps/cm/src/shared/store/user-store.ts create mode 100644 apps/cm/src/shared/ui/alert-dialog.tsx create mode 100644 apps/cm/src/shared/ui/confirm-dialog.tsx create mode 100644 apps/cm/src/shared/ui/form.tsx create mode 100644 apps/cm/src/shared/ui/grid-view-data-table.tsx create mode 100644 apps/cm/src/shared/ui/info-tooltip.tsx create mode 100644 apps/cm/src/shared/ui/input-date-range-picker.tsx create mode 100644 apps/cm/src/shared/ui/no-data.tsx create mode 100644 apps/cm/src/shared/ui/page-layout.tsx create mode 100644 apps/cm/src/shared/ui/prompt-dialog.tsx create mode 100644 apps/cm/src/shared/ui/select-prompt-dialog.tsx create mode 100644 apps/cm/src/shared/ui/skeleton-page.tsx create mode 100644 apps/cm/src/shared/ui/sonner.tsx create mode 100644 apps/cm/src/shared/ui/tooltip.tsx create mode 100644 apps/cm/src/widgets/dnd-tree/index.ts create mode 100644 apps/cm/src/widgets/dnd-tree/ui/custom-node.tsx create mode 100644 apps/cm/src/widgets/dnd-tree/ui/dnd-tree.tsx create mode 100644 apps/cm/src/widgets/dnd-tree/ui/editable-node.tsx create mode 100644 apps/cm/src/widgets/form-wrapper/index.ts create mode 100644 apps/cm/src/widgets/form-wrapper/ui/form-wrapper.tsx create mode 100644 apps/cm/start_cs.sh create mode 100644 apps/cm/tailwind.config.ts create mode 100644 apps/cm/tsconfig.json diff --git a/apps/cm/.env.example b/apps/cm/.env.example new file mode 100644 index 000000000..9f786831b --- /dev/null +++ b/apps/cm/.env.example @@ -0,0 +1,7 @@ +# apps/cs/src/shared/config/env.ts 참고 +NEXT_PUBLIC_PORT=3000 +NEXT_PUBLIC_PROXY_HOST=http://localhost:3000 +NEXT_PUBLIC_SITE_ID=CS +NEXT_PUBLIC_SUB_DOMAIN=http://localhost:3000 +NEXT_PUBLIC_SERVER_API_URL=http://192.168.0.102:8000 +NEXT_PUBLIC_TINY_API_KEY=t9nc4z6inquvvd5pq1vea8wcp7lb01qmqseh6egms9vpaju2 \ No newline at end of file diff --git a/apps/cm/.gitignore b/apps/cm/.gitignore new file mode 100644 index 000000000..b63718b61 --- /dev/null +++ b/apps/cm/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +.env* +!.env.example \ No newline at end of file diff --git a/apps/cm/.prettierrc b/apps/cm/.prettierrc new file mode 100644 index 000000000..b4bfed357 --- /dev/null +++ b/apps/cm/.prettierrc @@ -0,0 +1,3 @@ +{ + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/apps/cm/app/api/auth/logout/route.ts b/apps/cm/app/api/auth/logout/route.ts new file mode 100644 index 000000000..fdcc9df7c --- /dev/null +++ b/apps/cm/app/api/auth/logout/route.ts @@ -0,0 +1,17 @@ +import { cookies } from "next/headers"; +import { NextResponse } from "next/server"; +import { + ACCESS_TOKEN, + AUTH_USER_ID, + CLAIM_NAME, + REFRESH_TOKEN, +} from "@/shared/config"; + +export async function POST() { + const cookieStore = await cookies(); + cookieStore.delete(ACCESS_TOKEN); + cookieStore.delete(REFRESH_TOKEN); + cookieStore.delete(AUTH_USER_ID); + cookieStore.delete(CLAIM_NAME); + return NextResponse.json({ message: "Logged out" }, { status: 200 }); +} diff --git a/apps/cm/app/api/proxy/[...url]/route.ts b/apps/cm/app/api/proxy/[...url]/route.ts new file mode 100644 index 000000000..761991e39 --- /dev/null +++ b/apps/cm/app/api/proxy/[...url]/route.ts @@ -0,0 +1,145 @@ +import { + ACCESS_TOKEN, + AUTH_USER_ID, + CLAIM_NAME, + REFRESH_TOKEN, + SERVER_API_URL, + SITE_ID, +} from "@/shared/config"; +import { cookies } from "next/headers"; +import { NextResponse } from "next/server"; + +async function handler( + request: Request, + params: { url: string[] }, + method: "GET" | "POST" | "PUT" | "DELETE", +) { + const cookieStore = await cookies(); + const headers: Record<string, string> = { + "Content-Type": "application/json", + "X-Site-Id": SITE_ID, + }; + let body = {}; + const isRefreshHandler = params.url.includes("refresh"); + + console.log(`[Proxy] ${method} ${params.url.join("/")}`); + console.log(`[Proxy] Server API URL: ${SERVER_API_URL}`); + + // silent refresh + if (isRefreshHandler) { + const refreshToken = cookieStore.get(REFRESH_TOKEN); + headers[CLAIM_NAME] = refreshToken?.value ?? ""; + + if (!headers[CLAIM_NAME]) { + return NextResponse.json({ message: "Can't refresh" }, { status: 401 }); + } + } + + try { + if (!isRefreshHandler) { + body = await request.json(); + console.log(`[Proxy] Request body:`, body); + } + + const targetUrl = `${SERVER_API_URL}/${params.url.join("/")}`; + console.log(`[Proxy] Target URL: ${targetUrl}`); + + const result = await fetch(targetUrl, { + method, + headers, + body: JSON.stringify(body), + }); + + console.log(`[Proxy] Response status: ${result.status}`); + console.log(`[Proxy] Response headers:`, Object.fromEntries(result.headers.entries())); + + // 2FA 관련 엔드포인트인 경우 응답 본문도 확인 + const is2FAEndpoint = params.url.includes("2fa") || params.url.includes("auth"); + let responseData = {}; + + if (is2FAEndpoint) { + try { + responseData = await result.json(); + console.log(`[Proxy] 2FA Response data:`, responseData); + } catch { + // JSON 파싱 실패 시 빈 객체 사용 + console.log(`[Proxy] Failed to parse JSON response`); + } + } + + const accessToken = result.headers.get(ACCESS_TOKEN) || result.headers.get('ss-token'); + const refreshToken = result.headers.get(REFRESH_TOKEN); + const userId = result.headers.get(AUTH_USER_ID); + + console.log(`[Proxy] Tokens - accessToken: ${!!accessToken}, userId: ${!!userId}, refreshToken: ${!!refreshToken}`); + console.log(`[Proxy] Available headers:`, Array.from(result.headers.keys())); + + // 2FA 엔드포인트이고 실패한 경우 실제 오류 메시지 반환 + if (!result.ok && is2FAEndpoint) { + console.log(`[Proxy] 2FA endpoint failed, returning actual error`); + return NextResponse.json(responseData, { status: result.status }); + } + + // 2FA 엔드포인트이고 성공한 경우 (토큰이 헤더에 없을 수 있음) + if (result.ok && is2FAEndpoint) { + console.log(`[Proxy] 2FA endpoint succeeded, returning response data`); + return NextResponse.json(responseData, { status: result.status }); + } + + // 일반적인 실패 처리 + if (!result.ok) { + console.log(`[Proxy] General endpoint failed`); + return NextResponse.json( + { message: "Invalid Credentials" }, + { status: 401 }, + ); + } + + if (accessToken && userId) { + const response = NextResponse.json({ + [ACCESS_TOKEN]: accessToken, + [AUTH_USER_ID]: userId, + ...responseData, // 2FA 관련 추가 데이터 포함 + }); + + if (refreshToken) { + cookieStore.set(REFRESH_TOKEN, refreshToken, { + httpOnly: true, + sameSite: "lax", + path: "/", + }); + } + + console.log(`[Proxy] Success response sent`); + return response; + } + + console.log(`[Proxy] Missing tokens in response`); + return NextResponse.json( + { message: "Invalid Credentials" }, + { status: 401 }, + ); + } catch (error) { + console.error(`[Proxy] Error:`, error); + return NextResponse.json( + { message: "Server Error", error }, + { status: 500 }, + ); + } +} + +export async function POST( + request: Request, + props: { params: Promise<{ url: string[] }> }, +) { + const params = await props.params; + return handler(request, params, "POST"); +} + +export async function PUT( + request: Request, + props: { params: Promise<{ url: string[] }> }, +) { + const params = await props.params; + return handler(request, params, "PUT"); +} diff --git a/apps/cm/app/auth/login/page.tsx b/apps/cm/app/auth/login/page.tsx new file mode 100644 index 000000000..8f9e6adc6 --- /dev/null +++ b/apps/cm/app/auth/login/page.tsx @@ -0,0 +1,2 @@ +import { LoginPage } from "@/pages/auth/login"; +export default LoginPage; diff --git a/apps/cm/app/dashboard/page.tsx b/apps/cm/app/dashboard/page.tsx new file mode 100644 index 000000000..53d564ac6 --- /dev/null +++ b/apps/cm/app/dashboard/page.tsx @@ -0,0 +1,2 @@ +import { DashboardPage } from "@/pages/dashboard"; +export default DashboardPage; diff --git a/apps/cm/app/layout.tsx b/apps/cm/app/layout.tsx new file mode 100644 index 000000000..aa2049dcc --- /dev/null +++ b/apps/cm/app/layout.tsx @@ -0,0 +1,8 @@ +import type { Metadata } from "next"; +import { App } from "@/app"; + +export const metadata: Metadata = { + title: "유역하수도 통합 정보플랫폼", +}; + +export default App; diff --git a/apps/cm/eslint.config.mjs b/apps/cm/eslint.config.mjs new file mode 100644 index 000000000..9109635e9 --- /dev/null +++ b/apps/cm/eslint.config.mjs @@ -0,0 +1,21 @@ +import { dirname } from "path"; +import { fileURLToPath } from "url"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +const eslintConfig = [ + ...compat.extends("next/core-web-vitals", "next/typescript"), + { + rules: { + "react-hooks/exhaustive-deps": "off", + }, + }, +]; + +export default eslintConfig; diff --git a/apps/cm/middleware.ts b/apps/cm/middleware.ts new file mode 100644 index 000000000..e0316fa9f --- /dev/null +++ b/apps/cm/middleware.ts @@ -0,0 +1,79 @@ +import { NextRequest, NextResponse } from "next/server"; +import { + CLAIM_NAME, + AUTH_USER_ID, + PORT, + PROXY_HOST, + SERVER_API_URL, + SITE_ID, +} from "./src/shared/config"; + +const serverApiUrl = + process.env.NEXT_PUBLIC_SERVER_API_URL ?? "http://localhost:3000"; + +export function middleware(req: NextRequest) { + const pathname = req.nextUrl.pathname; + const searchParams = req.nextUrl.searchParams; + + const logMessages: string[] = [ + `[Middleware Request] ${new Date().toISOString()}`, + `[Environment]\n Mode: ${process.env.NODE_ENV}\n Port: ${PORT}\n Proxy Host: ${PROXY_HOST}\n Server API URL: ${SERVER_API_URL}\n Site ID: ${SITE_ID}`, + `[Request]\n Original Pathname: ${pathname}`, + ]; + + if (pathname.startsWith("/server")) { + const queryParams = searchParams.toString(); + const newUrl = `${serverApiUrl}${pathname.replace("/server", "")}${ + queryParams ? `?${queryParams}` : "" + }`; + + logMessages.push(` Rewritten URL: ${newUrl}`); + logMessages.push("\n--------------------------------\n"); + console.log(logMessages.join("\n")); + + return NextResponse.rewrite(new URL(newUrl)); + } + + if (pathname.startsWith("/attach-service")) { + const requestHeaders = new Headers(req.headers); + const token = req.cookies.get(CLAIM_NAME)?.value; + const userId = req.cookies.get(AUTH_USER_ID)?.value; + const newUrl = `${serverApiUrl}${pathname}`; + + if (token) requestHeaders.set(CLAIM_NAME, token); + if (userId) requestHeaders.set(AUTH_USER_ID, userId); + + logMessages.push(` Rewritten URL: ${newUrl}`); + logMessages.push("\n--------------------------------\n"); + console.log(logMessages.join("\n")); + + return NextResponse.rewrite(new URL(newUrl), { + headers: requestHeaders, + }); + } + + if (pathname.startsWith("/user-service")) { + const queryParams = searchParams.toString(); + const newUrl = `${serverApiUrl}${pathname}${ + queryParams ? `?${queryParams}` : "" + }`; + + logMessages.push(` User Service Rewritten URL: ${newUrl}`); + logMessages.push("\n--------------------------------\n"); + console.log(logMessages.join("\n")); + + return NextResponse.rewrite(new URL(newUrl)); + } + + if (pathname === "/") { + return NextResponse.redirect(new URL("/dashboard", req.url)); + } + + logMessages.push("\n--------------------------------\n"); + console.log(logMessages.join("\n")); + return NextResponse.next(); +} + +export const config = { + matcher: ["/server/:path*", "/attach-service/:path*", "/user-service/:path*", "/"], +}; diff --git a/apps/cm/next.config.ts b/apps/cm/next.config.ts new file mode 100644 index 000000000..679528324 --- /dev/null +++ b/apps/cm/next.config.ts @@ -0,0 +1,40 @@ +import type { NextConfig } from "next"; + +const subDomain = + process.env.NEXT_PUBLIC_SUB_DOMAIN || "http://localhost:13000"; + +const backendUrl = process.env.NEXT_PUBLIC_SERVER_API_URL || "http://192.168.0.102:8000"; + +const nextConfig: NextConfig = { + output: "standalone", + async rewrites() { + return { + beforeFiles: [ + { + source: "/_next/static/:path*", + destination: `${subDomain}/_next/static/:path*`, + has: [ + { + type: "header", + key: "referer", + value: "(.*)/cms(.*)", + }, + ], + }, + ], + afterFiles: [ + { + source: "/cms/:path*", + destination: `${subDomain}/cms/:path*`, + }, + { + source: "/user-service/:path*", + destination: `${backendUrl}/user-service/:path*`, + }, + ], + fallback: [], + }; + }, +}; + +export default nextConfig; diff --git a/apps/cm/package.json b/apps/cm/package.json new file mode 100644 index 000000000..81f22f095 --- /dev/null +++ b/apps/cm/package.json @@ -0,0 +1,63 @@ +{ + "name": "cm", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@common/assets": "workspace:*", + "@common/components": "workspace:*", + "@common/config": "workspace:*", + "@fontsource-variable/noto-sans-kr": "^5.2.5", + "@frontend-opensource/use-react-hooks": "^1.1.4", + "@fullcalendar/core": "^6.1.17", + "@fullcalendar/daygrid": "^6.1.17", + "@fullcalendar/interaction": "^6.1.17", + "@fullcalendar/react": "^6.1.17", + "@fullcalendar/timegrid": "^6.1.17", + "@hookform/resolvers": "^4.1.3", + "@minoru/react-dnd-treeview": "3.5.1-alpha.1", + "@radix-ui/react-icons": "^1.3.2", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.8", + "@tanstack/react-query": "^5.67.1", + "@tanstack/react-query-devtools": "^5.75.5", + "@tanstack/react-table": "^8.21.2", + "@tinymce/tinymce-react": "^6.1.0", + "axios": "^1.8.1", + "chart.js": "^4.4.8", + "dayjs": "^1.11.13", + "js-cookie": "^3.0.5", + "lucide-react": "^0.474.0", + "next": "15.3.0", + "next-qrcode": "^2.5.1", + "next-themes": "^0.4.6", + "react-chartjs-2": "^5.3.0", + "react-dnd": "^16.0.1", + "react-hook-form": "^7.54.2", + "sonner": "^2.0.1", + "tailwindcss-animate": "^1.0.7", + "tus-js-client": "^4.3.1", + "zod": "^3.24.2", + "zustand": "^5.0.3" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@types/js-cookie": "^3.0.6", + "@types/node": "^22.13.1", + "@types/webpack": "^5.28.5", + "eslint": "^9", + "eslint-config-next": "15.1.7", + "postcss": "^8", + "prettier": "^3.4.2", + "prettier-plugin-tailwindcss": "^0.6.11", + "steiger": "^0.5.5", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } +} diff --git a/apps/cm/pages/.gitkeep b/apps/cm/pages/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/cm/postcss.config.mjs b/apps/cm/postcss.config.mjs new file mode 100644 index 000000000..1a69fd2a4 --- /dev/null +++ b/apps/cm/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/apps/cm/public/favicon.ico b/apps/cm/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d304b69814b2d79060a24f36f667a7f53b768103 GIT binary patch literal 4286 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 GfWHAix<XI@ literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/bg_login.jpg b/apps/cm/public/images/bg_login.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7793d16a07f4870260d6fd16f31a9ef158c90a7 GIT binary patch literal 135228 zcmd432|Sc-!}mWkjC~mlBKy|JzGaQEM#!k7#agx`QX*?(U(1rRg|SqkA_^g7FKd=c zNS1`MOGJ8)*<4p$_kBOl|9#%~|9PuVr}LaSmoX>DcYe$9>)o%95X3<PBLfH&3V}eu zU&yZ^h%Q+BpZ&of<bQSqu=lTe2n!7bj-s9dDg=SCKq*+DznUOCe_b4e^al!~poCLV z(}70~5D*9@B?T1~3`z-sQ&2!@p)7)OLfZC=Fmun-!HGGqmmm}uAHNu*WYvMQ$seW? zR!C|<hLp1F=5ic4+IvG$?^4+~I1VrPeozo!!Ea}wrlO$*4<BR!S3yNVMM(*#fWe_u z)Zpnba3bwRb9+w;aGJ+2D1}bHX1&<31ee!2JjNE1q)<wQ6xPk{WfwVeCUjZx=%pKZ zWsQBm-a{BD@cUA*K(rvgAi~>xe4?6E$q(;e#nDg9m<8XFa5ax<V{>5b$&ot&a|=0% zl>eCtWl4z9hkmc|U(lECVd2&n!us44UF=0s`yRGs6bgZqzPDKB!sK*3O-<e7(|Djd zg8Qb>#NE^DSbC{Dwt_e5*r(g}PNyMbc9zxhbahmT+8Oh!hsAj$mVXrQ@jdpnZSNMh zK5W(5@_>#wlKyq3H7`v*M&)UGmHQqTHvfpv>$F;E^MiptPZcD`Txp&m&bs{QStQlS z(xc?FNVq+<d-2Q6sr3w>mMZgnjP&}&M0EAoD}C5Pq&N~Tlu-oEqP&q3plXOK?|6k8 z2B#WK)88Fxh*KC+lcO59L(%CkcZ@3RFUv!?i@`#`!G*vP+zRxCLiiRUv@urUbm5Ff zw>~p|{b;rR?sm@nx&u4B4O4(=T+hCD?(VqumRaA^K2I@^!OQ$yY;nIJ!PgU&UbFs8 zF<-3yBI7uE!vD~Fd6<%$AX|AH_Sz}<bQ{g!wUAW@O1G95e)6z=XYBNzb3u2@m3Y5S zU@5Yj%M%bjhJQe58o!-;)d4$<LN309R$|1**M+VqfWKEFN0|fLvZSV8(S6Tdb%guB z9yP#N-U+9-uDwBh{lF1)G+{loHV*elfu1^$OWVqc1Cnyg(TA%-q|>lcD-Iz#kY?R- z{w0^f=iKV4zMUn?EBl`7G$uLteYQ;g2dx6$Ju~mCkODJWhX#6bsEvMjKMJSW2HR#T z6R`V-YHy$Dn$?Q_;a%k}(zz*}Hx|@hupW8t;IaOg`h&XyxlCHK3cR1(Ie*Y$?p9Q1 zhM5R?Nm+IF(Cvf=lsS=oGwpL|<GaZ-FEwmj?c}+Pd*hhXSs(9tBHDM*Ycfkqg`VDo zQC`F@u&<4tnT0n)7vZ6L-|37`-%O3b*k|aYBfX^=?kF!_<uZr<vq&zc8z(G6&R6EV z(_+4myARzf^kU=FgOO^V$&*akOwH$|gZsvv>JN4bMXLB=tax>ng&A$%?S+B+#<f1Y zABHm@Wa6jV_>xfAV~cRm{s?Y?h&1EAQbq?ODP;ixL|C&jQc=zLAS|qwRyvQVf9r7p z<pfQ~YZod0V@taE0}Z%fnGi$1t-+y|ickCZ-8s*gmO9dJjdaXk@&37o7E=7SAp|EZ zY>4YQ>0lBib!$9S@ajP<xQn@&k_yZl@Yii<Yk0vtz&g-^DXABmBNJjuUANDB38JZq zqNB`a&AEJ{U{8n?^wJvO#2;Xeu2Zn^>Pz=IbfwIBA0fgg{-v<uVH!?EpCV?3J9 zU!hEz$FXs{MLFaW5Gf`?b`;N2&7s`h87s0u>y!{7cw+&pLM8oCEIo5}dy~VYl!4ZS z<1dI?6sw#sPj;7zzA1k-mZ>Jis?udh(Dy2b(S@&TIXW+;d9(UaCqx^|-iI?3SOs(_ z2I=rWYFF-|)btRi=3q#M_AI6eA(A46nBNXXF>u!oX;2uT0yOPEwnpxPR0XrrLhgG| znNtYR_^y4eR}|OaS?XqFe-|aWFcZurgZ8?W45tlXb)o-kef-qbxJc7o?7?@Iq~HTi zxGdFyEAx?a&rDxSq@?P`wo{w`g4FMgHDWpwS$B)3aocv6%ZD~BW^qMp*4IA8iu==7 zEav<2i(OaSCm44RBItO_Js|V<6&)H5O^?wOMJu?kDBQa;Sq^EF>Am(f3Qhw}u)TwS z9)d!k?x1q108)TTJ1E)10gZACNo<_%vUN84NZx{GxRvY{auoIF@?Zn$w+@!{gj2QP zH;%wfI*x_A<_2w|I^oqb$>ycBm>hBL?~MwhBjnW<Su`se!ONx3m2?!POx~Ir!ZMMA zh>DRHI2aB+xMZ(2f0~wti$muGvWGSya!bR9erje}?S4E9lv$akgoZ}yLb#X!8bVdC zyRG6+wKy*=x-6k2_sRL2{=CbIr;k#Gj_lhEVd)?6l8FUHcvifi{WK3IFd{V5#_7r; z&mk)e=lEsGQ%o{n6*+xtI+ncTq&7avZQ8?ijd9OBB<u&A6_Wy(dBeNTn6KULcx)#L z)&m#b*&ISmWUHo~8HmnQ52r4fxnD&q6+SRRJ$#u>ZYE;=dTn3YEou9J5zPY@a$h1R ztiE-N_dj;cx$nWNGfOj2?YCZcX#jdu%9-L}yQ#vGAHz5Fv8PIs?A?Viv8adln~N$s zt-73fKKPIHAdmHrS9qj9yWOSQGOO^_Kcr$oTaHcJGOg9e`4{9Swc3Kpoy{H-y&j7x z&ym4jkWZyr>RsY&yK6J~yJz)1EVT{V+&rR}v!+pl&I<vCcjq6R^J3K}o$<}ehk0yn z`8|%HsV?k8*K-d)KOceWpFboK&G<ej(>fXMsCaB{#Zn=y)#F3RX|a%Eh3nR}mld`T z@Yae=iwU{Rk9!*4Vx5-ftY;s|-aaL~QZrsBJ|A-JR?v#~)eX1!u9cXrdsTG%PHeuC zm^gN#3U+PE(;2t*W|?a~(iNLG*EEh&ZaTZ)hfB)#IlQY_Azt5MerCD)twv9fHD%MG zN8_F@GEu!Ba!)7;N^>cA!+HXkU%^5GR^C}PoK>>yaPs`9N&N|`t?Bz!ZIkKQz!%=8 zmiY(65qB)Sn2J>MZ+yJ+Rjps_hK1CM$|7%&mziHTj=bYLTK86}iz@Ep+HP#=U1voe zbm%+x{PpBxmyGt*FTJ~5U@BI4YRdE7<!yORLv$5Yrj<?8fPO3PWU5MkP?yv3XCaqP zbc)<ei+b>b`eazI>z!I>p2Ex(Ui}sYYuNfV%>$EuaMG=FiBYZcd30fHJo>4uXTeW! zGjSMXJcC{umMD2L&^HNgoM}#t!2?4V(oWagvfOLiibp@|aMc7il2CX_arvWc;exby z^uTrx=R`EPx6T&bYnv52(<AL$8ecvp-=yEOe|mmgx2e^C{2l4LRBt(CX_nY;(rUk` zg`%Tf>9!YSP*dRYxd&bQa<yS#g*&DY+*bQ9X>WM3v8Yu?H)l*Kv0GeHz3n#@x(wdl z%RX!|BgOPH2F0;zmp{}cj6QZ>TZ^;iDi~Hqib==yyYG(S3hKf}wdo6m_5?2QZN5Ee zTZR*oXEDU3oCn~<iT_W4L`OXB*72Lh!{52vJumggUQdf1he(#+42U?2vdj}G%5^xr zvm`MRl}Gh!!~6@y?XxwRpH7tt6fK_J;UyV^%U)gpT*lwH&Q#u}gC&}d8aS;}bCg+{ zHhsjLDt~oNDA;=t4@g6M6=Pr}p%s>sT`K{m)f3hza9wyjvR?co6ztQO90PV9*a)=D z*lMrk$;X^>azwf_3I)4$<X(G`kD*vFFgMU^%f}#NKc&^$ZN5%6Pm~u&vd)zb9|o`Q z)_9^evrnTyfwWGzPDFnDWoM2Hs=raw`O)3RZkTHo0q3P2>oP4n!aYSxJF-IaRA$ts zV{A)jH8}$vzXEbPJ7j=1co=T3?$SmxP+|kvDfOKU*wo?12@uI?AEhzirLx`B=K&;@ zGZ7FA|A0*xetWTjA!9?Z8AHPEa9Ea1$evK;Q02&|z{T&w(c>TDaK(Ny0GOWh0(SB{ zj>#G|3S(xR3T6YmRBQ|hobJ$}PdyG^=xKyiLp|$k$D@gTlWF%ksh2`1tI8xQJD&-Q z1*}>Iy!Rz9MVW4_&RNs3Ca53zw3^ZSjUxZ2x}{FoZ}i09^i$nhnH51@?b8>lI&xr1 z>(E=%rnEZ8{(vJjY1&psZg&7HvSX8Ff5@lB??1fo;Cb1N@{_{*&TAx+mI<sgchoNG zl(0tdo86On3YAVja!-WFQiMl{ASIAua|YFwZc6=B)7J301}?=^yf4XD<D<4wTvU2; zY2@1!vqRmcO<5i)G;%D99f_f4VUd}YrTV;<7&@mfF(sj;pTvzBQj*mIEU-7z^_fD} z!`0k{UL?4)^*Yf|K5!HYwc{`hKfrXFRjBc!)VUgqZ>PT$zB^eIuKh4hk#n_x)*w-v z!sguG64Ug^NVM(#QdbxrN*G6|-)D9PhSimh^K1dUAp%bib!#&eePbLWB`=j`ny%0I zBk&dKr>F#Kd(Y3x#5YGB^j)MM%u;gRVY~>)^i%~>VWxQyek%WtZvGn!JAi)fO+Q@M z+|65QKIhA}d)?!_iF-411Kj7BnZ4mWVnZ>zI5S=%4qp=r)nAf1)Y+3Wpi^hI&-?)W z-H?GnxVD<PJZI`GwpNi>>=8R9U=G97&~dfgoL>CpS0L5sCkK_d^(mRM+4jMXokc3j zC?^Tr;nt^W(A9p;5j$>^nUSMAz9Rbz;?W`Crn@<YOWh@p2*y%CCJ~!KcV-5wSTC)V z1g$f`B!zaB<VLe#aV%kX1sDaJOb%EXY(F|I+rq7<e-RF0y*RS1Iz}7p1&Iht>dh>` zEH5`96a*<((;7{ig(3@#q{IPfMPWTL!6HxYxgs@fm0>ij>P8B*2VH33%mpI1lIL_H zvj9KXPiCl=pMdHf!%8Ncn^%8k7|cEVHv1)8z0Uf9ZwQ2#5Jv*bQA$LVdU#QRT8Opo zEB@uJ9vucuRCIEk`S}+~!BFNevrjo4*zHn!FGO*wHX(R?)Xe7}^jzaP_hQ2%bd<Gn zBX-KyeJGpinZJ<kXgj6-FNjQ>A|8>hocRSQ`ZQ^)Vy0#$Vi?GGTtGPb7i0;3P{3$c z&OkJ;KippIjL9YE{lg{nXoirVC_JiRxuj5olm-7-ju_sZ-Ks6>+_s|-z4I^W$^C~T z63<@;4W2J{eE&{f{r9wGI%<-8E#Y7|P2#D+xD%zX!s&hbP<allIXce)bFm2}>QYwI z3u`d;*J!#1RhA-H4Pf2$G&C=1u{o>oC2s1<t#~aJHg?MO8+jMNlZz$Is9124Q!{H* zwW=S2gcz-Q)UnD%11Ik>iFhX8_6nKhx~S|0UmtgjwR`&5i>G4%-ZWnC*!B%=zV_R; zku>HB`rE#e_q(~OBPIFuOTJv}Gud)eSxN1;@Xfh>g*kYwUs~sb8oUDx-2pAmd>#I4 zb$&WMw#sIS115fB&%%0rKgo7HzC=F`U{9mNZ|n;u>)9u@=G>yg>Q&)=&6^o&u&4JQ zED@o`_4q@N{qxgw60V-7D!T4oZJWsG_OF7)yuS_5=03oxJD;-M6C?sm0YtqXX&NuD z+svf??At68T}2y}u3mZj=$-0ckQ-V2LC(nNn1f=r_e@PTb4i%<y{XR2sa?x|yaC{H zxYwHgA0Q>UXrEOuhX<>C09NOeF2ywHdS9)uc{dd^0ze9I75OZOSAtXrraVWVcTGz) z4<8a|t+Rj4F7EydGWj`jG_BcVgsZgs1G3`k@}<Uwj`0dhZrOuf<}PZRj5@uc`JG=< zuj$)<ooFMC{N%A+-g@xs(@yG7;HAyZ@8Nj#NYU<QmM?A#ys}K|rtyJ+mN?cjNs|hu zxDh4!lg!0l@a&rKNSrMc_rdAP#?R1Mtgbp#X&PErQbk`g($vj9csH+z^Wnk5cbC_A zWmH$0Y8xM2_G`t~ymMuC*X@zP_IN00cvGEp4CUMI2XE|3uK$}r*c6*lVeJ`(_|)Ha zvNzpd%KN0girV6KuhF80H?J#r+O3V-SD5P5_B?m)k+xS%FPc(NnKZPmKo>eFU*=+Z zZ(nlgoN9hjnH+mI`U@uA^k_xLMEzwzVA&L{IGZCn7Ki(tJZ~9TVk<PNA?4hcJ^k4% zIQfEI?Iz4ORntyS(RKoSKjtJ<HcdX8BR%eS*pjwy9BKY)()>5b%QrI%95E;;=SZ&# zxSs2z&K$gf#+YUK(vK@{@F%|2&MKgLbGM52YP^AUyy=+syxO#T?m5d2*S&>PmsD1d zCbU~>%S{yA#;B~&&Ju`=U3xE*@AX{IQ@jV<o_}k2cqxawO!~Fj*p?qjg`%wXhybz- z_)nXuW>wn~FTkwbs^(uyc{Z<fYy9)07oL4`0ciNG-r|H;;dHAG>|Q1@`a8>!G`KC0 zd^*4Ti6gJG1Gu?SQ{?Ty9t60?PoXF;2N?sO?s{}R>@bSwWT&+<TQK^tc=dG0D1^jQ z^nbAve8|xt5q%8dJ-e0m!6SyKNRiPAKFV|$MW?T9`RSXD#|mDI(mtP-Y+k7t122=0 zQKm{nGn0PRpbyL3a@q(b)0A;}yC+`RIu)Z&xqp=5I{lnZ$Zzy?!PXUt81iZ99YP8d z5vq|$4P|?9(_LzZs)TqaU(t;lJ4(-KfPX~IX>T+EqJC4Gh+>lv5vYi8MO2;$Y7=3* zpFG+fNq2>yJS_#VXmHhV)oAE0MAlB4ap2{qUWeSRz3fZ=Kz~{-$=M$}F(Vs%q5T?c z4^WzHZb3F*r-pILmQa6)YZ7=CjwMM=3WuecCn#wzJ6U>WTr@D*n0~bJWSP7?NJJ%3 z0q=Y5Gs^L^B&kUa2pe7~?cSiwq8uHP&?La@y>O4?QdRtTQ0AkIXu%IAxJM%8x+H`e zxfg=RBZDJyp9`(uU+FqD=n^*w&O=%f35gD`PHEn*?f(Zm5s@my+BYsw%PkZyg4twY z2=Ww{*Xq~RVZ-)&_nhyJ8(8mG->=N-V7wr(PNzHAbr?R@W|u~IhEZb&br1Z0q*L-_ z=JL$U;7sL>lvGBHSf8`t-SLCFLge5F7su>+R3S>NaV`f!ab5;gbnwX+9b#PcvTf!R zM+98?_$sgLTf4ecLX{GsTOQ_D{ZLkof6e~&(5+As^LUY%CWP87ri8W3Fo!Hxg=!1p z%!7k?Lb+Bwn+k1N`<$jRJvFUI;Y$$l<R>`yb&;Nvnh(d1UJlo^JS<-y$FD?ItxT!S zqBEcpiZMKqMu6mCwv_2V)-gvZ9e_AhA`|>Zt#T~fe<q;ioOVD03w1CuhW;BKr;-9? zU9eGt>54IQyrOrYI<}N4`nV^7r<$2=Ski@1*3t_2uQ+>f{{ZYZv*p&YuD%r_@of=@ zLsPc(q7*sO*o5dED{*bMy*N=oRiXKX$P0k!y!CbSpWsl&A8%-1RHDX|d_brLV349f z0eYyD<F||Dibe<j&<aAZNvoViKw#Ga1dI++Vu(U4(4<0cET2#JMg?m6-2B-=$^R+r zvHe9B7)%@zVpze!&zusYCvZmAKGG>8#<nGwGG<r2yW+0<{u9S3UW_eVR!lx!O-aD7 z2Hc?e^Te2csz9!NW_8Iu^---CVoI32^NPgelHIekl%b)t*p$cgFvrAD<o<vMS8E|n z(%8LsVeFKt@(j_+@$|HGxaGmGXe?%9E9a-&c)b`j8vPor+e=5sCPazy&0uojRz%Ad zH9pT>V$F{%OZ6Q7XnN`Erw3QR1w0<yXf*FTA)*;C6}-!j4)BTr>WXjnH;u=~*l&!v z8izo2huSI6{(@{N;%Ugedv+H~Q>o%BCZ<Udql|(MpReAKmuK<1Q`jHN9UZE)<ZUfi z*7h8Uk9M$VWc3w+%_;)rWA<t9MT&}(MX5hwi+%bPstri}yF}le;QHvEPx>uK2CF}p zx`{HMUf*6W6PlQUi+0fJbHxIlYHvd}hu4{#w3(nqBJB0iY|MOdcIh;9FO$s+z;9-a z$^)w_(V@F&j<(hJ@Na4B*qK1nLQQVlFoll>4C5k0zb6LPPg@o!yR0DL{O)4M%ei@D zqv<nJXJujqFQxVe-cyh~MPF3KTnSWy-j0aS+?J|phO&8OBR3*6lmL!$ElvdkC|Ojw z{Oq#@+mU!Dk*#iJf7B^3yfLSI*neT3v-hmV#v4uhw<q#%6x95P<UjjmA^rY%Ro+E4 zA5N`_AQ>vI+3RoambKJ=o_*NgUuv1%jzc{>I_r6=bNw?As#LcCZVeo|$6oUTzp8Rf zvv<=o$CgAod(E7;4+-)5q<51xNcdGpU!E!z@L_r|y(y!h?~bRI%*DE^XRlPuUvE@b zr*qM~9#uU2)1oT<!&PZ)?$aapn>F#LezUUS1!phJJS0Kq-o3UpVxXCSY~@R)jWh4& z@O(%OAfA+LOSPIVwVg5f7%R6mwRY~#HO&6}d1pd(^>WknTcv@`P2)yhe}?DZaC`YF zma({Ojc)-hxrL9M72*X+iVAs@f3?3AjO56-+8em6qJrBet14fI9P{1lygaR8X|7V? zta>-)zQd(@FXwDVmnU4BKQSDgVQ=kQ-@AuQO`)X4u9R><)NrT|PRGl6+%S6KogEk} zlO^j!DgVdaX%8$c(X}uv&Uy90eu(lKr?yW<W!m@@Pv8``?DeGNev0@fBXHs#$B&r( zRNZuO1=<rGEI7NjWR?D-;_i-ae%XH>pyY1WAk%xhQ-I;_eAWzp`|fgA@$p5@dJK|b z`zDzIKOOBsAC7pi`RTQr+SYW|w`?@|u9@Nuj5O{Fq$n-{-{8l$EUg~&!F$vmOeL8G zPxQ!$=j^@js-UtFX`9LRp=_E{Hr>=>h3mE>z1{6MmyAT6PD^M8zsXTdzweROik&S> zH`1gAau?}_Ow<tVzc8+(U(#0;`!2npa^}?Mqp;no>60wApD*v9sB#yuU2}PKk0bYF z<+8KH%jWj#*Df;RvxO@_xnflL1)2AhN$fu)8NM=b3`mOFcgH@2h<3F4rVcut`~LGr z#>Rqe>kd^F8)#eN^&Rpu^b2W&m*#^0@c-1dqsJ>z*arf00~-o8qwEBh+Og~C@p=<7 z#vQM4jZWe9sE{EARNe(3bNwzt5wxds#BCwgI3dLteb^k7CI2u=5ZH5gRAS##z8-ym zqR!|QF!2t+*K)KO35t`>zLBLT<;@JwxvX1!{hiFTU*Go1^a4&Be$}|zjK128=+n{V z?obi%=Kd}}(WDUcC!*xU`^16Lm7q&KCv3NgBS=nM0?Kr74O>bxDi10TX2j;$!ZWtU z#^!}Qltgbs*qTgyegnKwT9GD`pg@tOCVoE!M99>C)2TClbaUn<9eU0zrPqVMzr7gm zMWTuJT_{n0y2`dX=QV7I=9?QmB>DL=Nq{nbeRJ43rF0dTfuH68DgLE6&G$96=gBKv zn2f7Z5LRX~f>|rxJ7jnahH0Ex{j`Q7IC5BmnnZkr)~h#DRfP3Rha=af17H6}pwQ}a z2w|V!C`q13K|=msj$=Inx`T$Ck%A$PeSKwpp2E^unOPapzp>T9`zBR>-hS>PzzyN; z%>Gh#sF|rT|GB!dPNYf*$LW;(Uy$nuRxycJXdaKl+D@X;rU#^qv}{sIh91Ki*a{41 zMM3imQYa%C!y8^$d6fHIW9tz0`SgGf%yREPSUo{r=ZO_M8OoyUezLCQC?)XB2JTK$ z!Vsx<$0Oha8F&*dr`Li`1t>tGR)V`!e<-*!OUu(m8l6RBQeKFK%$8xy5EK*RSey~w zmC8hitfJ&=;BBr}kGAgJ?SGh)L$vh}QeN*9CEQV$15?w10_CKq;>E@Eqf;jDnY-7` zKNYYO<PC58I+M*CW*q6l@qU*g_b07G{T1#gyOY%d1$zzxsgY=LR#Vg+^P2U9u1HZ; zn1I8FL>e7MjqMx8)YqEg1u&OdQJ_B|)pG01p6T<@eJZKxDWu`hv&Ry6u;l3pi%{=R zJR)FFL(WvjQg?5~%WMYOou>F1@IrR5C1ejB{|4+CjwP~(d|g={DUqG^D)3$Ci%l>) z_1dEGhtzRR+BFWP_Ql~i6J4yD?g<2wyBBA7gBV2gAsmoHA|wY#)_IoeuXqMkV#BDv zHPM8?AZ~*ah#cL1vfsvIvwd5jDxBxS4>=jnZC(+Ctk7;zyMr!R%z90S5Je;cf*nI3 z3=n(J+Ct(8Io&yk!xOx6qub8ME$}*=bIT_}hZW`8vz{g#abh<A$N@9{NcAu6hzPmm z$B5MDoKP$_EDB4*j@Ie}K4IT4$hr$&bXsZ*LkH_YOjyFu6k>PdFl)>8!3n=0+w4wj z;z-%{aTD50-!4#>;SjV?!Hh+@<U^4sdFM&8)4$c3s!IQ)qaEYVPd-LoOkXI1_VN_} z0PCtF(t+?P^<OWU^wy?3wcEW*MM-c)fGjLPA<jHho)8SU3N~@MaZxnDr!EK!8)X3E zmSH~lhV>vM(V<~zF9d=ONkM&(6{$Idm+7H2`IrkU7phct%jTq`Xu&7wfs(aD<{xA4 zvM``w3<5A_RYYnk7oACz$>UX$shF~~q@w~~qyw3eN5TkJ$tH&g2wFD2Kqdp2EqB$w zzF$vu%)zKc@lmqJYIj<^=u)~ATJdb4m)`!{Jhtq6LdjQ6s?wfIMU`n2^#}dmxX|xc zrY%N~Z#RN5yQ7;^m$iS>cDb;emuN4|MQq?U)2<g@sSI7B>lCflhzKkhRc8ILfl32# z<<;}eY3AMh&)4sqor4H;V_T)p@O5GM=PAotp_iuyde{f_O{P4Dx{Cne@NAfQd0GI| zkhkW?GoT}Naes-Z9{WmnQ$&8C$K=ZF9*(kUV9Z^zx~Tx%9_~jgu_so2v<;p;h(D|I zU`pNKZn($jdmE|Eyppai+qx$;r@kMs&&&*04x|B~1x_dd9K><Fc%k}T>)5~o-qusW zlhF0P%Z{sC@4Mq(oFZHYFP?eCl&n7^iPzD4_o{Tr8H*2|$MG@_>7)<wESE+&|HDO& zO`2k&gi_6<(cnkGE4ooN9AdEJt-Y_Ag=JdD#NMol*g@|aM%{+jN8-0X^Y;h&+&)P^ zm1J~sQgPxJ<XKbg0dtk7<9aO>x;@inifUe*bJkQ=@ka?@Tt)qycZ5@!SFf8>b|kL@ zgAA-pJ3Y<5Ml{_j*JfLuSzfTPhBd~(w)}5NMeatj2wu8`<Yd!0&S*Oa4N?Km=3Djg zvI6F=#xcaCnge62&^yoX>9Fnt2_>scntfiJ%5vJC3eDJ(acmvmr&#-zW=cb=;bu5c z%&LW^cbJN5yJ1>-#fMG9sxiK%hr>?;Xl<Tr8MtT9V(6o@gz_w#Z~si$VLjM7Bh`vR zYljRLhvNDv!Hj178Qx<(H7|B0R`{J)kG090#^RD0-)<a`)h-pi(SR=^;S^eT?7{h5 zl+&{0r2u>>JD*skPX#9CMqC#F_;+44pL>W_DNmVP!E7v!B%W#8Q4|7m)-hJ_?I)3J zuI`<6b5q&NRMtOqBr4b1YbQ)?0<C6OR93m&d8dV}I(*WuduTqo?0ehqxph<3%85oZ zx93k9BI}%_5143Or+yO`@+dkH|6@BlJ*~f^J&|oXuSZM&J=@Om{7sN!!Y7;v$V3P| z9Tu;ulPO%enufRV=t*v!)bHXGL34UY+(zq-jp_vlctU9at|+oPL|#Sau_5lha-6{# zzGaYe`WSbe{wpA=@`Y=6%25VGwfk<p%Sp+TsO*+;d-+E9aboY~+lev;mY!KQz4Lty zfF20hrG|pc9VQ}sb@T+Q4kk*-K7|r;P(<Gj|3I-0e*4=z5vnoty$FJD$N7ToMMh&| z!w;?EksWSol=tUs?X`!ErEpUo`XL|kToU>{PmV^~-VSJLQQDX2A;v}W)p0{fPWe{+ zEi@$GE-r25we`x`Nh~S;lp|ebc~3-~+cu@wZHcmK#^!dyf5WCrBH+^39ZZDV8y%UR z^1m~3FFM7*!D;LzmzR@)J5Lf(P|Bxu|KUuNYIf&8Idt7a;{PpX8V@smUx=<zWnlXk zutXA~EDjQRN<huHuM97k;f*OBrli%cBXq0+UMcs04irrrM_cw&_owcJC+QIc@qxrE z0X;JP7ZHjHLDfom#_Q8cQ>8_eg9TSSGQ%lp!^F4mZ0R`Ofe3a%H3SqX?R8XxA?$2I zkzGrY)h=6gtJ$7;H(NgiQQvn`V7eu2Q9XA96QfTR(kC>SJeZG}Bs*rY<0sul=y;Hx z0h%dC3cPOr7-}2T=j%O5vYH%Z<OZMtE^4M$dudqLMH1Cpuj=N;F{Sn}{NRkkv6G>v z$HqfM`=DYB4X>t{8|8yulow|c7vc&S3ExpeannfaQFddZE2p!<i{Wfylux<mz}<F3 z+vP_^G*Fd@5v_kMc3}iyM78VEp6AN7G*38RLJ3E%I}E;!v;w5a7Qie51&Y3QQS)#< zU4E-!9e&mzk&g%7*3YZcc*Tn;WAHY>F)Xg$gV#U;jeK<yqa46`u8IC5lHp;<x+G`h z@>cQEN=aBFb84$VW0VUlL>2K10&a6iDzwrwDF%F)k(v0WM}eTBrJ+G!I}kJ$r9aGW z#J4w3Ze$lm35@Y9Myt_<(io!QY~Nm%jQ`-842-ujvQ`%x{iMM9dYp~bhml5|#78>9 z+LUt!?R${|hgtR3y*}+lN|8h!Mvg|CbtnJLj~XSgi;q5sSF+RbVp#+s7lpjsN^^An zcch=UsaKC0lL7$}|7NMmHk7ACE%m-F1<x=J_>jXNEE9}}BmqHW3|%f6Z+14p@g(#c z0Rh39h(Mt#^^N*YXIRh&59?DE<3kFRAP@1B$`R=*Y={$D%wF3XR*BrwYh<TDHZx!k z8A6)u_|Y;^l__m2a!bCI43so4kD)_OW9`82MU?-xrq(Egf5SeKV~mx9LRL_tlcMo- z5Xbw$i7Dp<;S+p&Gti6N$lzY4{d)2?3GIoq*g77Q#~$g-?YPwFf#E}vR94qU2t(yN zDK~3s1to1ymFlz<=C$yocUrtoNy9%FHtlPLTcZ{{Cpk0dVBJA$e3e0(1|ZZ@Ip{Q^ zymqQq4Er!M^X@qO7sM%M*3)?0g>G>0JyrHry2Sma6GdeFQ1|_Isi<Qj-ml++5KAHq zKbOp_ac}R=!tR)CTT`|a)r`Lh<n1wkbS?>30<5lhE+EKsPZG8`1y+>>Pt8q*2b?0D zp#97E+IL5{mKJ?LIu9w#woTdl$BRh^M{!?W208<K?HO~z$=sBkH!to#s}@p0Qjs|L zQ-HIh#1=yw7Qa<%Z561#^=)>r)Vw~8daG3Nwy7KsSq~RkIp=zW29yypn~Ii4VlA`r zqv$eO^La{qO?%TAPt3~mJ~_##%(TiP?WEq(Y9s&GNLyo=`exdXm&0J4{?Zus6#ea% zygA@$O>;I`8BhAAuF$`1$-_s|z=pHSTEd=SY^?|hFL^fgN^>ZzofA!p5M76TmMhpi z<aE3WzQoD8!RNG(uh-|U8uiD^2>lXrx+r+zfRBD>tGPmR2Pt3F+#@kZOdP4qsyi+e z<nv8DikKCvf=43Z>)%0uZXZfWhooh3cBV{#6w_bObhz-1@;<LGb&QexzBtKMUwUTr z#GJA=39{&!Q1nal1mz231x^~EpIA#_eE%;E3o`o78ven3+&MP&Ur-lFKJ5@vErmA7 z@U75)MA1=QJ=oYoan;_7)3-W0OF}`e*z;Z>C6KX(pY&;Q(?fVMNDl?c6H7&sBT$1C zl_$u)GG$W+z=nyJhL2S-mVCDKR9S^O%t~i#PRXj^HW{haz@fjW_2wCWC>2qxVhYty z3(fa>ojG)Sezaws7~l>WW#Yo8jtH@Aw}M`jnq@w4*1{&wHCp^%5PwL_ve$HiCAGEY z9?HK`SU6-88AEfvdgAQ)7?!7>EOzTe*u*`W(0E=Z`b~`ghi3=p%axblqZmmJ`9JNQ zX=rH3<o)>h8Z2!H(4w%XtRql#9RA)z?t&gc5UMBZJ|yFe6fzQX)qk;N7cBkY)x3hc zA;~yHlNbk+VlB~^gbYSm?cc)}piO|9-%K+DOMFT@=MT3Ge3G13Xdm<goV2`_;+;j; zkaX{L$9Eunu}R0Zbv7o+Pj|!(tBMe$9YI6Z5wlwtUX4Hq4%k0n#!&Qa>MMn{R|ozc zG$N`!iNuUi98t+>%NpUjlEb=Im>_zO7LC?f{cos0)JA^Z?%_1Q0gWD!Xh_@=N)Uy@ zcnLCx2zrJP?+GLTkS%`5rsM3#t43k5@o8a`W66!*2K&Nd_?2%3$I=Jo(lqGkP)J4; z<YP8HLm-ofd+4{k_DyEVEUg5h1)55tb|n}gZz8a|H<}e71GTW#V@}oaFloJy)$k=M zJwD3AC=^`&Rx;x#<qaRkwl+aI(`H6eV*8Lt<&otU_fe1wcio&{!p$r_VU&<0XgNxC z;xkVrT--WZ=5wcWFBDg2-hSF9an+6xnJO}EqoKqfh)HMrCKLtiF<wzjUf7VQZb?FI z!pGeCZ%0Ydb47f@ya}?tjzh5q7;9g4#t1y8`9pb9dKHv;-+dS}tyF~%#_v{;=7kR> zl0#9vkN{w)(Q1k&kWx~-ff|GQJkq!HaZd}5%IGpia-8qPi%1Sq7Ie7axf>A;gb-N$ zQMalU=c^Q3F5JsK`>U>0JfzBk0<?-<rGEy;NF0JEos2D|D>0r?2|94|=P-?JElmlX z#-1>X$1sc`CTGD_G)dhm=_lUR-ImpTK~<<NnV{GF^KDDL5bQWs+c1pgLKI87lBn54 zA1Rrm`*wK?2i;y{6+~=*6hJf_@98<k#sbNq85_fzaM&J1edym-(PMp?`XCGC&$++( z%hQNZlMqFP;Lz6Pr~kEC1&GDM;lK2%_E#xjE{;5iCaE{!WI*{RjT923n%@A0%qKex z13m`*2{Aj*A$@FP`Qvk2xs$oU$6gc%vA_c5)VP9K_OjDQy80vetae4dT*3BH$wMIp zjZv7fVF*Q(9-?H^WnWjEHfYrF*(w9^3%g4$SnPBRO|Rf-N!5Lex^9uT429(wCT+Ce z?!kEmCkBVkOWUI5C;f1!O;7pelD|eH8?)w>s{#Cv1mmIhh$9Hwx2(^Cu?Z+_?snz# z;Dxnuoqz-80XElP;)WQWbfiP3(U5Ch#}(;CLS@|+tYt?Pnfe9g`EbeKGb__#V&f&% z-s8MGknNn9gZ>@$eyM5K^KxHSd3=5PeLsd>=Z%jny?2y{LQG)yQ8?ylW@%>+7?YyP zj%{4i|C^NaXjBPga=m}z1J`?3RHpL0ublJBl_0~$`Aj_OD3inB56i0Plseryl~`5F zRMxT*Bmx6$pUq+mIm)tRhQFaL=uf;m;$tA$>ZyMTQsEM@qVm*xqX<YWU4ciBo&eEr zDeGES5L=o0v^>yy{|#af6@NM*EHv@v>o3SM?lVw!>ij@3ims+h9b7{B0T7jPI5s!} z=box)nsTY`F)!V{`(x~mfM7{rC5><_QvscF+AXP3LeM*|@T}2A$xm~4IllR@e(Ci2 zzH;h&J^V&NRlsKIS5l_?*3p{k!_omEJ>(SjD&-V#iX;?RPJASXgVuHuJw2d0l{uN? zMW3pYcikUEvwwgLTR?o<3e!{C`~l;DE=?@idQxYa;NiMG;lUzMMGj|sk+NjI;T=2} zeoeb6JRae9A7rjL_1f(p5QHT~v!#Or^nv)47VYG_7=MHM`*is~;K!=ra|UYDolVjj z)<=kAH<kTeYeI4=c=p?Jz&1*^@Xw+6aD6^D<9e=hRIGjL2OuEw=`{AJY?}5E<s=T0 zN+rE>FIqbJ#43l|E1ufic(^%BO4XBdU_B@MU6nd!9pllW2|gx3n_*nyJ^#h(@9Fx! zh=A6=;`Xky69%*=UbVGfnC|R5BD!_)Uj%;CI1Bz~;!A+yT~nbD+F9i$=gjC=yo<eQ z;3MvNUkiht9Nu4$p{L(-bcsUCAV>D8<%wM^BmaK_i`c1bE$#XQX&0hfrA~<b_`FVL zpRprRiAfJNjszw!>k~JJorV)g@=LPl+k>l<;dY|*k@*wdQG_+@Z*{U)gs5~##{K0V z9#>Nx@u8j=E+U{1ISq&`Ak#Cl>Zow#-|H>++EpCgvH#YhQi+TG?3IZ3%4Ez?glCb^ z<TnzL-&0{=gVK9mm`{7Q0fRt1|IL^pX)Q#+Nh&--lw+WO*ILMm3dP^iM1V*pM4+KX z5Q*mRgc44O(&Pvc*+u)$RJZ<;o`{&NSdTpOb)&JB3sD>b+d@21{ZD)DYz6)VQk#A1 zJKwEgX{6Sf<Te*1%6F~S+wj9z0R}<U>Oo@#?(hT*GyyAl=K$>%QjH7^@i(?bw{uMs z#t=ytU3K3tgGBU`l&lAKS5y~&K9%;_We4jySru9!+K=)|fAxUvd@}<{r@_o9-8>Fr z)w>@DoERBRdN?DI?|S+v(cjWOo9On+trvCiugJC3KKF2@LUv-PTPjecTA;`)x%AJ- zbz5lXe^PizI?Ovm7nZ~81TBl0Y0@MFtX(8~zMWn|J>eAtsuiH69@y$$EviIaY%TPp zdH#V&JCXv!VftO>W9QqFw`5phYbL!WcD9*TJ?|$X)yp8Jl>CX|N1B|)Lt5#rdo%Cv zsOsn;7|?=I5M2ZUTY^n+(oYo|kDT<aJ-)$bugPLXAxJ69BKp&?3?gVYwkE|U3bzw= z0#TOE<xt?2>32{wiI`~1?xPfBxCX)Hxozq2ry5tP@}GV(Sh2{Xow`skRqH}S%aBbf zRSc0-6OH<<8r{fUh%weC<{vQ<C>oSJB7wzjnwNS|f45|eKC|E+S-nx%BE^@e;uGG7 zjQ&n0z+WN|3VHeeT}s(Ol^wt#lLzY{u{(R}U)u6yY@s+Z2JEK9d<=IsLvCCg5X1V{ zfyD*XHTFGWqQ}d`YYbG{PDhb9?rNdA#Oz?MPl?tMJRN%8EW+Ht07NWZ1Aq=BuNcD+ z9XKf;_Pk668lO02zaooG+OB775V0GC8P+pk8=2p}h?28sIIh<SJi<1#X<u|y^z)#r zX~A?l{b%+WVXo0pk8R|IA~trlu(15(g6myi(vE6EYYnZP`KfEm_;mZm)jn5-^UTRN zHcojxaiy4od5G$|ZJBK8xOIQ>F=xwLga%qEH(kb;-MkrB>aHm)wKKOo`;v9!{^?m> z_mgL{<BdEk_Ww+?!~tkIcf^{Ut#+Pwo5sgr$(^;m5=5@psjEp7F=joTjzkZ%^IT&$ zEUC?Rs$(^soPKosbkE>f=2qL*f=cl#e_Wnpc1_H=Uyyq$GrVv*(3^9{SLFc94EC@; zG<6flO}Ct$c8ERoSEd`U3n^!P2T7o(Di4P~AJLlh>|T=N@0)r4;qcDY;LCG_bKF@{ z27S5%pz4%N4p*1r%`QS+&iK25TiN%wqn#eZF%hSp#S#-bw(ne|SA5gP+t>p7UGYq_ z)1YcPD(m$;w|j42Rj=c#JcBP5<ic7fA!$usOPs^!TUv$ZdcU1wsuSP3>2teFGniO4 z<O41ZK8f>#+Sa~zC9}0cCU|k7g{EpJ4gW$FglrCWG#vv$>ECzV&FpHoU|0)s*Q99l z^bQ@>lY4KgOjVsCnfjkq&dw#w-G!Gt3yq=p+`$9%p;}?HMDSBiPUZCM)Z!!*_M2_T z+4!<0O>?SVJMjLJd~=UXRNrLKfmEv(&Cr!8CdXJ}h&tM-oLpg>CWWO{{-#p_SxQL1 zq}Hu&H(rnWo>!eaHBkVPOn>gP&nZA_n8l5RfwLqU=F|Ncgh8@>&MF2y0gH|)&sjw_ z?!%ZnYB2_C*9VUT<)-hn)?zL3@%V00BZjA5Y<z0b%|%7mc8NMm2uJAVX%4zN)Ls7% zX&Wz@qqdTrE2N)!R$|abYEum+3`ANQ;*<aai8P%f2B#w<DNw`>@;<*H?r%SY(+oQH z7Q0~DjpRdWy-#pl-#2A^*M#P}3(-hA>vML@=j=EkYGZ$t7+NOQyNH$%u`M6WO03Hh z!pubb2>-y_9Q^ikuahV);EpsB?4#I^(PQ9GAphHW@WuFdJfzs`yrtp(VLWNA>O<69 zUhK5vLEDRjEe_cIe~`=XhLHsHKPoL%ND<_SSxTS(R-**I2}S~#lSawxE2Vgy1$}EF zPdwxPZ$b<9T6Qm*kf&kC-kJ?4i#Rs@w_uIH-(W^tx-6=#*2idD96-_@Um_y>hAu=> zF-qJ|#g`JpB0f)tzC4rAF#RurI3#K2=3!!9+3;U!Dp5pH<u`I6Nil}OMBw>B7>H}} zLoib2K3=P#Wt%0~P6X}f?^n-4cvVIhr#rB53O~@sAY;TZl!T9-H_DZ~yj!_?wLxG0 znGpUah&W>(XNMITj!WBBuedgXf0Oe;6lAgko1$}2Xwg2hQ%InBo>EXU=~N6q+U86l zY<=vrJpzKzh6aSuTzz}2Z5NDhT~7{jnik94Q?fq(USYA^V0-VBz^;_223)*rjon^A z3dF9Li&}umJK7WZn0kUnLl$D3WI{Dcu74HJmtm90B`2%@!$bhFcylR+d{A`NgMPN1 z`hPa{)dc;ZS|mG^3*?(?Qx(yAh)(d;pAt{$UQ&EIoj$QZEj(fo%g>L5!_1;xq+HqQ zd+KBD`}`H~f{dFC79(HIKy4QB5{Rk$7#qiW=)*!iPxmiCFY>)56OGJa5qA0K9JyaZ z9<ct<DXcpJ?n$lKAh0-mJ13AJzesHaocH=f%l^b9nH^vAqo4IV%7W^EQ+yfIMq_Eg z;4SlY7nTl;-LdT(ng_m9d~aa+NF~}D_Lg1+ah*+wjna)@i%Og!wI{Wc3qc8qN{FQ% zsy^+i7{i>o5v0xhy##jkI|PD-Q+k#NAnn3zOA*_Z=gU1-%C!3By;`n}3(N7YsUPrV zUd#H>e(fKMNDGfaNC@3~RGv9qI2EBJ0o)wzj;h1>%nX_^Q3xr~B7;XKywyVzNoa2U zKF!DPsDh0qNi6?B6RLZSs671S4EHqz_co`Qj?1;^A`QqJl{7&^47`WX`-?!lY3oHX zk}yR(P3<_B<NG7RWag1E@N#efm-C$Kbt0HP1x##WU;wU{U7r$yj=T&<0x$}XVdl&X z)^cj1*aH*dl7q6bV4=G6q#dX=u9z^;OeGacD8V72s}WciM9?d3Prub5{z>Z0&~Hsz zD;Mk~?Nd=yvfA(?0wxBORL7rhYpG~e+yHbG@EFnrLkWbyQcK458wA4jAk7i{&nJD~ zY5amnYIIPT9Cr?7k!AsLGBJpadX4n(9CWb!>a1M+7YEf&&3p~2vTOF86@y!QCY+a_ z{(?k%U7M^9?97Co?0-uJiW46j_nW`RuN#3B^BdRCoOY>iX4S4)s#SPon*4$!{-eS* z;`Ln{j}*SQP5W6#9$Zm7!Foq(bnEuw=8DS0%{)+sZ@9IvedtQy#_eN2UuQ`E{3_0) z_BgG?3l5Z;GMvQ8^lr{jhHnSX9XUnkKHYMr?(|7ARN+qvvOVO`vxo8oKHMC>yc*jJ z-)WNlt*=IoJ?F1oog5c@>-!+vy<$tKVm=Pc1%O-UPli)&e3k*Z9~3D9F4W@*+@a4k zQ;zX}i3CpM0r=TYacr+rz=^&`--yF1?#FlZiOsg-mo9teQ9fAZvGK!6ex-b)w|<#Z zuCQ&5SCR9GQjbbq3COOjC^VOR`HC9zE%~@(%>W4n4n=p*9Ct@;m8_~??&JWm7JQ}{ z-!8lJS%aE$jhns(^wFvS5f#|D?PKvy^Sg4E^1mRb+c5;fVX<y4xBkuzWFb-rCYYFF z--zVg_~!8joP;=0z^jhV_g+pJb?#sHk*i^W&>hnHbMIHN_Lr!U)ZMA7x4`8C7js#o z@uALHrNg5N@wh!opwM<AHKrpLXEmk7f41W<xcXx!W#^$HZm$pKE`Op<(2H+q!AxxW z{LgO|zM!HH(&h1i`g{GaKNz`8m+-0GQkFmSz=j)fGK!afM511GG$#AdYT9%mY+K37 zDhXfUq$REQD5Fs5MfXd>8uJI<7?-bu$z=AO@G5$b6n1>_eoiNXzhw$zX^>LxSX?`0 z!XyxtyEC?PdS~q+l+clSJCpZ-S$&8-D`Ie%g;-oChK2tswEGdZKPQHTiJhxjnk+s( zK2ATOD_5>OC)Lwi9&g?GcHvqwG4#Sq*h&;($WD<%?J`9vWc3e^hy*lAVfd6w63F>V z^WBKo6d*W9zc<u(gD$%3p9phS3}e~Vc6E1}wlz0C;qwC6K|qALEDnIp@pT$>w^lxB z5loOQB%o6L8_o<5d;V>!%9$lGV_w8;34oHX`YQq_{Hp}8Np$jkYPtZKD`9-9D%yrj z&*gVn|39I`=m-#uFcgVkVAfoTsZPU*cr4|*7I9ul!sn9;31jeYKldvB-S-2Q8uprt zQM#BlR|3mJS}~*K=jwtfr^AyRWe&ADzRPh)Vd@6o{J+nlqoENjGX!ZfqY<Z}-Ngli zteh74Hcmm+c6I&h{4{3$@r!sSS*Xk;Tu^`u+Cw2LkGe2a2I<SU@)Gg*Y|1_e=Fy>6 z^}l5Ee8bH2{wZA&YzWXsLW^M4c#Wip5YmBjA;x;FFQ;0(nVdfv2mkk-{F-aY=5wNs z^hB!(b#msZ(6M1m_dU=OcTc)W&gOtXvP{IXoPN>QCg3<B)ehzype+Z1>ZxTtBuG@h z4j@=_m-U0P+;XpTnufPw3SZ2%GQsdcot8#YwaqZFYN1A~oclz$XtgH?Z+PD92YJrQ zg0Xop*+4P8E3nF=Mx?k$dXgReP(@0w^uW0!&0rsaLipJis}s5ECs|o+?-M7f62FO| z5E;f)fb{f$_^aLDOwx|Shdg!kK&y=y^x>F`1_ZSSOvw}sVFSZ{g_|i59rOqYLw7)U zBo`)tpYKV2*)0*y%dHQ8GK|IQupx&rU7QhVmW47mHu$e=8VIz8Zl^{eQr2mbg|f$A zgxB>OqA69!*cih2;&QPehOFX9erFCI73_ua28u8=1g%XeI5-so7mA$Ns68ap+Hz0@ zlmrAR5!ydJg~uqxu|f5ETKB|;oELpVw^>jBg7g~aEGOBAQ9_}Y-O95$leb-YtVavW ze`lOjz51cC%-v!=bmZXQ>2hOYJz__C+2I>9%D|1rXpc$0@?g0xzblu#@gIEimkjf= zx4vDvH;oKVpg5a{{{RSzvvF~ROtP9hexeg#f&IS0CT_Y7Oo&2$KCr)tkME%_Gcawc z$EfU2mj^Si1;6<E`i7@0lG5t&M_3}CiE5d!VX9VS_Nx`S?LBFmV{$K|<v!XqhhI-E z3Es{VZ9obC*u3Jw?B(Dpi{z2}2&bh#GPGB~5SOQo({<zA_wtI`<$$O}W=bvz7>(qU z@s}A3bF?yLpL{DdhIa*YOQJ7~LlG9xsKqF58Was3Hix#@hD;F~-NM}~T5P*;<I9hk zx4I?Y+t#vcL)dAtOe`)}wL?2zOnq#OrxIw6+_j5_J_IKoA;1PzQh>^Vi4e>huS9r{ z$IWs1v^1{pIi2QvIWVpVrfPfC_VxXJhwa0DJT0F)8+7kXZQ(;Zb^e(>ma&z$53kJP zdtgD|)p5m~o+?#meI1A06JH+o*IM>Oe5rYBxiBZg)t&cfkHND?#ehyE_g6j6riWxS zM}AW5HeV`!_M_;sQVO98_Fc=u{cbt3Cs6g8#JiiHmqE?nLhUxO^u;sfOAnCkGcdP^ zfgM%ui!X0So;8M%F9gJNDl@sKO708ZdK7Y|6-0=$4|pNZrN0|i;OvTe2>M^mq^|cx z&<h)1<(iH6rM>@e3*INlL7`lpXRcEeD+RwGLPaMu<%N%V1(|CO(Q|bwwrd4a*)+~N zt`Cbn1M4E${;OOU_Y)(@i6EjPIbryq_|DD08Isl%<ft$dgmPH<#MDPQ8smx-;n}Zg z6GqYjAmZgO+)lK3CpNS4w_q}GkUF8xd2Pqt#qX8dytlKah}~p_e*k5DYf#|om%*<5 zm9YWse>6tn$1yI9M^vxhyga@jhA;W!bHgdO7kS9)*EDZnL{0!@sjGm$Ll^fj?49S; z>|;OA@uNv~F4-?%)jnH3z&FHZd^-wv1T22^mj}H@{WbwRm`5bAL^tyEOFv-B!}IrQ zE|6PeffSF*jP{uOPIqf<zgN#5=D5Ey`*2dMivDxqLmOv4oqFni5Jx*CMNDDMOUxy- z`Am)-sXbFr2^zfj_<weZE&~y$nCoxBDp7~C)d`&Y8|qr-hsJ>OKX`s$H6~}b%^}>= zHI)69yCdA|tiRP$i99hXIZ7F8=7~!vi9F-?pkxjH5hK6m|D!1m2_xqJ3;a`0#39*j zW%-aQ#pjVr&yv|+-@$jKkik-;21k?+14V~0nwS01F9S0*z9e!1UA^&T%@d6hUjInS zpb6X{kaD8Q!D%y^Z41m2^x@Ed>PiLmtaee*4s=1_0&1&m_Fn%&>mgOqcj{9A=K?d) zL_dmnPI9D}fOtX#v;#n?AS~PYOhEK?8dt>mmw2oNCX`d(;kx(sOmz)-8s6o!kC5%w z$4fZ5c$v<~2_KcFJf~x{13vh<6}h}g^9a(iiBx*~V@Nn8nKU*yrxV6%e9${bM~_zY zjyfi1#Wxj%G%r#1W`v5MA(EO2NhgmyrQ<nG0bxb*++p1PE+5l~R(wfSu6iHd#6vf> zz8+8W5!sAI(}rEhIZdU9utQVqX`H6-oQx6&a}<qh&G`mLg~`U8PJ~=%=QxeSLWS+W zQ_Gati`+UD!*q;+Udd^fPGp#Z=izs;)2CIf8&aB{0JTez5LHIgIZB~+*U~Ble!o&x znA7VzhCzdFSm?c`PQ0ALz?8ik-CJ6*Mn{<6u|(#=zOO<iEMW3Bd4WZsWaydz<&3IS z<W@!kf=1_bMhy2~{rNK8f!G#utT@t-pa;G4`alTeAQi2YujlQOq9%3GYS6V%^s9GL zU$pOqyf|g<t$mC(P<Ym%`PdT?QWQs~9~i7=<9egXKh=-kL!Hlcz&*exr=5uYmhO3y zXGK6GLgAk{%WC$KUR<<+9ZHH2)6@4569El5QRG=9<FK+Y0gYtty8tAD18N#+yeLm& za>P?t_<hw`-k*FiDNTgJ-ma}0O(*D!C<e;>hA;uG0z_Cv$-ZrpX6W*Ojzcf$bA4pU zN88|adxV_V<dr+3OB&rW{E2bl;TOh5c*N*XA0udV6A)uK0RalTuDENuI-y@SvX1d9 z(~LE-Lj`1!(Fy2uyHK-h@$Iea>%SmY`l$?$Av6*fw}o|hG}Nur1}h`CC?iiZCs%f{ z1g9b7vTeFub~9<EnrXCNC?`8mJ8XpAIZen@lHx-x4&pyLd%v&^{9h-ZL(EQb8PQnW z1%E|{VG}q-=wO~0n4p%2uaire4T{$LxaRV*GL;TW*&f*E`S%IiWVF&gg}v9k^)S&0 zavb+*efw(KdXOC%U*JdSzt_9$3b6~0Vx}qeH-35xOmVCIc}3$%ez<vNh`v~&cA}Jg zpSo#=engWt^(SfBsOT%Q>I0$a@QBbs+3C-3;9ZIz7pgyPq!QRk25}nymLjJGa$%=+ zU{o-Xy>hGMmJ{ccMzMP5md2U*_Sp93UyviO*c(s=tc`Kdu=`QewAi4?ww0~om-T$k z$zqgy!mhSM9;nnu?6FW1WQ*-z{2-oLm;CHnk@R}1(v5b?XA`@gr?K+UPQ3qmaxkUy zhH%6Iine9GxF71cJgYaOpp|7p{BnJcjels>s<MyWV}v)t+h;!LVbLh^j|8=0#9{wc zr^z$sB9@=_zi!6Q>*q}bFTQUDgzDA@LYe2QVg*C^wfg%<v_P1-aDmJ~llMW3KXm}~ zth)2?i6Te#C9*2f{$=9m#<ye3Y=`;XD{==miOuW1p1&Z&6F<P5kFkOQ-z)&{^_;Er z!9`z^``{#+R<OAp(^~rtS9@0E=A%&Q1BI~o3N{eGEh$j|a}|I>R+(b|Wv4H=^iDT0 zk0F@hGdgvZ+`gJ3c}e?Wq$G_c?9{bDRsM;+1Q#iqnT>Y=bgnEwA!|CU?E=25wZW^` z;YU@xMu@2&*GXkch0fif|6Ad{ikcKfX2K_KL^Mo%YVpl4_<9;5jbWr=sbT-mtSX4d zSLu)iWzg)}i5ScN6&2edv#?V6VKoJ>{+C{VO(P1R2~$ha@lTcOV9{>|U)EoZeiBf{ z?mSMM7|A!%*8Z*9^E1-~_x0MY?~1D#-)Wxw5gu<l4w=Q~`KFy7_&fk6(!4&N?(aBv zmtB5$Rb1qG*}vWiwWW-KVdG+@QQ&EQ&<8Q*_mXkNP<LN%=v7XwYaO^p*JRGly>D$C zdKyohO()oI=6`Qi9lQwioG?dW$_r5UXlz)}Gh=4vB+NQU$M)`xR&wnlmeRlGZZ0;a zCQhhBsxEb;d_a4n`Tk=f7)%Zr-q`E;xrz159lwje_rWQgXMmCwMvmGLSINRw$@`bd z?0r74tdR!+WX!>TZR`Zb>?EnQ1eQlTh454Nm%F%5;r?Ot5PcrXsxDz+<zd6@@obs9 z%Rb43sR@4z&yXyrv>WdctEvBsyf=@Ba)0=TXU1TL!PqG=_9^=kDlub=5bdaJ*(w#K zqGaDGTUk;eB`v3<y@V_wM5$9+Whpu;LkU@)&$Ugc&N<)Tec!M9_dL(}<4iNIVP=|K z?|H8kCc@|P+D~#jXH(RFWy(R7E%UjEr8sP=n`VY4^*2%$B2n=o3KgPVrNaIZP;Lzy zhf(+hi*8YfDrXNxyFg<$5rI4MAh(vJGn?{!^CYgi;`W76BBWPpA{jU5L@3Dyp`Aa| znqXPd$|im8-rc6^HM|P<osXq7TtZuuEwka;WZtQ0hXx}VAsSrsM}o`zQ0RjoA33y@ z=CqpLy64e+$c<rGvbyDJXvYS93E`c^f)b@(J#o#8PG>e%xSG-PPpELMj|<Cx)7d#* z9C9OhsDiN|PWgixlf#@WvRLb_CSI1=m7|sc>H<5B`$lf~7r6<lI;Sdb5{#<QES55C z3UcCGVY}ntdt-+GnmyGGXQkfvkpF5`{KA3N^FV#naX^G}kVx-v;$3UMi+C$0asD2p z{F-+Z&en%xWr}5ufMH=?)_(Ge0OT&j+ngtmoInUyuFiAvSf`z%n=t#!_e0A^m##sL z$o%1ttdy8@J#P=Yf<n<X0^1CBqtuX4ftPsP4ZormeSuhpx)9&<JC-S{?tcmYl^Yp> zK%EF*gb+kz;SiVE8y1)XZBB%Q%LW~f#tELQaP|5k`fLGA5LLh;UR?qukOY`75{FqL z^X+RG3|Yc*i&T?WnQ|5(Qu$8XzzyUC&_~%<&T11lP(wL*<G#CpSrq(UvkJO$Ww{x( z<PdUg--T|G;E2j4*Icey%xe6mfY_tdL$)7|d{AlNPi)k}OG_~-rK_@(59WgOzRbx} z!PepYvh87{`P}UcOAV@QuvDPdhy=hpt|C-l1}9Z6%tk?$hLc)|$J<jwC@|v^*%wr{ zMqrV^U-6-j?fW|j_F5+Gv?IaWbx^2eqY^95swVv*XP+KHeLJZ4oug!s`&f2B=qB~> z`tFLyl{^1x`^e#Tj}KI{z1@uJSfHR^QW6Bo8B{8szp)pRw#3jcN&U47)v$;tQsJIX z@r1>r91s7mfez^?igczof(XLtkuoW5z#_W9aT1MK3gGT^l$OL!aE0`6JR0_c`fWWu zgg}FBumRN1h8$h+IZA(lPs98n<11Y*i*ltxoV+AGKc-RQY{Fy*V!s*7NCW{A?kN=) zZX`%FH0aMJN1e2k9gXe%jCQa^9#<u~l`1OiF&n0DHZ!$JYhc{T$X2JtQ_YwXt!X!L zu~e2E#pT?)vdp&=doo9uqj90zAK()23%LwvRVv)@(!py|#cMvZMhrt%OgyvWr`c15 zqztZ8K@li5EGj`Dv||#tswT|z{@7J60Yf~46lVC6#<TUi8`mU`rdci9GrV0|`ayH` zh*Q|?wF_cS)D7afC`yK>-VfYtNZj%^Zr?hC<QLkywN`)G-3hkEuUoW;0m=>1&374G zjun$~Fcp(xCXyoDp@|7Sst{GGGN|}3#ABWK#Iq%UxjVqKdL!x1OO^ZQUSAc3Oe9Ep zeimGEeGiGOKeLWyrj+5%*gJp{>e{5o%hbFF_@Ovg&gDtm{m5f`jv{vF%ZRij%E~Lo zf2C>E3MU%rVrS)e=fxL-H=Tnc@zRmDRd<Ni*#`%;n&6Z3luDWmZ#XPHztb()qF|$r zssoE{-np#V`6@kj$<a$qz?=*f4fcp}?VJUnru9|JF6fSk=dcT+LEX`)>X7+A^+>CH zj~%G{_SpW~PY7uzuk8k-CChcB!*@0v+JBv#G521NLD9E4CEp&e%-aWAF=OKoegign z_poxHh0C&wrSrha!H1Vs-5>~+8+onK(Ovf|)(L`S{<0k#@34Fgp5<v&*G1JWJ@;=Z zD-WA30gL(Lrhu_>i63lLh^~k8JDpN`BHAv#ZM;Vv1kwX3*LR97FKwI>QB>i91wj$r z%(dp(o>fwRCe*)b?cQ@C615erR9`(y-wC^V^!&wJ6Dq$$J{oRQyP1EOcQB6*JZLe6 z;Ssp~1VA9P5GVRVbMDD^?VaD~$EJu|(;de3`@6V3@I9!l7&GUf0+=Fs*P}ZN6#mAf z!_Wi9;>UE$xwil)`8E=UTy?vePFE@XMARz*?AEJ_)7Q7iaMG;74{mx4{Ta9&@w2)T zVFdJVjXI_GEcV3x{|5TZR5UlKK7`%}R}R%f!E5b4`x1!fpxhQg`JDK)^@|o4*_T+y zdSB&1$0VjfoCvE;%O2C2aLMs+QIRQ5l5-UF^WpOIAuM)lo2JrxS2?Y~riX&Z_b`51 zZkSRvjNT1K(rXCo$|6?=6ND8{%}O&P#5TPP+96x$ap(k|7Ku0Q#R_JQI@sW>GM{y| z5fjY$ECc<|7N0!HWqkd~{-6;3EQ8|Y%s9CUMtK7-t|Ud?!^1=RHbTNEH&utMF*NcL zrZKq;<y?w2Y55$ui4(FEV{1|jjlxhO;ApC@#zj$g$z^1f62(azIfuC2D|#$G{j1{@ zxlxJFs}|aNt^o>KEHkJym6HyN;{%4Xr`J6eS^9{s)`;H(GXFlX87jOGB;O((g?=_g z*Heq$Hkz0@_{~`yaizdAnX3xHa499ewZVZp{&%<3jB>t=C=xwQ?s$%bxOn0bO>G0R zFA}rgChP2<QJJWXNUnTU{o$|;*F`igMspHyO5mi+_7VXIWiJRUM1t$CL1jwLwrR8i za0w6hh<|VbQ!3%W%Ov<?R0ZiO(qU)mG~yvg8DI3R`CdDF^_MYnSG0PqG0XVsDZ(Uk zMvZ3VXqPA;J>Dl1HXB8zk9;#L>zUAqjg1$1Y5Xi<obZXcil;ROa7o-bQGOe7R51}e z-W;z>P3hWqeY1Mqyt^7Fk*5<&kYdonNZS6xuC7Y-fw3;3v|;D%>B%fs$^}6Qe_0ak zjAodDWfD~u7Zye$8S@3sSFqpT7^oSPwS-?2*p5>|hf<;}X_j=Fs=2_u!Aaa~na&Oh z!}xlJJii=~Xyb|_r=$=<1##oSugYV$cn!53eBdqS+}qSwJ7{?GVf9xqs8S>`zitwz zR1g@&HA4*(=BLdfS$f>RPri{uW(FcsS>)l(|BRG2K%KNO7-D8`xm?cD@!REH7KdS_ zsVE7-RLj3r&OUm@^T>CZ=Q}ixH6iyD*h2($YVN6w#V-X@@9u}}Oh~gXMGbt&K{|HP zZrvG!1cDxZVJ$n`BhJ!$%-ZdP#+vDzM3Uv26?+RFTIPNA-!ebo<uXoOSi;&uh>Ri< zq?QK;U(_Ek77!e9$d?%yV5w6W`1H3Teo}IlauN(vfmdTLADowTG2=onzq>xfN^lpo z(~yY6WvAd`q)hTh6T-$Cot>9T3bc7@i}=wE%e+$v9>fJa;sCp+xNPjun-IMlQ?@v# z^YYg2BOxoC9SjU^UD%hg&NgwjWy-s9zvE+js_id6eFbN|K4SYJ6DwJhIOBnGswtPo z$ZLD$-goZFB#q&qD76fll!7Y`{~fo#`QAjq@S8LTQ<<T$hjt%>PQ_9avfOki?(@v# z<B}>Gwf0HN)DG{zojqKB`ii<t>+=O^*0J51p6A1ig^Lsna-Qi`Z(!+skM-ATo&RM< zYRwCZn6=3qdoK#wj6{I*`jf-CPIi*aXuf9-=t%SyG-vH<_IE<S+6Op4=J~w^?xk6? z>{G7F9c#U$3;f>7E4e*mBHMvTwL|j93<z4}ID~0SyCJV})0e&ZL%n7FY0oh44k*<@ zr$5@!PD3^>yD{|0#zj)DhutoXmTj(Q8?*OwpkAPZtsRu&-SQ(3sHjT_Fjz?V{$>oe zB!XImM9v=XJg2|GETa+$iPh$<AM}*jTIrdHhy6wDdnPJfstb^GCfw%vzWE<$GIQR4 zh25w&F1OS`spl<F9-0T5C3|Ez`sVYdG*8hRQHa#o3JL^489FDsaQvw*RDmFT?#5BJ z_<6y{SUtjB8N}z$7d>Hl8+)QIG1P9B16#4X#y)>Ajvm*)Kk@C|gk5Hrt9{k?4#U7| zoZCQYshq*s-K-dj9Ib=+b?Y@f-;ALHB~_HzD=)TkIeNG|`Gj$KoaJ)ziE;F}@^EJ) zEzOO=(af*oQg;!Yi>G(+z`p5IndhMn!ylZ*(^LIs{oud-uZw{F2;LPt#p_rpVsy;4 zWA8E$kYzf5LEsn?SjRRo(!SU6*KxF<4bS-LQT3%T1qJm7-q^d$a5!Q^z{O>j$WR6q z=_w5J1(O&>_9-iO8M)Yg9>gJ6tF{2+k?l*;R*(BUy|=^deuv0xj+H!=yu1ktm)*)$ zeS7#81-;={9fbzr4F6mI>^!RfNZM=TDocLS;<tk1qD_qWuXrnzr8;p4aaS{t8l7Lp z(f>x2L(=JJ_6v!AS?0pI_38O`Wb@-6oJXM@t{a~2C!osP%xcOj8NhB&lXqI`fhlfE z;0MKQNI(&o+0;ERl$b&or&PjEc#H~@RAlPUEY%M}>dHss?>6!hLg$GV8j`o<bRP8J zJj8n~hRg_2zhBx~0KJ>;S6J_9*}OfB@lPXLZVoGVg}AJKKZ=cP&0OKa>iL97ua6f5 z4+mvQkvUD0yuz3n%v4ijahVVDT^*Xi4#XXrh8odKe;hSbiN5ckFr~1>Q)IhuSUxK# zi<=ai9Yxe~qY8sCprRPFULvaepzWQQm=^9a9f>$Y;{ZDANSgE<<$*u<J$*d0N-{S2 z@H_6DFs%qsMVS(Mfrirzn5&IH-QS0CU(f3KaE=;80zd7(f2U{^XoP$OPrgNimg`_s z+B64v<#OMJ+r41Vw|E6zavhiH$uygY6%Bj(TQ)d8y9f;6!vVA0!q$AvYyEFEfv>wJ z2kiwZLLwkD<kSfQo+Jv$GT0@>ySD^f6#|7tLQ0=zr=~zM=4?be&ME1#Y_2+_5A&^x zvDZSc_74Um-J$2Mc<3Oa8m|FYT=smreQ5arFL&#w<x6_!TJEeWNgbh&IS<=eih|!o zcYJhNayey*^`dA@4<YWbAR>G%_nukpi=j<^y9D(SpBEKCG%|@dDoV&i6@=aC>js9O z_X779RynTV9ldk+<;Ud<#p}nCt7^LAMvhxb<6K(A#iXj06M1yPd8o|Jsw83(qj`^Q z-6OiOd8lhOZq+6cX@UAN+Px6(Gzb41Zzl`}X^g7)xlvZ8q^!5?FNT*az7rRD{Le-k zuiA<1keA{X&09v-Eu0_Q^tsx+^ZhGq9e~0mdpFLn6JHfaj3SDYg=1E}QW)1?H%taI z0q=AJzwJ|Omg7%+QwC;WCf0Wao$7xJ)x06()>ObYoz^-69}pq^iB#8KRwEaNb)JA< z_3-+pgp(q+!-?!~GOl|u*Md3$@q&f776Qi>s8B-c=+Ko-el;&ptY49L9cr1wgJmZS zy2ItY$c&UAydy=T5#E-C%787<SI{OW{Pl>F2h*Qqm&<#KOF27+8|>trr-Ns9)eg5S zIcnYz>!o%*q8lB6-%i{lURJJ1!=VI<6XmKV<#b;2oZ&8KJLSPpeU>$8ql|t7apKKU znM)jEQlZ^39t7heiAoEJklNI7Z&qn#)%zG=pQ9V!2zl)gA4d(!V%`b#%g+%=K9<;! zLif;pdzdPcAfTrq&nsw<inqjn5j`12d*j(L<`V0-anra3_xPR5&-p8KCvgWd$qP>J zbrrMi+r70ZQ|4tOKTH0MKvPI9m!U+3mTOI{v>;y9!A#3-4mT-<^-`zT^eVLA;vXW; zFR-Yt=6jHlm$3@<%t+uRe6bmhnJ8PSM0Ay%D4WEoj5fa;F_Yd+kx7j*t}`3Es9C5S zWy}y2oWvCdC6D0tuG6@ur!;$i&OYHa*^{`U8oBix8|}g>PwmuyJ4?_l@6RRopYR*= zo)L>tSP*iZ-7TfYdCDSVmrG*TByQc9hGy|d?#r=Y+ew^0ZX#B@HcBg8qD-?&C->vm z;EQzwhTQ|DpH-Ud-X`<Q=EMkU&U-wzcaes0@r%$?*V?Z6dFHeD9LK6m2%XP;uO$iS z@abf8KJsA1CP+l|J@rE&3b3d{&LuEJ1Mht7M~fIA&AokY@s8Q|YkU{}rJLqCXcWE^ zGz++BW!E;s)+i{k2MKjI0(AK&akZ_@&)J38Z17mI>(5OJ4e!{SC<o1Thw65>68;VF zOtn>yyp~XC`h71X>HQo0nN*@*u`ZWFKr5kI)B%5Z1(ZByZF*AEXS-@Wdz(%~ExHgL zm_z%b#E|tmhp{&*^_2!=pY<CCia9z4wcg$h6A8^wHQ%XStw2g^SF+{$rqFdedjC~e za@~!>Yw(vd;=)?{#jaXYra_?oo=g=BtVRV_6YUKvG~{*;UKXa}1;^fZht@jpmaiH% zZtZVpjt9SK9OR~UnRbnshT&FC;{I~y2pBK*|5z?IW?U7k-{G*e__I>|cdz3d8Zuw1 znCa<e7Wr=jF13#>dpgi}1mB@{Gpxrfc$tC^zhkJ?<wGA9Kt=5xA)#YS#$`qW-31m6 z^aqt~6Bg(T(TvS~AJV{2s|?h14;?M@!pS>!OgN5&J_$WHiCZBkaDVKLLGUG=0mJ-> z+SJiRx0>#ejbU1Ga|N;_SoGuaf>c&eXp)3wJ#}XqsqtCYP1DZ6<lzI?;=S(<dvmB= zjEfJz$$MT_-_KlRaZ1dtd+}}K%545c`!9GNJ6`aWI=Vcw>E5#OweKf!_sSoK(wA_5 znZzk`w~v_Qz8d5Jc_KNH@yPGaj$sL0l)&QD*en7;c4WOn@FcEo(D=@X^Y)zgBhM0t z2Eh$F;@NSl>ijoW%SCvcl*F5UxZ4$GnI#rAsGAi_U&KYBt$JV+!G#O*G>NQuF`O*i z@qD;+&8s_CoFx@s=y{Ip_6@6=FF+}cKitzdv~Nz>?pm(~qtlBE&Mj%&qJ8@{Waplu z;?}l`r$Banl+1)-a=!W>W~So{vJ75<P<F(f9vCnqi9_}hisHAFIVpeNm;jCA`h7VX z^s9<Wf(x|Ki=k$`2DFjl_H53)o=5Gb#S2$IJXLWzB1Q3b&wZ~CE32=0F)VJ%!9-@d zvhNiO-{(QH4&-fcUqU2$!_=@Irr{29P(G>uOCB?pWU}kwKl=0&{>K^<rd2S&Ryz_B zNyrDKR*g`37HH>m%h|C6F{Vjgc><D6;d?fGAwj-HU|pLzgY(D{R1bz7*fjV5)T)M{ z=c#0-0t41~5%i2myfHX!-Y*6F<nX2@tyd;-A2pL)mlg{OWdRy9tM)?P?~yWllXfTc zPC6Wx@j37D8yp*c|87yOvKU@eYyOJ+&Ey(3^PwPkXR*Zyb`2|x{Am^Ba5`4f)F4ex zvz0t#pBPToVm`%2)o5<SA&}Ms4cA2RrIMxZWY$xR>PnrL8IKzuk&T<gT~CS>uB1DZ z5j}WvPa3b%Y3=m7Z!XX@7<?Iwp07z$A$SPM5<wHA^0Du4WmLpRMm+FW!-zPd@Nfz) zk4%jZoz*vc*l8lig3mlQTQXx$b<%6;0YZUqd83l@$?#Y6?mpTvG;Y)_5|Wlt*+pON zI@B2}yJN9KsqeyloF32!^dIi~4&MGu{(~#S&1&0A^H?_^9w&u4%85!Xh_g)OFBRi{ zQTV-bDas~BJhoQYeN(<id<Re7nxity7Rq1EmlcJkZF=mJJF-{fv~6p6QF0XHMiuNZ za+JC48C24~KbSs`07?ybcS9iwqBYEqUc*d)l0kZw5eLCx&oMdKOY@|6W%2zx%Qv)z zc9zJ@PC!03GLbNa3rvfq&ApX6ZV)jicA#VJEr6x#RApe%_~ac&bE*l`6)>X;`*v;A z3C6pKqmN!0E5Q&0PVrf9M68#qrate=`~ZfQPP201r>2M+20iwf?$jkNE$$|m4i~Ow zP}2Q>h~^w0vbBqOuXRNK0N5NUk5;vk95~^p8xB89-f1N8A?HwImS0f2yUYb}29$D@ z6y&1O#>0pr#01mmP?rPmf<m@;x{n7p&K>g)rP$oCa3bNNDoDn557`>~&g6!>@7$ye z`eRh(EC`YzCuK?0s3;O6g^}OIk`_F0`MGD~R^wf>>hl)HCER(i&i7ia*ZL*Z4@4y+ zZ54JL85;(E|4$8T0P@7Y;hURonfE1V5*PU{NNdF9njx+o>^Kqw1fEGUqD64H{t?Yi zT@k5n1<~LVWkTe==e{{@^ZT#Wd$ba?xXd=?CyD1(`CgN*4}7P+;E&fxzjHpug-)Ls zqdZANSMD){jnbf;U~c{qos<c;I?sUHVevDk$KZqKEeqV``8j0CS@@F~v{w)C{Ez!L z<^+2@;GXw26^7}YKYfs3uCjhx1wPo3t=1gL0LWcz>W2*T@CqU8GoC=%m%0?Btg-R+ zUP}+v^3x~SebZ8us)vDELAWsUvzBqO$8Zk$?Z!zs6P$@K2f>Z-T1ZaLB=#?ee~vW1 zAYw8vW0?uhbK%(jra#j8R@548X3CidmX_CzP2%JyGP{E+B-Zh(y1cBUgvUz0RTPdo z+S2f%8#o&#PIadQWf|rgC>a#<OF1g{82G*Oj#~B5Kk%J_<{diyu<>zfd+;^6lBYev zJ`Y-}`wB`}i`IB>7(e#8yktR4ynBG$wuj6AINns=eA(^%1eIThU!}Jl{O0$^bLR}p ziQaubhf8pvGN@z3*jZpWr$2GRJ9Wf?D=YXsBTq+0lXHpp!ihJ>C;qJSh{9J?-3z_K zJ;7&lVS}M>b4O@g@sjb~v-f;%>wDc3a?deOFmd>Na&&*~#0#6TKd!#|*6{U)afflQ z`-JzgaPG0vWbGYcTA&ZaXt6|Shd?jKB<`DQzOnoObI@2}_3HO7FIXI1Z|h9=Y&;@i ze=4`nwIO}}Dtqm%yv*UJ9UK#HqBq^W`(5vz%yr*6x8|G;7LT3(JSp7!w({BW{?KZf zN5<pd$SNZ)DUuD}nQagDPU5}_eDM<<dua?n)PNcI|1!nZQcZQC+X23MHZVW|8td|n zUhNaLnJL}{^m&Q1^?5@-Hp|#1N6EYZncs=KYbQ*r?tc8}`k{E9KwrU$cKj*vFL?06 zg%-GJ2{hEiSrt#{cV)G(f(%S{ifPRnVTA&t=cE46*vygRzL8%Bf{Qt|Cvj)qyD2Z1 zl?M~cE^z|#_;7DoN0C=0+hz;MlSJeOUp2=R9ooXWSnU+%U3DpEwqE_|&(E(ZjV{%t z8*)dVd7f>XpHe`pijvL!FxEWWd|zNxrnR(h*I;m;^s09fnn9K7+s+0a4GuJH9<CZK z)Dci-l?&A4H4R-}4qkHObes4jr6XQZp@a)e?1)XnkC_HWP2x7>ec(tnEgpzVCuw_5 z%)cdK_;EshIO7p_jc(oD7(HJ%T&rrZ!$iUQ+yW!vN}WlZ=ljR4wmZ}o%@Wx5de7J9 zzjD*u5(i70RY>6><;juUDNC+*$H-{A7bKZA+88G{)pQ4y?WWbfA35%wlVrmhdF`d4 zBNDwtOjb}(@?g=D*d8w2@wuU6i#A*)#KcI^T;zhRhtvcGqh!0bkKT44FMF}&s_|G; z!PW%p4#h_?yt_>)p{FmqB_B>%h$}TPmLZ83dmPqjzZWeKY{bCJic~vA6mC>aFf+b* zQkd3d6LBF<d#;EcD$DS3P_*CUnKl+X4!GFly0==C(r&&Ts36tE2?F)hMb;#rS&ReL z-G?cwAA-AyL3e}d0)ceD`XMJU_%IFDOMVhvf!)qGiL;4-wiS6pTWROIwDV2DN4k&C zzqjO{ReudIuu)!VKz~1Ly9L-)o@ad}JaqWJU$QSygV{UF(<7^9e-~LzO*h)BQnuBQ z9a`1>MRAzWwBj%_v=L~^U(pLfx`a95k1iZg=Va$Kjw`}34Y5WLMo`FJ<at8JtF<1i z0E&o=c$2Gk7Siiqs0rri9S1-WOxjF^!(ga`dzWzy;HSGj|4nh25|E+q5va!k{y)MR zBYw{#$jkP-#HtOP(TJWZ>HnS_{w<#@f#F;}-ethLbfr=&d|rjcp$8}Yn~NIRLO%wT zO@1Ph`Qh+$apC9uDF-_(FCp9K<Fuz=M$6@#(`dj;I_Gg&FNOB(XfrM`s7tmy(ECBZ z>3991*qlq$`J6J)hebQggWbYj)Pov5!O}y1#J*i~4&3d!1KK0NzVOT$JnXt@s{YNR z<jTfGgW@covIj{DU`bCvTC=9Rv+7+tvqCnGvBMN^$ExO{g!ynp8N2L)`ZB;V(nemm zdd>imH69G`vzqc)BtbFDaH4qZ91|DToqeSjbp&!E`3=<)OjQ{Q2L5y^C<5(G8}0)h zfP%xb%mR({J4eb#x9fkcmXls%$dEWS+QFzwGP5j>$MJ*{PJfV%{m5<G*EV0mA+PV* z$I!D?jkCP?l31cUSI(|pe{(1)BS4+@nHtPd)hT#jO(bdxb*2Rj@o@I@?rquB>G|M~ zBGCCpEKB{W?S9TlNX@*B(?RhI3N+=mgO=K}D-Y>C)V5y(?Q82Grp(_(QZk1q3=lVA zZi6@MRlcfGsU!vfKC^FZvtUBzOP3W7@wg~ZS`vOcrpp7~a{{Fcl8GHWNFXKptD2st zhb7isbE25;DCDq0AajjJ|H6iNl`n&yB7V1AgnQrJr@sv-Q&_qD%a%YZc2At0*y9Z; zt0P=2MP7Z8n{I}{I#ocm%F-P%l{vR`awSM^E3U<-f$Bmq(22o*&J$?*#sy8+fSK%* z9~Z9Np#r14b@lPE(_<#xeq!6(o03GOxi|7pAuHxN*fZXabR5USPt2-gEcx!hSWmxr z<~uL@4hE?FpqVM*sp_tB<{w8h5-RdNtdR8e(ye;FTOC!e)%i$y>2SHe6V2XKC{SHb z`&!qb?Q*0xvS~moq|8f@66L_)9W$%*(3X=OH>2gz6db)Ciw5lF31^O~hBym=6b_&p z-6Z*g!oo@XCIo_zjEr*gL~b%MgmKVNc8qBHjiBUOEyWqe$1RY0y?>EywwmvoD;ov= zd~iPeo#bUHN8IAwePh;Y%<J0z<I17EZzw&bQ($m~J5}Z>l|-Utkw_#jf(hY}oGV>_ zcN<uk;O6PIhPLDoIvRnwFsn>_8~35v{nw~jTj?()zXgu}go=O0%M3HbPzswWpn(;5 z=$DikykJTUhuqedvU(Ko>ANA^pGKE0X*lKFl0RGZ*6NQul1QBb=n#ggw~tFxUelc( zjGdNfeDT_1yMO@YkV~{lnGW=MK6M>vt@^wKw*K=^-8pe1g`<NfGm0Lxy_?PVG@VWp z#QtE9G;Df4ZN1v+PeWF8L2(m2qf1sh1yXjzj7N8h>?5o<IRjH%xZ;(Io7u>LJ(`Rn z35xKGqKfzKKn3R9fcy^Q+&~3?1F#ij8f5Tr3cf)3oMi?b$vy%exI#@MNTbGlGvrbm z8CAIgJb3S+*<#T)!P&Pi$2~aK*@Gboqoa14Ha8Zsq}winu8bK_!t+TsbG`SMY#~U6 z{!J<ZdquEZL=A>4Vy)nw0OYk{WcEJ)QQ=i#4OMtaY`wj3&7qf3dasVDEZt_puJE#h z-2HA@Um&l4l~&IbQq3d+$j}Dc0%{~tgz-}jl&M}?@d>QMfRW?UW8H9=a(YublDSke zdov8>A}%ESQ;XN3=`CJj$SyHjKl)#4@tT&Uh=5o9%wTk+h>~eDdc2wnFOJ#BLL<-! z$u?Dk{$D{8*2`|zr1RBS3dnERtfZOndjLUVZ_veq0)X8KHwuC2#<R<S_QOc{YqX$w z5=hYNKNsQC9vw(o8cmvU$>z&e%&#ohC~9kNoVlrj!43A2D?<Y_k7Cv5KTWV;lPa2a z+X^n-FoLVF;D22R$;LBdPLAL6{KBpW#J8S3)23ED(8(3-5}J`a!LB5yg@-#J8+8${ z(P0&K8z@0TIj0-^CZ=merJCcl$%4wPuM+}Y{IrSMEUk9jxS5MIPW5hoipoJMUWh8w z3c$=N5jsFKP#=0Q*cQB-D3Bc%x;~ItVZ~Tp5mv#dI89aVFY@WjnQg(8vn`oN{-C52 zy-K%kYueq5-3Ifyy*l0tmbq%QL_ax}@NM1Wcut#(cE+7S!+_|gYel&G271Rz;3Rly z5pN~KY2>iIXctJ;L(jYxK5b`G-~!P~rbmitTsY@+<dJd0QT}Q@oC`6DS*0{qrgv*c z%y=-JPQ?Rqjua|#AN;Luqi<)ogUDU?HG>sS$j`XpM;=5{j!oW)_1zTG>F?%g-2qf_ zC=9#D6HHas1#hE!?7Fv7_`nxs_*`xMY7f1jOAIN?Q$!?ivXo-x$B|vRH<b}B96*q7 z^nx#kE++D91G~--k*98sLMgOtpBLur(iCLBhh!V>Ipwn!Vehs#bZ$9KcY!M3cm&5* z&dcMnx{;rH&vD|Fd6mdocDM!2wuG~pJGB?Wz>{ft%S~&Hd$AB4cF}lz1&X<VXPgPe zUYJ|;fpZfsMTx(yZk99#;xkZ|S4bawqHwD*nRKx}n4U*>v_i5x%l-lh7FzLsn2Ajl zWo<<;V0z6}q53%&EX}K$$6S;L2%5Ni(aB^kzzK>A%i@%(AIWl5u}VKz0Y{}2i+ikD zW4u3-E3mjs%uk2_vJrG+({hai7mntaj$fZg0FQjf$1$Y_-@%dD<9+dCm9|^Bj^SFI z`i7eN>Tq|Cl<Zl0Vkh;Ckjvq!B&A5_+n{bcat}n8aX$y&|MZBFe@CUv^LuKEBoq1d zq*<9gN?dZ$kzFHi;zwkX3Sx%_sz%;wRf0_>vU_E_y8;(U0cT*iwLJ1g-^TtiU(%Sb zVH{p8Y*2@u)-S^qpU~GfeBk(>xG}YmKaY|RB_;K^#PJ@3&<UDLso03O`17z0{3xno z!23$dI^gGgi#YrxBEr<cfI}R^8)5Nm5CY$Jz;^%DUb(Qi$4_54L%`$tRuG%lTW1R_ z?^tz%pqj#co{=^?0j}*LYTh9$lf1Tmme-GsjZK2B^>#=O5ltMTOC(W@>60Wh)afOu z^Zvx`cdhlLZ1fLwc#Rf6WrhS4T|+&CbS8`~Xlc*aUge=$ZB=<54Xi`g4ueK5j4X9V zNmJ}H0xsb)1CFJ0C*WUF;F1UYl7hY-M~8}Jw0UmP@<kFTi5spn(@7lw8Gy-R5x8^j z2Sfo-#gs3jb<0(rStn+z6@q>%?MF6w7muZ&wGL3N_+>f6g_jSO`?=q~!a{1AEWrXU zVSc_+2#?KuI_c0R5yc|@(y%1UQ%}KY%5*s|5(GCd=<o`hgnUa46;M0ZjYicOCO8Y5 zk)8`9R|YIsaNf2_e81h_qxpEk=NvnQd<2c5emF%4jF2r0KLnTMym^NRe94`in-BC^ z8Ydq(tA9xe3T0Y+u9sY<zZPIf5Ifu}hu{#a^lMJ?dRq-4#W40^hRbH{-3?}501d)Q z-c&{-Vna~)D`?Z@pX#^DSz2LH${R$&x9z5;gkR+QoAND8)SGq)>WE84amX*qME^w% z`hP6yJ>7nC;zdykT*5}VcNb2opk=Wz`=et9YoQAD+UcPOn_BWcvaQN%!7v^YMi5f6 z@&it6G^FVWXEf0yW*pK&f#ejXDtngUQ*sIj^+Cb-iI`KT*LT#%be!Z)y>L}n!h8xj zfrx&;U^2|U%;7dz(zbp@z^G294Q+~`hvpWhfEZ-`md9LwZTExG-zk2Wgr_LKUS(kP zz|pZLbo`BtIA%f;MY%~_R?fSbH)BWz!x$8>`po~0bM9UQD@^Mf$9l)XWvup-ve1le z3mk)pf5(7OsR`zs;9oIX<Ov-L-9-4Q>+|o9LF=xte$O4XF*}aN)tk?boFy`6D>{Q& z1ZvBd&oalwR-9l3IeQt`44TdY0glMVs^h|>Fy67^h{#Y?Ifmv$BtNYhpGcZ`=8q$h z^TJZ1o@MPn#WHLZ+7zKzR4r83k_hs7+|4!J8z*tCBavLPG9TmOs^ZLQam8FxCV6M# zo@t4RRc#svykOx&nO5HsO7I`z29zUD?*3urxOI2vY{mSMY(bfusjrT2)GTXmJs9`V z$7&DaVH1Z6J4~X>=Z@|^v&?>!H+7v^J<|c|sVzf`WC<8w0!1$v7T~mEj>v7Oe29D| zc460Zn6bOd9wGhtO<0A8E)u-Z6YF`B-F))Z0>XZ4+iXXnbx#g0Cn^Ap;^ce3E^Qp% z21=V-G^+dgmC*Ns;WBAyg_VAjICm8kiU^#ZBlx@}by~0@4a|H!GBEp`qJln?H)lQW zSE#>8kVLP)z@AoJ=f$D>dmn5JoKeQcG(w**qK~P@|D=xo%=bj0)gy?nHpN8<8G^df zb~sg56aibD-<I@`29+cjY|w~M{OjV3=HAHD8c%&RG&;<%TDvDhP^m3RCggq}RGYFD zhDjoJamPDzH7Td&hhUw)oCvGbV2jQ;@xj+E9m}sjOuSVtZW~xSiR+zMax}0wcIZ;V z#4{?fu2zglmNG8N7U%=Bb9>q+>^h6Mzxi<w3{;pggvW|0%&ddLIIz4-qe&T`LPEmx z#8)4Q2<&_jI47p<{o9Eg@2{HegNZg1E3^HSMK3hhY~8(005moXJ5|YRk!>jAomGuo z!UWU08<d*{BC~ndUvE8>An<79O)Th2NdX-lmB7;a&P~<GEl(o;jP;Oao)Ac3jN0Xd zu|kZqq+M}JQtlF32?Q=0u40}{!xu*8Ujmue#`LRwUpsL4)}50%){-Nr5wtT~P4v}e z);^{7r{g*w#>%@t5&GFw38hm&zh36)g8^2%m?4AanQ~3Zk4p4oR!{<Ws@WHLeFr*W zSVTQ7f}~E1rTWpT=d87)#YT{{<!GN*pSgJLj)J}EmiotHWi_Pd1G_jcUNXhHr$qA6 zS}IVZFcZ_jALW!2r&fLM?`bsQ&2liIp?~;I;kO+76b-|fsT;9iWen5_woGGB5P$>h z9T38qUEZ6rdO#9T&n3^{%l~muGqa^?@ok4;6>T~FU0!y=$uA`?d^EHM%>;iaK-tSj zj$P}s&GEvQOq{~rZ+b?tJoTi1h1YV1S%GCfMp$E)7<WF``N7`;8@rPlINsga;tyVT z)aNc1eWQ2W%Jd|x%%HQnFqtBhYWsL(zkYcmu^f8+WU7JjUtdU|16q5D*J(dV-mD*D zdEft5sr8VBTka!`Hp!S!D-6hphV9IcHd=q0|5nVhHlL)nD+5TM)>L}M`l9BdGXzjf z@elpz`V&f;)TqBsq^Lcpl8te0L<Z`9QLkl%6;4d+q(IxSuoCoXBuOMP`hv19|9yoM zJi7a~jh!C)`dUE{?M#R3@?8b~kc`9Y%;to_jrRW%xXGy|RnK~b!>TC4uwdpCq=Fd# zW99bpM;?{$yD)d*e#wSH>J)>2#5nzRU6}op`y#RpB-aeQ-#^pXk6mXQ{8KN8j_kL1 z5aRW@aJfaDq6u4s**5Aa;v2Dw{^Q8dM%%%ex3aYx6wJgxn%};NLw|=@pbr<>TPW8j z9BbMu8}7sO3D9FiQC()*CB%Nv0cJ-=ZP}A5;xl(|!~W(Nw8Wf<mU@Q&dfpqn2jHDJ ztec$O-N_zgVJ^O2ZQhZ3IKZ4pA+1yZhXeG$>;#spuUvhH0V5-rRS{SG-3i@oiIgbL z@{qNiBO*vh;^b1hnb#?^L$X1B=x78p&^h<+SpHz~ByM}7%*bm8d|bjv7K6bd{MO!= zc_cqWCIlu`Vg~~wWipcma=PQ)E0l=QSv=~39C%6+iAU!4@SD`w0mHm|)cA=T{iF+0 z3=1yTbi64Zbe&S>92fU>l6mA??o+{UeCO!SP1*C4W}Vri{=&2W=Cvh<&m=$JAD>AP zKk?NQWKR`|n?zK;bI~BC0w^sAi31!~=HR*gSq#er5#!copuY^Vyuh9$F^r`#F?*F+ zMWgmV=J{oGp*#sZ!KPM?rOJ=5tl{L9vqm(cMR0@1U4-CRF^BKT$XsB7sOA}VzA`H? z@cJ1co@{3b0GUnAF67>uR>{^Wx3TTbW$PHr9AtNh4~x%I-elf;y3GC!+dAgv9kcrJ z=X|5nr<g)X753{O-6O)~nHCO2F*xBU2HBjQ&EUX7v^-xu(8e~kwjB!IZ|@7KAmNPt z*5<DEB?@rnNTKw(6a56q(K4Pbej&_LgvtvrBEYzVb*G@h9XtGMdlQNHzJMPLrf>0} z(@$Y%H{Cv`Z}@UGpLT{>(p$Zk_AR|?ddyS(RvahKiumPhqx%G89O5Jg3yFD|bV=SQ z^<2GO-cw|s)s|}~E$4;rwaXRnt!d+2ck<+Fl-2?<mlA-(C^0tyt)TWIVGehBE3|AW zE^@SXjRx7^5c6)V1iw_EUuUHPN30mNCd$(92EQQj8(GA7QPV`~aGBddfj9Mn+gt1? z<uNpxS0&AixMCDrhw@oGa`}4FP!3<lGyK)Ik{3ri%$9Ven>IGNlg{3rZ87BUcH%({ z_j38WAsd?}l1H4KMhyCco|!O=3w0I8wK~Q_$L@v250*Acho&jM4|3@D{O%@2TSyA$ zwbqci#k)c8<kA-jvkXkBBzMry-%fMYmZQ=(YhGf${}@Voc70Ap>!uPV8(_X!p8ROD zsn<4zE2jB8U$r`SNAQ(2Y!vL?;$XN9r*W6daG{I9EIe6&ypuHw%+8}O?IUN67_K$B z83v^#8-=Py-x?+hkRc!RD0hZR*Mx;3Pxw2xs^m#r18Kzbj6iepqD{j~lDt$y?KVrz z>Axna9zA=Qp_zC@BY;ob)JVtu@q`k;TW6xiJHoKE1}s6zSj&8IX|A}T7392)8QZAJ zsPuftMNyu_-CEY&Q9E3o15yZ&$F}R@IG22>HdsGf3@@duoZ+fib)~;d*>hxQ_8P_+ zw-e1HILCL_y|<KX8Tcrnak?7czCK8uIbF`O;nEf*$Zm978u6~?CVgXNg7rg2^u4Y1 z3;s-GBGE!C6DUMzl~OGk`Of99tk`=+hlmQYH}*pXhhW_uh8;rdmV%G*Q&p~10xWa+ z@T#41kv+^qMK49Me2nt-<;VA|z>wNcG!vYoi2%REwbgdN;<AyC`@O!UEl=$%Y|;2Z zIbrDRbf08|hms8_6T2-}*IAYQN%F8kZ~OVW109W~_jZ4qvv2n$7F?W=Y5a+R!zcRG z5ecp%^NDwy?SNy=ek^UG_HBrTW(IA*e<G~nMlHXTkQ;TAh@NLmj=Eb$j)8W)&pjdB z;XNf4`)sxA&iKTbD_QMQ*BBg7w>c3O|14jEqwq{xf}W#&{`WWF&A=PFW-yAoNkD~F zoHvPU8Z;G~t0$w(Ki{I-fGk4Q9525I{E+3d@dDi;YjfTUj0QRQ1sT{<{oN<t$@0YZ zn$Xn8lixZU`*t+PZi=xkeX&B1vG~EjHB-;e1<EJhZ?6s9aC9iYAQE@IF(`DvC2G8a z6t-liP8Pv4gJC}!I=jDo(V!UzD^$E`5NOm5{P=Mkumf+`p}Gy+&GN^4a0+~txi=9% zuEMhZ?h*|I2Krdb#E?$3sd!GJ#9NsqA8-{ooI^+v4M!kQ2~@lm8Hd*tw#@&kXWZZE zSz8^L;aGDlQL(^E?@cA$`?AiHv2}JejF<)w7mI7r6-#|fHZBNuZT~v9Pbv7z+TiCw ziqlf5k?{K{_RAI-sK9J6Gz$T;^252Ow-k0T$H4EOR)3}KZM%@Jkc>TR<3oVUeAN8A zyk>K+5(-gGiunUHPd6NT`_%ro<|3Kk+y4f$LLC?P2$E0DY3q)~m{RU!2Yl)K@)GTT zofc3{`@e>c6Y&{(HDdSiuTo2_5FdrBxcxqj406^pL=#M7JB)J1K;Z+ZO0%5+o6V@F zC{=rEPY4oHMXEu5;ijM76+4xtbH#+b`DzQ_i`nRl(hOhIENFlJt5B+NOMui{8Bc$! z)}99&G$Ve(wNnDEhzv-XEAq-EbI}L1KLpTxFjdFC#Hh7H2mCHJe9+rDsJ~x30Wu?D z9NSOa+@Zt?_w6~Ds~)>Q#_eIMpz^B^r(g=L?xg)ih)Vm#WtUSq%b>D+&mn7cXAryd zv`aj2|1B5#iG2HspTqyFW7_^}i-A<Ttt`R7lb#y{vHI2DH`;TV4fQmU4yoE4z%~SD zjPPLPWvj(i1DP$S!K-9pLIsA?*K2c<S%xiOTks%W)u2CuOO+-&iR+Gv@=G9*-wNSn zp1!E8f5?P-&-?~8@gh<7JG?!Z1WiV&K<|ovQ=8oAYu0UYeuX1~_AI$ovEnf&>WPAX zB(;~l2hcY=5>h>V4Z?^->hnA^69S1wqeXLlg7N^7Kz)iIksmJe9vW*NHDF1UkCj?F z+)X5<gtYs(+z=#(gpn(@yokmt*ze8ZyS&Itn%1hh^(enxj*{<DS<SU#PrY_;UFceq z9`{Z3rH6?NKM_EpAK11uE1S9kcw{!+1hy#1KJ;=$>QU`SPW=f@f14*LN-P-NAzPXD z4hs~_E*W0qH_X?3I)`2m{c!)oG0UM3_q>J)Wg6%fgB_MEP@S7MI=_rQO<>(`&~xxd zaZKt*zQz{8c~ytV0%&T2k3GsDfO3T5Y~eNahV`|~yP`14<%GF6b?Ai)$GE`d>)3?b ztIUZ-vaB2VKRT5W`cG(v@CuWfug{-|lcg2QA+qFQmc}jP#JzvDCp?e$IQUc{Z~pzg zYgU5UQ~va|JQ2h)GPZ+C7DZ#;Pqz`n;2LR-%aCsBQpiUYB<cVvcD3%o*&U5r2ak!O zB{rino+1G0E=BM*(pr=6v7yd?r^e@)!llF4U@aPEBBiVq{1};!EVFjYUz8TKFG9yx z`74Jb<pc<GMI`xih4mn#+(Nzu9<s~SZY1(W>+cu1u)tU<Ar@_fu6*)%4pTip1ua&* zB6gK0a-D>OWhj`8>@PfWn+lFRfA%hb<b7BfbxJQw2c9j>L+9WnD_4b-tzF&xI9++M zC_9#Zu4rMzh99}~g|_SGk%Wd7O4PXR;&bpSx(RbQSzKn)M1YjUE0-RyNR{T}wpvAp z(0{78OnP@vIKZX%2gdH%1ZsAeP2zmDm4-4i#lMvIPI!-mXk<u-*L2$$j~`d%{DXeH zy|i`}Co8XazF!f|x;<TQXwjV0qd96hp^GS2C)!s>ZoNF>wCNaGv@WqG*w>}Sm_r;e znxPF}g7WRYQG8e4j~wj>pUC(|I3{G$-@APU7+AI3VxB0E%tOv`STFWL2TEd(U91`t z-r4_MYhcVKw7BH-g!i__YX`OuhP-)6K2z8|vV0O3;~&m1&{!#dwadNIR&(&uJP%^K zrNbod%bRZNfzo53=9hB5C(3@J6s`vM!Csk~i<QA-U}<e#xOMkU_qM9Dp$~>rNAEs~ z*@r)EFWzZ9u0Qf<EV*`$e^5nSdHVwXs3`mL@%iKCyv<{dpxbfh06la(ntDc1B!9ff z<x!p@7><j?K0bwV^(%k*7&`vvC9aEi*G+_0yVrsjK!pW<Z&3hZ1PO!W8k|CMvtT-? z=&RhyBnyf4PvWX%j>wC5PZ)3--;VQ?rARHav>KgwJpECJ4{L<U6!`3VKELh0@%ynQ zpS;H;Kk?7nrotKyeQUFEA~ZK@vGGBJ<PZ&G{$;dHa*+?aCvlab2RX-^8wXjbp)nL` zXNGZ?v>R#v-q1DTYkZ;KbJ#ZUF7N)_s<zBn?swZaKb32fI&61<r99Dj#VuUp<KD4P z0>kS@y@bXug{;k5>M-__#!(a$vNmH~Mj_7mv&yKzmt=amOXUEIWY<*lE~qeXIJj9y zYz~RTAHU!A*5ymiAGz%g<ZW`?)*RmN8{)!S9GJRD&q;nC<M<Z6QoFd#`?eMo^Q9ON zxD{*b$6RU#KnXyoe7%y43V2hN$y}h)mg>g!?=?kVVpr%BC(xZ+0=h^0+AQ<`YAb1w zZ7h+L(8dXSh2aA(n58*eDGNCV9yWm|Y|4%Tcj&F9_Uh;R*4{!ZwDd%d-YNb_zGHHG z;CRl8Yd<U|WK0x66&&U~jjT5>M8^UV)qDvHEHc?vM<STh=1s{5qXkckh}ZW^dhc=p zR}>!{@(e9m-)ph<`&_pE%W;e{cc9x~*JF%0{Ye3ieWU(?0j4I)a_V2(!$HX@94gkz zE0#MnV&j(jeJ<f;pSFZ&-|sgh+3vGxhy0Ja&*Y~?Rx^=GULM^iZ%1q$zi)1b8=55# zgc)7&q7fT?@m~wHa7r6pVc}QFG6V7dE3Meh0zLk!>2vjm`(9x+bpPEYC{GHH?M&1@ z$W@sly`3sg-4gJ3&@sj3)a*7Yk5qimLVmyGk{c&`zj&)>G5=09uHOW4oiQQ_+b%X7 z`-;)^GcPf+bE(CRwcTH5FBti)W1W4Z`6N#3UwGfY-&u9)S9IqT8dNHA?S!(#+D`*8 zvkCOzU+Tp0J~il|IFS@bg54dzBTE0XWB$t&sTnpv&1O%3LZFhuFA8+!>@R6!^GVp+ zBL+0lF-Q=%Lu+$?vkpnbzRu(zNH_jrQGjR6sL&M*0;5GlBBz<8V%4g=2odRvy_2}i z(YO%(Bf10r;4CwCNsNFCv!Rr)#8<_Bjo=bmuyPf&jU;WX-=HZ-tmdLe5DO_qu4YPH zMEi<Oe<W_)Ttj<dd^3#+HlPH!)Hl_%u5g@fVa*r1sYt)RlXG-CTR&#cI{>uGJurzY zkNqCv8VeRaA!JL$X}w+IT3xL`C&-*`!N^n@7tbpjeHzq?o$GN4RA*_5X<VFE%Pp1g zLTf%TCw{rt+VjTYJuoD~nhY(-MkSwtHzAHBnDU>mZ{K)e&yjO%RuZ%1?|Hbp3p3(d zX*ls2qN5iI2}`plnwA?C+N|DUVvYWGEdvwow?f6xr3<<Al+m4?_*<vg`2v7D;l&GH zOo}c;DOSsr?^e$P3cJ?8Y0PpgRuD0x!Eh<N_huFXH6_`(1LWC(MklDaFcV1><W6h9 zF%P!Cb-9S@oL)2P4|Y3x=L*{QHhg`~+c4bneP}I=$Bf{||D(Q!hmSRD1LZK%zQYFf zh&c}|iloXL*j^V=Tq)h(ba2tVZp57Da{A?o<VP#QA36C(TDPY~zgw865z+WPVAjFG zeJ6`Htl3QNWIhTKYuPreaO|oaa~1ESamcte0XC->9(d`RZ(n|ju~avK4dp6sU50qq zS-duhUMs=Wy(?%M&@+(B4?0-H3%(PwgQCEDZjtDxmMs}2MKtHeSc7ey-8T>L%oG1o zL<XEZ1~VnZR<=TZN-zy)o0D(qW3pqYPTcAf&i1V+Z{se8%Pb6i(;V|Z)O4;x&Y{bF z)X%rg2UsYgRj%z&+e!N_v>9nWOmC+of|)w^JI|2;mb!h1`Hq$Ps0BPvRoO;gs&TsP z;1QHc=Ho0hzdRR&GwNKFpkgImyv?ao9DDA{E*~&hL=Msqa6+C$!0_|Ttw&?a^>#yW z^ss}{iv*$kGQzt)oD=WdUTBopr%bUB7>eqgw<|D_mueHkKJ%`uNz0VS9V-i!r61r% z!FQ?;`lxkhK|6r+Qx$kSC~=116Q+Hy8l4B=YPptupP-+4wRN-EA2;&DH-F&I%e2o& z+td}Dc)Q?NA#CoUD|z5AFFcr;${j9}z=JIb>nxkZwPo@>m~VbjWT8QZWqY{B$#Cc~ zupJNUUGV-vO``Y<D<73WlstklaSMZ0;Lyr-$RJ59TKM+ymPeO)hhKeHFX(_F2ZBDZ z9NmJa=l>abBz8=<y{EvnW{8f9c*m?#w;V8L&6kKATEThqnTKXW8&dc`O@Bq_BI&2J zdwbh@Z%jAOBV}utwTwB<K!$X*p^mg^rE9Qfl?VNd7&XnSh74K8O?jvYT)Km_M%ZVs zE1!G!Ye_p9@|yiy)N#Y-g=|ph|4{SV<12qPWiR1yvlP&e6O5aG>+b+WoyMaBeQ})p z|M$Dj*o@fz*JoE^JlJpKS<_UAF74zQf4%%~*)Xse%`}5)Fo^E@iQ8g(&%l{^=Fs#{ z{<I&*VC%A%wG;HYeww8I{kS4Y!PIcRXr)$-;LLsLpEX<$r;iWQ<rG-%9vDEGIl+i7 zE=Ck(79g99GbR|Z<4M@pu{PP6m}5p6?Tp%fyf8XYq?1TKKd~SfoFv$$AA&}1BEN=) zG$`?^Ht=s3u9Q{MosW0JGdb`AU%yY{Vn-Z8RT{<<zYc1G>MlVdnQ2@r92PH3Ixbu_ zsMU^l`a?zaP>C>(ZkV4a(>Zb@__L~|UqYl?ZB#{n2Zx(0XwVWAXyc}6U3wuydC{@k z_V#GfJ-<PcfMz6%pR=04*LUy95w14r^`t0%C(C>0wO?hRZbh=jE^szXaR7Y}GR*+V zDBrJo7v$b0Q5+xgOpE(Npg)xst`H?cn*9)Q=}WhQVI<i?OW8b<oS95i1Z95it#(=j z6EypZAcicJj%^KZ9jn^)UBp2wkiO=t9CM}0L(B<>^bjM>Aqw#%w=eabw_nfm_*<*K zs%Q52!uL;ge|Ytg5<c<_tNyZ)P~p?_Sc)(yw(beo5n~(zC!>ZLl_Egjh8HTz;pacQ z1Qc<380m|^{*<Vw>4hQF3i$+G(7dA+z*tZ{NYq-a-Nc25CoBnQ(72~_dmRDf(3`kx zF9fFI^B%Co>Fz2fgF$jU;Gx)~bdos6m05Q<AIr%%S*2tV{)`09uq5nUHNrBAZ8OK4 zxCoW;E*e^c<SeaBp4y%f0u!=MFeitd`Sj*2Zfgdm23O4U%534&FCp7{Dc9!+OYv$+ zY9RQ;p8v?nUPQ6q%4<{T<tq<iY4-r<g`5?NfY3umN}@4$Uy4F!v(i2uLn#wAY^b&c zRi+tbw7SR&;7mmcFl&6!jeV=%>pJnCZDJY%k_T?*j^RXTF=lIrR|P1QiCJ!6`r0z$ z5I{)i{n!tyg}b%}&q(hu1K%OC$c2hMAx*Un%*R3>W?|%>BKLBw$6Mw!$L%b<GV>{6 z@_7KB#bVei45xb8Z7i>c4Te6*w-Lb}7`N5AXePmhc!d3Z!3%~wC9W_dBRUT;SEw%F zu*pH;tu_3Sr;F`1<_e<UgZ)qzU<gbXfo=@*yema33oH|V{tgik3368~;&CB={$2^6 zg~2w@AkS(SMuxQ@=z<u3VCP3^L30cP&cOu-+l!Em6jRVQ%N$M!p&pPN>Uog<=X_4F zhz}3)n0wK>$NdH%O&oCO0*dI})aP*4`6P_%b;CATQ`iLyb?l%Pko_=$bC`SS!4tj8 zH!gNA_+2n>*{;9B!Fu(6{q)kjOxwAwQ_b@z=Fr}B!3dPJS8W*i-y}w`=rV}ih|u6i zD)<x2^Me%u;zE+ntMiy|jQh`|YFsv(9YN|4>V=SUF!fn_b<Qp|nS8T7fc+H_+x`n% zMN_-4G_i!;tc;_*{!K^wH6}#D1_Q$-BG=_%U!r0n9lP9$ftkv>?6yVDQB_G;mTR%2 zH;Vdq_sBQ|`MumgkYeoS8+#7LQ&2dcI^z;Ed_|qy5*^~Q{BmygKL-6zx(o^jzxZ9) zAEQp}Za-Oy{dp~9@A8<DwFB38s<{kj8;QQp1}=i%cLG56cP>!c3%&=G&-*<&0#4!o z!7-?fj2H3BV=gj56t(=G=b(;wf8q|XI9)|Ake9d2!`P0W@C-9s|7QB~xMFwqp}#>M zzz_H9^=R~X;DtlJPX6^`5F2`6+laqIF4JRDa%_Bp#Hrwbm55S*qLK#nSQY^(!uKE4 z<cQp-T?a}S!g#s2z&%Nvhf}OUPig(f7E?x#N{QU}aV7J|TJoPe21?)P^pCyy<chE9 zj_1zqKH`p(+li}<?vIy?;2xexuOAF9H*TnUHxd{rMp??CLoj|u28F`1lyBm9!OyYW z=~@tRLdP=pOLte$g!kK^f<#it>ou|hpMtzZR2lBfcf>3r$5$a{Re20+NtLd|*7vRt z_jN35Oe51)r+wBje%WYhSNLM%IFqF_a<9FmqTQT#Kv(|Dw^uSXtmgaRhcDui(P^lb zDDGI9T^vL6tESNAade(e-kL_@(`FL2JLE_MmXF;`cn0feHzG(`n({l!8Mjkb6Rxz6 z`ahiW2U+YyU&MK#(It=T6aMhAa<k=rc+xNajRFP*ZVwbL<#}vdLzy`*>apS$P<WDd z9c5)fw*EZmeFIOd|JPjoaDM|LtntF>gp>qS$#V$^6@cZ*N5gW?w}!DrR+{?x4@B`( zP)%F!81U_GnO6(|%R;y?i?;te`bigF^;&Kux9?zZh4!H*qplC}R8w8xE`tk<71#tA zLaB&(49&kAdC(#Ki3{=*U*8%=ce+eIT(-C4G&d~(kcA{PYKuu@5_1-W+-3%a&O#{= ze=>#c?_DNvGy+VyA{to_M`uS^o)t?q7P|q~Wh@H;(dT7&Q?4c8$c<H00BiCvxh@4$ z$C#l@p_y4R0jXO$1?LRf1=->j18tG^z|<}##M5*vxz5}%Ysz;-I37wY3K?>E&*?#d zPkIrC58$(VHOBemL1IhCyg5o2M2Wz|=cCaJ!M_MZeSzs2@R>@~&i_eHR!t3t0+ADY z9P~oyt)K^p`Ru(EsM;9bVvTF6>BO%#J^7?EFI*$S7S-o$N9=6RtTW9kIi3y39{g$_ zHEp$Q+au<DFf~L)C>NMuX-{OfcKXa(1Na*FQK$4S);o23536P0ICLGtEOpmB^?+&$ z6FPOA+8KxV-Vl!ng!q2^abJYW@j#iP0P%XrZb-&=ZC)7VgiNdih$Wv3WZ(Ni^SaCf zocaOY*Ou5PpmL8oic2`qzy75h>rbEZ1p4Po%T2o$FDtr;{Y%KlCS6cj@3x-;5u%O= z=elo4wgvC$a9J74`l-hrMIr_bEAHhEXIBn5*NMG%OR3WELSp~F;zXL3{=(aCiTKuq zXuoK#N9Pdb5He-jU}70O+^b**akbIYzB08RU}}4kGcu4k&*@HIR;BQ(^Qb%nrSia% zBKOp$04+GTx2Dpw%AyTWpd}%c$6NmAd_aqM<qdg9&fwp%K#SjX#_zEQ+mv3H`Py_= zrSktPq?uEgrD&S12ef=)*B4|IF95o9{cxG%yMLxhj<DMSe)6pU=mz+YjuC6TPk#xj z&8K^VFn9a!4L(GnzpBGu)7kbOi~#uwxkPF|PV&{>%(o=yhZpFlgE4Ui&_Kwh;XjEp zzu9MI&lb)AAt-yoUOnV3lR9Y+Zy7@ShIk=%pCWu4lK(!Vx67lZ1Nx^DJY~ml>gu7k z@^vO3N8W`7jq*cvU0z0iApqqCpkFwl|B<nHG|36qmDf|^A<7A5qnTCGWS&TA&=MDa zGJ*da8m>0a@=r%f;Hkr+D)n6>6WiYg<zB-{Ij;fc(Q11p#}KETCXUD##qqWJ?&w4^ z7;i4G8>ng;V1+z06XC32By(x%RLW|$Fe(_qV3cyMz$8wL>9m++nLjuZ;+-=b;{DAq z-^ToVyG(y=6tRISOR}bt_(h4pQ?;G1<4FHW?HA9V3D3QHIf$5HLEUF_-!oG@viaJx z0|n2$_y#uHFSx;AHGIuLP>A(c5Wi|29tjm6C@sHVVNgtVCr|>lKq#Lckr!xhO(mpc z;lg5M*20_Tou7(dsFgJM0){=0SHUt_DK%Kiw3<oX(M~I|^r4#FwH*oG8qocF-+kWY zB+k&ZG3$IXx&nYKqi?t*2*?fCh7@5I`$}{)BaTF*t(vlou7Y`zcz3UlmmJ;^m4Jy| z@ch9vDoW7kxbKOB;?^Cg6RF=k1Thi-h}F7zO-lo^Cx+FrT0-ZLaGWp%r(P(56g)%= z6_M&5(dnrCK)ArY%rhr^x4C`mTo20!;L|-He_E@@EEi%}FYEH$>%e+HoJY6rFwf3p zg}HaI=&K2^f8q9Kvxp+`lV#saQAtg9HS(#umbnXFp3oM%wbk-408fbWz<D?0)A@ay z!s%DAQ@Z$?-72qAcs$kUv&+c3(qnBeYNF?4woEut%$EZ~V5{}D2NC!8Lh6wu#=o?n z51Kr?=c80Z&jhum?uv_0D~M(HsJ47{XQiNGNDCxXbyS*KpZT!M{0|fwd>e(mC9)`} zTZAbng5a6&-OW57uPgoiz_C(~h1N?6QDtO3u?u-0$h!zGCHY$lAIGorH$@2~4{T}8 z4b@Nxg`kLN*Ax4xPvxE|+HdBD2r=`dsdFU%T0nYy(;iiY0KgeA69IZwILZaZGO_P> z7Nex{Zk>NDT#XwBe*;3n)=cDE$ze<o`x$s(^hu9ycS^LuwGLH<RnwmZB@E?FFpE^m zzwmX<)-jTBUp(-qPZ7#-`KX_pPh{axHt6YAOMv{pv{*ei_VeoKOa&QO#Qml_$4C@r zbDGb9qJrFeY{JFkcG*059hZ|GF-G{u+gL%_(x~q63#xVp1$K$EekJ9g;?MhwTYm*# z{<WktUATd*c64-3XWG!tKS(;OuI_8oic-GqDEt#d!G@lZx+!Q+$2ncOy~*MV-O-q9 z^L(s1z)g7Suro4yINi=XwF3O#n3ffvW;JuX`i~Ty_lyaS=eyR595YJlZY51AGGc}t z+U~)iv#AxVIG{4s_Q}Z3vfuS0Vm*oM9)Sw9IPw3`vy9#C|6%V<;Gy2%_VJl982ebV zMaE7gqD4`REux~+rm|*f6(vz(EE%C}Wl4z=PK$&}_AF&BmC{0XX;HQcq5u1{jlFZu z^PK1TegCiD@B4aQ=WUEUjQM=-`@XL0zAm=E0hhRGbxXDkzy0eSJ2e<lnb|mi!SDRD zubJGRps)!Ivly5r2Vubg5{s_E%d>(c3`U1Dc;m_wa^y<0->^OyRr8+&n9PyS`u1-& zDYMzdv7>I;z-B`2`V~;>z>AS~#(yItxaJ;Yha(ktRm%qSQ>>cqxG;WMo!EqmZ9&=+ zeZ%9CG&J32GtXYY^r(Zz#f4jJ+csUrmQoUvzo9>oO_-E^qN#W+(XY?As-L53gvMO7 zYq$+34Z?w16XJP;**F4t#k8~pnM~h_{De}FS|7Fl*`h+`$E%7-5h;{K){;{EY$U1% zS3!O85@Viy4o{CCm-->Xn#r@k4BygRk)VyY&w8zv#p}bj_ez8PgQ{<jdQGm;MC4k> z<$yeXgWfMd+*IUHK(nxCPXo1+CiGE%%$lfGj-v}o<Pktxs2uP=B=`dHxLmmtm*J{k zIG$EFOG)3C<>j>J%n$Bz0%f?H9v>ImVS4<#nwznQb#<h;>8UZP?9<}Q^WtQvYrt<( zn|d?39qb6kB)0~9srrQz4;ySS9XBvQU>3H?PF0A}<iRZ<&OB@z@9Im3g0zg*4n_mK z38qDO5vu4c%l!>&D-QtG0xAdrD>mkveZeQB5)rIIw7V#b7fLlnye=8mQnI>+bq9kN zKZ(!Ugm_adhpe!CcBUZaS%@A;(7u5#q&haZ*X~yEUfBqZoe>idADL54yL*C8>L$J1 zYz<TmZWx79&WKM%K@F~xOC{F0{#9L#C<Y-^Y5IbIA=#n_3?N)*{eGN1DSJvEkqXuy zQ^H7%ggZxAO^s9SK;i(QFUk*vIE(@Ef<?J*-=z37N#9QreO0(4Qq78?mkA?_wsUMh zNxd1ODirgPR<Hy^T*yC<G`d$XNR}=P-I@Ar=Fe>{ZK+!ujKM$*X>vIn7mGnkhUS-? z{LI$5xDslCcWXIaE_|Li21`xR`{<aaTCpX7Ekvw0pg{R!Zhk2bYnR*zoGMd>HMD>i z#-ujClL=MK;TYaT1npBT`uE|SEU(F3VPBr{)2lfMmN1=0si1`It8Zd~wM)4DJGw{K z@*iVZjxbhe(R?sSN(DE|a$hQgKYYECeDixns=kyj2Due6xVsC57IBIKvbrW0ODe+B zE=Koy&R`XQhcza;?{B&MwbjuiJqps3_@BZSa-V|)UqpyPo|s>PbStp_#2C?-oHX8= zA1SPJ{7(1;FMxnu*4>~V0j5V#%=U+H<viMFAh`q|sv<B-w87q`<vobek?>4HSG#EL zCwm2C5JzXUDVgYZG(!#`!?&4J@S+F(tIM%}qH{HR>@&ie_3<B>0i0*A>MJtXDpZO? zq_6(7ofxeXgMPt()eit;g%sDJu1T2t(bSXMKCQ{<_@$e9AT<WDeV*xr)UAHY8@qn9 z=8y3_zq10E;cF(VO;B(J4|qM`e)Jo*MmzUu@81!*MqN*NX2VqCWjH(Tf<Y+&Dta6e zf|O`gRhYTzDldmry$GE{z@C?9%`{k7T4Xv!VM3e*V!>!0JrrX3y&E0^mu!lE{vuK+ zaD!Wh?6mv~)Q7J;zLB_u+c$S%!Pp<t;W0mN(K&$-Q0PDp`X4wr4_f_|+|3k$IpM<& z`7oG<Sm!TzdeK50;N1dOr?e+%te$TpNWwr3`(O{i@vx3r!u6=D)|f?k??saL9)n%9 zu=g)AK>x!9%TJM%J^%MUDG7P>Pv7<1`ZdFNH%U0BcZ?W%uW9qLYWE_K(LhuoVONK( zpy}ei-U41(<z8MUGJfa0+c*L8`U@-otPpb<vI+OmEXw>*L0t1qLCrq-`+?KR6<0Ff zuq~;G@p}+M$)Wgi>0RVft)kZ8446-ReK=Am-IqT0Zi|WvDKF2c(^~AdP1QmwDS`yl z$e37|I{2WkcW9emb>HnXobD#N^LQ6(ll%h+U;-z~=+i%q$$xX^<x%d(Y3Au@&vPRy zEAtC|CVE*)#!HQo_155UUIq0hN7e<Dza9)*w!;wDG@4x1$Un?h6!GL*aPXd%^Nux{ z$8~OuC8m54)!U>l7~Q}iXApIX?gc4f8lc$9{I!X!BpS_Eg(ldev{4+H2~X^)IFwQc z*+I!79#E5g9eAw-V7@4+7X@MTP^nJhkI!kayyIZyu>))0%p%EUsDG{Yp9k+6g*|68 zWE??+yZ^Og&1$x-EZh%a90)|0153=Lt4v8*uUVoW$ij>UbL{u7r8#Vf!4tG|(#_m4 z;)qP-g^-)4R!Am)N$REktqPkEzQvFFY%@Eg_*H=fvEUsDbf}OnU^zi^wO`s7QtG4{ zZ$zl!*`h4kbavp)xhz$MCCL&jW3j$LCy{Na{V2P_t%CqGq6p=2fTM9_t?*?yV-&6N z88C5EyZyr*sVxnrl}gMn;vfxg?RL8zs&Pw##7_3Xpp3Ra<#yBMo_xH34*I+`7h!13 zA<CtVil8q#W}XknUfpCqI{>S15!9z$ITBVE<B~T%^T}-vOC1su_s@&VQDQzn?}p{l zLd6ev7VJI*n_z+FrSb+qx7ZxLs;Ks>Q~_PX1^<y{rU`Kc{Tfoo{~zmyK_JXSKeRzK z%tE*xF5DlAd$b#Sj0otqodAlskg^~s>!B~IMnVKXI@lIn_-^Ip5tOU&ZdMk+)tV!) zEjR@XWT{zn!?wHO(vt1H7%ymu{s!^-SpX_qq)f}s>kJf^%eYQ_>!PbOb`B33WBl_L z3)(qAcp(lSrYCZOBijgb7~G@)^4C_yoJ>$N);T<xSFGgRH~;)t7)&>Us2b8rSZP10 z0g+gBd?tHnl-1FjC^LbTVkb$m&)2%P`)f~C$H*d`NAb<2PBoFj)<^fw$nk)CChski zQzzP4?I1g<TSjO{(p6({e;%TR)g{Hkri*C)Fw&7A_=*21Bx7Qtri22=sqs<ZG-A}K z5%y`+WoTY~pWjj${i3{)siu`^%jHBHj})HnID`hVomx?=Mf-knbD8{xD=S=!Nmw=o z!y|fvOa(E81}4x{bFXcr%GN;)OquOG8?=Ufq~MC9mI~?=&Cs<@-RYK<I)8k<?E5p> z*pfE}m`wW@XOl70qgkvN>8ka+#-7cS_z!PRFe-?Fn*1oa(i&Jd2&}E`_6RV56~@z; zOjb?FZP;Yq3h{LW=|5V4P&YiubQ&zffzmq;n5cw#<|gHTQ*`p*#ZVw10<*oPa%hXe zZn>CCE)+a6Zf62#`_h0nz!6th*dzDF(^|+}({bw>koO}9u~0-~n3{rOHJHa+l$is` zeA&9|>>PfcB96B)gz?NW0VTI317t(LPv7;B=V6Hr2f|UoZ5YeJ+^2kl&QNs2bc&02 zmmp4*XW_Z*D{SG^4$#;L5mflK?bc?T_0?e-{^>Lbl9EY8l5R-BNB{NAM6xKiLY`IV zkXGcNGzh!!KB%AvLa9o7yd`=h#$MHt^*FV)Ie5CX_=iK=#>}ko5(^#^v=&rTcm=ec z^Wt_%h1<%CsT-|crlmj>)>p6=*$lcr&3MN!LXr;AyoIczB4wXynAlV@_=LAbOhoI& ztI(eZBJo{&WrM~#ZGYkX&qY1omHCEXIJjf9I`juCtzJ6T>dqt)t=AvrV<|)4LEAiQ zflbbk(U`5J6Iq4$P)Ge#$qziQwHSr%$1mL6{=&I^C1YDuIGt8+Q7!4j^A;zYw}@$1 z^8N5!-a1dB^nTR#vH1F5xRY6jl_GhngqBGU8!d|A+qq+1z;j2w)pFj47tj4zaaud% zlw}h`wQJhdYAy|y*CX%PVuDF8)KQZ-W#<D=jmZg)>Pcm6u&lRAt2rAa^45m}D|t5} zzM<#XS~wHi8&)vurj)^AUD&UjaNmmg{9S~hTZ?i;s&H5$1NBMgam#=G<H{M=ztrs7 ztg#=^8q!br(fRltfIE<iNI-Vl8NwF|$*JV&h|#eBrrB!m5>y|1?qrXU(1oX_lPbRT z_8h-d**d^#$nA$bJ?#a3r<8oko+?Rpmjk8S7&==)U*u=NU?uCRY8)N2)zY^gucSG< zKA!g7Fcl3ZyIolE`RLH%qgz`)+?*mGrc0uLnVc`u1+WKWBoY?}Dos|(`YQd^w;*L< ziSr4lDL@9}6VR4@4-n&`YxbCmdD@R5V-eUB^jA`)-8DUqw^rs0B1|HxxpI6SoWXw2 zXzf=t>xXY{8nuDNXU_0}N?1f50K=0+h6RM+PrEumSI<w${#a9O+nP3>EDveFX7CT& zPE%)bm5<lCKA1g&o(1V%c;fTh|9MYyHRWi){tlmvf7a4e(@vK}AkH=aKGwq5?H$e* z_$Vh#!ox>6(BSV_*r-RWv%<d>d-%;|U6ao5mXI<38nWBRk=S<!1E=I!OwG4oGfYAq zY;b6v?5y3&M#Yq@R!jF!!PxT7)P@J^Z~k3E=)}9ge<Y8^pcRIyg<;k>F0=i;gcg`_ zPF(!Kj2Njr1@nG}Pisu3wKdEf76p;4XV(0oJ$vhetr&{{uxS#uGPSD#>(cP^zRt&& z*fp3iGojl$Q?V4*e+I<}!KBMfLfU`Q)2zzLurpxU^#zSpx(fga1lKt9(!@96j!vR3 zhqkzfMh5l}B&AKV_6LvQHU_^IMOgsCG>IcpYU17qB30qQ1jctqjInvg)1oE>rxHQT zQF+Y|KDHV2RuzoziykAn2YA~dsZ-Ni7l)tuyvhiEG_B{sqYck*)yUF+SRFV9_^hQ% zzt<-PaR%aYlM~A4b97TlOY9qCnW_8c3#g3Ae|YmDJ1jUrSxK0vV1Uyu@@k0DjLD<% za&FUeZpEvJN$C*S34|b`um6IS+Cuv}PdjH?p~zsx-EC?O?>AJw*V7Q)mC7fR(&oK+ z<W||j)$Tm)9wzSod9^s@_am{lX~2l>F5iY)FXi`R${q6OI%&If`+6UA;>m$tR|2)H zIeWM%Y=I=6Peav~7Mv^IogeIL8*%2v7i*=`Vn`Ga14iy7kQ6pPd9;;2VqE6#sJda~ zVYNn8mV6t5?6^np_Q->Dh31TdC7<txGYuaQ%^W(K`B~3)>z9(0;#|l>W-k2lduc#z zQ&Z43m(a14DgwQlm(!Z0-$~<E^j0YYwr@Q3U&fTbd6$g%mIO<TU8?2-yYTNxHh5l{ zl1_;(RSNHeK+|+zulRcU$REY-bhX}JIOE+mqpLDwWGbq&`bsva;%^0x)n?x<n7g-h z=Uh99>S_z##fw=B$ccXrGZI}8N6-j@kFO8Gk3)48$aFyjz{eJZMLri3ZZa`?wij_n zkNQ?$iY$ZyK;)vf@4$S@)CNJ939%M$L+AU2l9DIY9GXX&p8l0uw>U0kH0BexVHQUJ z>{j+aCwf{+6Ub-~fyOe#X2n<g=tAdRYa9mK-(OBd!J(BLElW6BS}_I&hH{S3Vf`<r zk;Zxr3Rrb!ITz*ou?AYJT04JIm(WW<*R8uCKqnihP0;lsl(q4B-nQ4`t}D9IJ^vzS z={JY>D%P7ZMynP^qfYiJEps}_?F(U1%nSh%P|zSYKQ@TcNDaYxT*a5eyXMTBCo6cL zz+B)u)`B+2gT(E~qBp$M4FKnI6qxElfF$rV!sN`R{hjbLmt%HIzUcm%;U(_NN0&>X z>*)zuCw4GIKwHxamO7j%Le;<Uep)VK<I2f>Mm9p7V*CNKjN&}SRd1QHsnGu5=Q$9r zvqY!@53i|}qvGEJ%tD@c%?7xps$ENb9{nlPUMgUeCnE?5mt;BMwK-icK(?ySDbHNx zf5zlnt-;l*!F%uvF=?Hdy6F5LDKh=_1wQZxGcic(zm{r+|Lvy6j_4#79&G?02n<s^ zLsSNe+DIX=4Fb+g61vO~qEUnaGS<<SyA}t9DZ5vTHtfU#G$t79q3$RQ>}3VtaO@h| z7mgRe{7NLQ`M2)VNKVFP8&;=V6&E}I21WzyR6gc4bz(*;*gg;DAw9l4WVNtnb}#9F z!W}&tP14lb;qlvrAjoh!?#sZWubElu^1F--Y?XQZYf#7NDS}+7nY$dUf$^2_T=he0 z8Ww|fI}CvfyI}4KIUcby$v(5MHDg^1q~3WN9tHyw1_p2t@nlgh_B`<~RJK!=l(DX7 zHjyr@z14#RxdetD7b)ZOw->iow~$1hqgm<GQz5D0t8z%Y#hKmAyI({~si;XDL5QYt zID|h6(%)X2!!EoX_o<>W5_^bw&yJsnvW0yk3d;b@3MQ3M)P@QnAKJ)|IsV<@j%k*F zcuL$mRkah<2!}Mz8zCK#Y4jn0()4nUl_O!B)8Uw!AIGF7s*aH?Dg?(NpnMwR^_uB5 zgg>V*dj99WXZlRouPvlx2RfQf<Bd$9H~&DlYlBhTcZ)T}qtRwPy&G$VRyZt9%ZSwk z|8p?@IC$LFh4&tRDH-pj#$viz;L-uhkc3;ukTB_Mi=;cga$DO~UZz#)ZCI@(O)AG7 z5@cywW#L`l2t_}LoTSkVi_|j}6clRi%Wk)iN}iX*CzEHn;nGlHfaGYX2HBct?4|0X z4nyxp<j{|Y#hB=P-eG(vLLdFY1!`uM40#zSE0~TvQMf(i$bLrPk$(oy7j{GXx1KY& za1Bz@^+%2T0b25;>^a(ZEj-wqD5Gw#1}}-U>|8e2b{o<A*&C1VPTVvup>&G(^F0?g z&wah$t?(kPe>m1}gTHagd_TYF&v~K1gsh_Er^mdb(Vc#wpFofGt;J-Ufqo$FMBcI0 zh!oiB32S+oA9+__FE{75O^cgL)fdweNhDi5zLu(^CvhvcV(ixFn%=<0Z6!nMIGXcN z(Y7L7h}M07=fKl0XH+-~>tDPYQ!f?i-643_falHr!jEceA|4#xA6UecwIFoQphtW~ zdhO^<?Ot-Lh}B($B3g;6FTA|V!E52oBf{El-S0h@ZxID7l&KqPc{2T6>$MGULh`n{ z(>}H)d<f^Y=3>WC0?%lky9-H`L}(GDa!Ls(thz`K?s+F$Vsr2HU7HTB73rFh)&V=X zkC=;|D}MKAU*^c?C6DcN59_eHSo#h|#VyyNQyu8ng+gd38v`q5A8kwi60-N0V^GaL zL>1k&FeMq<Py#DZup<jYdmAp93y^#F(jY;2U4?J=s>*=J?^Mx6^EhPl`aD-t*@i!^ z&7Ul2X2Gx>hGgjMCUmuY9V=x2f{Bq|A@~uA;m?RQ4AX_giAj5xm&Lq)vK=&2R{>;3 zJP*sHv_E_nV2LhaK|rO1O{?ezPUmC6LKT8{r5C8`?OhU>J}v`Bts1pA&nj2Cqv)4v z89>}LRm;pt$J`k)MNc^9FoXUcswh^*&?o84;OGb<qcbEclGe~M(s7x?@keG~qretE z3M#=~LanSDtP?CZVoG9GoH$)Mpvy)ohz=0NT1%^k^bIH7;HYOLt*{XDk$<iHZuq)e zDbR*9>`QgwIgJA&RsB<41-E6>i>OwxSrqE2g!vl1GpJPf9<lJrJ!)!lb`IWKa9Wi6 z&KxzMkr|7u0fJg@sr&&{GK1)9(3K?M^-ZczhO_Ab_fM)%g5uzobHk}{;6S#b|8<Ek z6zHk>C4=eX*PP$sGnh$S@P=^B9zL&KL-T<&Eu^LghxJhtWW9{QFeFOjTDsr8t?iHd zJ+bhN+0M04px8IdgZ+Pv=_p4z49$x8U;xiw@>2n)m%ja={xG9)<8Mvk<Up91JgS`m zAHzm+kZ~LXp<%2h{hKavQ`#b|;~}mdJpScxC}#xZ??J*DkA&I378AyBKAmOx2qUjR z%jRll2Y}HjiW#ikk(veNLAxcwEP@+&Cy5s>*5f@8%+|0+l0WBUMzK`RuAYf2E7Hyh zqvvEw{)kf#;W~xMXMk-KLJ84xTf#O8NkV9jshBdWn{HzdsQ+P!rW5EXu#g1PRsT9o zb)=I;q+url*G$25s5%zq&ueu{)qYALt<eO2iU2o5uuy9{$b)o-q-X@;`RzW}_>LE& z3H&?lkAb?|6AgZOD3`NJ?`6v=xn22YnmeFGaQ&`I_8(V3=;SS9_RB}XXFgbey`r!n zr1$~a>7e19BrFOW&0{j0lFJl0F_?)ACr^^#L{9%;tu)?pz8%-rbjJv&mvvky(oSv} zQ|OrQq;Sk1&I^D06p=is>~v@=;f;Cp6=z%$TF!Zj`ihxX?=*R5hJt6wV4I&%cgLB9 z>glPrMbf}QTZQI(C5A6tK+6&h6z5*U%^PkkWj9CqMyl!IJDGOb_a73;J6k(VI3I|f zng1Yj+b6fdeCIyzYu=kiHu8M+_QsK@L&DzKGI%YOl4@SPg?48p>OXl%^e&Hz@m|pD z`9#6U1(F;Ut!yb9wk>9*h}j0Hje1!RQKbm-k(991cK-+k_trk#Sy@$A7raNRQBlID zS7VZcbo$YO5#s|HS_ZGUt}o(tX3p4d$LbXo>l(nZ?EAdAdxq}XMC`44tu>e}-s1Hf zfJoQ8Slemd`}*>3y(-c&aWA~nDN3;EU&A6P$vmn}6_*^QTw@oAQ;7<S3*zZiFPuy2 z!^Hq5NfH0YVABF%ysJ8<)jssjjBPAivzqEN$64ajsTiG&3aeH{kLcgAFDV@~*dF=z z)m^=Ou8|E|qg1i23#{m>fMP6Rp=k}NuKBt38xF0uS;#UI&-<~h-+tjf78tR{tlrvA z{DsTy@XC%G&AZj@6W~tUW`g5%9@UZ`n_uKJq($$v7SOa@uhOq7IqLEYx7$~nDa0V5 z@YdCgk>fqxSNwLYOD;Np;O;t7G4st!--Nk6tF#xnjqn6Im}I;vi=rD8@K<={F*cJh z&2g)T1YjnwdQ|+v{W<nh3NN<Wi_^<|-YeRW^|Oa3r8Fh1D*N*;scRjSuj$KcHq5)> zzPLq3w%8`0`y|iRjNa7}P7>*FKi^G1e)qV+4vGU_<{<v?(#$uDhh81H6dQrB4Qspa z##orb*fGR%7ZX&kd+9KEdQpHegTBI=loeAX#cZ1%<*DsD(|dn66S8a%C@loWiiJg3 za}h9!(MJ4*`5_QPPtjO?d|Y-sOMLY*pR0EID9*P8gV6{KX%(c(Vf&58p+E32gjepC z2*wIlC)Y^PB~gKsP-zyV@N#^6efg>f=yyOfhO_}bg=8ulCAco}zsju<zd{NHrN$lB z`Ms>>TCC7Tu_#Ce-MRdG8Rl6efc{baF^uYJukw0eZ8(4R8de)+xi3I7gmke5WAe2> zLCCXl>(&PjCsMBF%8qQ4eHtqgaG*jQamPdT$(A9s)5koB1$|5zqXhWDq@Z1p#u}Ys zr~26xfJ$fcH6){L(Pb$_tUTE!56OO*2rhvv;i$9SI+GO3G|V^V!K$2){+x22>jhoE z)A67?QHPWq=>|uu7qB}Gt1T~Lh=^ur$WZ6qYsK7+R*@Pty%<z9+X)9kyznTj#-bpw z=4fj7#AaAvK6~~mL;JH4^YEP%Gd96@S9A%;!fg|+I<gkt%AWAd)PEs%>FDK2Ujv1e zF<L2%5Bpc;$djQZ#;!N{XUo_7v%^G;4R6!<CL@0yuFn4nNQq;L>CE3%BTr?}Aex6D z3lUH-Sq5`ua4$jKX#4q**{j!jvxR+&@GtNb@mC}rKWQypa$P;-voP9IO`w!W#|uQ5 zsfPprigE|vkb{5CbF_q#x=81w4(N*6bCB*BKK<(k?dG_;?h%-EgUV&!QrCv{%y|A_ z^Xtj2&I(H7>K`G<{c{$9GL(?#I&)_gyQqCnmt?ERXgI>MO_N?zAsBPE-yaJ*pZKq4 zdNs#CCyzl&i?&yUZ4yic?oW5Wp1yil!7$)$!Lq1Vi8YXI>BaU+_EuwiO{z5S`YVfd zi{1I$!T-v$TuP31sClH`D~eZwx~t0r_RPnh!kM8b%@BwQYP25Opq*9`-^c2-wq=kE za*O>@k$W;&R48_$sor3576^9P(dLS8LN1lw#9%64IG5@GmO~}i5?H;<nFvd{>>%f; z2?6NXV@TqaxX*w7uA%jEtNUg7CW+FSfd&{8g=sepl+PdHOf~I1g=LbWFUVY{!8bc> z1H|E%#BL+gW2<uUIx;@`h4#+Rn%2%XVkPG*trWHoHa3|bw-3IubZ$Vaf0mtFS4DS| zrEW(?yaREaJ~wlifaar0w&uNR3N$9WQqaOM?i$!_@K5_lm6fhrEhR@hrF;pZv?~jU zf!QfN?Gk6y^;mI%BwpKMcRgl2k#zxq{z1_C{O+#T#8lHK_3XO6QQAV`x{*7UQ7pt? zi}D6)T%rtEdN1hLy5^-ds$4S?R!rRH;t`Wqje9UQ&#{{}UmKs&`(wzvSK=E82=Me; z6aQ$mNk%2`-Y;CbgnT$T8>avaAMf(1ydTTeQq-Yqy>$@RF06M<0f7i<Pf7>#Lx(Mu zOK*q0U1omivrJ}^YDCS=GZnXLGG1R8W3gI$e_)Q)zRF*?;JhB?uU@Rtr$an%X-Pzn z-J}aeclM~%u}d6`{)H17BS-)6=I<N14ai7xpJx%vw%bFxB|NunM$(5gD9@~g?WpHg z$S>~0OY$q?g1_7p;TZguIryaYhQ=?PhvRPMWpU!+i>fn9xWv2p#p2WV6%B3y$r9^I zy<WbZ!(zot*u-7o^%ZRC1$kd-{e=Uec6~d>ZnX^sDYSL4#@d9D=!KPI_eZ5`fVJgE zi4abSe$6MJLkdSzo3;ORQt*xq4Z}+sP+!~e(4G(WOFY7dIsfb=?e)L75ZI-92daJz z-PN)~MD31!n)Ke<&`Rkb5MD8|B3P;0T;0<oOEDN1+NWw&@9cH7xeaU{R*&qo*7`6s zZ@sj`Lfeg1M|-}tl+nra#J0H*6iB4C)&lDkE|qx?)N!A-_?apjHe$=qRJ?)~$j`E; zSBDN-PyX&T?|V3-O)^_K)D6Xhx7B?!mnhz*`Znuvu1dYZ>jLk$B~5V}?wHE_7mlx3 zD;&g3(A&KXB-UICWm~q5W^c>(oTtNkW0BRZZxWA-o7#rF+!ynEB%X~KP+}d~_~>Jg z2DPs{7Q~+PI}FTE>51GxuBdmYEvY-)a(?XP6wUX@E}m~Z9|sK!{~YrIff@ZSi@oo~ z$SHnKW!4?O^({dgu+es*owlV-sfwq#uIYkbL16IMpcdZ}4YhB~R-=(w$#3oRmZ+4s zIW739eZ1fCAlQ#X79Pixf8kzgrG<NcQ?7{avuay1S8(H{(H+CD3cqPp@9}t*{tK73 z%}>cu1_X5oxF7t5Q*139TbS?BAp`82HLS*#fj_xs{))Fj;Af7jfZ}|B?jP~D9MSep z{e?3xT{HSee|uBxdz)W4t8e{GZ4oXKm18NvBZaA6PSW0Q`!zqCJ9gH26`tNOVxI2U zH>h;G;%0KqrMI+wB;mFjp~cJ2y;WIae_8RA#C`9h`A2#$SRRb-@EMAC;KT)o&Jz=n zJVP-lh#aKQ+jmI}T?&71tM#M*cB|UL-ZNJc_f%^M%SkGpc?@EGtAF9jx-}{W4?k9N zzex-zDjfOqa`p&iYbo7&nf}Pz?x)^I9*zDn?0D`M?vLTn<{>)+kaD72Uab102JfMs zmDuA^*sC=l0e*4sk6zl~n#usiX+z7uYZj^oGG~Xf_NI?`N@`voyB}y*ksayo8G<vg zEK$0Vfm>LV`2OJ7!rq(SDa|8l5*j-!t`wGj&MDjJ#h*?uyZa_)EUaoNOJdrh#6x3O zI)C9nyj|_cZHeyC4zD%8a4jRw#dhmPN4yMuE(hW+M|c%32NzN32<;bc*!x4gn<oA7 zNa%u!a)0OMzLAa<ER-~gf;Y>&^?U?;MyIEO=~te!+T`0S`6)iW?KOt(cQ5tIw{cbN zOMg`e1e>?5i}^GTek^;~+HF3f_CReY=FNfCClWoyCFCD0U+G%o75(@Z?u_^Kp;PT% z$}Ju^wMX=t{@cDjJl&%W!kkQ6%06ts#BB_`CV}3R5{Yj-YL&%Wk9vDNR#Wl5USnH0 zSKHLNNTqs9kUaDZ@x3wJwjV>9P4{c&mG01S+`5)mU0|MDeXmyO_u4lgA4Y&0vun4T z$wl+mo}3rOzHnR(<!V{x9a*y9rz~05;M~4e&HjqxUxAx-zKE-Xwn3H*)UoeTjDRf4 z?O!Dhi}v%&R9apPtGca&V4>y{HT(aF{YAw5*71!79*sIH6#iC+j^r<H1xC9L2Wc~O z=BTALrc~qF>@S{ED0eij73;ibJ2xuk6e?c>S$}`MGU%E4H^MRg(t&Bo9<Va_aB0-X z-$${5HM13~zXF3IAZ>?N&SvwX{(D($j7+!529T)#BLRf*O;oR8i-efgUh+pt)1ldA z_6#*!;;P`b4=O&+Rj2<=Q9ec#3!$FYm}fP%5;(O9M~x$A>)~gYv5}1v4>RS=j(W!K zXfAgNNw`6DKO#)uQd&QuHAg67;;JUjGaTJIzSm8~#1G*?doJz!(-fF^Vo)b??#QHE z?}2)Ar)u9@51`I%l0cscZOKU&w%1rJ=l7vH{VjPu4N5}4JeBZ;dvVSxi_@!!e3aq; zz200O(XDZB4_0OOeYr_Na&m7@_fYlCj(E-8XV2^+n-NdBP!=A4;+s6(Z#g|A*n*`? z)nP<OKKPibZ+=(42-R``Mm=pdtp|zp`3uECv+feJ4QkWdRMLq#nG3RO?n{zU6jVg* z{pH-w=M~tg;0hcdyG%g>0NjnE80ZJ!CsmtBguzWTCYCCjb!)ExCF0H2JM44Ofy)19 z0Oe>lU=}9-1t&fZQ~=w(sz<Jxcq^7>KN(U6as_4!vMHoz05cdB7Bm3x6l&3zkE*g4 z=*|~d(L`ML3uoecE3EP)=d#A$th;5Tw?`j7dn=&wRnBxP-wvs;d56Zdzo4&@aqb3= z+zleOU}vf&J5fnQJV*8T(Ymsy=TDco=rRmW@`0-?Bn-i!>RmPqjLD&)DqZZXg*T{x zCGS_y*XluYc{~V4d)C(}XbW0ijAtCk(wJ_za%S|M2V``SY+P9sj)qS~@R|aNkOP>A zplo`^K6;VFb~Q4=VHr_-_-PD{e{nillIChhw7U;w-R2|y!&3ettSolKeG!fW#iycn z*Kw35zT9yScoFM!JH1sZlk#Odx+vl3PXY5$=Z>%6qFTeLm!5Om&V3*vQ&6X{49vn} zLT^qIm+e@WR;O@Cc7$b6b<B46?O}pKFFW`PlC3!(1@5oE!!AyHJ?xfinutS=YYSO$ z)$Rc`$4wI%AH3oM39sOvAP3)sui#X;qB!j4*OFxV6{0N@bs#%Y@Md!SRuc7xIP?il zb)B7hzi{=M7OAFPEKi=_d2<p4)q`*ZiaGd6M2W-)Juf^1HYs31#F+R)H1eXJWU%`E zhpXO+1BeWJk0FEzHo{|q5If_~9kIpDc<gS``f~4w><jFyf|*;_l{TZ<;Jn8&On_M< zXRg2`10n=dlSow-N95^~1X}R&oQ~eat^bMpb_hqAC>90-ZUM6wUvB-hw+R*gF6_<5 zW-mg%hRyz!|F2BX7(Fqel>fgn{a-KB@o$@}9!mXjEuCk1V5$1!En9zEr<L)s1q$fR z1ioXN1nIM*d=)!TUt0kq1w~^wyE$H5keR_Gsks<ZptbeTYms9L+X!@9`@v!v45&?5 zl_OYq_%zO}&vMxQc~2K5oVEV*DfoLKw4>03-+;3T0JjrSvWZ;fOv){YtDMU7GCoIL zv3DULX3b3#4%L|h6fGl>%5~54fYNOpJ)|yiYE+z^QyNuqOf@&8?|VEY`e>`#<94Iw zn&z68HmQ1Q4rgp3`BdvWNSdV#bXWOMaXz+fGe1mMvVtJ_oeqNBploMXFT^8R?uL47 zM;x}g#2qp)8R|+K%Id?;wMcE2(MF0hs}ZoA13S!6D3t<IoI(0CRGrC22Nqzr*?@QG zeRFk7p!gTCt}z34HW5RszVlXiOgG-!6|5s8Rha>tVTGH?`#I%$yK18D#U4EjOe;Ci zG}m~)>1p`I0Y!JKOT1+nMYChXrx9&pqTS+!+~U>Fg~^JxyBizm-E*~TQ~x*0^u@!0 z*L#4Y3zBS2TbQr0D%BJ{{F3rPYBpWU%5mXiAsk567>@^-kPaXtW!D`QSQEEF1`RMm zDH=2uz=w>cCJI5`cEQk^wt*E6Y%?9wkwZ?SsP38!p>Ullx6ap~OxL_2NE;@ZQWxbF zeL3Yu3w)+1K>p#Ws;+#89sgy}&e>|O0QvQSWuWMmM>jNA4f*TZXT1Sr4U^-CX-7aR zZJF0aP{OrmIt<Y#tsox+b|J{!Q|Bb)1zMXZbpn24O#Ww+-X@}isy$oF?REUo6GO=Z zlD-Kab8+1@(hR=`pz#X5z9%>2RN$u*;Bm0a7?otI-#MS-Bv0@uyYb?=i@E^f3F;4{ z;k35}OP_%p6y)%MQR;BFUeA1FOrE%=u7ecXVc%Y)qE4c)kiRj)U-=)>h8s18-_G=1 z^c8}+PJVK{r3-wN)@)HL(Ei;ljclzi-SW4Wyg-yf!S$LkYcxaw(?3r$)mf|GSKYJ> z+eXLq&r{{od}lH8>((q8<xi7yPsj_u+;Pne?rF<^lV%QW+)Vr~Ak#@3>wo`80-Ufd zb(F(mOuY0ao)hJ>yW=o))BfL;Lz9Y`OBO95&HmMx(C2S^>0lG_lzp$ioslplVgaJ7 zP`erig@s6gsen+;%$aq0+it^w9{V<4#TVOH<4SGC92YE@CadwC_k~p6TmZUyFdHl5 z)x!oY*5tN?KRA(!5Et-Yo4OUsuD|&@Z1W&+L_d4afx5LBl+P=OQ8Bjfg<gKd^-2zD zai@wB;Iz64<&`)iKcx-Cf8tLOYHAAC#bTfKFy5Dqe8OvzDtbZzR)ZD_Clq01+(!gM zv>6PWVOiA_ZTa};h#je!lvE{q9iJ*Q2de4zN-)L1Lm(R&nF3V@0LRqvIbX!$p~vwJ zWaC?l<B#V=K8Sk|SMpFl&CgXt%}bKM3?7UvCupMOLAAAvLW?arBoi#m&owwSgax7m zR!D6BQ;YsR?bvx1DX$<O0UmEq`U)AD5tho(XTn^JR9-G@C-20&)W1=1EtZez#$5v{ zKlU67Z01-#zYFqK0_EoVWr){0IBYiunvV__kmANb%O!b^UHCw5+nxhKya;Sy-&OfV zt?E@0>xIHFjjQm3Hx_T)!T&wpqJ4H>c#Dz<U*prrkd~$`$m40-pES%fERDvAWW`Js zLhgnQMYxRD-!I)fC^``P+o2e)3)&xGiNu6W8zj~cKoO8-3Yx})n%(2jL0Aecy1oNo z^nD6>wROQE#ghEWGyuHbmqBZ+eeU7?C)-UsyYak98x<(gmexo0a<%pL2n3OiXG;TI zNgxRSr8(pb$7f(tmGS0)TOyd%?>~s{Ck0gPfre0Y7M*l(nc?=2YJf?VHq#M~J_(1X zf}Aj@{o+8zUOi;)o&3)xy+4*PM?Hh^3=(=`Jv5imN0ouru17;f*gIv*=koa@Kq!bd z*XU*KCuQZq+1FGXjb802L5+c7Fh5O2j4AN<Jof?H9rS>=H<+cmTZiB)EO-AsAP#+N zpPgi?+xP%r1h0TWSLj|)$|~MjZJTBqgH>Y>;Jo!E&+PxcDfgkbVxU)k!taxs|9>jN zz3mBHb{C1b{F^dd&}U5AR>GnXXInEuRlAHV08F-vs&?UbFY3YqZTc{@xX@kytYddL z{HC6+ngC${29^qX`PXg$lcUAlYUj>Pn+d5rM~R>pw+*LmPURM&T`=@qbOpO2;F;$? zs^(5uZi1VK|M@xh*8J2r0y4VDU|03@T!UkD23&Z%HNj-_(BsR;4J-#)4)TZy=5W>8 z)eQP?5QJ4CFe(iRaGw>YUWBJz6p2O^Bj|LiLovP%hUT{ss*X?ekJh9xPE%yO1wktl z=Ub%yA|eqf1eZqcugFNV422}vejK|zjuc{u;rNN5(J#D1-?%I}Q4Qa6F>@g3DPVAb z6k(QMxMV6c9MLtJr|Cp2H=AWC%wBV!C{@=viG^j^86P!RuSP#%ZcZ>uTN8kZ#uz3F zICOI01IrD_Hp0|1Q6?*8ufS5JmG61CHt&08hm1xz^J8uRo}GL^F)W(*2IS$zSO00r zyr@4JnmdCk5t%+2*y2nc76qbcGzT==>O<=tm*MC;e`5y-e>S=2bRaA*NDu>`Yk5V1 zGb|!?$|4$s8z#_meZh2l+c1IA#m-equHP%Lg74=A5pR{i{dePLE2=NZlPd7!vdo4) ziB?&p$Rg!eW&>P*Cx1PPEC=%KSo=LuSKIsmEcBtF=Pd)Ifv$_c!n1x+i1!6HOcsXD zwMs~54G1;ZO<Ps=N7xgkQ8pCS!jNQi%=K-A+!M$M4mJ1a!yK>~jvnwmY2%`I$`SA; z;N2=0!vu@FJA(9ys~UJgPamX@H~bE5(_ZWtf5Dsp#-7~jf578_>wEz<InRNuo^L!P z4fz^RuNJF0E#8g%?HL+QM*a>4BkK-iJpW>9SK@A|&R2J2mqz>F*#6c3kKO*|;@G}R z>ukBW*Au`O%^n8`ZU098r)>ZFoRFyhGP^$sBNR|g{{QmA%RRWq<h(xfmIQT6f{SEN z&Y8hIJ)4km2ZJKPiT1(xwJ0Bq5j|4~9)kQth6h>Wg~wO|Y@j~D$OM^zR}X<fVJ6sF zBr3D$`7>L|ODoacm%ES^+yDHOOFMti;fP!91$NTWUpS}wcPH7%Z~CsCPDD{ur1EC< z5_9@R-sk?QDUv6Wr)jsnYdJM?c`NT<Y`_#r98)9vb_(K9S*8@q21}#&7wiOnWDtM| zg3n<7&TkSI3}ec`P;wkp_D6282hkhqrK8tiLtt1>4TjgLCp63|Y!CM+^l#n$^A!B0 zljd8fV8hiH6J%BnN?|jv&7F?Tb9MaDmxdFW`2}cwD&EeMC*7%4cjrAdv+P4gko)7L zeK;IC->&V#M&2oBfPciZi>an{S<IdDdv(UrXPk6VGWZZuB1m}q53eD${fDb74<SP? z9_E5)EW0SWEQK<{`677H0eAsGDK?BZ%}@`Xcd<Elu{mMC?{<L|=xmFiG)M&&?|Bxx zBnaQcr5I_LfK0XAdWGGQs~+{V|ED3!z4R?cF}$INMPOkr#37;M?Uak#&iH4KNXH=} z>SBbAw<wc@NIgi%^~;spW&vD7&;#bf6on27RY2e}GT<WYkR<W~DGEtM*C`t!_a5T1 zyt_Gb*m>^&jbXiQxGvU%3iv3!dfrm~>S^^990<dMu+w*E8mp5ZxpzTI`d`QHdWGfL ztZUMfm$nqeGzPPsXM_HiZ8kum-B_r|6MXyUDn3XB1=D*opWFwt+ckFn4P==Nu&gOp z9YX|-b-@!>CuSB`@x4Y|+Gkmd;P^57?kHn-LL~Ba=jw=FLih5R?BCdOpd%}kE4*?h zb9PK&1=zD0pU1LzXOmR@m9f~kXdiwTLpU=`k&wXEUa9uIJQ_0Vnr=EF!vDRYs>k`H zir+b!M@!wV6;+?7bGf*$^NoQ#WAk37TavK?_ru?9iY_rsz_6yRC>{8}UTY&?KRKH4 zP+BWvT9JmgOnpO<x7sYWVZ?t<<Z5WBvKJZ&a6bl`vS<3lW#+Eeq3O2pr(3}QI?KIg zkhqq+G=ChC_gntA<W~3}R~C~N*;w=Biv&^+bKuai7Q~Ok&~kX>>SGHE4rpR$1Rb7h z*~lnyI|*2ZYb@B^x_b_)CeRe4gN(fQ&_5JN(q`O2F&2K}3F)Z>lr*BBxkzoe7co1B zi&6R98%}(IA~E2#m;mu#xVLwHB<diqj_Na$gj*NG4SAjq&HI47HVBC;XCV^Cdy|dB zV2xAAc@6IOE2<7JolBRQ1}ghtWY>a(DM{nw$>Ws5waYUoV8+Go2(YCWBw;Q`0koN? z+`6}!OT`B$%+V>1far!ZL6A}l!^{y#=)2MJ-Q}c`#p#nZSEyU%G-MgvY4D=$;X&p6 zc6_yoXu(w-y@=-pt~(%Evzoi>D#GY;_azmG>Z6yG9Y*1fW;kY#iA^4IGj`C&6;q;@ zQE}CbhZOo*gs+{*<boI!n97~}&nAiTFv%2|L+L8S3oxWp5t6yrWvZDh`@=CT3+0WN zbHRnc0`Y;cPaun4<PPU2i-!47e;sa=HA3-aX1G<BMAR6|zMggkj`oO#64FSJo%4}$ zI{{py9X%%tVj|d!<A;x({D4R9Hx)1fuY-uu98g_@PMB=2sOO3}(G^oJ5$saI&M>sr zUYXLhV%;kRl{Ts>t$vb1IIdxCejGPN(^rCX{c#S;ychXN<0E}}u0kxA)$#jqy-c9d zDjKXH)?f*5nBgWjlc3~&g610eg-T&-PjZ)3_Ll}%m2#-yY}H0-yu_>|uF@{Hu26y< zm+?i#yy?q{8axmCOGDB>%II3vlj10AFFmBU4h6cGX!A-qGug3l7WsXPUixzbt4;9j z_D$YqKErgOpAGe^rUa^R|H2Ji<_VEoXdC~ze1n4HSWID9a=Df$fkKSY+P3hnw^7V> zb-$k}OjS#@=E~`hY&kfQ_5}cDVLE=~7j8snec>JQsvxj@#!_l`!(!cey&_Wwx8rLw ztHoI4IruzH+RA?}fQt4+3klB9=#aTW{LB|pX{V)l>b25TVh)n|$aNxQTvDmTO=Bf? zfx+0N;w#gpUHE>nZES~B?fGyJA0zZ-J%6n~sYV1sjgt8T(zm#)DqFz(G{j4zMq4Vv z#feK<?D<%lpD8RMFsXD^QVfisjOqiiXU(#g1kGX~3Zh#6#%`p8$-UKHem<0)Pcg=s z(IPOYYLq1QTLR<^A|fP6b`1MUOa-)wvpkR4Z_Q>XfdSjI`B9A9B213M1ven|kl^>O z$lByIl9fg8dw@@LF*murgQEGc<JCa<oCy~r>Li|fFaSom#Z(iDE-bQlYvPjfor;nI z-VKIH6Bfu$zC&P!=-8b>YSOJ?f_Q7%*o?5ry)%#70`jTO^rW_f52h)-V8s?S7FO2I z%BkzjAo7~+B}5X1`4#uB-26P!M|<zS?psEf0!M1@!ko?B>>_)Bu=sHW{NGA<Uki_r z{>Hj^&Uc*e=BX;V&P}L@>m|jDC={}v^whM3Ro3%Q!RwH;)dLQa%s{+_b^(8hZbw@z zcpky4`U&<c{fBC6tWaZ0ok=Ie9kUBwtoopGif=ie5r$+lLtB*7#%;)2q~dFSBcnQ$ z*hjC;2bCX|3)?5fQmr(A%KD&?Ec~J3(LF6k_q5tS1(mWEAlq&w&vv&C9$k^q1!PdW zjV}2{s)EH{QGJf)r0UDGQwHI{h898Xwqh$9SXActiSCzMM{hD037R(?h7D4p=rld) zpi4bnn(eSxqf47Zc|C~aqD;%%FoP9cf4B5QCP!O};FjQ~KPnwx?CNmE83g@(cO^nb zdw^mB8v|CE2~tpCQ#2#|NELyzJ2wcidnT)#T_}Zs-3y~yfO_j>M8gCE`RV@wbUVCy z!<Kb>+Z<q_Jpf2`P@RY%$}6LVUL@k6!Qskk5d8paHfKb)=S;tJAq|Z0=lj!Ww?%Kk zlriVzs)27D&p7T5f+S<)tz-bR?Hr48wx-B{egDuDwOwmW{$jX3>8#-@Oh09Tttd=A zQK6(!_?{mtM8zFnm}4pqRK!6;(JuQJvDBT8184QW^^6HcG5@qJ3ydCY!M`XK!F5Q{ z?@B!CbG{c%H{*GwJJu#OAN-BKtbDI|+M;+}cH#wLue~6;+JWHru_a8bS#o~Aa%Z9H zj{P-P%5)4GDQ;`@*#v@wCHs}PfcN4Or*rHB;o4-^J6AgS5_NZZvgjmt?#-~$TEe_0 zeC;0zBmFnRwIg*TRKM*9w8V;i`OE@`=92V7ti;zWCuq58YL+hFeWV=!#}QKc_qiz{ zwyf_~4_8Jcwk$}09(?=b&g|0%Dy<XV=ga!=T*!L1GYQXXM$mY?`_Fa7gl*!7<8!sk z?Ai9-58PPq5SMD&PVJvxub)|E%a(gnv4WORPKR~~Y3)XFwt0?WnT<~ta;4n~H`CE$ zq7wwtSGp+*h_f6!V$a-?W-fks)3w|y8}(WC+PT}L9bK$n^$izpuNa&ld}<Z$wW|I~ zKS6srii;Fc3eW8;^e{BWFv+xC*F5R{<-rHZ7Djd2*((#cmzG~=36zp8d){Ci|JkE! z3zOhNH7V6UaOOT{e@fA9Iu}Q$`w0gM$pFKq@RxPELrgnZKlu<F^`x()$Ps*#L`6?M zT;F8kQugt|<(?mF{ycp9p}T`vK0cV+{u;l+W#7e>`Yh)!ab6Ay0qdR*weAXrolm3L zniC{>DZV>b?~xzu=lZa&Ov;b1m!nH7sO)2rUu2`^7t5AoUnf^{R?XGcl2Hjo3E(^J zHeqHd(%z<<oLXM~OhIz(z5neg|D}tF(Bm#RYGejMb43@W<-=lba=<XvkVmTLNA^sW z4=V8b*CmVF@IFUY_sUMI@DRL8lh}^Td9)io-_Utd=-&~KO}|e-<d}fc+QY)f)?0ic zPj?oF8yS&^pX!`In9By2d^CG*BG4f@L;asghBy8>QeFL9%LoOobtmq8kn){txjx~} zcVKw{--S4}PFE+SomRFPak6K2-7~9ntfZuD5`WF~)xeg#v-q#TbZiV!Fit!7p#r!~ zLHE4LEH*3^n@Ocj%XqW7PsB8lfqP@f%%l^dsuTC!d*(tZit~`c^w{t$KWUK)8~Hko zzfv@$uuczo5lG0`O7FdYcFxnQ-R#;Y3et238!Fkmo_$BgdjQarUPgdDs?)3F&MfPX zTNDBw`^OF{swpH$0hY6X-K0{1bas!x0(ARQ))lMv)7MCaJ{Wx0BLuJ!?s4{Lr2NUS zk4c!cO@+bfO8keS9N9muAQP&dX9AHHEEJ=SmwKa3NY2(|9(z_m9p0vbH1E=u;izE) zx)vrnV5Y674T?OnY=8~>P@}93cgvCcD(VCa%DDBu7pvHn+HgP9L+Y8iQVCFxamZ#* z*qORanY18<?nz<mQs|SD#M#KKZ+HooZBPDsL_&ySKmpkM0*Agou)pP>tJZ9B=w+I# z${=3Qrk&>|k_W(;@9n;K)ljQI)+5SlV@ny6b}}|kYr<hnk|U!X7Tmy?+=N*|dyBx2 z=KxHHi$02jpqHBYk!SfUBn?9so=~5Al*PjJ)_NlhT%UT*DeA7ZohR#xd4x<oQLai( zKcxXI|0mXeU4ThOrquh8oJ?T%HWm^6fFG<-u(xR?p_LzfA{_Js%r2Ln@p_#-^4RNU zLVA+g*A9Jce>M<`WhP|mbjS1c$wPi=o~JDa579sAt?hce@>O(4T`m;ACtoJ=T6{S_ zo_eeB+#CW~4p^(QRDJ;eB@Bj~{z}ZCbaA~5jbBSM4T>H4{Ce#shuD$pt8D-+O<ZmN z5#odn(w<A?Jzc;3D^*`CphQaWj-v0A?ySkZK?Lt1a#nbNZgHSK&*G(dABmbvs|qN0 zs}DO<#NAsuC3AJtwAtfQ_5JTy=V@^JRE2%K_UGoKYeA@Bp!vS_{u`xAYWF$)!OXhq z!$Oj0M{-05g~YP__=}fB^@D67<$~>0pPSjh@<a9bhg#kDzi>)mjqwm==-j@`uRDUN z4|{k%MlB6+&TlAPeWW7O0E$@f9QjOt!M04(sxyt*AhD(V$@;90g|vi3+>@x!87)ht zRI<Yq*s>j~sb5$6aD52xyuaC^DEz!W50%5TMws|e*CzbteG>t(A4#_*E2&9sjTcHv zWp~B+C1tz}?G6(VyUp_DnpA7E<!fBa=T%z{Z)XR06+3Fj!}~b<m^q~M&bP|<Bbo&Q z``&pbtjP}a@bWaF`X`@OjYw4hEyq`$^OOa0<gg31Tw%ELdJ<_w_A#X-Jd56H?>_K? z(`6kt9H`|!Id7C==%1hMSxaWdGdV}43g}UoC<-fSv~<6o7kK_iJhh+GIaQcsH|+k2 z{#cUd^)erIzc3t=6OLN4@p*{#;ufQqt)Ciy;TBnb;c*CwJ4H)CHEB@qz$WbDz$I^B zv{*$zoUm4C75~{F4k-q3Kc2$sYvITn9`{9t4_1OqlYRTC9wVtAGtu>zEC}1kRGzo$ z%M7IuzRJw@mOE!x5kBrTvbcu<_!E^&|MlXIT--3vJ-tl-#_Py5zLuW!Zt(uJTL(73 zBg-MverM!90<@~ru#8#7eux0jAi3ZTXtUAr{Y~Ey=3CGnR^CPGzR#v5XbF>e*lD`e zAbOlH2X5JR+aLQ$m<0EV+YW5t;SqvYuP~=b47ESeRjtDjvkkkmV0v(DltAxAvTX3} zjVxQgcA%X$X%7p*>=Ee^3fdz`ZLQ#rwa`|xj5hkg0@N&W(h2Q9o8AGAuVL2f@*)_F z_{>v0P)8gF%(M7}=^b7mLIzXpr8r4h-LzE_>vf!7uAbL;!xK;fyf<aG+8GB%Cl#Fh zei-(#SlGA71dQ#k5)Yv##L__!ffB|EVk@cRCu+JY3^=MMs~Qcl)fz5b#=vJlTTD81 z!K9|ZUdU^iF)MJNio`NZUcf@}d%X!E-eBJyqssvk36`a$g$(vC=PKh^Kv@f-ydUNZ znDWAF-moHk-&1`&FSJZ*42`7dT#CG5+BY0bdbmvrD_j4eWu1ItHzKIOVIN@XG&P`b z-OIh>4tNhB_6RdBJf}uOSMY@G4;Wk|TSQNX6W@A*rIPfNg80N^RA_$ildF$RRXP#G zd#C*)hn4L~7`P(qzb&{R3WRI+&=n9l3m`AK8zIO43b0q(lhRbV+gfi|w*G80Jk|sp zeZVj<IN|{O>qn(0mwJB_qzS-kz3NBM>Z=VKSeOHwGH*luVVj&Bf^VmSS1sBCEMM+) z<5r0k{`~tsP}ml)zqEtb?TdU%QM2q>vG;02N5Vgq*KLN18fSA!zo{hQii&`!_~A>} zcP~`r{5fO>J_GVM=d7YrWAkJ<q+L_DCI#XAuHKYTImbTtC=?U3AxJG_rIQ@NN2Au% zGE)J?3e=)<Yt7b3reEf!HSQj2Ph}?kdFgS@*{h_C<r~C$S<^!cGQOAd@a%Y6Yt}cH zGjMxdGKbb(Mds3ZD;G%-k6w7XG0vZuzViJlH=m%&d6xwvRLb4WNQs?t_bzJF1MUkJ z<uN_lTuohm<mw6)0TFV+66Wu*Dz4(2H_uN4O^a?ghti(fAiZsSpHo5xK7FMYJ+ZHL zOxa>;DcTWUzjW>OoTW0RuH-wZb|UUYFB`mHiL4qZ+u-#0;W4-9#T;#Gs%17R9Fn~8 z?C?`hSMpH3T#aaif~sVHzcx@&lO3L`bI(1=lJ1>h?ZjQgee0vgnY))I%0*vk?Ig*4 z$pYiOUxMGeBZRrnrE3md%k_~4?Mt1X)R4L(tCsM3GgsL~+k9VMjTi{?JtXqs<%O$Z z0`q)WjqGnqyrn3tu;psV6bbfWWg~Noo#$Tp3n%zB{et*8`60{o2VJW|9<a!V`B-Lo z?^UrwT9Vu7PiswQew<0!^w~)F$aX?+lQ3sM+}V;4XExeL7T<5qG6H*Wx*ve~Dlbk2 z{|jekC-=k|&qpJB#hYF1tYqgG_~64<vt{>TCdt}UwFwUw#<@g}^>?Oh{?^lqmm)u( zpW$l^K#L}B5%A~sY+CR{OiI}06z6T#7rQUxa7#Q_j|dkTg}NB(Tw;^rson0KNl$j> zAt!@M-{>z9wY_hN#|}if-X9oz-cKyhD?E@&3ue6xS7g64Dx+&CPv#q$i6ohBjlbu* z-G`&dfEZ-+P$s=iUiG@~mrI#GtRL!FthGQe*q>mOnYZEXH$DLte5IX6nFBW`MO>v- zOls$8*{uSSoIZv)=junLvQiRc8>aa&yA&TVnGKqV9_~{QFNhS?KRR`6z!8gxfHBWm z2_{Yy?<X!`DDB4mogpC|vUM`?9s?=oW{KZWSbv23@xlxD-=oUe2^(j~Yf+5|nP&hw zkmvo4r*{;y2`CV+Ni;tUi4P+k@L1_v|0)r?@!Q;qR9KMwg}5vOKmv_LDS=2mGiqr8 z``a&Fg@^5|0zU~|2BwJlQ#ZGfU9$XXd)wNm0s!qLBK&hcSY7}dW}mJeJET2PV25JG zGx)18R&xWV?B>pZ_}>~aPHrPO+5NZRfPj}K32AZJ0u-KmiO4I$yefCw;BmLxy-=0S z3g2BG%`5%WxXbF;E$DHShmahYpg)`5N6%X*@fZa-3YbRppCYSc#1?S^M%^*~%U?15 zSwGJ*TLs=S|M#JQNTgNB$RJ+X8Oq6M5nw^P0oFedXMzHTP3(Oo(Q=63{F8ZpjLM%( z*rSiIC;v-4zxKj}#`$CA38uc2tT9C+>y9`aBrncnfIJKukMRMvK&E=!)ghrH*L+r{ zA4L5yo1p;Ygs$NqApS^ab^4aP>Gq!j3*ooD@1n+m<`?Z>7r<y(>=g4M4A}=k&C2*d z_p>*qVg%S@^jeBscK*ajasbgl!+&!a%KBrr2`KZ1U44$83<VB4{!eKM^s24{+l40| zM1J2-ARh95U}#8F<6uP$8;DjZxx>8>Zcdmd+Hvb1i>ttK9iz5ShZ;k_htM@S+MkW& zl-D@Tr<XWmu!8OpS7zpF)6s-a7e;qbZ43>TZ&2_ot0rZG4k*Zn#4l}_;Aao1E3VXs zr(TDOqll+EKd38P)&xk@RGSHiBzw<)0zvK%cw&#;1^XX`0*-dBAifeuefBamX6;E* zaD%FFLxo*|*KYPusk2v?CVPJFtEE@x?^u;;`WV3<ig|aDcQ~xbCUfUG_mdkF>nY6Z z>ZD3uImNGN<*|`CVc#7#k1v-?J$K&Ks<4+0$?V+6pKT)#Rjre)1oQ@3I&WZ8a*JyD zrwiZSuq;q8-dsHuPPk2Me0jFL$ka|}uvX}e-Gew=2f-GnpY(Ul_d|t-uKSp!x*t+| zeshH}7{z(G21En$LsVCG0x$!D9qIxPl}P&(aKxNUbqFEsl1wj0e}o;Nk?|}BNf%P0 zHS(*39xAa~#^P7@29bFE7YmDJeDc}(=-T6bQ~-!@25M&4Q#dmTiGuU|Zl==vSnl%F z6HqQBktauU)i!OP;QQJ4Ux~!zsJOUmP5}?@Qttd|moG!P5OC~BilQAeiwy5lDeh0v zQO5&5L<ipB^5c%M5}Dhn^_k1{720sDJGjz^hwD&HGBvm{xM?fvW5JOv!BLcki-&Mk zDh;oWc6hXP1lp9!(-$umqkK-T_BSBnImi;4*JH|a$=vg>rpGRckE3{aP_u~4L{|Q; zqDW>t9<WjR!EGE_5)gMoVAf9@9NTbVwP{!y-uV}9vl))C$<#nal2GzZGtXMv)>>O< zH>YnNi=LsW>Me^!VuFbYFS8f9_naap(ByGzTx80VOb<N>9<<fdlse3|u*gK4Wq*qQ ziR|<kJ4&71oGl;%UAL{@*#zf5&woQ4hrN`<vs(+7_R@OgUduj6=<Qx97Jph*lsh$0 zU1FEie4(A{bW*?}5t4LR_$jd@3WcbCyoF5GtM0HH2&cC7^#*7z7}IVEOAU~>5sTyX z^RfLv=VcT1<7s%S8A2s4-4osu@Jji0*1W}bIvz|+TlTSrZ`q+dxP7EJyXbhyyn^fF z;(JGK=>)%%QJVl`1b@~ycow!nUR~2hqViDLe+VG44=4)OHINS2RkDA`^#N<@H|%2` zHnTzTUB3e)VCDf%uDD7=?{I)hxB(WtoeZbk;!F`O0Rci;4JWOpql?Jc#xhbgkWD#k z5t)rVWfK|ONQO^DM`$$|z3w5gp<-qf0)w9*pa67j+HM%*tjiVk9H`%TGvKvrt{bsb zi{;J=+7btKk=KMBv=u#!zT(F(+@2FWPM;uPLN<O!>{(M@#q7jG4UmvvT^TznN@fG% zT!kxA0Qs1@n9d0Id4OysYGbKCyHSzgq(dxt!+q_|gF)ZIafnlluf>v-^@bBdk<RJC z4`iW)Bb6r~@PPiP2CqGWK_H3&k<$}IgfJih>MyYKH@V@XP%mBFaUWREMKD?k+<!6@ zF{8?K?|Szm_Fui$FxEQ$8!!YkD{MyK&+%&-mJd+fc1~9|Ln;eYJID+n5}a`eg=c_( z5rXi0ohsxs?7X+{=sEZTm`zS_@`_|b4yW#iL!7hd4KQ%8COLh1$0DDXD^J=@xxz3w z5ET~0HW9TaYYV0_3{!fH$t{K?Mo&!gPDfK}d>~7x@fL#{@q_}p`30SVM61+}v;hIL z^8J)X&E2j~APB!q5#tm-rMx{}AZ!xPTkLhP>PBbxi*tkfn$>oWnF<KVDL!i)b@w~s zX1YW3nj%nJ%G76GSI97(PJ^6p*vu2q!n$)vG`FXNllQH;+L?^x2t^plpbl1C41W#~ z^Zz0T5+Hu`n&PpQ?5hDUz_I=81IO=glrNnpTq(b*xNgrS4b8y&Bq7b~)bw!OYP6Vs z4OGe$Yap>&s(S=liP2OWb;yL*5xpX37Wr?Le6e}swJ(5vTtUuwd6AT)Pv5oUn6F<& zs7c@i?jwq*v{!`1Qe}Cy_bbuAPkYn?KLowG^OXCy60Vr`v^%D3KNO{HYD)8Zb6n$E zxbRLx0b+w1hPK#wq;1~nEaMQaTdPy2W`JKD_R0?9VGIw2S#c!%8FF<|gTKW3EH5G; zX`YasI%2AKlGF`p&fm#j&h4Z@rqxnBi<Xu%Ei6jar!R~3+#k`ra%bH*_2K0*70I|w zC=A|%qlWWb8iCrt3iHU<BO(L=Z(BWCpZkucrWd0%wSV@l@Tchws`BdA?H6{97%XpE z{0nEjFL@nZ<nXiYHgC3Cx)9!*d~_g+ED2=gIVk;jbg@^qzc;nT-{25I-&R`3Pu=g( z5%5!$9JXm+rdAIyL}meBs=L)b7CC$caR4mR3fSrdv=v+1%Rb8y!a0vx4>g6pSMYH6 z-!OP)fJsNdBruUO>J=|$Fo$FHCP_8{GDow6oa7_Jn?CL*PWF#fOLw%5_V}MvR1vU| zBS%D9f3^uF*#f3!du;Y8&OjYIxwiW1q87<38_mrKRyXFE5LR0*esJpcvd6MG?I>9z zk`$?h?e)^pWn(OtdJb@MYTguDsV;=m^KtQeu`I-|lOXw|n!r|9%#m(8YRKx`5w!^? zOT_b!>a9|D5f&I7&A1{eG*Y;X;<dWtQpJU$EjDGtr`W<1I(C*<=~?xbwZ2^!Yu^#8 z9i@Gi>fUH*a^c*zH-<}TA>wi;>hF%P;tQ9A5NTGLqvyaL(sG3Ms74l;=KinY7q7(U zcRg#?O<%eB=~W26c&Q3yCB)C0H&0Coz!xU(Y<qtwfQQPk`;CC!g#H2=YHk_hrYtOk zp*K71?wANqZeVi|LNO)@7N-oh6Swj)T{<6SiZC4$sKY0+7?}V0!cNB{zgY`}+7HNL zL)EG(j0q6g2qG?wupOu2UPIW8b#2ZP1iwIDkv~dGq00PB|BCdx_{i|eR``*5$Ng9k z-Vqlhq*M)w7#d9fj{z5$F)T4hO<JYqzVzJ?T8P?Qg8Tsyys*PEj`3Z5$O)$wz$%2L zA67U4g<|`e9kHnmD`fr}x!|setplEgy5Slf^rTX!Zaq_!HLGwE2bOY(mH}O%=i)`} zZ6=%8Oz9+N_r96<%%na1Nn{unl(tk}b7jVlLTSb}3u$#0umc9$XE^KwOm{32`S!|E zR;4%PVEYQjBQc{ZRJq6jp?~a`Ve%DbF%d`+vgjf$szO%qCqjnZV1)y}?T@AnrumeK zQV%YTWsd(JcW)ig<Q}jMZ`1~iZFESCp@h;HbW12A1`0?^sfZw;fW+t#N{ECY=>b#( z1p^Vu5lSi;h#*}CsepvvZ)F`l=ZW`uzvuhTKR2-f-Useo_m#x5DMU+2!HFC<ZTQ2p zU7?3BRu)x!Ia9$k@@MKoxIUYpp6u|;svLD)jtbh1TFf@gUFPjzihch7CUap-#uWm9 z%>3RFZ4Isisb)Y=GdbKUNroKEVBTe(nI3dVFNcR4UM!tzhpDj3bmNsRi0a;E=lL>6 ziG8r$7V36jZbxU#`X=xc1lFzwsFwtMh1{5%3Mf~|&U?+amz$z@gnG^HS9-|!=%P;B z%3H2zmgk)u+;TdfLyJ8>oum&Je(=!SF_3Qw@lqp+o}Mw<E127DD3BjXW3JWix#_zU zQ^n5+2<NS8&Qq@oBsjjiI1a9OfxUBPjbA7c7LtVnv+B^^JPEvz#tR(WMNi=VEzg0s z2th$q;-T3)EYy8BLn;3#ZOQXpO{!Y&MW%}$mD1L~Sn%TT2fhuMUsBzfI(kfbXw%Lb z%?tBHA*My7*z=_ePf^Yk#&Yf^L)|y?M)N)T!NopL^q#(B#=u;tD{~$ikZ&XaGc^Sg z3*dA{v|B8|{Wcfhon}m(;xyM6dbJd}!KzS`m$xJIEuU{Lp6E`{>ePOb6Yn@o>)*5% zT%7vXLZk16XJf+tF3VxjJCVBEE*tyFTnG_T9_b-kHg(klT|m_p7V+At0_M)6Z|rp- zxLgIITzzd!`860wIAOcyj!Cb0mXXSY3_0Q34fi>btbcjb^el}Y08-b^WmscA95bu) ztw4IgB(+ZLf9z+VrG!{`XS~0e2|0u+u+X59V6_{^?>OD+Bu&S^QB%>wMaA&6fP3?V z7|bhejxe@pRNfgf<O}C~r~f&RLHEUcA$sPe6yAo9?1oX4_D-WIu-}z_y_5UGQjNpb zHxGtr$LHK+>JtV>@$mI2a~X#Ckh2?-z3CZyJPD|3kyHb^y`jP!ifG;LVkRayCfk^X zAxD-2FkY~(In}psP|J2QuN08xCeb=!Gya3Hw?^~aG)QPXk~<}C#it&<WA5o`h+OX0 zXeQQua;<hR{maTWHOg=Qw8)M=(d;V+{x|rnPD|Dt)O5ePY^*7NR6F$P=r9z^!S(WB zOFSzFUsG7k9F2f_^m&;VOk2l-+xIWLxDe>mDV37)q-kXk&DjvnP;3_N<b|)%q^HNr z-}F4FJgXyzu$+Y~o7JP~BqdfYqUroKH7}w(Xa}{lwgC!HrM1Sx+x1N3@miLk!un9N zc&nMaut$RfV+bs_g6paj%pm@KZmW{kQ6$#zoTn2u7c5}N2o~|Q!Q8Wi9j|W<!_3*E zvM!rmnrCZrA4aorb!^JM6)%yy#eO!q%W-=eU#aqi;gG7f3jQlKJhRsCez@$xRC!u) zXBp=>{hn!~y@;+Zm~s#4HjL!(`Zifks>0PG&yz#1mE3!@(S-6UqOD80Kq8H6CV|C* zMj-fE@p)-_&<1on`RE4R#+jL!*|ZaehyXF}R!6hMsKLRZMdBK#oi6dBL++*bBh}I` z{H>M#7ZP_DNh|>sK}07d^rwg<rG%Vnx%;7&;G0<v`>R`y>YAh4Dni0OCl}SxH=f;3 z{YdcdDGrj+V)X&!2NPv))#gu^m_YGf^dm>@2+BEt(|(wsAds0^a*W?XUTtzxiNAOY zsY7S)&DK0P7zzn+bL7#HZa@Ir2`L|;X|ZYIiFh+;O!yv&-1HYQsD`GcL?dO%{f7S* zj{xN_oPpR!4nO51<R>S4Cd=bVy#%{*$q~sgGTy-ayh_MQF;S9u43e>en`oO1Bl<;3 z49Nk{2juCK4k-r!o$zqrC?+K&PQL)=5j=4qZxiv3opjp{KjYe-efJU*f6S55h13gb z8}XD6@cs|zCO;}FKiMaLOK#YvcnIh$bAW%C=~H62?ca`9tOS5##9^;nY&ZY?6M)$v z70&-!ZY@Ow7@MPr-~+S`fTS9^RD>AS#ypfJnYq9JdHoG@Q2(a>XEDbvE<kK-m2L{= zy@B~zl>8Osld?b*w&M>LivNyY@>|qFVL?cDBw(!9Pd=o|&K9(G+Q{A_1CoPjD$+%R z3AX_DC4TDn+{{IJ$A@`}u|-DJrn7oy^!E^IOy~rpz^i1TNpI!l^VkrUc?bUmTXFR# z@A7isDw$qBHYp}#&jlrk!GxJSK{OkaKgeD*AM~NEDfPU~nB+I^<nHG=FAl$z-I*E+ zEj6sewZR(6l7O0sj8=OpN^`Y-0pE;puG)jm+g5&Eh@}qsU~b#l!6!n}8dE}%xQ;nl zRNm)#1vID><H37!^vS5pOufZ3K-b;}W=U$bR(A*@7PRb*EM^7yH9y=tRX^;ICchE2 zuaKj>=K~`3L@;es$QPTS&70{kM&O@A#JQm(s86vl)bMid2AxQFrac6^^E!GIsqv*I zXyu;l-bDzQ)`AT{_KSnN{*0L#Fwcw8S-qJVn{r<8<{HbjHCT+uH5-Rtt*Vh=!0eNI z*067IlF$C?Av&cIZGup7=$Gn?tCex8TkCO#pKlfWqHjYDW;1zOj_-&FXON5;vgv%i zUQakza$TZrv6EXSYS#&)<(|>``Y$Cz%wHj%up2Ee*Md&4FyBM9uNnmnk1yM1wd&I# zA{Xn!4{l9EUy8)P+6KMXb1|~9S(Pzp(}A+rjJIAcWjRg|xOy(Q(b1OhtA?ouo`%@i z@5dr@VvrbBo?AmuSRF=~02>dA{U%!p6l`=TFORx1Ej<DPGgC|`Q8i#qDc*B=8`0A8 zUs0|qeVOkQg{zp^<+O56zQ{-{GO@)%<DRC8m*9qpZ7k<_9K72A6?NW_gZCPGG(w-& zpIh!%1MEF2V$%!kdbWF*EA+x(h566g6=74cDQz<!o=sdHGdFCBlW%1TGxJ0KVx9>J zQ=gbwPocMUkUP6WtLKHZSB5n=^k**U177O5xr`xPOgQt(u_xwGtth%Z2B8(BqnU#h zjze2$ZR@Y5H0mwKt<YL+#~i*X^g5Q8{YZPZPQ7K>v3UDM`^D$A^WoK;xubab7T`Ee zix@Cc)xX~M_8`zD7k&fR9Acg>^*eusxH{zI??33UIq+71B-SpMB_D)8gy3}UczYN< z(k>x5#05bQdokycYR4%|uhyRZU_`rtVGqsYU}-tN+T~83n`Sb|!pVT7d3PQ-I(N`| zSLySOCa32-1X*iDX~Sc|5Z@6|R<snFP9MG^7aWoKMn|L%8(JHyaevIN5rW&2z{nth zm0(T`hT5Ia?D}#<@5tJw)*W++A~IcS?bnlgmO`&%S+w|uH}#^`XBP|0kJ|}Dt?g0O z$`RflJr+4>-9;AJ{bsq@V=^T*G&XBG`Pa*`YG~zKv5LXZ*QZ(Lrbn(QOM(gQ?2k{6 zV-4u!+ajAv7!)ATHzMyP#SR`r2UZDZrcD*s`Hy*=K+1F*=xg;yXt!eI6VXc}y{>)Z z4mzJ8N|Bx$KJ_}ifha<dZfNBy_Roub;7>V(Y)e7d5@;Ya%du;hlz4-+%A|qh2UZ7i zYF#6pTBnF_J-+vT(&E5rbnh9jn-UM0d_vrKVjFirNIn($=ao%!1H0qqxgW8A%dX(B zeCu9ZxJA6wPEs$R-<lVHVYib=u2xW4L`<muJO{Kv!x+^0ZPX+m$s0hFu4Aa<9pV^( zwl4JzYWeYxN8;WOJ>v%{^DySvk5~VLPL(6T+DLBf1M32ueow+#P6nhsUjrF8%1J=$ zFGX)~Yrpi@4&l8hP>Vrlm%5<+G+}zZi^bvOI{;iFjy@H8F}5!Z%qUmgmyZP_$`P=B zvb8l^iVnhq37~*4Y8B&m5cb~#U*zUvm?3e`njB)Gs!EJrPI`9fpd>0!UIEdY_#cU` z#8xO^L@e0I^U#KwHVA;Wx)ZcXRZvR)Ab2aXe<$L*T?O%w+@2kYeX$%MDiUXi6-ZYg z)@esL+(&}{i{zXtWo#e<{~wtb_<2NtTv5R$_T$<B8G?}&#^2?e`Y9_EAXyz3c$*l> zxseON^-t+0()(nJr#Z8aw@}IL1yB@8EfrKQh}r=Md~^S%DiL2NNi8}gJo=-tHH30L z!W=;dmDUN+wkXxL@WJbi!8chcc@j`QZX5qh`KWj~vnGG|H_C?uzrvW$`>;kGqUuHz zKPxpWMvbzj$yDOrQ%&c;h)NVq$>9G!0MnB9CY;#;Zjy-f&@WdDDm~nssZmdaUsR1+ ze)=yf4rNSB)g>>Ji3_9~zs)h9vb@^5;rkN6D8}be0G738zd}U5G+heQM-2}Msjx*( z<7a$rOV)w-!lP+W&!#iy-=Q-16(SxqwwxLY{|fm$BZ!jRR=<kF?OtRh=w+L%ojNvr zPm)`1_T*)uvbk969^}hG7MGc7)yCR;xm~F|ca;wWSXO<7WUcAUs)i!0o%nrv7v^FF zCCYIO{8-Ufx9xH`gm$#9-yXByE7n{OCM{DgYuv&y!v|`348KBN9oz`fD2YVHL-Y+L zuh4Ehlb|zEKgy~NEy}m2YsMp7OgwfB`5$_=hvlN8th(qG=<?-rEpO%^3XLiXr9BF= zN7Qo%YYrS<ac@`_x&nqZv$A3(z)Wik#0pmj0<>crk@0h=MppJlv1p&$aQx$j23pK9 z4h>D!QjZbcC!$R7=EiV_P$WA3)SFz}$H3gl-w+oqb+6Z%>$OzSgLj&NLQh&GV<S>l z8+>$TXM%Yl6K{f<Uu&Y@tHvs!pnoZ_5HR7eTX1>$$7wrBZ5Br;triA$2^g98S?p$) zMo}1{Pq_tXj4=yV=tX3r&=mg>3uWOg9D?bT#~M>|FaDB)&jmeH4`;0iuV?eKRqq$p zwCSQ9vD26pJertxAU+L_ntV6#+2wJ0Did{WP@T(tDvOnK$LIScJj*=C!OF491{4EL zWa_#)FMBI@lmi`K5L@H~B~k+kM%)iQ4JbWM6;T#Nx6flP1;Zyq9`>|=b2ixokC4PF z>WW38akH`+xF~ItPxZ?}>7z8hd9iFlvKn?TKeMh8Y?j?<B748sbqy3gd$M0#Ufm3_ z$e4fC+)<cLeDii^C!4a@+sf1v%~3c!T4w99VUq<Z`Ilo3+tMIwx5M2nXMzr(_o_7W zi<ej4hSG0a^H7MKkG}|km9(suh_o9C+6LAM4M+3u!LZVDLS;K!=_-9HFD8u?S@MNM z>uMCFa}VQ6U7~G^c|o%!vdE{Jt-cD|-mT4o3cuMV59v2|xiS+s>G~RfPGzBCse(S> z_TN;@VY_(^v1TK%{OStX$Rn4D(Sxu<8S#O6VTjmhA)A!ters&~Smfv1a?yj^eGO|u zWyMvt2ddcJnY(A)kf+x-a}kDnHJ6|>>o4kVez){kO1ZxdtJ;viP|V9B9c!2QorXSC z8L&oEvqn?PKr>7uS<^~l)i!j@v^d5&nV`H6?a|2nphdNa=a)DbSr_FVo>y?+ybXoa z71)$~C&(3-eGPKq<9W0mHyb^42Vyzu=D3M4NRkVlxMcc<5%`uD(036}aYhc?dHH&i zYPCB2cGK`*<*u99d{kohePLMFO`%{8{H=Myh6hdxfV^YF@T-OW4h_3>$vmPh0&B-2 zMM7zF!Gc4=vmNaeWQ{-%R*EWMj(}<#g{6DQ8nnYVQ`#Yi&wY@IebdkA@VjYGw`b?5 zNc#jYj(9RcqGlYhk%g~hCpXO|tbB!xXuRj*h!iC_w#TDu2`zVuD~C{3X=8xtq{Z;7 zXEiqF;ZDmYEz08PqQha5nxiQslpf9F3qYYg!knp_#pup)d990f?^BF)-G-G6cW)xN zE6Y3xGor;!@yja#7xldFD|B?uTMvVMHJY~;=57my@Yj?H)3sJN)Pycf#-b3NDl0<k zJsdnd=e7HMRTET2LVVC*wwPU5GT8l=94mgXp;NP?$`>DuTpOc}3H}N>)dodl8jzcL zA-mV|_pH$Jz^?jTpYW4W!Z*DgJhGlokT;ZaZMG|D#SJ}H$zV*wJoh{atLvTUip|?@ zy?H4Thb@O688;R-PmPd7tc80Xw%Zyo&h4+cvV6Hp!o<W`U0Y~#h5vkN>{;Q4K2B)z zbY7DE=3>OrFdfF2D8>+RVMs`>^sf5h=aH<Tg{+fIVY^zxb!E`+I`#oCy)<9z%Y1|@ zgEkXW;qI5&OT(|<uhY(!sus+nUK^$^T#n{xuFrFN+d!-61$*@J`QQ))7g_E&v@|Mp zq%}yIuA=(v&HsO5*>oEx@1WxxqAz={*Z>tmBkuh59k(}P;$}I>Z;JY>5;->jT|vKE z^~&za>PG-2i6EMC_w*Q6H#q<-TiW;Fp7xx$Efu}elp{4)C|PU>19`~kH#IAyR=cEc z1#2TINMer)X+sH3_DKEB97W#G3j1+4%apv{kwl>ne{YWp1!Cs;BgAPBzI)6>22q<B zDu0<rj*`cKj{vLJAAqcD0{*Irbnixc(7@6HQq9D9)YDR@Ql8l>E+h)4fGH~aqC%6_ z|7zRH&yC?f?|1y?G)y8fJN-iV&wYH(hxNfLH!u5tU%&hza6vpf-+ERa^MHmr`H!t3 zM6Q+f+qt<9roXy8gz2mvPJXgkF(+4x8~&kXE&dMeeLW9ew-<l%QBjdz&Iy&djH3#t z0{%t6blR)c=@}M~@Q-w&Aw2E3zH18hjgO+3wtwCZAet9q>uN~VOT6Jfo3fDrYl0O$ zIPtz0NSl8bGl_MY0>rydBE$Fx9G;+7p|B(NK3J0@&*oBaY^d}X)2BMQ#2;qi*7fg0 zLR3+MH0=jZRgGt$AAoe|>Ve*vr;#mUm}Uq()yRaEhw(fUONaxnFuQo32ylAe+#9h^ zPY=N0g_;)0awuH?ob(w5uT0C);X()$!}6Lb2QOj(tltIo<i~GQ2WkQ6Py1FOF1~x& zix%;y?Az${AIi!=6RSd=h%iSqNDaou0)`&+eUKVX|0hPGiPSf#E%EQJK62X!d(hBP zDBQS00=k&W!@r*ta|(e&%3*GdpeT-u5=17Jlf@h|_j1$DemopxZC3ecVFSIcCf0uw zEK4YfW?;W%XYiXvs6o!>Z{p2OK_l|SLkKh&b;w3mcDYJ3>k?i^ma|UM7K6n&z$Ng| z>iv;Dqk&Ec$H+F+2m4k%sFy4)wA%o_7mbb(3=Ne`J&U=KeN!V!YpiJ`LW~C8{>eml zeG@d|^F!3a>vNnvcgHqdZ<lfQIh|)D-#y^cnYwsiCR>BIf?52;t9p^*<ChM59XH5c z_K{nD8;gbb+zQGUW`nrscEBI7DdCbdbXw+b`PPVp8EDN!+t=v}6Br=TaF-Aoo&c7( z=$;Ri)fbN);*(qNf^<G@yb9%P?QhE$k;9|=7ds+%0s&b_7PxGiJ6`)4{w8{NylY#h z3a(DsGdG`M;5}q&y&#oh(f_;XOVyyq{`%<Q6MFZrql{w{N}c?-p+bGTHw`>P8|$bk zcO{k5gqDX+zKE*<VL{)aAHsJQ$Y++3mh#HX2L*PlAHJC0r^tu4+$&7;$Ys6Tw)ry1 z_kl#j_w*ghpj;Zw8~kRs>jRaReqOA(<9Jlo<ML{xeq=I6WaXMeC7(9q8#nWA4l&0L zwEF5*JB(1sMr<Sv{E=FBiT?1gEMg`*1CQ_7@1P8Bk2q+tS#3bNY@X9~9~M={ON?AM z6z%%-rOK?nz}w1{ZzoI+c`V=4r?V-+uP1RvQ9!@)WlDQZY)@fJ2u;ydjM>@IA^t#X zR&FezPU9AD8pAA1*d$px(*?u4JCwl*W9yZmH8!XJsUeOA9r+;)(Hu(`?@5Oh(MR$5 zIIXi(*X>Sw9U0{A>paDG=f)k!_f^1|uBko~yUi;6zW4R&R~i1Z^naa(diL|;O6-tZ zgs&&;;7*I14u*AEKG)6Ix0qoaV^p;_=#~CigJQcqeP;KcyYo(FUY}QY6XViVEX?9m z;A~Ou$PTaa8sbdD+t<7Xq@v5TLX1S48L!ev{ltahm`Tpwmd1Knt&!}qkpr_6P^d8S z&D*9h0$t6)t%tn@4{rVf;sA8H+AG*-L}?;=bhxe8^+H<#zSP0p8<|9KIlNm+)k*B* z!+vm6??=9%{lpF${V7=UzeSTJ+Rj@uL$jZ_pRc6yNP9}kl&kMDv7dO~Uh+XZLWlrX zymqi@3$K!12#JvDvz}enGtM5tuaFOFqOK)9yb(c$@?;!k?)Iiv*p~yW%8}}?8C_`O z)hTaN$HM;<dw2ZSXG5N9`M-*$a*4(;LsC31`ShibXc{pI4lHpymtDdPH1(WL&>^EJ z=6gTEgzu8<H~x#<W<#b2F=UQ+t1h%`;lr66?cW}L|4GXDw|c?k>x!TE(a0sn|FGMG zVEbsL^Cg#fMJL7y{(dBBu%XyrGHg^nkdlGdaswMtS_jGEYwu>F7X3|`rS?ty0;M=& zE+nKzl{jmi=@9|HSP@n|q?uoBDyZV6aDfu6XQm6D2Yqm?0Bfx2QKG+W^HMi@wL6i0 zyadOG=G5TYuSW_fN(?WWe&P|^_UQA!5rb+lt#;PW-!_3MdG?=;<r}fTFT9~JhuWf) zXOZC(#c)nRPc%d{^L>O^;3s1kmZH)AsLGOo6(;5M6wC{hI|7#&)j|3TLzo7DuYylY z;6<wTyrJq+Ab)({!i|{`3Nc9T&?Ng%iP<{qWTNkE8r&^BVOq=uKgu~U0T}WKls;%# zFJM3a4F|DMfRyHOz=O-nZ;eJ>z1W-GvZdt0w;9o2_Q=3*42cf|-{NOP^lu}f@~JfK z7Nw#?w&G$R!WeaeXEAvOsZ2Cmei;evm=04M?M~Q%&gNiW!SOqv0WQS*B$EKqFQD`l z;x5s&>sXzxP_}AK_9@ju#;3UK5Y58-=c<>YrGEfUM^{oEXR(FAPr<x0*x`ZFP62lk z$;E;xRW#@;Ui)d6&omElmHg0;j;7m)@jX@#e(9M>?Qh>9lqu1b!T3jm%Pvy9hgAIg z^L#h88;<ILz+q_Ugd2ArfNlk{RUeUFCzr-}G>zul9Y(npJ^@5noKTXYuG|1ClmV^9 zs4RL?HY^7AjAV_Fi-9nOuuSaHO9*Pob7jaA4W?tIVXlwG&dPfEC-_!oJ&{8QdN5#( zPDY}i>wF??2-d*k7=+BItwDk^J03$Bgc+R-jjr&*vzsoB56#)mYuMGmd9t_|B@zaq zOmI$!te30mQKN*i-oy!pGq-$_wuhn)j#=E$Vfbw7aJ+pfe#XbWW+hBYXR9qcFH3~p zy-`^c&;G<7TyQWP&I6YXDHH><RlF;E4P`Do6A+K2MF?}3(<rb%_lyh?T#nVF8{|C_ zJtjP#e0g^g4$~aka-Nv-+stY=LFr`Rr*s{Bmup$9+B(m8=LE{YaFOj6{-@*Vc+ty% z3I_e<g0FCKAOA|6Irg(+8_e6Hub@_UfKytAX9I)4#wvM@pw-B=kh=Kynk5z*cX{L~ zbq`Kmn1+wT`)QY8-ic2=?Vyj39JpAub0<PW|1qIfm`RysGof2m5DF0t5*-@YSrHl8 zHDZscE83_MMl0KFX}M|DcYAP~{0kX}PyGFNY+Fw)zJKJC#B{n9o=^*95p_uu-&DC! zNPGgup5`K+28XCSy-0a!^;vx*N<-H>C%nub6R{_;qpnvYEh1FMgTWL}>-V&#rn%+? z1HB(GVjLrI_NwCj$Meg^<#=An1+H83Yv(F@o5=Ey(Mt7i1?3TC1kSIJkDt?o^UYlh zv-$YYv(3d=xO4(N0Z#D8UJ5|$C^o}&jN~8BmC4R-Yl@HXKQ!KMFSp3m_u~3jh`q-= zf$Nee)bm(`?Ur<{r+{Bn+&Q&#M*wsDr)9Lz++b0gnXdZ~bSpRAo|~GNZJ#MCRQ8=9 zIC+ft-e`N?7o*%E`iiC0TwYZxhdZ&1E{b0)Pxgw9^oib3cF5xtJrkRI8(&eZGd`=8 z+O{;?=pC6N%tPGJp9TrG2wK_gj_!fiqekyMw##ifz+N+;r<WnhG(|tadSuiz`!`bR zZsO3+w?_E?qGx{ZvE!|ne>cq&D}fP@CzKHd@LtkiIq?IuWRMj0dPU*Jib+o7EYNoM z5aRJc>_idFFpK%Kl|G@`!HIWG*edzd>Rz1<erpM-&I=c%dea?bu;JvbbFfadPmef9 zoQzYVzWJw76LK)`oj9ctfHJTXVtC9L%$k#X08dM)k3tU*ZF!+fDGov=F1+t!LVKkY zI8B(4GJ4eRzkl}4BVPlbyeo0w?)WQ`jg6=^l2_YrZX`zlo*ZHlhi6<hiSizUc^Um> z3vz}}fPhNjoi_h~0(25i_*Y$IZMvF36;=OtXs9iPK?eaz_^<x8fzy3O)Pi5Y0FYMg zs8{v-#M|}j<QkwK(*DHWPRc^`w^uFD@eKznu`w6YVurX+Cdz@0T`F`Gp*j`P$Rv|? z0*K}X9A1BM1c1QF^2A>|{iyGQcF76_{F4a2$A4m_C@GXADd)fgu}&waOR0>^?_>W) z;MW}K9#=}m8WiY5?f;?RrEdwm-{U1#%Cq!;2Z>mJM@9V--Xr_vLjZ8`rx@Do=pLq+ zr~qL5j}mGhZ+hbqu&GR0qb5P5i0Qv<A~%wsXbO6`h+mRaIZlR4#Ba5jL;U!U7>W3B zKa!FE5z)urA47ywJ4p{UDA$PPzI|;5*iD;BtKmOR-GqwZWgliS>~ql516H~CO2-=% zoTLNsfGjzpH_;tK-_|PG(!3hi%r;k9sSR7#HPgfct;!w(w;7`00d*ccfdv=W#E@(a z%REi!@`0MvJ<T3b_Jo?+a9ujIY-X=o#LE+0W*VrEvd&RgHqLXVpR-CAO3PlQ+Y6QY zXtQBa4pPT}-3TwphT=sq+4*dtU7@oYGOfaE8uxgIaj9lHi;k|rbnX#CoxXwkmqvnp z1FiWXy0$R9NiG4S7|y7xzZn@O)El?0-%U*Dh#(zIAkQI#7s;nudBw8BJ94$<D`boG za$Y#??evK%X`#uGb?3_u?CMTTv6^VED?_;07VK70P4%lDM`b<}wta<IDr&(QYZK!7 z)dCv$_rLJnkP#7jOl!iq-j(+&<lbY&yFl0VY=UqG-MAw?FVN0k!`v<uH)8h{BD4j< z<)f)9Pm5;VO2huR>vLWxWIF<rHO0$Be_Lbjy|B^fO);^458G3dR#rx19uqu{Y4XiU zX|xE~eeeBUdJb0%%`l9R4GE?K+Mk*S>ol5>GmHwjvZaX~9Vae$E0${Pl*m>-)Cfl- zIl2}Yd1k#NOqt`Ctxc*^a6zBx_18QhqZyVSfim$LYo(nYkZ`oYt4!V66~8daIAx^w zyM%Z1J6SJIE0&&cE|U&yOU|4uMOZ$r{q*F*=GuE<mt77y`p5-xCs!A%nw^#>Ai}cc zp}yH)A-JW%m|6e#%#rA$5L>9Q2q;WqW7Y9ulNl2J#ISzpd3U=rKj@>rwr&|1l+3bZ z6%$l2*cLJ@UMF(yQF83k`5PKHhIqC@$7$RA_X#OL1DEs>v6?y(Y48zDx44TvG{4Yj zN-qh^C9ZxC1Epc(V}$QjFwCl44RjtJ;DoH{g=qTmJjKU{hxs0v*#m$7ngziZJS<W@ zXoc{J@8)v|nZ#dU=YN?=={M&hTH1LVMvu<Dnzd7ce3ZSYh};EH)JN3E(myL5t_U-x zhix$0TI=bWY)q%LRNjnlWmB*c&hGTV^yxN!diX<F`P-eOmZ`)K38U}#mYesUeCjw4 zc`+~)8b$|qY<vb{oo!>jni!q(V~G<*JF%h9Nzc<xD$ycdN*$j1BODc<X3Ujgm&@gr zv*Pfwc%kHiaBxP!Ulh%jLWO7!!5K6G8Ux4Sf^i{Xgs|YXFgiMXXiC~Bt^nG6RaJ=@ z9f1<%H(QN0pizXa&Qxiw*vUf({55b8E}gtJ3$qO>xO46Z`|_SMj$Z;TSPk(o#JzOc zZk<p|A&JbGehPwg@HPdd-(W2qiE|&W<GF=LveKdZBOuK0n+>RvZC6dmj3y=ut<x}L z`7|LI*hyWkJ<;3nSF_f_JN<#3SV`4chL7g4K*tONVNyFvNjU?ZP|&&#sfq*jPOstY z0`k&A0ykfM+@;$2ZhY*!8ttX0^Q01WU-9zXHy7=Nl#b1UmXTl8Ta(kl^2rRNSG2Ux z9GMHd4HwXf!d5UrBE}HsiDeuJtXZuAJq(X`ii<xieG1)?6u(hN2S(HU0;T9~am%u^ zo%_+bnJ66N;?C|`f6sZ^RL<GiBAUxAt4l}elyE(#KF>CG?PV`m&uF>Px@Xk&L7-xN z9Aaij-X5Xp+pM`;wd^BiQu1zg>P;`x`DL9i%dbM$W@4}*#V%M>L#1CNNbBV0-pQ)I zHt>3>QUxVvd$&yEwJk$zveWw%>2By9(J)%R^~2TZ8ApC=ZaL(ZD+i;>=zTNHd1nJm zr!t2;TtQKa(U{=a1Hr0ghoTaNxWAm#3S_!=bZIUdNh^lRoIKWKkt~V$0*Jt4MeWkB zaIp6P3CkZxyzzxQTS@u0>Z!sp4Q2<<cHWY<-ONO5dSJ)XwKeravRcRB@c59y!-&`# z_`!Sr!%pfqZw?l<Zwcjoho^fQP**7NK6_nB)wpBGdDy`>m44`^g8Vl24KI4Phh^<h zmX~cp>$JyN&v423e}!1xpzcsLrQmBIwNNgTml0#)e$<@BV1UQRd;eH(35@pJ#O@Sq zx1*VQl}57lae(cYKN|rZfQIC#sMk+IImB+v4Zp~yQ6z^}n9dSuHrMEF>6AM6`--?I z&%bzW-bcSL>%AeCBSU8We%>zz6Ouc5i4BoZ7urM$&G((&OMG@7%>7W`r&Lvy;wYPu zE{0MPz$m^kISCZ|lIJNRvA+f{{;S?U(jrA|FKE}gNotoMM?Oh?m(RdyAS$L7iSoAq zuZNlnnEM#jvS05Io$-F*HOF2@ATu)Gdjj;GZ~Ew%#al6r6(fB?7b>NtBTw3-;@a*0 zoz~O2OwG~!uECn^x1S^zSyQ*E{<GPO(^Ep<GM_&+j*x~2zbmGS|M}>}k6pFj&40vm zLysNKw_ge;ou_Y_vL1!%(~<8Z-2sJT6Y8pEt}pujn_gPn{9$1TDRlf-YLEK<uN2?n z|7R&aYumHHf%%VeDcyoYx8d+_IX)uxoM&dDVBa651~Q#T!m1?Y^gC4jJ@Y5Q4Vw-5 z?Ze|$4va3OH+?#%nzf~UHN$RnnMcmPLDL9h$EB(ZjbuXegk(!F2z3U^ES%c%1k$vO z6+D~D`~|iqDRNOLRhxkU8n&MXGP~$s(l{5ip#>$=JU25?2gN}7wILXv+dE^pu&MYc zZ14uOM*FN-=QF2#pQ?siGm@@vUOes9n^{9lFjq+#Tn)||J(DS%pUFE{_7#%Ad)aO1 zaH=~FVh2HBAes>3f8r1aNHdhs!L6!w$x)8AYueX-!5($W^Vug!%i9p?)$8=DC9;8~ zBI$(cyI;;pd)N3>oZ|2>F7v1fPrfrXFNd&#g-3<XJ|}c=(Fs*~@s9*}3crELqP#JL z<Iq4zoMWqJLCuQ-OTti1_}GMWrZUU;R@E2a^@OJKom^qRo9sPUhA&e2JQu9!ZjZoQ z4=v`Qkd4ES0Qht+;MUUGo9V8d)?#72w{l3rOz492lXsPGj8)@ol03AsS{KhY`L+%> zkC(K+h`eIFxng0--TmDqZAt4pd_Ez>Rg?4YxFRS1+6vqCs`f#%%l0I`iq!HwUm<12 z2X+QmjzwO6KITz-*Nd-v%2T1?Hj}f|F(vi+7}}s+Q&Y|g7t+pl$x2M)CC?|e?tA@d z950<4;3Tbb+k3<K-6rJ>bHR!|&}T0RpaPYjI|c2v*bH<3gl?!8N{K|LBW)wMnR3vd zL9?>4ej0`iPG@aRi%N@Qg)Uv$y@}noG~?jOh%>RPQV<;ip^SIH<4EaKqzgB1zuHT@ z4i}3;;*7BC)ol7N(?|>-@(>7;?u5B&GFMrADJx!Hp0yQLm6GK>)s}Ar!Dtl5rQDlo zQyA-6PD7p(n}^cO1ev%eO?|%htg+`Ki!pR5qhVXJmKQk#M!XQgBo#;GGZtsEui|IC z%Sv04qLDPlOUD-#GDXgm_Wgb4gPye7MZb><5q(!XB$;2GmS8y`K}33cNS~(LC`>2O zn?K|(PNz=K-C7&RJv@X)v(7cG;yAAI+{(|xi$Yw4QI$2CHAZv@=IcJgW4?NH!d1)R zbehqEg2r-la)GH|A@yjS9j`6xMeZq45Up@Y^`7bVEOl|c7rCBplaTj?PkJtG+3*st zD6Z&Ux(43gC{8g-s2qlH63d%me)S8_8JbPed=sdKM)k{M=Q7;SROjDr*ZLTitz=K5 zQIWj6_9`X=_=w1^!H<|P-gz@104?YfdRDU0en6`Z?9p(A-boRDiMSB*oXc>Iu#z~e z&r_^T@Aq`Aur@&!?JkT;`YWKe-k!2NGmgegsAR<MGZM;m>eXOpQHa?n#VfDKD#$JI z)Nl2+WjsT+)v6aK^wEx)mrX+AK@E;cxNTnfV<^(ya6#fC&Vx30!dhX?|E>6eReaNN z*5`C-8IRTS)MWszc<F$7hP8|$GyM7>J0f0lPu~ttlxJ|WX3Zhb@xy6Nlk0re?R|Ky zdmDt_@Y}70`oGxV!Nr{a*)G9hVE2$`9U7G86}Ivo$|Sbqk_paNp8|$cr+A+?VL_T2 zc~*T0o|jA$Vs<=`KMKVfgy5DtS%1oMTp=zKbLW~YbGnfN)VfYc>XA7>i>d29RJgb= z-{z)}c*UTp<cg=HvsaBfI$*h5p~N$e)}l(=TcGDffCqz>XG>tg{)S*`B*nf6b#lh} z+;IMuf=jU`JX%S*wNO)@q`$D}Pq<Xb<b!zAE)Rp8<$+Cj2B%yk=IB0)Q>ts3heT-9 z_^(D|atGv1X(Au@-d>Z+aX?AT%jF2akL{5O+nuq*^GQBXRO`(NejD+2ryDmZy&T_~ zJ-CS`e`-k>aeyW?l`Pv<?Oy<055$Twmah<_kdpW(;mko@7-Eb>2Q@^}*M!mQVnhPz z;tl}n!dIm8hAb!b4zFMzN`9VtJhA)P_%8YC9tyBy=ZqI^-bCC>2aF^gfRz@IcaQr> z*p9gH@pnfY*&!!OE@VScw@LZfcJBguC*!8SR7`Rp<n__!Ut36(cXyR}iEBNxzLE|e z>h<i3(k9C8n6?#fLaNi7c(#ew*!t}w7XS|_+v*Cx0+>j<)K|ou$MajnKJyzO;s_ed zfv5rs!${(7B1y+}PQDsj1ZYW}FIoN%b5D0CTnc7S!Uvh3=>gXz$deTZK-!2&Ie=Wy z!Oa{>cV4W<eNMd~o^kggrclb{_kOrBJgxI2*d(K5J$^a-_LJe{#Zl~!u#N)w$aA#1 zWGVMY-r5ZW8?_EMgMbO+S?Qd$ebm%W2_?Pr{YWY**CKkXf`3>fp)!(`pe;#S3MnLM zVdSaN@3-QVfdZnG#!cied2L+NfGx_Pd@{94m~^J-MvFkG<9N7sc#Apk4nAiBeI8yU zHvmVpKGSN|jlR);lW-r3-0#9G1{D5Fp~o(+vTBJ&h3$)dRN9V0SyKIS6v9%}VL<?< zsNaL85SPF28~tW@`#o{_%`I2;o02f9<?VL_CDkkUBPU4-*@7%ia37gitohTAUb8na z_HwMgFAvr8$MSYpHPXQCi|Nv7;)N8HgOJ$9R!O38OilOy0}J_E!jdB<bgA|iBuF7G z1+L9~*)#kl<!3VU>f@bD2e%BJ7kpJem!af=!eCH9p6Bwc_zF2dfWGzfZqKI$9h_C- z!P{A!?0Fv1a1$K(VTBRWia5>(rlRUAHHSZ*n01XGKi27fUe0fR2x7H-ka^kKcGZJ6 zOKoEHfDaxw1QL%LS#Bq;=xTbLCU7^PMQe*%bvSr>uQRroSM5Dy?W*<Rqo4I(F{!g& z{o+GcoQB_`X{Mj#+?}ta_qF#(scaRzk!f$MSh!QRX@y?JZTFV=$kw|`?n0iDW*ZJ` z-83#xP_?2Hn()jXm*GV}8dhx@a~3?I$D-n&eRk>rqEmhAHe+>pHOJ!Sj~#E1Hf6dD zSC6!U^3<3-RC`)-43@ir&amkmz-1lAcW<=5F;>GLPwcoA?5k5)^RGTcw;M-KPK zL`%k*zq=!&anX_p*IteJuI4@Wyw(7l$l6M8a`Svp>`t>rm4T^7@mr*CwGs`t;b0XL zm{y3>@r>_0DK1OJg*iD%4;YTNCrrf99-r8Dt$WNlM&#uvzlrm_THkEHr{bK_yZO60 z;|HQyKGG_juHjbIbS|jr8h@kdKO~^gI-(N!9@ece__6(xb)`q>G(>HAeveVBol9;0 zr*Q&rFFxc#<c+9IX?t$M&d{s}c>C#?lJZWO{Y}j}hNC9eEpWvrqi09BlDB=hK0j1v z@2WJGyYY)eE*zeH!F`Bd9J7%>Oc7Hq56#i)Mf;DN<eySVjkWZEW`xOSry14bTUC9l zMCv1=j>V5X*g7DV$-rBc?)o`Ag=X$?L}GlDm!pL;<`dN3^?k%a?0#`6654_xK*wqP zGz+7aYX$`3eg>*3x}`rIfW!<fdIDOvHh4qI!I7Kau0>YVdrtUHI*4YNdR13aG>SWY zRG0%Fu5DPEv`^D423A32C3y%?JYyKoNF&YlZI_rp35<(k?wqfn?N`Xt#*K>FP;N9M zd<;m7&3H9ha<$!Fp>&*XB$IueHVrCF^Rj{N4PneF{Yzs(p3vx{bd6Bqk&uDj$R_8o z-sI|u52!1_Bcdlu#h1C#cy#ekb8o%AHMGGAkw~lc6_Qk`tG7qlOC>o>{dAWh5Tkj} zps;5dK}sEKl<a${^zIJgkjVgLLO|duNF9H11pOuq#bXmH%AM8Rp*1?=QtC<uG+-v^ zD`XTT=TWYj`iuJ?`)mzkkEg2jJn_2SWpWvJ=0<Us=&Xllr85oU?Pxg&rZnImw<YV) zCz9#RZWx5TF2Q_Uvj5VYd{4Hg)HezfV)<O$H=eOd<=0fz+;RSJdK(=9QBSz;gdLze zm{RaWsQ1ZSLkC1Kn}$|``C+TB4!6)&f$ApNq3N_$vAs<;V)V3Vr{EYKx-g>*c)bMb z>|jH`h)c)E9)FAEBMx3CuD7^pOqN=Sju)<TYf)hmDa^fji{Z)wdZ_g5e$l_2JO)mB zA5M)1_bM-sr8LE{iXXROf8dEarvJGUCcv06tPZefi2ZdgS<SOWclWnkn2)m;+Qu8Y zxvNoEX8l8YT88<i;T0>)a87dBC?54byzSu5wry#+p>e!=;ITu8TXze2oVe{**{<#r z{H(hyIiIHPM7n(*@&bD3>VbXFW4t$)M`t}5zpJpv$-`^zHac1RvM^t0d>a}MnHkYq z95-oy)UH|xhclv|*<*u7vqO?voBiFF9%VI^N}<}y=20o1;$|-tg;zBcMi_=_vaBEG zMzr9!%7%QwXlwv4lBbCj+}j0EE{rHNnV*~Gf$&9&%DS^F<%n=>&>$0RbBCHKx^Oy> zh3nQ*_RS(+B;CBm*~4$^Tk6M_@?qEOB>Pgj9=bc?Mu#-hG0EXS5^UiEAA#;1Esp^f z<iBTZ$wenTn_kHA#=1eCK;$j<l`@*-{N75pl5u^0-!w0^4*vfz5F>ZC+;h^@dmw6d z-`_RD@~TNmv{-jqAuq{CM^uFY7y%u`sI&E$LTT-A?MV6O$F$bP`p}F10BDSe9~5^Y zQ)}dMHA-gI^Y>OcimUGTpZqWQ=%}r}2=;Do!3mt?y-WTP2mc(ez5FJvW|X)P`=3bH zZaCXW?5_G1f|1UO=6-2qCmH-NXDIAk6)*AE?0dp?zXbo5xi2MWFa1lxmg#*|ka~tz zy?_AKSoiBulVZv+xqD^VST5~;)qv9fS7F#WZ{BfGe@FyV)W&BDMx>^M6{L2Z;oZiN zS9O)rfud*SbvTeeA;pUGEmb1kM@Dl0ZHf5z04?}+mdw?DjcecCcqEKxlw=dGT_tX8 z%Jan-#ec^i4FjclF-m>rq@`^6eSw@zOAfiKn>lAlfNgk_?IwhJZ2r*>)3u{$3!`R^ zr@pNKEJ3V5)c5MxgG_s&`*~>pv6eK|dDTX+2eUM?0T<A!!`;t4n5HzCkS;TMEow^# zUg+E@R@(tF0zuA$0J-_(n%rVPO;v^_0DoH#7<TwD#_?;-*LsR&`r!jxnwabUa$$a% zg@&w68|6R9AOJLnt`flvsOif2$<fa??|`hN{s0UQT?oybRK&+U8$Wcq|6nog%QyQP zq@06MX~$hGVQ&a>-h>TV=K1rM?e@Yep6H;Q_Rx$<r=4zEt2V@PI6imeu!MF@YWw`n zvl;EGh~6QW<95S^;nTch8VZUt+bg2PXGfflGTT~zP<u2+d&jb|%Yw;a{E_2Ib}oKe zA+0GVGsB7}(5s!)QU`c5jv~;)W>MKj7!G~m_kp=%<fYDz>Pvtp5V?6><@#!dsn>Pk zh4R|EL0FjiY{EOKGx}!&SA=r?J2|!QDe+D=bebF(zhW>p`0#NsZRD#`VSf|djI)*P zs&P%+j^02h7bHkz+`T%o(k@8?ag!IvSM_WI@}eaJIu3ehm2GRpD0B@RoBxPWgDG^3 z3f{P4EE%0Sv#9BHeL4dZ45J@I2hQ=KI;_otJ2K~C!ymC2#Yc*DO@Y1>s=Bit0t$<K zwA1~L7vMe~M?z*;LdxL+@8aE17tsx^n*DDK^>td?jAqZEml;h(FHW6k)jSOBaB<2R z{vTi=TRzL(4?n?LB%*jiy5C>(I2==VK#tAUL!uiz)mom7oz5HwXUkYb#CF0M2tom# zhN&{Xa|EGgej$12(T+Y2f}H*Qs$SC&{XP9FX>o68vus*v`z-iWPF@URPQ&1g+L$A; z#tFP72D^8ErZ^fyQ&M7UAg5`v<FWCRd0<|rE4dWp&8~AY2{INZQEx4&{&JT4{wJkw z>kwZVYZv`;8&wrp21U>2F3mD7^VGM}*X_hB)NMTqLp;f~(P_#OWHdM^(c8F(jallJ z=E)E~*xm?s8Tt`cte}DccPQFc@5oDAG=YJ}7GtXvQW}gx##6OfRQl}fdak;$2xMQ4 zOBh!1fEK#HhH;9ox0^%I$nV?+fg36()1{(ob5<<a1sXA-rp>*Zl4F!vQ#F{cPw5&c zejNKP-*ziJKmGD~3|tN`pm-|#T(AjVvP(9+S=mClk4Cxn%d(}A;-TzeYikSphC*ai zxK>!hJ{}WBwbUcXU^UJ+PH!$Yg{wBjvyE)J0>etko|BEX>r;aOV`IU_+3mr-RwZ8{ zg-?eC-(5@mY_2d@)+u=uHG8b1>#)V%jn&aYb7AsLcpg^BJY(E#TA!oqY5^*TwIc#~ z>c=9iZKL4hz@ca&lWjLSgZc_dKl;4v<dqo_L(kmvC13V9bcv-2yu7LnT!TFi(i#$` zZsbf<j)@2o*w0#kTccWLrYnjM6H_B(ygdfPtB&68e{eo^>?q*gx=BkAuyLa=NUy2l z5`v|%B;KQq^LfMRj<=#|o>$D7x?;wk8jN6V)=I{4Vm#9J%uQp7>6NWITzY=qhf8>) z8ahF9Bjckqq^@GomF}o(<{4i5g`WiVsNQlPDIco86zIU<>_mf6jqr26{%C(0$J!$v z+{azlv2$ku>>Ck2*O;MQCWkQFDnNr7cd+AaGm!6FII<XCBF4+D`UYyCxsjF-&Wy?@ z!mOdXO);iRtg@``!c25Ev}nH?BZ$wtXQe~dw5~yW?tKoroy*|bcJWan@`3c{y#!vj zn~<|1&C>l}A&$mGgr>IzvnPJHb{J*wmP(FknPwxoLmz^d8}VjhWgCPdZT{M-zqi~T zb}j^@MepP}fK794l37n{<DCK!8D*9+2FX#y<i9=!i18OS<H#013Moc0?(NP`ntZ$& zPi~&0aALR=Jzy)mzwwt@Ka%8$Q@`Vcp=)&oq#?C+Zf6;=@;&Bi1;NpcSx3_J&@Eu@ z@ynYhvJqC%{Cz|)20GX712ft;n4xs%`OzT82f2dN5n3je;eh)gV=+C_{4*u_iFElt zS$RV4(51}v{?s>@O#xxHnSFZZYlVN7$H{$jP8JXLWq>_DG%%+BWYqhK7Q_ESi{W~! zwgI;Z4o^Ok3r|S5q$iVy68;UA$@Y?{F^*0Dap|*qmcXy1)lK#B{d%NuUYnQ?gQiy= z_O^zO!_em6lS|*gjac@CQk{A;wLs+OXajZT?_c))bScmJIle$iFHjriemmu3OpcBI zz4bPXy|=JK<r+Ee@blOG#_T=uns|KUqc4>l<Mn<DCWI;A3_ztSJ3C!+L;?mJh19(; zlG+K16{*g=A94;vwbgpz7o{^CJFqVM+lTLm9S8nYpY^|p2EXrLW|9oN^7eT1SFwk_ zTa<>=_C1_z$oN=9f@{3Lg0tDgTWk?RdI#jjum1qn1`}gu3J=%Unlb923c6BWXT7`) z+v|@zi`s{<yiGsldu5E~=mbGXwbjYDdz&olD4yTDJ!fwPzF{$Z31d|uVmeL`QtB2p zf8@ziK7`C%hI|yv<$1&tT2Q5_5(%g{v(Vl*jrJPC*HV*XQ*{TQW(ACtsAGbzU6!~y zUP;$<0kb^t;9`fGuEr^2%yN5<eA~O!hNf=<Aab~-Rl{7*Yzuf!l@h~%kSDsKg`0a> zUtra==_y`l$|?Go(lk_V6tC`Ccwk3btDa=@kR{||Oxm-)@^bu<ajXDsxqVH?$GbPJ zooM5-JI+ZT+d5p`sH^UIoma8>gxSO$+h;pwf=_!fzZ6dQ-@{_0>Tq&fcE0hsm)Wmo z+4gm=8^O33{5-tumb>IT4QveD&Cylj;<+mQ&Vt~@0({XSkN2cr<PwD#5j(YQ)}D$3 ztwB8J_dKKL(l7e-nmg-pvA>J=U43txi_z8>a5s<ejIwHcXcS{|j+SJ}zr*pk!>?sg zYbR^JGoa$s6f0y`Co|B?DL0&Nv<|i6-2`}F^68(J{AYA%a>|`IJsAS3b|0OFR<>&T z*k{gVdT|UVc64j#E@y8Jcl8;9^^YI4Y-q5yx4E<BmKCk}i2&{lACy<1QaV0rXcR9s z-^@UipJ!oh3VP`bcO@-n8CE#5+Gm9MdpR5ZagPq&4|+0)M}Fd8XnSKc>xr(yO7gD( z%x;Iux`Oa)9UjL+&yJeNjQWPoZ|ApxHx<0)y+JEgbI6!5YNiuOUmqP(Q2BTfcbQEV zzF3d15!b7_q&4|O&@6cUUG9zNt(qRr3^LtT5CfMdbm{eH<F*i7f!@&DG~$}#XHmF5 z8QWiRW{<y7c`Ni9lJ(7^dxIZx4g|nAm1YVe`jukL2NytQ{lPHX-Mwhdy3%}|p{4so zE;%i6r5V{=sqO}4YY3OKW8Wr=#&Xl|%vJF7ue2NUwZrpk-exchrbBBV2i?PUtv=3; zz*;LzCv$2?vPRFmK0Mxbp4GsV7CtS{pMc+eiuvyPg;%uencWc<H9JHt`uz(Ir^;Wu z<8ZGP+a>7aN#i=_L%Z!Autz@BY;Z)<0jP2S3~F>z_AZ*KgWf`pr`6gORcyM<#xaZ9 zCj9iOoeN`6nH2rE+iH~DfGtH@L_F`znLE07M@u1#Xr9#jj<6V138aqWrhD9q6_XIk zO<-tyeRs!pSfDY^DmGA0!SM^>+WAnM(;B0WSb(q4zWv$h+8FKYUmVx-JZ?$WzuE%k z>}TF~2;1~Bamq>gVY8-GeBeuc_?Ba!4)Si3TnG_!fsLN8kY?n&ZsCSN(*`pg<qlFA zB4hN+omO#gE2`|{Dr-C(bSC!SkX3oPzycGb#j*B(YUqC}9Ye!^$aqS(yQp22rTF?h ztA4+S7rFqo)+<uIAE^7+D+FUenxhlv>=ER0jeYQ@2-e4~W*&X#+5Nq|=<1bwZh-s} ztj5x=TW(7$CZ0C{@rHCB-M7B9U-oHliyX>-uQ4<2^TRseR#FczX^U}>cGe$Ygfo3c z-@4Wn^FRW`Xd~~N`pu?h96XlNf3){<^09|E6r1ibci`#hV8W>ex?x5=;U?X>bUNt8 zxdvuw%_N7sLa0s$7l#1d<*O2@Q59p_CE^x2wMj-C=&Oz4sHox8r8BK}Wu|1c+VTY! z;vf1e?6r-1txwbZk!kwh=q^G1zNrc{lx#F(A*+paiO;SSn&8NTL?ad{4;BXYj4e=` zeE)7JOQK8^{d1Wd*!09h6*hq7;8sn>)SuE2q)uWI=S2;{8l;zA47$(^DvH~B9m|OY z98wL~5CEj~=|AUar5&$?EoJ%d1LT)T$cjmJ1Q}5EoZS8pXr(=0&VWPS7icY-p`+_A zaLE1cfS?W_QXWq^kd;P*tOLYc3|VTVh>(;AP@ndr<Vc;D;1MgFlJEEc)}~*Z&heW3 zEjJ1RgY;Gcd^;H&Z#2!dHHlokM)QX{Uw(@=s~zmYTDrzkP9Wb|lYRetC}R8cdEzo3 zmU8??^n-LMI8)SI1i)KFa*%X>sOOD^+{B?x<-L+llH#M$ynjkP6gM|X28gLDsr<@! zQQ!a0d!6gqDi^H!#`2RpKNULtsUg=78JZ#Tzp!3Tts-{5BJq2);ajB#gu?DQ?R5=c zKm~MA>o`QDE4Bdnv86bAx;~MN%*3NeK+BdW9y}wnUqr3*9ML{WO^$vCR3HuXQ!0W4 znmVsq3N<qR?%_<DANHm^J0;Zp3oaAgB~zDU!*Q%QFTtS^#a@b21GCuX?NcO{ivpZB zaSxi5M35fHOMJ0;QnQOEfY+!g^BNgg{qT7dx`-|(vTL&CgMMUWWC#kNx&%Mppi+C7 z001u^a{<jIpf(46L!zvpS&gfp$^F7S06b_^Q`N(_+Z2Q<WoiHrS{^&9(4KP*7bmGX zT<pyh(5)w<8BsX}O^li@1Zo%+zU@3?WOqt3^o;7#4`6IOEw)2BBA-S*R%^bs(fNwb z0VsG4ZnB)>SSgIv`Ji^P=Oz>grKpT4j<zvR)|d;J$?16H;FNI8Q@rxI5!!M;ygdM0 zzNxMAg~x40_RA*3ES8S*v^`JTUpZ`Dd{mBuclLl>O?cI5;ZBtZ=~toS%HayW83g+= z3|KSNIlyc_q7Op`uN@2-l9y463~zQ`v;h7!Xj5?dF^Q|KTaI??jKA3ztY`cQ$fsjU z6TTH`L*X~%`B*k8x<!0yC1bM}K)mGGM-(r$QAAtY?iW-ZjWZcGd}B-Tyocfdae-5N z(F%1i^YV=wKtFwV{K8bV7>8T^JtTjt9132F`H);SIV^JQCcV68|HBPw$~1RJd;ypC zG;-W%V$v;Woku6MP7+W3Rw8Q3;0N_k{7jnoJ`5O%TbY-E0PFQ}d{nZJFf|k-LZR+x z7`V^MvO-@`z9WUElT8Ft^8BUUYgf1V;!1>J7e9|Z=+=dC7YK4!c5UfcEr*}@a9JS+ z@=4M}r#^Y0Qscr6T%^&w5^`__I*wPk&q^<VI?S$WHS6I!CXyQ0eB4QO)_akUe#&h5 zwG*-k;qxxx5dWsfPov%;(F2&X#aiX+MmpU51{l#;rOmkV*+K(N{Z7p2?0&`qfq^Y8 zpoL?K;{dyc2hW4;y>fT#@@*H@E`}bU|I%g^QN@)e69%P4iEp=qI~LJ|C%RqgYFu@% z*@&^%rqOPG;`HFM0E-&w1}9Va+?!)CTV3SR&NF*R+CK3fis}#`-<jFLFNF3aajre8 z3_L?yr!;u*O?I}J68mE{$_33Z))pszp_I*LZm4~86rCz-{Xt*@WPYKVadgbrR<XJT zq4=0XIb>nus~7#**>gv`9*@R-t{md1J-^ZBwzdK-tL#w|`^eV{?F)-<hhNR4pL*x2 zwdup{k=OP!w3jthHnIhsC5S(`SG2l8A1>P!qX41NlCCAVA+2p>nOo-~yLn}Ujo^Nu zr?6|ZtYetvoJr0g$ozEAg^fqM4BnY6&w#^FK~kAPJSTt%dSxhR^-%9uNCALNrT2RP zNNo&rm*J0_Vdu$~T&F3%61`ywgoA8e2(9XcoI1#6vX{M;4Z^sBreUfw=ZF>vga@_E z>stEPGPJ-=j1KN;)Q0qLT~$|CvERw_`eM#eshytCr*e0{LJX@v@LRx2KT%V)bK8#= zrq8?xYRQi5XzxHD{t9_W(_8V}=Do4Tv-sK5K4Q5;mQ-#GVDd~1VCK#=U9Rl2dR105 z_buH}`_k{)hgF2~r!2XXeaA~aiwWu~mOLrH0e3bhDx!SX*gb#~ZTSZ$n&-Lj%PP1d zcX{BmnGF5}qPvfsvpD*}H~sWI1rTC62Eh;IaCYiI%qFaAS!9v{e6ru4fLP!gE7rw| zue3`mq7AB>xE7%Y2Sr6AJJn3R)VMPUN9Ut`^X@=^9DMNffVKmJp!1Mx+@x%u`RmA( z_2gg%KHQFq8wK@3ay+HJ{yaMT4fcnx{tT>Ak1#oYg`AhD2xlSZN_B>kvx1}<I9Dn! zbpJVNs;il@N1`iH{!ELmQ(HkI4RIpU@Eovk)yv(&QrN3MqpR2|Xd0AngmR$7X2YT= zx!Lr4EgnEi%*Jj7)m>_D5f_+0XosBNw(7jRxAH3_Os8+Ad7!FWT$nVTslENk9x&8I z)e?g=6{%?GXAnhsFN|8yOzCMRA7rk5Ia3_Y$UYT#1>`u$;v%`}jMDY-Prc4Mbe{zN zk-h?bY=JD;Q27_!%SM*Ewnxhyc9TE!>tMqF8ibWRY-8Ag2#WYag$EUB?b`Z+o6A^^ z?nq`aEtTMb{(gw{e{JKL*!_K(#E}zX`1EIY7zHXCJ^m1vT|50?jG9q!e7W=N;A1k8 zMYLf3j~l$$!t0-Tj5qv(z9_<Cmz6&Dajc-2Bjnuu0L8K^&;JIU5F|=VVbfx~z$ILg z>=*g8IJE;mKr8a+1%;_BRvZe2q7&?14!|zVRe~vAj$ohDJTf25Le<osE^OuA=5Of% zDPBI2n>y_XgsjlbPwYhs`sW%5T8l5$Jd2mtMj~~L?cU9Rn@6D#X=mY!O!H_#MO>iT zr~c(@sb4%8{LbY~xJVygdSDM-yrjQ3(?gpP_*c-VD(}vQ<KFAvL6~&{z2I_2q<e`R zbQsUz3qNH^I2-){kYTN9h)BJ2mjHYAcWP~dKs$ZKOU~j-Pzt|R*ISH0eYXyWkXw$q z?<^JESrQc7hIWZu24HI%5Bq<rJM(ZT_rH&iee7e&lAV*KWQnpHyOb@ZvL+FZ%3dZr zF%z<!%9gE^C8eT8$S!2;q5Q04r)*;_^n7QdI-Tb{zw7#)>v<l3xG(oq*VWy0&-;FV z-k;aIPcaF-T8;%a7|ET};-4}*^Fe{Xp%~@=m63WG#>=o;{-va>#Yx~8&6kI}lPp`w z1=L3j=B_44c72pDPSA)k=ZPFuc`l!#_+Tdfd3R{C(wuGBxmtrIRrGtXjUcVy&AY(? zs)`aNQKzSI78r=2@e~zclk1=1s>=12qeQyIvL8-k6^Eh*4pt|b)^X@tPfYi6mW(=m z-Y=SdNV&JWblSt=lEWljPyAcHZ;<ERs$ppQXal>yQ+4MZi!U)b4tlWN+cCm$jbilu z-iO#a&3DG6rf&K)hASPclJ*p2Ws9m~Xa<@HL6ND4CdzYUXAXDghNY<ZqzFj*2CiqH z%2?MbrK)?cW>;1%pwyk2e_ScmzgD0uA`IJ89KOI}H!*9^_1b=9<y_Lh`Ez&d%Met# zrO1OdFeU7O-9|tyP;RooZey%kwC5^~N&b3+Y<2Dch_Q|CIgw(L_eAb&-CBK4;KRx! z9a=`d`TE;u$;T$x>kTy}ptPva*HEJqI%rwnxod`GmXF@ijod~`%TQ9RFk{4IHCWII zPUs$vjb{mASzN`mkz7aqSWrDKK>abt;3*H!P|ub|+Q^lYjZdzJoI?0QX31(irwEoe zDONzbeG!wb1})D?%*TWb^|Z{gNSJp<&hL|^VfQz|H11kd-NcZp5);ei!>2Zigy=@~ zk?o@+TN8;$RwiLd9Vl0DGo9VtxV=Z#gUPAwGPNuBj`GAu3P{JJ+!27HEc}*S$ndl# zwAOI`HO&IG_~m&&lPTYfYg<Oe3~V!0pExl`KL{vZ&F;#Gbz(+W`L3Icx3DQomAfav zCHfGoETMhTD(gWQ>{>NQhy&2XJhoHd)==^FQNd64sIWu7%>g!a%w}cMu|Xk_@|ML6 zV_sHls_K0BIOTioW6=G#kA3LX?ICWA@H$Gy&B(Yfa7y^7J?{qkTqT6v5aPfls#7!4 zG(pFqS)~a)0%$57bI|ax^xMTaLv7gg<Rr{ny-!rRhZ)>4gY$P6d<%O%e~>pozbJHi zJ(Q1u@(4v)X(&KU_OxksSh#A+T2AK2Z!dS+P%5}TES~L~6bYdp(UeQ_OWBIYIkm0k zm)R!dqA0q~V~Wo3(L5=)*tZWne|(J1clC9Zi@b5*Yo4I@RNWO_v}Q+ls-{g*1G43+ ztGX9UY-Z@`j`E#df=0Pw6|qYgFxQ+G-8h)BSQ&b0MsvMWJ(M8(RAUb!N=lzOS&Vjy zdQC6RN=pYP?l~L%cDKKDB~9Z(GZt(otbfGNeS@qb%4)GP(6HcO4>I27&AOnb`rPfm z&;%AmLoM_Ta+Vss)F3LPc6Vq)173a6b8R<ReKJrL*f4T^8qpO!pjasHJ;8~!aSuY7 z-L8hu^oBDLxUoonE4Oz^mtEfJGF9Ux)cT9bO#EPwOe*Dg&ToW1sud85k2q(iLoC=9 zu#|(5pFafo(w-E|CJUN?KujJ)j5YM$aQjo>27<(csMV`O4Ys<pYy>O`Qo$K|12+-W z04PZ?5-b)0Mhtr-oqP{d!J6?TD+&w=c{zK-DG7?|$BCfZBn{;+r4vyg$^5%nd1CIK z^xFv0c|vl2XDpbN+XR0BC2w-UW#_|*C8yiROX$!iRrgKLTULLANJOEc8Llu~C!QnH z&cOOCKE6c}Ws#5D2@=0v_o%DWLy?_hr=ga*f1v<WB~$7Vj`ZKr&%orAJl>;I)?e#$ zVISBWon3QqKl3{~MSm5zP#^A_YG1^+BADJH<>q+^h>wV$XMUug_Z99b?rHO?`S_R9 zLDH|xGCJ$2SPL^Q*%v%YO4<K~ccn1M;Jp$mNc4k#9ghFspn9xK%e74J%=UHwYQ%f2 zL9*JjB`&p9Rnqh`x@59oLy2f$0XqpWXzvk1U;k75*^Y~af548ylhWv)l>GAi)Bg*) zN(|>_-QFxCil@a|W^9=OPG!l}_4#6(d9Q3F$Ep%j^m8|$aIg;a++<+i#7rydz@uzo z<$yU!YaL>;=ZnYomZV~siU;gi+p>pTU5Ydq8Kz-O?q<HuOP4ww958mQb0XC?dV9$d zBlvYD#jwf`{irb(%BbhlQs8}eqL%mM>-(#8bFyS(D7jp}teAy7Al_stHs)9Z7^y%a z$+NDf&zUpt+?k^-^v7WGd{VB>D5@(>Hth9&65kCWr)rtoum<ll5OIsO>?0{zEp92v zn8%KaLz6|8tA79q$NjJC;&`X368TbJD05=oV!4*QbgUrq+?!jNaly~G^7Fz^6*%lh zo0>5!PqP!PFSK@HYNt5@<j0sfjW971-IvrT)dSwf90(Xc{q&HkP6j?TW&V33l1U2o z&J#B9RLB9*=Jmun_DqU+bOxgC8GUn`jj97~{22enexD@c=Dz&A)D}gsyLWt}cmveO z6SqTSm|ngp_>y|eW~<YE+EL*;2X$aahs%!jwI?a-#Y{YXb3YB7y~Zcda8JF$y@v3Z zd!dmc6^Od{Qsp_NR6o*CvSHa^>LC!4$|^-mQnFELW#>mN_`EXmoo#1AXxaibdz7wB z5~ZH&3C(7{l4d3r1mMngnVp*hD-%%v3CqyO0EhC$14%n3A7@+^)D%OS?bccq+A8sk z7enD~6PhiyO0i_KvGsBuEUGroXj<i1JqGiD>#3@VHEhqWdVG{q#SqQ&uxL*3(})Du z<zW=V5^PkoQUw{I-Sm!i)A={S3wKQ)9B^2&XIznhrwwVT+nLC5U8ENDqL4_E$VcnI z7*u2Vn<5&sXyi}B2l$l=Mbcff?1E$h$SCv~<ldQHT^emokDR+>^4ncPHzk>UW<`#( zwD2`TKeoDOKe0dQ`#V2jfDup00PRx@is@2eS7(-|feyc=je>^Vg+i5IhnP8T1cnpW z==k~1vmquY?e>nO=9;z_Bavmge=yoMQo>esLWSOWHhM%yGlhF$J*b5iJs>csJs&p} znUSa#0~K?S^oF-!yG&;8UL4U9OU+(&&6ov7Ay2lcbFB}hr4wE8B%hr6Xcgc`;m8Ut zgRYww^Q{d0FMJx1b8;+VgosmINK_6}NUY{^OwiAr6{SI9ISbT%vvs%&cjqs~Yp%cr zXlB;7jCsq-lxU&Dw)O|C6YJ}+_iDM$3v+qP)?6d&(_z!%KrZ1HpBW&UnLPQ|LVYrF z*5st!Y8CV>K0ZC@{Jec=+_%7l%ld6&>QN)U7K-@OwH!sN!EzVg+V6>qiwL6VwoKFT zzXB_lXX(F%I*h>3TkI}2^aWcdgVv7@YWdE(^A5d+`fq$%pbGl>bbs;1nbdKQCD_W0 z=I|{boSNKDUZ}D?4}a#2>u)=?o5Lp^Us{1PsNPV6cvdMb7C5y%2an|DJ{FscGAx;d z#IlC2O(KHmlaRYw9_oAyEo+gCCW$s&)Za;F^<cyDYSSJ^M5?zScfX$mEZruCdX1Oa zT;^eMNN;QN#5V{^VI7!V?_$J?^^Dc;773i}p6_<zyt4?ON<aNHx@ey%dc)nf{TrlY zEd;#5Xpsl#r{><c6aw_i4gJpJY!3vW`^K899z5WQ2sUWj(|N>uG<74JrNjEpggeXG z8C+J1`v!7s{EhtI>Lo&Q$_kW6S^wc!>UAM})HI%my!E;qjOqZ)i071g@rN^!rJ)BD zrJo(n%rbJHp1U?1BEEg*SA)LhO~?>Q+5Bq3Fyhxu;snd-Hxs-YMda=i%&4C_#zT*~ z*uEDhbV+@mYv*=a0ehJj@#_jZJB5UXu*V<c%-7^28JbR?8I$#335gkw-%mL8GxyBH z^`Lj3F%=by;)|4$OJd}qAW7zeqi28=)&DF^WrZ{D`dH$t0>EPCs=FSTkb<g$-o@U@ z6XHj7MZyEmn9nZWAWZ(WNl=KNkGnpy_PI_f4S$;c`IVo4K9-#ZrX|rRF&p6mikqVT zOQ-yM5v1@G>4}bH=M4JGcJ@L;h&I*#rzq7*eVg5CA9h>m&D<-UA0>z;Vf=)!8ikwP zjdS2Q|37l~e>v0p_4tpX12-G|4l0WmPrHI|N%7x|Rp0kxCaVLVhFUP|erchou3r=h zS-ted!$~FoPxcZaQRQ%SPEchZ-H{A^x&A*z--j{mA^QgnhuLVCvTAB-st&K@G)-~l z+#Vht9=cCo6ITViC{^|xAed01tI^SeUR0ati#F6RlvB|lQxmY<ENb^=;)B*|G*%!v z)xSPgwY@&55$y77@MA2mFW#W0pUA9qR%S+^=nA-Y<WUpM&o4bOkARxcq2XXOua)(z zg_JJlaxRutEeQ3*sdXi0;MNv1&%6Wi?VV{7kWgvGDDlaw#mOK9r1qxu==*0{^o@uG zYV%vQ`X+D2qEKOT1uk+_b8urps=?bD6}QKk>tRlpgz1#|3q*aR^q5|9bA3p_8D$f` zH*ubrQ&fUf`H04wqXJnlM+-w8@2>-=UxV!bVoz7vl@^7w>Fn8)G^&p|@4(>N&0=N& z<JwKIGc2vfQlh?ZxI(tBTvv|>9nbcCZO@P|fr`oSYvOP?D^BiAk?h^yDsQc$R;a{C z0}pK_=esqYl8*)-27JA{jd;zL8$v$3|De=;{&a3ZV^js|kESnf^l_w}&3Jl|maw#| zp8}PWRGR~8L5M{Q>&<CGmD$fAwObPE-=i!Z<64Gk80;u1Nk)%+SWYMvDV>#!wK<PW znnR?zd3d~;KB;eYB2Wo<Vfqh`xX3R&BcU$hXBK0`<<`^O`)^y+^#xZ`ap?RAV0&@3 z%>{#-P!=jYvWRbNjmm9!^y124jz7`VBCsj^u7Ep0V`bSBU@ZQo&Bs^!27MCoUqD?k zWM(B2(c??^g}U*)_~)yjP^k)$o{V107C&iMT*~G4V7zQ+;5rH<ar)~X|F0POk+@4_ ztDv*Imhp4#EpMEkw~J?2aWQ@BtBa2AFa(^i{fh9&N!eAMpRiv;k@jvOvIusDUBkm} zd@QPQLM(ZVwiUM9P{T`Zz&JDLRjl*^N6_l!Ub1fxdPCljwU3S)%wk3tpQ*dcGBTbe zOVxRFxl#scIoz9Lk0jjTl@{yBG~wSMX*nx;;@)_@q&*^apYX8!>Mwc%L8jKCa>Cw$ z*fFUM7A}!R03ZM$0};5YK^$#hyV9E>%4GNhJV_TVLsmjr=)j_&51KcgYEcXBhsNPk zBc)r(RA+=hSv7{WTA5SeJ^WvvVUfG<jf|b$niySI)IAEbPn@q-?DAsL(SvXW&MySa z-g}bZlhLrj0DqMc%gtrCxFB`<84AL$k7N?``Xg~#!0u{m*9#E&tI%K57GREWDN@Vs zDpWrSvGZ~)*cbJd^RqVmS+GK4dW^*+d|!d)J%&Z0&$oI6N0Q%bb8HP<y7$E3YZbkb z>ec)|jz$PRPrjZTGcgdV2*eQEF4JeTLfAA<$l#+|FmRW9tmk?VhT%?0K*#CX`%XU< zROz<NbF4?yhrH;rwa3lYLOH>_uNmDU8EbCCtP3!_L&0t`TT&;jYt?_3qc+cpMiEt1 z3FCH79?z&yJ?t~Kv3k5awQz0&%h7jexy4HnJUra|1~Fkz1i5^f+=gtZy_bM#=)(H_ z>^V7D-Pp#HFIp8%G~fxt!d4?^<C&*#8+=UF;K|aVvJWC_r#|Ywq<MU^6m$Nn(l-d2 z$v@8}Pl}yJ2JNWFRJEKX3lTkcwx;p6OhQyR8INiqxgbbWksq8|r*@F%<IGLOgIvFh zE^$2yIi$Itj$5bc^7u#khP%zZ<ha@tsWz6~y27D+^Bu|Zk#roz+CgKAT9o(rXQ5!S z20~3d`?Em}rikP79W(+`VTmI2m$WMw0gT1<?{4b-wBYwWHKC2e>PWfvUUtwQBqP&; z!TeQt$qKxq=Uo8xyQqfQ;4VwZ<bge)4yl3~$4&cTZ;y!>S-L02QFO|vcF5FfhnPUx z+9MvN03ctZboiYvIlgTr`2KNgM{%@1Qk;<Y;+qHcd8SNjE}+GZ@=(Qc?<ceGB+Zlk z1>vAYl=$fL^YP!Yf0UQdrfJ@%$Vl|ppX<m;0c*E%uBp$I+q0>zWKC<QrJw3Cx9Rr3 zRy)E()GLlS59)z_404nB_WvCipB|5~qQcL@aLFS7>T250@14@#@5qszKbN?Jh$|%* z(5xK%hjUB8YQKagoTk+po>IhOei>TYwcpkFQJRBi)!&TN4&X;>;d@N7l4p~DPK?hl z&}k%0`xix=oW$#vSVCgSmY<&=ypXzwjEue=r)(bJUe%N;tE^Fpx(-f^9Pp02rbaEy z6$GI?(|>J0Hl8V@Pu7kU^=Wf@lPI6!F*qX3S>}|qfgafkKcli8!)BowwC*@hKj6Or zxiXOEl^2Ye{q5j0)?)zrfWrph0S}VB%&ZBz3v0ixrFdp_M>V6QBLx+cA%Gaww5@WM zfaX{~aj5)C@DoW5zSSJ-X*<Ot-EpEhm5lR|Ks0^n%~8%A+$Y@~YOt~crh-I9muHcv za%t|0t-l6+#omyheQ1Fg!InN9c5gLn!-cD|JNO8aYU0Q&bDv}akOTgKi3ig=il?=G zI~cvN13=gtw}sKW(5kQd5%K_0PeOiCPY7l9n);D|Vf9hj3;OIc3cL;VLRn$z)0&qj zZ=4dMSs7`*a_4$|$jq!bCZT9r$nmi<Zg+`B*`M)uAGGn_$J{dad6ndBT#nxxS5RW4 z?g*nKF8}R^syIF=@ogZe8{v}XK|b8<%zveL;&_z(HfdtR<MJt+ag0Y*+81{&dmrC; zyTHif8s3kiVTG!bN<9VT6Au+LKc<W?XLi={RkLoP*YpF9Ib7Xn*Kq&~hBpW<lp2aC zc=$`2nPmsCijxzbf#Gkh7Ge$;ZW~mRk=PDrrl<iw5-G!i2Xm19MXE4%gxS8U-9&Cs zPSyGvRp7LRI5w|-s+PZQ&g}qggcMikplYz29IV#rfUP_d!bwJa&jgw@7}}l`5v~;! zvl%MVcITATp53|V(#&I-2t?rU&D>7qabG=Yez#br`O>pDRRa$(&g?3$-#mG6bkg={ zpq1*DOb@{JgHIxSeKBI)KJ>LS<0)26@Dx2obnubbp-N}<RBXxegTE&t9e985f?OYf z0TDGz#S}r3kP1*Dnxt;~X+`8BgH}EVOqwoYDW7(&L1;^#y)sVB+E?5v?FPStDimy0 zn5s609Su<gH{p6@wR=nT7kKAW&fDYX*m-?xDLR8`pmgl@F!rPnnb<b&QoQ>?qxd@T z5cB6i`0Zd*Z3vS{g5)uKd1_uQhTRh9KFJNLoiM-FX_0!Sa2{;k`r1S^w@7{hMe4ER z&g5NiFFmJ_jQE#sBfT%*S2-7t3MxU0$_B@5zO=Z#x|5sV5x7LuKiSxz+gE0kW{WI{ z&ddagcgx}TEE^NKs3+6{DHR<~@nA-Fa2L}NEwe_CApU)*u;xajOnmv4YY5c{*1%}s zyiinu;N$Cf31p}E6uhe`2hi7EQq3f_8ZMto28q5x<?%f8UAyjYet~*esN}Jk72!5* z^U=Bjh&sKn+53emK7;#`!WS}=9)`!>T<mP38>ul_VWWVJzJRds+O{*NL|5H*8L3+j zJ?;Orm3yAyL~kB6PjP(^C4j8*4FfBUA{!{a?o!xhKHHr&n&CaFaoTrX493!j>}D>Y zgKu~m+aABfurA^@O4}aUz~;c(c6TE#u1(sAC{TF&@o69O&txq3&BSRCW@kXf*@FVu z;JPs^MEvd`qr^?nJoAf4b@OV?ze@hE%95KQ*VJ!niKvIX{|99W0hA|1xI{VlD;Fk; zzf!b^vq2$`Us;wb;L{e=3I7LlNuEo`6&93_j<8R=HH|1S9z+UU|3nu^X7gy`lW70X zY_0u-g!;$V)|xJ>hlP|o5KW_h2qplz`tJ{>_8N)EcBRVF6p{hnK(<^-;m-sCLbm#? zPWd7QL%~b-+v+h+C4b&otCb+P%3EyVw#u9bUuJ56A*DMt<_o?g$SvJ(QBq3l1EVGM z7I<-ivII-PFe@bnPDD3$Xu+1aP-izFEI8qEjB_=f;mhmj+KVU9?m}*<C~v0WsF%29 zG{XTWS+3V8c$ew>>h7R+`UyyJbX3dPVNdSOZUAGd^cd1u96OO5e&H$z*+e(i`<2v% zl%GpS-pNZBFUvEC&J{iRsKHr2Zn%V}hXDwQG4|9RIkfi5sF1&&W+g~cFKzG1*KczY zJcarwilmtPcR5aMQx8B{bw=x}gDv;K+C5h=XV5zdr2?lU<Y$oLT^SIrsx-NdvVRBy zCfocfPF|dDiRfvW-vxBg$*~hjU+2hdPY2V?U3EN&9v7xSJ$G37qVuZtQ`rZw(!Ufa zQHJMV@z>NEu^k#TtD7Rh699Sv_(&K1=g3a4vc<5zu5&J13+4<oC*L}i1ZNqxx7+Xm z1G=eg99N9s%Bno@4Z5tgcQM>|{<76*^mSly2@Lq~I8%2a&Gi(1A7FC4-$tL3cv&Yz zUTOG!-B)NobKP-mcqK;&v+S`u1|*Jnqn9v~;u6@_%-#~9ag>rVmCfa%5!w7g&h*_n zKadTU2qdimkPye?t)d^;dG$=VYPaNY=;yL$$4FSV_;F8lzd!&5MMK!nd+grdm1@)A zE~6WQ$C`4H!2MR;VJ5JvO*ZlUtGl2PNt2atd4@kcRah!0$Oc<}gK7mz?=c_37c^Nt zfV^3R^V;0*K@_L@+;`bfF1AxT{B#?GHNV=LVpxl=FJ4~PXXoB%<qB>!3CU?K4z4cR zQ-9ipW!D%;YP8iqYJt;?Roo&|)e_4L73^ZKs@W_HU|~ug_vEWtp}+=722CI|WvYdh zp=i!c-78PleX-vl>{9c7+Gdw8-1vG@ph2MU)BNz)ljp?Jtbcno_AFgf!{JJUgPAz^ zKT1#@Vf>b78_l9A_tK$i&BU*e+M<}zHw77K^!&oX)6RD^$L~AZND_s3v@`(J-$KIo z#LMY)=op#l7GaO4_NC7k>fcqWyJd{oNiTwIPy(;4J@tW2_c)P;rsV-4N#!g$ZZ2}! z^F}&LLB@*}ZgOa>?$fiIGC7O2=OVSLkWeU_{r<SY>Q5C<Fqe76R1ZF<%A8o|!oIqt zEybMo@S^2bdgIId`QqO-9L(FKls(SaF0ZZ+cvMxqFtsdeQ45&!p}Zt57h^NN3@{sC z_s)NQ+!0l0>eK^5IRLPvIRii0g+OCUKc6tybS)bp5!Zz{c?-GvXeBqx`gLt@u7+}? z_?9+rnGZf1|B5Jyd?PjoeT}k2FG6nR%d%{~wx>5pDSlVW?iY1w_xP@r{t<E}pVD-D z+1np}M_!gA>y`R02`xg}Sqo)W5aq4b`?_ABBe~ZbGke6IE6N;wq5hZx-^bMEz@Tv{ z_-_pGIFzWb#sN?6yO3KO0W53N1(`37CD&u&;wG)t0yDvH?<rpMYPg23Sod9obHiyu zdt(Q>n?rbc&K5+c)E?*CkO_QmM<y2bN(c2A;erfyrizHhuJfu?IBDoO0IX3oC6~7E z+(U9)SuCT?tD3`^8_7~+9ZX~MEwGRxs>!<pClbNQ#_wavgxz;0w{rgeb^=_S=$8C= z_$Ry*e9s|_Dxm`h5B(EIydU^^VW1`QMLKo*O->eWEbHG)gQ%TTiThudw#yy>Tp+hY z9GZyV1H)n4@ZlMPAfeM$8<VVCJj28dh)7I}_se(dl79x@sErajU0=|##vd**Uk^A{ z`i_t`I{z0@W35tQs~Z6{s%mMZ(D7d#k0hkdjY!rpBmO=yBYa8e+yiA{qJ=`*pZ~G& z<_}WS%}@O}L?QB5ff_=ZFodoA7Z6IKu|jIe!F~4sSi%egb{DA#=a*UJBW(ZT3e^6S zE+MVTfrK#Fr%(A0WM&{sKRF|uxTUagyFK*C`y;K9KTU`T=EsRNm#%cVPoZ~!mT(J7 z{)-$k&NSh2^oiS3I{EJW^sjTsmvWjE9WRC9hCn6@CW)O0m3MfRLh-~ff^%D!%;U<c e+i@zy!T1lZs|*fb<DlulUJ=LHC__=-KK>V<1dyo! literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_cc_by.png b/apps/cm/public/images/img_cc_by.png new file mode 100644 index 0000000000000000000000000000000000000000..628cc2bfd3fdd655056b888ff2e516eb66c45812 GIT binary patch literal 4498 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 literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_cc_by_nc.png b/apps/cm/public/images/img_cc_by_nc.png new file mode 100644 index 0000000000000000000000000000000000000000..86f60c5dbacfbe0f4fc58294e2f6d2a4423ec726 GIT binary patch literal 5637 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 literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_cc_by_nc_nd.png b/apps/cm/public/images/img_cc_by_nc_nd.png new file mode 100644 index 0000000000000000000000000000000000000000..9d8ccb18dc00d7898c8a25181af55e2ed2143ed0 GIT binary patch literal 6651 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 C&0xI% literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_cc_by_nc_sa.png b/apps/cm/public/images/img_cc_by_nc_sa.png new file mode 100644 index 0000000000000000000000000000000000000000..00f402c9e1a34e5d88e949b5cf5d31cd17b20fc5 GIT binary patch literal 6694 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 literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_cc_by_nd.png b/apps/cm/public/images/img_cc_by_nd.png new file mode 100644 index 0000000000000000000000000000000000000000..0da64acd8a24fed8fd21782589ba77e69fab6d8b GIT binary patch literal 5510 zcmaJ_cRXBM*VYD6BccmqL=biK5;cs`W%Oua3<fj9%;;rqh!&j)5s8v0(I!ZulOTE- zQG<{mB18>Q6W`>%_ulvW<GbJaopW~it@Z4+_kPY<YwZLJGXrJ@UIq#Z3T8v79*kTD zlb@^fROI)8Hhl=W;KA$L;Vm&9_#js-f<ng~<AwklqFg-@Fodgnh<_jA8U+P42x(=9 zw=*?SgJV$AuD@lZgHe8DZ3>EOTETv<a32I7=!Wn_qBTHU&Fvr{(p>{&t7s}~>USOC zg@lG;5tgB5R`5_CxT-ryOA~l4Sd9#TLf~D2!6;uePAymi^e3(wx&FIb1_b<51n;8( z`j1g|rWU~K7%T#)C@n7qmj#1?N=njT1w|z#uq04U7Az+tOTLw)zzS-LN@{Y-z`rgK zc{HrMhZ;-|^4D18mIlZRkM~oPkqHV4k`9uW#$Y{Vz^baMzcJ+Gq{tFdxDYhnHCPIb z6aE`P4}pVYk$!k21`Yg;=<0?Ez-xfWmi}i7D8GMT(YU{siM(Jk!LEKXU}@RkQ~F!b z)b#%sMWOzY#^GUz|JwV10^_Vg{17rQ1P&8`g_AeVL-_YlerngT2v<A?YlXr1{=JG8 zUKl(E=Y{bDUbj>NirFI3?wBB)_@DBorfP<09NrZTM;Pj9fXE2aNTj<OSVc)*_PWw_ zeO<6J7_6_VA`g~_=qM=2LX_pf`ViT_b@edt02Bg^|6AAnzq)$=s{5M?C_nPZdI&5s z5aABNVo<<8r>utjcUyG+74I)y_kXuV_g{5o$i~S0-q`=O(SLW5+4H;l4{gbfe~6Dj zli7|X)7mGxi9kWYc5JApV--B}?IE3&bx%{z*I)_`0EZQjips5%#ZFd9?;C`e+vWL& zn<$d&W~$Ig>rl-bF_OXeM0s+W0?-U@u(Ehw7|+0|Ee@j*?=NgyaBVr+<Uc>6y5_W1 z<?gqk=;^WbUf$)1aE9@y*jie`tqk%c&Tt-w9)}X{D?44?yUMW3c)qsn_U$)MQ>j~; zgQTRys}Bh;X@7D_gnaL`X=yA>N-_lvKR!c_c?iqP%WrMY+t}<I8yhP|IA5fm5ag{8 zBc4{2kxo*@`boW{>1pm0i&jgb?qG4{i^``@pSH9(8YHZ)%a^35ryJpt%8A~t3f=C@ zQxBxzp!pB8fjnSPXO_)<+u`o6t}YTO?Id3-Y^Nt`Xz(IK%mbv9r7&E0LR&<nys<6D z&DYJ>>sHQ#2RsA`O>wZevS?{pSy|wtnf<j1pUt(!)o*sC=nrniwUs7}qp}1`OUv#? z!dB$zhPrtz?y+Wsx3?Rt{xQO`xkS2JdXl*^J=ovBW_S$Z7(WcX9y3*LZT!q?zQzB$ z(cb6TdbCzw<Zcq|&_u)whm*&}Bv&Pe86N~*npMX6(h7(t-kpD{E>EdnwfuBB`h?Y4 zMesp(w(Y*aZ1<~(@RP&i1EOWAS-J<N2Q8bF*<&uCieE;D>rU`-m&3DDu0xpg6Z=8M z!vark>Tb-uw5@VMp-?~N61z+7Ji8j>NguD*qvu0oO1b%7ZcV#xZ@)ol%(ww=^4JbR zxOgu#ea}~CU}Qx4<8a@1cWdkF>YhLE9UeA=LgVA(q2}hL6^3J1EIrLoQ-!S!b+JXV zme))|8(cSzr`K!B^BH11xy<W1(aF4up}$T;yuH2g_`QwUdh26Z#Y?Kkt?6(`mNh4; zP*_4@y$+e*rc2_M>ptl`76gsx_s-fs&C231-&w5e&$xg83Rg0*eJgIM=Yf3=heV=_ zW&dEny4EXxCbiy?YNzJNqtDr`q5B=&pX)V3cHPf@{gkk&Y#^LzI$3)DdWkt}YnU@G zuC$nIVLLfM5Jvh3b*bb%hw~JWusV;S<%3&do+FPDgPEe{yJMxcBVX%E<przUtI`V| z41KuMT#-!-%{jGrp`xmqd`bNk;p|t{&6gcj%j+%SN4qufp1_S65y`~GZ;Pkz=SFg; zm8C+f)sxOw1pR8k9sF<_|1$KDi<`R_razUyE-LNVu>I>~OI~6$BR&0gOGifs{pIgm zGOLRdfZ0k~u!$*5phWW2O$Tj;UZ1QA+MMfq8LL|9+!{KZr`lU@e%2=MF``YGODAMV ziVYT-><JyGfVz4F3a@l$5P#i&klr`a6tFJs+!FkKWhgQ-GDqJ0*|R$n$H&LDzJ9c& za0SOtuyK*pKvb1;iZO8;9Ru18UoJVDheo`wMYs@tDn=((Pft&8erV3ujNm2ZsQ4G9 zwKX;#mECx<xVVU(Z{fj-bk|jIO%}Y8-jo!VW^v@t$<3H4F?~qppsJeM<Td77cf)jb zbvGAU4LU}fOnnv~t_UQ+AE{vH3Xa8Gy>pMn01m?=16;9#cUDI7QyY8)rY0wUG;g&r zGBdxdsrmF}X|HGCz9cn-GW3#m^sVNle0ACUouwZ5@UF9ob%X3>9kh!b>AsZ1%qx`f z$uE~5=ekR1V?|RQcUj(UYYjV4@}0KG><iz1Lzl=YRaA>PaOSiQn6{NE<t_5|>Xox0 z+QkfgXRl{qW!;*td9o7iHZz?Y9ZemOhwnUC2jEEF9@}s0JcqA{UJ**nlCUk`4_q5Z z9&COXD=}qcV1SK*Y?5k2oDPYf5?C*MZWWUe75#F{f_^`Sk*lex$y+lYz{vT+_x&z% zbBx`<yiA||5`bCq+d}KsaFzNvc#xWoMFBNqHS6#2!mGw}M8J-6e>HKmG$o&g?!_YR zGvc$X>Kd7aXi~xLmY~^JC}BvF3U(P98L62j7rM8alf!+)9C7kve{Zkr4ZPYhI$~gy zXHk!W=BMWIs&JLf9X~RUt8Na*h%w!8Xa<)Xt@Hv|1ew??-ZDQ_##B4-ufHoE$W`<? zZ&}>4aj?1KWL!v+b%%$(w|_78u>a$m=!wuNqKhC0hX{reb(=AS(Oe$_aZYUn2Op*p zSSv8+an{8b7FGX{ewnXDh}@iO1ofRBDCz41Fbhoq6*P+x$9qCKLisQ5DX7z_52ZJ$ z={)2X)WSNR|MjUej{Vp<E|0Aw@^r`GPR7omf7cOIi_p$1mdzXfd1b}z`A3K~9dWI3 zjyU<Q+DX0Ip69``eLU;4XL9?swLQqM9rVk}T9K#R_O|NmE5L~zUol|%{j#Nxs|B`2 z75Y!Kxy_dwp*7rIu`OIH6mijg?2zX`vhN6)BJUy$23wmVvX<boXlWSYm~OluZ``hn zh&b_PxfBBcSV4(G1=e9Ms#L64DKSZHl6w{hf&;|IX)j`*aJmw-5OFZqh_jZ;&Bw+; z9=Ra_0KkQTaeYz_&e7M=140{6l%MBB{^b0-lX$k34C_f0ZfyI;+0r-C!+92O^F{9V zi7txv=`VFB-!Rt=*X>?nTBps0X+%U&*W5gOFjHRcF>T#y_q?h9gV4|NW+!jG96Mc$ z8)NzBU+|`Lu&zBXK2_J@<K@=n(2w}|`Znz3k$Mm<6SuaFZY%D~aPU}_Lw$*PeoAN! zfIv7)GWq~@BLCAsdkJ2hyucP3NCWTqME4|wT_@Z2-b05n*^8oYX+^l$0K!12(8Fzg zUi}|?!|GdQ$v}^R+4OstZ9o=}n#!*k_m}Gl9SAqsa40Zzznc5-L7%bryW8{(=gekU z*(@RO2m1}=LR;%N)cp%!5Kf+2juHhG@p3=g`)nDPlzU%iULZ49L7wO6>9==w(gm_R ztmenAF-I%jdlDJZvXF5QmEhgVr{t@heL*dK1}yk8Y+JsX8O0lQTbJax6TzRNCSH8= z7v!$RmjnG5y^qdKXa;Zpp;K8|l~cIMITZfdi!v&M?NcepLIL^i&c`bkUXi^@qVolw zY6}mn%jipZ56jCSs3E1{o!F@Ez%}~`%;-CfMMs*`3;AV~B^4baavJ#6G^3u4Ys;-U zg$7}%q%;z|C*_maJ87!J*eM&vOHqYJhFV?2&l>Aca0e95iTWr++dkyk^j^o?r<cz^ z27+Y37E*J#x_Bx4M4Dtm!_&J$M}QfA^VP6}RU<%DR!)u`b+66-;>VA-!WpZCCl@o^ zjx^I91~`*_dD-OsbgCqCJ*TRjDs-VE!%wqkHXHeRQ|n)Q1sBCjU8uUTv1Y5Z_|_ZT z(^6|8^r8GV(0H~7yLQ|kB^na&9g7QE@?X5Y66S$KBJ&Bq8n2>u)~Cj+kx0X5jw11x z>E2INtP}6@atD+b!r8gFJnctn7ygJ;%cJHlI})Zo7sgg5LnF0)Jo?1og4<xemf-M+ zUW{e5BaG|WRq=+r`yL)1ca59|nsW1lz;sNg)8%t|b)9jn*Wt^M%TgTg`vSDL`4zn{ zeivF};Zv<F*CV-XMYcM;L;}pe441dTP(oKFotp0T=dku<l&n2BC`mzIP#Acr;W^CD z)|`OV2>WqogPl56P|GYQYT0!QPq{#&Eh8f%36N|K-7nv3xHuGl$np7Ra9%AmL9fIl zA5^OYL+N1jybmG}_VwsTdaA+5t@&2hE|afgA^B{z<wi7bDU#||1|jS_J39s6-`9Ei z<WQG`IL_+@ekAEcMxT~{2#p9}xUz7CW7g2qERJ!HTPw1qAwd=zOEvmtFf$_qYC>AO z%OOGk$443W#OlgQ$)@L_+iJ417K@{H=Tl6$yW}A$Jbl&@ZdS0Hi)$;f5{|9m<oqs> zY(|c1R~~+}uC^ecyCw3cT9W~P`8hj>A$!?U>)A<}S-Ku-inK|ADmbx6&J)V$b=^ao zQ#dtF#lXu;%xAgysyHi;ifjMnIfIHL<JqU}vxjs~kdOAK%xmjvA862m%n5Id?ATx{ z9%6OZ8bOvtj6b69sRyiG7Q3f+<79u`;B9NxNxcNMu|H0#lRmMBMH=FK`ZX>eCZJgq zqk5fZV`GCd0#7*DbfS^^BWCqr^o95jmLJ5y{c~RNyMpDNPoO)TwSmgY%D(hVP&2bD zQzD97VLR~d<bA<!L`fU(p*82gj*bka>RG=-l55R52_fQeOwyHWj-Nr4mZGeez*e2D zDc;LPWm);zsmMF|nwfjRntsmY1RusJO6s32O(DW^%+XmYEXi%$mw5R@C8VpL+G(`< zPL~yW+7flH)4ln!9dOC)z~!nJy(1R3`$b+8UJX2_z+*9K-`{?^JCFm0TQLzMTNU}* zzBmzajsxK)CZ@fzY<QR(b~sa1U*D+vh4-z`%ir8*yC!>k?d+|dW~o>i21<>+dsqA7 z-o3-wb6u!$q_3Of$h&vLZ|0vhW)>HVY>SjiH=Ua)yZS?2O_hcFn_#ULcVQBra>{g6 z=Grz(&bRSrmiiH0Wo)Z3Pu%_I`$u(O;%AFvd=hOoX^&~sHW((*(3nGMeLDYb1&fph zK4qla*2jWlX#*k^!${T?xBy*9<W2a_67!&AaL&X|!L}H7lzm|Ep@r?CpD5*Y#8&G; z{5kJgC!(aqaJsO8ZlRT@f&l86b(i|kkAPBc_0CA2XRI#66r?iuD<8V}3=*7}B?i{} zr+T3~CWSJZnrrWyOYbt3X+AIaS{f~>3*y?#dz{<0oe0p=Z|&a_`yG!41}lnRZjj|< zGlX{DuRP>@4j&XQG<at@wzqet?PAHhy1vBzsXewLNIO6ov%nuNd3n!$y4HH2_ydL4 zTz{6tTSG5qfEm?;%#^RbzPu6b{u_ntg|4M6GRJ}G^MVa!&9n_VFw%!o^=nQ3ncdHe z8y@<b<MI~|&%Z1v0KSRu^I492tN_u|OVdo3$gH9-d0!h)0dSFdQCCm>4U5CJGdhZE zRUJObT5ApNa)FrS$t4_`sZrnf`H3*zZiU5SK@Ez&)8~bXa`yJ{a)1!At*wQ#cB<}9 zYqro3{g97Em_8L}&!TO!ckF+#+%q8FxN(DNp6m#Hrm7QCpF*D%ytXhLN=PQ>E78%N znD(FD{Prw!d6J`}qv^{4Unxn+7XPJKdU;Gu(nA#%!h&ERaMjDNw<g*}^04FWgnp)8 z+4WKuf<qh4vZ|ko*r8W%8|kM;=#Su^N9RSmSWMj9K<K!z+aBX@hij9QnKkLwr>;(C z%*n0v2og*pR!N29JYT-#6H20_caUjmdB299r(_5C&elq4wSVk9Czv7KaTMCJKK8!C z*wL4N?^oblRi3D-pJMNQyf0;O5N4t_(^K@z$}o-38!)yOH(7NvOnmL#L)h7JUnVQR ziY&Z4DPVn4DCHdcl{|8oUcR}s6utL5@^gxGY2-<0FsudaUsSgzN3H9mLTcTGS17)I zoWH-gm{_nwl+DK4CSw!fAoBG%g@LE&4o|fK9V^p)*}D$UG*hL+X%iHytSiWw?j6$| zj><!R?tbn7A@A?8f|i!B1*QiTl3f%oE(_#@<V}>HcT42RV-1ITG+>d6imHoCE0^oB zk&#jVz<@)Y2Xi!ZqjC|6uy4X6p-?C}ANd^Sj&UZHYqV5MtwgA0pBA^b3tpr;WG_8f zhTGNL{&sq=NYW;kyQ0miJ?LQm4K*F%WPgwEREuIUKKE8yTG}mFSF+DyO-jl0nr{i| zjAf?Qe&zeVNbx{U_O+F$X)d08;Bfy+#8(NFRD$KLOPUm8H%aC2dr=(`%|9Ni1-=`b z&Fso|pDKC<@Vl`?JTnn0v96Si%zeoCO7C$ZjWeldHlANSXp@PNQP}eBh1S+qHU*9% ze-o1=^x4qsxw&g<YP`T)^`Pn*(Ftz$?c{~7o}M#N8YzZ?aD{JTXO(<*v+YZ_Fc><= z90$95*;$mI$p?3a35L&7VZbO%qJVWdJMGbgt&0u^eY8QU0LMzK-m+-eO`W)4zrGBS zCkCk=b~~KfJU<Jm<0V}wm_i)(HqUMe(K7MK(HO<Kk4k_o_^CerB75RE0X+!BTiv54 z<&u92IlyS43|#&6Nyln=ZEdYTF>UK@BA4K`;DQ6sqq<Z3@qsf2Sql4`i?Jt+pX`61 Oj2h~j=~e6AiuxbG5HmXf literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_cc_by_sa.png b/apps/cm/public/images/img_cc_by_sa.png new file mode 100644 index 0000000000000000000000000000000000000000..6d94e60b95e85e138856f8d4569666240d611b61 GIT binary patch literal 5668 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 Ow^dWtR4RRB5%OP9)_QaR literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_opentype01.png b/apps/cm/public/images/img_opentype01.png new file mode 100644 index 0000000000000000000000000000000000000000..456c7c6bb211a83deb3ca26e155020c6a1ac1c53 GIT binary patch literal 3246 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 NfwytQmZFcG{2yPxrMmzC literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_opentype02.png b/apps/cm/public/images/img_opentype02.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c5bfb3229e319b6d8e4a61982061f7aecc7145 GIT binary patch literal 3628 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 literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_opentype03.png b/apps/cm/public/images/img_opentype03.png new file mode 100644 index 0000000000000000000000000000000000000000..970a6a0d4d00afc6dbf01a8916ad7accd449ac96 GIT binary patch literal 3605 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 MMwYmHhNq+c58HlKYXATM literal 0 HcmV?d00001 diff --git a/apps/cm/public/images/img_opentype04.png b/apps/cm/public/images/img_opentype04.png new file mode 100644 index 0000000000000000000000000000000000000000..41d284cabcdccc032c0fee538260079c4d75d374 GIT binary patch literal 4117 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 E0FhT$uK)l5 literal 0 HcmV?d00001 diff --git a/apps/cm/src/app/index.tsx b/apps/cm/src/app/index.tsx new file mode 100644 index 000000000..692b55ef0 --- /dev/null +++ b/apps/cm/src/app/index.tsx @@ -0,0 +1,20 @@ +import "./styles/base.css"; +import "./styles/components.css"; +import "@fontsource-variable/noto-sans-kr"; + +import { AppProvider } from "./providers"; +import { cookies } from "next/headers"; + +const App = async ({ children }: Readonly<{ children: React.ReactNode }>) => { + const theme = (await cookies()).get("site-theme-key"); + + return ( + <html lang="ko" data-theme={theme?.value}> + <body> + <AppProvider>{children}</AppProvider> + </body> + </html> + ); +}; + +export { App }; diff --git a/apps/cm/src/app/providers/app-provider.tsx b/apps/cm/src/app/providers/app-provider.tsx new file mode 100644 index 000000000..efd1f308e --- /dev/null +++ b/apps/cm/src/app/providers/app-provider.tsx @@ -0,0 +1,49 @@ +"use client"; + +import { DndProvider } from "react-dnd"; +import { MultiBackend, getBackendOptions } from "@minoru/react-dnd-treeview"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; +import { ConfirmProvider } from "@frontend-opensource/use-react-hooks"; +import { AuthWrapper } from "@/entities/auth"; +import { MenuWrapper } from "@/entities/menu"; +import { Toaster } from "@/shared/ui/sonner"; +import { AlertDialog } from "@/shared/ui/alert-dialog"; +import { PromptDialog } from "@/shared/ui/prompt-dialog"; +import { ConfirmDialog } from "@/shared/ui/confirm-dialog"; +import { SelectPromptDialog } from "@/shared/ui/select-prompt-dialog"; +import { PromptProvider, StoreProvider } from "@/shared/providers"; + +const AppProvider = ({ children }: Readonly<{ children: React.ReactNode }>) => { + const queryClient = new QueryClient(); + return ( + <QueryClientProvider client={queryClient}> + <StoreProvider> + <PromptProvider> + <ConfirmProvider> + <AuthWrapper> + <MenuWrapper> + <DndProvider + backend={MultiBackend} + options={getBackendOptions()} + > + {children} + </DndProvider> + </MenuWrapper> + <AlertDialog /> + <PromptDialog /> + <ConfirmDialog /> + <SelectPromptDialog /> + <Toaster position="top-center" /> + </AuthWrapper> + </ConfirmProvider> + </PromptProvider> + </StoreProvider> + <div className="text-2xl"> + <ReactQueryDevtools initialIsOpen={false} /> + </div> + </QueryClientProvider> + ); +}; + +export { AppProvider }; diff --git a/apps/cm/src/app/providers/index.ts b/apps/cm/src/app/providers/index.ts new file mode 100644 index 000000000..15f99b7fd --- /dev/null +++ b/apps/cm/src/app/providers/index.ts @@ -0,0 +1 @@ +export { AppProvider } from "./app-provider"; diff --git a/apps/cm/src/app/styles/base.css b/apps/cm/src/app/styles/base.css new file mode 100644 index 000000000..7a5263bc4 --- /dev/null +++ b/apps/cm/src/app/styles/base.css @@ -0,0 +1,21 @@ +@import "@common/assets/styles/base.css"; +@import "@common/assets/styles/diveicon.css"; +@import "@common/components/index.css"; + +@tailwind base; +@tailwind utilities; + +@layer base { + :root { + --secondary-background: rgba(0, 0, 0, 0.04); + } + [data-theme="black"] { + --secondary-background: rgba(255, 255, 255, 0.09); + } + + html, + body { + font-family: "Noto Sans KR", sans-serif; + font-size: 10px; + } +} diff --git a/apps/cm/src/app/styles/components.css b/apps/cm/src/app/styles/components.css new file mode 100644 index 000000000..5b9742c0f --- /dev/null +++ b/apps/cm/src/app/styles/components.css @@ -0,0 +1,129 @@ +.card { + position: relative; + margin: 0.6rem; + box-sizing: border-box; + min-height: 2rem; + border-radius: 0.5rem; + padding: 0.6rem; + font-size: 1.3rem; + color: #666; +} + +.card_width10 { + width: calc(10% - 12px); +} + +.card_width20 { + width: calc(20% - 12px); +} + +.card_width25 { + width: calc(25% - 12px); +} + +.card_width30 { + width: calc(30% - 12px); +} + +.card_width33 { + width: calc(33.333% - 12px); +} + +.card_width40 { + width: calc(40% - 12px); +} + +.card_width45 { + width: calc(45% - 12px); +} + +.card_width50 { + width: calc(50% - 12px); +} + +.card_width60 { + width: calc(60% - 12px); +} + +.card_width66 { + width: calc(66.666% - 12px); +} + +.card_width70 { + width: calc(70% - 12px); +} + +.card_width75 { + width: calc(75% - 12px); +} + +.card_width80 { + width: calc(80% - 12px); +} + +.card_width90 { + width: calc(90% - 12px); +} + +.card_width100 { + width: calc(100% - 12px); +} + +.card_nopadding { + padding: 0 !important; +} + +.card_nomargin { + width: 100%; + margin: 0 !important; + padding: 0 !important; +} + +.topline { + border-top: 1px solid #ccc; +} + +.bottomline { + border-bottom: 1px solid #e6eef3; + background: #fff; +} + +.card-border { + border: 1px solid #dbe2e6; + background-color: rgba(255, 255, 255, 0.6); + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); +} + +.card-header { + margin-top: -0.6rem; + margin-left: -0.6rem; + margin-right: -0.6rem; + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid #e1e7eb; + padding: 1rem; +} + +.card-footer { + margin-left: -0.6rem; + margin-right: -0.6rem; + margin-top: 0.5rem; + display: flex; + align-items: center; + justify-content: center; + border-top: 1px solid #e1e7eb; + padding-top: 1rem; + padding-bottom: 1rem; +} + +/* 블랙 테마 */ +[data-theme="black"] { + .card-border { + background-color: rgba(255, 255, 255, 0.065); + border-color: #38383a; + } + .card-header { + border-bottom-color: #3f4042; + } +} diff --git a/apps/cm/src/entities/auth/api/login-service.ts b/apps/cm/src/entities/auth/api/login-service.ts new file mode 100644 index 000000000..c1968fe36 --- /dev/null +++ b/apps/cm/src/entities/auth/api/login-service.ts @@ -0,0 +1,85 @@ +import { AxiosError } from "axios"; +import { + ENDPOINT, + JWT_EXPIRATION_TIME, + ACCESS_TOKEN, + AUTH_USER_ID, + CLAIM_NAME, +} from "@/shared/config"; +import type { LoginService, ILogin } from "../model/login-interface"; +import { tokenManager } from "../lib/token-manager"; + +export class LoginApiService implements LoginService { + private static instance: LoginApiService; + + private constructor() {} + + public static getInstance(): LoginApiService { + if (!LoginApiService.instance) { + LoginApiService.instance = new LoginApiService(); + } + return LoginApiService.instance; + } + + public async login(payload: ILogin): Promise<void> { + try { + const response = await fetch(`/api/proxy${ENDPOINT.USER_SERVICE.LOGIN}`, { + method: "POST", + body: JSON.stringify({ + userId: payload.userId, + password: payload.password, + }), + }); + + const data = await response.json(); + const accessToken = data[ACCESS_TOKEN]; + const tokenId = data[AUTH_USER_ID]; + + if (!accessToken || !tokenId) { + throw new Error("Missing required authentication tokens"); + } + + tokenManager.setToken(CLAIM_NAME, accessToken); + tokenManager.setToken(AUTH_USER_ID, tokenId); + tokenManager.setupRefreshTimer( + () => this.silentRefresh(), + JWT_EXPIRATION_TIME, + ); + } catch (error) { + if (error instanceof AxiosError) { + throw new Error(`Login failed: ${error.response?.data?.message}`); + } + throw new Error(`Login failed: ${error}`); + } + } + + public async silentRefresh(): Promise<void> { + try { + const response = await fetch( + `/api/proxy${ENDPOINT.USER_SERVICE.SILENT_REFRESH}`, + { method: "PUT" }, + ); + + const data = await response.json(); + const accessToken = data[ACCESS_TOKEN]; + const tokenId = data[AUTH_USER_ID]; + + if (!accessToken || !tokenId) { + throw new Error("Missing required authentication tokens"); + } + + tokenManager.setToken(CLAIM_NAME, accessToken); + tokenManager.setToken(AUTH_USER_ID, tokenId); + } catch (error) { + tokenManager.clearAuthToken(); + if (error instanceof AxiosError) { + throw new Error( + `Silent refresh failed: ${error.response?.data?.message}`, + ); + } + throw new Error(`Silent refresh failed: ${error}`); + } + } +} + +export const LoginApi = LoginApiService.getInstance(); diff --git a/apps/cm/src/entities/auth/index.ts b/apps/cm/src/entities/auth/index.ts new file mode 100644 index 000000000..97e142225 --- /dev/null +++ b/apps/cm/src/entities/auth/index.ts @@ -0,0 +1,2 @@ +export { LoginApi } from "./api/login-service"; +export { AuthWrapper } from "./lib/auth-wrapper"; diff --git a/apps/cm/src/entities/auth/lib/auth-wrapper.tsx b/apps/cm/src/entities/auth/lib/auth-wrapper.tsx new file mode 100644 index 000000000..c0be4c2dd --- /dev/null +++ b/apps/cm/src/entities/auth/lib/auth-wrapper.tsx @@ -0,0 +1,49 @@ +"use client"; + +import { useEffect } from "react"; +import { useRouter } from "next/navigation"; +import { client } from "@/shared/api"; +import type { IUserInfo } from "@/shared/store"; +import { getCookie, useUserStore } from "@/shared/lib"; +import { ENDPOINT, AUTH_USER_ID } from "@/shared/config"; +import { LoginApi } from "../api/login-service"; + +const AuthWrapper = ({ children }: { children: React.ReactNode }) => { + const router = useRouter(); + const { userInfo, setUserInfo } = useUserStore((state) => state); + + async function authCheck() { + const userId = getCookie(AUTH_USER_ID); + if (!userId) { + throw new Error("Missing required authentication tokens"); + } + + const response = await client.get<IUserInfo>( + `${ENDPOINT.USER_SERVICE.USERS}/info/me`, + ); + if (!userInfo) setUserInfo(response.data); + } + + useEffect(() => { + (async () => { + try { + await authCheck(); + } catch (error) { + console.error(error); + + try { + await LoginApi.silentRefresh(); + await authCheck(); + } catch (refreshError) { + console.error("Token refresh failed:", refreshError); + setUserInfo(null); + router.push("/auth/login"); + } + } + })(); + }, []); + + return <>{children}</>; +}; + +export { AuthWrapper }; diff --git a/apps/cm/src/entities/auth/lib/token-manager.ts b/apps/cm/src/entities/auth/lib/token-manager.ts new file mode 100644 index 000000000..0e761486a --- /dev/null +++ b/apps/cm/src/entities/auth/lib/token-manager.ts @@ -0,0 +1,59 @@ +import { AUTH_USER_ID, CLAIM_NAME } from "@/shared/config"; +import { getCookie, setCookie, removeCookie } from "@/shared/lib"; + +export class TokenManager { + private static instance: TokenManager; + private refreshTimer: NodeJS.Timeout | null = null; + + private constructor() {} + + public static getInstance(): TokenManager { + if (!TokenManager.instance) { + TokenManager.instance = new TokenManager(); + } + return TokenManager.instance; + } + + public getToken(key: string): string | undefined { + return getCookie(key); + } + + public setToken(key: string, value: string): void { + setCookie(key, value, { + secure: window.location.protocol === "https:", + sameSite: "lax", + }); + } + + public removeToken(key: string): void { + removeCookie(key); + } + + public setupRefreshTimer( + callback: () => Promise<void>, + expirationTime: number, + ): void { + if (this.refreshTimer) { + clearTimeout(this.refreshTimer); + } + + this.refreshTimer = setTimeout(() => { + callback().catch((error) => { + console.error("Silent refresh failed:", error); + this.clearAuthToken(); + }); + }, expirationTime - 60000); + } + + public clearAuthToken(): void { + if (this.refreshTimer) { + clearTimeout(this.refreshTimer); + this.refreshTimer = null; + } + + this.removeToken(CLAIM_NAME); + this.removeToken(AUTH_USER_ID); + } +} + +export const tokenManager = TokenManager.getInstance(); diff --git a/apps/cm/src/entities/auth/model/login-interface.ts b/apps/cm/src/entities/auth/model/login-interface.ts new file mode 100644 index 000000000..5aaf53044 --- /dev/null +++ b/apps/cm/src/entities/auth/model/login-interface.ts @@ -0,0 +1,9 @@ +export interface ILogin { + userId: string; + password: string; +} + +export interface LoginService { + login(payload: ILogin): Promise<void>; + silentRefresh(): Promise<void>; +} diff --git a/apps/cm/src/entities/menu-authority/@x/menu.ts b/apps/cm/src/entities/menu-authority/@x/menu.ts new file mode 100644 index 000000000..86479f859 --- /dev/null +++ b/apps/cm/src/entities/menu-authority/@x/menu.ts @@ -0,0 +1 @@ +export { MenuAuthorityApi } from "../api/menu-authority-service"; diff --git a/apps/cm/src/entities/menu-authority/@x/posting.ts b/apps/cm/src/entities/menu-authority/@x/posting.ts new file mode 100644 index 000000000..bfe84fa0d --- /dev/null +++ b/apps/cm/src/entities/menu-authority/@x/posting.ts @@ -0,0 +1 @@ +export { AuthorityButton } from "../ui/authority-button"; diff --git a/apps/cm/src/entities/menu-authority/api/menu-authority-service.ts b/apps/cm/src/entities/menu-authority/api/menu-authority-service.ts new file mode 100644 index 000000000..ec07d88ad --- /dev/null +++ b/apps/cm/src/entities/menu-authority/api/menu-authority-service.ts @@ -0,0 +1,50 @@ +import { client } from "@/shared/api"; +import { ENDPOINT } from "@/shared/config"; +import type { + MenuAuthorityList, + MenuAuthorityParams, + MenuAuthorityPayload, + MenuAuthorityService, + PageMenuAuthority, +} from "../model/menu-authority-interface"; + +export class MenuAuthorityApiService implements MenuAuthorityService { + public async getMenuAuthorityList( + params: MenuAuthorityParams, + ): Promise<MenuAuthorityList> { + const response = await client.get<MenuAuthorityList>( + `${ENDPOINT.CMS_SERVICE.MENU_AUTHRTS}`, + { params }, + ); + return response.data; + } + + public async getPageMenuAuthority( + menuCd: number, + ): Promise<PageMenuAuthority[]> { + const response = await client.get<PageMenuAuthority[]>( + `${ENDPOINT.CMS_SERVICE.MENU_AUTHRTS}/pageinfo/${menuCd}`, + ); + return response.data; + } + + public async saveMenuAuthority(data: MenuAuthorityPayload[]): Promise<void> { + const response = await client.post<void>( + `${ENDPOINT.CMS_SERVICE.MENU_AUTHRTS}`, + data, + ); + return response.data; + } + + public async getGroupMenuAuthorityList( + params: MenuAuthorityParams, + ): Promise<MenuAuthorityList> { + const response = await client.get<MenuAuthorityList>( + `${ENDPOINT.CMS_SERVICE.MENU_AUTHRTS}/group`, + { params }, + ); + return response.data; + } +} + +export const MenuAuthorityApi = new MenuAuthorityApiService(); diff --git a/apps/cm/src/entities/menu-authority/index.ts b/apps/cm/src/entities/menu-authority/index.ts new file mode 100644 index 000000000..5a1b11606 --- /dev/null +++ b/apps/cm/src/entities/menu-authority/index.ts @@ -0,0 +1,9 @@ +export { MenuAuthorityApi } from "./api/menu-authority-service"; +export { + menuAuthorityFormSchema, + type MenuAuthority, + type MenuAuthorityPayload, + type MenuAuthorityFormData, +} from "./model/menu-authority-interface"; +export { AuthorityButton } from "./ui/authority-button"; +export { ManagementAuthorityDialog } from "./ui/management-authority-dialog"; diff --git a/apps/cm/src/entities/menu-authority/model/menu-authority-interface.ts b/apps/cm/src/entities/menu-authority/model/menu-authority-interface.ts new file mode 100644 index 000000000..7f5401872 --- /dev/null +++ b/apps/cm/src/entities/menu-authority/model/menu-authority-interface.ts @@ -0,0 +1,51 @@ +import { z } from "zod"; +import type { PageableList, PageableParams } from "@/shared/model"; + +export interface MenuAuthorityParams extends PageableParams { + groupId?: string; + menuCd?: number; + useYn?: string; +} + +export interface PageMenuAuthority { + mngAuthrtYn: string; + inqAuthrtYn: string; + regAuthrtYn: string; + mdfcnAuthrtYn: string; + delAuthrtYn: string; +} + +export const menuAuthoritySchema = z.object({ + groupId: z.string(), + groupNm: z.string(), + menuCd: z.number(), + mngAuthrtYn: z.string(), + inqAuthrtYn: z.string(), + regAuthrtYn: z.string(), + mdfcnAuthrtYn: z.string(), + delAuthrtYn: z.string(), + useYn: z.string(), + mode: z.string(), +}); + +export const menuAuthorityPayloadSchema = menuAuthoritySchema.omit({ + groupNm: true, +}); + +export const menuAuthorityFormSchema = z.object({ + menuAuthority: z.array(menuAuthorityPayloadSchema), +}); + +export type MenuAuthority = z.infer<typeof menuAuthoritySchema>; +export type MenuAuthorityList = PageableList<MenuAuthority>; +export type MenuAuthorityPayload = z.infer<typeof menuAuthorityPayloadSchema>; +export type MenuAuthorityFormData = z.infer<typeof menuAuthorityFormSchema>; + +export interface MenuAuthorityService { + getMenuAuthorityList(params: MenuAuthorityParams): Promise<MenuAuthorityList>; + getGroupMenuAuthorityList( + params: MenuAuthorityParams, + ): Promise<MenuAuthorityList>; + getPageMenuAuthority(menuCd: number): Promise<PageMenuAuthority[]>; + saveMenuAuthority(data: MenuAuthorityPayload[]): Promise<void>; +} diff --git a/apps/cm/src/entities/menu-authority/model/menu-authority-table-columns.tsx b/apps/cm/src/entities/menu-authority/model/menu-authority-table-columns.tsx new file mode 100644 index 000000000..6969a85e9 --- /dev/null +++ b/apps/cm/src/entities/menu-authority/model/menu-authority-table-columns.tsx @@ -0,0 +1,117 @@ +import type { ColumnDef } from "@tanstack/react-table"; +import type { UseFormReturn } from "react-hook-form"; +import { Checkbox } from "@common/components"; +import type { + MenuAuthority, + MenuAuthorityFormData, + MenuAuthorityPayload, +} from "./menu-authority-interface"; + +export const createColumns = ( + form: UseFormReturn<MenuAuthorityFormData>, +): ColumnDef<MenuAuthority>[] => { + const getCurrentRow = (i: number) => form.watch("menuAuthority")[i]; + + const handleCheckedChange = + (i: number, key: keyof MenuAuthorityPayload) => (checked: boolean) => { + if (getCurrentRow(i)?.mode === "R") { + form.setValue(`menuAuthority.${i}.mode`, "U"); + } + form.setValue(`menuAuthority.${i}.${key}`, checked ? "Y" : "N"); + }; + + return [ + { + accessorKey: "groupNm", + header: "그룹명", + }, + { + accessorKey: "mngAuthrtYn", + header: "관리권한", + cell: ({ row }) => { + return ( + <Checkbox + checked={getCurrentRow(row.index)?.mngAuthrtYn === "Y"} + onCheckedChange={(checked) => { + if (checked) { + handleCheckedChange( + row.index, + "regAuthrtYn", + )(checked as boolean); + handleCheckedChange( + row.index, + "mdfcnAuthrtYn", + )(checked as boolean); + handleCheckedChange( + row.index, + "delAuthrtYn", + )(checked as boolean); + handleCheckedChange( + row.index, + "inqAuthrtYn", + )(checked as boolean); + } + handleCheckedChange(row.index, "mngAuthrtYn")(checked as boolean); + }} + /> + ); + }, + }, + { + accessorKey: "regAuthrtYn", + header: "등록권한", + cell: ({ row }) => { + return ( + <Checkbox + checked={getCurrentRow(row.index)?.regAuthrtYn === "Y"} + onCheckedChange={(checked) => { + if (checked) { + handleCheckedChange( + row.index, + "inqAuthrtYn", + )(checked as boolean); + } + handleCheckedChange(row.index, "regAuthrtYn")(checked as boolean); + }} + /> + ); + }, + }, + { + accessorKey: "mdfcnAuthrtYn", + header: "수정권한 ", + cell: ({ row }) => { + return ( + <Checkbox + checked={getCurrentRow(row.index)?.mdfcnAuthrtYn === "Y"} + onCheckedChange={handleCheckedChange(row.index, "mdfcnAuthrtYn")} + /> + ); + }, + }, + { + accessorKey: "delAuthrtYn", + header: "삭제권한", + cell: ({ row }) => { + return ( + <Checkbox + checked={getCurrentRow(row.index)?.delAuthrtYn === "Y"} + onCheckedChange={handleCheckedChange(row.index, "delAuthrtYn")} + /> + ); + }, + }, + { + accessorKey: "inqAuthrtYn", + header: "조회권한", + cell: ({ row }) => { + return ( + <Checkbox + checked={getCurrentRow(row.index)?.inqAuthrtYn === "Y"} + onCheckedChange={handleCheckedChange(row.index, "inqAuthrtYn")} + /> + ); + }, + }, + ]; +}; diff --git a/apps/cm/src/entities/menu-authority/ui/authority-button.tsx b/apps/cm/src/entities/menu-authority/ui/authority-button.tsx new file mode 100644 index 000000000..257ab6e5d --- /dev/null +++ b/apps/cm/src/entities/menu-authority/ui/authority-button.tsx @@ -0,0 +1,26 @@ +import { useMenuStore } from "@/shared/lib"; +import { Button, cn, type ButtonProps } from "@common/components"; +import type { PageMenuAuthority } from "../model/menu-authority-interface"; + +type AuthorityButtonProps = { + authority: keyof PageMenuAuthority; +} & ButtonProps; + +function AuthorityButton({ + authority, + className, + children, + ...props +}: AuthorityButtonProps) { + const pageMenuAuthority = useMenuStore((state) => state.pageMenuAuthority); + + const isAuthority = pageMenuAuthority?.[authority] === "Y"; + + return ( + <Button className={cn(className, !isAuthority && "hidden")} {...props}> + {children} + </Button> + ); +} + +export { AuthorityButton }; diff --git a/apps/cm/src/entities/menu-authority/ui/management-authority-dialog.tsx b/apps/cm/src/entities/menu-authority/ui/management-authority-dialog.tsx new file mode 100644 index 000000000..2d4f6a176 --- /dev/null +++ b/apps/cm/src/entities/menu-authority/ui/management-authority-dialog.tsx @@ -0,0 +1,101 @@ +import { useState } from "react"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useQuery } from "@tanstack/react-query"; +import { getCoreRowModel } from "@tanstack/react-table"; +import { useConfirm } from "@frontend-opensource/use-react-hooks"; +import { + Button, + Dialog, + DialogClose, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@common/components"; +import { ENDPOINT } from "@/shared/config"; +import { useAlertStore, useDataTable, useMutationWrapper } from "@/shared/lib"; +import { + menuAuthorityFormSchema, + type MenuAuthorityFormData, + type MenuAuthorityPayload, +} from "../model/menu-authority-interface"; +import { createColumns } from "../model/menu-authority-table-columns"; +import { MenuAuthorityApi } from "../api/menu-authority-service"; + +type ManagementAuthorityDialogProps = { + menuCd?: number; +} & React.ComponentProps<typeof Dialog>; + +function ManagementAuthorityDialog({ menuCd }: ManagementAuthorityDialogProps) { + const { confirm } = useConfirm(); + const alert = useAlertStore((state) => state.setMessage); + const [open, setOpen] = useState(false); + + const query = useQuery({ + queryKey: [ENDPOINT.CMS_SERVICE.MENU_AUTHRTS, menuCd], + queryFn: () => MenuAuthorityApi.getMenuAuthorityList({ menuCd }), + enabled: !!menuCd, + }); + + const { mutateAsync: saveMenuAuthority } = useMutationWrapper({ + mutationFn: (data: MenuAuthorityPayload[]) => + MenuAuthorityApi.saveMenuAuthority(data), + onSuccess: () => { + alert("저장되었습니다.", () => setOpen(false)); + }, + }); + + const form = useForm<MenuAuthorityFormData>({ + resolver: zodResolver(menuAuthorityFormSchema), + values: { + menuAuthority: query.data?.content ?? [], + }, + }); + + const { tableComponent } = useDataTable({ + query, + tableOptions: { + columns: createColumns(form), + getCoreRowModel: getCoreRowModel(), + }, + }); + + const handleSave = async () => { + if (await confirm("저장하시겠습니까?")) { + const data = form.getValues("menuAuthority"); + const filteredData = data.filter((item) => item.mode !== "R"); + await saveMenuAuthority(filteredData); + } + }; + + return ( + <Dialog open={open} onOpenChange={setOpen}> + <DialogTrigger asChild> + <Button className="gap-3" disabled={!menuCd}> + <i className="diveicon di-key" /> + 권한관리 + </Button> + </DialogTrigger> + <DialogContent className="max-w-[60rem]" aria-describedby={undefined}> + <DialogHeader> + <DialogTitle>그룹별 메뉴 권한</DialogTitle> + </DialogHeader> + <div className="max-h-[40rem] overflow-auto">{tableComponent}</div> + <DialogFooter className="!justify-center"> + <Button size="lg" onClick={handleSave}> + 저장 + </Button> + <DialogClose asChild> + <Button size="lg" color="white"> + 취소 + </Button> + </DialogClose> + </DialogFooter> + </DialogContent> + </Dialog> + ); +} + +export { ManagementAuthorityDialog }; diff --git a/apps/cm/src/entities/menu/api/menu-service.ts b/apps/cm/src/entities/menu/api/menu-service.ts new file mode 100644 index 000000000..07e9e552a --- /dev/null +++ b/apps/cm/src/entities/menu/api/menu-service.ts @@ -0,0 +1,79 @@ +import { client } from "@/shared/api"; +import { ENDPOINT } from "@/shared/config"; +import type { + MenuService, + Menu, + MenuItem, + MenuFormData, + MenuTemporarilyStoredData, + SiteMapFormData, +} from "../model/menu-interface"; + +export class MenuApiService implements MenuService { + async getMenuRoles(siteId: string): Promise<MenuItem[]> { + const response = await client.get<MenuItem[]>( + `${ENDPOINT.CMS_SERVICE.MENU_ROLES}/${siteId}`, + ); + return response.data; + } + + public async getMenuInfo(menuCd: number): Promise<Menu> { + const response = await client.get<Menu>( + `${ENDPOINT.CMS_SERVICE.MENUS}/${menuCd}`, + ); + return response.data; + } + + public async createMenu(data: MenuFormData): Promise<void> { + const response = await client.post<void>( + `${ENDPOINT.CMS_SERVICE.MENUS}`, + data, + ); + return response.data; + } + + public async updateMenu( + menuCd: number, + data: Omit<MenuFormData, "siteId">, + ): Promise<void> { + const response = await client.put<void>( + `${ENDPOINT.CMS_SERVICE.MENUS}/${menuCd}`, + data, + ); + return response.data; + } + + public async deleteMenu(menuCd: number): Promise<void> { + await client.delete(`${ENDPOINT.CMS_SERVICE.MENUS}/${menuCd}`); + } + + public async menuTemporaryStorage( + menuCd: number, + data: MenuFormData, + ): Promise<void> { + const response = await client.post<void>( + `${ENDPOINT.CMS_SERVICE.MENU_TEMPORARY_STORAGE}/${menuCd}`, + data, + ); + return response.data; + } + + public async getMenuTemporarilyStoredData( + menuCd: number, + ): Promise<MenuTemporarilyStoredData[]> { + const response = await client.get<MenuTemporarilyStoredData[]>( + `${ENDPOINT.CMS_SERVICE.MENU_TEMPORARY_STORAGE}/menu/${menuCd}/user`, + ); + return response.data; + } + + public async publishSiteMap(data: SiteMapFormData["siteMap"]): Promise<void> { + const response = await client.post<void>( + `${ENDPOINT.CMS_SERVICE.MENUS}/sitemap/publish`, + data, + ); + return response.data; + } +} + +export const MenuApi = new MenuApiService(); diff --git a/apps/cm/src/entities/menu/index.ts b/apps/cm/src/entities/menu/index.ts new file mode 100644 index 000000000..e4c61dbb7 --- /dev/null +++ b/apps/cm/src/entities/menu/index.ts @@ -0,0 +1,12 @@ +export { MenuApi } from "./api/menu-service"; +export { + MENU_TYPE, + menuFormSchema, + siteMapFormSchema, + type MenuType, + type MenuItem, + type MenuFormData, + type SiteMapFormData, + type SiteMapPayloadData, +} from "./model/menu-interface"; +export { MenuWrapper } from "./lib/menu-wrapper"; diff --git a/apps/cm/src/entities/menu/lib/menu-wrapper.tsx b/apps/cm/src/entities/menu/lib/menu-wrapper.tsx new file mode 100644 index 000000000..1f1080cac --- /dev/null +++ b/apps/cm/src/entities/menu/lib/menu-wrapper.tsx @@ -0,0 +1,58 @@ +"use client"; + +import { useEffect } from "react"; +import { usePathname, useRouter } from "next/navigation"; +import { MenuAuthorityApi } from "@/entities/menu-authority/@x/menu"; +import { getCookie, useAlertStore, useMenuStore } from "@/shared/lib"; +import { SITE_ID } from "@/shared/config"; +import { MenuApi } from "../api/menu-service"; +import { getCurrentMenu } from "./utils"; + +const MenuWrapper = ({ children }: { children: React.ReactNode }) => { + const router = useRouter(); + const pathname = usePathname(); + + const alert = useAlertStore((state) => state.setMessage); + const { pageMenuAuthority, setCurrentMenuInfo, setPageMenuAuthority } = + useMenuStore((state) => state); + + const getCurrentMenuInfo = async () => { + const menuRoles = await MenuApi.getMenuRoles(SITE_ID); + if (!menuRoles) return; + return getCurrentMenu(menuRoles, pathname ?? ""); + }; + + const getPageMenuAuthority = async () => { + const menuCd = getCookie("menu-code-key"); + if (!menuCd) return; + const response = await MenuAuthorityApi.getPageMenuAuthority( + parseInt(menuCd), + ); + return response; + }; + + const checkInquiryAuthority = () => { + return pageMenuAuthority?.inqAuthrtYn === "Y"; + }; + + useEffect(() => { + (async () => { + const currentMenu = await getCurrentMenuInfo(); + if (currentMenu) setCurrentMenuInfo(currentMenu); + + const response = await getPageMenuAuthority(); + if (response?.length) setPageMenuAuthority(response[0]!); + })(); + }, [pathname]); + + useEffect(() => { + if (!pageMenuAuthority) return; + const inquiryAuthority = checkInquiryAuthority(); + if (!inquiryAuthority) + alert("페이지에 대한 조회 권한이 없습니다.", () => router.push("/")); + }, [pageMenuAuthority]); + + return <>{children}</>; +}; + +export { MenuWrapper }; diff --git a/apps/cm/src/entities/menu/lib/utils.ts b/apps/cm/src/entities/menu/lib/utils.ts new file mode 100644 index 000000000..1cf4514d9 --- /dev/null +++ b/apps/cm/src/entities/menu/lib/utils.ts @@ -0,0 +1,20 @@ +import type { MenuItem } from "../model/menu-interface"; + +export const getCurrentMenu = ( + menus: MenuItem[], + pathname: string, +): MenuItem | null => { + for (const menu of menus) { + if ( + menu.urlPath !== "" && + (menu.urlPath === pathname || pathname.startsWith(menu.urlPath)) + ) + return menu; + + if (menu.children) { + const children = getCurrentMenu(menu.children, pathname); + if (children) return children; + } + } + return null; +}; diff --git a/apps/cm/src/entities/menu/model/menu-interface.ts b/apps/cm/src/entities/menu/model/menu-interface.ts new file mode 100644 index 000000000..0c5f4b54c --- /dev/null +++ b/apps/cm/src/entities/menu/model/menu-interface.ts @@ -0,0 +1,107 @@ +import { z } from "zod"; + +export const MENU_TYPE = { + EMPTY: "EMPTY", + CONTENTS: "CONTENTS", + BOARD: "BOARD", + INSIDE: "INSIDE", + OUTSIDE: "OUTSIDE", + BOTTOM: "BOTTOM", +} as const; + +export type MenuType = (typeof MENU_TYPE)[keyof typeof MENU_TYPE]; + +export interface MenuItem { + menuCd: number; + menuKornNm: string; + menuEngNm: string; + parentId: number | null; + sortSeq: number; + iconNm?: string; + children: MenuItem[] | null; + levelNo: number; + urlPath: string; + menuLnkgTypeCd: string; + menuLnkgSn: number; + menuPath: string; + qrcd: string; + useYn: string; + otptYn: string; + newWndwYn: string; + requiredUrlPath: boolean; +} + +export interface MenuTemporarilyStoredData { + tmprStrgSn: number; + menuCd: number; + menuTmprStrg: string; + regDt: string; + rgtr: string; + mdfcnDt: string; + mdfr: string; +} + +export const menuFormSchema = z.object({ + siteId: z.string(), + menuKornNm: z.string(), + menuSubKornNm: z.string().nullish(), + menuEngNm: z.string().nullish(), + menuSubEngNm: z.string().nullish(), + levelNo: z.number(), + urlPath: z.string().nullish(), + iconNm: z.string().nullish(), + menuLnkgTypeCd: z.enum([ + MENU_TYPE.EMPTY, + MENU_TYPE.CONTENTS, + MENU_TYPE.BOARD, + MENU_TYPE.INSIDE, + MENU_TYPE.OUTSIDE, + MENU_TYPE.BOTTOM, + ]), + menuLnkgSn: z.number().nullish(), + otptYn: z.string().default("Y"), + prntMenuCd: z.number().nullish(), + sortSeq: z.number(), + evlUseYn: z.string().default("Y"), + qrcd: z.string().nullish(), + useYn: z.string().default("Y"), + newWndwYn: z.string().nullish(), + menuLnkgSnNm: z.string().nullish(), + menuPicUserUnqId: z.string().nullish(), + menuPicUserUnqIdNm: z.string().nullish(), + menuPicDsgnYmd: z.string().nullish(), +}); + +export const siteMapPayloadSchema = z.object({ + menuCd: z.number(), + menuSubKornNm: z.string(), + otptYn: z.string(), +}); + +export const siteMapFormSchema = z.object({ + siteMap: z.array(siteMapPayloadSchema), +}); + +export type MenuFormData = z.infer<typeof menuFormSchema>; +export type SiteMapFormData = z.infer<typeof siteMapFormSchema>; +export type SiteMapPayloadData = z.infer<typeof siteMapPayloadSchema>; +export type Menu = Omit<MenuFormData, "iconNm"> & { + menuCd: number; + iconName?: string; +}; + +export interface MenuService { + getMenuRoles(siteId: string): Promise<MenuItem[]>; + getMenuInfo: (menuCd: number) => Promise<Menu>; + createMenu: (data: MenuFormData) => Promise<void>; + updateMenu: ( + menuCd: number, + data: Omit<MenuFormData, "siteId">, + ) => Promise<void>; + deleteMenu: (menuCd: number) => Promise<void>; + menuTemporaryStorage: (menuCd: number, data: MenuFormData) => Promise<void>; + getMenuTemporarilyStoredData: ( + menuCd: number, + ) => Promise<MenuTemporarilyStoredData[]>; + publishSiteMap: (data: SiteMapFormData["siteMap"]) => Promise<void>; +} diff --git a/apps/cm/src/pages/auth/login/index.ts b/apps/cm/src/pages/auth/login/index.ts new file mode 100644 index 000000000..2093c3d8d --- /dev/null +++ b/apps/cm/src/pages/auth/login/index.ts @@ -0,0 +1 @@ +export { LoginPage } from "./ui/login-page"; diff --git a/apps/cm/src/pages/auth/login/ui/OtpModal.tsx b/apps/cm/src/pages/auth/login/ui/OtpModal.tsx new file mode 100644 index 000000000..7c6aeb9af --- /dev/null +++ b/apps/cm/src/pages/auth/login/ui/OtpModal.tsx @@ -0,0 +1,153 @@ +import { useState } from "react"; +import { ACCESS_TOKEN, AUTH_USER_ID, REFRESH_TOKEN, CLAIM_NAME } from "@/shared/config"; +import { tokenManager } from "@/entities/auth/lib/token-manager"; +import { + Button, + Dialog, + DialogContent, +} from "@common/components"; + +interface OtpModalProps { + onClose: () => void; + onSuccess: () => void; + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export default function OtpModal({ onClose, onSuccess, open, onOpenChange }: OtpModalProps) { + const [otp, setOtp] = useState(""); + const [error, setError] = useState(""); + const [isLoading, setIsLoading] = useState(false); + + const handleSubmit = async () => { + try { + setIsLoading(true); + setError(""); + + const tempToken = localStorage.getItem("tempToken"); + console.log("tempToken from localStorage:", tempToken); + + if (!tempToken) { + setError("임시 토큰이 없습니다. 로그인을 다시 시도해주세요."); + return; + } + + // Proxy를 통해 OTP 인증 처리 + const response = await fetch(`/api/proxy/user-service/api/v1/auth/2fa/verify`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + otpCode: otp, + tempToken + }), + }); + + if (!response.ok) { + const errorData = await response.json(); + let errorMsg = errorData.message || 'OTP 인증 실패'; + if (Array.isArray(errorData.errors) && errorData.errors.length > 0) { + errorMsg = errorData.errors.map((e: { message: string }) => e.message).join(', '); + } + throw new Error(errorMsg); + } + + const data = await response.json(); + console.log("OTP verification response:", data); + console.log("Response headers:", Object.fromEntries(response.headers.entries())); + console.log("Response data keys:", Object.keys(data)); + console.log("Full response data:", JSON.stringify(data, null, 2)); + + // 2FA 응답에서는 access-token만 있고 token-id는 없을 수 있음 + const accessToken = data[ACCESS_TOKEN] || data.accessToken || data.access_token || data.token || data['ss-token']; + + console.log("Extracted accessToken:", !!accessToken); + console.log("Token value - accessToken:", accessToken?.substring(0, 20) + "..."); + + // access-token이 있는 경우 저장 + if (accessToken) { + console.log("Saving access token from OTP verification"); + tokenManager.setToken(CLAIM_NAME, accessToken); // Authorization으로 저장 + + // 리프레시 토큰도 확인 + const refreshToken = data[REFRESH_TOKEN] || data.refreshToken || data.refresh_token; + if (refreshToken) { + console.log("Saving refresh token"); + tokenManager.setToken(REFRESH_TOKEN, refreshToken); + } + + // userId는 원래 로그인 응답에서 가져온 값 사용 + const originalUserId = data.userId; + if (originalUserId) { + console.log("Saving userId from original login response"); + tokenManager.setToken(AUTH_USER_ID, originalUserId); + } + + console.log("All tokens saved successfully"); + } else { + console.log("No access token in OTP response"); + console.log("Available data keys:", Object.keys(data)); + console.log("Data values:", Object.entries(data).map(([k, v]) => `${k}: ${typeof v === 'string' ? v.substring(0, 20) + '...' : v}`)); + } + + onSuccess(); + } catch (error: unknown) { + console.error("OTP verification error:", error); + if (error instanceof Error) { + setError(error.message); + } else { + setError("OTP 인증 실패"); + } + } finally { + setIsLoading(false); + } + }; + + const handleClose = () => { + onOpenChange(false); + onClose(); + }; + + return ( + <Dialog open={open} onOpenChange={onOpenChange}> + <DialogContent className="max-w-md"> + <div className="pt-8 text-center"> + <h2 className="text-[1.3rem] font-semibold mb-6">OTP 인증</h2> + + <div className="space-y-4"> + <input + className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent text-lg" + placeholder="OTP 코드를 입력하세요" + value={otp} + onChange={(e) => setOtp(e.target.value)} + disabled={isLoading} + /> + + {error && ( + <div className="text-red-500 text-sm text-center"> + {error} + </div> + )} + + <div className="flex space-x-2 pt-4"> + <Button + onClick={handleSubmit} + disabled={isLoading || !otp.trim()} + className="flex-1" + > + {isLoading ? "인증 중..." : "인증"} + </Button> + <Button + variant="outline" + onClick={handleClose} + disabled={isLoading} + className="flex-1" + > + 닫기 + </Button> + </div> + </div> + </div> + </DialogContent> + </Dialog> + ); +} diff --git a/apps/cm/src/pages/auth/login/ui/TwoFAModal.tsx b/apps/cm/src/pages/auth/login/ui/TwoFAModal.tsx new file mode 100644 index 000000000..d66747b0c --- /dev/null +++ b/apps/cm/src/pages/auth/login/ui/TwoFAModal.tsx @@ -0,0 +1,198 @@ +import { useEffect, useState } from "react"; +import Image from "next/image"; +import { + Button, + Dialog, + DialogContent, +} from "@common/components"; + +interface TwoFAModalProps { + onClose: () => void; + onSuccess: () => void; + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export default function TwoFAModal({ onClose, onSuccess, open, onOpenChange }: TwoFAModalProps) { + const [qrImage, setQrImage] = useState(""); + const [secret, setSecret] = useState(""); + const [otp, setOtp] = useState(""); + const [error, setError] = useState(""); + const [isLoading, setIsLoading] = useState(false); + const [isSetupLoading, setIsSetupLoading] = useState(true); + + useEffect(() => { + const fetchQR = async () => { + try { + setIsSetupLoading(true); + setError(""); + + const tempToken = localStorage.getItem("tempToken"); + if (!tempToken) { + setError("임시 토큰이 없습니다"); + return; + } + + // Proxy를 통해 2FA setup 처리 + const response = await fetch(`/api/proxy/user-service/api/v1/auth/2fa/setup`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ tempToken }), + }); + + if (!response.ok) { + const errorData = await response.json(); + let errorMsg = errorData.message || 'QR코드 발급 실패'; + if (Array.isArray(errorData.errors) && errorData.errors.length > 0) { + errorMsg = errorData.errors.map((e: { message: string }) => e.message).join(', '); + } + throw new Error(errorMsg); + } + + const data = await response.json(); + console.log("2FA setup response:", data); + console.log("Response headers:", Object.fromEntries(response.headers.entries())); + + // Proxy 응답에서 QR 데이터 추출 + setQrImage(data.qrImage); + setSecret(data.secret); + } catch (error: unknown) { + console.error("2FA setup error:", error); + if (error instanceof Error) { + setError(error.message); + } else { + setError("QR코드 발급 실패"); + } + } finally { + setIsSetupLoading(false); + } + }; + + if (open) { + fetchQR(); + } + }, [open]); + + const handleEnable2FA = async () => { + try { + setIsLoading(true); + setError(""); + + const tempToken = localStorage.getItem("tempToken"); + if (!tempToken) { + setError("임시 토큰이 없습니다"); + return; + } + + // Proxy를 통해 2FA enable 처리 + const response = await fetch(`/api/proxy/user-service/api/v1/auth/2fa/enable`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': tempToken, + }, + body: JSON.stringify({ + otpCode: otp, + tempToken: tempToken, + secret: secret, + }), + }); + + if (!response.ok) { + const errorData = await response.json(); + let errorMsg = errorData.message || '2FA 등록 실패'; + if (Array.isArray(errorData.errors) && errorData.errors.length > 0) { + errorMsg = errorData.errors.map((e: { message: string }) => e.message).join(', '); + } + throw new Error(errorMsg); + } + + const data = await response.json(); + console.log("2FA enable response:", data); + console.log("Response headers:", Object.fromEntries(response.headers.entries())); + console.log("Response data keys:", Object.keys(data)); + + // 2FA 설정 완료 후에는 토큰을 저장하지 않음 (실제 로그인은 OTP에서 처리) + console.log("2FA setup completed successfully"); + + onSuccess(); + } catch (error: unknown) { + console.error("2FA enable error:", error); + if (error instanceof Error) { + setError(error.message); + } else { + setError("2FA 등록 실패"); + } + } finally { + setIsLoading(false); + } + }; + + const handleClose = () => { + onOpenChange(false); + onClose(); + }; + + return ( + <Dialog open={open} onOpenChange={onOpenChange}> + <DialogContent className="max-w-md"> + <div className="pt-8 text-center"> + <h2 className="text-[1.3rem] font-semibold mb-6">2FA 등록</h2> + + {isSetupLoading ? ( + <div className="py-8"> + <div className="text-gray-500">QR코드 로딩 중...</div> + </div> + ) : ( + <> + {qrImage && ( + <div className="flex justify-center mb-4"> + <Image + src={`data:image/png;base64,${qrImage}`} + alt="QR코드" + width={200} + height={200} + /> + </div> + )} + + <div className="space-y-4"> + <input + className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent text-lg" + placeholder="OTP 코드를 입력하세요" + value={otp} + onChange={(e) => setOtp(e.target.value)} + disabled={isLoading} + /> + + {error && ( + <div className="text-red-500 text-sm text-center"> + {error} + </div> + )} + + <div className="flex space-x-2 pt-4"> + <Button + onClick={handleEnable2FA} + disabled={isLoading || !otp.trim()} + className="flex-1" + > + {isLoading ? "2FA 활성화 중..." : "2FA 활성화"} + </Button> + <Button + variant="outline" + onClick={handleClose} + disabled={isLoading} + className="flex-1" + > + 닫기 + </Button> + </div> + </div> + </> + )} + </div> + </DialogContent> + </Dialog> + ); +} diff --git a/apps/cm/src/pages/auth/login/ui/login-page.tsx b/apps/cm/src/pages/auth/login/ui/login-page.tsx new file mode 100644 index 000000000..251cd2819 --- /dev/null +++ b/apps/cm/src/pages/auth/login/ui/login-page.tsx @@ -0,0 +1,276 @@ +"use client"; + +import { useState, useEffect } from "react"; +import Image from "next/image"; +import { images } from "@common/assets"; +import { LoginApi } from "@/entities/auth"; +import { ENDPOINT } from "@/shared/config"; +import OtpModal from "./OtpModal"; +import TwoFAModal from "./TwoFAModal"; +import "./login.css"; +import { useRouter } from "next/navigation"; + +function LoginPage() { + const [isOtpEnabled, setIsOtpEnabled] = useState(false); + const [showOtpModal, setShowOtpModal] = useState(false); + const [showTwoFAModal, setShowTwoFAModal] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(""); + const router = useRouter(); + + // 모달 상태 디버깅 + useEffect(() => { + console.log("Modal states - OTP:", showOtpModal, "2FA:", showTwoFAModal); + }, [showOtpModal, showTwoFAModal]); + + const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => { + e.preventDefault(); + setIsLoading(true); + setError(""); + + try { + const formData = new FormData(e.target as HTMLFormElement); + const userId = formData.get("id") as string; + const password = formData.get("password") as string; + + console.log("Login attempt - OTP enabled:", isOtpEnabled); + console.log("User ID:", userId); + + if (isOtpEnabled) { + // 2FA 로그인 - Proxy를 통해 처리 (2FA 전용 엔드포인트 사용) + console.log("Starting 2FA login..."); + + const response = await fetch(`/api/proxy${ENDPOINT.USER_SERVICE.LOGIN_2FA}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + userId, + password, + provider: 'password' + }), + }); + + if (!response.ok) { + const errorData = await response.json(); + let errorMsg = errorData.message || '로그인 실패'; + if (Array.isArray(errorData.errors) && errorData.errors.length > 0) { + errorMsg = errorData.errors.map((e: { message: string }) => e.message).join(', '); + } + throw new Error(errorMsg); + } + + const data = await response.json(); + console.log("2FA login response:", data); + console.log("Response headers:", Object.fromEntries(response.headers.entries())); + + // 2FA 로그인 응답에는 tempToken과 registered2FA만 포함됨 + if (!data.tempToken) { + throw new Error("Missing tempToken in 2FA login response"); + } + + // 임시 토큰을 localStorage에 저장 (OTP 인증용) + localStorage.setItem('tempToken', data.tempToken); + console.log("tempToken saved:", data.tempToken); + + if (data.registered2FA) { + console.log("User has 2FA registered, showing OTP modal"); + setShowOtpModal(true); + } else { + console.log("User doesn't have 2FA registered, showing 2FA setup modal"); + setShowTwoFAModal(true); + } + } else { + // 기본 로그인 - proxy를 통해 처리 + console.log("Starting basic login..."); + await LoginApi.login({ userId, password }); + window.location.href = "/dashboard"; + } + } catch (error: unknown) { + console.error("Login error:", error); + + // 에러 처리 + if (error instanceof Error) { + setError(error.message); + } else { + setError("로그인에 실패했습니다. 아이디와 비밀번호를 확인해주세요."); + } + } finally { + setIsLoading(false); + } + }; + + const handleOtpSuccess = () => { + console.log("OTP authentication successful, redirecting to dashboard"); + localStorage.removeItem("tempToken"); // 임시 토큰 제거 + router.push("/dashboard"); + }; + + const handleTwoFASuccess = () => { + console.log("2FA setup successful, redirecting to dashboard"); + localStorage.removeItem("tempToken"); // 임시 토큰 제거 + router.push("/dashboard"); + }; + + const handleOtpClose = () => { + console.log("OTP modal closed"); + setShowOtpModal(false); + localStorage.removeItem("tempToken"); + }; + + const handleTwoFAClose = () => { + console.log("2FA modal closed"); + setShowTwoFAModal(false); + localStorage.removeItem("tempToken"); + }; + + return ( + <> + <div className="login fx"> + <div className="left_box fx"> + <div className="text"> + <h1> + 유역하수도 통합플랫폼 + <br /> + <span>통합관리시스템</span> + </h1> + <p>유역하수도 통합플랫폼에 오신 것을 환영합니다.</p> + </div> + <div className="img"> + <Image src={images.logo} width={229} height={46} alt="logo" /> + </div> + </div> + <form + id="loginForm" + name="loginForm" + method="post" + onSubmit={handleSubmit} + > + <div className="login_box fx"> + <ul className="fx"> + <li> + <h2>ID</h2> + <div className="input_st st1"> + <i className="diveicon di-account-box" /> + <input + type="text" + className="id" + title="아이디를 입력하세요." + id="id" + name="id" + maxLength={12} + disabled={isLoading} + /> + </div> + </li> + <li> + <h2>PASSWORD</h2> + <div className="input_st st2"> + <i className="diveicon di-key" /> + <input + type="password" + className="input_style" + maxLength={25} + title="비밀번호를 입력하세요." + id="password" + name="password" + disabled={isLoading} + /> + </div> + </li> + </ul> + <div className="bottom_box fx"> + <div className="checks fx"> + <input + type="checkbox" + name="checkId" + title="로그인ID 저장여부" + id="checkId" + disabled={isLoading} + /> + <label htmlFor="checkId">아이디저장</label> + </div> + <div className="checks fx"> + <input + type="checkbox" + name="checkTwoFA" + title="OTP 인증 여부" + id="checkTwoFA" + checked={isOtpEnabled} + onChange={(e) => setIsOtpEnabled(e.target.checked)} + disabled={isLoading} + /> + <label htmlFor="checkTwoFA">OTP 인증</label> + </div> + </div> + <button + type="submit" + className="login_btn fx" + disabled={isLoading} + > + <span>{isLoading ? "로그인 중..." : "LOGIN"}</span> + </button> + {error && ( + <div className="error-message" style={{ color: "red", textAlign: "center", marginTop: "10px" }}> + {error} + </div> + )} + <div className="footer"> + <div className="copy fx"> + <p>copyright © 2023 KECO. All rights reserved.</p> + </div> + <div className="fot_btn fx"> + <a + href="https://keco.or.kr/web/lay1/S1T6C1348/contents.do" + target="_blank" + > + 개인정보처리방침 + </a> + <a + href="https://keco.or.kr/web/lay1/S1T6C1349/contents.do" + target="_blank" + > + 저작권정책안내 + </a> + <a + href="https://keco.or.kr/web/lay1/S1T6C1350/contents.do" + target="_blank" + > + 이메일무단수집거부 + </a> + </div> + <p className="addr fx"> + <span> + 주소 : (22689) 인천광역시 서구 환경로 42(경서동 + 종합환경연구단지) + </span> + <span> + 전화 : (시스템) 032-590-4321, 3752, 4314 / (통 계) 032-590-3723, + 3722 + </span> + <span>팩스 :032-590-3729</span> + </p> + </div> + </div> + </form> + </div> + + {/* OTP 인증 모달 */} + <OtpModal + onClose={handleOtpClose} + onSuccess={handleOtpSuccess} + open={showOtpModal} + onOpenChange={setShowOtpModal} + /> + + {/* 2FA 등록 모달 */} + <TwoFAModal + onClose={handleTwoFAClose} + onSuccess={handleTwoFASuccess} + open={showTwoFAModal} + onOpenChange={setShowTwoFAModal} + /> + </> + ); +} + +export { LoginPage }; diff --git a/apps/cm/src/pages/auth/login/ui/login.css b/apps/cm/src/pages/auth/login/ui/login.css new file mode 100644 index 000000000..831cc13a9 --- /dev/null +++ b/apps/cm/src/pages/auth/login/ui/login.css @@ -0,0 +1,311 @@ +/** +* OLYM Cascading Style Sheets +* File Name : login.css +* Description : 로그인 스타일시트 +* Author : Web business Team / Choi Hyun Mi +* Email : desingtj@olym.co.kr +* Date : 2023.07.20 +* Update : 2023.07.26 +* Copyright(c) 2023 OLYM Communications. All Rights Reserved. +*/ +html, +body { + background: #fff; +} +.fx { + display: flex; + -ms-display: flex; + -webkit-display: flex; + box-sizing: border-box; +} +.login { + width: 100%; + height: 100vh; +} +.login .left_box { + width: 100%; + background: url(../../../../../public/images/bg_login.jpg) no-repeat + center/cover; + flex-direction: column; + justify-content: space-between; + padding: 7% 5% 5% 5%; +} +.login .left_box .text h1 { + font-size: 53px; + color: #fff; +} +.login .left_box .text h1 span { + font-weight: 800; +} +.login .left_box .text p { + margin-top: 40px; + font-size: 18px; + color: #fff; +} +.login .login_box { + width: 100%; + flex-direction: column; + justify-content: center; + padding: 4% 12% 4% 6%; +} +.login .login_box > ul { + flex-direction: column; + gap: 40px; +} +.login .login_box > ul > li h2 { + font-size: 22px; + font-weight: 600; + color: #2640a5; + margin-bottom: 14px; +} +.login .login_box > ul > li .input_st { + position: relative; +} +.login .login_box > ul > li .input_st .diveicon { + position: absolute; + top: 50%; + left: 28px; + transform: translateY(-50%); + font-family: "Xeicon"; + font-size: 25px; + color: #003288; +} +.login .login_box > ul > li input { + width: 100%; + padding: 20px 20px 20px 70px; + background: #f7f7f7; + box-sizing: border-box; + border: none; + border-radius: 5px; + font-size: 18px; + font-weight: 700; + color: #000; + height: auto; +} +.login .login_box > ul > li input:focus { + outline: 1px solid #3c5fe5; +} +.login .login_box > ul > li input::placeholder { + color: #afabab; + font-weight: 500; +} +.login .login_box .bottom_box { + justify-content: space-between; + gap: 20px; + padding: 50px 0 45px 0; +} +.login .login_box .bottom_box .checks { + display: flex; + align-items: center; + gap: 8px; +} +.login .login_box .bottom_box .checks input[type="checkbox"] { + width: 18px; + height: 18px; +} +.login .login_box .bottom_box .checks label { + font-size: 14px; +} +.login .login_box .bottom_box .pw_message { + align-items: center; + gap: 5px; + color: #636363; + font-weight: 500; + border-bottom: 1px solid #ccc; + padding-bottom: 5px; +} +.login .login_box .bottom_box .pw_message i { + color: #327af5; + font-size: 20px; +} +.login .login_box .login_btn { + position: relative; + border-radius: 5px; + padding: 24px 15px; + background: linear-gradient( + to left, + #1d3969 0%, + #264078 10%, + #172558 40%, + #162254 50%, + #111c43 60%, + #111c42 100% + ); + overflow: hidden; + justify-content: center; + align-items: center; + gap: 10px; + color: #fff; + cursor: pointer; +} +.login .login_box .login_btn span { + font-family: "Montserrat"; + font-size: 19px; + font-weight: 700; + position: relative; +} +.login .login_box .login_btn i { + font-size: 22px; + transform: translateY(-2px); +} +.login .login_box .login_btn:before { + display: block; + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0; + background: linear-gradient( + to right, + #1d3969 0%, + #264078 10%, + #172558 40%, + #162254 50%, + #111c43 60%, + #111c42 100% + ); + transition: opacity 0.5s; +} +.login .login_box .login_btn:hover::before { + opacity: 1; +} +.login .footer .copy { + margin-top: 36px; + justify-content: space-between; + align-items: center; + gap: 3%; +} +.login .footer .copy p { + font-size: 13px; + color: #d4d4d4; + width: 44%; + text-align: center; +} +.login .footer .copy::before, +.login .login_box .copy::after { + content: ""; + width: 20%; + height: 1px; + background: #d4d4d4; +} +.login .footer .fot_btn { + gap: 20px; + margin: 30px 0 10px 0; +} +.login .footer .fot_btn a { + color: #333; + font-weight: 700; + font-size: 13px; +} +.login .footer .fot_btn a:hover { + color: #003288; +} +.login .footer .addr { + color: #666; + font-size: 13px; + gap: 3px 20px; + flex-wrap: wrap; +} +/* 비밀번호 변경 팝업창 */ +.login .modal .modal_container { + width: 750px; +} +.login .pw_desc { + padding: 10px 10px 30px 10px; + color: #666; +} +.login .pw_desc p { + font-size: 1.25rem; + color: #000; + font-weight: 700; + margin-bottom: 10px; +} +.login .pw_desc span { + color: #f60; + font-weight: 700; +} +.login .modal .form_write { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + padding: 20px 50px; +} +@media (max-width: 1024px) { + .login { + flex-direction: column; + height: auto; + } + .login .left_box { + padding: 30px; + flex-direction: column-reverse; + gap: 20px; + } + .login .left_box .text h1 { + font-size: 30px; + line-height: 1.2em; + } + .login .left_box .text p { + margin-top: 20px; + font-size: 14px; + } + .login .left_box .img img { + height: 40px; + } + .login .login_box { + padding: 30px; + } + .login .login_box > ul { + gap: 20px; + } + .login .login_box > ul > li h2 { + margin-bottom: 7px; + } + .login .login_box > ul > li .input_st::after { + left: 15px; + font-size: 20px; + } + .login .login_box > ul > li input { + padding: 15px 10px 15px 50px; + font-size: 16px; + } + .login .login_box .bottom_box { + flex-direction: column; + align-items: flex-start; + padding: 30px 0; + } + .login .login_box .bottom_box .id_save label { + font-size: 14px; + } + .login .login_box .login_btn { + padding: 15px; + } + .login .login_box .login_btn span { + font-size: 16px; + } + .login .login_box .login_btn i { + font-size: 18px; + transform: translateY(-1px); + } + .login .login_box .copy p { + width: 100%; + } + .login .login_box .copy::before, + .login .login_box .copy::after { + display: none; + } + .login .footer .addr { + font-size: 11px; + gap: 3px 10px; + } + .login .modal .modal_container { + width: 90%; + } + .login .pw_desc { + padding: 0 0 20px 0; + } + .login .modal .form_write { + padding: 10px; + } +} +/* // login */ diff --git a/apps/cm/src/pages/dashboard/index.ts b/apps/cm/src/pages/dashboard/index.ts new file mode 100644 index 000000000..5b787c2e2 --- /dev/null +++ b/apps/cm/src/pages/dashboard/index.ts @@ -0,0 +1 @@ +export { DashboardPage } from "./ui/dashboard-page"; diff --git a/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx b/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx new file mode 100644 index 000000000..3b59d4a23 --- /dev/null +++ b/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx @@ -0,0 +1,94 @@ +"use client"; +import { useEffect, useState } from 'react'; +import { useRouter } from 'next/navigation'; +import { tokenManager } from '@/entities/auth/lib/token-manager'; +import { client } from '@/shared/api'; +import { ENDPOINT } from '@/shared/config'; + +interface UserInfo { + email?: string; + userId?: string; + userName?: string; + twoFactorEnabled?: boolean; +} + +function DashboardPage() { + const [userInfo, setUserInfo] = useState<UserInfo | null>(null); + const [error, setError] = useState(''); + const router = useRouter(); + + useEffect(() => { + const fetchUserInfo = async () => { + console.log('fetchUserInfo called'); + + try { + // tokenManager를 통해 토큰 확인 + const accessToken = tokenManager.getToken('Authorization'); + const userId = tokenManager.getToken('token-id'); + + if (!accessToken || !userId) { + console.log('No tokens found, redirecting to login'); + setError('로그인이 필요합니다.'); + router.push('/login'); + return; + } + + console.log('Fetching user info with userId:', userId); + + // client를 사용하여 API 호출 (자동 토큰 처리) + const response = await client.get(`${ENDPOINT.USER_SERVICE.USERS}/${userId}`); + + if (response.data) { + console.log('User info received:', response.data); + setUserInfo(response.data); + } else { + setError('사용자 정보를 불러올 수 없습니다.'); + } + } catch (error) { + console.error('Error fetching user info:', error); + if (error instanceof Error && error.message.includes('401')) { + setError('인증이 만료되었습니다. 다시 로그인해주세요.'); + tokenManager.clearAuthToken(); + router.push('/login'); + } else { + setError('네트워크 오류가 발생했습니다.'); + } + } + }; + + fetchUserInfo(); + }, [router]); + + const handleLogout = () => { + console.log('Logging out...'); + // localStorage 정리 + localStorage.removeItem('tempToken'); + // tokenManager를 통해 쿠키 정리 + tokenManager.clearAuthToken(); + router.push('/login'); + }; + + const handleChangePassword = () => { + router.push('/otp?next=change-password'); + }; + + return ( + <div className="max-w-md mx-auto mt-20 p-8 border rounded shadow"> + <h2 className="text-2xl mb-6">대시보드</h2> + {error && <div className="text-red-500 mb-4">{error}</div>} + {userInfo ? ( + <div className="mb-4"> + <div><b>이메일:</b> {userInfo.email || userInfo.userId}</div> + <div><b>이름:</b> {userInfo.userName || '-'}</div> + <div><b>2FA 활성화:</b> {userInfo.twoFactorEnabled ? '예' : '아니오'}</div> + </div> + ) : ( + !error && <div>사용자 정보를 불러오는 중...</div> + )} + <button className="btn w-full mb-2" onClick={handleLogout}>로그아웃</button> + <button className="btn w-full" onClick={handleChangePassword}>패스워드 변경</button> + </div> + ); +} + +export { DashboardPage }; \ No newline at end of file diff --git a/apps/cm/src/shared/api/client.ts b/apps/cm/src/shared/api/client.ts new file mode 100644 index 000000000..cf37e6671 --- /dev/null +++ b/apps/cm/src/shared/api/client.ts @@ -0,0 +1,11 @@ +import { Client } from "@common/network"; +import { BASE_URL } from "../config/api"; +import { SITE_ID } from "../config/env"; +import { setCookie } from "../lib"; + +setCookie("site-id-key", SITE_ID); + +export const client = Client.getInstance({ + baseURL: BASE_URL, + siteId: SITE_ID, +}); diff --git a/apps/cm/src/shared/api/index.ts b/apps/cm/src/shared/api/index.ts new file mode 100644 index 000000000..b7b9d6121 --- /dev/null +++ b/apps/cm/src/shared/api/index.ts @@ -0,0 +1 @@ +export { client } from "./client"; diff --git a/apps/cm/src/shared/config/api.ts b/apps/cm/src/shared/config/api.ts new file mode 100644 index 000000000..d6065bfc7 --- /dev/null +++ b/apps/cm/src/shared/config/api.ts @@ -0,0 +1,73 @@ +import { PROXY_HOST } from "./env"; + +export const BASE_URL = `${PROXY_HOST}/server`; + +export const ENDPOINT = { + ATTACH_SERVICE: { + TUS_UPLOAD: "/attach-service/api/v1/tus/upload", + EDITOR_UPLOAD: "/attach-service/api/v1/upload/editor", + IMAGES: "/attach-service/api/v1/images", + MOVIE_THUMBNAIL: "/attach-service/api/v1/movie/thumbnail", + ATTACHMENTS: "/attach-service/api/v1/atfl/attachments", + DOWNLOAD: "/attach-service/api/v1/atflcd/download", + STREAM_VIDEO: "/attach-service/api/v1/stream/video", + }, + USER_SERVICE: { + LOGIN: "/user-service/login", + LOGIN_2FA: "/user-service/api/v1/auth/login", + USERS: "/user-service/api/v1/users", + SILENT_REFRESH: "/user-service/api/v1/users/token/refresh", + AUTHORIZATIONS: "/user-service/api/v1/authorizations", + ROLE_AUTHORIZATIONS: "/user-service/api/v1/role-authorizations", + ROLES: "/user-service/api/v1/roles", + LOGINLOG: "/user-service/api/v1/login-logs", + PRIVACYLOG: "/user-service//api/v1/prvc-inq-logs", + OTP_VERIFY: "/user-service/api/v1/auth/2fa/verify", + TWOFA_SETUP: "/user-service/api/v1/auth/2fa/setup", + TWOFA_ENABLE: "/user-service/api/v1/auth/2fa/enable", + }, + CMS_SERVICE: { + DASHBOARD: "/cms-service/api/v1/dashboard", + SITES: "/cms-service/api/v1/sites", + IPS: "/cms-service/api/v1/site-ips", + DOMAINS: "/cms-service/api/v1/site-dmns", + POSTINGS: "/cms-service/api/v1/site-pstgs", + CODE: "/cms-service/api/v1/code/cache", + MENUS: "/cms-service/api/v1/menus", + MENU_ROLES: "/cms-service/api/v1/menu-roles", + MENU_AUTHRTS: "/cms-service/api/v1/menu-authrts", + MENU_TEMPORARY_STORAGE: "/cms-service/api/v1/menu-tmpr-strg", + MENU_HISTORY: "/cms-service/api/v1/menu-hstry", + CONTENTS: "/cms-service/api/v1/contents", + CONTENTS_DETAILS: "/cms-service/api/v1/contents-details", + ORGANIZATIONS: "/cms-service/api/v1/ognzs", + USER_ORGANIZATION: "/cms-service/api/v1/user-ognz", + IMAGES: "/cms-service/api/v1/images", + BANNERS: "/cms-service/api/v1/bnrs", + TEMPLATE: "/cms-service/api/v1/tmplt", + TERMS: "/cms-service/api/v1/trms", + LWPO_CODE: "/cms-service/api/v1/lwpo-cds", + UP_CODE: "/cms-service/api/v1/up-codes", + POPUPS: "/cms-service/api/v1/popups", + SCHEDULES: "/cms-service/api/v1/schdls", + SURVEY: "/cms-service/api/v1/srvy", + SURVEY_QUESTION: "/cms-service/api/v1/srvy-qitem", + SURVEY_ARTICLE: "/cms-service/api/v1/srvy-artcl", + ZIPS: "/cms-service/api/v1/zips", + GROUPS: "/cms-service/api/v1/groups", + GROUP_USERS: "/cms-service/api/v1/group-users", + MANAGER_IP: "/cms-service/api/v1/mgrip", + APILOG: "/cms-service/api/v1/api-logs", + SITE_AUTHORITY: "/cms-service/api/v1/site-authrt", + CONNECTION_LOG: "/cms-service/api/v1/cntnlog", + }, + BOARD_SERVICE: { + BBS: "/board-service/api/v1/bbs", + BBS_TEMPLATES: "/board-service/api/v1/bbsTmplt", + POSTS: "/board-service/api/v1/posts", + POSTS_COMMENTS: "/board-service/api/v1/posts-cmnts", + POST_EVALUATION: "/board-service/api/v1/pstEvl", + }, +}; + +export const JWT_EXPIRATION_TIME = 1800000; diff --git a/apps/cm/src/shared/config/env.ts b/apps/cm/src/shared/config/env.ts new file mode 100644 index 000000000..c6373724f --- /dev/null +++ b/apps/cm/src/shared/config/env.ts @@ -0,0 +1,11 @@ +export const PORT = process.env.NEXT_PUBLIC_PORT || "3000"; +export const PROXY_HOST = + process.env.NEXT_PUBLIC_PROXY_HOST || `http://localhost:${PORT}`; +export const SERVER_API_URL = process.env.NEXT_PUBLIC_SERVER_API_URL; +export const SITE_ID = process.env.NEXT_PUBLIC_SITE_ID || "CS"; +export const CLAIM_NAME = process.env.NEXT_PUBLIC_CLAIM_NAME || "Authorization"; +export const ACCESS_TOKEN = + process.env.NEXT_PUBLIC_ACCESS_TOKEN || "access-token"; +export const REFRESH_TOKEN = + process.env.NEXT_PUBLIC_REFRESH_TOKEN || "refresh-token"; +export const AUTH_USER_ID = process.env.NEXT_PUBLIC_AUTH_USER_ID || "token-id"; diff --git a/apps/cm/src/shared/config/index.ts b/apps/cm/src/shared/config/index.ts new file mode 100644 index 000000000..cd83447d5 --- /dev/null +++ b/apps/cm/src/shared/config/index.ts @@ -0,0 +1,2 @@ +export * from "./api"; +export * from "./env"; diff --git a/apps/cm/src/shared/lib/cookie.ts b/apps/cm/src/shared/lib/cookie.ts new file mode 100644 index 000000000..8f5d0011b --- /dev/null +++ b/apps/cm/src/shared/lib/cookie.ts @@ -0,0 +1,29 @@ +import Cookies from "js-cookie"; + +export function getCookie(name: string): string | undefined { + if (typeof window === "undefined") { + return undefined; + } + return Cookies.get(name); +} + +export function setCookie( + name: string, + value: string, + options?: Cookies.CookieAttributes, +): void { + if (typeof window === "undefined") { + return; + } + Cookies.set(name, value, options); +} + +export function removeCookie( + name: string, + options?: Cookies.CookieAttributes, +): void { + if (typeof window === "undefined") { + return; + } + Cookies.remove(name, options); +} diff --git a/apps/cm/src/shared/lib/index.ts b/apps/cm/src/shared/lib/index.ts new file mode 100644 index 000000000..5ac79bf08 --- /dev/null +++ b/apps/cm/src/shared/lib/index.ts @@ -0,0 +1,8 @@ +export { getCookie, setCookie, removeCookie } from "./cookie"; +export { useMutationWrapper } from "./use-mutation-wrapper"; +export { useAlertStore } from "./use-alert-store"; +export { useDataTable } from "./use-data-table"; +export { useMenuStore } from "./use-menu-store"; +export { useUserStore } from "./use-user-store"; +export { usePrompt } from "./use-prompt"; +export { useSelectPrompt } from "./use-select-prompt"; diff --git a/apps/cm/src/shared/lib/match-query-status.ts b/apps/cm/src/shared/lib/match-query-status.ts new file mode 100644 index 000000000..0e5f45829 --- /dev/null +++ b/apps/cm/src/shared/lib/match-query-status.ts @@ -0,0 +1,65 @@ +import { type UseQueryResult } from "@tanstack/react-query"; +import type { PageableList } from "../model"; + +/** + * Match the state of a query to a set of components. + * + * Useful for rendering different UI based on the state of a query. + */ +export function matchQueryStatus<T>( + query: UseQueryResult<PageableList<T>>, + options: { + Loading?: JSX.Element; + Errored?: JSX.Element | ((error: unknown) => JSX.Element); + Empty?: JSX.Element; + Success: ( + data: UseQueryResult<PageableList<T>> & { + data: NonNullable<UseQueryResult<T>["data"]>; + }, + ) => JSX.Element; + }, +): JSX.Element; +export function matchQueryStatus<T>( + query: UseQueryResult<PageableList<T>>, + options: { + Loading?: JSX.Element; + Errored?: JSX.Element | ((error: unknown) => JSX.Element); + Success: (data: UseQueryResult<PageableList<T>>) => JSX.Element; + }, +): JSX.Element; +export function matchQueryStatus<T>( + query: UseQueryResult<PageableList<T>>, + { + Loading, + Errored, + Empty, + Success, + }: { + Loading?: JSX.Element; + Errored?: JSX.Element | ((error: unknown) => JSX.Element); + Empty?: JSX.Element; + Success: (data: UseQueryResult<PageableList<T>>) => JSX.Element; + }, +): JSX.Element { + if (query.isLoading && Loading) { + return Loading; + } + + if (query.isError && Errored) { + if (typeof Errored === "function") { + return Errored(query.error); + } + return Errored; + } + + const isEmpty = + query.data?.content === undefined || + query.data?.content === null || + (Array.isArray(query.data?.content) && query.data?.content.length === 0); + + if (isEmpty && Empty) { + return Empty; + } + + return Success(query); +} diff --git a/apps/cm/src/shared/lib/use-alert-store.ts b/apps/cm/src/shared/lib/use-alert-store.ts new file mode 100644 index 000000000..c21a00ed3 --- /dev/null +++ b/apps/cm/src/shared/lib/use-alert-store.ts @@ -0,0 +1,14 @@ +import { useStore } from "zustand"; +import { useContext } from "react"; +import type { AlertStore } from "../store/alert-store"; +import { StoreContext } from "../providers/store-provider"; + +export const useAlertStore = <T>(selector: (store: AlertStore) => T): T => { + const storeContext = useContext(StoreContext); + + if (!storeContext) { + throw new Error("useAlertStore must be used within StoreProvider"); + } + + return useStore(storeContext.alertStore, selector); +}; diff --git a/apps/cm/src/shared/lib/use-attachment-store.ts b/apps/cm/src/shared/lib/use-attachment-store.ts new file mode 100644 index 000000000..285699cc6 --- /dev/null +++ b/apps/cm/src/shared/lib/use-attachment-store.ts @@ -0,0 +1,14 @@ +import { useStore } from "zustand"; +import { useContext } from "react"; +import type { AttachmentStore } from "../store/attachment-store"; +import { StoreContext } from "../providers/store-provider"; + +export const useAttachmentStore = <T>( + selector: (store: AttachmentStore) => T, +): T => { + const store = useContext(StoreContext); + if (!store) { + throw new Error("useAttachmentStore must be used within StoreProvider"); + } + return useStore(store.attachmentStore, selector); +}; diff --git a/apps/cm/src/shared/lib/use-data-table.tsx b/apps/cm/src/shared/lib/use-data-table.tsx new file mode 100644 index 000000000..51638f746 --- /dev/null +++ b/apps/cm/src/shared/lib/use-data-table.tsx @@ -0,0 +1,42 @@ +import type { HTMLAttributes } from "react"; +import type { UseQueryResult } from "@tanstack/react-query"; +import { useReactTable, type TableOptions } from "@tanstack/react-table"; +import { DataTable } from "@common/components"; +import { NoData } from "../ui/no-data"; +import type { PageableList } from "../model"; +import { matchQueryStatus } from "./match-query-status"; + +type UseDataTableOptions<T> = { + query: UseQueryResult<PageableList<T>>; + tableOptions: Omit<TableOptions<T>, "data" | "rowCount">; + dataTableOptions?: DataTableOptions<T>; +}; + +type DataTableOptions<T> = { + variant?: "default" | "secondary" | "line"; + className?: HTMLAttributes<HTMLTableElement>["className"]; + viewPagination?: boolean; + onRowClick?: (row: T) => void; +}; + +export const useDataTable = <T,>({ + query, + tableOptions, + dataTableOptions, +}: UseDataTableOptions<T>) => { + const table = useReactTable({ + ...tableOptions, + data: query.data?.content ?? [], + rowCount: query.data?.totalElements ?? 0, + }); + + return { + tableComponent: matchQueryStatus(query, { + Empty: <NoData />, + Success: () => { + return <DataTable table={table} {...dataTableOptions} />; + }, + }), + tableInstance: table, + }; +}; diff --git a/apps/cm/src/shared/lib/use-menu-store.ts b/apps/cm/src/shared/lib/use-menu-store.ts new file mode 100644 index 000000000..66e41c76c --- /dev/null +++ b/apps/cm/src/shared/lib/use-menu-store.ts @@ -0,0 +1,14 @@ +import { useStore } from "zustand"; +import { useContext } from "react"; +import type { MenuStore } from "../store/menu-store"; +import { StoreContext } from "../providers/store-provider"; + +export const useMenuStore = <T>(selector: (store: MenuStore) => T): T => { + const storeContext = useContext(StoreContext); + + if (!storeContext) { + throw new Error("useMenuStore must be used within StoreProvider"); + } + + return useStore(storeContext.menuStore, selector); +}; diff --git a/apps/cm/src/shared/lib/use-mutation-wrapper.tsx b/apps/cm/src/shared/lib/use-mutation-wrapper.tsx new file mode 100644 index 000000000..cea1a8f83 --- /dev/null +++ b/apps/cm/src/shared/lib/use-mutation-wrapper.tsx @@ -0,0 +1,29 @@ +import { AxiosError } from "axios"; +import { useMutation, type UseMutationOptions } from "@tanstack/react-query"; +import { useAlertStore } from "./use-alert-store"; + +export const useMutationWrapper = < + TData = unknown, + TError = unknown, + TVariables = void, + TContext = unknown, +>( + mutationOptions: UseMutationOptions<TData, TError, TVariables, TContext>, +) => { + const alert = useAlertStore((state) => state.setMessage); + return useMutation({ + ...mutationOptions, + onError: (error) => { + let errorMessage = ""; + + if (error instanceof AxiosError) { + if (error.response?.data?.message) + errorMessage += `${error.response.data.message}\n`; + if (error.response?.data?.errors[0]?.message) + errorMessage += `${error.response.data.errors[0].message}\n`; + } + + alert(`${errorMessage}`); + }, + }); +}; diff --git a/apps/cm/src/shared/lib/use-prompt.tsx b/apps/cm/src/shared/lib/use-prompt.tsx new file mode 100644 index 000000000..f36858eb0 --- /dev/null +++ b/apps/cm/src/shared/lib/use-prompt.tsx @@ -0,0 +1,26 @@ +import { useContext } from "react"; +import { PromptContext } from "../providers/prompt-provider"; + +export const usePrompt = () => { + const { message, resolve, setMessage, setResolve } = + useContext(PromptContext); + + const prompt = (message: string) => { + setMessage(message); + return new Promise<{ resolved: boolean; value?: string }>((resolve) => { + setResolve(() => resolve); + }); + }; + + const onSubmit = (value: string) => { + resolve?.({ resolved: true, value }); + setMessage(""); + }; + + const onCancel = () => { + resolve?.({ resolved: false }); + setMessage(""); + }; + + return { message, isOpen: !!message, prompt, onSubmit, onCancel }; +}; diff --git a/apps/cm/src/shared/lib/use-select-prompt.tsx b/apps/cm/src/shared/lib/use-select-prompt.tsx new file mode 100644 index 000000000..357be7a36 --- /dev/null +++ b/apps/cm/src/shared/lib/use-select-prompt.tsx @@ -0,0 +1,48 @@ +import { useContext, useEffect } from "react"; +import { PromptContext } from "../providers/prompt-provider"; + +type SelectData = { + label: string; + value: string; +}; + +export const useSelectPrompt = (data?: SelectData[]) => { + const { + selectData, + selectionGuide, + resolve, + setResolve, + setSelectData, + setSelectionGuide, + } = useContext(PromptContext); + + const prompt = (message: string) => { + setSelectionGuide(message); + return new Promise<{ resolved: boolean; value?: string }>((resolve) => { + setResolve(() => resolve); + }); + }; + + const onSubmit = (value: string) => { + resolve?.({ resolved: true, value }); + setSelectionGuide(""); + }; + + const onCancel = () => { + resolve?.({ resolved: false }); + setSelectionGuide(""); + }; + + useEffect(() => { + if (data) setSelectData(data); + }, [data]); + + return { + selectData, + selectionGuide, + isOpen: !!selectionGuide, + prompt, + onSubmit, + onCancel, + }; +}; diff --git a/apps/cm/src/shared/lib/use-tus.ts b/apps/cm/src/shared/lib/use-tus.ts new file mode 100644 index 000000000..9d4bc7c00 --- /dev/null +++ b/apps/cm/src/shared/lib/use-tus.ts @@ -0,0 +1,90 @@ +import { useEffect, useState } from "react"; +import { type HttpResponse, Upload } from "tus-js-client"; +import { AUTH_USER_ID, CLAIM_NAME, ENDPOINT } from "../config"; +import { useAttachmentStore } from "./use-attachment-store"; +import { useAlertStore } from "./use-alert-store"; +import { getCookie } from "./cookie"; + +type TusProps = { + accept?: string; +}; + +export const useTus = ({ accept }: TusProps = {}) => { + const alert = useAlertStore((state) => state.setMessage); + const { attachmentFileCode, setAttachmentFileCode } = useAttachmentStore( + (state) => state, + ); + + const [file, setFile] = useState<File | null>(null); + const [upload, setUpload] = useState<Upload | null>(null); + const [response, setResponse] = useState<HttpResponse | null>(null); + const [progress, setProgress] = useState<number>(0); + const [isValid, setIsValid] = useState<boolean>(false); + + const metadata = { + filename: file?.name ?? "", + filetype: file?.type ?? "", + atflCd: attachmentFileCode, + }; + + const validFileType = (file: File) => { + const allowedExtensions = accept?.split(",") ?? []; + const fileName = file.name; + const fileExtension = fileName + .substring(fileName.lastIndexOf(".")) + .toLowerCase(); + + if (!allowedExtensions.includes(fileExtension)) { + alert("파일 형식이 올바르지 않습니다."); + setIsValid(false); + return false; + } + + setIsValid(true); + return true; + }; + + const createUpload = () => { + return new Upload(file!, { + endpoint: `${ENDPOINT.ATTACH_SERVICE.TUS_UPLOAD}`, + chunkSize: 10 * 1024 * 1024, + headers: { + [CLAIM_NAME]: getCookie(CLAIM_NAME) ?? "", + [AUTH_USER_ID]: getCookie(AUTH_USER_ID) ?? "", + }, + metadata, + onError(error) { + throw new Error(`Failed because: ${error}`); + }, + onProgress(bytesUploaded, bytesTotal) { + const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2); + setProgress(parseInt(percentage)); + }, + onAfterResponse(req, res) { + const fileInfo = res.getHeader("X-File-Info"); + if (fileInfo === undefined || fileInfo === null) return; + + setAttachmentFileCode(JSON.parse(fileInfo)?.atflCd ?? ""); + setResponse(res); + }, + }); + }; + + useEffect(() => { + if (!file) return; + if (!validFileType(file)) return; + + const upload = createUpload(); + upload.start(); + setUpload(upload); + }, [file]); + + return { + file, + upload, + response, + progress, + isValid, + setFile, + }; +}; diff --git a/apps/cm/src/shared/lib/use-user-store.ts b/apps/cm/src/shared/lib/use-user-store.ts new file mode 100644 index 000000000..748caed4c --- /dev/null +++ b/apps/cm/src/shared/lib/use-user-store.ts @@ -0,0 +1,14 @@ +import { useStore } from "zustand"; +import { useContext } from "react"; +import type { UserStore } from "../store/user-store"; +import { StoreContext } from "../providers/store-provider"; + +export const useUserStore = <T>(selector: (store: UserStore) => T): T => { + const storeContext = useContext(StoreContext); + + if (!storeContext) { + throw new Error("useUserStore must be used within StoreProvider"); + } + + return useStore(storeContext.userStore, selector); +}; diff --git a/apps/cm/src/shared/model/api-interface.ts b/apps/cm/src/shared/model/api-interface.ts new file mode 100644 index 000000000..8218bfb0d --- /dev/null +++ b/apps/cm/src/shared/model/api-interface.ts @@ -0,0 +1,34 @@ +interface SortConfig { + empty: boolean; + sorted: boolean; + unsorted: boolean; +} + +interface PageableConfig { + sort: SortConfig; + offset: number; + pageNumber: number; + pageSize: number; + paged: boolean; + unpaged: boolean; +} + +export interface PageableList<T> { + content: T[]; + pageable: PageableConfig; + sort: SortConfig; + totalPages: number; + totalElements: number; + number: number; + numberOfElements: number; + size: number; + first: boolean; + last: boolean; + empty: boolean; +} + +export interface PageableParams { + page?: number; + size?: number; + sort?: string; +} diff --git a/apps/cm/src/shared/model/index.ts b/apps/cm/src/shared/model/index.ts new file mode 100644 index 000000000..cf589d200 --- /dev/null +++ b/apps/cm/src/shared/model/index.ts @@ -0,0 +1 @@ +export * from "./api-interface"; diff --git a/apps/cm/src/shared/providers/index.ts b/apps/cm/src/shared/providers/index.ts new file mode 100644 index 000000000..fa8320fe7 --- /dev/null +++ b/apps/cm/src/shared/providers/index.ts @@ -0,0 +1,2 @@ +export { StoreProvider } from "./store-provider"; +export { PromptProvider } from "./prompt-provider"; diff --git a/apps/cm/src/shared/providers/prompt-provider.tsx b/apps/cm/src/shared/providers/prompt-provider.tsx new file mode 100644 index 000000000..71b86388c --- /dev/null +++ b/apps/cm/src/shared/providers/prompt-provider.tsx @@ -0,0 +1,61 @@ +import { createContext, useState } from "react"; + +type SelectData = { + label: string; + value: string; +}; + +interface PromptContext { + message?: string; + selectData?: SelectData[]; + selectionGuide?: string; + resolve?: ({ + resolved, + value, + }: { + resolved: boolean; + value?: string; + }) => void; + setMessage: (message: string) => void; + setSelectData: (selectData: SelectData[]) => void; + setSelectionGuide: (message: string) => void; + setResolve: (resolve: () => void) => void; +} + +export const PromptContext = createContext<PromptContext>({ + message: "", + selectData: [], + selectionGuide: "", + resolve() {}, + setMessage() {}, + setSelectData() {}, + setSelectionGuide() {}, + setResolve() {}, +}); + +export const PromptProvider = ({ children }: { children: React.ReactNode }) => { + const [message, setMessage] = useState<string>(); + const [selectData, setSelectData] = useState<SelectData[]>([]); + const [selectionGuide, setSelectionGuide] = useState<string>(); + const [resolve, setResolve] = + useState< + ({ resolved, value }: { resolved: boolean; value?: string }) => void + >(); + + return ( + <PromptContext.Provider + value={{ + message, + selectData, + selectionGuide, + resolve, + setMessage, + setSelectData, + setSelectionGuide, + setResolve, + }} + > + {children} + </PromptContext.Provider> + ); +}; diff --git a/apps/cm/src/shared/providers/store-provider.tsx b/apps/cm/src/shared/providers/store-provider.tsx new file mode 100644 index 000000000..a0ec17b61 --- /dev/null +++ b/apps/cm/src/shared/providers/store-provider.tsx @@ -0,0 +1,38 @@ +"use client"; + +import { createContext, useRef } from "react"; +import { + createAlertStore, + createAttachmentStore, + createMenuStore, + createUserStore, +} from "../store"; + +type StoreContextType = { + alertStore: ReturnType<typeof createAlertStore>; + attachmentStore: ReturnType<typeof createAttachmentStore>; + menuStore: ReturnType<typeof createMenuStore>; + userStore: ReturnType<typeof createUserStore>; +}; + +export const StoreContext = createContext<StoreContextType | undefined>( + undefined, +); + +export const StoreProvider = ({ children }: { children: React.ReactNode }) => { + const storeRef = useRef<StoreContextType | null>(null); + if (storeRef.current === null) { + storeRef.current = { + alertStore: createAlertStore(), + attachmentStore: createAttachmentStore(), + menuStore: createMenuStore(), + userStore: createUserStore(), + }; + } + + return ( + <StoreContext.Provider value={storeRef.current}> + {children} + </StoreContext.Provider> + ); +}; diff --git a/apps/cm/src/shared/store/alert-store.ts b/apps/cm/src/shared/store/alert-store.ts new file mode 100644 index 000000000..3bba65848 --- /dev/null +++ b/apps/cm/src/shared/store/alert-store.ts @@ -0,0 +1,25 @@ +import { createStore } from "zustand/vanilla"; + +export type AlertState = { + message: string; + callback?: () => void; +}; + +export type AlertActions = { + setMessage: (message: string, callback?: () => void) => void; +}; + +export type AlertStore = AlertState & AlertActions; + +export const defaultInitState: AlertState = { + message: "", + callback: undefined, +}; + +export const createAlertStore = (initState: AlertState = defaultInitState) => { + return createStore<AlertStore>()((set) => ({ + ...initState, + setMessage: (message: string, callback?: () => void) => + set(() => ({ message, callback })), + })); +}; diff --git a/apps/cm/src/shared/store/attachment-store.ts b/apps/cm/src/shared/store/attachment-store.ts new file mode 100644 index 000000000..faa700949 --- /dev/null +++ b/apps/cm/src/shared/store/attachment-store.ts @@ -0,0 +1,25 @@ +import { createStore } from "zustand/vanilla"; + +export type AttachmentState = { + attachmentFileCode: string; +}; + +export type AttachmentActions = { + setAttachmentFileCode: (attachmentFileCode: string) => void; +}; + +export type AttachmentStore = AttachmentState & AttachmentActions; + +export const defaultInitState: AttachmentState = { + attachmentFileCode: "", +}; + +export const createAttachmentStore = ( + initState: AttachmentState = defaultInitState, +) => { + return createStore<AttachmentStore>()((set) => ({ + ...initState, + setAttachmentFileCode: (attachmentFileCode: string) => + set({ attachmentFileCode }), + })); +}; diff --git a/apps/cm/src/shared/store/index.ts b/apps/cm/src/shared/store/index.ts new file mode 100644 index 000000000..a41d6f928 --- /dev/null +++ b/apps/cm/src/shared/store/index.ts @@ -0,0 +1,4 @@ +export { createAlertStore } from "./alert-store"; +export { createAttachmentStore } from "./attachment-store"; +export { createMenuStore, type BbsType } from "./menu-store"; +export { createUserStore, type IUserInfo } from "./user-store"; diff --git a/apps/cm/src/shared/store/menu-store.ts b/apps/cm/src/shared/store/menu-store.ts new file mode 100644 index 000000000..8536011ee --- /dev/null +++ b/apps/cm/src/shared/store/menu-store.ts @@ -0,0 +1,93 @@ +import { createStore } from "zustand/vanilla"; + +export const BBS_TYPE = { + BBSNOTICE: "BBSNOTICE", + BBSNORMAL: "BBSNORMAL", + BBSFAQ: "BBSFAQ", + BBSIMAGE: "BBSIMAGE", + BBSMOVIE: "BBSMOVIE", +} as const; + +export type BbsType = (typeof BBS_TYPE)[keyof typeof BBS_TYPE]; + +export interface IBbs { + bbsId: number; + bbsTypeCd: BbsType; + bbsTypeNm: string; + bbsNm: string; + bbsExpln: string; + rfrncUseYn: string; + atflUseYn: string; + atflMaxCnt: number; + atflMaxFileSz: number; + ansUseYn: string; + ansUseAuthrt: string; + cmntUseYn: string; + dgstfnEvlUseYn: string; + smsUseYn: string; + upndFixUseYn: string; + pstgPrdUseYn: string; + popupUseYn: string; + delYn: string; + useYn: string; + mdfcnDt: string; + mdfrNm: string; +} + +interface IMenu { + menuCd: number; + menuKornNm: string; + menuEngNm: string; + parentId: number | null; + sortSeq: number; + iconNm?: string; + children: IMenu[] | null; + levelNo: number; + urlPath: string; + menuLnkgTypeCd: string; + menuLnkgSn: number; + menuPath: string; + qrcd: string; + useYn: string; + otptYn: string; + newWndwYn: string; + requiredUrlPath: boolean; +} + +interface IAuthority { + mngAuthrtYn: string; + inqAuthrtYn: string; + regAuthrtYn: string; + mdfcnAuthrtYn: string; + delAuthrtYn: string; +} + +export type MenuState = { + bbsInfo: IBbs | null; + currentMenuInfo: IMenu | null; + pageMenuAuthority: IAuthority | null; +}; + +export type MenuActions = { + setBbsInfo: (bbs: IBbs) => void; + setCurrentMenuInfo: (menu: IMenu) => void; + setPageMenuAuthority: (authority: IAuthority) => void; +}; + +export type MenuStore = MenuState & MenuActions; + +export const defaultInitState: MenuState = { + currentMenuInfo: null, + bbsInfo: null, + pageMenuAuthority: null, +}; + +export const createMenuStore = (initState: MenuState = defaultInitState) => { + return createStore<MenuStore>()((set) => ({ + ...initState, + setBbsInfo: (bbs: IBbs) => set({ bbsInfo: bbs }), + setCurrentMenuInfo: (menu: IMenu) => set({ currentMenuInfo: menu }), + setPageMenuAuthority: (authority: IAuthority) => + set({ pageMenuAuthority: authority }), + })); +}; diff --git a/apps/cm/src/shared/store/user-store.ts b/apps/cm/src/shared/store/user-store.ts new file mode 100644 index 000000000..65d897cf1 --- /dev/null +++ b/apps/cm/src/shared/store/user-store.ts @@ -0,0 +1,57 @@ +import { createStore } from "zustand/vanilla"; + +export interface IUserInfo { + regDt: string; + mdfcnDt: string; + rgtr: string; + mdfr: string; + adminRoleYn: string; + userUnqId: string; + userId: string; + userName: string; + email: string; + encryptedPassword: string; + refreshToken: string; + userStateCode: string; + lastLoginDate: string; + loginFailCount: number; + pswdHnt: string; + pswdAns: string; + mphn: string; + telno: string; + zip: string; + addr: string; + daddr: string; + laeSeCd: string; + ogdpSeCd: string; + aprvYn: string; + autzrId: string; + expryYmd: string; + lastPswdChgDt: string; + googleId: string; + kakaoId: string; + naverId: string; + isSocialUser: boolean; + hasPassword: boolean; +} + +export type UserState = { + userInfo: IUserInfo | null; +}; + +export type UserActions = { + setUserInfo: (userInfo: IUserInfo | null) => void; +}; + +export type UserStore = UserState & UserActions; + +export const defaultInitState: UserState = { + userInfo: null, +}; + +export const createUserStore = (initState: UserState = defaultInitState) => { + return createStore<UserStore>()((set) => ({ + ...initState, + setUserInfo: (userInfo: IUserInfo | null) => set(() => ({ userInfo })), + })); +}; diff --git a/apps/cm/src/shared/ui/alert-dialog.tsx b/apps/cm/src/shared/ui/alert-dialog.tsx new file mode 100644 index 000000000..6160d5301 --- /dev/null +++ b/apps/cm/src/shared/ui/alert-dialog.tsx @@ -0,0 +1,34 @@ +import { + Dialog, + DialogContent, + DialogFooter, + DialogClose, + Button, +} from "@common/components"; +import { useAlertStore } from "../lib/use-alert-store"; + +function AlertDialog() { + const { message, callback, setMessage } = useAlertStore((state) => state); + const handleOpenChange = () => { + setMessage(""); + callback?.(); + }; + return ( + <Dialog open={!!message} onOpenChange={handleOpenChange}> + <DialogContent aria-describedby={undefined}> + <div className="py-10"> + <p className="whitespace-pre-line text-center text-[1.4rem] text-foreground"> + {message} + </p> + </div> + <DialogFooter className="!justify-center"> + <DialogClose asChild> + <Button>확인</Button> + </DialogClose> + </DialogFooter> + </DialogContent> + </Dialog> + ); +} + +export { AlertDialog }; diff --git a/apps/cm/src/shared/ui/confirm-dialog.tsx b/apps/cm/src/shared/ui/confirm-dialog.tsx new file mode 100644 index 000000000..6a4996bfb --- /dev/null +++ b/apps/cm/src/shared/ui/confirm-dialog.tsx @@ -0,0 +1,48 @@ +import { useConfirm } from "@frontend-opensource/use-react-hooks"; +import { + Dialog, + DialogContent, + DialogFooter, + DialogClose, + Button, + type ButtonProps, +} from "@common/components"; + +type ConfirmDialogProps = { + isOpen?: boolean; + confirmButtonProps?: ButtonProps & { label?: string }; + cancelButtonProps?: ButtonProps & { label?: string }; +}; + +function ConfirmDialog({ + isOpen, + confirmButtonProps, + cancelButtonProps, +}: ConfirmDialogProps) { + const { message, isOpen: isGlobalOpen, onConfirm, onCancel } = useConfirm(); + return ( + <Dialog open={isOpen ?? isGlobalOpen} onOpenChange={onCancel}> + <DialogContent aria-describedby={undefined}> + <div className="py-10"> + <p className="whitespace-pre-line text-center text-[1.4rem] text-foreground"> + {message} + </p> + </div> + <DialogFooter className="!justify-center"> + <DialogClose asChild> + <Button onClick={onConfirm} {...confirmButtonProps}> + {confirmButtonProps?.label ?? "확인"} + </Button> + </DialogClose> + <DialogClose asChild> + <Button onClick={onCancel} color="white" {...cancelButtonProps}> + {cancelButtonProps?.label ?? "취소"} + </Button> + </DialogClose> + </DialogFooter> + </DialogContent> + </Dialog> + ); +} + +export { ConfirmDialog }; diff --git a/apps/cm/src/shared/ui/form.tsx b/apps/cm/src/shared/ui/form.tsx new file mode 100644 index 000000000..bd579d263 --- /dev/null +++ b/apps/cm/src/shared/ui/form.tsx @@ -0,0 +1,175 @@ +import * as React from "react"; +import * as LabelPrimitive from "@radix-ui/react-label"; +import { Slot } from "@radix-ui/react-slot"; +import { + Controller, + FormProvider, + useFormContext, + type ControllerProps, + type FieldPath, + type FieldValues, +} from "react-hook-form"; +import { cn, Label } from "@common/components"; + +const Form = FormProvider; + +type FormFieldContextValue< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>, +> = { + name: TName; +}; + +const FormFieldContext = React.createContext<FormFieldContextValue>( + {} as FormFieldContextValue, +); + +const FormField = < + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>, +>({ + ...props +}: ControllerProps<TFieldValues, TName>) => { + return ( + <FormFieldContext.Provider value={{ name: props.name }}> + <Controller {...props} /> + </FormFieldContext.Provider> + ); +}; + +const useFormField = () => { + const fieldContext = React.useContext(FormFieldContext); + const itemContext = React.useContext(FormItemContext); + const { getFieldState, formState } = useFormContext(); + + const fieldState = getFieldState(fieldContext.name, formState); + + if (!fieldContext) { + throw new Error("useFormField should be used within <FormField>"); + } + + 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<FormItemContextValue>( + {} as FormItemContextValue, +); + +const FormItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes<HTMLDivElement> +>(({ className, ...props }, ref) => { + const id = React.useId(); + + return ( + <FormItemContext.Provider value={{ id }}> + <div ref={ref} className={cn("space-y-2", className)} {...props} /> + </FormItemContext.Provider> + ); +}); +FormItem.displayName = "FormItem"; + +const FormLabel = React.forwardRef< + React.ElementRef<typeof LabelPrimitive.Root>, + React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> +>(({ className, ...props }, ref) => { + const { error, formItemId } = useFormField(); + + return ( + <Label + ref={ref} + className={cn(error && "text-destructive", className)} + htmlFor={formItemId} + {...props} + /> + ); +}); +FormLabel.displayName = "FormLabel"; + +const FormControl = React.forwardRef< + React.ElementRef<typeof Slot>, + React.ComponentPropsWithoutRef<typeof Slot> +>(({ ...props }, ref) => { + const { error, formItemId, formDescriptionId, formMessageId } = + useFormField(); + + return ( + <Slot + ref={ref} + id={formItemId} + aria-describedby={ + !error + ? `${formDescriptionId}` + : `${formDescriptionId} ${formMessageId}` + } + aria-invalid={!!error} + {...props} + /> + ); +}); +FormControl.displayName = "FormControl"; + +const FormDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes<HTMLParagraphElement> +>(({ className, ...props }, ref) => { + const { formDescriptionId } = useFormField(); + + return ( + <p + ref={ref} + id={formDescriptionId} + className={cn("text-[0.8rem] text-muted-foreground", className)} + {...props} + /> + ); +}); +FormDescription.displayName = "FormDescription"; + +const FormMessage = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes<HTMLParagraphElement> +>(({ className, children, ...props }, ref) => { + const { error, formMessageId } = useFormField(); + const body = error ? String(error?.message ?? "") : children; + + if (!body) { + return null; + } + + return ( + <p + ref={ref} + id={formMessageId} + className={cn("text-[1rem] font-medium text-destructive", className)} + {...props} + > + {body} + </p> + ); +}); +FormMessage.displayName = "FormMessage"; + +export { + useFormField, + Form, + FormItem, + FormLabel, + FormControl, + FormDescription, + FormMessage, + FormField, +}; diff --git a/apps/cm/src/shared/ui/grid-view-data-table.tsx b/apps/cm/src/shared/ui/grid-view-data-table.tsx new file mode 100644 index 000000000..1005d4951 --- /dev/null +++ b/apps/cm/src/shared/ui/grid-view-data-table.tsx @@ -0,0 +1,158 @@ +import type { HTMLAttributes } from "react"; +import { + flexRender, + type RowData, + type Table as TableInstance, +} from "@tanstack/react-table"; +import { + ChevronLeftIcon, + ChevronRightIcon, + DoubleArrowLeftIcon, + DoubleArrowRightIcon, +} from "@radix-ui/react-icons"; +import { Button, Checkbox, Label, cn } from "@common/components"; + +declare module "@tanstack/react-table" { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + interface ColumnMeta<TData extends RowData, TValue> { + align?: "left" | "center" | "right"; + rowSpan?: number; + } +} + +type GridViewDataTableProps<T> = { + table: TableInstance<T>; + variant?: "default" | "secondary" | "line"; + className?: HTMLAttributes<HTMLTableElement>["className"]; + viewPagination?: boolean; + onRowClick?: (row: T) => void; +}; + +function GridViewDataTable<T>({ + table, + className, + viewPagination, + onRowClick, +}: GridViewDataTableProps<T>) { + return ( + <div className="bg-secondary-background pb-10"> + <div className="flex items-center gap-2 rounded-sm rounded-bl-none rounded-br-none border border-border bg-background p-4"> + <Checkbox + id="all-select" + checked={table.getIsAllPageRowsSelected()} + onClick={(e) => e.stopPropagation()} + onCheckedChange={(checked) => + table.toggleAllPageRowsSelected(!!checked) + } + /> + <Label htmlFor="all-select" className="text-2xl"> + 전체선택 + </Label> + </div> + <div className={cn("w-full p-4", className)}> + <div className="grid grid-cols-5 gap-6"> + {table.getRowModel().rows.map((row) => ( + <div + key={row.id} + onClick={() => onRowClick?.(row.original)} + className={cn( + "overflow-hidden rounded-md border border-border bg-background p-4 shadow-md", + onRowClick && "cursor-pointer hover:bg-accent", + )} + > + {row.getVisibleCells().map((cell) => { + const { meta } = cell.column.columnDef; + return ( + <div key={cell.id} {...meta}> + {flexRender(cell.column.columnDef.cell, cell.getContext())} + </div> + ); + })} + </div> + ))} + </div> + </div> + {viewPagination && <Pagination table={table} />} + </div> + ); +} + +function Pagination<T>({ table }: { table: TableInstance<T> }) { + const pageCount = table.getPageCount(); + const currentPage = table.getState().pagination.pageIndex; + const maxVisiblePages = 10; // 한 번에 보여줄 최대 페이지 수 + + let startPage = Math.max(0, currentPage - maxVisiblePages / 2); // 시작 페이지 + const endPage = Math.min(pageCount, startPage + maxVisiblePages); // 끝 페이지 + + if (endPage - startPage < maxVisiblePages) { + startPage = Math.max(0, endPage - maxVisiblePages); + } + + const pageNumbers = Array(endPage - startPage) + .fill(0) + .map((_, i) => startPage + i); + + return ( + <div className="mt-[24px] flex items-center justify-center space-x-2"> + <Button + variant="ghost" + color="white" + className="hidden size-10 p-0 lg:flex" + onClick={() => table.setPageIndex(0)} + disabled={!table.getCanPreviousPage()} + > + <span className="sr-only">첫 페이지로</span> + <DoubleArrowLeftIcon className="size-4" /> + </Button> + <Button + variant="ghost" + color="white" + className="size-10 p-0" + onClick={() => table.previousPage()} + disabled={!table.getCanPreviousPage()} + > + <span className="sr-only">이전 페이지로</span> + <ChevronLeftIcon className="size-4" /> + </Button> + <div className="flex items-center justify-center text-sm font-medium"> + {pageNumbers.map((pageNumber) => ( + <Button + key={pageNumber} + variant="ghost" + className={cn( + "inline-block size-10 !bg-transparent p-0 text-foreground hover:!bg-accent", + currentPage === pageNumber && + "!bg-primary !font-bold !text-primary-foreground hover:!bg-primary", + )} + onClick={() => table.setPageIndex(pageNumber)} + > + {pageNumber + 1} + </Button> + ))} + </div> + <Button + variant="ghost" + color="white" + className="size-10 p-0" + onClick={() => table.nextPage()} + disabled={!table.getCanNextPage()} + > + <span className="sr-only">다음 페이지로</span> + <ChevronRightIcon className="size-4" /> + </Button> + <Button + variant="ghost" + color="white" + className="hidden size-10 p-0 lg:flex" + onClick={() => table.setPageIndex(table.getPageCount() - 1)} + disabled={!table.getCanNextPage()} + > + <span className="sr-only">마지막 페이지로</span> + <DoubleArrowRightIcon className="size-4" /> + </Button> + </div> + ); +} + +export { GridViewDataTable }; diff --git a/apps/cm/src/shared/ui/info-tooltip.tsx b/apps/cm/src/shared/ui/info-tooltip.tsx new file mode 100644 index 000000000..2c43ecf9c --- /dev/null +++ b/apps/cm/src/shared/ui/info-tooltip.tsx @@ -0,0 +1,23 @@ +import { Tooltip, TooltipContent, TooltipTrigger } from "./tooltip"; + +function InfoTooltip({ text }: { text: string }) { + return ( + <Tooltip> + <TooltipTrigger asChild> + <i className="diveicon di-info-circle" /> + </TooltipTrigger> + <TooltipContent> + <p> + {text.split("\n").map((line, idx) => ( + <span key={idx}> + {line} + {idx !== text.split("\n").length - 1 && <br />} + </span> + ))} + </p> + </TooltipContent> + </Tooltip> + ); +} + +export { InfoTooltip }; diff --git a/apps/cm/src/shared/ui/input-date-range-picker.tsx b/apps/cm/src/shared/ui/input-date-range-picker.tsx new file mode 100644 index 000000000..1ee2bc5e1 --- /dev/null +++ b/apps/cm/src/shared/ui/input-date-range-picker.tsx @@ -0,0 +1,47 @@ +import { InputDatePicker } from "@common/components"; +import { useEffect } from "react"; +import { useAlertStore } from "../lib"; + +type DateRange = { + from?: Date; + to?: Date; +}; + +type InputDateRangePickerProps = { + dateRange: DateRange; + setDateRange: (dateRange: DateRange) => void; +}; + +function InputDateRangePicker({ + dateRange, + setDateRange, +}: InputDateRangePickerProps) { + const alert = useAlertStore((state) => state.setMessage); + + useEffect(() => { + if (dateRange.from && dateRange.to && dateRange.from > dateRange.to) { + alert("종료일이 시작일보다 이전일 수 없습니다."); + setDateRange({ ...dateRange, to: dateRange.from }); + } + }, [dateRange]); + + return ( + <> + <InputDatePicker + value={dateRange.from} + onChange={(date) => { + setDateRange({ ...dateRange, from: date }); + }} + /> + ~ + <InputDatePicker + value={dateRange.to} + onChange={(date) => { + setDateRange({ ...dateRange, to: date }); + }} + /> + </> + ); +} + +export { InputDateRangePicker }; diff --git a/apps/cm/src/shared/ui/no-data.tsx b/apps/cm/src/shared/ui/no-data.tsx new file mode 100644 index 000000000..b13152dcf --- /dev/null +++ b/apps/cm/src/shared/ui/no-data.tsx @@ -0,0 +1,17 @@ +import { cn } from "@common/components"; + +function NoData({ className }: { className?: string }) { + return ( + <div + className={cn( + "flex h-96 flex-col items-center justify-center gap-4", + className, + )} + > + <i className="diveicon di-info-circle text-3xl" /> + 조회된 데이터가 없습니다. + </div> + ); +} + +export { NoData }; diff --git a/apps/cm/src/shared/ui/page-layout.tsx b/apps/cm/src/shared/ui/page-layout.tsx new file mode 100644 index 000000000..358d3b5db --- /dev/null +++ b/apps/cm/src/shared/ui/page-layout.tsx @@ -0,0 +1,22 @@ +import { PageTitle } from "@common/components"; +import { useMenuStore } from "../lib/use-menu-store"; + +function PageLayout({ children }: { children: React.ReactNode }) { + const currentMenuInfo = useMenuStore((state) => state.currentMenuInfo); + + const menuPaths = currentMenuInfo?.menuPath + ?.split(">") + .map((path) => path.trim()); + + return ( + <div className="h-auto min-h-full bg-container pb-2"> + <PageTitle + title={currentMenuInfo?.menuKornNm ?? ""} + menuPaths={menuPaths ?? []} + /> + {children} + </div> + ); +} + +export { PageLayout }; diff --git a/apps/cm/src/shared/ui/prompt-dialog.tsx b/apps/cm/src/shared/ui/prompt-dialog.tsx new file mode 100644 index 000000000..c7e1ebc57 --- /dev/null +++ b/apps/cm/src/shared/ui/prompt-dialog.tsx @@ -0,0 +1,49 @@ +import { useEffect, useState } from "react"; +import { + Button, + Dialog, + DialogContent, + DialogFooter, + DialogClose, + Input, +} from "@common/components"; +import { usePrompt } from "@/shared/lib/use-prompt"; + +function PromptDialog() { + const { message, isOpen, onSubmit, onCancel } = usePrompt(); + const [value, setValue] = useState(""); + + useEffect(() => { + if (isOpen) setValue(""); + }, [isOpen]); + + return ( + <Dialog open={isOpen} onOpenChange={onCancel}> + <DialogContent aria-describedby={undefined}> + <div className="flex flex-col gap-6 pb-4 pt-8"> + <p className="whitespace-pre-line text-center text-[1.4rem] text-foreground"> + {message} + </p> + <Input + type="text" + value={value} + className="!text-[1.3rem]" + onChange={(e) => setValue(e.target.value)} + /> + </div> + <DialogFooter className="!justify-center"> + <DialogClose asChild> + <Button onClick={() => onSubmit(value)}>확인</Button> + </DialogClose> + <DialogClose asChild> + <Button onClick={onCancel} color="white"> + 취소 + </Button> + </DialogClose> + </DialogFooter> + </DialogContent> + </Dialog> + ); +} + +export { PromptDialog }; diff --git a/apps/cm/src/shared/ui/select-prompt-dialog.tsx b/apps/cm/src/shared/ui/select-prompt-dialog.tsx new file mode 100644 index 000000000..19092c8a1 --- /dev/null +++ b/apps/cm/src/shared/ui/select-prompt-dialog.tsx @@ -0,0 +1,68 @@ +import { useEffect, useState } from "react"; +import { + Button, + Dialog, + DialogContent, + DialogFooter, + DialogClose, + Select, + SelectTrigger, + SelectValue, + SelectContent, + SelectItem, + Textarea, +} from "@common/components"; +import { useSelectPrompt } from "../lib/use-select-prompt"; + +function SelectPromptDialog() { + const { selectData, selectionGuide, isOpen, onSubmit, onCancel } = + useSelectPrompt(); + const [value, setValue] = useState(""); + + useEffect(() => { + if (isOpen) setValue(""); + }, [isOpen]); + + return ( + <Dialog open={isOpen} onOpenChange={onCancel}> + <DialogContent aria-describedby={undefined}> + <div className="flex flex-col gap-6 pb-4 pt-8"> + <p className="whitespace-pre-line text-center text-[1.4rem] text-foreground"> + {selectionGuide} + </p> + <div className="flex flex-col gap-2"> + <Select onValueChange={setValue}> + <SelectTrigger> + <SelectValue placeholder="선택" /> + </SelectTrigger> + <SelectContent> + {selectData?.map((data) => ( + <SelectItem key={data.value} value={data.value}> + {data.label} + </SelectItem> + ))} + </SelectContent> + </Select> + <Textarea + value={value} + className="!text-[1.3rem] !leading-6" + onChange={(e) => setValue(e.target.value)} + /> + </div> + </div> + <DialogFooter className="!justify-center"> + <DialogClose asChild> + <Button onClick={() => onSubmit(value)}>확인</Button> + </DialogClose> + <DialogClose asChild> + <Button onClick={onCancel} color="white"> + 취소 + </Button> + </DialogClose> + </DialogFooter> + </DialogContent> + </Dialog> + ); +} + +export { SelectPromptDialog }; diff --git a/apps/cm/src/shared/ui/skeleton-page.tsx b/apps/cm/src/shared/ui/skeleton-page.tsx new file mode 100644 index 000000000..cf788aca2 --- /dev/null +++ b/apps/cm/src/shared/ui/skeleton-page.tsx @@ -0,0 +1,14 @@ +"use client"; + +import { Skeleton } from "@common/components"; + +function SkeletonPage() { + return ( + <div className="flex flex-col gap-4 p-6"> + <Skeleton className="h-[6rem] rounded-xl" /> + <Skeleton className="h-[60rem] rounded-xl" /> + </div> + ); +} + +export { SkeletonPage }; diff --git a/apps/cm/src/shared/ui/sonner.tsx b/apps/cm/src/shared/ui/sonner.tsx new file mode 100644 index 000000000..f96a98d91 --- /dev/null +++ b/apps/cm/src/shared/ui/sonner.tsx @@ -0,0 +1,25 @@ +"use client"; + +import { useTheme } from "next-themes"; +import { Toaster as Sonner, type ToasterProps } from "sonner"; + +const Toaster = ({ ...props }: ToasterProps) => { + const { theme = "system" } = useTheme(); + + return ( + <Sonner + theme={theme as ToasterProps["theme"]} + className="toaster group" + style={ + { + "--normal-bg": "var(--popover)", + "--normal-text": "var(--popover-foreground)", + "--normal-border": "var(--border)", + } as React.CSSProperties + } + {...props} + /> + ); +}; + +export { Toaster }; diff --git a/apps/cm/src/shared/ui/tooltip.tsx b/apps/cm/src/shared/ui/tooltip.tsx new file mode 100644 index 000000000..c7578a4d9 --- /dev/null +++ b/apps/cm/src/shared/ui/tooltip.tsx @@ -0,0 +1,61 @@ +"use client"; + +import * as React from "react"; +import * as TooltipPrimitive from "@radix-ui/react-tooltip"; + +import { cn } from "@common/components"; + +function TooltipProvider({ + delayDuration = 0, + ...props +}: React.ComponentProps<typeof TooltipPrimitive.Provider>) { + return ( + <TooltipPrimitive.Provider + data-slot="tooltip-provider" + delayDuration={delayDuration} + {...props} + /> + ); +} + +function Tooltip({ + ...props +}: React.ComponentProps<typeof TooltipPrimitive.Root>) { + return ( + <TooltipProvider> + <TooltipPrimitive.Root data-slot="tooltip" {...props} /> + </TooltipProvider> + ); +} + +function TooltipTrigger({ + ...props +}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) { + return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />; +} + +function TooltipContent({ + className, + sideOffset = 0, + children, + ...props +}: React.ComponentProps<typeof TooltipPrimitive.Content>) { + return ( + <TooltipPrimitive.Portal> + <TooltipPrimitive.Content + data-slot="tooltip-content" + sideOffset={sideOffset} + className={cn( + "origin-(--radix-tooltip-content-transform-origin) z-50 w-fit text-balance rounded-md bg-background px-3 py-1.5 text-lg text-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", + className, + )} + {...props} + > + {children} + <TooltipPrimitive.Arrow className="z-50 size-2.5 translate-y-[-50%] rotate-45 rounded-[2px] bg-background fill-background" /> + </TooltipPrimitive.Content> + </TooltipPrimitive.Portal> + ); +} + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }; diff --git a/apps/cm/src/widgets/dnd-tree/index.ts b/apps/cm/src/widgets/dnd-tree/index.ts new file mode 100644 index 000000000..ca1c20f8d --- /dev/null +++ b/apps/cm/src/widgets/dnd-tree/index.ts @@ -0,0 +1,2 @@ +export { DndTree } from "./ui/dnd-tree"; +export { EditableNode } from "./ui/editable-node"; diff --git a/apps/cm/src/widgets/dnd-tree/ui/custom-node.tsx b/apps/cm/src/widgets/dnd-tree/ui/custom-node.tsx new file mode 100644 index 000000000..11defd25f --- /dev/null +++ b/apps/cm/src/widgets/dnd-tree/ui/custom-node.tsx @@ -0,0 +1,105 @@ +import { useEffect, useState } from "react"; +import type { NodeModel, TreeMethods } from "@minoru/react-dnd-treeview"; +import { Button, cn } from "@common/components"; +import { EditableNode } from "./editable-node"; + +interface TreeData extends Record<string, unknown> { + children?: unknown[]; +} + +type CustomNodeProps<T extends TreeData> = { + node: NodeModel<T>; + depth: number; + isOpen: boolean; + isSelected: boolean; + isAdditionalParent: boolean; + treeMethods: TreeMethods | null; + readOnly: boolean; + onToggle: (id: NodeModel["id"]) => void; + onSelect: (node: NodeModel<T>) => void; + updateNodeName: (id: NodeModel["id"], nodeName: string) => Promise<void>; +}; + +function CustomNode<T extends TreeData>({ + node, + depth, + isOpen, + isSelected, + isAdditionalParent, + treeMethods, + readOnly, + onToggle, + onSelect, + updateNodeName, +}: CustomNodeProps<T>) { + const { id, text, data } = node; + const indent = depth * 10 + 5; + + const [editMode, setEditMode] = useState(false); + const [nodeName, setNodeName] = useState(text); + + const handleToggle = () => onToggle(id); + const handleSelect = () => onSelect(node); + + const handleSave = async () => { + await updateNodeName(id, nodeName); + setEditMode(false); + }; + + const handleCancel = () => { + setEditMode(false); + setNodeName(text); + }; + + useEffect(() => { + if (isAdditionalParent) treeMethods?.open(id); + }, [isAdditionalParent]); + + return ( + <div + style={{ paddingInlineStart: indent }} + className={cn( + "flex cursor-pointer items-center justify-between gap-2 rounded-sm p-2 hover:bg-accent", + isSelected && "!bg-[rgba(32,148,250,0.2)]", + !readOnly && "group", + )} + > + {editMode ? ( + <EditableNode + value={nodeName} + onChange={(e) => setNodeName(e.target.value)} + onSave={handleSave} + onCancel={handleCancel} + /> + ) : ( + <> + <div className="flex items-center" onClick={handleSelect}> + {data && data.children && data.children.length > 0 && ( + <i + className={cn( + "diveicon di-arrow-forward mr-2 text-base text-label", + isOpen && "rotate-90", + )} + onClick={(e) => { + e.stopPropagation(); + handleToggle(); + }} + /> + )} + <span className="text-[1.4rem] font-medium text-label">{text}</span> + </div> + <Button + variant="ghost" + size="icon" + className="invisible !bg-transparent group-hover:visible" + onClick={() => setEditMode(true)} + > + <i className="diveicon di-pencil" /> + </Button> + </> + )} + </div> + ); +} + +export { CustomNode }; diff --git a/apps/cm/src/widgets/dnd-tree/ui/dnd-tree.tsx b/apps/cm/src/widgets/dnd-tree/ui/dnd-tree.tsx new file mode 100644 index 000000000..b1509006e --- /dev/null +++ b/apps/cm/src/widgets/dnd-tree/ui/dnd-tree.tsx @@ -0,0 +1,138 @@ +"use client"; + +import React, { type ReactElement, useRef } from "react"; +import { DndProvider } from "react-dnd"; +import { + Tree, + MultiBackend, + getBackendOptions, + type NodeModel, + type TreeMethods, + type DropOptions, + type Classes, +} from "@minoru/react-dnd-treeview"; +import { Button, cn } from "@common/components"; +import { CustomNode } from "./custom-node"; + +interface TreeData extends Record<string, unknown> { + children?: unknown[]; +} + +type EditableNodeProps = { depth: number }; + +type DndTreeProps<T extends TreeData> = { + tree: NodeModel<T>[]; + selectedNodeId?: number; + classes?: { + wrapper?: string; + } & Classes<T>; + renderEditableNode?: (props: EditableNodeProps) => ReactElement; + handleSelectNode?: (node: NodeModel<T>) => void; + handleDropNode?: (newTree: NodeModel<T>[], options: DropOptions<T>) => void; + updateNodeName?: (id: NodeModel["id"], nodeName: string) => Promise<void>; +}; + +function DndTree<T extends TreeData>({ + tree, + selectedNodeId, + classes, + renderEditableNode, + handleSelectNode, + handleDropNode, + updateNodeName, +}: DndTreeProps<T>) { + const treeMethods = useRef<TreeMethods>(null); + + const isAdditionalParent = (node: NodeModel<T>): boolean => { + const additionalNode = tree.find((n) => n.id === -1); + if (!additionalNode) return false; + return additionalNode?.parent === node.id; + }; + + return ( + <> + <div + className={cn( + "max-h-[calc(100vh-33.5rem)] overflow-auto", + classes?.wrapper, + )} + > + <DndProvider backend={MultiBackend} options={getBackendOptions()}> + <Tree + tree={tree} + rootId={0} + ref={treeMethods} + render={(node: NodeModel<T>, { depth, isOpen, onToggle }) => { + if (node.id === -1) + return renderEditableNode?.({ depth }) ?? <></>; + return ( + <CustomNode + node={node} + depth={depth} + treeMethods={treeMethods.current} + isOpen={isOpen} + isSelected={selectedNodeId === node.id} + isAdditionalParent={isAdditionalParent(node)} + readOnly={typeof updateNodeName === "undefined"} + onToggle={onToggle} + onSelect={(node) => handleSelectNode?.(node)} + updateNodeName={(id, nodeName) => + updateNodeName?.(id, nodeName) ?? Promise.resolve() + } + /> + ); + }} + onDrop={(newTree, options) => handleDropNode?.(newTree, options)} + classes={{ + root: "p-4", + container: "flex flex-col", + dropTarget: "!bg-[rgba(32,148,250,0.5)] rounded-sm", + placeholder: "relative", + ...classes, + }} + sort={false} + dropTargetOffset={5} + insertDroppableFirst={false} + canDrop={(_, { dragSource, dropTargetId }) => { + if (dragSource?.parent === dropTargetId) { + return true; + } + }} + placeholderRender={(_, { depth }) => { + return ( + <div + className="absolute right-0 top-0 h-[0.2rem] bg-primary" + style={{ left: depth * 10 + 5 }} + /> + ); + }} + /> + </DndProvider> + </div> + <div className="flex gap-2"> + <Button + color="lightGray" + className="flex-1 items-center px-0" + onClick={() => { + treeMethods.current?.openAll(); + }} + > + <i className="diveicon di-arrows-angle-expand" /> + 전체펼침 + </Button> + <Button + color="lightGray" + className="flex-1 items-center px-0" + onClick={() => { + treeMethods.current?.closeAll(); + }} + > + <i className="diveicon di-arrows-angle-contract" /> + 전체접기 + </Button> + </div> + </> + ); +} + +export { DndTree }; diff --git a/apps/cm/src/widgets/dnd-tree/ui/editable-node.tsx b/apps/cm/src/widgets/dnd-tree/ui/editable-node.tsx new file mode 100644 index 000000000..f2274f4d8 --- /dev/null +++ b/apps/cm/src/widgets/dnd-tree/ui/editable-node.tsx @@ -0,0 +1,44 @@ +import type { ComponentProps } from "react"; +import { Button, Input } from "@common/components"; + +type EditableNodeProps = { + depth?: number; + onSave: () => void; + onCancel: () => void; +} & ComponentProps<typeof Input>; + +function EditableNode({ + depth, + onSave, + onCancel, + ...props +}: EditableNodeProps) { + return ( + <div + className="flex items-center gap-2 rounded-sm bg-accent p-2" + style={{ marginInlineStart: !depth ? 0 : depth * 5 + 5 }} + > + <Input {...props} className="h-[2.5rem] !text-[1.3rem] text-foreground" /> + <div className="flex items-center gap-1"> + <Button + variant="ghost" + size="icon" + className="size-8 !bg-transparent" + onClick={onSave} + > + <i className="diveicon di-check text-2xl" /> + </Button> + <Button + variant="ghost" + size="icon" + className="size-8 !bg-transparent" + onClick={onCancel} + > + <i className="diveicon di-x" /> + </Button> + </div> + </div> + ); +} + +export { EditableNode }; diff --git a/apps/cm/src/widgets/form-wrapper/index.ts b/apps/cm/src/widgets/form-wrapper/index.ts new file mode 100644 index 000000000..aa5addaf9 --- /dev/null +++ b/apps/cm/src/widgets/form-wrapper/index.ts @@ -0,0 +1 @@ +export { FormWrapper } from "./ui/form-wrapper"; diff --git a/apps/cm/src/widgets/form-wrapper/ui/form-wrapper.tsx b/apps/cm/src/widgets/form-wrapper/ui/form-wrapper.tsx new file mode 100644 index 000000000..b275b6a36 --- /dev/null +++ b/apps/cm/src/widgets/form-wrapper/ui/form-wrapper.tsx @@ -0,0 +1,63 @@ +import { useRouter } from "next/navigation"; +import { useConfirm } from "@frontend-opensource/use-react-hooks"; +import { type FieldValues, type UseFormReturn } from "react-hook-form"; +import { Button } from "@common/components"; +import { Form } from "@/shared/ui/form"; + +type FormWrapperProps<T extends FieldValues> = { + form: UseFormReturn<T>; + children: React.ReactNode; + isModifyMode?: boolean; + handleSave: (data: T) => Promise<unknown>; + handleDelete?: () => Promise<unknown>; +}; + +function FormWrapper<T extends FieldValues>({ + form, + children, + isModifyMode, + handleSave, + handleDelete, +}: FormWrapperProps<T>) { + const router = useRouter(); + const { confirm } = useConfirm(); + + const onSubmit = async (data: T) => { + const confirmMessage = isModifyMode + ? "수정하시겠습니까?" + : "저장하시겠습니까?"; + + if (await confirm(confirmMessage)) { + await handleSave(data); + } + }; + + const onDelete = async () => { + if (await confirm("삭제하시겠습니까?")) { + await handleDelete?.(); + } + }; + + return ( + <Form {...form}> + <form onSubmit={form.handleSubmit(onSubmit)}> + {children} + <div className="flex justify-center gap-4 pb-12 pt-10"> + <Button size="lg" color="white" type="button" onClick={router.back}> + 목록 + </Button> + <Button size="lg" type="submit"> + 저장 + </Button> + {isModifyMode && handleDelete && ( + <Button size="lg" color="red" type="button" onClick={onDelete}> + 삭제 + </Button> + )} + </div> + </form> + </Form> + ); +} + +export { FormWrapper }; diff --git a/apps/cm/start_cs.sh b/apps/cm/start_cs.sh new file mode 100644 index 000000000..7fa2c18a7 --- /dev/null +++ b/apps/cm/start_cs.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +PORT=3000 +LOG_FILE="start_cs.log" + +# 1. 기존 포트 사용 프로세스 종료 +PID=$(lsof -t -i :$PORT) +if [ -n "$PID" ]; then + echo "Killing process on port $PORT (PID: $PID)" + kill -9 $PID +fi + +# 2. 백그라운드로 앱 시작 (로그 파일로 리디렉션) +echo "Starting app on port $PORT..." +nohup pnpm start > $LOG_FILE 2>&1 & + +# 3. PID 확인 +sleep 1 +NEW_PID=$(lsof -t -i :$PORT) +if [ -n "$NEW_PID" ]; then + echo "App started successfully (PID: $NEW_PID)" + echo "Logs: tail -f $LOG_FILE" +else + echo "Failed to start app. Check logs: $LOG_FILE" +fi \ No newline at end of file diff --git a/apps/cm/tailwind.config.ts b/apps/cm/tailwind.config.ts new file mode 100644 index 000000000..c7fec33e1 --- /dev/null +++ b/apps/cm/tailwind.config.ts @@ -0,0 +1,27 @@ +import type { Config } from "tailwindcss"; +import tailwindcssAnimate from "tailwindcss-animate"; +import presetConfig from "../../tailwind.config.preset"; + +export default { + presets: [presetConfig], + content: [ + "./src/**/*.{js,ts,jsx,tsx}", + "../../packages/common/components/src/ui/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: { + fontFamily: { + noto: ['"Noto Sans KR"', "sans-serif"], + }, + colors: { + secondary: { + background: "var(--secondary-background)", + }, + }, + boxShadow: { + blur: "0 0 10px -1px rgba(0, 0, 0, 0.06)", + }, + }, + }, + plugins: [tailwindcssAnimate], +} satisfies Config; diff --git a/apps/cm/tsconfig.json b/apps/cm/tsconfig.json new file mode 100644 index 000000000..5b8c29899 --- /dev/null +++ b/apps/cm/tsconfig.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "verbatimModuleSyntax": true, + "strictNullChecks": true, + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "baseUrl": "./src", + "paths": { + "@/*": ["./*"], + "@common/components": ["../../../packages/common/components/src/"], + "@common/config": ["../../../packages/common/config/dist/"], + "@common/network": ["../../../packages/common/network/"] + } + }, + "include": [ + ".eslintrc.*", + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + "**/*.mts", + "**/*.js", + "**/*.cjs", + "**/*.mjs", + "**/*.jsx", + "**/*.json", + ".next/types/**/*.ts" + ], + "exclude": ["**/node_modules", "**/.*/*"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index adb241611..35474c07c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,6 +43,154 @@ importers: specifier: 2.4.2 version: 2.4.2 + apps/cm: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../../packages/common/assets + '@common/components': + specifier: workspace:* + version: link:../../packages/common/components + '@common/config': + specifier: workspace:* + version: link:../../packages/common/config + '@fontsource-variable/noto-sans-kr': + specifier: ^5.2.5 + version: 5.2.5 + '@frontend-opensource/use-react-hooks': + specifier: ^1.1.4 + version: 1.1.4 + '@fullcalendar/core': + specifier: ^6.1.17 + version: 6.1.17 + '@fullcalendar/daygrid': + specifier: ^6.1.17 + version: 6.1.17(@fullcalendar/core@6.1.17) + '@fullcalendar/interaction': + specifier: ^6.1.17 + version: 6.1.17(@fullcalendar/core@6.1.17) + '@fullcalendar/react': + specifier: ^6.1.17 + version: 6.1.17(@fullcalendar/core@6.1.17)(react-dom@18.3.1)(react@18.3.1) + '@fullcalendar/timegrid': + specifier: ^6.1.17 + version: 6.1.17(@fullcalendar/core@6.1.17) + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.54.2) + '@minoru/react-dnd-treeview': + specifier: 3.5.1-alpha.1 + version: 3.5.1-alpha.1(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-icons': + specifier: ^1.3.2 + version: 1.3.2(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.2 + version: 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-tooltip': + specifier: ^1.1.8 + version: 1.1.8(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.67.1 + version: 5.67.1(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.75.5 + version: 5.75.5(@tanstack/react-query@5.67.1)(react@18.3.1) + '@tanstack/react-table': + specifier: ^8.21.2 + version: 8.21.2(react-dom@18.3.1)(react@18.3.1) + '@tinymce/tinymce-react': + specifier: ^6.1.0 + version: 6.1.0(react-dom@18.3.1)(react@18.3.1) + axios: + specifier: ^1.8.1 + version: 1.8.1 + chart.js: + specifier: ^4.4.8 + version: 4.4.8 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + lucide-react: + specifier: ^0.474.0 + version: 0.474.0(react@18.3.1) + next: + specifier: 15.3.0 + version: 15.3.0(react-dom@18.3.1)(react@18.3.1) + next-qrcode: + specifier: ^2.5.1 + version: 2.5.1(react@18.3.1) + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@18.3.1)(react@18.3.1) + react-chartjs-2: + specifier: ^5.3.0 + version: 5.3.0(chart.js@4.4.8)(react@18.3.1) + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@22.13.9)(@types/react@18.3.18)(react@18.3.1) + react-hook-form: + specifier: ^7.54.2 + version: 7.54.2(react@18.3.1) + sonner: + specifier: ^2.0.1 + version: 2.0.1(react-dom@18.3.1)(react@18.3.1) + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + tus-js-client: + specifier: ^4.3.1 + version: 4.3.1 + zod: + specifier: ^3.24.2 + version: 3.24.2 + zustand: + specifier: ^5.0.3 + version: 5.0.3(@types/react@18.3.18)(react@18.3.1) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.0 + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + '@types/node': + specifier: ^22.13.1 + version: 22.13.9 + '@types/webpack': + specifier: ^5.28.5 + version: 5.28.5 + eslint: + specifier: ^9 + version: 9.21.0 + eslint-config-next: + specifier: 15.1.7 + version: 15.1.7(eslint@9.21.0)(typescript@5.6.3) + postcss: + specifier: ^8 + version: 8.5.3 + prettier: + specifier: ^3.4.2 + version: 3.5.2 + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.11(prettier@3.5.2) + steiger: + specifier: ^0.5.5 + version: 0.5.5(typescript@5.6.3) + tailwindcss: + specifier: ^3.4.1 + version: 3.4.17 + typescript: + specifier: ^5 + version: 5.6.3 + apps/common/features: dependencies: '@common/assets': @@ -2558,7 +2706,7 @@ packages: magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.6.3) typescript: 5.6.3 - vite: 6.2.0(@types/node@22.13.5) + vite: 6.2.0(@types/node@22.13.9) dev: true /@jridgewell/gen-mapping@0.3.8: @@ -2649,7 +2797,7 @@ packages: dnd-multi-backend: 8.1.2(dnd-core@16.0.1) framer-motion: 11.18.2(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 - react-dnd: 16.0.1(@types/node@22.13.5)(@types/react@18.3.18)(react@18.3.1) + react-dnd: 16.0.1(@types/node@22.13.9)(@types/react@18.3.18)(react@18.3.1) react-dnd-html5-backend: 16.0.1 react-dnd-touch-backend: 16.0.1 react-dom: 18.3.1(react@18.3.1) @@ -4131,7 +4279,7 @@ packages: browser-assert: 1.2.1 storybook: 8.6.0(prettier@3.5.2) ts-dedent: 2.2.0 - vite: 6.2.0(@types/node@22.13.5) + vite: 6.2.0(@types/node@22.13.9) dev: true /@storybook/components@8.6.0(storybook@8.6.0): @@ -4263,7 +4411,7 @@ packages: resolve: 1.22.10 storybook: 8.6.0(prettier@3.5.2) tsconfig-paths: 4.2.0 - vite: 6.2.0(@types/node@22.13.5) + vite: 6.2.0(@types/node@22.13.9) transitivePeerDependencies: - rollup - supports-color @@ -4893,7 +5041,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.9) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.2.0(@types/node@22.13.5) + vite: 6.2.0(@types/node@22.13.9) transitivePeerDependencies: - supports-color dev: true @@ -9436,7 +9584,7 @@ packages: requiresBuild: true dependencies: color: 4.2.3 - detect-libc: 2.0.3 + detect-libc: 2.0.4 semver: 7.7.1 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.1 @@ -10376,7 +10524,7 @@ packages: debug: 4.4.0 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.6.3) - vite: 6.2.0(@types/node@22.13.5) + vite: 6.2.0(@types/node@22.13.9) transitivePeerDependencies: - supports-color - typescript From def2867c289ec84a77aeeaa7fc9ec47c1c95ab0a Mon Sep 17 00:00:00 2001 From: jyha00 <jyha@mind-one.co.kr> Date: Fri, 1 Aug 2025 14:34:19 +0900 Subject: [PATCH 21/36] =?UTF-8?q?=EC=88=98=EC=9A=94=EC=B2=98=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=ED=86=A0=EC=8A=A4=ED=8A=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/(base-layout)/pages/sdmMng/sdmInfoInsert/page.tsx | 3 ++- apps/dm/components/ui/sdmLoginForm/component.tsx | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/dm/app/(base-layout)/pages/sdmMng/sdmInfoInsert/page.tsx b/apps/dm/app/(base-layout)/pages/sdmMng/sdmInfoInsert/page.tsx index 4efc58cb5..f4f156d2a 100644 --- a/apps/dm/app/(base-layout)/pages/sdmMng/sdmInfoInsert/page.tsx +++ b/apps/dm/app/(base-layout)/pages/sdmMng/sdmInfoInsert/page.tsx @@ -9,7 +9,7 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter, useSearchParams } from "next/navigation"; import { Suspense, useEffect, useState } from "react"; import { FormProvider, useForm, type SubmitHandler } from "react-hook-form"; -import { Toaster } from "react-hot-toast"; +import toast, { Toaster } from "react-hot-toast"; import * as z from "zod"; import SdmLogin from "../sdmLogin/page"; @@ -291,6 +291,7 @@ function SdmInfoInsertContent() { open={!isLogin} onOpenChange={(open) => { if (!open) { + toast.dismiss(); router.push("/"); } }} diff --git a/apps/dm/components/ui/sdmLoginForm/component.tsx b/apps/dm/components/ui/sdmLoginForm/component.tsx index 75852a4da..a69c87541 100644 --- a/apps/dm/components/ui/sdmLoginForm/component.tsx +++ b/apps/dm/components/ui/sdmLoginForm/component.tsx @@ -75,16 +75,19 @@ export function SdmLoginForm() { const initPassword = () => { toast( - () => ( + (t) => ( <div className="flex flex-col items-center"> <div className="text-2xl mb-2"> 관리자(031-0000-0000)에게 비밀번호 초기화 요청을 유선으로 하시기 바랍니다. </div> + <Button size={"sm"} onClick={() => toast.dismiss(t.id)}> + 확인 + </Button> </div> ), { id: "pwd-reset", - duration: 5000, + duration: Infinity, position: "top-center", } ); From ca9f2da83cacff3756a6ef43f85affae0cd57d30 Mon Sep 17 00:00:00 2001 From: leedj312 <dlehd467@gmail.com> Date: Fri, 1 Aug 2025 14:38:38 +0900 Subject: [PATCH 22/36] =?UTF-8?q?=EC=88=98=EC=9A=94=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=EC=88=98=EC=A7=88=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20validation=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/sdmMng/sdmInfoInsert/page.tsx | 49 +------- apps/dm/app/store/sdmMng/index.tsx | 109 +++++++++++++++++- .../ui/sdmInfoInsertForm/component.tsx | 25 ++-- .../components/ui/sdmLoginForm/component.tsx | 10 +- 4 files changed, 130 insertions(+), 63 deletions(-) diff --git a/apps/dm/app/(base-layout)/pages/sdmMng/sdmInfoInsert/page.tsx b/apps/dm/app/(base-layout)/pages/sdmMng/sdmInfoInsert/page.tsx index 4efc58cb5..56ec3bc00 100644 --- a/apps/dm/app/(base-layout)/pages/sdmMng/sdmInfoInsert/page.tsx +++ b/apps/dm/app/(base-layout)/pages/sdmMng/sdmInfoInsert/page.tsx @@ -1,7 +1,7 @@ "use client"; import { useDmStore } from "@/app/store"; -import type { DemandCompBizType } from "@/app/store/sdmMng"; +import { sdmInfoFormSchema, type DemandCompBizType, type SdmInfoFormData } from "@/app/store/sdmMng"; import { SdmInfoRegForm } from "@/components/ui/sdmInfoInsertForm/component"; import { UiModal } from "@common/business_components/ui/dialog_ui"; import { Button } from "@common/components/ui"; @@ -10,48 +10,9 @@ import { useRouter, useSearchParams } from "next/navigation"; import { Suspense, useEffect, useState } from "react"; import { FormProvider, useForm, type SubmitHandler } from "react-hook-form"; import { Toaster } from "react-hot-toast"; -import * as z from "zod"; import SdmLogin from "../sdmLogin/page"; -const sdmInfoFormSchema = z.object({ - sdmNm: z.string().min(1, "수요처를 선택해주세요"), - demandYmd: z.date().optional(), - demandQnty: z - .string() - .min(1, "요구수량을 입력해주세요") - .regex(/^[0-9]+$/, "요구수량은 숫자만 입력 가능합니다"), - usePurpose: z.string().optional(), - money: z.string().regex(/^[0-9]+$/, "희망단가는 숫자만 입력 가능합니다"), - /**요구수질 */ - reqWaterQlty: z.string().optional(), - grssClfg: z.number().nullish(), - tn: z.number().nullish(), - combResdch: z.number().nullish(), - tph: z.number().nullish(), - trbt: z.number().nullish(), - ph: z.string().nullish(), - bod: z.number().nullish(), - /**컬럼확인필요 */ - clIonQnt: z.number().nullish(), - smll: z.string(), - cdtnv: z.number().nullish(), - crmty: z.number().nullish(), - rmrk: z.string().optional(), - /* telno: z.string() - .min(8, "전화번호는 8자 이상 입력해주세요") - .max(12, "전화번호는 12자 이내로 입력해주세요") - .regex(/^[0-9-]+$/, "전화번호는 숫자와 하이픈(-)만 입력 가능합니다"), */ - candidateTitle: z - .array( - z.object({ - ruseUtztnFcltNm: z.string(), - ruseUtztnFcltCd: z.string(), - }) - ) - .optional(), -}); -export type FormData = z.infer<typeof sdmInfoFormSchema>; function SdmInfoInsertContent() { const searchParams = useSearchParams(); @@ -62,7 +23,7 @@ function SdmInfoInsertContent() { const [isLogin, setIsLogin] = useState(false); const [facilityName, setFacilityName] = useState<string>(""); - const [defaultValues, setDefaultValues] = useState<FormData>({ + const [defaultValues, setDefaultValues] = useState<SdmInfoFormData>({ sdmNm: "", demandYmd: new Date(), demandQnty: "", @@ -109,10 +70,10 @@ function SdmInfoInsertContent() { setSubsInfo([]); // subsInfo 초기화 후보지 처음 화면 들어올때 초기화(스토어내 객체만) }, [setSubsInfo]); - const form = useForm<FormData>({ + const form = useForm<SdmInfoFormData>({ resolver: zodResolver(formSchema), defaultValues, - mode: "onChange", + mode: "onSubmit", }); const subsInfo = useDmStore((state) => state.map.subsInfo); @@ -167,7 +128,7 @@ function SdmInfoInsertContent() { } }, [ismoneyDisabled, form]); const router = useRouter(); - const onSubmit: SubmitHandler<FormData> = async (data) => { + const onSubmit: SubmitHandler<SdmInfoFormData> = async (data) => { try { const dmSubsInfo = data.candidateTitle?.filter( (item) => item.ruseUtztnFcltNm && item.ruseUtztnFcltCd diff --git a/apps/dm/app/store/sdmMng/index.tsx b/apps/dm/app/store/sdmMng/index.tsx index 6a6628339..1b63c399d 100644 --- a/apps/dm/app/store/sdmMng/index.tsx +++ b/apps/dm/app/store/sdmMng/index.tsx @@ -3,10 +3,105 @@ import type { SelectDataType } from "@common/business_components/ui"; import type { TableUpperProps } from "../common"; import toast from "react-hot-toast"; import type { DemandCompType } from "@common/business_components/ui/sdmInsertForm/form"; +import { z } from "zod"; /**==================================== * Store - 타입 =====================================*/ + +export const sdmInfoFormSchema = z.object({ + sdmNm: z.string().min(1, "수요처를 선택해주세요"), + demandYmd: z.date().optional(), + demandQnty: z + .string() + .min(1, "요구수량을 입력해주세요") + .regex(/^[0-9]+$/, "요구수량은 숫자만 입력 가능합니다"), + usePurpose: z.string().optional(), + money: z.string().regex(/^[0-9]+$/, "희망단가는 숫자만 입력 가능합니다"), + /**요구수질 */ + reqWaterQlty: z.string().optional(), + grssClfg: z.number().nullish(), + tn: z.number().nullish(), + combResdch: z.number().nullish(), + tph: z.number().nullish(), + trbt: z.number().nullish(), + ph: z.string().nullish(), + bod: z.number().nullish(), + /**컬럼확인필요 */ + clIonQnt: z.number().nullish(), + smll: z.string(), + cdtnv: z.number().nullish(), + crmty: z.number().nullish(), + rmrk: z.string().optional(), + /* telno: z.string() + .min(8, "전화번호는 8자 이상 입력해주세요") + .max(12, "전화번호는 12자 이내로 입력해주세요") + .regex(/^[0-9-]+$/, "전화번호는 숫자와 하이픈(-)만 입력 가능합니다"), */ + candidateTitle: z + .array( + z.object({ + ruseUtztnFcltNm: z.string(), + ruseUtztnFcltCd: z.string(), + }) + ) + .optional(), +}).superRefine((data, ctx) => { + const disabledFields = disableRules[data.usePurpose ?? ""] || []; + // 모든 수질 관련 필드 + // 총대장균군수는 null 값을 불검출로 표시하기때문에 해당 검사에서 제외함. + const allFields: (keyof typeof data)[] = [ + "tn", "combResdch", "tph", + "trbt", "ph", "bod", "clIonQnt", + "smll", "cdtnv", "crmty", + ]; + + const allFieldsName: Record<string, string> = { + tn: "총질소(T-N)(mg/L)", + combResdch: "결합잔류염소(mg/L)", + tph: "총인(T-P)(mg/L)", + trbt: "탁도(NTU)", + ph: "수소이온농도(pH)", + bod: "생물학적 산소요구량(BOD)(mg/L)", + clIonQnt: "염화물(mgCL/L)", + smll: "냄새", + cdtnv: "전기전도도(㎲/cm)", + crmty: "색도(도)", + }; + allFields.forEach((field) => { + const isDisabled = disabledFields.includes(field); + if (!isDisabled) { + // disabled가 아닌 필드는 반드시 값이 있어야 함 + const value = data[field]; + if (typeof value === "string") { + if (value.trim().length === 0) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: [field], + message: `${allFieldsName[field]} 을 입력해주세요.`, + }); + } + } else if (typeof value === "number") { + if (value <= 0 || Number.isNaN(value)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: [field], + message: `${allFieldsName[field]} 을 입력해주세요.`, + }); + } + } else if (value == null) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: [field], + message: `${allFieldsName[field]} 을 입력해주세요.`, + }); + } + } + }); +}); + +export type SdmInfoFormData = z.infer<typeof sdmInfoFormSchema>; + + // 수요처 정보 export type DemandCompBizType = { index : number | ''; @@ -167,8 +262,8 @@ const demandCompList : DemandCompType[] = [ const disableRules: DisableRulesType = { "청소": ["tn", 'tph',"clIonQnt" ,'cdtnv'], "화장실용수": ["tn", 'tph',"clIonQnt" ,'cdtnv'], - "세척": ["combResdch", "crmty",'tph',"clIonQnt",'cdtnv'], - "살수": ["combResdch", "crmty",'tph',"clIonQnt",'cdtnv'], + "세척": ["combResdch", "crmty",'tph','tn',"clIonQnt",'cdtnv'], + "살수": ["combResdch", "crmty",'tph','tn',"clIonQnt",'cdtnv'], "조경": ["combResdch", "crmty",'tph','cdtnv'], "농업_간접용수": ["combResdch", "crmty",'tn','tph','clIonQnt'], "농업_직접용수": ["combResdch", "crmty",'tn','tph','clIonQnt'], @@ -184,6 +279,7 @@ const disableRules: DisableRulesType = { bod: 5, crmty: 20, ph: "5.8~8.5", + smll:'불쾌하지않을것', tn:null, tph: null, clIonQnt: null, @@ -196,6 +292,7 @@ const disableRules: DisableRulesType = { trbt: 2, bod: 5, crmty: 20, + smll:'불쾌하지않을것', ph: "5.8~8.5", tn:null, tph: null, @@ -208,6 +305,7 @@ const disableRules: DisableRulesType = { bod: 5, ph: "5.8~8.5", combResdch:null, + smll:'불쾌하지않을것', crmty:null, tn:null, tph: null, @@ -219,6 +317,7 @@ const disableRules: DisableRulesType = { trbt: 2, bod: 5, ph: "5.8~8.5", + smll:'불쾌하지않을것', combResdch:null, crmty:null, tn:null, @@ -231,6 +330,7 @@ const disableRules: DisableRulesType = { trbt: 2, bod: 5, ph: "5.8~8.5", + smll:'불쾌하지않을것', clIonQnt:250, combResdch:null, crmty:null, @@ -254,6 +354,7 @@ const disableRules: DisableRulesType = { grssClfg: null, trbt: 2, bod: 8, + smll:'불쾌하지않을것', ph: "5.8~8.5", cdtnv:700, combResdch:null, @@ -267,6 +368,7 @@ const disableRules: DisableRulesType = { bod: 5, tn: 10, tph: 0.5, + smll:'불쾌하지않을것', ph: "5.8~8.5", combResdch:null, trbt:null, @@ -274,13 +376,14 @@ const disableRules: DisableRulesType = { clIonQnt: null, cdtnv:null }, - 공업:{ + '공업':{ grssClfg: null, bod: null, tn: null, tph: null, ph: "~", combResdch:null, + smll:'불쾌하지않을것', trbt:null, crmty:null, clIonQnt: null, diff --git a/apps/dm/components/ui/sdmInfoInsertForm/component.tsx b/apps/dm/components/ui/sdmInfoInsertForm/component.tsx index 7d6c41f24..c007645bb 100644 --- a/apps/dm/components/ui/sdmInfoInsertForm/component.tsx +++ b/apps/dm/components/ui/sdmInfoInsertForm/component.tsx @@ -1,5 +1,4 @@ import ModalSimilarPage from "@/app/(base-layout)/pages/sdmMng/sdmInfoInsert/modalSimilar/page"; -import type { FormData } from "@/app/(base-layout)/pages/sdmMng/sdmInfoInsert/page"; import { useDmStore } from "@/app/store"; import { CANDIDATE, @@ -25,15 +24,16 @@ import SearchInputText from "../common/searhDemandInput/component"; import React from "react"; import { sanitizeInput } from "../common/utils/utils"; import type { DemandCompType } from "@common/business_components/ui/sdmInsertForm/form"; +import type { SdmInfoFormData } from "@/app/store/sdmMng"; export interface SdmInfoRegFormProps { - form: UseFormReturn<FormData>; + form: UseFormReturn<SdmInfoFormData>; onCheckboxChange?: (checked: boolean) => void; facilityName?: string; } type FieldComponent = ( - field: ControllerRenderProps<FormData, keyof FormData> + field: ControllerRenderProps<SdmInfoFormData, keyof SdmInfoFormData> ) => JSX.Element; export function SdmInfoRegForm({ @@ -161,7 +161,7 @@ export function SdmInfoRegForm({ if (defaults) { Object.entries(defaults).forEach(([field, value]) => { - form.setValue(field as keyof FormData, value, { shouldDirty: true }); + form.setValue(field as keyof SdmInfoFormData, value, { shouldDirty: true }); }); } }, [form.getValues("usePurpose")]); @@ -176,7 +176,7 @@ export function SdmInfoRegForm({ ); const formFields: Array<{ - name: keyof FormData; + name: keyof SdmInfoFormData; label: string; component: FieldComponent | undefined; formIndex: number; @@ -346,9 +346,7 @@ export function SdmInfoRegForm({ const normalFields = formFields.filter( (f) => f.formIndex === 0 && f.component ); - // const groupFields = formFields.filter( - // (f) => f.formIndex === 1 && f.component - // ); + const candidateFields = formFields.filter( (f) => f.formIndex === 2 && f.component ); @@ -363,8 +361,13 @@ export function SdmInfoRegForm({ name={name} render={({ field }) => name === "money" ? ( - // component(field) - <FormUi label={label + "*"}>{component(field)}</FormUi> + <div> + <Label className="text-black" > + 희망단가* + </Label> + { component(field)} + </div> + // <FormUi label={label + "*"}>{component(field)}</FormUi> ) : ( <AccessibleFormField field={field} @@ -769,7 +772,7 @@ export function SdmInfoRegForm({ onSelectValue={(val: string | number) => { field.onChange(val.toString()); }} - value={field.value || "불쾌하지않을것"} + value={field.value } readOnly={isDisabled} onBlur={field.onBlur} ref={field.ref} diff --git a/apps/dm/components/ui/sdmLoginForm/component.tsx b/apps/dm/components/ui/sdmLoginForm/component.tsx index 75852a4da..9664c52a2 100644 --- a/apps/dm/components/ui/sdmLoginForm/component.tsx +++ b/apps/dm/components/ui/sdmLoginForm/component.tsx @@ -46,8 +46,8 @@ export function SdmLoginForm() { dmdAplyPswd: z.string().optional(), }), [isBznmTotNoDisabled]); - type FormData = z.infer<typeof sdmLoginFormSchema>; - type FieldComponent = (field: ControllerRenderProps<FormData, keyof FormData>) => JSX.Element; + type SdmLoginForm = z.infer<typeof sdmLoginFormSchema>; + type FieldComponent = (field: ControllerRenderProps<SdmLoginForm, keyof SdmLoginForm>) => JSX.Element; const formSchema = sdmLoginFormSchema; @@ -55,7 +55,7 @@ export function SdmLoginForm() { initializeCommonData(); }, [initializeCommonData]); - const defaultValues: FormData = { + const defaultValues: SdmLoginForm = { dmdInfoId: '', bznmTotNo: '', password: '', @@ -63,7 +63,7 @@ export function SdmLoginForm() { dmdAplyPswd: '', }; - const form = useForm<FormData>({ + const form = useForm<SdmLoginForm>({ resolver: zodResolver(formSchema), defaultValues, mode: "onChange", @@ -102,7 +102,7 @@ export function SdmLoginForm() { }; const formFields: Array<{ - name: keyof FormData; + name: keyof SdmLoginForm; label: string; component: FieldComponent | undefined; }> = [ From 59e3dbbe97905603320e9f4c472537e53c386aae Mon Sep 17 00:00:00 2001 From: jyha00 <jyha@mind-one.co.kr> Date: Fri, 1 Aug 2025 14:59:36 +0900 Subject: [PATCH 23/36] =?UTF-8?q?=EC=A4=91=EC=88=98=EB=8F=84=20=EC=8B=A0?= =?UTF-8?q?=EA=B7=9C=EB=93=B1=EB=A1=9D=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/components/ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/wr/components/ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx b/apps/wr/components/ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx index 59ce18d93..055d0372f 100644 --- a/apps/wr/components/ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx +++ b/apps/wr/components/ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx @@ -158,7 +158,7 @@ export default function RswtrRegForm({ </h1> <div className="grid grid-cols-12 flex items-center card-header"> <h1 className="text-2xl font-medium text-label col-span-10"> - 건축물 운영정보 + 건축물 정보 </h1> {!readonly && ( <Button From 8653335aa9619712fc11cb0294798bd2e3cd6cb6 Mon Sep 17 00:00:00 2001 From: leedj312 <dlehd467@gmail.com> Date: Fri, 1 Aug 2025 15:26:54 +0900 Subject: [PATCH 24/36] =?UTF-8?q?=EC=88=98=EC=9A=94=EC=8B=A0=EC=B2=AD=20?= =?UTF-8?q?=EC=82=AC=EC=97=85=EC=9E=90=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=B4=88=EA=B8=B0=20=ED=99=94=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/coMng/coSttn/page.tsx | 3 ++- apps/wr/components/lib/func/commom.tsx | 4 ++-- apps/wr/public/locales/ko/message.json | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/wr/app/matMng/coMng/coSttn/page.tsx b/apps/wr/app/matMng/coMng/coSttn/page.tsx index 75e1ecff7..5c4f85849 100644 --- a/apps/wr/app/matMng/coMng/coSttn/page.tsx +++ b/apps/wr/app/matMng/coMng/coSttn/page.tsx @@ -162,10 +162,11 @@ export default function CoSttn() { const initPassword = () => { if (upadateData) { const dmdInfoId = upadateData.dmdInfoId; + const dmdInfoSliceId = `${dmdInfoId.slice(0, 3)}-${dmdInfoId.slice(3, 5)}-${dmdInfoId.slice(5, 10)}-${dmdInfoId.slice(10)}` const handleConfirm = () => { coSttnPwInit(dmdInfoId); }; - confirmToast(t('isInitPw'), handleConfirm); + confirmToast( t('isInitPw', { dmdInfoId: dmdInfoSliceId }), handleConfirm, 'text-2xl'); } else { toast.error("비밀번호 초기화를 원하는 행을 선택해주세요.") } diff --git a/apps/wr/components/lib/func/commom.tsx b/apps/wr/components/lib/func/commom.tsx index 4902ccf3d..fef689f46 100644 --- a/apps/wr/components/lib/func/commom.tsx +++ b/apps/wr/components/lib/func/commom.tsx @@ -201,11 +201,11 @@ export const formatPhoneNumber = (tel: string) => { } }; -export const confirmToast = (content: string, saveFunc: () => void) => { +export const confirmToast = (content: string, saveFunc: () => void, contentClass?:string) => { toast( (t) => ( <span className="flex flex-col items-center"> - <div className="mb-6">{content}</div> + <div className={`mb-6 ${contentClass}`} >{content}</div> <div className="flex flex-row space-x-2"> <Button size={"sm"} diff --git a/apps/wr/public/locales/ko/message.json b/apps/wr/public/locales/ko/message.json index 859df00cf..fb7af9ed2 100644 --- a/apps/wr/public/locales/ko/message.json +++ b/apps/wr/public/locales/ko/message.json @@ -17,7 +17,7 @@ "isMatchFinishMsg": " 매칭완료를 진행하시겠습니까?", "isNotMatchFinishMsg": "검토완료중 매칭완료 여부를 체크한 항목이 없습니다.", "canNotChangeMatStateMsg": "매칭완료된 항목은 상태를 변경할 수 없습니다.", - "isInitPw": "비밀번호를 초기화하시겠습니까?", + "isInitPw":"사업자번호 {{dmdInfoId}} 의 비밀번호를 초기화하시겠습니까? (초기화비밀번호는 해당 사업자의 사업자 번호입니다)", "alreadyInsertedErrMsg": "사업자번호 {{num}}(은)는 이미 등록되었습니다. 다시 등록해주세요.", "saveRowErrMsg": "수정을 원하는 행을 선택하고 저장버튼을 눌러주세요.", "costCalcErrMsg": "공사비 계산 진행 후 저장을 눌러주세요", From cb83b7f92b1e4a74934ba8037de8a148bb313fe8 Mon Sep 17 00:00:00 2001 From: jyha00 <jyha@mind-one.co.kr> Date: Fri, 1 Aug 2025 15:50:44 +0900 Subject: [PATCH 25/36] =?UTF-8?q?=ED=95=98=EC=88=98=EC=9E=AC=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=EC=8B=9C=EC=84=A4=20=ED=98=84=ED=99=A9=20=EC=97=91?= =?UTF-8?q?=EC=85=80=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=97=86=EC=9D=84=20?= =?UTF-8?q?=EC=8B=9C=20toast=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruseFcltMng/fcltSttn/pbnstSttn/page.tsx | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx b/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx index 8aea16c00..21f72f449 100644 --- a/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx @@ -21,6 +21,8 @@ import ListDiv from "@common/business_components/ui/list_div"; import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; import { Button, Label } from "@common/components/ui"; import { useCallback, useEffect, useRef, useState } from "react"; +import toast, { Toaster } from "react-hot-toast"; +import { useTranslation } from "react-i18next"; export default function PbnstSttn() { const { @@ -46,10 +48,11 @@ export default function PbnstSttn() { isModal: boolean; data: customPbnst; }>({ isModal: false, data: {} as customPbnst }); - + const isDownloadTriggered = useRef(false); const [pbnRuseNm, setPbnRuseNm] = useState<string>(""); - + const { t } = useTranslation('base'); const excelClick = useCallback(() => { + isDownloadTriggered.current = true; pbnstSttnSearch( true, String(1), @@ -77,9 +80,9 @@ export default function PbnstSttn() { }, [pbnstSttn.isInit]); useEffect(() => { - pbnSttnInit("1", "15", ref.current, searchYear, fclts); + pbnSttnInit("1", "15", ref.current, searchYear, fclts); }, [fclts]); - + useEffect(() => { if (pbnstSttnRes && pbnstSttnRes.length > 0) { setBdstTable(pbnstSttnRes); @@ -90,7 +93,10 @@ export default function PbnstSttn() { useEffect(() => { - if (pbnstSttn.excelList.length >= 0) { + if (!isDownloadTriggered.current) { + return; + } + if (pbnstSttn.excelList.length > 0) { excelDownload( pbnstSttn.excelList, "하수재이용시설 현황", @@ -98,7 +104,10 @@ export default function PbnstSttn() { "A1:U2", 3 ); + } else { + toast.error(t('excelDownErrMsg')); } + isDownloadTriggered.current = false; }, [pbnstSttn.excelList]); @@ -162,8 +171,8 @@ export default function PbnstSttn() { /> </div> } - queryClick={ ()=> { - // pbnSearch(returnType); + queryClick={() => { + // pbnSearch(returnType); //setTableIndex(0) setIsReset(true); @@ -202,7 +211,7 @@ export default function PbnstSttn() { ); setIsReset(false); }} - + resetPageNo={isReset} > <HeadMakeColSpan upHeadList={pbnstSttn.pbnstSttNodeList} /> @@ -242,6 +251,7 @@ export default function PbnstSttn() { }} /> </ContentsDiv> + <Toaster position="top-center" /> </> ); } From 605e0a3e3ade265be490a9494e6f6e13d6077aff Mon Sep 17 00:00:00 2001 From: bicochan <chanii8@naver.com> Date: Fri, 1 Aug 2025 15:52:51 +0900 Subject: [PATCH 26/36] =?UTF-8?q?[apps/cs]=20feat:=20=ED=86=B5=ED=95=A9=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9E=91?= =?UTF-8?q?=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cs/app/(with-base-layout)/search/page.tsx | 2 + .../cs/src/pages/search/api/search-service.ts | 21 ++ apps/cs/src/pages/search/index.ts | 1 + .../pages/search/model/search-interface.ts | 45 ++++ apps/cs/src/pages/search/ui/search-page.tsx | 240 ++++++++++++++++++ apps/cs/src/shared/config/api.ts | 1 + 6 files changed, 310 insertions(+) create mode 100644 apps/cs/app/(with-base-layout)/search/page.tsx create mode 100644 apps/cs/src/pages/search/api/search-service.ts create mode 100644 apps/cs/src/pages/search/index.ts create mode 100644 apps/cs/src/pages/search/model/search-interface.ts create mode 100644 apps/cs/src/pages/search/ui/search-page.tsx diff --git a/apps/cs/app/(with-base-layout)/search/page.tsx b/apps/cs/app/(with-base-layout)/search/page.tsx new file mode 100644 index 000000000..2b74c1283 --- /dev/null +++ b/apps/cs/app/(with-base-layout)/search/page.tsx @@ -0,0 +1,2 @@ +import { SearchPage } from "@/pages/search"; +export default SearchPage; diff --git a/apps/cs/src/pages/search/api/search-service.ts b/apps/cs/src/pages/search/api/search-service.ts new file mode 100644 index 000000000..5bb99e7d1 --- /dev/null +++ b/apps/cs/src/pages/search/api/search-service.ts @@ -0,0 +1,21 @@ +import { client } from "@/shared/api"; +import type { + SearchParams, + SearchResult, + SearchService, +} from "../model/search-interface"; +import { ENDPOINT } from "@/shared/config"; + +export class SearchApiService implements SearchService { + public async searchPost(params: SearchParams): Promise<SearchResult> { + const response = await client.get<SearchResult>( + ENDPOINT.BOARD_SERVICE.SEARCH_POST, + { + params, + }, + ); + return response.data; + } +} + +export const SearchApi = new SearchApiService(); diff --git a/apps/cs/src/pages/search/index.ts b/apps/cs/src/pages/search/index.ts new file mode 100644 index 000000000..c5e44be12 --- /dev/null +++ b/apps/cs/src/pages/search/index.ts @@ -0,0 +1 @@ +export { SearchPage } from "./ui/search-page"; diff --git a/apps/cs/src/pages/search/model/search-interface.ts b/apps/cs/src/pages/search/model/search-interface.ts new file mode 100644 index 000000000..7afb1e9fc --- /dev/null +++ b/apps/cs/src/pages/search/model/search-interface.ts @@ -0,0 +1,45 @@ +import type { PageableList, PageableParams } from "@/shared/model"; + +export interface SearchParams extends PageableParams { + keywordType?: string; + keyword?: string; + siteId?: string; +} + +export interface Post { + bbsId: number; + bbsNm: string; + pstNo: number; + pstTtl: string; + pstCn: string; + inqNocs: number; + wrtrNm: string; + wrtrCplc: string; + regDt: string; + rgtrNm: string; +} + +export interface Board { + bbsId: number; + bbsNm: string; + fullMenuPath: string; + urlPath: string; + posts: Post[]; +} + +export interface Contents { + contsSn: number; + contsTtl: string; + contsCn: string; + fullMenuPath: string; + urlPath: string; +} + +export interface SearchResult { + boardList: PageableList<Board>; + contsList: Contents[]; +} + +export interface SearchService { + searchPost(params: SearchParams): Promise<SearchResult>; +} diff --git a/apps/cs/src/pages/search/ui/search-page.tsx b/apps/cs/src/pages/search/ui/search-page.tsx new file mode 100644 index 000000000..23a70b85e --- /dev/null +++ b/apps/cs/src/pages/search/ui/search-page.tsx @@ -0,0 +1,240 @@ +"use client"; + +import Link from "next/link"; +import { useState } from "react"; +import { useSearchParams } from "next/navigation"; +import { useQuery } from "@tanstack/react-query"; +import { + Button, + Input, + Tabs, + TabsContent, + TabsList, + TabsTrigger, +} from "@common/components"; +import { ENDPOINT, SITE_ID } from "@/shared/config"; +import { SearchApi } from "../api/search-service"; +import type { Board, Post, Contents } from "../model/search-interface"; + +const RENDER_LIMIT = 5; + +function SearchPage() { + const searchParams = useSearchParams(); + const keywordParam = searchParams?.get("keyword"); + + const [keyword, setKeyword] = useState(keywordParam ?? ""); + const [tab, setTab] = useState("all"); + + const { data } = useQuery({ + queryKey: [ENDPOINT.BOARD_SERVICE.SEARCH_POST, keyword], + queryFn: () => SearchApi.searchPost({ keyword: keyword, siteId: SITE_ID }), + }); + + const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => { + e.preventDefault(); + const formData = new FormData(e.target as HTMLFormElement); + setKeyword(formData.get("keyword") as string); + }; + + return ( + <div className="-mb-2"> + <h2 className="text-center text-4xl font-bold">통합검색</h2> + <form + onSubmit={handleSubmit} + className="relative mx-auto my-8 flex w-[52rem] items-center justify-center gap-2" + > + <Input + name="keyword" + className="h-[5rem] w-[48rem] rounded-[4rem] pl-8 pr-40 !text-2xl" + placeholder="검색어를 입력해주세요." + /> + <Button + size="icon" + className="absolute right-28 top-2 size-16 rounded-full" + > + <span className="sr-only">검색</span> + <i className="diveicon di-search text-2xl" /> + </Button> + <Button + size="icon" + color="white" + className="absolute right-10 top-2 size-16 rounded-full" + > + <span className="sr-only">초기화</span> + <i className="diveicon di-reset text-2xl" /> + </Button> + </form> + <div className="bg-background pb-20"> + <div className="flex items-center justify-center"> + <p className="py-16 text-3xl font-bold"> + 검색어 <span className="text-primary">'{keyword}'</span>로 + 검색한 결과입니다. + </p> + </div> + <div className="px-[10vw]"> + <Tabs value={tab} onValueChange={setTab}> + <div className="flex justify-center"> + <TabsList className="mx-auto"> + <TabsTrigger value="all"> + 전체 ( + {data?.contsList?.length ?? + 0 + (data?.boardList?.totalElements ?? 0)} + 건) + </TabsTrigger> + <TabsTrigger value="contents"> + 웹페이지 ({data?.contsList?.length ?? 0}건) + </TabsTrigger> + <TabsTrigger value="board"> + 게시판 ({data?.boardList?.totalElements ?? 0}건) + </TabsTrigger> + </TabsList> + </div> + <TabsContent value="all"> + <div className="space-y-20 p-10"> + <div> + <h3 className="mb-4 border-b-2 border-border pb-4 text-3xl font-bold"> + 웹페이지 ({data?.contsList?.length ?? 0}건) + </h3> + {renderContents(data?.contsList)} + {(data?.contsList?.length ?? 0) > RENDER_LIMIT && ( + <button + className="h-[4rem] w-full hover:underline" + onClick={() => setTab("contents")} + > + 검색 결과 더보기 + </button> + )} + </div> + <div> + <h3 className="mb-4 border-b-2 border-border pb-4 text-3xl font-bold"> + 게시판 ({data?.boardList?.totalElements ?? 0}건) + </h3> + {renderPost(data?.boardList.content)} + {(data?.boardList?.totalElements ?? 0) > RENDER_LIMIT && ( + <button + className="h-[4rem] w-full hover:underline" + onClick={() => setTab("board")} + > + 검색 결과 더보기 + </button> + )} + </div> + </div> + </TabsContent> + <TabsContent value="contents"> + {renderContents(data?.contsList, 100)} + </TabsContent> + <TabsContent value="board"> + {renderPost(data?.boardList.content, 100)} + </TabsContent> + </Tabs> + </div> + </div> + </div> + ); +} + +interface ContentItemProps { + content: Contents; +} + +function ContentItem({ content }: ContentItemProps) { + return ( + <li className="border-b border-border px-6 py-8"> + <Link + href={content.urlPath} + className="hover:underline hover:underline-offset-1" + > + <span className="text-lg">{content.fullMenuPath}</span> + <div className="mt-2 flex flex-col gap-1"> + <em + className="font-bold not-italic" + dangerouslySetInnerHTML={{ + __html: content.contsTtl, + }} + /> + <p + dangerouslySetInnerHTML={{ + __html: content.contsCn, + }} + /> + </div> + </Link> + </li> + ); +} + +function renderContents(contents?: Contents[], limit = RENDER_LIMIT) { + if (!contents || !contents.length) return null; + return ( + <> + {contents.map((content, index) => { + if (limit <= index) return null; + + return ( + <ul key={content.contsSn} className="flex flex-col"> + <ContentItem key={content.contsSn} content={content} /> + </ul> + ); + })} + </> + ); +} + +interface PostItemProps { + post: Post; + board: Board; +} + +function PostItem({ post, board }: PostItemProps) { + const postUrl = !!board.urlPath ? `${board.urlPath}/${post.pstNo}` : ""; + return ( + <li className="border-b border-border px-6 py-8"> + <Link href={postUrl} className="hover:underline hover:underline-offset-1"> + <span className="text-lg">{board.fullMenuPath}</span> + <div className="mt-2 flex flex-col gap-1"> + <em + className="font-bold not-italic" + dangerouslySetInnerHTML={{ + __html: post.pstTtl, + }} + /> + <p + dangerouslySetInnerHTML={{ + __html: post.pstCn, + }} + /> + </div> + </Link> + </li> + ); +} + +function renderPost(boards?: Board[], limit = RENDER_LIMIT) { + if (!boards || !boards.length) return null; + + let remainingPosts = limit; + + return ( + <> + {boards.map((board) => { + if (remainingPosts <= 0) return null; + + const postsToShow = Math.min(board.posts.length, remainingPosts); + if (postsToShow <= 0) return null; + + remainingPosts -= postsToShow; + + return ( + <ul key={board.bbsId} className="flex flex-col"> + {board.posts.slice(0, postsToShow).map((post) => ( + <PostItem key={post.pstNo} post={post} board={board} /> + ))} + </ul> + ); + })} + </> + ); +} + +export { SearchPage }; diff --git a/apps/cs/src/shared/config/api.ts b/apps/cs/src/shared/config/api.ts index ce6f61381..5f79ff2da 100644 --- a/apps/cs/src/shared/config/api.ts +++ b/apps/cs/src/shared/config/api.ts @@ -63,6 +63,7 @@ export const ENDPOINT = { POSTS: "/board-service/api/v1/posts", POSTS_COMMENTS: "/board-service/api/v1/posts-cmnts", POST_EVALUATION: "/board-service/api/v1/pstEvl", + SEARCH_POST: "/board-service/api/v1/isearch/pst", }, }; From 98cc45162d022d28e31f2aaf3061a66c1e0dcfd3 Mon Sep 17 00:00:00 2001 From: bicochan <chanii8@naver.com> Date: Fri, 1 Aug 2025 16:14:01 +0900 Subject: [PATCH 27/36] =?UTF-8?q?[apps/cs]=20feat:=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EC=8B=9C=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/src/pages/search/ui/search-page.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/cs/src/pages/search/ui/search-page.tsx b/apps/cs/src/pages/search/ui/search-page.tsx index 23a70b85e..efa25132e 100644 --- a/apps/cs/src/pages/search/ui/search-page.tsx +++ b/apps/cs/src/pages/search/ui/search-page.tsx @@ -2,7 +2,7 @@ import Link from "next/link"; import { useState } from "react"; -import { useSearchParams } from "next/navigation"; +import { useRouter, useSearchParams } from "next/navigation"; import { useQuery } from "@tanstack/react-query"; import { Button, @@ -19,6 +19,7 @@ import type { Board, Post, Contents } from "../model/search-interface"; const RENDER_LIMIT = 5; function SearchPage() { + const router = useRouter(); const searchParams = useSearchParams(); const keywordParam = searchParams?.get("keyword"); @@ -34,6 +35,10 @@ function SearchPage() { e.preventDefault(); const formData = new FormData(e.target as HTMLFormElement); setKeyword(formData.get("keyword") as string); + + const params = new URLSearchParams(searchParams?.toString()); + params.set("keyword", formData.get("keyword") as string); + router.replace(`?${params.toString()}`); }; return ( From 9bdf01e7f3272aec4aed2c9031bc59851730b111 Mon Sep 17 00:00:00 2001 From: jyha00 <jyha@mind-one.co.kr> Date: Fri, 1 Aug 2025 16:16:50 +0900 Subject: [PATCH 28/36] =?UTF-8?q?=EB=AA=A8=EB=8B=AC=EC=B0=BD=20=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=EC=A6=88=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/coMng/coSttn/page.tsx | 4 +- .../sttn/sttnDetailModal/coDatailModal.tsx | 37 +++++++++---------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/apps/wr/app/matMng/coMng/coSttn/page.tsx b/apps/wr/app/matMng/coMng/coSttn/page.tsx index 75e1ecff7..4a6c74951 100644 --- a/apps/wr/app/matMng/coMng/coSttn/page.tsx +++ b/apps/wr/app/matMng/coMng/coSttn/page.tsx @@ -129,7 +129,7 @@ export default function CoSttn() { coExcel as [], "수요처 관리", "sample_coSttn.xlsx", - "A1:H1", + "A1:G1", 2 ); } @@ -288,7 +288,7 @@ export default function CoSttn() { </div> <UiModal bodyClass={ - "w-[40vw] max-w-none h-[80vh] " // +upadateData?.dmdInfoId?'h-[60vh]':'h-[90vh]' + "w-[40vw] max-w-none h-[83vh] " // +upadateData?.dmdInfoId?'h-[60vh]':'h-[90vh]' } open={isDmdModal.isMoal} onOpenChange={() => { diff --git a/apps/wr/components/ui/modal/sttn/sttnDetailModal/coDatailModal.tsx b/apps/wr/components/ui/modal/sttn/sttnDetailModal/coDatailModal.tsx index cb38717a3..aef145cc1 100644 --- a/apps/wr/components/ui/modal/sttn/sttnDetailModal/coDatailModal.tsx +++ b/apps/wr/components/ui/modal/sttn/sttnDetailModal/coDatailModal.tsx @@ -48,22 +48,21 @@ export default function CoDetailModal({ return ( <div> - <ScrollArea className="h-[85vh] mx-8"> - <Form {...form}> - <form onSubmit={form.handleSubmit(onFormSubmit)}> - <div className="grid grid-cols-12 items-center card-header"> - <h1 className="text-2xl font-medium text-label col-span-10"> - 잠재수요처 상세정보 - </h1> - <Button type="submit" - className="col-start-12 col-span-1" - size={"sm"} - disabled={readonly} - > - 저장 - </Button> - </div> - + <Form {...form}> + <form onSubmit={form.handleSubmit(onFormSubmit)}> + <div className="grid grid-cols-12 items-center card-header"> + <h1 className="text-2xl font-medium text-label col-span-10"> + 잠재수요처 상세정보 + </h1> + <Button type="submit" + className="col-start-12 col-span-1" + size={"sm"} + disabled={readonly} + > + 저장 + </Button> + </div> + <ScrollArea className="h-[79vh] mx-8"> <FormField control={form.control} name="fctryMngSn" @@ -865,9 +864,9 @@ export default function CoDetailModal({ /> </div> </div> - </form> - </Form> - </ScrollArea> + </ScrollArea> + </form> + </Form> </div> ); } From aabd81057183ee6d562d485d0ea00589f64fd855 Mon Sep 17 00:00:00 2001 From: bicochan <chanii8@naver.com> Date: Sat, 2 Aug 2025 02:42:20 +0900 Subject: [PATCH 29/36] =?UTF-8?q?[common/features]=20refactor:=20=ED=86=B5?= =?UTF-8?q?=ED=95=A9=20=EA=B2=80=EC=83=89=20=EA=B8=B0=EB=8A=A5=20=EA=B3=B5?= =?UTF-8?q?=ED=86=B5=20=EA=B8=B0=EB=8A=A5=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/(with-base-layout)/search/layout.tsx | 28 ++++++++ .../app/(with-base-layout)/search/page.tsx | 0 apps/common/features/middleware.ts | 4 -- .../src/pages/search/api/search-service.ts | 0 .../features}/src/pages/search/index.ts | 0 .../pages/search/model/search-interface.ts | 0 .../src/pages/search/ui/search-page.tsx | 6 +- apps/common/features/src/shared/config/api.ts | 1 + .../src/widgets/post/ui/post-action.tsx | 5 +- .../features/src/widgets/post/ui/post.tsx | 14 ++++ .../api/board-statistics-service.ts | 5 +- .../model/board-statistics-interface.ts | 5 +- .../ui/board-statistics-page.tsx | 2 +- apps/cs/src/shared/config/api.ts | 1 - package.json | 2 +- .../common/components/src/ui/header/index.tsx | 64 ++++++++++--------- .../components/src/ui/header/search-form.tsx | 32 ++++++++++ 17 files changed, 126 insertions(+), 43 deletions(-) create mode 100644 apps/common/features/app/(with-base-layout)/search/layout.tsx rename apps/{cs => common/features}/app/(with-base-layout)/search/page.tsx (100%) rename apps/{cs => common/features}/src/pages/search/api/search-service.ts (100%) rename apps/{cs => common/features}/src/pages/search/index.ts (100%) rename apps/{cs => common/features}/src/pages/search/model/search-interface.ts (100%) rename apps/{cs => common/features}/src/pages/search/ui/search-page.tsx (98%) create mode 100644 packages/common/components/src/ui/header/search-form.tsx diff --git a/apps/common/features/app/(with-base-layout)/search/layout.tsx b/apps/common/features/app/(with-base-layout)/search/layout.tsx new file mode 100644 index 000000000..7fc1dfc1f --- /dev/null +++ b/apps/common/features/app/(with-base-layout)/search/layout.tsx @@ -0,0 +1,28 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import { MenuApi } from "@/entities/menu"; +import { useMenuStore } from "@/shared/lib"; +import { ENDPOINT } from "@/shared/config"; +import { PageLayout } from "@/shared/ui/page-layout"; + +export default function SearchLayout({ + children, +}: { + children: React.ReactNode; +}) { + const currentMenuInfo = useMenuStore((state) => state.currentMenuInfo); + const { data } = useQuery({ + queryKey: [ENDPOINT.CMS_SERVICE.MENUS, currentMenuInfo?.menuCd], + queryFn: () => + MenuApi.getMenuInfo(currentMenuInfo?.menuCd.toString() ?? ""), + enabled: !!currentMenuInfo, + }); + const menuPaths = data?.menuPath?.split(">").map((path) => path.trim()); + + return ( + <PageLayout title={data?.menuKornNm ?? ""} menuPaths={menuPaths ?? []}> + {children} + </PageLayout> + ); +} diff --git a/apps/cs/app/(with-base-layout)/search/page.tsx b/apps/common/features/app/(with-base-layout)/search/page.tsx similarity index 100% rename from apps/cs/app/(with-base-layout)/search/page.tsx rename to apps/common/features/app/(with-base-layout)/search/page.tsx diff --git a/apps/common/features/middleware.ts b/apps/common/features/middleware.ts index 018aab11a..e428dfa74 100644 --- a/apps/common/features/middleware.ts +++ b/apps/common/features/middleware.ts @@ -13,7 +13,6 @@ export function middleware(req: NextRequest) { const newUrl = `${serverApiUrl}${pathname.replace("/server", "")}${ queryParams ? `?${queryParams}` : "" }`; - console.log(`[Middleware] Rewriting from '/server' path to: ${newUrl}`); return NextResponse.rewrite(new URL(newUrl)); } @@ -26,9 +25,6 @@ export function middleware(req: NextRequest) { if (token) requestHeaders.set(CLAIM_NAME, token); if (userId) requestHeaders.set(AUTH_USER_ID, userId); - console.log( - `[Middleware] Rewriting from '/attach-service' path to: ${newUrl}`, - ); return NextResponse.rewrite(new URL(newUrl), { headers: requestHeaders, }); diff --git a/apps/cs/src/pages/search/api/search-service.ts b/apps/common/features/src/pages/search/api/search-service.ts similarity index 100% rename from apps/cs/src/pages/search/api/search-service.ts rename to apps/common/features/src/pages/search/api/search-service.ts diff --git a/apps/cs/src/pages/search/index.ts b/apps/common/features/src/pages/search/index.ts similarity index 100% rename from apps/cs/src/pages/search/index.ts rename to apps/common/features/src/pages/search/index.ts diff --git a/apps/cs/src/pages/search/model/search-interface.ts b/apps/common/features/src/pages/search/model/search-interface.ts similarity index 100% rename from apps/cs/src/pages/search/model/search-interface.ts rename to apps/common/features/src/pages/search/model/search-interface.ts diff --git a/apps/cs/src/pages/search/ui/search-page.tsx b/apps/common/features/src/pages/search/ui/search-page.tsx similarity index 98% rename from apps/cs/src/pages/search/ui/search-page.tsx rename to apps/common/features/src/pages/search/ui/search-page.tsx index efa25132e..407d2301c 100644 --- a/apps/cs/src/pages/search/ui/search-page.tsx +++ b/apps/common/features/src/pages/search/ui/search-page.tsx @@ -12,11 +12,13 @@ import { TabsList, TabsTrigger, } from "@common/components"; -import { ENDPOINT, SITE_ID } from "@/shared/config"; +import { ENDPOINT } from "@/shared/config"; import { SearchApi } from "../api/search-service"; import type { Board, Post, Contents } from "../model/search-interface"; +import { getCookie } from "@/shared/lib"; const RENDER_LIMIT = 5; +const siteId = getCookie("site-id-key") ?? ""; function SearchPage() { const router = useRouter(); @@ -28,7 +30,7 @@ function SearchPage() { const { data } = useQuery({ queryKey: [ENDPOINT.BOARD_SERVICE.SEARCH_POST, keyword], - queryFn: () => SearchApi.searchPost({ keyword: keyword, siteId: SITE_ID }), + queryFn: () => SearchApi.searchPost({ keyword: keyword, siteId }), }); const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => { diff --git a/apps/common/features/src/shared/config/api.ts b/apps/common/features/src/shared/config/api.ts index 4fef249d5..67b8948d7 100644 --- a/apps/common/features/src/shared/config/api.ts +++ b/apps/common/features/src/shared/config/api.ts @@ -44,6 +44,7 @@ export const ENDPOINT = { POSTS_USER: "/board-service/api/v1/posts/user", POSTS_COMMENTS: "/board-service/api/v1/posts-cmnts", POST_EVALUATION: "/board-service/api/v1/pstEvl", + SEARCH_POST: "/board-service/api/v1/isearch/pst", }, }; diff --git a/apps/common/features/src/widgets/post/ui/post-action.tsx b/apps/common/features/src/widgets/post/ui/post-action.tsx index a2160d2e9..695ddb721 100644 --- a/apps/common/features/src/widgets/post/ui/post-action.tsx +++ b/apps/common/features/src/widgets/post/ui/post-action.tsx @@ -12,6 +12,8 @@ type PostActionProps = { handleDelete: () => Promise<void>; }; +const basePath = process.env.NODE_ENV === "production" ? "/cms" : ""; + function PostAction({ registerId, children, handleDelete }: PostActionProps) { const router = useRouter(); const pathname = usePathname(); @@ -19,6 +21,7 @@ function PostAction({ registerId, children, handleDelete }: PostActionProps) { const { copyText, copied } = useClipboard(); const bbsInfo = useMenuStore((state) => state.bbsInfo); const userInfo = useUserStore((state) => state.userInfo); + const postPageLink = `${basePath}/${bbsInfo?.bbsTypeCd.toLowerCase()}/${bbsInfo?.bbsId}`; const actionButtonAuthrt = userInfo?.adminRoleYn === "Y" || userInfo?.userUnqId === registerId; @@ -60,7 +63,7 @@ function PostAction({ registerId, children, handleDelete }: PostActionProps) { size="lg" color="white" type="button" - onClick={() => router.back()} + onClick={() => router.push(postPageLink)} > 목록 </Button> diff --git a/apps/common/features/src/widgets/post/ui/post.tsx b/apps/common/features/src/widgets/post/ui/post.tsx index 7c1c4c3b6..b8928a3e2 100644 --- a/apps/common/features/src/widgets/post/ui/post.tsx +++ b/apps/common/features/src/widgets/post/ui/post.tsx @@ -13,6 +13,7 @@ import { Skeleton, } from "@common/components"; import { AttachmentApi } from "@/entities/attachment"; +import { BoardApi } from "@/entities/board"; import { PostApi } from "@/entities/post"; import { useAlertStore, @@ -31,10 +32,17 @@ function Post({ bbsId, pstNo }: { bbsId: string; pstNo: string }) { const alert = useAlertStore((state) => state.setMessage); const userInfo = useUserStore((state) => state.userInfo); const bbsInfo = useMenuStore((state) => state.bbsInfo); + const setBbsInfo = useMenuStore((state) => state.setBbsInfo); const [filename, setFilename] = useState(""); const [evlScr, setEvlScr] = useState(5); + const { data: boardInfo } = useQuery({ + queryKey: [bbsId], + queryFn: () => BoardApi.getBoardInfo(bbsId), + enabled: !bbsInfo, + }); + const { data: postData } = useQuery({ queryKey: [ENDPOINT.BOARD_SERVICE.POSTS_USER, bbsId, pstNo], queryFn: () => PostApi.getPostInfo(parseInt(bbsId), parseInt(pstNo)), @@ -142,6 +150,12 @@ function Post({ bbsId, pstNo }: { bbsId: string; pstNo: string }) { } }, [downloadResponse]); + useEffect(() => { + if (!boardInfo) return; + if (bbsInfo) return; + setBbsInfo(boardInfo); + }, [boardInfo, bbsInfo]); + return ( <> <PostAction registerId={postData?.rgtr} handleDelete={handleDelete}> diff --git a/apps/cs/src/pages/board-statistics/api/board-statistics-service.ts b/apps/cs/src/pages/board-statistics/api/board-statistics-service.ts index 1897e39ba..03291223c 100644 --- a/apps/cs/src/pages/board-statistics/api/board-statistics-service.ts +++ b/apps/cs/src/pages/board-statistics/api/board-statistics-service.ts @@ -1,5 +1,5 @@ -import { client } from "@/shared/api"; -import { ENDPOINT } from "@/shared/config"; +// import { client } from "@/shared/api"; +// import { ENDPOINT } from "@/shared/config"; import { type BoardStatisticsParams, type BoardStatistics, @@ -37,6 +37,7 @@ class BoardStatisticsApiService implements BoardStatisticsService { async getBoardStatistics( params: BoardStatisticsParams, ): Promise<BoardStatistics> { + console.log("params: ", params); try { // 실제 API 연동 시 아래 코드 사용 // const response = await client.get<BoardStatistics>( diff --git a/apps/cs/src/pages/board-statistics/model/board-statistics-interface.ts b/apps/cs/src/pages/board-statistics/model/board-statistics-interface.ts index 8ec52dabf..1f113475f 100644 --- a/apps/cs/src/pages/board-statistics/model/board-statistics-interface.ts +++ b/apps/cs/src/pages/board-statistics/model/board-statistics-interface.ts @@ -1,4 +1,7 @@ -import type { PageableList, PageableParams } from "@/shared/model"; +import type { + // PageableList, + PageableParams, +} from "@/shared/model"; export interface BoardStatisticsParams extends PageableParams { keywordType?: string; diff --git a/apps/cs/src/pages/board-statistics/ui/board-statistics-page.tsx b/apps/cs/src/pages/board-statistics/ui/board-statistics-page.tsx index d879c34d6..13dcbe812 100644 --- a/apps/cs/src/pages/board-statistics/ui/board-statistics-page.tsx +++ b/apps/cs/src/pages/board-statistics/ui/board-statistics-page.tsx @@ -26,7 +26,7 @@ import { SelectValue, } from "@common/components"; import { SiteSelect } from "@/entities/site"; -import { ENDPOINT } from "@/shared/config"; +// import { ENDPOINT } from "@/shared/config"; import { NoData } from "@/shared/ui/no-data"; import { InputDateRangePicker } from "@/shared/ui/input-date-range-picker"; import { BoardStatisticsApi } from "../api/board-statistics-service"; diff --git a/apps/cs/src/shared/config/api.ts b/apps/cs/src/shared/config/api.ts index 5f79ff2da..ce6f61381 100644 --- a/apps/cs/src/shared/config/api.ts +++ b/apps/cs/src/shared/config/api.ts @@ -63,7 +63,6 @@ export const ENDPOINT = { POSTS: "/board-service/api/v1/posts", POSTS_COMMENTS: "/board-service/api/v1/posts-cmnts", POST_EVALUATION: "/board-service/api/v1/pstEvl", - SEARCH_POST: "/board-service/api/v1/isearch/pst", }, }; diff --git a/package.json b/package.json index 89154a13d..f468722e7 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "packages/*" ], "scripts": { - "build": "turbo run build", + "build": "turbo run build --filter=!dm", "build:common": "turbo run build --filter=@common/*", "dev": "turbo run dev", "dev:cs": "turbo run dev --filter=cs", diff --git a/packages/common/components/src/ui/header/index.tsx b/packages/common/components/src/ui/header/index.tsx index f7637b7f0..52028da32 100644 --- a/packages/common/components/src/ui/header/index.tsx +++ b/packages/common/components/src/ui/header/index.tsx @@ -22,6 +22,7 @@ import { import { Button } from "../button"; import { SidebarTrigger } from "../sidebar"; import { Skeleton } from "../skeleton"; +import { SearchForm } from "./search-form"; const appConfig = getConfig(); const siteId = appConfig.SITE_ID ?? ""; @@ -135,36 +136,39 @@ export function Header({ viewOnly }: { viewOnly?: boolean }) { </span> </h1> </div> - {mounted ? ( - isLoggedIn && ( - <DropdownMenu> - <DropdownMenuTrigger asChild> - <Button - className="group m-0 flex h-[3rem] items-center !bg-background px-4 py-0 text-label" - data-trigger="dropdown" - > - <i className="diveicon di-account-circle static translate-y-0.5 pr-2 text-3xl" /> - {userInfo?.userName} - <i className="diveicon di-chevron-down static p-0 transition-transform group-data-[state=open]:rotate-180" /> - </Button> - </DropdownMenuTrigger> - <DropdownMenuContent> - <DropdownMenuItem>프로필 설정</DropdownMenuItem> - <div className="flex flex-col items-start gap-0 px-4 py-3"> - <p className="text-base text-label">최종접속일</p> - <p>{userInfo?.lastLoginDate}</p> - </div> - <div className="flex flex-col items-start gap-0 px-4 py-3"> - <p className="text-base text-label">접속 IP</p> - <p></p> - </div> - <DropdownMenuItem onClick={logout}>로그아웃</DropdownMenuItem> - </DropdownMenuContent> - </DropdownMenu> - ) - ) : ( - <Skeleton className="mx-4 h-[3rem] w-[15rem]" /> - )} + <div className="flex items-center gap-2"> + <SearchForm /> + {mounted ? ( + isLoggedIn && ( + <DropdownMenu> + <DropdownMenuTrigger asChild> + <Button + className="group m-0 flex h-[3rem] items-center !bg-background px-4 py-0 text-label" + data-trigger="dropdown" + > + <i className="diveicon di-account-circle static translate-y-0.5 pr-2 text-3xl" /> + {userInfo?.userName} + <i className="diveicon di-chevron-down static p-0 transition-transform group-data-[state=open]:rotate-180" /> + </Button> + </DropdownMenuTrigger> + <DropdownMenuContent> + <DropdownMenuItem>프로필 설정</DropdownMenuItem> + <div className="flex flex-col items-start gap-0 px-4 py-3"> + <p className="text-base text-label">최종접속일</p> + <p>{userInfo?.lastLoginDate}</p> + </div> + <div className="flex flex-col items-start gap-0 px-4 py-3"> + <p className="text-base text-label">접속 IP</p> + <p></p> + </div> + <DropdownMenuItem onClick={logout}>로그아웃</DropdownMenuItem> + </DropdownMenuContent> + </DropdownMenu> + ) + ) : ( + <Skeleton className="mx-4 h-[3rem] w-[15rem]" /> + )} + </div> </header> ); } diff --git a/packages/common/components/src/ui/header/search-form.tsx b/packages/common/components/src/ui/header/search-form.tsx new file mode 100644 index 000000000..66ffbadb1 --- /dev/null +++ b/packages/common/components/src/ui/header/search-form.tsx @@ -0,0 +1,32 @@ +import { Button } from "../button"; +import { Input } from "../input"; + +export function SearchForm() { + const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => { + e.preventDefault(); + const formData = new FormData(e.target as HTMLFormElement); + const keyword = formData.get("keyword") as string; + + if (keyword && keyword.trim().length > 0) { + window.location.href = `/cms/search?keyword=${encodeURIComponent(keyword)}`; + } + }; + + return ( + <form onSubmit={handleSubmit} className="relative flex items-center gap-2"> + <Input + type="text" + name="keyword" + className="h-[3.6rem] w-96 rounded-[3.6rem] pl-4 pr-12" + placeholder="검색어를 입력해주세요." + /> + <Button + type="submit" + size="icon" + className="absolute right-[0.4rem] top-[0.4rem] size-[2.8rem] rounded-full p-2" + > + <i className="diveicon di-search" /> + </Button> + </form> + ); +} From 2f097e29984b411d084abc5b042d1a8a1153b7b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=80=EC=B2=A0?= <jcchoi@onasys.co.kr> Date: Sat, 2 Aug 2025 20:03:20 +0900 Subject: [PATCH 30/36] =?UTF-8?q?=EB=A9=94=EB=89=B4=20=EB=8F=84=EC=9B=80?= =?UTF-8?q?=EB=A7=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/entities/menu/model/menu-interface.ts | 2 ++ apps/cs/src/pages/menu/ui/type-menu-form.tsx | 30 +++++++++++++++++++ packages/common/components/src/api/menu.ts | 1 + 3 files changed, 33 insertions(+) diff --git a/apps/cs/src/entities/menu/model/menu-interface.ts b/apps/cs/src/entities/menu/model/menu-interface.ts index 0c5f4b54c..db2c9e94d 100644 --- a/apps/cs/src/entities/menu/model/menu-interface.ts +++ b/apps/cs/src/entities/menu/model/menu-interface.ts @@ -29,6 +29,7 @@ export interface MenuItem { otptYn: string; newWndwYn: string; requiredUrlPath: boolean; + menuHlpCn: string; } export interface MenuTemporarilyStoredData { @@ -70,6 +71,7 @@ export const menuFormSchema = z.object({ menuPicUserUnqId: z.string().nullish(), menuPicUserUnqIdNm: z.string().nullish(), menuPicDsgnYmd: z.string().nullish(), + menuHlpCn: z.string().nullish(), }); export const siteMapPayloadSchema = z.object({ diff --git a/apps/cs/src/pages/menu/ui/type-menu-form.tsx b/apps/cs/src/pages/menu/ui/type-menu-form.tsx index b64b6063c..9f2864c3b 100644 --- a/apps/cs/src/pages/menu/ui/type-menu-form.tsx +++ b/apps/cs/src/pages/menu/ui/type-menu-form.tsx @@ -1,3 +1,4 @@ +import dynamic from "next/dynamic"; import dayjs from "dayjs"; import type { UseFormReturn } from "react-hook-form"; import { @@ -24,6 +25,11 @@ import { ContentSearchDialog } from "./content-search-dialog"; import { BoardSearchDialog } from "./board-search-dialog"; import { QRCodeDialog } from "./qrcode-dialog"; +const Editor = dynamic( + () => import("@/entities/editor").then((module) => module.Editor), + { ssr: false }, +); + type TypeMenuFormProps = { form: UseFormReturn<MenuFormData>; menuType: MenuType; @@ -417,6 +423,30 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) { </TableRow> </> )} + {menuType === "INSIDE" && ( + <TableRow> + <TableHead> + 도움말 + <InfoTooltip text="메뉴 도움말을 입력하십시오. 메뉴 클릭시 네비게이션바에 도움말이 아이콘이 표시됩니다." /> + </TableHead> + <TableCell className="border"> + <FormField + control={form.control} + name="menuHlpCn" + render={({ field }) => ( + <FormItem> + <FormControl> + <Editor + value={(field.value ?? "") as string} + onEditorChange={field.onChange} + /> + </FormControl> + </FormItem> + )} + /> + </TableCell> + </TableRow> + )} </TableBody> </Table> ); diff --git a/packages/common/components/src/api/menu.ts b/packages/common/components/src/api/menu.ts index 82d48815f..ce6465b84 100644 --- a/packages/common/components/src/api/menu.ts +++ b/packages/common/components/src/api/menu.ts @@ -20,6 +20,7 @@ export interface MenuItem { otptYn: string; newWndwYn: string; requiredUrlPath: boolean; + menuHlpCn: string; } export interface TreeMenu extends MenuItem { From 937cccb2240880e106518aa5787809eea370bee1 Mon Sep 17 00:00:00 2001 From: yschoi <yschoi> Date: Mon, 4 Aug 2025 08:16:49 +0900 Subject: [PATCH 31/36] =?UTF-8?q?=EC=A7=80=EB=8F=84=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/map/searchBar/SearchInputText.tsx | 124 +++++++ apps/wr/app/map/searchBar/comboSearchBar.tsx | 299 +++++++++++++++++ apps/wr/app/map/searchBar/procSearchBar.tsx | 299 +++++++++++++++++ apps/wr/app/map/searchBar/searchBar.tsx | 316 +++++++++--------- apps/wr/middleware.ts | 11 + 5 files changed, 893 insertions(+), 156 deletions(-) create mode 100644 apps/wr/app/map/searchBar/SearchInputText.tsx create mode 100644 apps/wr/app/map/searchBar/comboSearchBar.tsx create mode 100644 apps/wr/app/map/searchBar/procSearchBar.tsx diff --git a/apps/wr/app/map/searchBar/SearchInputText.tsx b/apps/wr/app/map/searchBar/SearchInputText.tsx new file mode 100644 index 000000000..1df92fd16 --- /dev/null +++ b/apps/wr/app/map/searchBar/SearchInputText.tsx @@ -0,0 +1,124 @@ +// SearchInputText.tsx +"use client"; +import { Input } from "@common/components/ui"; +import { useEffect, useRef, useState } from "react"; + +interface SearchInputTextProps { + label?: string; + initValue?: string; + setValue: (val: string) => void; + setRtnData: (val: { bscFctNm: string; bscFctCd: string }) => void; + searchList: { bscFctNm: string; bscFctCd: string }[]; + onEnter?: () => void; + className?: string; +} + +export default function SearchInputText({ + label, + initValue, + setValue, + setRtnData, + searchList, + onEnter, + className, +}: SearchInputTextProps) { + const [showResults, setShowResults] = useState(false); + const [text, setText] = useState(initValue ?? ""); + const [highlightIndex, setHighlightIndex] = useState(-1); + const wrapperRef = useRef(null); + + useEffect(() => { + setText(initValue ?? ""); + }, [initValue]); + + useEffect(() => { + if (searchList.length > 0) { + setShowResults(true); + } else { + setShowResults(false); + } + setHighlightIndex(-1); + }, [searchList]); + + useEffect(() => { + function handleClickOutside(event: MouseEvent) { + if ( + wrapperRef.current && + !(wrapperRef.current as any).contains(event.target) + ) { + setShowResults(false); + } + } + document.addEventListener("mousedown", handleClickOutside); + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, [wrapperRef]); + + const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { + setText(e.target.value); + setValue(e.target.value); + setHighlightIndex(-1); + }; + + const handleSelect = (item: { bscFctNm: string; bscFctCd: string }) => { + setText(item.bscFctNm); + setValue(item.bscFctNm); + setRtnData(item); + setShowResults(false); + }; + + const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => { + if (e.key === "Enter") { + if (highlightIndex >= 0 && highlightIndex < searchList.length) { + const selected = searchList[highlightIndex]; + if (selected) handleSelect(selected); + } else if (onEnter) { + onEnter(); + } + } else if (e.key === "ArrowDown") { + e.preventDefault(); + setHighlightIndex((prev) => + prev < searchList.length - 1 ? prev + 1 : prev + ); + } else if (e.key === "ArrowUp") { + e.preventDefault(); + setHighlightIndex((prev) => (prev > 0 ? prev - 1 : -1)); + } + }; + + return ( + <div className="relative" ref={wrapperRef}> + <Input + value={text} + onChange={handleChange} + onKeyDown={handleKeyDown} + placeholder="시설명을 입력하세요" + className={ + className + " rounded-lg border px-2 py-1 text-sm h-[29.5px]" + } + /> + {showResults && ( + <div className="absolute z-10 mt-1 max-h-200 w-full overflow-auto rounded border bg-white shadow"> + {searchList.length > 0 ? ( + searchList.map((item, index) => ( + <div + key={index} + className={`cursor-pointer px-3 py-1 hover:bg-gray-100 ${ + highlightIndex === index ? "bg-blue-100" : "" + }`} + onClick={() => handleSelect(item)} + > + {item.bscFctNm} + </div> + )) + ) : ( + <div className="px-3 py-2 text-sm text-gray-500"> + 검색 결과가 없습니다. + </div> + )} + </div> + )} + </div> + ); +} diff --git a/apps/wr/app/map/searchBar/comboSearchBar.tsx b/apps/wr/app/map/searchBar/comboSearchBar.tsx new file mode 100644 index 000000000..7502daf94 --- /dev/null +++ b/apps/wr/app/map/searchBar/comboSearchBar.tsx @@ -0,0 +1,299 @@ +"use client"; +import { SelectBox, type SelectDataType } from "@common/business_components/ui"; +import { Button } from "@common/components/ui"; +import { useCallback, useEffect, useState } from "react"; +import { SERVER_API_WR_URL } from "@/src/shared/config"; + +const geoserverUrl = + "/geoserver/hasudo/ows?service=WFS&version=1.0.0&request=GetFeature&outputFormat=application/json"; + +const FACILITY_TYPE_URL_MAP: Record<string, string> = { + tb_il_swage_prcs_fclt: geoserverUrl, //하수처리시설 + tb_wr_bdst_ruse_fclt: + "/reuse-service/reuseFc/pubDetailList/{year}/{sggCd}/1/1000", //재이용시설 post + tb_wr_rnwtr_utztn_fclt: "/reuse-service/reuseFc/rainyInfoList/1/1000/{sggCd}", //빗물이용시설 get + tb_wr_rswtr_fclt: "/reuse-service/reuseFc/waterreuseFc/1/1000/{sggCd}", //중수도시설 get + tb_wr_htdfl_fclt: "/reuse-service/drain/facilityList/1/1000/{sggCd}", //온배수시설 get + tb_wr_ruse_fclt_dmd_co: "/reuse-service/reuseFc/request/1/1000/{sggCd}", //수요처 get + tb_wr_tmpr_dmd_co: + "/reuse-service/reuseFc/request/temp/1/1000/{sidoNm} {sggNm}", //잠재수요처 get +}; + +interface SearchBarProps { + onFeatureSelect: (feature: any) => void; + gisMaps: React.RefObject<any>; + facilityTypes: { text: string; val: string }[]; +} + +export function SearchBar({ + onFeatureSelect, + gisMaps, + facilityTypes, +}: SearchBarProps) { + const [sidoValue, setSidoValue] = useState("0"); + const [sigunValue, setSigunValue] = useState("0"); + const [sidoData, setSidoData] = useState<SelectDataType[]>([ + { text: "선택", val: "0" }, + ]); + const [sigunData, setSigunData] = useState<SelectDataType[]>([ + { text: "선택", val: "0" }, + ]); + const [filteredSigunData, setFilteredSigunData] = useState<SelectDataType[]>([ + { text: "선택", val: "0" }, + ]); + + const [facilityData, setFacilityData] = useState<SelectDataType[]>([ + { text: "선택", val: "0" }, + ]); + const [facilityValue, setFacilityValue] = useState("0"); + + const [facilityType, setFacilityType] = useState( + facilityTypes?.length === 1 && facilityTypes[0] ? facilityTypes[0].val : "0" + ); + + //시도, 시군구 조회 + const fetchSido = async () => { + const url = `/cms-service/api/v1/code/cache/ADSTDSTRCD/Y`; + const res = await fetch(url); + const json = await res.json(); + const sidoList = json + .filter( + (item: any) => + typeof item.lwpoCd === "string" && item.lwpoCd.length === 2 + ) + .map((feature: any) => ({ + val: feature.lwpoCd, + text: feature.lwpoCdNm, + })); + setSidoData([{ text: "선택", val: "0" }, ...sidoList]); + + const sigunList = json + .filter( + (item: any) => + typeof item.lwpoCd === "string" && item.lwpoCd.length !== 2 + ) + .map((feature: any) => ({ + val: feature.lwpoCd, + text: feature.lwpoCdNm, + })); + setSigunData(sigunList); + }; + + //시설명 콤보박스 조회 + const fetchFacilitiesBySggNm = async ( + sggCd: string, + sggNm: string, + sidoNm: string, + currentFacilityType?: string + ) => { + const type = currentFacilityType ?? facilityType; + if (!type || type === "0") return; + + const baseUrlTemplate = FACILITY_TYPE_URL_MAP[type]; + if (!baseUrlTemplate) return; + + const year = new Date().getFullYear().toString(); + let url = baseUrlTemplate + .replace("{year}", year) + .replace("{sggCd}", sggCd) + .replace("{sidoNm}", encodeURIComponent(sidoNm)) + .replace("{sggNm}", encodeURIComponent(sggNm)); + + let list: SelectDataType[] = []; + + if ( + type === "tb_il_swage_prcs_fclt" //하수처리시설 + ) { + const cqlFilter = `ctpv_nm='${encodeURIComponent(sidoNm)}' AND sgg_nm='${encodeURIComponent(sggNm)}'`; + url = `${url}&typeName=hasudo:${type}&cql_filter=${cqlFilter}`; + const res = await fetch(url); + const json = await res.json(); + list = json.features.map((f: any) => ({ + text: f.properties.swtrmt_fclt_nm ?? "(이름없음)", + val: f.id, + })); + } else if ( + type === "tb_wr_bdst_ruse_fclt" // 재이용시설 + ) { + //재용에서 참조하는 하수처리시설 목록 + const paramsRes = await fetch("/reuse-service/reuseFc/pubFc"); + const paramsJson = await paramsRes.json(); + const params = paramsJson.data; + + const res = await fetch(url, { + method: "POST", + headers: { + accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify(params), + }); + const json = await res.json(); + list = (json.data || []).map((item: any) => ({ + text: item.ruseUtztnFcltNm ?? "(이름없음)", + val: item.pbnstRuseFcltId, + })); + } else if ( + type === "tb_wr_ruse_fclt_dmd_co" //수요처 + ) { + const res = await fetch(url); + const json = await res.json(); + list = (json.data || []).map((item: any) => ({ + text: item.dmdCoNm ?? "(이름없음)", + val: item.dmdInfoId, + })); + } else if ( + type === "tb_wr_tmpr_dmd_co" //잠재수요처 + ) { + // GET 방식 + const res = await fetch(url); + const json = await res.json(); + list = (json.data || []).map((item: any) => ({ + text: item.dmdCoNm ?? "(이름없음)", + val: item.fctryMngSn, + })); + } else { + // GET 방식 + const res = await fetch(url); + const json = await res.json(); + list = (json.data || []).map((item: any) => ({ + text: item.bdstNm ?? "(이름없음)", + val: item.bdstInfoSn, + })); + } + + setFacilityData([{ text: "선택", val: "0" }, ...list]); + setFacilityValue("0"); + }; + + //시도, 시군구 초기 데이터 조회 + useEffect(() => { + fetchSido(); + }, []); + + //시군구 데이터 초기화 + const initializeSigunData = useCallback( + (sidoCd: string) => { + if (sidoCd === "0") { + setFilteredSigunData([{ text: "선택", val: "0" }]); + setSigunValue("0"); + return; + } + const prefix = sidoCd.substring(0, 2); + const filtered = sigunData.filter((item) => item.val.startsWith(prefix)); + setFilteredSigunData([{ text: "선택", val: "0" }, ...filtered]); + setSigunValue("0"); + }, + [sigunData] + ); + + //콤보박스 선택시 연관 콤보박스 처리 + const onSelectValue = useCallback( + (val: string, type: string) => { + if (type === "ctpvCd") { + setSidoValue(val); + initializeSigunData(val); + setFacilityData([{ text: "선택", val: "0" }]); + setFacilityValue("0"); + } else if (type === "sggCd") { + setSigunValue(val); + const sidoNm = + sidoData.find((item) => item.val === sidoValue)?.text || ""; + const sggNm = sigunData.find((item) => item.val === val)?.text || ""; + const sggCd = sigunData.find((item) => item.val === val)?.val || ""; + if (sggNm && sidoNm) + fetchFacilitiesBySggNm(sggCd, sggNm, sidoNm, facilityType); + } else if (type === "facilityType") { + setFacilityType(val); + setFacilityValue("0"); + setFacilityData([{ text: "선택", val: "0" }]); + const sidoNm = + sidoData.find((item) => item.val === sidoValue)?.text || ""; + const sggNm = + sigunData.find((item) => item.val === sigunValue)?.text || ""; + const sggCd = + sigunData.find((item) => item.val === sigunValue)?.val || ""; + if (sggNm && sidoNm) fetchFacilitiesBySggNm(sggCd, sggNm, sidoNm, val); + } else if (type === "fcltCd") { + setFacilityValue(val); + } + }, + [initializeSigunData, sigunData, sigunValue, sidoData, sidoValue] + ); + + //조회 버튼 클릭 + const handleSearch = () => { + if (!gisMaps.current || facilityValue === "0") return; + const layers = gisMaps.current.getLayers().getArray(); + for (const layer of layers) { + const source = layer.getSource?.(); + const feature = source?.getFeatureById?.(facilityValue); + if (feature) { + onFeatureSelect(feature); + return; + } + } + alert("해당 처리시설을 지도에서 찾을 수 없습니다."); + }; + + return ( + <div className="grid grid-cols-4 gap-4"> + <div className="col-span-4"> + <div className="card card-border flex"> + <div className="col-span-10 flex flex-row"> + {facilityTypes.length > 1 && ( + <SelectBox + labelClass="w-[120px]" + className="mr-10 w-[190px]" + selectClass="rounded-lg bg-white" + label="시설물유형" + selectArray={[{ text: "선택", val: "0" }, ...facilityTypes]} + onSelectValue={(val) => + onSelectValue(val.toString(), "facilityType") + } + value={facilityType} + /> + )} + <SelectBox + labelClass="w-[40px]" + className="mr-10 w-[150px]" + selectClass="rounded-lg bg-white" + label="시도" + selectArray={sidoData} + onSelectValue={(val) => onSelectValue(val.toString(), "ctpvCd")} + value={sidoValue} + /> + <SelectBox + labelClass="w-[65px]" + className="mr-10 w-[150px]" + selectClass="rounded-lg bg-white" + label="시군구" + selectArray={filteredSigunData} + onSelectValue={(val) => onSelectValue(val.toString(), "sggCd")} + value={sigunValue} + /> + <SelectBox + labelClass="w-[60px]" + className="mr-3 w-[180px]" + selectClass="rounded-lg bg-white" + label="시설명" + selectArray={facilityData} + onSelectValue={(val) => onSelectValue(val.toString(), "fcltCd")} + value={facilityValue} + /> + </div> + <div className="flex flex-row space-x-2"> + <Button + color="primary" + className="mx-2 mt-1 ml-5" + size={"sm"} + onClick={handleSearch} + > + 조회 + </Button> + </div> + </div> + </div> + </div> + ); +} diff --git a/apps/wr/app/map/searchBar/procSearchBar.tsx b/apps/wr/app/map/searchBar/procSearchBar.tsx new file mode 100644 index 000000000..7502daf94 --- /dev/null +++ b/apps/wr/app/map/searchBar/procSearchBar.tsx @@ -0,0 +1,299 @@ +"use client"; +import { SelectBox, type SelectDataType } from "@common/business_components/ui"; +import { Button } from "@common/components/ui"; +import { useCallback, useEffect, useState } from "react"; +import { SERVER_API_WR_URL } from "@/src/shared/config"; + +const geoserverUrl = + "/geoserver/hasudo/ows?service=WFS&version=1.0.0&request=GetFeature&outputFormat=application/json"; + +const FACILITY_TYPE_URL_MAP: Record<string, string> = { + tb_il_swage_prcs_fclt: geoserverUrl, //하수처리시설 + tb_wr_bdst_ruse_fclt: + "/reuse-service/reuseFc/pubDetailList/{year}/{sggCd}/1/1000", //재이용시설 post + tb_wr_rnwtr_utztn_fclt: "/reuse-service/reuseFc/rainyInfoList/1/1000/{sggCd}", //빗물이용시설 get + tb_wr_rswtr_fclt: "/reuse-service/reuseFc/waterreuseFc/1/1000/{sggCd}", //중수도시설 get + tb_wr_htdfl_fclt: "/reuse-service/drain/facilityList/1/1000/{sggCd}", //온배수시설 get + tb_wr_ruse_fclt_dmd_co: "/reuse-service/reuseFc/request/1/1000/{sggCd}", //수요처 get + tb_wr_tmpr_dmd_co: + "/reuse-service/reuseFc/request/temp/1/1000/{sidoNm} {sggNm}", //잠재수요처 get +}; + +interface SearchBarProps { + onFeatureSelect: (feature: any) => void; + gisMaps: React.RefObject<any>; + facilityTypes: { text: string; val: string }[]; +} + +export function SearchBar({ + onFeatureSelect, + gisMaps, + facilityTypes, +}: SearchBarProps) { + const [sidoValue, setSidoValue] = useState("0"); + const [sigunValue, setSigunValue] = useState("0"); + const [sidoData, setSidoData] = useState<SelectDataType[]>([ + { text: "선택", val: "0" }, + ]); + const [sigunData, setSigunData] = useState<SelectDataType[]>([ + { text: "선택", val: "0" }, + ]); + const [filteredSigunData, setFilteredSigunData] = useState<SelectDataType[]>([ + { text: "선택", val: "0" }, + ]); + + const [facilityData, setFacilityData] = useState<SelectDataType[]>([ + { text: "선택", val: "0" }, + ]); + const [facilityValue, setFacilityValue] = useState("0"); + + const [facilityType, setFacilityType] = useState( + facilityTypes?.length === 1 && facilityTypes[0] ? facilityTypes[0].val : "0" + ); + + //시도, 시군구 조회 + const fetchSido = async () => { + const url = `/cms-service/api/v1/code/cache/ADSTDSTRCD/Y`; + const res = await fetch(url); + const json = await res.json(); + const sidoList = json + .filter( + (item: any) => + typeof item.lwpoCd === "string" && item.lwpoCd.length === 2 + ) + .map((feature: any) => ({ + val: feature.lwpoCd, + text: feature.lwpoCdNm, + })); + setSidoData([{ text: "선택", val: "0" }, ...sidoList]); + + const sigunList = json + .filter( + (item: any) => + typeof item.lwpoCd === "string" && item.lwpoCd.length !== 2 + ) + .map((feature: any) => ({ + val: feature.lwpoCd, + text: feature.lwpoCdNm, + })); + setSigunData(sigunList); + }; + + //시설명 콤보박스 조회 + const fetchFacilitiesBySggNm = async ( + sggCd: string, + sggNm: string, + sidoNm: string, + currentFacilityType?: string + ) => { + const type = currentFacilityType ?? facilityType; + if (!type || type === "0") return; + + const baseUrlTemplate = FACILITY_TYPE_URL_MAP[type]; + if (!baseUrlTemplate) return; + + const year = new Date().getFullYear().toString(); + let url = baseUrlTemplate + .replace("{year}", year) + .replace("{sggCd}", sggCd) + .replace("{sidoNm}", encodeURIComponent(sidoNm)) + .replace("{sggNm}", encodeURIComponent(sggNm)); + + let list: SelectDataType[] = []; + + if ( + type === "tb_il_swage_prcs_fclt" //하수처리시설 + ) { + const cqlFilter = `ctpv_nm='${encodeURIComponent(sidoNm)}' AND sgg_nm='${encodeURIComponent(sggNm)}'`; + url = `${url}&typeName=hasudo:${type}&cql_filter=${cqlFilter}`; + const res = await fetch(url); + const json = await res.json(); + list = json.features.map((f: any) => ({ + text: f.properties.swtrmt_fclt_nm ?? "(이름없음)", + val: f.id, + })); + } else if ( + type === "tb_wr_bdst_ruse_fclt" // 재이용시설 + ) { + //재용에서 참조하는 하수처리시설 목록 + const paramsRes = await fetch("/reuse-service/reuseFc/pubFc"); + const paramsJson = await paramsRes.json(); + const params = paramsJson.data; + + const res = await fetch(url, { + method: "POST", + headers: { + accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify(params), + }); + const json = await res.json(); + list = (json.data || []).map((item: any) => ({ + text: item.ruseUtztnFcltNm ?? "(이름없음)", + val: item.pbnstRuseFcltId, + })); + } else if ( + type === "tb_wr_ruse_fclt_dmd_co" //수요처 + ) { + const res = await fetch(url); + const json = await res.json(); + list = (json.data || []).map((item: any) => ({ + text: item.dmdCoNm ?? "(이름없음)", + val: item.dmdInfoId, + })); + } else if ( + type === "tb_wr_tmpr_dmd_co" //잠재수요처 + ) { + // GET 방식 + const res = await fetch(url); + const json = await res.json(); + list = (json.data || []).map((item: any) => ({ + text: item.dmdCoNm ?? "(이름없음)", + val: item.fctryMngSn, + })); + } else { + // GET 방식 + const res = await fetch(url); + const json = await res.json(); + list = (json.data || []).map((item: any) => ({ + text: item.bdstNm ?? "(이름없음)", + val: item.bdstInfoSn, + })); + } + + setFacilityData([{ text: "선택", val: "0" }, ...list]); + setFacilityValue("0"); + }; + + //시도, 시군구 초기 데이터 조회 + useEffect(() => { + fetchSido(); + }, []); + + //시군구 데이터 초기화 + const initializeSigunData = useCallback( + (sidoCd: string) => { + if (sidoCd === "0") { + setFilteredSigunData([{ text: "선택", val: "0" }]); + setSigunValue("0"); + return; + } + const prefix = sidoCd.substring(0, 2); + const filtered = sigunData.filter((item) => item.val.startsWith(prefix)); + setFilteredSigunData([{ text: "선택", val: "0" }, ...filtered]); + setSigunValue("0"); + }, + [sigunData] + ); + + //콤보박스 선택시 연관 콤보박스 처리 + const onSelectValue = useCallback( + (val: string, type: string) => { + if (type === "ctpvCd") { + setSidoValue(val); + initializeSigunData(val); + setFacilityData([{ text: "선택", val: "0" }]); + setFacilityValue("0"); + } else if (type === "sggCd") { + setSigunValue(val); + const sidoNm = + sidoData.find((item) => item.val === sidoValue)?.text || ""; + const sggNm = sigunData.find((item) => item.val === val)?.text || ""; + const sggCd = sigunData.find((item) => item.val === val)?.val || ""; + if (sggNm && sidoNm) + fetchFacilitiesBySggNm(sggCd, sggNm, sidoNm, facilityType); + } else if (type === "facilityType") { + setFacilityType(val); + setFacilityValue("0"); + setFacilityData([{ text: "선택", val: "0" }]); + const sidoNm = + sidoData.find((item) => item.val === sidoValue)?.text || ""; + const sggNm = + sigunData.find((item) => item.val === sigunValue)?.text || ""; + const sggCd = + sigunData.find((item) => item.val === sigunValue)?.val || ""; + if (sggNm && sidoNm) fetchFacilitiesBySggNm(sggCd, sggNm, sidoNm, val); + } else if (type === "fcltCd") { + setFacilityValue(val); + } + }, + [initializeSigunData, sigunData, sigunValue, sidoData, sidoValue] + ); + + //조회 버튼 클릭 + const handleSearch = () => { + if (!gisMaps.current || facilityValue === "0") return; + const layers = gisMaps.current.getLayers().getArray(); + for (const layer of layers) { + const source = layer.getSource?.(); + const feature = source?.getFeatureById?.(facilityValue); + if (feature) { + onFeatureSelect(feature); + return; + } + } + alert("해당 처리시설을 지도에서 찾을 수 없습니다."); + }; + + return ( + <div className="grid grid-cols-4 gap-4"> + <div className="col-span-4"> + <div className="card card-border flex"> + <div className="col-span-10 flex flex-row"> + {facilityTypes.length > 1 && ( + <SelectBox + labelClass="w-[120px]" + className="mr-10 w-[190px]" + selectClass="rounded-lg bg-white" + label="시설물유형" + selectArray={[{ text: "선택", val: "0" }, ...facilityTypes]} + onSelectValue={(val) => + onSelectValue(val.toString(), "facilityType") + } + value={facilityType} + /> + )} + <SelectBox + labelClass="w-[40px]" + className="mr-10 w-[150px]" + selectClass="rounded-lg bg-white" + label="시도" + selectArray={sidoData} + onSelectValue={(val) => onSelectValue(val.toString(), "ctpvCd")} + value={sidoValue} + /> + <SelectBox + labelClass="w-[65px]" + className="mr-10 w-[150px]" + selectClass="rounded-lg bg-white" + label="시군구" + selectArray={filteredSigunData} + onSelectValue={(val) => onSelectValue(val.toString(), "sggCd")} + value={sigunValue} + /> + <SelectBox + labelClass="w-[60px]" + className="mr-3 w-[180px]" + selectClass="rounded-lg bg-white" + label="시설명" + selectArray={facilityData} + onSelectValue={(val) => onSelectValue(val.toString(), "fcltCd")} + value={facilityValue} + /> + </div> + <div className="flex flex-row space-x-2"> + <Button + color="primary" + className="mx-2 mt-1 ml-5" + size={"sm"} + onClick={handleSearch} + > + 조회 + </Button> + </div> + </div> + </div> + </div> + ); +} diff --git a/apps/wr/app/map/searchBar/searchBar.tsx b/apps/wr/app/map/searchBar/searchBar.tsx index 7502daf94..7511169b4 100644 --- a/apps/wr/app/map/searchBar/searchBar.tsx +++ b/apps/wr/app/map/searchBar/searchBar.tsx @@ -1,22 +1,25 @@ +// SearchBar.tsx "use client"; import { SelectBox, type SelectDataType } from "@common/business_components/ui"; import { Button } from "@common/components/ui"; import { useCallback, useEffect, useState } from "react"; -import { SERVER_API_WR_URL } from "@/src/shared/config"; - -const geoserverUrl = - "/geoserver/hasudo/ows?service=WFS&version=1.0.0&request=GetFeature&outputFormat=application/json"; +import SearchInputText from "./SearchInputText"; const FACILITY_TYPE_URL_MAP: Record<string, string> = { - tb_il_swage_prcs_fclt: geoserverUrl, //하수처리시설 + tb_il_swage_prcs_fclt: + "/geoserver/hasudo/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=hasudo:tb_il_swage_prcs_fclt&outputFormat=application/json&propertyName=swtrmt_fclt_cd,swtrmt_fclt_nm&cql_filter=", tb_wr_bdst_ruse_fclt: - "/reuse-service/reuseFc/pubDetailList/{year}/{sggCd}/1/1000", //재이용시설 post - tb_wr_rnwtr_utztn_fclt: "/reuse-service/reuseFc/rainyInfoList/1/1000/{sggCd}", //빗물이용시설 get - tb_wr_rswtr_fclt: "/reuse-service/reuseFc/waterreuseFc/1/1000/{sggCd}", //중수도시설 get - tb_wr_htdfl_fclt: "/reuse-service/drain/facilityList/1/1000/{sggCd}", //온배수시설 get - tb_wr_ruse_fclt_dmd_co: "/reuse-service/reuseFc/request/1/1000/{sggCd}", //수요처 get + "/reuse-service/reuseFc/pubDetailList/{year}/{sggCd}/1/1000/", + tb_wr_rnwtr_utztn_fclt: + "/reuse-service/reuseFc/rainyInfoList/1/1000/{sggCd}/{fcltyNm}", + tb_wr_rswtr_fclt: + "/reuse-service/reuseFc/waterreuseFc/1/1000/{sggCd}/{fcltyNm}", + tb_wr_htdfl_fclt: + "/reuse-service/drain/facilityList/1/1000/{sggCd}/{fcltyNm}", + tb_wr_ruse_fclt_dmd_co: + "/reuse-service/reuseFc/request/1/1000/{sggCd}/{fcltyNm}", tb_wr_tmpr_dmd_co: - "/reuse-service/reuseFc/request/temp/1/1000/{sidoNm} {sggNm}", //잠재수요처 get + "/reuse-service/reuseFc/request/temp/1/1000/{sidoNm} {sggNm}/{fcltyNm}", }; interface SearchBarProps { @@ -32,80 +35,100 @@ export function SearchBar({ }: SearchBarProps) { const [sidoValue, setSidoValue] = useState("0"); const [sigunValue, setSigunValue] = useState("0"); - const [sidoData, setSidoData] = useState<SelectDataType[]>([ - { text: "선택", val: "0" }, - ]); - const [sigunData, setSigunData] = useState<SelectDataType[]>([ - { text: "선택", val: "0" }, - ]); - const [filteredSigunData, setFilteredSigunData] = useState<SelectDataType[]>([ - { text: "선택", val: "0" }, - ]); - - const [facilityData, setFacilityData] = useState<SelectDataType[]>([ - { text: "선택", val: "0" }, - ]); - const [facilityValue, setFacilityValue] = useState("0"); - const [facilityType, setFacilityType] = useState( facilityTypes?.length === 1 && facilityTypes[0] ? facilityTypes[0].val : "0" ); + const [fcltyNm, setFcltyNm] = useState(""); + const [searchList, setSearchList] = useState< + { bscFctNm: string; bscFctCd: string }[] + >([]); + + const [sidoData, setSidoData] = useState<SelectDataType[]>([ + { text: "시도", val: "0" }, + ]); + const [sigunData, setSigunData] = useState<SelectDataType[]>([ + { text: "시군구", val: "0" }, + ]); + const [filteredSigunData, setFilteredSigunData] = useState<SelectDataType[]>([ + { text: "시군구", val: "0" }, + ]); - //시도, 시군구 조회 const fetchSido = async () => { - const url = `/cms-service/api/v1/code/cache/ADSTDSTRCD/Y`; - const res = await fetch(url); + const res = await fetch("/cms-service/api/v1/code/cache/ADSTDSTRCD/Y"); const json = await res.json(); const sidoList = json - .filter( - (item: any) => - typeof item.lwpoCd === "string" && item.lwpoCd.length === 2 - ) - .map((feature: any) => ({ - val: feature.lwpoCd, - text: feature.lwpoCdNm, - })); - setSidoData([{ text: "선택", val: "0" }, ...sidoList]); - + .filter((item: any) => item.lwpoCd?.length === 2) + .map((item: any) => ({ val: item.lwpoCd, text: item.lwpoCdNm })); const sigunList = json - .filter( - (item: any) => - typeof item.lwpoCd === "string" && item.lwpoCd.length !== 2 - ) - .map((feature: any) => ({ - val: feature.lwpoCd, - text: feature.lwpoCdNm, - })); + .filter((item: any) => item.lwpoCd?.length > 2) + .map((item: any) => ({ val: item.lwpoCd, text: item.lwpoCdNm })); + setSidoData([{ text: "시도", val: "0" }, ...sidoList]); setSigunData(sigunList); }; - //시설명 콤보박스 조회 - const fetchFacilitiesBySggNm = async ( - sggCd: string, - sggNm: string, - sidoNm: string, - currentFacilityType?: string - ) => { - const type = currentFacilityType ?? facilityType; - if (!type || type === "0") return; + const initializeSigunData = useCallback( + (sidoCd: string) => { + if (sidoCd === "0") { + setFilteredSigunData([{ text: "시도", val: "0" }]); + setSigunValue("0"); + return; + } + const prefix = sidoCd.substring(0, 2); + const filtered = sigunData.filter((item) => item.val.startsWith(prefix)); + setFilteredSigunData([{ text: "시군구", val: "0" }, ...filtered]); + setSigunValue("0"); + }, + [sigunData] + ); + useEffect(() => { + fetchSido(); + }, []); + + const onSelectValue = useCallback( + (val: string, type: string) => { + if (type === "ctpvCd") { + setSidoValue(val); + initializeSigunData(val); + setSearchList([]); + setFcltyNm(""); + } else if (type === "sggCd") { + setSigunValue(val); + setSearchList([]); + setFcltyNm(""); + } else if (type === "facilityType") { + setFacilityType(val); + setSearchList([]); + setFcltyNm(""); + } + }, + [initializeSigunData] + ); + + const handleSearch = async () => { + if (!fcltyNm) return alert("시설명을 입력하세요."); + + const sidoNm = sidoData.find((item) => item.val === sidoValue)?.text || ""; + const sggNm = sigunData.find((item) => item.val === sigunValue)?.text || ""; + + const type = facilityType; const baseUrlTemplate = FACILITY_TYPE_URL_MAP[type]; if (!baseUrlTemplate) return; + let url = baseUrlTemplate; const year = new Date().getFullYear().toString(); - let url = baseUrlTemplate + url = url .replace("{year}", year) - .replace("{sggCd}", sggCd) + .replace("{sggCd}", sigunValue) .replace("{sidoNm}", encodeURIComponent(sidoNm)) - .replace("{sggNm}", encodeURIComponent(sggNm)); + .replace("{sggNm}", encodeURIComponent(sggNm)) + .replace("{fcltyNm}", encodeURIComponent(fcltyNm)); let list: SelectDataType[] = []; - if ( - type === "tb_il_swage_prcs_fclt" //하수처리시설 - ) { - const cqlFilter = `ctpv_nm='${encodeURIComponent(sidoNm)}' AND sgg_nm='${encodeURIComponent(sggNm)}'`; - url = `${url}&typeName=hasudo:${type}&cql_filter=${cqlFilter}`; + if (type === "tb_il_swage_prcs_fclt") { + const cqlFilter = `ctpv_nm='${sidoNm}' and sgg_nm='${sggNm}' and swtrmt_fclt_nm like '%${fcltyNm}%'`; + url += encodeURIComponent(cqlFilter); const res = await fetch(url); const json = await res.json(); list = json.features.map((f: any) => ({ @@ -115,18 +138,43 @@ export function SearchBar({ } else if ( type === "tb_wr_bdst_ruse_fclt" // 재이용시설 ) { - //재용에서 참조하는 하수처리시설 목록 - const paramsRes = await fetch("/reuse-service/reuseFc/pubFc"); - const paramsJson = await paramsRes.json(); - const params = paramsJson.data; + //재이용에서 참조하는 하수처리시설 목록 + const procRes = await fetch("/reuse-service/reuseFc/pubFc"); + const procJson = await procRes.json(); + const procData = procJson.data; + const procResult = procData + .filter((code: string) => code.slice(0, 5) === sigunValue) + .map((code: string) => { + return code; + }); + //처리시설명으로 처리시설코드 조회 + let procUrl2 = + "/operation-service/prcsFclt/ruseInfo/1/1000/A/{sggCd}/0/1/SW/{fcltyNm}"; + procUrl2 = procUrl2 + .replace("{sggCd}", sigunValue) + .replace("{fcltyNm}", encodeURIComponent(fcltyNm)); + const procRes2 = await fetch(procUrl2, { + method: "POST", + headers: { + accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify(procResult), + }); + const procJson2 = await procRes2.json(); + const procResult2 = (procJson2.data || []).map( + (item: any) => item.bscFctCd + ); + + //최종 처리시설코드로 재이용시설조회 const res = await fetch(url, { method: "POST", headers: { accept: "application/json", "Content-Type": "application/json", }, - body: JSON.stringify(params), + body: JSON.stringify(procResult2), }); const json = await res.json(); list = (json.data || []).map((item: any) => ({ @@ -162,78 +210,19 @@ export function SearchBar({ })); } - setFacilityData([{ text: "선택", val: "0" }, ...list]); - setFacilityValue("0"); - }; - - //시도, 시군구 초기 데이터 조회 - useEffect(() => { - fetchSido(); - }, []); - - //시군구 데이터 초기화 - const initializeSigunData = useCallback( - (sidoCd: string) => { - if (sidoCd === "0") { - setFilteredSigunData([{ text: "선택", val: "0" }]); - setSigunValue("0"); - return; - } - const prefix = sidoCd.substring(0, 2); - const filtered = sigunData.filter((item) => item.val.startsWith(prefix)); - setFilteredSigunData([{ text: "선택", val: "0" }, ...filtered]); - setSigunValue("0"); - }, - [sigunData] - ); - - //콤보박스 선택시 연관 콤보박스 처리 - const onSelectValue = useCallback( - (val: string, type: string) => { - if (type === "ctpvCd") { - setSidoValue(val); - initializeSigunData(val); - setFacilityData([{ text: "선택", val: "0" }]); - setFacilityValue("0"); - } else if (type === "sggCd") { - setSigunValue(val); - const sidoNm = - sidoData.find((item) => item.val === sidoValue)?.text || ""; - const sggNm = sigunData.find((item) => item.val === val)?.text || ""; - const sggCd = sigunData.find((item) => item.val === val)?.val || ""; - if (sggNm && sidoNm) - fetchFacilitiesBySggNm(sggCd, sggNm, sidoNm, facilityType); - } else if (type === "facilityType") { - setFacilityType(val); - setFacilityValue("0"); - setFacilityData([{ text: "선택", val: "0" }]); - const sidoNm = - sidoData.find((item) => item.val === sidoValue)?.text || ""; - const sggNm = - sigunData.find((item) => item.val === sigunValue)?.text || ""; - const sggCd = - sigunData.find((item) => item.val === sigunValue)?.val || ""; - if (sggNm && sidoNm) fetchFacilitiesBySggNm(sggCd, sggNm, sidoNm, val); - } else if (type === "fcltCd") { - setFacilityValue(val); - } - }, - [initializeSigunData, sigunData, sigunValue, sidoData, sidoValue] - ); - - //조회 버튼 클릭 - const handleSearch = () => { - if (!gisMaps.current || facilityValue === "0") return; - const layers = gisMaps.current.getLayers().getArray(); - for (const layer of layers) { - const source = layer.getSource?.(); - const feature = source?.getFeatureById?.(facilityValue); - if (feature) { - onFeatureSelect(feature); - return; - } + if (list.length === 0) { + alert("검색 결과가 없습니다."); + setSearchList([]); + setFcltyNm(""); + return; } - alert("해당 처리시설을 지도에서 찾을 수 없습니다."); + + const newList = list.map((item: any) => { + const code = item.val; + const name = item.text; + return { bscFctNm: name, bscFctCd: code }; + }); + setSearchList(newList); }; return ( @@ -244,10 +233,13 @@ export function SearchBar({ {facilityTypes.length > 1 && ( <SelectBox labelClass="w-[120px]" - className="mr-10 w-[190px]" + className="mr-5 w-[150px]" selectClass="rounded-lg bg-white" - label="시설물유형" - selectArray={[{ text: "선택", val: "0" }, ...facilityTypes]} + label="" + selectArray={[ + { text: "시설 구분", val: "0" }, + ...facilityTypes, + ]} onSelectValue={(val) => onSelectValue(val.toString(), "facilityType") } @@ -256,37 +248,49 @@ export function SearchBar({ )} <SelectBox labelClass="w-[40px]" - className="mr-10 w-[150px]" + className="mr-5 w-[150px]" selectClass="rounded-lg bg-white" - label="시도" + label="" selectArray={sidoData} onSelectValue={(val) => onSelectValue(val.toString(), "ctpvCd")} value={sidoValue} /> <SelectBox labelClass="w-[65px]" - className="mr-10 w-[150px]" + className="mr-5 w-[150px]" selectClass="rounded-lg bg-white" - label="시군구" + label="" selectArray={filteredSigunData} onSelectValue={(val) => onSelectValue(val.toString(), "sggCd")} value={sigunValue} /> - <SelectBox - labelClass="w-[60px]" - className="mr-3 w-[180px]" - selectClass="rounded-lg bg-white" + <SearchInputText label="시설명" - selectArray={facilityData} - onSelectValue={(val) => onSelectValue(val.toString(), "fcltCd")} - value={facilityValue} + initValue={fcltyNm} + setValue={(val: string = "") => { + setFcltyNm(val); + }} + setRtnData={(selected: { + bscFctNm: string; + bscFctCd: string; + }) => { + // 선택된 항목이 있을 경우 onFeatureSelect 실행 + const type = facilityType; + onFeatureSelect({ + layerNm: type, + ...selected, + }); + }} + searchList={searchList} + onEnter={handleSearch} + className="mr-5 w-[150px]" /> </div> <div className="flex flex-row space-x-2"> <Button color="primary" - className="mx-2 mt-1 ml-5" - size={"sm"} + className="mx-2 mt-1" + size="sm" onClick={handleSearch} > 조회 diff --git a/apps/wr/middleware.ts b/apps/wr/middleware.ts index 1a90a5591..d068f6aa5 100644 --- a/apps/wr/middleware.ts +++ b/apps/wr/middleware.ts @@ -9,6 +9,7 @@ const GEOSERVER_URL = process.env.NEXT_PUBLIC_GEOSERVER_URL || ""; const LX_GEOSERVER_URL = process.env.NEXT_PUBLIC_LX_GEOSERVER_URL || ""; const SEWERAGE_API_URL = process.env.NEXT_PUBLIC_SEWERAGE_API_URL || ""; const REUSE_API_URL = process.env.NEXT_PUBLIC_WR_SERVER_API_URL || ""; +const OPERATION_API_URL = process.env.NEXT_PUBLIC_FO_SERVER_API_URL || ""; export function middleware(req: NextRequest) { const pathname = req.nextUrl.pathname; @@ -145,6 +146,15 @@ export function middleware(req: NextRequest) { return NextResponse.rewrite(new URL(newUrl)); } + if (pathname.startsWith("/operation-service")) { + const queryParams = searchParams.toString(); + const newUrl = `${OPERATION_API_URL}${pathname.replace("/operation-service", "")}${ + queryParams ? `?${queryParams}` : "" + }`; + console.log(`[Middleware] Rewriting from '/operation-service' path to: ${newUrl}`); + return NextResponse.rewrite(new URL(newUrl)); + } + return NextResponse.next(); } @@ -157,6 +167,7 @@ export const config = { "/geoserver/:path*", "/sewerage-service/:path*", "/reuse-service/:path*", + "/operation-service/:path*", "/" ], }; From 7a9d568021fe6b55a1ef9d0a0633c48e72098218 Mon Sep 17 00:00:00 2001 From: yschoi <yschoi> Date: Mon, 4 Aug 2025 08:57:13 +0900 Subject: [PATCH 32/36] =?UTF-8?q?gis=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/dm/app/(popup-layout)/map/popup/page.tsx | 1 + apps/fo/app/pages/map/page.tsx | 1 + apps/sn/app/(map-layout)/map/page.tsx | 1 + apps/wr/app/map/mainMap/page.tsx | 1 + 4 files changed, 4 insertions(+) diff --git a/apps/dm/app/(popup-layout)/map/popup/page.tsx b/apps/dm/app/(popup-layout)/map/popup/page.tsx index c0d38a5c5..8547c7ea8 100644 --- a/apps/dm/app/(popup-layout)/map/popup/page.tsx +++ b/apps/dm/app/(popup-layout)/map/popup/page.tsx @@ -260,6 +260,7 @@ const Map = () => { {...props} /> )} + waterDepth={undefined} /> </div> <SelectedFcltList diff --git a/apps/fo/app/pages/map/page.tsx b/apps/fo/app/pages/map/page.tsx index edd7b70d2..d1dca94ae 100644 --- a/apps/fo/app/pages/map/page.tsx +++ b/apps/fo/app/pages/map/page.tsx @@ -143,6 +143,7 @@ const Map = () => { onCheckedLayersChange={undefined} imgVisble={false} searchBar={(props:any) => <SearchBar onFeatureSelect={onFeatureSelect} gisMaps={gisMaps} />} + waterDepth={undefined} /> </div> ); diff --git a/apps/sn/app/(map-layout)/map/page.tsx b/apps/sn/app/(map-layout)/map/page.tsx index 6105bc818..b45b41936 100644 --- a/apps/sn/app/(map-layout)/map/page.tsx +++ b/apps/sn/app/(map-layout)/map/page.tsx @@ -138,6 +138,7 @@ const Map = () => { onCheckedLayersChange={undefined} searchBar={SearchBar} // waterDepth={WaterDepth} + waterDepth={undefined} /> </div> ); diff --git a/apps/wr/app/map/mainMap/page.tsx b/apps/wr/app/map/mainMap/page.tsx index feed1f6ab..4a488201c 100644 --- a/apps/wr/app/map/mainMap/page.tsx +++ b/apps/wr/app/map/mainMap/page.tsx @@ -179,6 +179,7 @@ const Map = () => { /> ); }} + waterDepth={undefined} /> </div> ); From 4a1cb73c50d24cf8c09ddcd9a2ead1c1c730001a Mon Sep 17 00:00:00 2001 From: yschoi <yschoi> Date: Mon, 4 Aug 2025 10:29:37 +0900 Subject: [PATCH 33/36] =?UTF-8?q?=EB=B9=8C=EB=93=9C=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/fo/app/pages/map/page.tsx | 2 +- apps/fo/app/pages/map/searchBar/searchBar.tsx | 1 - apps/wr/app/map/mainMap/page.tsx | 3 +-- apps/wr/app/map/popup/page.tsx | 1 + apps/wr/app/map/searchBar/SearchInputText.tsx | 2 -- apps/wr/app/map/searchBar/comboSearchBar.tsx | 1 - apps/wr/app/map/searchBar/procSearchBar.tsx | 1 - apps/wr/app/map/searchBar/searchBar.tsx | 5 ++--- 8 files changed, 5 insertions(+), 11 deletions(-) diff --git a/apps/fo/app/pages/map/page.tsx b/apps/fo/app/pages/map/page.tsx index d1dca94ae..a388d80ca 100644 --- a/apps/fo/app/pages/map/page.tsx +++ b/apps/fo/app/pages/map/page.tsx @@ -142,7 +142,7 @@ const Map = () => { isSearchModalOpen={isSearchModalOpen} onCheckedLayersChange={undefined} imgVisble={false} - searchBar={(props:any) => <SearchBar onFeatureSelect={onFeatureSelect} gisMaps={gisMaps} />} + searchBar={() => <SearchBar onFeatureSelect={onFeatureSelect} gisMaps={gisMaps} />} waterDepth={undefined} /> </div> diff --git a/apps/fo/app/pages/map/searchBar/searchBar.tsx b/apps/fo/app/pages/map/searchBar/searchBar.tsx index e9084870a..0b1315465 100644 --- a/apps/fo/app/pages/map/searchBar/searchBar.tsx +++ b/apps/fo/app/pages/map/searchBar/searchBar.tsx @@ -2,7 +2,6 @@ import { SelectBox, type SelectDataType } from "@common/business_components/ui"; import { Button } from "@common/components/ui"; import { useCallback, useEffect, useState } from "react"; -import { GEOSERVER_URL } from "@/src/shared/config/env"; interface SearchBarProps { onFeatureSelect: (feature: any) => void; diff --git a/apps/wr/app/map/mainMap/page.tsx b/apps/wr/app/map/mainMap/page.tsx index 4a488201c..7b1d46c88 100644 --- a/apps/wr/app/map/mainMap/page.tsx +++ b/apps/wr/app/map/mainMap/page.tsx @@ -161,7 +161,7 @@ const Map = () => { isSearchModalOpen={isSearchModalOpen} onCheckedLayersChange={handleCheckedLayersChange} imgVisble={true} - searchBar={(props: any) => { + searchBar={() => { const facilityTypes = [ { text: "하수처리시설", val: "tb_il_swage_prcs_fclt" }, { text: "하수재이용시설", val: "tb_wr_bdst_ruse_fclt" }, @@ -174,7 +174,6 @@ const Map = () => { return ( <SearchBar onFeatureSelect={onFeatureSelect} - gisMaps={gisMaps} facilityTypes={facilityTypes} /> ); diff --git a/apps/wr/app/map/popup/page.tsx b/apps/wr/app/map/popup/page.tsx index 6c1cc47d0..c7e091bb4 100644 --- a/apps/wr/app/map/popup/page.tsx +++ b/apps/wr/app/map/popup/page.tsx @@ -141,6 +141,7 @@ const Map = () => { onCheckedLayersChange={handleCheckedLayersChange} imgVisble={true} searchBar={undefined} + waterDepth={undefined} /> </div> ); diff --git a/apps/wr/app/map/searchBar/SearchInputText.tsx b/apps/wr/app/map/searchBar/SearchInputText.tsx index 1df92fd16..caf4c9f2a 100644 --- a/apps/wr/app/map/searchBar/SearchInputText.tsx +++ b/apps/wr/app/map/searchBar/SearchInputText.tsx @@ -4,7 +4,6 @@ import { Input } from "@common/components/ui"; import { useEffect, useRef, useState } from "react"; interface SearchInputTextProps { - label?: string; initValue?: string; setValue: (val: string) => void; setRtnData: (val: { bscFctNm: string; bscFctCd: string }) => void; @@ -14,7 +13,6 @@ interface SearchInputTextProps { } export default function SearchInputText({ - label, initValue, setValue, setRtnData, diff --git a/apps/wr/app/map/searchBar/comboSearchBar.tsx b/apps/wr/app/map/searchBar/comboSearchBar.tsx index 7502daf94..15736d710 100644 --- a/apps/wr/app/map/searchBar/comboSearchBar.tsx +++ b/apps/wr/app/map/searchBar/comboSearchBar.tsx @@ -2,7 +2,6 @@ import { SelectBox, type SelectDataType } from "@common/business_components/ui"; import { Button } from "@common/components/ui"; import { useCallback, useEffect, useState } from "react"; -import { SERVER_API_WR_URL } from "@/src/shared/config"; const geoserverUrl = "/geoserver/hasudo/ows?service=WFS&version=1.0.0&request=GetFeature&outputFormat=application/json"; diff --git a/apps/wr/app/map/searchBar/procSearchBar.tsx b/apps/wr/app/map/searchBar/procSearchBar.tsx index 7502daf94..15736d710 100644 --- a/apps/wr/app/map/searchBar/procSearchBar.tsx +++ b/apps/wr/app/map/searchBar/procSearchBar.tsx @@ -2,7 +2,6 @@ import { SelectBox, type SelectDataType } from "@common/business_components/ui"; import { Button } from "@common/components/ui"; import { useCallback, useEffect, useState } from "react"; -import { SERVER_API_WR_URL } from "@/src/shared/config"; const geoserverUrl = "/geoserver/hasudo/ows?service=WFS&version=1.0.0&request=GetFeature&outputFormat=application/json"; diff --git a/apps/wr/app/map/searchBar/searchBar.tsx b/apps/wr/app/map/searchBar/searchBar.tsx index 7511169b4..7760ee0b8 100644 --- a/apps/wr/app/map/searchBar/searchBar.tsx +++ b/apps/wr/app/map/searchBar/searchBar.tsx @@ -24,13 +24,13 @@ const FACILITY_TYPE_URL_MAP: Record<string, string> = { interface SearchBarProps { onFeatureSelect: (feature: any) => void; - gisMaps: React.RefObject<any>; + // gisMaps: React.RefObject<any>; facilityTypes: { text: string; val: string }[]; } export function SearchBar({ onFeatureSelect, - gisMaps, + // gisMaps, facilityTypes, }: SearchBarProps) { const [sidoValue, setSidoValue] = useState("0"); @@ -265,7 +265,6 @@ export function SearchBar({ value={sigunValue} /> <SearchInputText - label="시설명" initValue={fcltyNm} setValue={(val: string = "") => { setFcltyNm(val); From 3c76b3ae0b994a79b1413611dc2f28abe336589d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=80=EC=B2=A0?= <jcchoi@onasys.co.kr> Date: Mon, 4 Aug 2025 10:36:08 +0900 Subject: [PATCH 34/36] =?UTF-8?q?=EB=8F=84=EC=9B=80=EB=A7=90=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/search/ui/search-page.tsx | 3 +- .../common/components/src/ui/footer/index.tsx | 3 +- .../common/components/src/ui/lnb/index.tsx | 59 +++++++++++++++++-- 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/apps/common/features/src/pages/search/ui/search-page.tsx b/apps/common/features/src/pages/search/ui/search-page.tsx index 407d2301c..dd1aec0b2 100644 --- a/apps/common/features/src/pages/search/ui/search-page.tsx +++ b/apps/common/features/src/pages/search/ui/search-page.tsx @@ -84,8 +84,7 @@ function SearchPage() { <TabsList className="mx-auto"> <TabsTrigger value="all"> 전체 ( - {data?.contsList?.length ?? - 0 + (data?.boardList?.totalElements ?? 0)} + { (data?.contsList?.length ?? 0) + (data?.boardList?.totalElements ?? 0)} 건) </TabsTrigger> <TabsTrigger value="contents"> diff --git a/packages/common/components/src/ui/footer/index.tsx b/packages/common/components/src/ui/footer/index.tsx index a760be6a5..b72e3a9be 100644 --- a/packages/common/components/src/ui/footer/index.tsx +++ b/packages/common/components/src/ui/footer/index.tsx @@ -26,7 +26,8 @@ export function Footer() { return ( <footer className="flex w-full shrink-0 items-start border-t border-solid border-border bg-background px-6 py-8"> <div className="w-1/2"> - <h6 className="mb-4 text-2xl font-bold">{siteInfo?.siteExpln ?? ""}</h6> + <h6 className="mb-4 text-2xl font-bold">{siteInfo?.siteNm ?? ""}</h6> + <p className="my-1 text-xl opacity-60">{siteInfo?.siteAddr ?? ""}</p> <p className="my-1 text-xl opacity-60"> 전화: {siteInfo?.telNo ?? ""} / 팩스: {siteInfo?.faxNumber ?? ""} </p> diff --git a/packages/common/components/src/ui/lnb/index.tsx b/packages/common/components/src/ui/lnb/index.tsx index 8e3c2aebf..b7ce9c6fa 100644 --- a/packages/common/components/src/ui/lnb/index.tsx +++ b/packages/common/components/src/ui/lnb/index.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, useRef } from "react"; import { useQuery } from "@tanstack/react-query"; -import { ChevronRight } from "lucide-react"; +import { ChevronRight, HelpCircle } from "lucide-react"; import { useDetectDevice } from "@frontend-opensource/use-react-hooks"; import { getConfig } from "@common/config"; import { getParentIds } from "./lib"; @@ -22,6 +22,13 @@ import { CollapsibleContent, CollapsibleTrigger, } from "../collapsible"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "../dialog"; import { ENDPOINT } from "../../config"; import { cn, getCookie, setCookie } from "../../lib"; import { @@ -56,6 +63,8 @@ export function LNB({ }) { const [defaultOpenMenuIds, setDefaultOpenMenuIds] = useState<number[]>([]); const [currentMenuCode, setCurrentMenuCode] = useState<number | null>(null); + const [currentMenuHelp, setCurrentMenuHelp] = useState<string>(""); + const [isHelpModalOpen, setIsHelpModalOpen] = useState(false); const prevPathRef = useRef(currentPath); const { browser } = useDetectDevice(); @@ -95,6 +104,7 @@ export function LNB({ const matchedMenuIds: number[] = []; let matchedMenuCode: number | null = null; + let matchedMenuHelp: string = ""; const findMatchedMenus = (items: MenuItem[]) => { items.forEach((item) => { @@ -109,7 +119,10 @@ export function LNB({ const findMatchedMenuCode = (items: MenuItem[]) => { items.forEach((item) => { if (matchedMenuCode) return; - if (currentPath === item.urlPath) matchedMenuCode = item.menuCd; + if (currentPath === item.urlPath) { + matchedMenuCode = item.menuCd; + matchedMenuHelp = item.menuHlpCn || ""; + } if (item.children) findMatchedMenuCode(item.children); }); }; @@ -127,7 +140,10 @@ export function LNB({ prevPathRef.current = currentPath; } - if (matchedMenuCode) setCurrentMenuCode(matchedMenuCode); + if (matchedMenuCode) { + setCurrentMenuCode(matchedMenuCode); + setCurrentMenuHelp(matchedMenuHelp); + } // 접속 로그 저장 saveConnectionLog({ @@ -185,7 +201,7 @@ export function LNB({ /> <span className={cn("whitespace-nowrap", !isSidebarOpen && "hidden")}> {item.menuKornNm} - </span> + </span> </MenuButton> </MenuItem> ); @@ -268,6 +284,41 @@ export function LNB({ <SidebarMenu className="gap-0"> {menuList?.map((item) => <MenuItem key={item.menuCd} item={item} />)} </SidebarMenu> + + {/* 도움말 아이콘 */} + <div className="mt-auto pb-4"> + <Dialog open={isHelpModalOpen} onOpenChange={setIsHelpModalOpen}> + <DialogTrigger asChild> + <button + className={cn( + "flex h-12 w-full items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground", + "focus:outline-none" + )} + title="도움말" + > + <HelpCircle className="size-8" /> + <span className="ml-2">도움말</span> + </button> + </DialogTrigger> + <DialogContent className="sm:max-w-[85rem]"> + <DialogHeader> + <DialogTitle>도움말</DialogTitle> + </DialogHeader> + <div className="py-4"> + {currentMenuHelp ? ( + <div + className="text-sm leading-relaxed text-muted-foreground" + dangerouslySetInnerHTML={{ __html: currentMenuHelp }} + /> + ) : ( + <p className="text-sm text-muted-foreground"> + 현재 페이지에 대한 도움말이 없습니다. + </p> + )} + </div> + </DialogContent> + </Dialog> + </div> </SidebarContent> </Sidebar> ); From c56a32dad672e6c2047389e23d0f19c1e4f14568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=80=EC=B2=A0?= <jcchoi@onasys.co.kr> Date: Mon, 4 Aug 2025 10:46:35 +0900 Subject: [PATCH 35/36] =?UTF-8?q?=EA=B3=B5=ED=86=B5=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=88=98=EC=A0=95=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + apps/cm/.env.development | 7 +++++++ apps/cm/.env.local | 8 ++++++++ apps/cm/.env.production | 7 +++++++ apps/cm/.env.zip | Bin 0 -> 208838 bytes apps/cm/next-env.d.ts | 6 ++++++ 6 files changed, 29 insertions(+) create mode 100644 apps/cm/.env.development create mode 100644 apps/cm/.env.local create mode 100644 apps/cm/.env.production create mode 100644 apps/cm/.env.zip create mode 100644 apps/cm/next-env.d.ts diff --git a/README.md b/README.md index e90d891aa..6b69ee90b 100644 --- a/README.md +++ b/README.md @@ -201,3 +201,4 @@ http://dev.onasys.co.kr:8000/webjars/swagger-ui/index.html?urls.primaryName=atta - 사이드바 메뉴 클릭 시 "menuCd" 데이터 쿠키 저장 처리 - 쿠키명 : menu-code-key - 해당 메뉴 쿠키 데이터 가져와 페이지 권한 및 상당 Breadcrumb 데이터 전달 처리 + diff --git a/apps/cm/.env.development b/apps/cm/.env.development new file mode 100644 index 000000000..9f786831b --- /dev/null +++ b/apps/cm/.env.development @@ -0,0 +1,7 @@ +# apps/cs/src/shared/config/env.ts 참고 +NEXT_PUBLIC_PORT=3000 +NEXT_PUBLIC_PROXY_HOST=http://localhost:3000 +NEXT_PUBLIC_SITE_ID=CS +NEXT_PUBLIC_SUB_DOMAIN=http://localhost:3000 +NEXT_PUBLIC_SERVER_API_URL=http://192.168.0.102:8000 +NEXT_PUBLIC_TINY_API_KEY=t9nc4z6inquvvd5pq1vea8wcp7lb01qmqseh6egms9vpaju2 \ No newline at end of file diff --git a/apps/cm/.env.local b/apps/cm/.env.local new file mode 100644 index 000000000..896025bd6 --- /dev/null +++ b/apps/cm/.env.local @@ -0,0 +1,8 @@ +# apps/cs/src/shared/config/env.ts 참고 +NEXT_PUBLIC_PORT=3000 +NEXT_PUBLIC_PROXY_HOST=http://localhost:3000 +NEXT_PUBLIC_SITE_ID=CS +NEXT_PUBLIC_SUB_DOMAIN=http://localhost:13000 +NEXT_PUBLIC_SERVER_API_URL=http://192.168.0.102:8000 +NEXT_PUBLIC_LINK_BACKEND_API_HOST=http://rsone.iptime.org:10014 +NEXT_PUBLIC_TINY_API_KEY=t9nc4z6inquvvd5pq1vea8wcp7lb01qmqseh6egms9vpaju2 \ No newline at end of file diff --git a/apps/cm/.env.production b/apps/cm/.env.production new file mode 100644 index 000000000..9f786831b --- /dev/null +++ b/apps/cm/.env.production @@ -0,0 +1,7 @@ +# apps/cs/src/shared/config/env.ts 참고 +NEXT_PUBLIC_PORT=3000 +NEXT_PUBLIC_PROXY_HOST=http://localhost:3000 +NEXT_PUBLIC_SITE_ID=CS +NEXT_PUBLIC_SUB_DOMAIN=http://localhost:3000 +NEXT_PUBLIC_SERVER_API_URL=http://192.168.0.102:8000 +NEXT_PUBLIC_TINY_API_KEY=t9nc4z6inquvvd5pq1vea8wcp7lb01qmqseh6egms9vpaju2 \ No newline at end of file diff --git a/apps/cm/.env.zip b/apps/cm/.env.zip new file mode 100644 index 0000000000000000000000000000000000000000..610032d09678d470c0b5856f93210393b5e9c4a7 GIT binary patch literal 208838 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%0Ab^&@;>U9Y~|dqbPE%UX`9@9a|J1Erqt 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 literal 0 HcmV?d00001 diff --git a/apps/cm/next-env.d.ts b/apps/cm/next-env.d.ts new file mode 100644 index 000000000..3cd7048ed --- /dev/null +++ b/apps/cm/next-env.d.ts @@ -0,0 +1,6 @@ +/// <reference types="next" /> +/// <reference types="next/image-types/global" /> +/// <reference types="next/navigation-types/compat/navigation" /> + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. From d019ed61828f9fa679e91e461db3940b45222f1b Mon Sep 17 00:00:00 2001 From: RSONE001 <rsone001@gmail.com> Date: Tue, 5 Aug 2025 14:12:26 +0900 Subject: [PATCH 36/36] =?UTF-8?q?=EC=97=B0=EA=B3=84=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EC=86=8C=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/entities/link/model/link-interface.ts | 22 +++++++++---------- .../cs/src/pages/link/model/table-columns.tsx | 4 ++-- apps/cs/src/pages/link/ui/link-form.tsx | 8 +++---- apps/cs/src/pages/link/ui/modify-page.tsx | 6 ++--- apps/cs/src/pages/link/ui/regist-page.tsx | 6 ++--- .../linkParams/ui/link-params-dialog.tsx | 2 +- .../pages/linkParams/ui/link-params-page.tsx | 8 +++---- .../pages/linkTable/ui/link-table-dialog.tsx | 4 ++-- .../pages/linkTable/ui/link-table-page.tsx | 12 +++++----- 9 files changed, 36 insertions(+), 36 deletions(-) diff --git a/apps/cs/src/entities/link/model/link-interface.ts b/apps/cs/src/entities/link/model/link-interface.ts index c4493a6c0..57d1b4582 100644 --- a/apps/cs/src/entities/link/model/link-interface.ts +++ b/apps/cs/src/entities/link/model/link-interface.ts @@ -18,8 +18,8 @@ export interface Link { next_link_excn_dt: string; last_link_err_cd: string; mdfcn_dt: string; - mdfr: string; - link_batch_time: string; + mdfr_id_id: string; + link_cycle_mi: string; } export interface LinkLog { @@ -48,8 +48,8 @@ export interface LinkInfo extends LinkFormData { next_link_excn_dt: string; last_link_err_cd: string; mdfcn_dt: string; - mdfr: string; - link_batch_time: number; + mdfr_id: string; + link_cycle_mi: number; } export interface LinkStats { @@ -65,7 +65,7 @@ export interface LinkVrbl { link_vrbl_cd: string; link_vrbl_expln: string; mdfcn_dt: string; - mdfr: string; + mdfr_id: string; } export interface LinkTable { @@ -94,7 +94,7 @@ export interface LinkTableColumns { pk_yn: string; col_seq: number; mdfcn_dt: string; - mdfr: string; + mdfr_id: string; } export const linkFormSchema = z.object({ @@ -118,8 +118,8 @@ export const linkFormSchema = z.object({ next_link_excn_dt: z.string().max(40).nullable().optional(), last_link_err_cd: z.string().max(10).nullable().optional(), mdfcn_dt: z.string().nullable().optional(), - mdfr: z.string().nullable().optional(), - link_batch_time: z.coerce.number().nullable().optional().refine((val) => { + mdfr_id: z.string().nullable().optional(), + link_cycle_mi: z.coerce.number().nullable().optional().refine((val) => { if (val == null) return true; return val >= 5; }, { @@ -135,7 +135,7 @@ export const linkVrblFormSchema = z.object({ link_vrbl_cd: z.string().max(10, { message: '변수코드는 10자 이하로 입력해 주세요.' }).nullable().optional(), link_vrbl_vl: z.string().max(1000, { message: '변수값은 1000자 이하로 입력해 주세요.' }).nonempty({ message: '변수값은 필수입니다.' }), mdfcn_dt: z.string().nullable().optional(), - mdfr: z.string().nullable().optional(), + mdfr_id: z.string().nullable().optional(), }); export const LinkTableColumnsSchema = z.object({ @@ -168,7 +168,7 @@ export const LinkTableColumnsSchema = z.object({ message: "컬럼 매칭 순서는 0 이상이어야 합니다." }), mdfcn_dt: z.string().nullable().optional(), - mdfr: z.string().nullable().optional(), + mdfr_id: z.string().nullable().optional(), }); export const LinkTableSchema = z.object({ @@ -182,7 +182,7 @@ export const LinkTableSchema = z.object({ trsf_tbl_korn_nm: z.string().max(40, { message: '40자 이하로 입력해 주세요.' }).nonempty({ message: '변환테이블 한글명은 필수입니다.' }), trsf_tbl_expln: z.string().max(2000, { message: '설명은 2000자 이하로 입력해 주세요.' }).nullable().optional(), mdfcn_dt: z.string().nullable().optional(), - mdfr: z.string().nullable().optional(), + mdfr_id: z.string().nullable().optional(), }); interface LinkStatsListObject { diff --git a/apps/cs/src/pages/link/model/table-columns.tsx b/apps/cs/src/pages/link/model/table-columns.tsx index 5b1710fec..81b86b570 100644 --- a/apps/cs/src/pages/link/model/table-columns.tsx +++ b/apps/cs/src/pages/link/model/table-columns.tsx @@ -53,8 +53,8 @@ const columns = [ header: '연계서버 IP', cell: (info) => (info.getValue() ? info.getValue() : '-'), }), - columnHelper.accessor('link_batch_time', { - id: 'link_batch_time', + columnHelper.accessor('link_cycle_mi', { + id: 'link_cycle_mi', header: '연계 주기', cell: (info) => convertMinutesToPeriod(Number(info.getValue())), }), diff --git a/apps/cs/src/pages/link/ui/link-form.tsx b/apps/cs/src/pages/link/ui/link-form.tsx index 172215662..41f125335 100644 --- a/apps/cs/src/pages/link/ui/link-form.tsx +++ b/apps/cs/src/pages/link/ui/link-form.tsx @@ -336,7 +336,7 @@ const LinkForm = ({ form, linkSn, updateLinkInfo, handleInsertLink, deleteLink, <TableCell> <FormField control={form.control} - name="link_batch_time" + name="link_cycle_mi" render={({ field }) => { const timeParts = convertMinutesToPeriod(Number(field.value)); return ( @@ -434,9 +434,9 @@ const LinkForm = ({ form, linkSn, updateLinkInfo, handleInsertLink, deleteLink, </div> </div> </FormControl> - {form.formState.errors.link_batch_time && ( + {form.formState.errors.link_cycle_mi && ( <p className="text-red-500 text-base pt-2"> - {form.formState.errors.link_batch_time.message} + {form.formState.errors.link_cycle_mi.message} </p> )} </FormItem> @@ -520,7 +520,7 @@ const LinkForm = ({ form, linkSn, updateLinkInfo, handleInsertLink, deleteLink, <TableCell> <FormField control={form.control} - name="mdfr" + name="mdfr_id" render={({ field }) => ( <FormItem> <FormControl> diff --git a/apps/cs/src/pages/link/ui/modify-page.tsx b/apps/cs/src/pages/link/ui/modify-page.tsx index 594cb4c49..c690b8aa7 100644 --- a/apps/cs/src/pages/link/ui/modify-page.tsx +++ b/apps/cs/src/pages/link/ui/modify-page.tsx @@ -35,7 +35,7 @@ function ModifyLinkPage({ linkSn }: { linkSn: string }) { mutationFn: (data: LinkFormData) => LinkApi.updateLinkInfo({ ...data, link_clsf_cd: data.link_clsf_cd !== 'none' ? data.link_clsf_cd : null, - mdfr: userUniqId + mdfr_id: userUniqId }), onSuccess: () => { alert('수정되었습니다.'); @@ -73,11 +73,11 @@ function ModifyLinkPage({ linkSn }: { linkSn: string }) { if (linkInfo) { let newData = { ...linkInfo }; - if (linkInfo.mdfr) { + if (linkInfo.mdfr_id) { const userName = await fetchUserInfo(); newData = { ...linkInfo, - mdfr: userName, + mdfr_id: userName, }; } diff --git a/apps/cs/src/pages/link/ui/regist-page.tsx b/apps/cs/src/pages/link/ui/regist-page.tsx index 403aefa24..76912ab9f 100644 --- a/apps/cs/src/pages/link/ui/regist-page.tsx +++ b/apps/cs/src/pages/link/ui/regist-page.tsx @@ -27,7 +27,7 @@ function RegistLinkPage() { link_id: '', link_pswd: '', srvc_usg: '', - link_batch_time: 5, + link_cycle_mi: 5, link_clsf_cd: 'none', }, }); @@ -44,8 +44,8 @@ function RegistLinkPage() { const insertData = { ...data, link_clsf_cd: data.link_clsf_cd !== 'none' ? data.link_clsf_cd : null, - next_link_excn_dt: dayjs().add(Number(data.link_batch_time), 'minute').format('YYYY-MM-DD HH:mm:ss'), - mdfr: userUniqId, + next_link_excn_dt: dayjs().add(Number(data.link_cycle_mi), 'minute').format('YYYY-MM-DD HH:mm:ss'), + mdfr_id: userUniqId, }; insertLinkInfo(insertData); diff --git a/apps/cs/src/pages/linkParams/ui/link-params-dialog.tsx b/apps/cs/src/pages/linkParams/ui/link-params-dialog.tsx index cff72a030..9a3e2b87e 100644 --- a/apps/cs/src/pages/linkParams/ui/link-params-dialog.tsx +++ b/apps/cs/src/pages/linkParams/ui/link-params-dialog.tsx @@ -292,7 +292,7 @@ function LinkParamsDialog({ selectedLink, form, insertLinkVrbl, dialogOpen, onOp <TableCell> <FormField control={form.control} - name="mdfr" + name="mdfr_id" render={({ field }) => ( <FormItem> <FormControl> diff --git a/apps/cs/src/pages/linkParams/ui/link-params-page.tsx b/apps/cs/src/pages/linkParams/ui/link-params-page.tsx index 4c811ce13..319df80b2 100644 --- a/apps/cs/src/pages/linkParams/ui/link-params-page.tsx +++ b/apps/cs/src/pages/linkParams/ui/link-params-page.tsx @@ -112,7 +112,7 @@ function LinkParamsPage() { await LinkApi.insertLinkVrbl({ ...data, link_sn: selectedLink.linkSn, - mdfr: userUniqId, + mdfr_id: userUniqId, }), onSuccess: async () => { // 쿼리 무효화를 통한 최신 데이터 가져오기 @@ -128,7 +128,7 @@ function LinkParamsPage() { mutationFn: async (data: LinkVrblFormData) => await LinkApi.updateLinkVrblInfo({ ...data, link_sn: selectedLink.linkSn, - mdfr: userUniqId, + mdfr_id: userUniqId, }), onSuccess: async () => { await queryClient.invalidateQueries({ @@ -229,11 +229,11 @@ function LinkParamsPage() { if (linkVrblInfo) { let newData = { ...linkVrblInfo }; - if (linkVrblInfo.mdfr) { + if (linkVrblInfo.mdfr_id) { const userName = await fetchUserInfo(); newData = { ...linkVrblInfo, - mdfr: userName, + mdfr_id: userName, }; } diff --git a/apps/cs/src/pages/linkTable/ui/link-table-dialog.tsx b/apps/cs/src/pages/linkTable/ui/link-table-dialog.tsx index a566a7d95..be835872d 100644 --- a/apps/cs/src/pages/linkTable/ui/link-table-dialog.tsx +++ b/apps/cs/src/pages/linkTable/ui/link-table-dialog.tsx @@ -101,7 +101,7 @@ function LinkTableDialog({ dialogOpen, onOpenChange, form, tableInfo, insertLink col_seq: null, pk_yn: 'N', mdfcn_dt: '', - mdfr: '', + mdfr_id: '', }); } @@ -444,7 +444,7 @@ function LinkTableDialog({ dialogOpen, onOpenChange, form, tableInfo, insertLink <TableCell> <FormField control={form.control} - name="mdfr" + name="mdfr_id" render={({ field }) => ( <FormItem> <FormControl> diff --git a/apps/cs/src/pages/linkTable/ui/link-table-page.tsx b/apps/cs/src/pages/linkTable/ui/link-table-page.tsx index cbdf4627a..0394e7bf6 100644 --- a/apps/cs/src/pages/linkTable/ui/link-table-page.tsx +++ b/apps/cs/src/pages/linkTable/ui/link-table-page.tsx @@ -78,7 +78,7 @@ function LinkTablePage() { const { mutateAsync: insertLinkTableCol } = useMutation({ mutationFn: async (data: LinkTableColData) => await LinkApi.insertLinkTableCol({ ...data, - mdfr: userUniqId, + mdfr_id: userUniqId, }), onSuccess: async () => { if (selectedTableInfo) { @@ -104,7 +104,7 @@ function LinkTablePage() { const { mutateAsync: updateLinkTableCol } = useMutation({ mutationFn: async (data: LinkTableColData) => await LinkApi.updateLinkTableCol({ ...data, - mdfr: userUniqId, + mdfr_id: userUniqId, }), onSuccess: async () => { if (selectedTableInfo) { @@ -280,11 +280,11 @@ function LinkTablePage() { if (colInfo) { let newData = { ...colInfo }; - if (colInfo.mdfr) { + if (colInfo.mdfr_id) { const userName = await fetchUserInfo(); newData = { ...colInfo, - mdfr: userName, + mdfr_id: userName, }; } @@ -319,7 +319,7 @@ function LinkTablePage() { if (await confirm(confirmMsg)) { insertLinkTableInfo({ ...data, - mdfr: userUniqId, + mdfr_id: userUniqId, tbl_sn: (regTblInfo.count > 0) ? regTblInfo.tbl_sn : "", }); } @@ -330,7 +330,7 @@ function LinkTablePage() { updateLinkTableInfo({ ...data, tbl_sn: (regTblInfo.count > 0) ? regTblInfo.tbl_sn : "", - mdfr: userUniqId, + mdfr_id: userUniqId, }); } });