From 6b1e8033201e5a999ae9831d2935cf17f8b85142 Mon Sep 17 00:00:00 2001 From: zhongyidian Date: Tue, 8 Sep 2026 14:19:44 +0800 Subject: [PATCH] Initial commit --- .biomeignore | 4 + .cursorrules | 50 + .gitignore | 28 + .gitmessage | 16 + .husky/pre-commit | 4 + .npmignore | 27 + .npmrc | 11 + CLAUDE.md | 187 + LICENSE | 21 + README.md | 743 +++ biome.json | 50 + bun.lock | 403 ++ components.json | 22 + index.html | 17 + package.json | 49 + playwright.config.ts | 39 + postcss.config.js | 5 + public/videoajax/jquery-3.7.1.min.js | 4902 +++++++++++++++++ public/videoajax/videoajax.js | 457 ++ public/videoajax/videoajax.min.js | 1 + public/vite.svg | 1 + src/App.tsx | 45 + src/api/client.ts | 84 + src/api/client.types.ts | 10 + src/api/index.ts | 2 + src/app.config.ts | 35 + src/assets/react.svg | 1 + .../business/Navigation/Navigation.module.css | 15 + .../business/Navigation/Navigation.tsx | 35 + .../business/Navigation/Navigation.types.ts | 9 + src/components/business/Navigation/index.ts | 2 + src/components/business/index.ts | 2 + .../BackgroundContainer.module.css | 9 + .../BackgroundContainer.tsx | 41 + .../BackgroundContainer.types.ts | 21 + .../common/BackgroundContainer/index.ts | 7 + .../common/GuideDialog/GuideDialog.helpers.ts | 44 + .../common/GuideDialog/GuideDialog.tsx | 56 + .../common/GuideDialog/GuideDialog.types.ts | 12 + src/components/common/GuideDialog/index.ts | 11 + .../GuideSpotlight/GuideSpotlight.helpers.ts | 57 + .../common/GuideSpotlight/GuideSpotlight.tsx | 56 + .../GuideSpotlight/GuideSpotlight.types.ts | 14 + src/components/common/GuideSpotlight/index.ts | 11 + .../common/ImageButton/ImageButton.module.css | 34 + .../common/ImageButton/ImageButton.tsx | 53 + .../common/ImageButton/ImageButton.types.ts | 15 + src/components/common/ImageButton/index.ts | 2 + .../common/RouteFallback/RouteError.tsx | 39 + .../common/RouteFallback/RouteFallback.tsx | 7 + src/components/common/RouteFallback/index.ts | 2 + src/components/common/Video/VideoOverlay.tsx | 67 + .../common/Video/VideoOverlay.types.ts | 28 + .../common/Video/VideoPlayer.module.css | 134 + src/components/common/Video/VideoPlayer.tsx | 1079 ++++ .../common/Video/VideoPlayer.types.ts | 50 + src/components/common/Video/index.ts | 4 + src/components/common/index.ts | 49 + src/components/ui/button/Button.module.css | 48 + src/components/ui/button/Button.tsx | 23 + src/components/ui/button/Button.types.ts | 6 + src/components/ui/button/index.ts | 2 + src/components/ui/overlay/Overlay.module.css | 41 + src/components/ui/overlay/Overlay.tsx | 98 + src/components/ui/overlay/Overlay.types.ts | 19 + src/components/ui/overlay/index.ts | 2 + src/components/ui/portal/Portal.tsx | 26 + src/components/ui/portal/Portal.types.ts | 13 + src/components/ui/portal/index.ts | 2 + src/components/ui/toast/Toast.module.css | 36 + src/components/ui/toast/Toast.types.ts | 72 + src/components/ui/toast/ToastItem.tsx | 30 + src/components/ui/toast/ToastProvider.tsx | 127 + src/components/ui/toast/ToastViewport.tsx | 40 + src/components/ui/toast/index.ts | 12 + src/course/canvas/CanvasContext.ts | 14 + src/course/canvas/CourseCanvas.tsx | 134 + src/course/canvas/CourseCanvas.types.ts | 27 + src/course/canvas/canvasPortal.ts | 16 + src/course/canvas/index.ts | 8 + src/course/canvas/useCanvasScale.ts | 57 + .../drag-drop/DragDrop.module.css | 21 + .../interactions/drag-drop/DragDrop.types.ts | 79 + .../drag-drop/DragDropContext.tsx | 22 + .../drag-drop/DragDropProvider.tsx | 123 + .../interactions/drag-drop/Draggable.tsx | 56 + .../interactions/drag-drop/Droppable.tsx | 49 + .../interactions/drag-drop/collision.ts | 15 + src/course/interactions/drag-drop/index.ts | 13 + .../guide-dialog/DefaultGuideDialogPanel.tsx | 72 + .../guide-dialog/GuideDialog.module.css | 101 + .../interactions/guide-dialog/GuideDialog.tsx | 300 + .../guide-dialog/GuideDialog.types.ts | 108 + src/course/interactions/guide-dialog/index.ts | 15 + .../DefaultGuideSpotlightPanel.tsx | 41 + .../guide-spotlight/GuideSpotlight.module.css | 158 + .../guide-spotlight/GuideSpotlight.tsx | 636 +++ .../guide-spotlight/GuideSpotlight.types.ts | 118 + .../interactions/guide-spotlight/index.ts | 15 + src/course/orientation/OrientationGuard.tsx | 37 + .../orientation/OrientationGuard.types.ts | 6 + src/course/orientation/index.ts | 3 + src/course/orientation/useOrientation.ts | 22 + src/lib/cn.ts | 9 + src/main.tsx | 20 + src/pages/About/index.tsx | 19 + src/pages/Components/DragDropDemo.tsx | 405 ++ src/pages/Components/DragDropDemo.types.ts | 30 + src/pages/Components/index.tsx | 388 ++ src/pages/CourseDemo/CourseDemo.data.ts | 107 + src/pages/CourseDemo/CourseDemo.dialog.tsx | 46 + src/pages/CourseDemo/CourseDemo.spotlight.tsx | 30 + src/pages/CourseDemo/CourseDemo.types.ts | 35 + .../CourseDemo/CourseDemoGuideDialog.tsx | 15 + .../CourseDemo/CourseDemoGuideDialogPanel.tsx | 131 + .../CourseDemo/CourseDemoGuideSpotlight.tsx | 15 + .../CourseDemoGuideSpotlightPanel.tsx | 226 + src/pages/CourseDemo/index.tsx | 335 ++ src/pages/Home/index.tsx | 60 + src/pages/index.ts | 4 + src/router/index.tsx | 34 + src/stores/index.ts | 17 + src/stores/modules/app.ts | 8 + src/stores/modules/dialog.ts | 136 + src/stores/modules/index.ts | 4 + src/stores/modules/spotlight.ts | 112 + src/stores/modules/user.ts | 29 + src/stores/types/app.types.ts | 5 + src/stores/types/dialog.types.ts | 58 + src/stores/types/index.ts | 17 + src/stores/types/spotlight.types.ts | 51 + src/stores/types/user.types.ts | 24 + src/styles/index.css | 10 + src/styles/reset.css | 59 + src/styles/variables.css | 37 + src/types/yiban.ts | 137 + src/utils/assets.ts | 61 + src/utils/audio/GameAudioProvider.tsx | 53 + src/utils/audio/GameAudioProvider.types.ts | 8 + src/utils/audio/audio.types.ts | 104 + src/utils/audio/audioContext.ts | 4 + src/utils/audio/audioManager.ts | 483 ++ src/utils/audio/howlerEngine.ts | 151 + src/utils/audio/index.ts | 21 + src/utils/audio/useGameAudio.ts | 10 + src/utils/index.ts | 6 + src/utils/lazyRoute.ts | 8 + src/utils/motion.ts | 29 + src/utils/tailwind.ts | 1 + src/utils/vconsole.ts | 21 + src/utils/yiban.ts | 522 ++ src/vite-env.d.ts | 1 + tailwind.config.js | 8 + tests/e2e/course-flow.spec.ts | 191 + tsconfig.app.json | 29 + tsconfig.json | 7 + tsconfig.node.json | 27 + vite.config.ts | 61 + 158 files changed, 16461 insertions(+) create mode 100644 .biomeignore create mode 100644 .cursorrules create mode 100644 .gitignore create mode 100644 .gitmessage create mode 100644 .husky/pre-commit create mode 100644 .npmignore create mode 100644 .npmrc create mode 100644 CLAUDE.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 biome.json create mode 100644 bun.lock create mode 100644 components.json create mode 100644 index.html create mode 100644 package.json create mode 100644 playwright.config.ts create mode 100644 postcss.config.js create mode 100644 public/videoajax/jquery-3.7.1.min.js create mode 100644 public/videoajax/videoajax.js create mode 100644 public/videoajax/videoajax.min.js create mode 100644 public/vite.svg create mode 100644 src/App.tsx create mode 100644 src/api/client.ts create mode 100644 src/api/client.types.ts create mode 100644 src/api/index.ts create mode 100644 src/app.config.ts create mode 100644 src/assets/react.svg create mode 100644 src/components/business/Navigation/Navigation.module.css create mode 100644 src/components/business/Navigation/Navigation.tsx create mode 100644 src/components/business/Navigation/Navigation.types.ts create mode 100644 src/components/business/Navigation/index.ts create mode 100644 src/components/business/index.ts create mode 100644 src/components/common/BackgroundContainer/BackgroundContainer.module.css create mode 100644 src/components/common/BackgroundContainer/BackgroundContainer.tsx create mode 100644 src/components/common/BackgroundContainer/BackgroundContainer.types.ts create mode 100644 src/components/common/BackgroundContainer/index.ts create mode 100644 src/components/common/GuideDialog/GuideDialog.helpers.ts create mode 100644 src/components/common/GuideDialog/GuideDialog.tsx create mode 100644 src/components/common/GuideDialog/GuideDialog.types.ts create mode 100644 src/components/common/GuideDialog/index.ts create mode 100644 src/components/common/GuideSpotlight/GuideSpotlight.helpers.ts create mode 100644 src/components/common/GuideSpotlight/GuideSpotlight.tsx create mode 100644 src/components/common/GuideSpotlight/GuideSpotlight.types.ts create mode 100644 src/components/common/GuideSpotlight/index.ts create mode 100644 src/components/common/ImageButton/ImageButton.module.css create mode 100644 src/components/common/ImageButton/ImageButton.tsx create mode 100644 src/components/common/ImageButton/ImageButton.types.ts create mode 100644 src/components/common/ImageButton/index.ts create mode 100644 src/components/common/RouteFallback/RouteError.tsx create mode 100644 src/components/common/RouteFallback/RouteFallback.tsx create mode 100644 src/components/common/RouteFallback/index.ts create mode 100644 src/components/common/Video/VideoOverlay.tsx create mode 100644 src/components/common/Video/VideoOverlay.types.ts create mode 100644 src/components/common/Video/VideoPlayer.module.css create mode 100644 src/components/common/Video/VideoPlayer.tsx create mode 100644 src/components/common/Video/VideoPlayer.types.ts create mode 100644 src/components/common/Video/index.ts create mode 100644 src/components/common/index.ts create mode 100644 src/components/ui/button/Button.module.css create mode 100644 src/components/ui/button/Button.tsx create mode 100644 src/components/ui/button/Button.types.ts create mode 100644 src/components/ui/button/index.ts create mode 100644 src/components/ui/overlay/Overlay.module.css create mode 100644 src/components/ui/overlay/Overlay.tsx create mode 100644 src/components/ui/overlay/Overlay.types.ts create mode 100644 src/components/ui/overlay/index.ts create mode 100644 src/components/ui/portal/Portal.tsx create mode 100644 src/components/ui/portal/Portal.types.ts create mode 100644 src/components/ui/portal/index.ts create mode 100644 src/components/ui/toast/Toast.module.css create mode 100644 src/components/ui/toast/Toast.types.ts create mode 100644 src/components/ui/toast/ToastItem.tsx create mode 100644 src/components/ui/toast/ToastProvider.tsx create mode 100644 src/components/ui/toast/ToastViewport.tsx create mode 100644 src/components/ui/toast/index.ts create mode 100644 src/course/canvas/CanvasContext.ts create mode 100644 src/course/canvas/CourseCanvas.tsx create mode 100644 src/course/canvas/CourseCanvas.types.ts create mode 100644 src/course/canvas/canvasPortal.ts create mode 100644 src/course/canvas/index.ts create mode 100644 src/course/canvas/useCanvasScale.ts create mode 100644 src/course/interactions/drag-drop/DragDrop.module.css create mode 100644 src/course/interactions/drag-drop/DragDrop.types.ts create mode 100644 src/course/interactions/drag-drop/DragDropContext.tsx create mode 100644 src/course/interactions/drag-drop/DragDropProvider.tsx create mode 100644 src/course/interactions/drag-drop/Draggable.tsx create mode 100644 src/course/interactions/drag-drop/Droppable.tsx create mode 100644 src/course/interactions/drag-drop/collision.ts create mode 100644 src/course/interactions/drag-drop/index.ts create mode 100644 src/course/interactions/guide-dialog/DefaultGuideDialogPanel.tsx create mode 100644 src/course/interactions/guide-dialog/GuideDialog.module.css create mode 100644 src/course/interactions/guide-dialog/GuideDialog.tsx create mode 100644 src/course/interactions/guide-dialog/GuideDialog.types.ts create mode 100644 src/course/interactions/guide-dialog/index.ts create mode 100644 src/course/interactions/guide-spotlight/DefaultGuideSpotlightPanel.tsx create mode 100644 src/course/interactions/guide-spotlight/GuideSpotlight.module.css create mode 100644 src/course/interactions/guide-spotlight/GuideSpotlight.tsx create mode 100644 src/course/interactions/guide-spotlight/GuideSpotlight.types.ts create mode 100644 src/course/interactions/guide-spotlight/index.ts create mode 100644 src/course/orientation/OrientationGuard.tsx create mode 100644 src/course/orientation/OrientationGuard.types.ts create mode 100644 src/course/orientation/index.ts create mode 100644 src/course/orientation/useOrientation.ts create mode 100644 src/lib/cn.ts create mode 100644 src/main.tsx create mode 100644 src/pages/About/index.tsx create mode 100644 src/pages/Components/DragDropDemo.tsx create mode 100644 src/pages/Components/DragDropDemo.types.ts create mode 100644 src/pages/Components/index.tsx create mode 100644 src/pages/CourseDemo/CourseDemo.data.ts create mode 100644 src/pages/CourseDemo/CourseDemo.dialog.tsx create mode 100644 src/pages/CourseDemo/CourseDemo.spotlight.tsx create mode 100644 src/pages/CourseDemo/CourseDemo.types.ts create mode 100644 src/pages/CourseDemo/CourseDemoGuideDialog.tsx create mode 100644 src/pages/CourseDemo/CourseDemoGuideDialogPanel.tsx create mode 100644 src/pages/CourseDemo/CourseDemoGuideSpotlight.tsx create mode 100644 src/pages/CourseDemo/CourseDemoGuideSpotlightPanel.tsx create mode 100644 src/pages/CourseDemo/index.tsx create mode 100644 src/pages/Home/index.tsx create mode 100644 src/pages/index.ts create mode 100644 src/router/index.tsx create mode 100644 src/stores/index.ts create mode 100644 src/stores/modules/app.ts create mode 100644 src/stores/modules/dialog.ts create mode 100644 src/stores/modules/index.ts create mode 100644 src/stores/modules/spotlight.ts create mode 100644 src/stores/modules/user.ts create mode 100644 src/stores/types/app.types.ts create mode 100644 src/stores/types/dialog.types.ts create mode 100644 src/stores/types/index.ts create mode 100644 src/stores/types/spotlight.types.ts create mode 100644 src/stores/types/user.types.ts create mode 100644 src/styles/index.css create mode 100644 src/styles/reset.css create mode 100644 src/styles/variables.css create mode 100644 src/types/yiban.ts create mode 100644 src/utils/assets.ts create mode 100644 src/utils/audio/GameAudioProvider.tsx create mode 100644 src/utils/audio/GameAudioProvider.types.ts create mode 100644 src/utils/audio/audio.types.ts create mode 100644 src/utils/audio/audioContext.ts create mode 100644 src/utils/audio/audioManager.ts create mode 100644 src/utils/audio/howlerEngine.ts create mode 100644 src/utils/audio/index.ts create mode 100644 src/utils/audio/useGameAudio.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/lazyRoute.ts create mode 100644 src/utils/motion.ts create mode 100644 src/utils/tailwind.ts create mode 100644 src/utils/vconsole.ts create mode 100644 src/utils/yiban.ts create mode 100644 src/vite-env.d.ts create mode 100644 tailwind.config.js create mode 100644 tests/e2e/course-flow.spec.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.biomeignore b/.biomeignore new file mode 100644 index 0000000..25e04f8 --- /dev/null +++ b/.biomeignore @@ -0,0 +1,4 @@ +**/*.css + +**/*.module.css + diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..d20e445 --- /dev/null +++ b/.cursorrules @@ -0,0 +1,50 @@ +# Commit Message 规则 + +所有 commit message 必须使用中文编写。 + +Commit message 格式: +- 类型: 简短描述(50字以内) +- 空行 +- 详细描述(可选,72字以内换行) + +类型包括: +- feat: 新功能 +- fix: 修复 bug +- docs: 文档变更 +- style: 代码格式(不影响代码运行的变动) +- refactor: 重构 +- perf: 性能优化 +- test: 增加测试 +- chore: 构建过程或辅助工具的变动 +- ci: 持续集成相关 +- build: 构建系统或外部依赖的变更 + +示例: +``` +fix: 修复 TypeScript 配置文件中的 lint 错误 + +- 添加 incremental 选项以支持 tsBuildInfoFile +- 移除不存在的 noUncheckedSideEffectImports 选项 +``` + +React 项目工程化结构 +``` +src/ +├── assets/ # 静态资源 (images, fonts, global svgs) +├── api/ # API 请求定义 (推荐用 Axios 或 React Query 封装) +├── components/ # 复用 UI 组件 +│ ├── common/ # 原子级基础组件 (Button, Input, Modal) +│ ├── business/ # 业务逻辑组件 (UserCard, OrderList) +│ └── layout/ # 页面框架组件 (Header, Sidebar) +├── constants/ # 常量定义 (Enums, Configs) +├── hooks/ # 自定义全局 Hooks (useAuth, useLocalStorage) +├── pages/ # 页面级组件 (路由对应) +│ └── Home/ +│ ├── index.tsx # 页面主入口 +│ ├── components/ # 页面私有组件 (不对外复用) +│ └── hooks.ts # 页面私有逻辑 +├── store/ # 状态管理 (Zustand, Redux, 或 Context) +├── styles/ # 全局样式 (Variables, Theme, Reset) +├── types/ # 全局 TypeScript 类型定义 (.d.ts) +└── utils/ # 工具函数 (date, format, validator) +``` diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0f41198 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Playwright +test-results +playwright-report + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.gitmessage b/.gitmessage new file mode 100644 index 0000000..a0827d4 --- /dev/null +++ b/.gitmessage @@ -0,0 +1,16 @@ +# <类型>: <简短描述> + +# <详细描述(可选)> + +# <类型> 可以是以下之一: +# feat: 新功能 +# fix: 修复 bug +# docs: 文档变更 +# style: 代码格式(不影响代码运行的变动) +# refactor: 重构(既不是新增功能,也不是修复 bug) +# perf: 性能优化 +# test: 增加测试 +# chore: 构建过程或辅助工具的变动 +# ci: 持续集成相关 +# build: 构建系统或外部依赖的变更 + diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..c8d5b1c --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +bunx lint-staged \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..e3ede1b --- /dev/null +++ b/.npmignore @@ -0,0 +1,27 @@ +# Dependencies +node_modules +bun.lock +package-lock.json +yarn.lock +pnpm-lock.yaml + +# Build outputs +dist +dist-ssr +*.local + +# Logs +logs +*.log + +# OS +.DS_Store + +# IDE +.vscode/* +!.vscode/extensions.json +.idea + +# Temp +*.tmp +*.temp diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..de2be72 --- /dev/null +++ b/.npmrc @@ -0,0 +1,11 @@ +# 锁定包管理器为 bun +package-manager=bun + +# 严格模式:不允许使用其他包管理器 +engine-strict=true + +# 自动安装 peers +auto-install-peers=true + +# 使用国内镜像(可选) +registry=https://registry.npmmirror.com diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..1f72d38 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,187 @@ +# CLAUDE.md + +本文件记录 Claude Code 在本仓库中开发、创建文件和修改代码时必须遵守的项目规范。规范以当前仓库的代码、配置和 README 为准;如配置发生变化,优先同步更新本文件。 + +## 项目概览 + +- 技术栈:React 19、TypeScript、Vite 8、React Router 7、Tailwind CSS 4、Zustand。 +- 包管理与脚本:使用 Bun。 +- 代码检查与格式化:使用 Biome。 +- 提交前检查:Husky + lint-staged。 +- 运行环境:易班 H5 课程模板,包含 videoajax.js 封装、1920 x 1080 整体缩放、横屏访问提示和移动端 vconsole 调试。 + +## 常用命令 + +以 [package.json](package.json) 为准: + +```bash +bun dev # 启动开发服务器 +bun run build # 类型检查并构建生产版本 +bun run preview # 预览生产构建 +bun run lint # 代码检查 +bun run lint:fix # 自动修复代码问题 +``` + +修改代码后,至少运行 `bun run lint`。如果改动影响路由、构建配置、页面结构、类型系统或模板能力,还应运行 `bun run build`。 + +## 代码风格 + +以 [biome.json](biome.json) 为准: + +- 使用 Biome 进行 JS/TS/JSON 等文件的格式化与检查。 +- 使用 tab 缩进。 +- JavaScript/TypeScript 字符串使用双引号。 +- 导入整理交给 Biome 的 organizeImports。 +- 当前 CSS linter/formatter 关闭,不要擅自引入新的 CSS 格式化标准。 +- 写代码时匹配周围代码的命名、注释密度和组织方式,不为了“统一”改写无关文件。 + +## 文件创建与目录归属 + +新增文件前先判断职责归属,优先沿用现有目录结构: + +- `src/components/ui/`:无课程业务和全局状态依赖的基础 UI copied source。 +- `src/components/common/`:模板通用组件和适配器;其中 `GuideDialog`、`GuideSpotlight` 负责连接 Zustand、CourseCanvas 与交互内核。新增通用组件后,按需在 `src/components/common/index.ts` 维护导出。 +- `src/components/business/`:业务组合组件,不放通用基础能力。 +- `src/course/canvas/`:设计稿画布、缩放、viewport 和课程 Portal 根节点。 +- `src/course/orientation/`:横竖屏访问控制。 +- `src/course/interactions/`:由 CLI 复制的受控课程交互内核,不依赖具体页面、Store 或 common 适配器。 +- `src/pages//`:页面组件。页面目录入口使用 `index.tsx`,页面组件使用默认导出。 +- 模块内私有组件:仅本模块使用、其他模块用不到的,放到本模块目录的 `components/` 子目录(没有就创建);被多个模块或组件复用才下沉到 `src/components/common/`(通用基础能力)或 `business/`(业务组合),按组件核心类型区分。该规则约束新代码,存量平铺在页面目录下的模块内组件不强制迁移。 +- `src/router/index.tsx`:集中维护路由配置。新增页面优先复用 `lazyRoute` 和 `RouteFallback`。 +- `src/stores/`:Zustand 状态管理。 +- `src/utils/`:通用工具、hooks 或平台封装。 +- `src/types/`:只放跨多个模块复用的全局共享类型。 +- `src/styles/`:全局样式和重置样式。 + +### 类型放置规则 + +组件、页面、store、API 的对外 `props` 与跨文件共享的 `interface`、`type` 放在 `.types.ts`;文件内私有的 helper 类型留在实现文件即可: + +- 组件类型放在同组件目录的 `组件名.types.ts`,例如 `Button/Button.types.ts`。 +- 页面类型如确实需要,放在页面目录的 `PageName.types.ts`。 +- store 类型统一放在 `src/stores/types/*.types.ts`,例如 `src/stores/types/user.types.ts`。 +- API 模块类型放在对应模块的 `*.types.ts`,例如 `src/api/client.types.ts`。 +- 只有跨多个页面、组件、store、utils 复用的全局共享类型,才放入 `src/types/`。 +- 不要把组件 props、store slice state 或组件内部布局类型放入 `src/types/`,避免全局类型目录变成杂物目录。 + +## Tailwind、cn 与样式提取规则 + +项目已有 [src/lib/cn.ts](src/lib/cn.ts) 中的 `cn`,用于合并 Tailwind class 并处理冲突([src/utils/tailwind.ts](src/utils/tailwind.ts) 只是 re-export)。使用时遵守以下边界。 + +### 默认策略 + +- 短的静态 Tailwind class 可以直接写在 JSX 的 `className` 中。 +- 不为了“看起来统一”强行把所有 class 都包进 `cn`。 +- 不为了少量 class 新增多层封装、过度抽象或大量碎片常量。 + +### 什么时候使用 cn + +在以下场景使用 `cn`: + +- 需要合并外部传入的 `className`。 +- 条件 class 需要和其他 class 合并。 +- 需要通过 `tailwind-merge` 解决 Tailwind 冲突合并。 +- 需要组合 CSS Module、固定 class、条件 class 或外部 `className`。 + +示例: + +```tsx +
+``` + +### 什么时候不使用 cn + +以下场景不要使用 `cn`: + +```tsx +
+
+``` + +单个固定字符串,或在两个完整字符串之间二选一的三元且不需要再合并其他 class 时,直接写 `className`。 + +### 什么时候提取样式 + +只有在以下情况才提取 class: + +- Tailwind 字符串过长,导致 JSX 难读。 +- 同一组 class 在同一文件或多个相近组件中重复出现。 +- 条件组合已经让 `cn(...)` 变得很长。 +- 提取后能更清楚表达布局或业务意图。 +- Tailwind 直接实现过于麻烦、复杂或冗余,此时优先考虑 CSS Module、已有组件 API 或更简单的结构。 + +提取位置: + +- 组件/页面私有样式常量优先放在当前文件内。 +- 同目录多个文件共享时,可放同目录局部文件。 +- 跨组件复用的样式能力,再考虑沉淀为通用组件、工具或 CSS Module。 + +### 组件与 CSS 类的边界 + +「何时提取 class」见上一节;本节只解决复用一段 UI 时该抽组件还是抽 CSS 类。 + +组件/页面文件超过 500 行时,先审视是否该拆分(这是触发思考的信号,不是强制拆分线);拆出的子组件按「文件创建与目录归属」放置。 + +重复出现时优先抽组件,CSS 类是兜底,但避免「为整洁而抽」。抽组件必须同时满足: + +- 同一组「标记 + 样式 + 行为」在 2 处以上真实重复(第一次出现不抽)。 +- 组件有清晰可命名的语义,能一句话说清它是什么。 +- 复用的是整体而非几个 class;props 少且稳定(一般 ≤3~4 个)。 + +以下情况改用 CSS 类或局部常量,而不是抽组件: + +- 只复用样式、不复用标记/行为,内容由数据或富文本决定。 +- 仅同一文件内的小重复。 +- 给第三方/框架等无法插入组件的位置加样式。 +- Tailwind 表达不了或 class 串过长,但元素本身不够独立语义。 + +反模式(不要抽):只被用一次仅为缩短 JSX;组件 props 塞满 className/style 覆盖;名字说不清职责(`CardTopSection`、`Wrapper` 之类)。 + +## 动画使用规则 + +项目使用 CSS/Tailwind 和 GSAP 时遵守以下边界: + +- 普通状态过渡、hover、active、简单淡入淡出及单元素入场默认使用 CSS/Tailwind。 +- 只有动画需要时间轴编排、暂停/继续/倒放、运行时动态计算、音视频同步或复杂路径时,才使用 GSAP。 +- 不因项目已经安装 GSAP 而重写现有 CSS 动画,也不为简单动画建立 GSAP preset 或通用封装。 +- CSS 与 GSAP 不要在同一交互周期内控制同一元素的同一属性,尤其是 `transform` 和 `opacity`。 +- GSAP 动画通过 `src/utils/motion.ts` 使用 `useGSAP` 管理生命周期,并处理 `prefers-reduced-motion` 降级。 +- 不使用 GSAP 修改 `CourseCanvas`、画布 portal 根节点或 dnd-kit 正在控制的 `transform`。 + +## 导入与导出 + +- `@` 指向 `src`,新增代码优先使用 `@` 避免过长相对路径。 +- 同目录内局部文件可以继续使用相对路径。 +- 保持现有 barrel export 风格:通用组件、utils、stores 等需要对外复用时,再维护对应 `index.ts`。 +- 不要为了导出方便把不该公开的内部实现暴露出去。 + +## 路由与页面 + +- 路由集中在 [src/router/index.tsx](src/router/index.tsx)。 +- 新页面优先使用目录入口懒加载,例如 `lazyRoute(() => import("../pages/About"))`。 +- 页面组件使用默认导出。 +- 新增路由时同步考虑 `HydrateFallback: RouteFallback`。 +- 不要绕开现有 hash router 和懒加载模式,除非用户明确要求调整路由架构。 + +## 模板能力约束 + +开发时要尊重模板已有能力: + +- 页面按 `1920 x 1080` 设计稿开发,整体缩放由 `src/course/canvas` 的 `CourseCanvas` 组件承担。 +- 横屏访问提示由 `src/course/orientation` 的 `OrientationGuard` 组件承担。 +- 易班能力通过 `src/utils/yiban.ts` 和 `public/videoajax/` 相关脚本封装。 +- 移动端调试使用 `src/utils/vconsole.ts`。 +- 图片按钮由 `src/components/common/ImageButton` 提供;视频播放与视频弹层由 `src/components/common/Video` 提供。 +- 拖拽交互由 `src/course/interactions/drag-drop` 提供(基于 dnd-kit)。 +- 音频能力由 `src/utils/audio` 提供(`GameAudioProvider` / `useGameAudio` / `AudioManager`)。 +- GSAP 复杂动画通过 `src/utils/motion.ts` 统一引入,边界见「动画使用规则」。 +- 新增通用组件时,同步考虑是否需要在 [src/pages/Components/index.tsx](src/pages/Components/index.tsx) 增加示例。 + +## Claude Code 工作准则 + +- 编辑前先阅读相关文件,查找现有模式和可复用实现。 +- 优先复用已有组件、工具、store 和样式方案。 +- 不随意替换技术栈、引入新依赖或新增全局抽象。 +- 新建文件时先判断目录归属、类型放置位置、是否需要导出、是否需要示例页。 +- 修改配置、路由、构建、全局样式等影响范围较大的内容前,应确认需求明确。 +- 不绕过 lint/build 结果;如果校验失败,必须如实报告失败命令、错误摘要和影响范围。 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..14fac91 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..5c617d9 --- /dev/null +++ b/README.md @@ -0,0 +1,743 @@ +# 易班 H5 开发模板 + +一个基于 React 19、TypeScript、Vite、React Router、Tailwind CSS 和 Zustand 的易班平台 H5 开发模板。 + +## 特性 + +- React 19 + TypeScript +- Vite 8 开发与构建 +- React Router 7 路由管理(支持懒加载) +- Tailwind CSS 4 原子化样式 +- Zustand 轻量状态管理 +- Biome 代码格式化与检查 +- Husky + lint-staged 提交前检查 +- 1920x1080 整体缩放适配 +- 横屏访问提示 +- vconsole 移动端调试工具(仅开发环境) +- 易班 videoajax.js 封装 +- 易班用户信息状态管理 +- 图片按钮、视频播放器与视频弹层基础组件 +- 音频管理(配音 / BGM / 音效) +- GSAP 动画能力(复杂时间轴编排) +- `@` 指向 `src` 的路径别名 +- 通过 `@yuxiang/cli` 安装并提交可直接修改的课程交互源码 +- 组件分层:Registry copied source、模板适配器、业务组件、页面组件 + +## 使用模板 + +### 通过 GitHub 页面创建 + +1. 打开模板仓库页面 +2. 点击 **Use this template** +3. 创建自己的新仓库 +4. 克隆新仓库并安装依赖 + +```bash +git clone https://github.com/your-name/your-app.git +cd your-app +bun install +bun dev +``` + +### 通过 GitHub CLI 创建 + +```bash +gh repo create my-react-app --template your-name/yx-react-template --public +cd my-react-app +bun install +bun dev +``` + +创建项目后,建议修改 [package.json](package.json) 中的 `name` 字段,以及 [src/app.config.ts](src/app.config.ts) 中的页面标题、描述和图标配置。 + +## 应用配置 + +页面标签页标题、描述、图标、课程标识、存储前缀和 viewport 配置统一维护在 [src/app.config.ts](src/app.config.ts): + +```ts +export const appConfig = { + title: "React Vite App", + description: "易班 H5 课程模板", + favicon: "./vite.svg", + course: { + id: import.meta.env.VITE_COURSE_ID ?? "course-demo", + name: import.meta.env.VITE_COURSE_NAME ?? "标准课程页示例", + }, + storage: { + prefix: "yiban-course-template", + }, + viewport: { + width: "device-width", + initialScale: 1.0, + minimumScale: 1.0, + maximumScale: 1.0, + }, +}; +``` + +课程画布尺寸和最大缩放比例由 `CourseCanvas` props 控制,不属于 `appConfig`。修改应用配置后需要重启开发服务。 + +## 开发命令 + +```bash +bun dev # 启动开发服务器 +bun run build # 类型检查并构建生产版本 +bun run preview # 预览生产构建 +bun run lint # 代码检查 +bun run lint:fix # 自动修复代码问题 +``` + +## 开发规范 + +完整的 Claude Code/自动化开发规范见 [CLAUDE.md](CLAUDE.md)。日常开发遵守以下约定: + +- 使用 Bun 执行项目脚本,提交前确保 `bun run lint` 通过;涉及路由、构建配置、页面结构或类型系统的改动建议同时运行 `bun run build`。 +- 代码风格以 [biome.json](biome.json) 为准:tab 缩进、双引号、Biome 检查和导入整理。 +- 组件、页面、store、API 的对外 Props 和跨文件共享类型放入 `.types.ts`;文件内私有 helper 类型留在实现文件。store 类型放 [src/stores/types/](src/stores/types/),只有跨多个模块复用的全局类型才放入 [src/types/](src/types/)。 +- 短的静态 Tailwind class 可直接写在 JSX 中;只有需要条件合并、外部 `className`、冲突合并或组合 CSS Module 时才使用 `cn`。 +- Tailwind class 过长、重复、条件组合复杂,或直接实现过于冗余时,再提取为局部常量、同目录文件、CSS Module 或通用组件。 +- 新增页面沿用 [src/router/index.tsx](src/router/index.tsx) 中的 `lazyRoute` 和 `RouteFallback` 模式,导入优先使用 `@` 指向 `src` 的路径别名。 +- 新增通用组件时,按需维护 [src/components/common/index.ts](src/components/common/index.ts),并考虑在 [src/pages/Components/index.tsx](src/pages/Components/index.tsx) 补充示例。 + +## 课程交互源码 + +模板中的基础组件和课程交互不是外部 React 运行时包,而是由 `@yuxiang/cli` 复制并提交到当前项目: + +```text +src/components/ui/ # Button、Portal、Overlay、Toast +src/course/interactions/ # GuideDialog、GuideSpotlight、DragDrop 受控内核 +src/course/canvas/ # 固定课程画布、缩放与 Portal 根节点 +src/course/orientation/ # 横竖屏访问控制 +src/lib/cn.ts # 本地 class 合并工具 +``` + +项目根目录的 [components.json](components.json) 配置 copied source 的目录与 alias。需要新增能力时运行: + +```bash +bunx @yuxiang/cli add +``` + +CLI 默认不会覆盖不同内容的本地文件。安装后请把源码作为模板代码维护,不要重新添加 `@yuxiang/react` 或 `@yuxiang/core` 依赖。 + +## 真实课程案例 + +本地打开以下路由可体验连贯的课程流程: + +```text +http://localhost:5173/#/course-demo +``` + +案例包含课程导入与分支、页面 Spotlight、课程资源分类拖拽、错误/正确 Toast、完成 Overlay,以及易班或 session fallback 的进度保存与刷新恢复。 + +## 组件开发 Smoke 页 + +本地开发时可以打开组件示例页查看和测试基础组件: + +```text +http://localhost:5173/#/components +``` + +该路由仅用于开发时检查 copied source 的基础状态,不作为产品级组件展示墙。真实组合用法以 `#/course-demo` 为准。 + +当前 smoke 页包含: + +- `Button`: variant 和 size 示例 +- `Toast`: info / success / warning / error 轻提示示例 +- `Portal`: 挂载到 `document.body` 或自定义容器的浮层示例 +- `Overlay`: 默认背景、自定义 Tailwind 背景、背景图片、禁止点击背景关闭等交互示例 +- `GuideSpotlight`: 课程引导和高亮目标区域示例 +- `Drag and Drop`: 基于 dnd-kit 的拖拽到目标区域示例 + +后续新增通用组件时,可以在 [src/pages/Components/index.tsx](src/pages/Components/index.tsx) 中补充对应示例。 + +## 目录结构 + +```text +src/ +├── api/ # API 请求相关代码 +├── assets/ # 项目资源 +├── components/ +│ ├── business/ # 业务组合组件 +│ ├── common/ # 模板通用组件和 Store/Canvas 适配器 +│ └── ui/ # Button、Portal、Overlay、Toast 等基础 UI +├── course/ +│ ├── canvas/ # 1920 x 1080 画布、viewport 与 Portal 根节点 +│ ├── interactions/ # Guide、DragDrop 等课程交互内核 +│ └── orientation/ # 横竖屏访问控制 +├── lib/ # 无业务依赖的底层工具 +├── pages/ # 页面组件 +├── router/ # 路由配置 +├── stores/ +│ ├── modules/ # Zustand store 实现 +│ └── types/ # Store 类型 +├── styles/ # 全局样式 +├── types/ # 跨多个模块共享的全局类型 +└── utils/ + ├── audio/ # 音频管理 + ├── motion.ts # GSAP 动画统一入口 + ├── vconsole.ts # 移动端调试 + └── yiban.ts # 易班 API 封装 +``` + +`src/course/interactions` 保持无具体课程 Store 依赖;`src/components/common/GuideDialog` 和 `GuideSpotlight` 负责连接 Zustand、CourseCanvas 和 Portal。 + +## 易班开发说明 + +模板面向易班 H5 / 静态资源相对路径部署,Vite `base` 固定为 `"./"`,确保构建产物在未知子路径或压缩包上传场景下仍能引用资源。除非部署环境明确要求根路径资源,否则不要轻易改成 `"/"`。 + +### videoajax.js 使用 + +模板已集成易班 videoajax.js,提供以下功能: + +- [public/videoajax/jquery-3.7.1.min.js](public/videoajax/jquery-3.7.1.min.js) +- [public/videoajax/videoajax.js](public/videoajax/videoajax.js) + +这些文件需要和构建后的页面同源、同相对路径部署。若易班平台提供了新的 `videoajax.js`,请同步确认来源、版本和分发权限后再替换,并重新验证用户数据、课程进度、断点和答题记录相关能力。 + +### 易班环境判断 + +模板启动时会从 URL 中读取: + +- `courseId` / `courseid` +- `uid` + +生产环境中,只要存在以上任意参数,就会认为当前处于易班环境。 + +本地开发环境中,即使 URL 带有 `courseId` / `uid`,也默认使用 `sessionStorage`,避免误请求易班接口: + +```text +http://localhost:5173/?courseId=123&uid=456 +``` + +如果本地确实需要强制走易班接口,可追加: + +```text +http://localhost:5173/?courseId=123&uid=456&yiban=1 +``` + +模板已集成以下易班能力: + +#### 1. 存取用户数据 + +```ts +import { setUserStorage, getUserStorage } from '@/utils/yiban'; + +// 保存数据(自动根据易班连接状态选择存储方式) +await setUserStorage(lessonId, key, value); + +// 读取数据 +const result = await getUserStorage(lessonId, key); +if (result.status === 'success') { + console.log(result.content); +} + +// 强制指定存储方式 +await setUserStorage(lessonId, key, value, { backend: 'session' }); +``` + +#### 2. 课程进度管理 + +```ts +import { reportCourseProgress, getCourseProgress } from '@/utils/yiban'; + +// 上报课程进度(自动读取 store 中的 courseId 和连接状态) +await reportCourseProgress(order); + +// 获取课程进度 +const progress = await getCourseProgress(order); +if (progress) { + // videoajax.js 返回平台原始响应,使用前请按平台响应结构进行类型收窄 + console.log("当前进度响应:", progress); +} +``` + +#### 3. 播放断点管理 + +```ts +import { saveBreakPoint, getBreakPoint } from '@/utils/yiban'; + +// 保存播放断点 +await saveBreakPoint({ + userId: '123456', + courseId: '789', + lessonId: '001', + breakPoint: 120, // 秒 +}); + +// 获取播放断点 +const breakpoint = await getBreakPoint({ + userId: '123456', + courseId: '789', + lessonId: '001', +}); +``` + +#### 4. 用户答题记录 + +```ts +import { saveUserAnswer } from '@/utils/yiban'; + +// 保存答题记录 +await saveUserAnswer({ + userId: '123456', + lessonId: '001', + courseId: '789', + questionOrder: 1, + answer: 'A', +}); +``` + +#### 5. 用户状态管理 + +```ts +import { useUserStore } from '@/stores'; + +function MyComponent() { + const { userId, userName, setUserInfo, setYibanConnectionStatus } = useUserStore(); + + // 设置易班连接状态 + setYibanConnectionStatus('connected'); + + // 设置用户信息 + setUserInfo({ + userId: '123456', + userName: '张三', + userAvatar: 'https://...' + }); +} +``` + +### 移动端调试 + +开发环境自动启用 vconsole,可在移动端查看: +- Console 日志 +- Network 请求 +- Element 结构 +- Storage 存储 + +### 课程画布适配 + +模板按 `1920 x 1080` 设计稿开发,由 `src/course/canvas` 的 `CourseCanvas` 组件承担整体缩放。`CourseCanvas` 默认 `width=1920`、`height=1080`、`maxScale=1`,如需其他设计稿尺寸或放大比例,显式传入对应 props 即可。 + +当前默认缩放策略: + +- PC 端:按可视区域等比缩放并居中显示 +- 大屏:`maxScale` 默认为 `1`,不会超过设计稿原始尺寸,周围留白 +- 移动端:优先横屏访问,竖屏时由 `OrientationGuard` 显示横屏提示 +- 视口:缩放逻辑优先读取 `visualViewport`,移动端地址栏显示/隐藏时更稳定 +- 页面内容:按 `1920 x 1080` 设计稿进行开发,不使用 rem 适配 + +本地运行 `bun dev` 后,可以访问标准课程页示例: + +```text +http://localhost:5173/#/course-demo +``` + +`CourseDemo` 用于展示标准课程页面结构、易班 session fallback、Toast、Overlay 和 GuideSpotlight 的基础接入方式。 + +## 背景、图片按钮与视频 + +### BackgroundContainer + +`BackgroundContainer` 用于给页面区域设置背景图片。`src` 可以传入相对 `src/assets/images/` 的静态资源 key,也可以传入 public 相对路径或外部 URL: + +```tsx +import { BackgroundContainer } from "@/components/common"; +import { getPublicPath } from "@/utils/assets"; + + +
课程内容
+
; +``` + +调用方传入的 `style` 优先级最高,可以覆盖 `backgroundImage`、`backgroundSize` 等默认值。 + +### ImageButton + +`ImageButton` 提供图片按钮、hover/按下缩放、禁用状态和键盘焦点样式: + +```tsx +import { ImageButton } from "@/components/common"; + +; +``` + +静态资源 key 相对 `src/assets/images/`;外部 `http(s)`、`data:` 和 `blob:` URL 会直接使用。图片按钮应提供可访问名称,例如 `alt` 或 `aria-label`。 + +### VideoPlayer 与 VideoOverlay + +```tsx +import { VideoOverlay, VideoPlayer } from "@/components/common"; + +; + + setVideoOpen(false)} + onClose={() => setVideoOpen(false)} + onEnded={() => setVideoOpen(false)} +/>; +``` + +`VideoOverlay` 默认挂载到课程画布 Portal 根节点。`dismissible=false` 时不会通过背景点击或 Esc 自动关闭,播放结束、跳过和流程推进仍由调用方决定。 + +## 弹层基础组件 + +模板内置 `Portal` 和 `Overlay`,用于课程页面组合自定义弹窗、提示层、章节面板、全屏 loading 等内容。 + +`Overlay` 内置 `Portal`。不传 `container` 时默认挂载到 `document.body`;如需跟随 `1920 x 1080` 课程画布一起缩放,应传入 `CourseCanvas` 提供的 `portalContainer`: + +```tsx +import { Overlay } from "@/components/common"; +import { useCourseCanvas } from "@/course/canvas"; + +function CoursePanel() { + const { portalContainer } = useCourseCanvas(); + + return ( + setOpen(false)} + backgroundImage="url(./images/dialog-bg.png)" + backgroundClassName="bg-cover bg-center" + contentClassName="flex items-center justify-center" + > + 课程提示 + + ); +} +``` + +说明: + +- `backgroundImage`:原始 CSS `background-image` 值,组件不参与路径处理;引用 public 资源时可用 `getPublicPath`。 +- `backgroundClassName`:控制背景层样式。 +- `contentClassName`:控制内容层布局。 +- `closeOnBackgroundClick`:点击背景关闭,默认开启。 +- `closeOnEscape`:按 Esc 关闭,默认开启。 +- `lockScroll`:打开时锁定页面滚动,默认开启。 +- `variant`:提供 `dim` / `light` / `transparent` 三种基础背景。 +- `fixed`:默认在无 `container` 时使用 fixed,传入 `container` 时使用 absolute;可以显式覆盖。 + +如果需要挂载到业务自己的容器,也可以传入 DOM 元素、React ref 或返回元素的函数: + +```tsx +import { useRef } from "react"; +import { Overlay } from "@/components/common"; + +function LocalPanel() { + const rootRef = useRef(null); + + return ( +
+ setOpen(false)} + > + 业务弹层 + +
+ ); +} +``` + +`Overlay` 当前没有 `placement` prop;渲染位置只由 `container` 和 `disabledPortal` 决定。 + +## Toast 轻提示 + +模板内置 `ToastProvider`、`ToastViewport` 和 `useToast`,用于保存成功、提交失败、网络异常等轻量反馈。 + +`App` 已默认接入 `ToastProvider` 和 `ToastViewport`,页面组件中可以直接使用: + +```tsx +import { useToast } from "@/components/common"; + +const toast = useToast(); + +toast.success("保存成功"); +toast.error("网络异常,请稍后重试"); +``` + +支持: + +- `toast.info(message)` +- `toast.success(message)` +- `toast.warning(message)` +- `toast.error(message)` +- `toast.show({ message, type, title, duration, className, data })` + +如果课程视觉风格不同,可以自定义 `ToastViewport`: + +```tsx + +``` + +也可以完全接管单条 Toast 渲染: + +```tsx + ( +
+ {toast.message} + +
+ )} +/> +``` + +本地运行 `bun dev` 后,可以访问 `/#/components` 查看 Toast 示例。 + +## 拖拽交互 + +模板引入 dnd-kit 作为拖拽基础能力,适合网络课程中常见的拖物品到目标区、分类、匹配、排序等交互。 + +已封装基础组件: + +- `DragDropProvider`: 拖拽上下文,默认启用 Pointer / Touch / Keyboard sensors。 +- `Draggable`: 可拖拽元素。 +- `Droppable`: 可投放区域。 + +基础示例: + +```tsx +import { DragDropProvider, Draggable, Droppable } from "@/course/interactions/drag-drop"; +import { useCourseCanvas } from "@/course/canvas"; + +const { scale } = useCourseCanvas(); + + console.log(event.active.id, event.over?.id)} +> + 苹果 + 水果区域 +; +``` + +由于模板整体使用 `transform: scale(...)` 缩放课程画布,拖拽内容在画布内时建议给 `DragDropProvider` 传入当前 `scale`,避免拖拽元素和鼠标/手指移动不同步。 + +`DragDropProvider` 默认会根据 `scale` 修正拖拽启动距离和拖拽位移,并使用 `pointerWithin` 优先、`closestCenter` 兜底的碰撞检测策略,让“拖到目标区域”类课程交互更符合手指/鼠标位置直觉。 + +本地运行 `bun dev` 后,可以访问 `/#/components` 查看拖拽示例。 + +> 当前基础封装优先覆盖多端拖拽和投放区域判断。排序、分类、拼图等更上层课程交互可以继续基于这些组件封装。 + +## 引导聚光灯 + +模板提供 `GuideSpotlight` 和 `defineSpotlight`,适合课程首次学习时突出关键操作区域。页面已经位于 `CourseCanvas` 内时,组件默认挂载到课程画布 Portal 根节点并自动使用画布 viewport。 + +### 基础使用 + +先定义引导。未显式提供 `target` 时,`defineSpotlight` 默认使用和步骤 `id` 相同的 `data-guide`: + +```tsx +import { defineSpotlight } from "@/components/common"; + +export const lessonSpotlight = defineSpotlight({ + id: "lesson-intro", + steps: [ + { + id: "start-button", + title: "开始学习", + description: "点击这里开始本节课程。", + placement: "bottom", + }, + ], +}); +``` + +在页面中启动并渲染: + +```tsx +import { useEffect } from "react"; +import { Button, GuideSpotlight } from "@/components/common"; +import { lessonSpotlight } from "./lessonSpotlight"; + +export default function LessonPage() { + useEffect(() => { + lessonSpotlight.start(); + }, []); + + return ( + <> + + + + ); +} +``` + +### 持久化说明 + +引导状态通过 Zustand persist 只保存已完成记录: + +```ts +completedSpotlightMap: { + "course-demo:lesson-intro": true, +} +``` + +`showOnce` 默认为 `true`。点击完成或跳过都会调用 `finishSpotlight` 并标记为已完成;`closeSpotlight` 只关闭当前引导,不会写入完成记录。 + +重新允许展示: + +```ts +lessonSpotlight.reset(); +``` + +### Step 配置 + +支持: + +- `target`:CSS selector 或 `{ dataGuide: "xxx" }`;省略时由 `defineSpotlight` 使用步骤 `id`。 +- `placement`:`top` / `bottom` / `left` / `right` / `auto`。 +- `allowTargetClick`:是否允许点击高亮目标。 +- `padding` / `radius`:调整高亮区域。 +- `panelClassName`:单步提示框样式。 +- `nextLabel` / `prevLabel` / `doneLabel` / `skipLabel`:按钮文案。 + +建议 `data-guide` 只使用字母、数字、横线和下划线,例如 `start-button`、`question_1`。 + +### 高级交互 + +`allowTargetClick` 只让高亮区域下方的真实元素可点击,不会自动切换步骤。业务操作完成后可显式推进: + +```tsx +import { useSpotlightStore } from "@/stores"; + +const nextStep = useSpotlightStore((state) => state.nextStep); + +; +``` + +可通过 `theme.zIndex` 调整层级: + +```tsx + +``` + +目标不存在时,`skipIfTargetMissing` 默认为 `true`,组件会前进到下一步或结束引导。开发排查时可以显式传入 `skipIfTargetMissing={false}` 显示缺失目标面板。 + +组件内置遮罩淡入、高亮呼吸和提示框入场动画,并兼容系统的 `prefers-reduced-motion` 设置。 + +## 音频管理 + +模板内置 `GameAudioProvider` 和 `useGameAudio`,按 `voice`(配音)/ `bgm`(背景音乐)/ `sfx`(音效)三个通道管理播放,底层基于 howler。`App` 已默认挂载 `GameAudioProvider`,页面内直接使用: + +```tsx +import { useEffect } from "react"; +import { useGameAudio } from "@/utils/audio"; + +export default function LessonPage() { + const audio = useGameAudio(); + + useEffect(() => { + // 必须先 enterPage,播放才会生效;离开页面时 dispose 会停止本页所有音频 + const scope = audio.enterPage("lesson-1"); + audio.bgm.play("./audio/bgm.mp3"); + return () => scope.dispose(); + }, [audio]); + + return ( + + ); +} +``` + +说明: + +- 同一通道同时只播放一个音频,再次 `play` 会自动停止上一个。 +- `play` 返回 `{ started, stop }`,`started` 解析为 `playing` / `cancelled` / `blocked`(自动播放被浏览器拦截)/ `load-error` / `play-error`,可据此提示用户点击后重试。 +- `audio.preload(source)` 可提前加载本页音频;页面切到后台时配音和音效会停止,BGM 暂停并在回到前台后恢复。 + + +## GSAP 动画 + +GSAP 仅用于时间轴编排、暂停/继续/倒放、运行时动态计算、音视频同步或复杂路径。简单 hover、状态过渡和单元素入场优先使用 CSS/Tailwind。 + +```tsx +import { useRef } from "react"; +import { EASE_OUT, gsap, useGSAP, useReducedMotion } from "@/utils/motion"; + +function TimelineExample() { + const rootRef = useRef(null); + const reducedMotion = useReducedMotion(); + + useGSAP(() => { + if (reducedMotion) return; + gsap.from("[data-animate]", { y: 24, opacity: 0, ease: EASE_OUT }); + }, { scope: rootRef, dependencies: [reducedMotion] }); + + return
课程内容
; +} +``` + +请从 `@/utils/motion` 直接导入,避免不使用动画的入口无意加载 GSAP;不要让 GSAP 控制 `CourseCanvas`、画布 Portal 根节点或 dnd-kit 正在控制的 transform。 + +## 路由懒加载 + +模板内置了 `lazyRoute` 工具函数,新页面可以这样配置: + +```tsx +{ + path: "about", + lazy: lazyRoute(() => import("../pages/About")), +} +``` + +页面组件使用默认导出: + +```tsx +export default function About() { + return
About
; +} +``` + +## 发布为 GitHub 模板仓库 + +如果你要把这个项目作为模板发布: + +1. 推送到 GitHub +2. 进入仓库 **Settings** +3. 勾选 **Template repository** + +之后其他人就可以通过 **Use this template** 使用它。 + +## License + +MIT diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..1505fde --- /dev/null +++ b/biome.json @@ -0,0 +1,50 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.11/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false, + "includes": ["**", "!public/videoajax", "!dist"] + }, + "css": { + "parser": { + "cssModules": true, + "tailwindDirectives": true + }, + "linter": { + "enabled": false + }, + "formatter": { + "enabled": false + } + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "suspicious": { + "noUnknownAtRules": "off" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..ad448a6 --- /dev/null +++ b/bun.lock @@ -0,0 +1,403 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "eco-steps", + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/utilities": "^3.2.2", + "@gsap/react": "^2.1.2", + "clsx": "^2.1.1", + "gsap": "^3.15.0", + "howler": "^2.2.4", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "react-router-dom": "^7.12.0", + "tailwind-merge": "^3.5.0", + "vconsole": "^3.15.1", + "zustand": "^5.0.14", + }, + "devDependencies": { + "@biomejs/biome": "2.3.11", + "@playwright/test": "^1.61.1", + "@tailwindcss/postcss": "^4.1.18", + "@types/howler": "^2.2.13", + "@types/node": "^25.0.10", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^6.0.3", + "autoprefixer": "^10.4.23", + "husky": "^9.1.7", + "lint-staged": "^16.2.7", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "typescript": "~5.7.2", + "vite": "^8.1.2", + }, + }, + }, + "packages": { + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + + "@babel/runtime": ["@babel/runtime@7.29.7", "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.7.tgz", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], + + "@biomejs/biome": ["@biomejs/biome@2.3.11", "https://registry.npmmirror.com/@biomejs/biome/-/biome-2.3.11.tgz", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.3.11", "@biomejs/cli-darwin-x64": "2.3.11", "@biomejs/cli-linux-arm64": "2.3.11", "@biomejs/cli-linux-arm64-musl": "2.3.11", "@biomejs/cli-linux-x64": "2.3.11", "@biomejs/cli-linux-x64-musl": "2.3.11", "@biomejs/cli-win32-arm64": "2.3.11", "@biomejs/cli-win32-x64": "2.3.11" }, "bin": { "biome": "bin/biome" } }, "sha512-/zt+6qazBWguPG6+eWmiELqO+9jRsMZ/DBU3lfuU2ngtIQYzymocHhKiZRyrbra4aCOoyTg/BmY+6WH5mv9xmQ=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.11", "https://registry.npmmirror.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.11.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-/uXXkBcPKVQY7rc9Ys2CrlirBJYbpESEDme7RKiBD6MmqR2w3j0+ZZXRIL2xiaNPsIMMNhP1YnA+jRRxoOAFrA=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.11", "https://registry.npmmirror.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.11.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-fh7nnvbweDPm2xEmFjfmq7zSUiox88plgdHF9OIW4i99WnXrAC3o2P3ag9judoUMv8FCSUnlwJCM1B64nO5Fbg=="], + + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.11", "https://registry.npmmirror.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.11.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-l4xkGa9E7Uc0/05qU2lMYfN1H+fzzkHgaJoy98wO+b/7Gl78srbCRRgwYSW+BTLixTBrM6Ede5NSBwt7rd/i6g=="], + + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.11", "https://registry.npmmirror.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.11.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-XPSQ+XIPZMLaZ6zveQdwNjbX+QdROEd1zPgMwD47zvHV+tCGB88VH+aynyGxAHdzL+Tm/+DtKST5SECs4iwCLg=="], + + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.11", "https://registry.npmmirror.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.11.tgz", { "os": "linux", "cpu": "x64" }, "sha512-/1s9V/H3cSe0r0Mv/Z8JryF5x9ywRxywomqZVLHAoa/uN0eY7F8gEngWKNS5vbbN/BsfpCG5yeBT5ENh50Frxg=="], + + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.11", "https://registry.npmmirror.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.11.tgz", { "os": "linux", "cpu": "x64" }, "sha512-vU7a8wLs5C9yJ4CB8a44r12aXYb8yYgBn+WeyzbMjaCMklzCv1oXr8x+VEyWodgJt9bDmhiaW/I0RHbn7rsNmw=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.11", "https://registry.npmmirror.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.11.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-PZQ6ElCOnkYapSsysiTy0+fYX+agXPlWugh6+eQ6uPKI3vKAqNp6TnMhoM3oY2NltSB89hz59o8xIfOdyhi9Iw=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.11", "https://registry.npmmirror.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.11.tgz", { "os": "win32", "cpu": "x64" }, "sha512-43VrG813EW+b5+YbDbz31uUsheX+qFKCpXeY9kfdAx+ww3naKxeVkTD9zLIWxUPfJquANMHrmW3wbe/037G0Qg=="], + + "@dnd-kit/accessibility": ["@dnd-kit/accessibility@3.1.1", "https://registry.npmmirror.com/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw=="], + + "@dnd-kit/core": ["@dnd-kit/core@6.3.1", "https://registry.npmmirror.com/@dnd-kit/core/-/core-6.3.1.tgz", { "dependencies": { "@dnd-kit/accessibility": "^3.1.1", "@dnd-kit/utilities": "^3.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ=="], + + "@dnd-kit/utilities": ["@dnd-kit/utilities@3.2.2", "https://registry.npmmirror.com/@dnd-kit/utilities/-/utilities-3.2.2.tgz", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg=="], + + "@emnapi/core": ["@emnapi/core@1.11.1", "https://registry.npmmirror.com/@emnapi/core/-/core-1.11.1.tgz", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.11.1", "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.11.1.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], + + "@gsap/react": ["@gsap/react@2.1.2", "https://registry.npmmirror.com/@gsap/react/-/react-2.1.2.tgz", { "peerDependencies": { "gsap": "^3.12.5", "react": ">=17" } }, "sha512-JqliybO1837UcgH2hVOM4VO+38APk3ECNrsuSM4MuXp+rbf+/2IG2K1YJiqfTcXQHH7XlA0m3ykniFYstfq0Iw=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], + + "@oxc-project/types": ["@oxc-project/types@0.137.0", "https://registry.npmmirror.com/@oxc-project/types/-/types-0.137.0.tgz", {}, "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA=="], + + "@playwright/test": ["@playwright/test@1.61.1", "https://registry.npmmirror.com/@playwright/test/-/test-1.61.1.tgz", { "dependencies": { "playwright": "1.61.1" }, "bin": { "playwright": "cli.js" } }, "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig=="], + + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz", { "os": "android", "cpu": "arm64" }, "sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g=="], + + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.3.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw=="], + + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.3.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw=="], + + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.3.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw=="], + + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.3.tgz", { "os": "linux", "cpu": "arm" }, "sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg=="], + + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.3.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA=="], + + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.3.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w=="], + + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.3.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw=="], + + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.3.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA=="], + + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.3.tgz", { "os": "linux", "cpu": "x64" }, "sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg=="], + + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.3.tgz", { "os": "linux", "cpu": "x64" }, "sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g=="], + + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.3.tgz", { "os": "none", "cpu": "arm64" }, "sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ=="], + + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.3.tgz", { "dependencies": { "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@napi-rs/wasm-runtime": "^1.1.6" }, "cpu": "none" }, "sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg=="], + + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.3.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g=="], + + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.1.3", "https://registry.npmmirror.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.3.tgz", { "os": "win32", "cpu": "x64" }, "sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.1.18", "https://registry.npmmirror.com/@tailwindcss/node/-/node-4.1.18.tgz", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.18" } }, "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.18", "https://registry.npmmirror.com/@tailwindcss/oxide/-/oxide-4.1.18.tgz", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.18", "@tailwindcss/oxide-darwin-arm64": "4.1.18", "@tailwindcss/oxide-darwin-x64": "4.1.18", "@tailwindcss/oxide-freebsd-x64": "4.1.18", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", "@tailwindcss/oxide-linux-x64-musl": "4.1.18", "@tailwindcss/oxide-wasm32-wasi": "4.1.18", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" } }, "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.18", "https://registry.npmmirror.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", { "os": "android", "cpu": "arm64" }, "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.18", "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.18", "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.18", "https://registry.npmmirror.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", { "os": "linux", "cpu": "arm" }, "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.18", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.18", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.18", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", { "os": "linux", "cpu": "x64" }, "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.18", "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", { "os": "linux", "cpu": "x64" }, "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.18", "https://registry.npmmirror.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.0", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.4.0" }, "cpu": "none" }, "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.18", "https://registry.npmmirror.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.18", "https://registry.npmmirror.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", { "os": "win32", "cpu": "x64" }, "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q=="], + + "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.18", "https://registry.npmmirror.com/@tailwindcss/postcss/-/postcss-4.1.18.tgz", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.18", "@tailwindcss/oxide": "4.1.18", "postcss": "^8.4.41", "tailwindcss": "4.1.18" } }, "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], + + "@types/howler": ["@types/howler@2.2.13", "https://registry.npmmirror.com/@types/howler/-/howler-2.2.13.tgz", {}, "sha512-40+EBjqIHHrC4VShlz/7i0lBUsE3QkgzZinQQji74Hd8sBkJZUBaT7LWFLK6rcabsDOOQpoMbEJvtaFQwxOu/g=="], + + "@types/node": ["@types/node@25.0.10", "https://registry.npmmirror.com/@types/node/-/node-25.0.10.tgz", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg=="], + + "@types/react": ["@types/react@19.2.9", "https://registry.npmmirror.com/@types/react/-/react-19.2.9.tgz", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA=="], + + "@types/react-dom": ["@types/react-dom@19.2.3", "https://registry.npmmirror.com/@types/react-dom/-/react-dom-19.2.3.tgz", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + + "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.3", "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-6.0.3.tgz", { "dependencies": { "@rolldown/pluginutils": "^1.0.1" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg=="], + + "ansi-escapes": ["ansi-escapes@7.2.0", "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-7.2.0.tgz", { "dependencies": { "environment": "^1.0.0" } }, "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw=="], + + "ansi-regex": ["ansi-regex@6.2.2", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ansi-styles": ["ansi-styles@6.2.3", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "autoprefixer": ["autoprefixer@10.4.23", "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.23.tgz", { "dependencies": { "browserslist": "^4.28.1", "caniuse-lite": "^1.0.30001760", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.9.17", "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ=="], + + "braces": ["braces@3.0.3", "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.28.1", "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.1.tgz", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001765", "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz", {}, "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ=="], + + "cli-cursor": ["cli-cursor@5.0.0", "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-5.0.0.tgz", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], + + "cli-truncate": ["cli-truncate@5.1.1", "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-5.1.1.tgz", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="], + + "clsx": ["clsx@2.1.1", "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "colorette": ["colorette@2.0.20", "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + + "commander": ["commander@14.0.2", "https://registry.npmmirror.com/commander/-/commander-14.0.2.tgz", {}, "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="], + + "cookie": ["cookie@1.1.1", "https://registry.npmmirror.com/cookie/-/cookie-1.1.1.tgz", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + + "copy-text-to-clipboard": ["copy-text-to-clipboard@3.2.2", "https://registry.npmmirror.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz", {}, "sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A=="], + + "core-js": ["core-js@3.49.0", "https://registry.npmmirror.com/core-js/-/core-js-3.49.0.tgz", {}, "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg=="], + + "csstype": ["csstype@3.2.3", "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "detect-libc": ["detect-libc@2.1.2", "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.277", "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.277.tgz", {}, "sha512-wKXFZw4erWmmOz5N/grBoJ2XrNJGDFMu2+W5ACHza5rHtvsqrK4gb6rnLC7XxKB9WlJ+RmyQatuEXmtm86xbnw=="], + + "emoji-regex": ["emoji-regex@10.6.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.6.0.tgz", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.4", "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q=="], + + "environment": ["environment@1.1.0", "https://registry.npmmirror.com/environment/-/environment-1.1.0.tgz", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], + + "escalade": ["escalade@3.2.0", "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "eventemitter3": ["eventemitter3@5.0.4", "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.4.tgz", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + + "fdir": ["fdir@6.5.0", "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "fill-range": ["fill-range@7.1.1", "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "fraction.js": ["fraction.js@5.3.4", "https://registry.npmmirror.com/fraction.js/-/fraction.js-5.3.4.tgz", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="], + + "fsevents": ["fsevents@2.3.3", "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "get-east-asian-width": ["get-east-asian-width@1.4.0", "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + + "graceful-fs": ["graceful-fs@4.2.11", "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "gsap": ["gsap@3.15.0", "https://registry.npmmirror.com/gsap/-/gsap-3.15.0.tgz", {}, "sha512-dMW4CWBTUK1AEEDeZc1g4xpPGIrSf9fJF960qbTZmN/QwZIWY5wgliS6JWl9/25fpTGJrMRtSjGtOmPnfjZB+A=="], + + "howler": ["howler@2.2.4", "https://registry.npmmirror.com/howler/-/howler-2.2.4.tgz", {}, "sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w=="], + + "husky": ["husky@9.1.7", "https://registry.npmmirror.com/husky/-/husky-9.1.7.tgz", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + + "is-number": ["is-number@7.0.0", "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "jiti": ["jiti@2.6.1", "https://registry.npmmirror.com/jiti/-/jiti-2.6.1.tgz", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + + "lightningcss": ["lightningcss@1.32.0", "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.32.0.tgz", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], + + "lint-staged": ["lint-staged@16.2.7", "https://registry.npmmirror.com/lint-staged/-/lint-staged-16.2.7.tgz", { "dependencies": { "commander": "^14.0.2", "listr2": "^9.0.5", "micromatch": "^4.0.8", "nano-spawn": "^2.0.0", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow=="], + + "listr2": ["listr2@9.0.5", "https://registry.npmmirror.com/listr2/-/listr2-9.0.5.tgz", { "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g=="], + + "log-update": ["log-update@6.1.0", "https://registry.npmmirror.com/log-update/-/log-update-6.1.0.tgz", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], + + "magic-string": ["magic-string@0.30.21", "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "micromatch": ["micromatch@4.0.8", "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mimic-function": ["mimic-function@5.0.1", "https://registry.npmmirror.com/mimic-function/-/mimic-function-5.0.1.tgz", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + + "mutation-observer": ["mutation-observer@1.0.3", "https://registry.npmmirror.com/mutation-observer/-/mutation-observer-1.0.3.tgz", {}, "sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA=="], + + "nano-spawn": ["nano-spawn@2.0.0", "https://registry.npmmirror.com/nano-spawn/-/nano-spawn-2.0.0.tgz", {}, "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw=="], + + "nanoid": ["nanoid@3.3.11", "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "node-releases": ["node-releases@2.0.27", "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.27.tgz", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], + + "onetime": ["onetime@7.0.0", "https://registry.npmmirror.com/onetime/-/onetime-7.0.0.tgz", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + + "picocolors": ["picocolors@1.1.1", "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.4", "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], + + "pidtree": ["pidtree@0.6.0", "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="], + + "playwright": ["playwright@1.61.1", "https://registry.npmmirror.com/playwright/-/playwright-1.61.1.tgz", { "dependencies": { "playwright-core": "1.61.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ=="], + + "playwright-core": ["playwright-core@1.61.1", "https://registry.npmmirror.com/playwright-core/-/playwright-core-1.61.1.tgz", { "bin": { "playwright-core": "cli.js" } }, "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg=="], + + "postcss": ["postcss@8.5.6", "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "react": ["react@19.2.7", "https://registry.npmmirror.com/react/-/react-19.2.7.tgz", {}, "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ=="], + + "react-dom": ["react-dom@19.2.7", "https://registry.npmmirror.com/react-dom/-/react-dom-19.2.7.tgz", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.7" } }, "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ=="], + + "react-router": ["react-router@7.12.0", "https://registry.npmmirror.com/react-router/-/react-router-7.12.0.tgz", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-kTPDYPFzDVGIIGNLS5VJykK0HfHLY5MF3b+xj0/tTyNYL1gF1qs7u67Z9jEhQk2sQ98SUaHxlG31g1JtF7IfVw=="], + + "react-router-dom": ["react-router-dom@7.12.0", "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-7.12.0.tgz", { "dependencies": { "react-router": "7.12.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-pfO9fiBcpEfX4Tx+iTYKDtPbrSLLCbwJ5EqP+SPYQu1VYCXdy79GSj0wttR0U4cikVdlImZuEZ/9ZNCgoaxwBA=="], + + "restore-cursor": ["restore-cursor@5.1.0", "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-5.1.0.tgz", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + + "rfdc": ["rfdc@1.4.1", "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + + "rolldown": ["rolldown@1.1.3", "https://registry.npmmirror.com/rolldown/-/rolldown-1.1.3.tgz", { "dependencies": { "@oxc-project/types": "=0.137.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.1.3", "@rolldown/binding-darwin-arm64": "1.1.3", "@rolldown/binding-darwin-x64": "1.1.3", "@rolldown/binding-freebsd-x64": "1.1.3", "@rolldown/binding-linux-arm-gnueabihf": "1.1.3", "@rolldown/binding-linux-arm64-gnu": "1.1.3", "@rolldown/binding-linux-arm64-musl": "1.1.3", "@rolldown/binding-linux-ppc64-gnu": "1.1.3", "@rolldown/binding-linux-s390x-gnu": "1.1.3", "@rolldown/binding-linux-x64-gnu": "1.1.3", "@rolldown/binding-linux-x64-musl": "1.1.3", "@rolldown/binding-openharmony-arm64": "1.1.3", "@rolldown/binding-wasm32-wasi": "1.1.3", "@rolldown/binding-win32-arm64-msvc": "1.1.3", "@rolldown/binding-win32-x64-msvc": "1.1.3" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g=="], + + "scheduler": ["scheduler@0.27.0", "https://registry.npmmirror.com/scheduler/-/scheduler-0.27.0.tgz", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "set-cookie-parser": ["set-cookie-parser@2.7.2", "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], + + "signal-exit": ["signal-exit@4.1.0", "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "slice-ansi": ["slice-ansi@7.1.2", "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-7.1.2.tgz", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], + + "source-map-js": ["source-map-js@1.2.1", "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "string-argv": ["string-argv@0.3.2", "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], + + "string-width": ["string-width@8.1.0", "https://registry.npmmirror.com/string-width/-/string-width-8.1.0.tgz", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg=="], + + "strip-ansi": ["strip-ansi@7.1.2", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.2.tgz", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "tailwind-merge": ["tailwind-merge@3.6.0", "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-3.6.0.tgz", {}, "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w=="], + + "tailwindcss": ["tailwindcss@4.1.18", "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-4.1.18.tgz", {}, "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw=="], + + "tapable": ["tapable@2.3.0", "https://registry.npmmirror.com/tapable/-/tapable-2.3.0.tgz", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], + + "tinyglobby": ["tinyglobby@0.2.17", "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + + "to-regex-range": ["to-regex-range@5.0.1", "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "tslib": ["tslib@2.8.1", "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "typescript": ["typescript@5.7.3", "https://registry.npmmirror.com/typescript/-/typescript-5.7.3.tgz", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], + + "undici-types": ["undici-types@7.16.0", "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "update-browserslist-db": ["update-browserslist-db@1.2.3", "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + + "vconsole": ["vconsole@3.15.1", "https://registry.npmmirror.com/vconsole/-/vconsole-3.15.1.tgz", { "dependencies": { "@babel/runtime": "^7.17.2", "copy-text-to-clipboard": "^3.0.1", "core-js": "^3.11.0", "mutation-observer": "^1.0.3" } }, "sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g=="], + + "vite": ["vite@8.1.2", "https://registry.npmmirror.com/vite/-/vite-8.1.2.tgz", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.16", "rolldown": "~1.1.3", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-6YYPbRXTxx6bRXmOn7XdnQAy5DQNHhDgtjhDHI13oe4pY93kkcdGJWxpGwOm++/Wh0QpQhDrpIoVMrmrsI5AGQ=="], + + "wrap-ansi": ["wrap-ansi@9.0.2", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + + "yaml": ["yaml@2.8.2", "https://registry.npmmirror.com/yaml/-/yaml-2.8.2.tgz", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + + "zustand": ["zustand@5.0.14", "https://registry.npmmirror.com/zustand/-/zustand-5.0.14.tgz", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g=="], + + "@tailwindcss/node/lightningcss": ["lightningcss@1.30.2", "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.30.2.tgz", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "https://registry.npmmirror.com/@emnapi/core/-/core-1.8.1.tgz", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.8.1.tgz", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "playwright/fsevents": ["fsevents@2.3.2", "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], + + "vite/postcss": ["postcss@8.5.16", "https://registry.npmmirror.com/postcss/-/postcss-8.5.16.tgz", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg=="], + + "wrap-ansi/string-width": ["string-width@7.2.0", "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "@tailwindcss/node/lightningcss/lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="], + + "@tailwindcss/node/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.2", "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA=="], + + "@tailwindcss/node/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.2", "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ=="], + + "@tailwindcss/node/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.2", "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.2", "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", { "os": "linux", "cpu": "arm" }, "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.2", "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.2", "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.2", "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", { "os": "linux", "cpu": "x64" }, "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w=="], + + "@tailwindcss/node/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.2", "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", { "os": "linux", "cpu": "x64" }, "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA=="], + + "@tailwindcss/node/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.2", "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ=="], + + "@tailwindcss/node/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="], + + "vite/postcss/nanoid": ["nanoid@3.3.15", "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.15.tgz", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA=="], + } +} diff --git a/components.json b/components.json new file mode 100644 index 0000000..f74c8f4 --- /dev/null +++ b/components.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://registry.yuxiang.example/components.schema.json", + "version": 1, + "framework": "react", + "typescript": true, + "tailwind": { + "version": 4, + "css": "src/styles/index.css" + }, + "directories": { + "ui": "src/components/ui", + "interactions": "src/course/interactions", + "runtime": "src/course", + "lib": "src/lib" + }, + "aliases": { + "ui": "@/components/ui", + "interactions": "@/course/interactions", + "runtime": "@/course", + "lib": "@/lib" + } +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..a17f509 --- /dev/null +++ b/index.html @@ -0,0 +1,17 @@ + + + + + + + + %APP_TITLE% + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..a42707b --- /dev/null +++ b/package.json @@ -0,0 +1,49 @@ +{ + "name": "yx-react-template", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "biome check .", + "lint:fix": "biome check --write .", + "preview": "vite preview", + "prepare": "husky" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx,json}": "bunx biome check --write", + "*.{css,module.css}": "echo 'Skipping CSS files'" + }, + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/utilities": "^3.2.2", + "@gsap/react": "^2.1.2", + "clsx": "^2.1.1", + "gsap": "^3.15.0", + "howler": "^2.2.4", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "react-router-dom": "^7.12.0", + "tailwind-merge": "^3.5.0", + "vconsole": "^3.15.1", + "zustand": "^5.0.14" + }, + "devDependencies": { + "@biomejs/biome": "2.3.11", + "@playwright/test": "^1.61.1", + "@tailwindcss/postcss": "^4.1.18", + "@types/howler": "^2.2.13", + "@types/node": "^25.0.10", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^6.0.3", + "autoprefixer": "^10.4.23", + "husky": "^9.1.7", + "lint-staged": "^16.2.7", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "typescript": "~5.7.2", + "vite": "^8.1.2" + } +} diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..489c8d8 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,39 @@ +import { defineConfig, devices } from "@playwright/test"; + +const PORT = 4173; +const BASE_URL = `http://127.0.0.1:${PORT}`; + +export default defineConfig({ + testDir: "./tests/e2e", + fullyParallel: false, + forbidOnly: !!process.env.CI, + retries: 0, + workers: 1, + reporter: [["list"]], + use: { + baseURL: BASE_URL, + trace: "retain-on-failure", + }, + projects: [ + { + name: "chromium-desktop", + use: { + ...devices["Desktop Chrome"], + viewport: { width: 1280, height: 720 }, + }, + }, + { + name: "chromium-full", + use: { + ...devices["Desktop Chrome"], + viewport: { width: 1920, height: 1080 }, + }, + }, + ], + webServer: { + command: "bun run build && bun run preview -- --host 127.0.0.1 --port 4173", + url: BASE_URL, + reuseExistingServer: !process.env.CI, + timeout: 120_000, + }, +}); diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..017b34b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,5 @@ +export default { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; diff --git a/public/videoajax/jquery-3.7.1.min.js b/public/videoajax/jquery-3.7.1.min.js new file mode 100644 index 0000000..76c9df1 --- /dev/null +++ b/public/videoajax/jquery-3.7.1.min.js @@ -0,0 +1,4902 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!(function (e, t) { + 'use strict' + 'object' == typeof module && 'object' == typeof module.exports + ? (module.exports = e.document + ? t(e, !0) + : function (e) { + if (!e.document) throw new Error('jQuery requires a window with a document') + return t(e) + }) + : t(e) +})('undefined' != typeof window ? window : this, function (ie, e) { + 'use strict' + var oe = [], + r = Object.getPrototypeOf, + ae = oe.slice, + g = oe.flat + ? function (e) { + return oe.flat.call(e) + } + : function (e) { + return oe.concat.apply([], e) + }, + s = oe.push, + se = oe.indexOf, + n = {}, + i = n.toString, + ue = n.hasOwnProperty, + o = ue.toString, + a = o.call(Object), + le = {}, + v = function (e) { + return 'function' == typeof e && 'number' != typeof e.nodeType && 'function' != typeof e.item + }, + y = function (e) { + return null != e && e === e.window + }, + C = ie.document, + u = { type: !0, src: !0, nonce: !0, noModule: !0 } + function m(e, t, n) { + var r, + i, + o = (n = n || C).createElement('script') + if (((o.text = e), t)) + for (r in u) (i = t[r] || (t.getAttribute && t.getAttribute(r))) && o.setAttribute(r, i) + n.head.appendChild(o).parentNode.removeChild(o) + } + function x(e) { + return null == e + ? e + '' + : 'object' == typeof e || 'function' == typeof e + ? n[i.call(e)] || 'object' + : typeof e + } + var t = '3.7.1', + l = /HTML$/i, + ce = function (e, t) { + return new ce.fn.init(e, t) + } + function c(e) { + var t = !!e && 'length' in e && e.length, + n = x(e) + return ( + !v(e) && !y(e) && ('array' === n || 0 === t || ('number' == typeof t && 0 < t && t - 1 in e)) + ) + } + function fe(e, t) { + return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() + } + ;((ce.fn = ce.prototype = + { + jquery: t, + constructor: ce, + length: 0, + toArray: function () { + return ae.call(this) + }, + get: function (e) { + return null == e ? ae.call(this) : e < 0 ? this[e + this.length] : this[e] + }, + pushStack: function (e) { + var t = ce.merge(this.constructor(), e) + return ((t.prevObject = this), t) + }, + each: function (e) { + return ce.each(this, e) + }, + map: function (n) { + return this.pushStack( + ce.map(this, function (e, t) { + return n.call(e, t, e) + }) + ) + }, + slice: function () { + return this.pushStack(ae.apply(this, arguments)) + }, + first: function () { + return this.eq(0) + }, + last: function () { + return this.eq(-1) + }, + even: function () { + return this.pushStack( + ce.grep(this, function (e, t) { + return (t + 1) % 2 + }) + ) + }, + odd: function () { + return this.pushStack( + ce.grep(this, function (e, t) { + return t % 2 + }) + ) + }, + eq: function (e) { + var t = this.length, + n = +e + (e < 0 ? t : 0) + return this.pushStack(0 <= n && n < t ? [this[n]] : []) + }, + end: function () { + return this.prevObject || this.constructor() + }, + push: s, + sort: oe.sort, + splice: oe.splice, + }), + (ce.extend = ce.fn.extend = + function () { + var e, + t, + n, + r, + i, + o, + a = arguments[0] || {}, + s = 1, + u = arguments.length, + l = !1 + for ( + 'boolean' == typeof a && ((l = a), (a = arguments[s] || {}), s++), + 'object' == typeof a || v(a) || (a = {}), + s === u && ((a = this), s--); + s < u; + s++ + ) + if (null != (e = arguments[s])) + for (t in e) + ((r = e[t]), + '__proto__' !== t && + a !== r && + (l && r && (ce.isPlainObject(r) || (i = Array.isArray(r))) + ? ((n = a[t]), + (o = i && !Array.isArray(n) ? [] : i || ce.isPlainObject(n) ? n : {}), + (i = !1), + (a[t] = ce.extend(l, o, r))) + : void 0 !== r && (a[t] = r))) + return a + }), + ce.extend({ + expando: 'jQuery' + (t + Math.random()).replace(/\D/g, ''), + isReady: !0, + error: function (e) { + throw new Error(e) + }, + noop: function () {}, + isPlainObject: function (e) { + var t, n + return ( + !(!e || '[object Object]' !== i.call(e)) && + (!(t = r(e)) || + ('function' == typeof (n = ue.call(t, 'constructor') && t.constructor) && + o.call(n) === a)) + ) + }, + isEmptyObject: function (e) { + var t + for (t in e) return !1 + return !0 + }, + globalEval: function (e, t, n) { + m(e, { nonce: t && t.nonce }, n) + }, + each: function (e, t) { + var n, + r = 0 + if (c(e)) { + for (n = e.length; r < n; r++) if (!1 === t.call(e[r], r, e[r])) break + } else for (r in e) if (!1 === t.call(e[r], r, e[r])) break + return e + }, + text: function (e) { + var t, + n = '', + r = 0, + i = e.nodeType + if (!i) while ((t = e[r++])) n += ce.text(t) + return 1 === i || 11 === i + ? e.textContent + : 9 === i + ? e.documentElement.textContent + : 3 === i || 4 === i + ? e.nodeValue + : n + }, + makeArray: function (e, t) { + var n = t || [] + return ( + null != e && (c(Object(e)) ? ce.merge(n, 'string' == typeof e ? [e] : e) : s.call(n, e)), + n + ) + }, + inArray: function (e, t, n) { + return null == t ? -1 : se.call(t, e, n) + }, + isXMLDoc: function (e) { + var t = e && e.namespaceURI, + n = e && (e.ownerDocument || e).documentElement + return !l.test(t || (n && n.nodeName) || 'HTML') + }, + merge: function (e, t) { + for (var n = +t.length, r = 0, i = e.length; r < n; r++) e[i++] = t[r] + return ((e.length = i), e) + }, + grep: function (e, t, n) { + for (var r = [], i = 0, o = e.length, a = !n; i < o; i++) !t(e[i], i) !== a && r.push(e[i]) + return r + }, + map: function (e, t, n) { + var r, + i, + o = 0, + a = [] + if (c(e)) for (r = e.length; o < r; o++) null != (i = t(e[o], o, n)) && a.push(i) + else for (o in e) null != (i = t(e[o], o, n)) && a.push(i) + return g(a) + }, + guid: 1, + support: le, + }), + 'function' == typeof Symbol && (ce.fn[Symbol.iterator] = oe[Symbol.iterator]), + ce.each( + 'Boolean Number String Function Array Date RegExp Object Error Symbol'.split(' '), + function (e, t) { + n['[object ' + t + ']'] = t.toLowerCase() + } + )) + var pe = oe.pop, + de = oe.sort, + he = oe.splice, + ge = '[\\x20\\t\\r\\n\\f]', + ve = new RegExp('^' + ge + '+|((?:^|[^\\\\])(?:\\\\.)*)' + ge + '+$', 'g') + ce.contains = function (e, t) { + var n = t && t.parentNode + return ( + e === n || + !( + !n || + 1 !== n.nodeType || + !(e.contains + ? e.contains(n) + : e.compareDocumentPosition && 16 & e.compareDocumentPosition(n)) + ) + ) + } + var f = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g + function p(e, t) { + return t + ? '\0' === e + ? '\ufffd' + : e.slice(0, -1) + '\\' + e.charCodeAt(e.length - 1).toString(16) + ' ' + : '\\' + e + } + ce.escapeSelector = function (e) { + return (e + '').replace(f, p) + } + var ye = C, + me = s + !(function () { + var e, + b, + w, + o, + a, + T, + r, + C, + d, + i, + k = me, + S = ce.expando, + E = 0, + n = 0, + s = W(), + c = W(), + u = W(), + h = W(), + l = function (e, t) { + return (e === t && (a = !0), 0) + }, + f = + 'checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped', + t = '(?:\\\\[\\da-fA-F]{1,6}' + ge + '?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+', + p = + '\\[' + + ge + + '*(' + + t + + ')(?:' + + ge + + '*([*^$|!~]?=)' + + ge + + '*(?:\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)"|(' + + t + + '))|)' + + ge + + '*\\]', + g = + ':(' + + t + + ')(?:\\(((\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)")|((?:\\\\.|[^\\\\()[\\]]|' + + p + + ')*)|.*)\\)|)', + v = new RegExp(ge + '+', 'g'), + y = new RegExp('^' + ge + '*,' + ge + '*'), + m = new RegExp('^' + ge + '*([>+~]|' + ge + ')' + ge + '*'), + x = new RegExp(ge + '|>'), + j = new RegExp(g), + A = new RegExp('^' + t + '$'), + D = { + ID: new RegExp('^#(' + t + ')'), + CLASS: new RegExp('^\\.(' + t + ')'), + TAG: new RegExp('^(' + t + '|[*])'), + ATTR: new RegExp('^' + p), + PSEUDO: new RegExp('^' + g), + CHILD: new RegExp( + '^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(' + + ge + + '*(even|odd|(([+-]|)(\\d*)n|)' + + ge + + '*(?:([+-]|)' + + ge + + '*(\\d+)|))' + + ge + + '*\\)|)', + 'i' + ), + bool: new RegExp('^(?:' + f + ')$', 'i'), + needsContext: new RegExp( + '^' + + ge + + '*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(' + + ge + + '*((?:-\\d)?\\d*)' + + ge + + '*\\)|)(?=[^-]|$)', + 'i' + ), + }, + N = /^(?:input|select|textarea|button)$/i, + q = /^h\d$/i, + L = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + H = /[+~]/, + O = new RegExp('\\\\[\\da-fA-F]{1,6}' + ge + '?|\\\\([^\\r\\n\\f])', 'g'), + P = function (e, t) { + var n = '0x' + e.slice(1) - 65536 + return ( + t || + (n < 0 + ? String.fromCharCode(n + 65536) + : String.fromCharCode((n >> 10) | 55296, (1023 & n) | 56320)) + ) + }, + M = function () { + V() + }, + R = J( + function (e) { + return !0 === e.disabled && fe(e, 'fieldset') + }, + { dir: 'parentNode', next: 'legend' } + ) + try { + ;(k.apply((oe = ae.call(ye.childNodes)), ye.childNodes), oe[ye.childNodes.length].nodeType) + } catch (e) { + k = { + apply: function (e, t) { + me.apply(e, ae.call(t)) + }, + call: function (e) { + me.apply(e, ae.call(arguments, 1)) + }, + } + } + function I(t, e, n, r) { + var i, + o, + a, + s, + u, + l, + c, + f = e && e.ownerDocument, + p = e ? e.nodeType : 9 + if (((n = n || []), 'string' != typeof t || !t || (1 !== p && 9 !== p && 11 !== p))) return n + if (!r && (V(e), (e = e || T), C)) { + if (11 !== p && (u = L.exec(t))) + if ((i = u[1])) { + if (9 === p) { + if (!(a = e.getElementById(i))) return n + if (a.id === i) return (k.call(n, a), n) + } else if (f && (a = f.getElementById(i)) && I.contains(e, a) && a.id === i) + return (k.call(n, a), n) + } else { + if (u[2]) return (k.apply(n, e.getElementsByTagName(t)), n) + if ((i = u[3]) && e.getElementsByClassName) + return (k.apply(n, e.getElementsByClassName(i)), n) + } + if (!(h[t + ' '] || (d && d.test(t)))) { + if (((c = t), (f = e), 1 === p && (x.test(t) || m.test(t)))) { + ;(((f = (H.test(t) && U(e.parentNode)) || e) == e && le.scope) || + ((s = e.getAttribute('id')) + ? (s = ce.escapeSelector(s)) + : e.setAttribute('id', (s = S))), + (o = (l = Y(t)).length)) + while (o--) l[o] = (s ? '#' + s : ':scope') + ' ' + Q(l[o]) + c = l.join(',') + } + try { + return (k.apply(n, f.querySelectorAll(c)), n) + } catch (e) { + h(t, !0) + } finally { + s === S && e.removeAttribute('id') + } + } + } + return re(t.replace(ve, '$1'), e, n, r) + } + function W() { + var r = [] + return function e(t, n) { + return (r.push(t + ' ') > b.cacheLength && delete e[r.shift()], (e[t + ' '] = n)) + } + } + function F(e) { + return ((e[S] = !0), e) + } + function $(e) { + var t = T.createElement('fieldset') + try { + return !!e(t) + } catch (e) { + return !1 + } finally { + ;(t.parentNode && t.parentNode.removeChild(t), (t = null)) + } + } + function B(t) { + return function (e) { + return fe(e, 'input') && e.type === t + } + } + function _(t) { + return function (e) { + return (fe(e, 'input') || fe(e, 'button')) && e.type === t + } + } + function z(t) { + return function (e) { + return 'form' in e + ? e.parentNode && !1 === e.disabled + ? 'label' in e + ? 'label' in e.parentNode + ? e.parentNode.disabled === t + : e.disabled === t + : e.isDisabled === t || (e.isDisabled !== !t && R(e) === t) + : e.disabled === t + : 'label' in e && e.disabled === t + } + } + function X(a) { + return F(function (o) { + return ( + (o = +o), + F(function (e, t) { + var n, + r = a([], e.length, o), + i = r.length + while (i--) e[(n = r[i])] && (e[n] = !(t[n] = e[n])) + }) + ) + }) + } + function U(e) { + return e && 'undefined' != typeof e.getElementsByTagName && e + } + function V(e) { + var t, + n = e ? e.ownerDocument || e : ye + return ( + n != T && + 9 === n.nodeType && + n.documentElement && + ((r = (T = n).documentElement), + (C = !ce.isXMLDoc(T)), + (i = r.matches || r.webkitMatchesSelector || r.msMatchesSelector), + r.msMatchesSelector && + ye != T && + (t = T.defaultView) && + t.top !== t && + t.addEventListener('unload', M), + (le.getById = $(function (e) { + return ( + (r.appendChild(e).id = ce.expando), + !T.getElementsByName || !T.getElementsByName(ce.expando).length + ) + })), + (le.disconnectedMatch = $(function (e) { + return i.call(e, '*') + })), + (le.scope = $(function () { + return T.querySelectorAll(':scope') + })), + (le.cssHas = $(function () { + try { + return (T.querySelector(':has(*,:jqfake)'), !1) + } catch (e) { + return !0 + } + })), + le.getById + ? ((b.filter.ID = function (e) { + var t = e.replace(O, P) + return function (e) { + return e.getAttribute('id') === t + } + }), + (b.find.ID = function (e, t) { + if ('undefined' != typeof t.getElementById && C) { + var n = t.getElementById(e) + return n ? [n] : [] + } + })) + : ((b.filter.ID = function (e) { + var n = e.replace(O, P) + return function (e) { + var t = 'undefined' != typeof e.getAttributeNode && e.getAttributeNode('id') + return t && t.value === n + } + }), + (b.find.ID = function (e, t) { + if ('undefined' != typeof t.getElementById && C) { + var n, + r, + i, + o = t.getElementById(e) + if (o) { + if ((n = o.getAttributeNode('id')) && n.value === e) return [o] + ;((i = t.getElementsByName(e)), (r = 0)) + while ((o = i[r++])) + if ((n = o.getAttributeNode('id')) && n.value === e) return [o] + } + return [] + } + })), + (b.find.TAG = function (e, t) { + return 'undefined' != typeof t.getElementsByTagName + ? t.getElementsByTagName(e) + : t.querySelectorAll(e) + }), + (b.find.CLASS = function (e, t) { + if ('undefined' != typeof t.getElementsByClassName && C) + return t.getElementsByClassName(e) + }), + (d = []), + $(function (e) { + var t + ;((r.appendChild(e).innerHTML = + ""), + e.querySelectorAll('[selected]').length || + d.push('\\[' + ge + '*(?:value|' + f + ')'), + e.querySelectorAll('[id~=' + S + '-]').length || d.push('~='), + e.querySelectorAll('a#' + S + '+*').length || d.push('.#.+[+~]'), + e.querySelectorAll(':checked').length || d.push(':checked'), + (t = T.createElement('input')).setAttribute('type', 'hidden'), + e.appendChild(t).setAttribute('name', 'D'), + (r.appendChild(e).disabled = !0), + 2 !== e.querySelectorAll(':disabled').length && d.push(':enabled', ':disabled'), + (t = T.createElement('input')).setAttribute('name', ''), + e.appendChild(t), + e.querySelectorAll("[name='']").length || + d.push('\\[' + ge + '*name' + ge + '*=' + ge + '*(?:\'\'|"")')) + }), + le.cssHas || d.push(':has'), + (d = d.length && new RegExp(d.join('|'))), + (l = function (e, t) { + if (e === t) return ((a = !0), 0) + var n = !e.compareDocumentPosition - !t.compareDocumentPosition + return ( + n || + (1 & + (n = + (e.ownerDocument || e) == (t.ownerDocument || t) + ? e.compareDocumentPosition(t) + : 1) || + (!le.sortDetached && t.compareDocumentPosition(e) === n) + ? e === T || (e.ownerDocument == ye && I.contains(ye, e)) + ? -1 + : t === T || (t.ownerDocument == ye && I.contains(ye, t)) + ? 1 + : o + ? se.call(o, e) - se.call(o, t) + : 0 + : 4 & n + ? -1 + : 1) + ) + })), + T + ) + } + for (e in ((I.matches = function (e, t) { + return I(e, null, null, t) + }), + (I.matchesSelector = function (e, t) { + if ((V(e), C && !h[t + ' '] && (!d || !d.test(t)))) + try { + var n = i.call(e, t) + if (n || le.disconnectedMatch || (e.document && 11 !== e.document.nodeType)) return n + } catch (e) { + h(t, !0) + } + return 0 < I(t, T, null, [e]).length + }), + (I.contains = function (e, t) { + return ((e.ownerDocument || e) != T && V(e), ce.contains(e, t)) + }), + (I.attr = function (e, t) { + ;(e.ownerDocument || e) != T && V(e) + var n = b.attrHandle[t.toLowerCase()], + r = n && ue.call(b.attrHandle, t.toLowerCase()) ? n(e, t, !C) : void 0 + return void 0 !== r ? r : e.getAttribute(t) + }), + (I.error = function (e) { + throw new Error('Syntax error, unrecognized expression: ' + e) + }), + (ce.uniqueSort = function (e) { + var t, + n = [], + r = 0, + i = 0 + if (((a = !le.sortStable), (o = !le.sortStable && ae.call(e, 0)), de.call(e, l), a)) { + while ((t = e[i++])) t === e[i] && (r = n.push(i)) + while (r--) he.call(e, n[r], 1) + } + return ((o = null), e) + }), + (ce.fn.uniqueSort = function () { + return this.pushStack(ce.uniqueSort(ae.apply(this))) + }), + ((b = ce.expr = + { + cacheLength: 50, + createPseudo: F, + match: D, + attrHandle: {}, + find: {}, + relative: { + '>': { dir: 'parentNode', first: !0 }, + ' ': { dir: 'parentNode' }, + '+': { dir: 'previousSibling', first: !0 }, + '~': { dir: 'previousSibling' }, + }, + preFilter: { + ATTR: function (e) { + return ( + (e[1] = e[1].replace(O, P)), + (e[3] = (e[3] || e[4] || e[5] || '').replace(O, P)), + '~=' === e[2] && (e[3] = ' ' + e[3] + ' '), + e.slice(0, 4) + ) + }, + CHILD: function (e) { + return ( + (e[1] = e[1].toLowerCase()), + 'nth' === e[1].slice(0, 3) + ? (e[3] || I.error(e[0]), + (e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ('even' === e[3] || 'odd' === e[3]))), + (e[5] = +(e[7] + e[8] || 'odd' === e[3]))) + : e[3] && I.error(e[0]), + e + ) + }, + PSEUDO: function (e) { + var t, + n = !e[6] && e[2] + return D.CHILD.test(e[0]) + ? null + : (e[3] + ? (e[2] = e[4] || e[5] || '') + : n && + j.test(n) && + (t = Y(n, !0)) && + (t = n.indexOf(')', n.length - t) - n.length) && + ((e[0] = e[0].slice(0, t)), (e[2] = n.slice(0, t))), + e.slice(0, 3)) + }, + }, + filter: { + TAG: function (e) { + var t = e.replace(O, P).toLowerCase() + return '*' === e + ? function () { + return !0 + } + : function (e) { + return fe(e, t) + } + }, + CLASS: function (e) { + var t = s[e + ' '] + return ( + t || + ((t = new RegExp('(^|' + ge + ')' + e + '(' + ge + '|$)')) && + s(e, function (e) { + return t.test( + ('string' == typeof e.className && e.className) || + ('undefined' != typeof e.getAttribute && e.getAttribute('class')) || + '' + ) + })) + ) + }, + ATTR: function (n, r, i) { + return function (e) { + var t = I.attr(e, n) + return null == t + ? '!=' === r + : !r || + ((t += ''), + '=' === r + ? t === i + : '!=' === r + ? t !== i + : '^=' === r + ? i && 0 === t.indexOf(i) + : '*=' === r + ? i && -1 < t.indexOf(i) + : '$=' === r + ? i && t.slice(-i.length) === i + : '~=' === r + ? -1 < (' ' + t.replace(v, ' ') + ' ').indexOf(i) + : '|=' === r && (t === i || t.slice(0, i.length + 1) === i + '-')) + } + }, + CHILD: function (d, e, t, h, g) { + var v = 'nth' !== d.slice(0, 3), + y = 'last' !== d.slice(-4), + m = 'of-type' === e + return 1 === h && 0 === g + ? function (e) { + return !!e.parentNode + } + : function (e, t, n) { + var r, + i, + o, + a, + s, + u = v !== y ? 'nextSibling' : 'previousSibling', + l = e.parentNode, + c = m && e.nodeName.toLowerCase(), + f = !n && !m, + p = !1 + if (l) { + if (v) { + while (u) { + o = e + while ((o = o[u])) if (m ? fe(o, c) : 1 === o.nodeType) return !1 + s = u = 'only' === d && !s && 'nextSibling' + } + return !0 + } + if (((s = [y ? l.firstChild : l.lastChild]), y && f)) { + ;((p = + (a = (r = (i = l[S] || (l[S] = {}))[d] || [])[0] === E && r[1]) && r[2]), + (o = a && l.childNodes[a])) + while ((o = (++a && o && o[u]) || (p = a = 0) || s.pop())) + if (1 === o.nodeType && ++p && o === e) { + i[d] = [E, a, p] + break + } + } else if ( + (f && (p = a = (r = (i = e[S] || (e[S] = {}))[d] || [])[0] === E && r[1]), + !1 === p) + ) + while ((o = (++a && o && o[u]) || (p = a = 0) || s.pop())) + if ( + (m ? fe(o, c) : 1 === o.nodeType) && + ++p && + (f && ((i = o[S] || (o[S] = {}))[d] = [E, p]), o === e) + ) + break + return (p -= g) === h || (p % h == 0 && 0 <= p / h) + } + } + }, + PSEUDO: function (e, o) { + var t, + a = + b.pseudos[e] || b.setFilters[e.toLowerCase()] || I.error('unsupported pseudo: ' + e) + return a[S] + ? a(o) + : 1 < a.length + ? ((t = [e, e, '', o]), + b.setFilters.hasOwnProperty(e.toLowerCase()) + ? F(function (e, t) { + var n, + r = a(e, o), + i = r.length + while (i--) e[(n = se.call(e, r[i]))] = !(t[n] = r[i]) + }) + : function (e) { + return a(e, 0, t) + }) + : a + }, + }, + pseudos: { + not: F(function (e) { + var r = [], + i = [], + s = ne(e.replace(ve, '$1')) + return s[S] + ? F(function (e, t, n, r) { + var i, + o = s(e, null, r, []), + a = e.length + while (a--) (i = o[a]) && (e[a] = !(t[a] = i)) + }) + : function (e, t, n) { + return ((r[0] = e), s(r, null, n, i), (r[0] = null), !i.pop()) + } + }), + has: F(function (t) { + return function (e) { + return 0 < I(t, e).length + } + }), + contains: F(function (t) { + return ( + (t = t.replace(O, P)), + function (e) { + return -1 < (e.textContent || ce.text(e)).indexOf(t) + } + ) + }), + lang: F(function (n) { + return ( + A.test(n || '') || I.error('unsupported lang: ' + n), + (n = n.replace(O, P).toLowerCase()), + function (e) { + var t + do { + if ((t = C ? e.lang : e.getAttribute('xml:lang') || e.getAttribute('lang'))) + return (t = t.toLowerCase()) === n || 0 === t.indexOf(n + '-') + } while ((e = e.parentNode) && 1 === e.nodeType) + return !1 + } + ) + }), + target: function (e) { + var t = ie.location && ie.location.hash + return t && t.slice(1) === e.id + }, + root: function (e) { + return e === r + }, + focus: function (e) { + return ( + e === + (function () { + try { + return T.activeElement + } catch (e) {} + })() && + T.hasFocus() && + !!(e.type || e.href || ~e.tabIndex) + ) + }, + enabled: z(!1), + disabled: z(!0), + checked: function (e) { + return (fe(e, 'input') && !!e.checked) || (fe(e, 'option') && !!e.selected) + }, + selected: function (e) { + return (e.parentNode && e.parentNode.selectedIndex, !0 === e.selected) + }, + empty: function (e) { + for (e = e.firstChild; e; e = e.nextSibling) if (e.nodeType < 6) return !1 + return !0 + }, + parent: function (e) { + return !b.pseudos.empty(e) + }, + header: function (e) { + return q.test(e.nodeName) + }, + input: function (e) { + return N.test(e.nodeName) + }, + button: function (e) { + return (fe(e, 'input') && 'button' === e.type) || fe(e, 'button') + }, + text: function (e) { + var t + return ( + fe(e, 'input') && + 'text' === e.type && + (null == (t = e.getAttribute('type')) || 'text' === t.toLowerCase()) + ) + }, + first: X(function () { + return [0] + }), + last: X(function (e, t) { + return [t - 1] + }), + eq: X(function (e, t, n) { + return [n < 0 ? n + t : n] + }), + even: X(function (e, t) { + for (var n = 0; n < t; n += 2) e.push(n) + return e + }), + odd: X(function (e, t) { + for (var n = 1; n < t; n += 2) e.push(n) + return e + }), + lt: X(function (e, t, n) { + var r + for (r = n < 0 ? n + t : t < n ? t : n; 0 <= --r; ) e.push(r) + return e + }), + gt: X(function (e, t, n) { + for (var r = n < 0 ? n + t : n; ++r < t; ) e.push(r) + return e + }), + }, + }).pseudos.nth = b.pseudos.eq), + { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 })) + b.pseudos[e] = B(e) + for (e in { submit: !0, reset: !0 }) b.pseudos[e] = _(e) + function G() {} + function Y(e, t) { + var n, + r, + i, + o, + a, + s, + u, + l = c[e + ' '] + if (l) return t ? 0 : l.slice(0) + ;((a = e), (s = []), (u = b.preFilter)) + while (a) { + for (o in ((n && !(r = y.exec(a))) || + (r && (a = a.slice(r[0].length) || a), s.push((i = []))), + (n = !1), + (r = m.exec(a)) && + ((n = r.shift()), + i.push({ value: n, type: r[0].replace(ve, ' ') }), + (a = a.slice(n.length))), + b.filter)) + !(r = D[o].exec(a)) || + (u[o] && !(r = u[o](r))) || + ((n = r.shift()), i.push({ value: n, type: o, matches: r }), (a = a.slice(n.length))) + if (!n) break + } + return t ? a.length : a ? I.error(e) : c(e, s).slice(0) + } + function Q(e) { + for (var t = 0, n = e.length, r = ''; t < n; t++) r += e[t].value + return r + } + function J(a, e, t) { + var s = e.dir, + u = e.next, + l = u || s, + c = t && 'parentNode' === l, + f = n++ + return e.first + ? function (e, t, n) { + while ((e = e[s])) if (1 === e.nodeType || c) return a(e, t, n) + return !1 + } + : function (e, t, n) { + var r, + i, + o = [E, f] + if (n) { + while ((e = e[s])) if ((1 === e.nodeType || c) && a(e, t, n)) return !0 + } else + while ((e = e[s])) + if (1 === e.nodeType || c) + if (((i = e[S] || (e[S] = {})), u && fe(e, u))) e = e[s] || e + else { + if ((r = i[l]) && r[0] === E && r[1] === f) return (o[2] = r[2]) + if (((i[l] = o)[2] = a(e, t, n))) return !0 + } + return !1 + } + } + function K(i) { + return 1 < i.length + ? function (e, t, n) { + var r = i.length + while (r--) if (!i[r](e, t, n)) return !1 + return !0 + } + : i[0] + } + function Z(e, t, n, r, i) { + for (var o, a = [], s = 0, u = e.length, l = null != t; s < u; s++) + (o = e[s]) && ((n && !n(o, r, i)) || (a.push(o), l && t.push(s))) + return a + } + function ee(d, h, g, v, y, e) { + return ( + v && !v[S] && (v = ee(v)), + y && !y[S] && (y = ee(y, e)), + F(function (e, t, n, r) { + var i, + o, + a, + s, + u = [], + l = [], + c = t.length, + f = + e || + (function (e, t, n) { + for (var r = 0, i = t.length; r < i; r++) I(e, t[r], n) + return n + })(h || '*', n.nodeType ? [n] : n, []), + p = !d || (!e && h) ? f : Z(f, u, d, n, r) + if ((g ? g(p, (s = y || (e ? d : c || v) ? [] : t), n, r) : (s = p), v)) { + ;((i = Z(s, l)), v(i, [], n, r), (o = i.length)) + while (o--) (a = i[o]) && (s[l[o]] = !(p[l[o]] = a)) + } + if (e) { + if (y || d) { + if (y) { + ;((i = []), (o = s.length)) + while (o--) (a = s[o]) && i.push((p[o] = a)) + y(null, (s = []), i, r) + } + o = s.length + while (o--) (a = s[o]) && -1 < (i = y ? se.call(e, a) : u[o]) && (e[i] = !(t[i] = a)) + } + } else + ((s = Z(s === t ? s.splice(c, s.length) : s)), y ? y(null, t, s, r) : k.apply(t, s)) + }) + ) + } + function te(e) { + for ( + var i, + t, + n, + r = e.length, + o = b.relative[e[0].type], + a = o || b.relative[' '], + s = o ? 1 : 0, + u = J( + function (e) { + return e === i + }, + a, + !0 + ), + l = J( + function (e) { + return -1 < se.call(i, e) + }, + a, + !0 + ), + c = [ + function (e, t, n) { + var r = (!o && (n || t != w)) || ((i = t).nodeType ? u(e, t, n) : l(e, t, n)) + return ((i = null), r) + }, + ]; + s < r; + s++ + ) + if ((t = b.relative[e[s].type])) c = [J(K(c), t)] + else { + if ((t = b.filter[e[s].type].apply(null, e[s].matches))[S]) { + for (n = ++s; n < r; n++) if (b.relative[e[n].type]) break + return ee( + 1 < s && K(c), + 1 < s && + Q(e.slice(0, s - 1).concat({ value: ' ' === e[s - 2].type ? '*' : '' })).replace( + ve, + '$1' + ), + t, + s < n && te(e.slice(s, n)), + n < r && te((e = e.slice(n))), + n < r && Q(e) + ) + } + c.push(t) + } + return K(c) + } + function ne(e, t) { + var n, + v, + y, + m, + x, + r, + i = [], + o = [], + a = u[e + ' '] + if (!a) { + ;(t || (t = Y(e)), (n = t.length)) + while (n--) (a = te(t[n]))[S] ? i.push(a) : o.push(a) + ;(a = u( + e, + ((v = o), + (m = 0 < (y = i).length), + (x = 0 < v.length), + (r = function (e, t, n, r, i) { + var o, + a, + s, + u = 0, + l = '0', + c = e && [], + f = [], + p = w, + d = e || (x && b.find.TAG('*', i)), + h = (E += null == p ? 1 : Math.random() || 0.1), + g = d.length + for (i && (w = t == T || t || i); l !== g && null != (o = d[l]); l++) { + if (x && o) { + ;((a = 0), t || o.ownerDocument == T || (V(o), (n = !C))) + while ((s = v[a++])) + if (s(o, t || T, n)) { + k.call(r, o) + break + } + i && (E = h) + } + m && ((o = !s && o) && u--, e && c.push(o)) + } + if (((u += l), m && l !== u)) { + a = 0 + while ((s = y[a++])) s(c, f, t, n) + if (e) { + if (0 < u) while (l--) c[l] || f[l] || (f[l] = pe.call(r)) + f = Z(f) + } + ;(k.apply(r, f), i && !e && 0 < f.length && 1 < u + y.length && ce.uniqueSort(r)) + } + return (i && ((E = h), (w = p)), c) + }), + m ? F(r) : r) + )).selector = e + } + return a + } + function re(e, t, n, r) { + var i, + o, + a, + s, + u, + l = 'function' == typeof e && e, + c = !r && Y((e = l.selector || e)) + if (((n = n || []), 1 === c.length)) { + if ( + 2 < (o = c[0] = c[0].slice(0)).length && + 'ID' === (a = o[0]).type && + 9 === t.nodeType && + C && + b.relative[o[1].type] + ) { + if (!(t = (b.find.ID(a.matches[0].replace(O, P), t) || [])[0])) return n + ;(l && (t = t.parentNode), (e = e.slice(o.shift().value.length))) + } + i = D.needsContext.test(e) ? 0 : o.length + while (i--) { + if (((a = o[i]), b.relative[(s = a.type)])) break + if ( + (u = b.find[s]) && + (r = u(a.matches[0].replace(O, P), (H.test(o[0].type) && U(t.parentNode)) || t)) + ) { + if ((o.splice(i, 1), !(e = r.length && Q(o)))) return (k.apply(n, r), n) + break + } + } + } + return ((l || ne(e, c))(r, t, !C, n, !t || (H.test(e) && U(t.parentNode)) || t), n) + } + ;((G.prototype = b.filters = b.pseudos), + (b.setFilters = new G()), + (le.sortStable = S.split('').sort(l).join('') === S), + V(), + (le.sortDetached = $(function (e) { + return 1 & e.compareDocumentPosition(T.createElement('fieldset')) + })), + (ce.find = I), + (ce.expr[':'] = ce.expr.pseudos), + (ce.unique = ce.uniqueSort), + (I.compile = ne), + (I.select = re), + (I.setDocument = V), + (I.tokenize = Y), + (I.escape = ce.escapeSelector), + (I.getText = ce.text), + (I.isXML = ce.isXMLDoc), + (I.selectors = ce.expr), + (I.support = ce.support), + (I.uniqueSort = ce.uniqueSort)) + })() + var d = function (e, t, n) { + var r = [], + i = void 0 !== n + while ((e = e[t]) && 9 !== e.nodeType) + if (1 === e.nodeType) { + if (i && ce(e).is(n)) break + r.push(e) + } + return r + }, + h = function (e, t) { + for (var n = []; e; e = e.nextSibling) 1 === e.nodeType && e !== t && n.push(e) + return n + }, + b = ce.expr.match.needsContext, + w = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i + function T(e, n, r) { + return v(n) + ? ce.grep(e, function (e, t) { + return !!n.call(e, t, e) !== r + }) + : n.nodeType + ? ce.grep(e, function (e) { + return (e === n) !== r + }) + : 'string' != typeof n + ? ce.grep(e, function (e) { + return -1 < se.call(n, e) !== r + }) + : ce.filter(n, e, r) + } + ;((ce.filter = function (e, t, n) { + var r = t[0] + return ( + n && (e = ':not(' + e + ')'), + 1 === t.length && 1 === r.nodeType + ? ce.find.matchesSelector(r, e) + ? [r] + : [] + : ce.find.matches( + e, + ce.grep(t, function (e) { + return 1 === e.nodeType + }) + ) + ) + }), + ce.fn.extend({ + find: function (e) { + var t, + n, + r = this.length, + i = this + if ('string' != typeof e) + return this.pushStack( + ce(e).filter(function () { + for (t = 0; t < r; t++) if (ce.contains(i[t], this)) return !0 + }) + ) + for (n = this.pushStack([]), t = 0; t < r; t++) ce.find(e, i[t], n) + return 1 < r ? ce.uniqueSort(n) : n + }, + filter: function (e) { + return this.pushStack(T(this, e || [], !1)) + }, + not: function (e) { + return this.pushStack(T(this, e || [], !0)) + }, + is: function (e) { + return !!T(this, 'string' == typeof e && b.test(e) ? ce(e) : e || [], !1).length + }, + })) + var k, + S = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/ + ;(((ce.fn.init = function (e, t, n) { + var r, i + if (!e) return this + if (((n = n || k), 'string' == typeof e)) { + if ( + !(r = + '<' === e[0] && '>' === e[e.length - 1] && 3 <= e.length ? [null, e, null] : S.exec(e)) || + (!r[1] && t) + ) + return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e) + if (r[1]) { + if ( + ((t = t instanceof ce ? t[0] : t), + ce.merge(this, ce.parseHTML(r[1], t && t.nodeType ? t.ownerDocument || t : C, !0)), + w.test(r[1]) && ce.isPlainObject(t)) + ) + for (r in t) v(this[r]) ? this[r](t[r]) : this.attr(r, t[r]) + return this + } + return ((i = C.getElementById(r[2])) && ((this[0] = i), (this.length = 1)), this) + } + return e.nodeType + ? ((this[0] = e), (this.length = 1), this) + : v(e) + ? void 0 !== n.ready + ? n.ready(e) + : e(ce) + : ce.makeArray(e, this) + }).prototype = ce.fn), + (k = ce(C))) + var E = /^(?:parents|prev(?:Until|All))/, + j = { children: !0, contents: !0, next: !0, prev: !0 } + function A(e, t) { + while ((e = e[t]) && 1 !== e.nodeType); + return e + } + ;(ce.fn.extend({ + has: function (e) { + var t = ce(e, this), + n = t.length + return this.filter(function () { + for (var e = 0; e < n; e++) if (ce.contains(this, t[e])) return !0 + }) + }, + closest: function (e, t) { + var n, + r = 0, + i = this.length, + o = [], + a = 'string' != typeof e && ce(e) + if (!b.test(e)) + for (; r < i; r++) + for (n = this[r]; n && n !== t; n = n.parentNode) + if ( + n.nodeType < 11 && + (a ? -1 < a.index(n) : 1 === n.nodeType && ce.find.matchesSelector(n, e)) + ) { + o.push(n) + break + } + return this.pushStack(1 < o.length ? ce.uniqueSort(o) : o) + }, + index: function (e) { + return e + ? 'string' == typeof e + ? se.call(ce(e), this[0]) + : se.call(this, e.jquery ? e[0] : e) + : this[0] && this[0].parentNode + ? this.first().prevAll().length + : -1 + }, + add: function (e, t) { + return this.pushStack(ce.uniqueSort(ce.merge(this.get(), ce(e, t)))) + }, + addBack: function (e) { + return this.add(null == e ? this.prevObject : this.prevObject.filter(e)) + }, + }), + ce.each( + { + parent: function (e) { + var t = e.parentNode + return t && 11 !== t.nodeType ? t : null + }, + parents: function (e) { + return d(e, 'parentNode') + }, + parentsUntil: function (e, t, n) { + return d(e, 'parentNode', n) + }, + next: function (e) { + return A(e, 'nextSibling') + }, + prev: function (e) { + return A(e, 'previousSibling') + }, + nextAll: function (e) { + return d(e, 'nextSibling') + }, + prevAll: function (e) { + return d(e, 'previousSibling') + }, + nextUntil: function (e, t, n) { + return d(e, 'nextSibling', n) + }, + prevUntil: function (e, t, n) { + return d(e, 'previousSibling', n) + }, + siblings: function (e) { + return h((e.parentNode || {}).firstChild, e) + }, + children: function (e) { + return h(e.firstChild) + }, + contents: function (e) { + return null != e.contentDocument && r(e.contentDocument) + ? e.contentDocument + : (fe(e, 'template') && (e = e.content || e), ce.merge([], e.childNodes)) + }, + }, + function (r, i) { + ce.fn[r] = function (e, t) { + var n = ce.map(this, i, e) + return ( + 'Until' !== r.slice(-5) && (t = e), + t && 'string' == typeof t && (n = ce.filter(t, n)), + 1 < this.length && (j[r] || ce.uniqueSort(n), E.test(r) && n.reverse()), + this.pushStack(n) + ) + } + } + )) + var D = /[^\x20\t\r\n\f]+/g + function N(e) { + return e + } + function q(e) { + throw e + } + function L(e, t, n, r) { + var i + try { + e && v((i = e.promise)) + ? i.call(e).done(t).fail(n) + : e && v((i = e.then)) + ? i.call(e, t, n) + : t.apply(void 0, [e].slice(r)) + } catch (e) { + n.apply(void 0, [e]) + } + } + ;((ce.Callbacks = function (r) { + var e, n + r = + 'string' == typeof r + ? ((e = r), + (n = {}), + ce.each(e.match(D) || [], function (e, t) { + n[t] = !0 + }), + n) + : ce.extend({}, r) + var i, + t, + o, + a, + s = [], + u = [], + l = -1, + c = function () { + for (a = a || r.once, o = i = !0; u.length; l = -1) { + t = u.shift() + while (++l < s.length) + !1 === s[l].apply(t[0], t[1]) && r.stopOnFalse && ((l = s.length), (t = !1)) + } + ;(r.memory || (t = !1), (i = !1), a && (s = t ? [] : '')) + }, + f = { + add: function () { + return ( + s && + (t && !i && ((l = s.length - 1), u.push(t)), + (function n(e) { + ce.each(e, function (e, t) { + v(t) + ? (r.unique && f.has(t)) || s.push(t) + : t && t.length && 'string' !== x(t) && n(t) + }) + })(arguments), + t && !i && c()), + this + ) + }, + remove: function () { + return ( + ce.each(arguments, function (e, t) { + var n + while (-1 < (n = ce.inArray(t, s, n))) (s.splice(n, 1), n <= l && l--) + }), + this + ) + }, + has: function (e) { + return e ? -1 < ce.inArray(e, s) : 0 < s.length + }, + empty: function () { + return (s && (s = []), this) + }, + disable: function () { + return ((a = u = []), (s = t = ''), this) + }, + disabled: function () { + return !s + }, + lock: function () { + return ((a = u = []), t || i || (s = t = ''), this) + }, + locked: function () { + return !!a + }, + fireWith: function (e, t) { + return (a || ((t = [e, (t = t || []).slice ? t.slice() : t]), u.push(t), i || c()), this) + }, + fire: function () { + return (f.fireWith(this, arguments), this) + }, + fired: function () { + return !!o + }, + } + return f + }), + ce.extend({ + Deferred: function (e) { + var o = [ + ['notify', 'progress', ce.Callbacks('memory'), ce.Callbacks('memory'), 2], + [ + 'resolve', + 'done', + ce.Callbacks('once memory'), + ce.Callbacks('once memory'), + 0, + 'resolved', + ], + [ + 'reject', + 'fail', + ce.Callbacks('once memory'), + ce.Callbacks('once memory'), + 1, + 'rejected', + ], + ], + i = 'pending', + a = { + state: function () { + return i + }, + always: function () { + return (s.done(arguments).fail(arguments), this) + }, + catch: function (e) { + return a.then(null, e) + }, + pipe: function () { + var i = arguments + return ce + .Deferred(function (r) { + ;(ce.each(o, function (e, t) { + var n = v(i[t[4]]) && i[t[4]] + s[t[1]](function () { + var e = n && n.apply(this, arguments) + e && v(e.promise) + ? e.promise().progress(r.notify).done(r.resolve).fail(r.reject) + : r[t[0] + 'With'](this, n ? [e] : arguments) + }) + }), + (i = null)) + }) + .promise() + }, + then: function (t, n, r) { + var u = 0 + function l(i, o, a, s) { + return function () { + var n = this, + r = arguments, + e = function () { + var e, t + if (!(i < u)) { + if ((e = a.apply(n, r)) === o.promise()) + throw new TypeError('Thenable self-resolution') + ;((t = e && ('object' == typeof e || 'function' == typeof e) && e.then), + v(t) + ? s + ? t.call(e, l(u, o, N, s), l(u, o, q, s)) + : (u++, + t.call(e, l(u, o, N, s), l(u, o, q, s), l(u, o, N, o.notifyWith))) + : (a !== N && ((n = void 0), (r = [e])), (s || o.resolveWith)(n, r))) + } + }, + t = s + ? e + : function () { + try { + e() + } catch (e) { + ;(ce.Deferred.exceptionHook && ce.Deferred.exceptionHook(e, t.error), + u <= i + 1 && + (a !== q && ((n = void 0), (r = [e])), o.rejectWith(n, r))) + } + } + i + ? t() + : (ce.Deferred.getErrorHook + ? (t.error = ce.Deferred.getErrorHook()) + : ce.Deferred.getStackHook && (t.error = ce.Deferred.getStackHook()), + ie.setTimeout(t)) + } + } + return ce + .Deferred(function (e) { + ;(o[0][3].add(l(0, e, v(r) ? r : N, e.notifyWith)), + o[1][3].add(l(0, e, v(t) ? t : N)), + o[2][3].add(l(0, e, v(n) ? n : q))) + }) + .promise() + }, + promise: function (e) { + return null != e ? ce.extend(e, a) : a + }, + }, + s = {} + return ( + ce.each(o, function (e, t) { + var n = t[2], + r = t[5] + ;((a[t[1]] = n.add), + r && + n.add( + function () { + i = r + }, + o[3 - e][2].disable, + o[3 - e][3].disable, + o[0][2].lock, + o[0][3].lock + ), + n.add(t[3].fire), + (s[t[0]] = function () { + return (s[t[0] + 'With'](this === s ? void 0 : this, arguments), this) + }), + (s[t[0] + 'With'] = n.fireWith)) + }), + a.promise(s), + e && e.call(s, s), + s + ) + }, + when: function (e) { + var n = arguments.length, + t = n, + r = Array(t), + i = ae.call(arguments), + o = ce.Deferred(), + a = function (t) { + return function (e) { + ;((r[t] = this), + (i[t] = 1 < arguments.length ? ae.call(arguments) : e), + --n || o.resolveWith(r, i)) + } + } + if ( + n <= 1 && + (L(e, o.done(a(t)).resolve, o.reject, !n), + 'pending' === o.state() || v(i[t] && i[t].then)) + ) + return o.then() + while (t--) L(i[t], a(t), o.reject) + return o.promise() + }, + })) + var H = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/ + ;((ce.Deferred.exceptionHook = function (e, t) { + ie.console && + ie.console.warn && + e && + H.test(e.name) && + ie.console.warn('jQuery.Deferred exception: ' + e.message, e.stack, t) + }), + (ce.readyException = function (e) { + ie.setTimeout(function () { + throw e + }) + })) + var O = ce.Deferred() + function P() { + ;(C.removeEventListener('DOMContentLoaded', P), ie.removeEventListener('load', P), ce.ready()) + } + ;((ce.fn.ready = function (e) { + return ( + O.then(e)['catch'](function (e) { + ce.readyException(e) + }), + this + ) + }), + ce.extend({ + isReady: !1, + readyWait: 1, + ready: function (e) { + ;(!0 === e ? --ce.readyWait : ce.isReady) || + ((ce.isReady = !0) !== e && 0 < --ce.readyWait) || + O.resolveWith(C, [ce]) + }, + }), + (ce.ready.then = O.then), + 'complete' === C.readyState || ('loading' !== C.readyState && !C.documentElement.doScroll) + ? ie.setTimeout(ce.ready) + : (C.addEventListener('DOMContentLoaded', P), ie.addEventListener('load', P))) + var M = function (e, t, n, r, i, o, a) { + var s = 0, + u = e.length, + l = null == n + if ('object' === x(n)) for (s in ((i = !0), n)) M(e, t, s, n[s], !0, o, a) + else if ( + void 0 !== r && + ((i = !0), + v(r) || (a = !0), + l && + (a + ? (t.call(e, r), (t = null)) + : ((l = t), + (t = function (e, t, n) { + return l.call(ce(e), n) + }))), + t) + ) + for (; s < u; s++) t(e[s], n, a ? r : r.call(e[s], s, t(e[s], n))) + return i ? e : l ? t.call(e) : u ? t(e[0], n) : o + }, + R = /^-ms-/, + I = /-([a-z])/g + function W(e, t) { + return t.toUpperCase() + } + function F(e) { + return e.replace(R, 'ms-').replace(I, W) + } + var $ = function (e) { + return 1 === e.nodeType || 9 === e.nodeType || !+e.nodeType + } + function B() { + this.expando = ce.expando + B.uid++ + } + ;((B.uid = 1), + (B.prototype = { + cache: function (e) { + var t = e[this.expando] + return ( + t || + ((t = {}), + $(e) && + (e.nodeType + ? (e[this.expando] = t) + : Object.defineProperty(e, this.expando, { value: t, configurable: !0 }))), + t + ) + }, + set: function (e, t, n) { + var r, + i = this.cache(e) + if ('string' == typeof t) i[F(t)] = n + else for (r in t) i[F(r)] = t[r] + return i + }, + get: function (e, t) { + return void 0 === t ? this.cache(e) : e[this.expando] && e[this.expando][F(t)] + }, + access: function (e, t, n) { + return void 0 === t || (t && 'string' == typeof t && void 0 === n) + ? this.get(e, t) + : (this.set(e, t, n), void 0 !== n ? n : t) + }, + remove: function (e, t) { + var n, + r = e[this.expando] + if (void 0 !== r) { + if (void 0 !== t) { + n = (t = Array.isArray(t) ? t.map(F) : (t = F(t)) in r ? [t] : t.match(D) || []).length + while (n--) delete r[t[n]] + } + ;(void 0 === t || ce.isEmptyObject(r)) && + (e.nodeType ? (e[this.expando] = void 0) : delete e[this.expando]) + } + }, + hasData: function (e) { + var t = e[this.expando] + return void 0 !== t && !ce.isEmptyObject(t) + }, + })) + var _ = new B(), + z = new B(), + X = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + U = /[A-Z]/g + function V(e, t, n) { + var r, i + if (void 0 === n && 1 === e.nodeType) + if ( + ((r = 'data-' + t.replace(U, '-$&').toLowerCase()), + 'string' == typeof (n = e.getAttribute(r))) + ) { + try { + n = + 'true' === (i = n) || + ('false' !== i && + ('null' === i ? null : i === +i + '' ? +i : X.test(i) ? JSON.parse(i) : i)) + } catch (e) {} + z.set(e, t, n) + } else n = void 0 + return n + } + ;(ce.extend({ + hasData: function (e) { + return z.hasData(e) || _.hasData(e) + }, + data: function (e, t, n) { + return z.access(e, t, n) + }, + removeData: function (e, t) { + z.remove(e, t) + }, + _data: function (e, t, n) { + return _.access(e, t, n) + }, + _removeData: function (e, t) { + _.remove(e, t) + }, + }), + ce.fn.extend({ + data: function (n, e) { + var t, + r, + i, + o = this[0], + a = o && o.attributes + if (void 0 === n) { + if (this.length && ((i = z.get(o)), 1 === o.nodeType && !_.get(o, 'hasDataAttrs'))) { + t = a.length + while (t--) + a[t] && 0 === (r = a[t].name).indexOf('data-') && ((r = F(r.slice(5))), V(o, r, i[r])) + _.set(o, 'hasDataAttrs', !0) + } + return i + } + return 'object' == typeof n + ? this.each(function () { + z.set(this, n) + }) + : M( + this, + function (e) { + var t + if (o && void 0 === e) + return void 0 !== (t = z.get(o, n)) ? t : void 0 !== (t = V(o, n)) ? t : void 0 + this.each(function () { + z.set(this, n, e) + }) + }, + null, + e, + 1 < arguments.length, + null, + !0 + ) + }, + removeData: function (e) { + return this.each(function () { + z.remove(this, e) + }) + }, + }), + ce.extend({ + queue: function (e, t, n) { + var r + if (e) + return ( + (t = (t || 'fx') + 'queue'), + (r = _.get(e, t)), + n && (!r || Array.isArray(n) ? (r = _.access(e, t, ce.makeArray(n))) : r.push(n)), + r || [] + ) + }, + dequeue: function (e, t) { + t = t || 'fx' + var n = ce.queue(e, t), + r = n.length, + i = n.shift(), + o = ce._queueHooks(e, t) + ;('inprogress' === i && ((i = n.shift()), r--), + i && + ('fx' === t && n.unshift('inprogress'), + delete o.stop, + i.call( + e, + function () { + ce.dequeue(e, t) + }, + o + )), + !r && o && o.empty.fire()) + }, + _queueHooks: function (e, t) { + var n = t + 'queueHooks' + return ( + _.get(e, n) || + _.access(e, n, { + empty: ce.Callbacks('once memory').add(function () { + _.remove(e, [t + 'queue', n]) + }), + }) + ) + }, + }), + ce.fn.extend({ + queue: function (t, n) { + var e = 2 + return ( + 'string' != typeof t && ((n = t), (t = 'fx'), e--), + arguments.length < e + ? ce.queue(this[0], t) + : void 0 === n + ? this + : this.each(function () { + var e = ce.queue(this, t, n) + ;(ce._queueHooks(this, t), + 'fx' === t && 'inprogress' !== e[0] && ce.dequeue(this, t)) + }) + ) + }, + dequeue: function (e) { + return this.each(function () { + ce.dequeue(this, e) + }) + }, + clearQueue: function (e) { + return this.queue(e || 'fx', []) + }, + promise: function (e, t) { + var n, + r = 1, + i = ce.Deferred(), + o = this, + a = this.length, + s = function () { + --r || i.resolveWith(o, [o]) + } + ;('string' != typeof e && ((t = e), (e = void 0)), (e = e || 'fx')) + while (a--) (n = _.get(o[a], e + 'queueHooks')) && n.empty && (r++, n.empty.add(s)) + return (s(), i.promise(t)) + }, + })) + var G = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, + Y = new RegExp('^(?:([+-])=|)(' + G + ')([a-z%]*)$', 'i'), + Q = ['Top', 'Right', 'Bottom', 'Left'], + J = C.documentElement, + K = function (e) { + return ce.contains(e.ownerDocument, e) + }, + Z = { composed: !0 } + J.getRootNode && + (K = function (e) { + return ce.contains(e.ownerDocument, e) || e.getRootNode(Z) === e.ownerDocument + }) + var ee = function (e, t) { + return ( + 'none' === (e = t || e).style.display || + ('' === e.style.display && K(e) && 'none' === ce.css(e, 'display')) + ) + } + function te(e, t, n, r) { + var i, + o, + a = 20, + s = r + ? function () { + return r.cur() + } + : function () { + return ce.css(e, t, '') + }, + u = s(), + l = (n && n[3]) || (ce.cssNumber[t] ? '' : 'px'), + c = e.nodeType && (ce.cssNumber[t] || ('px' !== l && +u)) && Y.exec(ce.css(e, t)) + if (c && c[3] !== l) { + ;((u /= 2), (l = l || c[3]), (c = +u || 1)) + while (a--) + (ce.style(e, t, c + l), (1 - o) * (1 - (o = s() / u || 0.5)) <= 0 && (a = 0), (c /= o)) + ;((c *= 2), ce.style(e, t, c + l), (n = n || [])) + } + return ( + n && + ((c = +c || +u || 0), + (i = n[1] ? c + (n[1] + 1) * n[2] : +n[2]), + r && ((r.unit = l), (r.start = c), (r.end = i))), + i + ) + } + var ne = {} + function re(e, t) { + for (var n, r, i, o, a, s, u, l = [], c = 0, f = e.length; c < f; c++) + (r = e[c]).style && + ((n = r.style.display), + t + ? ('none' === n && ((l[c] = _.get(r, 'display') || null), l[c] || (r.style.display = '')), + '' === r.style.display && + ee(r) && + (l[c] = + ((u = a = o = void 0), + (a = (i = r).ownerDocument), + (s = i.nodeName), + (u = ne[s]) || + ((o = a.body.appendChild(a.createElement(s))), + (u = ce.css(o, 'display')), + o.parentNode.removeChild(o), + 'none' === u && (u = 'block'), + (ne[s] = u))))) + : 'none' !== n && ((l[c] = 'none'), _.set(r, 'display', n))) + for (c = 0; c < f; c++) null != l[c] && (e[c].style.display = l[c]) + return e + } + ce.fn.extend({ + show: function () { + return re(this, !0) + }, + hide: function () { + return re(this) + }, + toggle: function (e) { + return 'boolean' == typeof e + ? e + ? this.show() + : this.hide() + : this.each(function () { + ee(this) ? ce(this).show() : ce(this).hide() + }) + }, + }) + var xe, + be, + we = /^(?:checkbox|radio)$/i, + Te = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i, + Ce = /^$|^module$|\/(?:java|ecma)script/i + ;((xe = C.createDocumentFragment().appendChild(C.createElement('div'))), + (be = C.createElement('input')).setAttribute('type', 'radio'), + be.setAttribute('checked', 'checked'), + be.setAttribute('name', 't'), + xe.appendChild(be), + (le.checkClone = xe.cloneNode(!0).cloneNode(!0).lastChild.checked), + (xe.innerHTML = ''), + (le.noCloneChecked = !!xe.cloneNode(!0).lastChild.defaultValue), + (xe.innerHTML = ''), + (le.option = !!xe.lastChild)) + var ke = { + thead: [1, '', '
'], + col: [2, '', '
'], + tr: [2, '', '
'], + td: [3, '', '
'], + _default: [0, '', ''], + } + function Se(e, t) { + var n + return ( + (n = + 'undefined' != typeof e.getElementsByTagName + ? e.getElementsByTagName(t || '*') + : 'undefined' != typeof e.querySelectorAll + ? e.querySelectorAll(t || '*') + : []), + void 0 === t || (t && fe(e, t)) ? ce.merge([e], n) : n + ) + } + function Ee(e, t) { + for (var n = 0, r = e.length; n < r; n++) + _.set(e[n], 'globalEval', !t || _.get(t[n], 'globalEval')) + } + ;((ke.tbody = ke.tfoot = ke.colgroup = ke.caption = ke.thead), + (ke.th = ke.td), + le.option || (ke.optgroup = ke.option = [1, "'])) + var je = /<|&#?\w+;/ + function Ae(e, t, n, r, i) { + for ( + var o, a, s, u, l, c, f = t.createDocumentFragment(), p = [], d = 0, h = e.length; + d < h; + d++ + ) + if ((o = e[d]) || 0 === o) + if ('object' === x(o)) ce.merge(p, o.nodeType ? [o] : o) + else if (je.test(o)) { + ;((a = a || f.appendChild(t.createElement('div'))), + (s = (Te.exec(o) || ['', ''])[1].toLowerCase()), + (u = ke[s] || ke._default), + (a.innerHTML = u[1] + ce.htmlPrefilter(o) + u[2]), + (c = u[0])) + while (c--) a = a.lastChild + ;(ce.merge(p, a.childNodes), ((a = f.firstChild).textContent = '')) + } else p.push(t.createTextNode(o)) + ;((f.textContent = ''), (d = 0)) + while ((o = p[d++])) + if (r && -1 < ce.inArray(o, r)) i && i.push(o) + else if (((l = K(o)), (a = Se(f.appendChild(o), 'script')), l && Ee(a), n)) { + c = 0 + while ((o = a[c++])) Ce.test(o.type || '') && n.push(o) + } + return f + } + var De = /^([^.]*)(?:\.(.+)|)/ + function Ne() { + return !0 + } + function qe() { + return !1 + } + function Le(e, t, n, r, i, o) { + var a, s + if ('object' == typeof t) { + for (s in ('string' != typeof n && ((r = r || n), (n = void 0)), t)) Le(e, s, n, r, t[s], o) + return e + } + if ( + (null == r && null == i + ? ((i = n), (r = n = void 0)) + : null == i && + ('string' == typeof n ? ((i = r), (r = void 0)) : ((i = r), (r = n), (n = void 0))), + !1 === i) + ) + i = qe + else if (!i) return e + return ( + 1 === o && + ((a = i), + ((i = function (e) { + return (ce().off(e), a.apply(this, arguments)) + }).guid = a.guid || (a.guid = ce.guid++))), + e.each(function () { + ce.event.add(this, t, i, r, n) + }) + ) + } + function He(e, r, t) { + t + ? (_.set(e, r, !1), + ce.event.add(e, r, { + namespace: !1, + handler: function (e) { + var t, + n = _.get(this, r) + if (1 & e.isTrigger && this[r]) { + if (n) (ce.event.special[r] || {}).delegateType && e.stopPropagation() + else if ( + ((n = ae.call(arguments)), + _.set(this, r, n), + this[r](), + (t = _.get(this, r)), + _.set(this, r, !1), + n !== t) + ) + return (e.stopImmediatePropagation(), e.preventDefault(), t) + } else + n && + (_.set(this, r, ce.event.trigger(n[0], n.slice(1), this)), + e.stopPropagation(), + (e.isImmediatePropagationStopped = Ne)) + }, + })) + : void 0 === _.get(e, r) && ce.event.add(e, r, Ne) + } + ;((ce.event = { + global: {}, + add: function (t, e, n, r, i) { + var o, + a, + s, + u, + l, + c, + f, + p, + d, + h, + g, + v = _.get(t) + if ($(t)) { + ;(n.handler && ((n = (o = n).handler), (i = o.selector)), + i && ce.find.matchesSelector(J, i), + n.guid || (n.guid = ce.guid++), + (u = v.events) || (u = v.events = Object.create(null)), + (a = v.handle) || + (a = v.handle = + function (e) { + return 'undefined' != typeof ce && ce.event.triggered !== e.type + ? ce.event.dispatch.apply(t, arguments) + : void 0 + }), + (l = (e = (e || '').match(D) || ['']).length)) + while (l--) + ((d = g = (s = De.exec(e[l]) || [])[1]), + (h = (s[2] || '').split('.').sort()), + d && + ((f = ce.event.special[d] || {}), + (d = (i ? f.delegateType : f.bindType) || d), + (f = ce.event.special[d] || {}), + (c = ce.extend( + { + type: d, + origType: g, + data: r, + handler: n, + guid: n.guid, + selector: i, + needsContext: i && ce.expr.match.needsContext.test(i), + namespace: h.join('.'), + }, + o + )), + (p = u[d]) || + (((p = u[d] = []).delegateCount = 0), + (f.setup && !1 !== f.setup.call(t, r, h, a)) || + (t.addEventListener && t.addEventListener(d, a))), + f.add && (f.add.call(t, c), c.handler.guid || (c.handler.guid = n.guid)), + i ? p.splice(p.delegateCount++, 0, c) : p.push(c), + (ce.event.global[d] = !0))) + } + }, + remove: function (e, t, n, r, i) { + var o, + a, + s, + u, + l, + c, + f, + p, + d, + h, + g, + v = _.hasData(e) && _.get(e) + if (v && (u = v.events)) { + l = (t = (t || '').match(D) || ['']).length + while (l--) + if (((d = g = (s = De.exec(t[l]) || [])[1]), (h = (s[2] || '').split('.').sort()), d)) { + ;((f = ce.event.special[d] || {}), + (p = u[(d = (r ? f.delegateType : f.bindType) || d)] || []), + (s = s[2] && new RegExp('(^|\\.)' + h.join('\\.(?:.*\\.|)') + '(\\.|$)')), + (a = o = p.length)) + while (o--) + ((c = p[o]), + (!i && g !== c.origType) || + (n && n.guid !== c.guid) || + (s && !s.test(c.namespace)) || + (r && r !== c.selector && ('**' !== r || !c.selector)) || + (p.splice(o, 1), + c.selector && p.delegateCount--, + f.remove && f.remove.call(e, c))) + a && + !p.length && + ((f.teardown && !1 !== f.teardown.call(e, h, v.handle)) || + ce.removeEvent(e, d, v.handle), + delete u[d]) + } else for (d in u) ce.event.remove(e, d + t[l], n, r, !0) + ce.isEmptyObject(u) && _.remove(e, 'handle events') + } + }, + dispatch: function (e) { + var t, + n, + r, + i, + o, + a, + s = new Array(arguments.length), + u = ce.event.fix(e), + l = (_.get(this, 'events') || Object.create(null))[u.type] || [], + c = ce.event.special[u.type] || {} + for (s[0] = u, t = 1; t < arguments.length; t++) s[t] = arguments[t] + if (((u.delegateTarget = this), !c.preDispatch || !1 !== c.preDispatch.call(this, u))) { + ;((a = ce.event.handlers.call(this, u, l)), (t = 0)) + while ((i = a[t++]) && !u.isPropagationStopped()) { + ;((u.currentTarget = i.elem), (n = 0)) + while ((o = i.handlers[n++]) && !u.isImmediatePropagationStopped()) + (u.rnamespace && !1 !== o.namespace && !u.rnamespace.test(o.namespace)) || + ((u.handleObj = o), + (u.data = o.data), + void 0 !== + (r = ((ce.event.special[o.origType] || {}).handle || o.handler).apply(i.elem, s)) && + !1 === (u.result = r) && + (u.preventDefault(), u.stopPropagation())) + } + return (c.postDispatch && c.postDispatch.call(this, u), u.result) + } + }, + handlers: function (e, t) { + var n, + r, + i, + o, + a, + s = [], + u = t.delegateCount, + l = e.target + if (u && l.nodeType && !('click' === e.type && 1 <= e.button)) + for (; l !== this; l = l.parentNode || this) + if (1 === l.nodeType && ('click' !== e.type || !0 !== l.disabled)) { + for (o = [], a = {}, n = 0; n < u; n++) + (void 0 === a[(i = (r = t[n]).selector + ' ')] && + (a[i] = r.needsContext + ? -1 < ce(i, this).index(l) + : ce.find(i, this, null, [l]).length), + a[i] && o.push(r)) + o.length && s.push({ elem: l, handlers: o }) + } + return ((l = this), u < t.length && s.push({ elem: l, handlers: t.slice(u) }), s) + }, + addProp: function (t, e) { + Object.defineProperty(ce.Event.prototype, t, { + enumerable: !0, + configurable: !0, + get: v(e) + ? function () { + if (this.originalEvent) return e(this.originalEvent) + } + : function () { + if (this.originalEvent) return this.originalEvent[t] + }, + set: function (e) { + Object.defineProperty(this, t, { + enumerable: !0, + configurable: !0, + writable: !0, + value: e, + }) + }, + }) + }, + fix: function (e) { + return e[ce.expando] ? e : new ce.Event(e) + }, + special: { + load: { noBubble: !0 }, + click: { + setup: function (e) { + var t = this || e + return (we.test(t.type) && t.click && fe(t, 'input') && He(t, 'click', !0), !1) + }, + trigger: function (e) { + var t = this || e + return (we.test(t.type) && t.click && fe(t, 'input') && He(t, 'click'), !0) + }, + _default: function (e) { + var t = e.target + return (we.test(t.type) && t.click && fe(t, 'input') && _.get(t, 'click')) || fe(t, 'a') + }, + }, + beforeunload: { + postDispatch: function (e) { + void 0 !== e.result && e.originalEvent && (e.originalEvent.returnValue = e.result) + }, + }, + }, + }), + (ce.removeEvent = function (e, t, n) { + e.removeEventListener && e.removeEventListener(t, n) + }), + (ce.Event = function (e, t) { + if (!(this instanceof ce.Event)) return new ce.Event(e, t) + ;(e && e.type + ? ((this.originalEvent = e), + (this.type = e.type), + (this.isDefaultPrevented = + e.defaultPrevented || (void 0 === e.defaultPrevented && !1 === e.returnValue) + ? Ne + : qe), + (this.target = e.target && 3 === e.target.nodeType ? e.target.parentNode : e.target), + (this.currentTarget = e.currentTarget), + (this.relatedTarget = e.relatedTarget)) + : (this.type = e), + t && ce.extend(this, t), + (this.timeStamp = (e && e.timeStamp) || Date.now()), + (this[ce.expando] = !0)) + }), + (ce.Event.prototype = { + constructor: ce.Event, + isDefaultPrevented: qe, + isPropagationStopped: qe, + isImmediatePropagationStopped: qe, + isSimulated: !1, + preventDefault: function () { + var e = this.originalEvent + ;((this.isDefaultPrevented = Ne), e && !this.isSimulated && e.preventDefault()) + }, + stopPropagation: function () { + var e = this.originalEvent + ;((this.isPropagationStopped = Ne), e && !this.isSimulated && e.stopPropagation()) + }, + stopImmediatePropagation: function () { + var e = this.originalEvent + ;((this.isImmediatePropagationStopped = Ne), + e && !this.isSimulated && e.stopImmediatePropagation(), + this.stopPropagation()) + }, + }), + ce.each( + { + altKey: !0, + bubbles: !0, + cancelable: !0, + changedTouches: !0, + ctrlKey: !0, + detail: !0, + eventPhase: !0, + metaKey: !0, + pageX: !0, + pageY: !0, + shiftKey: !0, + view: !0, + char: !0, + code: !0, + charCode: !0, + key: !0, + keyCode: !0, + button: !0, + buttons: !0, + clientX: !0, + clientY: !0, + offsetX: !0, + offsetY: !0, + pointerId: !0, + pointerType: !0, + screenX: !0, + screenY: !0, + targetTouches: !0, + toElement: !0, + touches: !0, + which: !0, + }, + ce.event.addProp + ), + ce.each({ focus: 'focusin', blur: 'focusout' }, function (r, i) { + function o(e) { + if (C.documentMode) { + var t = _.get(this, 'handle'), + n = ce.event.fix(e) + ;((n.type = 'focusin' === e.type ? 'focus' : 'blur'), + (n.isSimulated = !0), + t(e), + n.target === n.currentTarget && t(n)) + } else ce.event.simulate(i, e.target, ce.event.fix(e)) + } + ;((ce.event.special[r] = { + setup: function () { + var e + if ((He(this, r, !0), !C.documentMode)) return !1 + ;((e = _.get(this, i)) || this.addEventListener(i, o), _.set(this, i, (e || 0) + 1)) + }, + trigger: function () { + return (He(this, r), !0) + }, + teardown: function () { + var e + if (!C.documentMode) return !1 + ;(e = _.get(this, i) - 1) + ? _.set(this, i, e) + : (this.removeEventListener(i, o), _.remove(this, i)) + }, + _default: function (e) { + return _.get(e.target, r) + }, + delegateType: i, + }), + (ce.event.special[i] = { + setup: function () { + var e = this.ownerDocument || this.document || this, + t = C.documentMode ? this : e, + n = _.get(t, i) + ;(n || (C.documentMode ? this.addEventListener(i, o) : e.addEventListener(r, o, !0)), + _.set(t, i, (n || 0) + 1)) + }, + teardown: function () { + var e = this.ownerDocument || this.document || this, + t = C.documentMode ? this : e, + n = _.get(t, i) - 1 + n + ? _.set(t, i, n) + : (C.documentMode ? this.removeEventListener(i, o) : e.removeEventListener(r, o, !0), + _.remove(t, i)) + }, + })) + }), + ce.each( + { + mouseenter: 'mouseover', + mouseleave: 'mouseout', + pointerenter: 'pointerover', + pointerleave: 'pointerout', + }, + function (e, i) { + ce.event.special[e] = { + delegateType: i, + bindType: i, + handle: function (e) { + var t, + n = e.relatedTarget, + r = e.handleObj + return ( + (n && (n === this || ce.contains(this, n))) || + ((e.type = r.origType), (t = r.handler.apply(this, arguments)), (e.type = i)), + t + ) + }, + } + } + ), + ce.fn.extend({ + on: function (e, t, n, r) { + return Le(this, e, t, n, r) + }, + one: function (e, t, n, r) { + return Le(this, e, t, n, r, 1) + }, + off: function (e, t, n) { + var r, i + if (e && e.preventDefault && e.handleObj) + return ( + (r = e.handleObj), + ce(e.delegateTarget).off( + r.namespace ? r.origType + '.' + r.namespace : r.origType, + r.selector, + r.handler + ), + this + ) + if ('object' == typeof e) { + for (i in e) this.off(i, t, e[i]) + return this + } + return ( + (!1 !== t && 'function' != typeof t) || ((n = t), (t = void 0)), + !1 === n && (n = qe), + this.each(function () { + ce.event.remove(this, e, n, t) + }) + ) + }, + })) + var Oe = /\s*$/g + function Re(e, t) { + return ( + (fe(e, 'table') && + fe(11 !== t.nodeType ? t : t.firstChild, 'tr') && + ce(e).children('tbody')[0]) || + e + ) + } + function Ie(e) { + return ((e.type = (null !== e.getAttribute('type')) + '/' + e.type), e) + } + function We(e) { + return ( + 'true/' === (e.type || '').slice(0, 5) + ? (e.type = e.type.slice(5)) + : e.removeAttribute('type'), + e + ) + } + function Fe(e, t) { + var n, r, i, o, a, s + if (1 === t.nodeType) { + if (_.hasData(e) && (s = _.get(e).events)) + for (i in (_.remove(t, 'handle events'), s)) + for (n = 0, r = s[i].length; n < r; n++) ce.event.add(t, i, s[i][n]) + z.hasData(e) && ((o = z.access(e)), (a = ce.extend({}, o)), z.set(t, a)) + } + } + function $e(n, r, i, o) { + r = g(r) + var e, + t, + a, + s, + u, + l, + c = 0, + f = n.length, + p = f - 1, + d = r[0], + h = v(d) + if (h || (1 < f && 'string' == typeof d && !le.checkClone && Pe.test(d))) + return n.each(function (e) { + var t = n.eq(e) + ;(h && (r[0] = d.call(this, e, t.html())), $e(t, r, i, o)) + }) + if ( + f && + ((t = (e = Ae(r, n[0].ownerDocument, !1, n, o)).firstChild), + 1 === e.childNodes.length && (e = t), + t || o) + ) { + for (s = (a = ce.map(Se(e, 'script'), Ie)).length; c < f; c++) + ((u = e), + c !== p && ((u = ce.clone(u, !0, !0)), s && ce.merge(a, Se(u, 'script'))), + i.call(n[c], u, c)) + if (s) + for (l = a[a.length - 1].ownerDocument, ce.map(a, We), c = 0; c < s; c++) + ((u = a[c]), + Ce.test(u.type || '') && + !_.access(u, 'globalEval') && + ce.contains(l, u) && + (u.src && 'module' !== (u.type || '').toLowerCase() + ? ce._evalUrl && + !u.noModule && + ce._evalUrl(u.src, { nonce: u.nonce || u.getAttribute('nonce') }, l) + : m(u.textContent.replace(Me, ''), u, l))) + } + return n + } + function Be(e, t, n) { + for (var r, i = t ? ce.filter(t, e) : e, o = 0; null != (r = i[o]); o++) + (n || 1 !== r.nodeType || ce.cleanData(Se(r)), + r.parentNode && (n && K(r) && Ee(Se(r, 'script')), r.parentNode.removeChild(r))) + return e + } + ;(ce.extend({ + htmlPrefilter: function (e) { + return e + }, + clone: function (e, t, n) { + var r, + i, + o, + a, + s, + u, + l, + c = e.cloneNode(!0), + f = K(e) + if (!(le.noCloneChecked || (1 !== e.nodeType && 11 !== e.nodeType) || ce.isXMLDoc(e))) + for (a = Se(c), r = 0, i = (o = Se(e)).length; r < i; r++) + ((s = o[r]), + (u = a[r]), + void 0, + 'input' === (l = u.nodeName.toLowerCase()) && we.test(s.type) + ? (u.checked = s.checked) + : ('input' !== l && 'textarea' !== l) || (u.defaultValue = s.defaultValue)) + if (t) + if (n) for (o = o || Se(e), a = a || Se(c), r = 0, i = o.length; r < i; r++) Fe(o[r], a[r]) + else Fe(e, c) + return (0 < (a = Se(c, 'script')).length && Ee(a, !f && Se(e, 'script')), c) + }, + cleanData: function (e) { + for (var t, n, r, i = ce.event.special, o = 0; void 0 !== (n = e[o]); o++) + if ($(n)) { + if ((t = n[_.expando])) { + if (t.events) + for (r in t.events) i[r] ? ce.event.remove(n, r) : ce.removeEvent(n, r, t.handle) + n[_.expando] = void 0 + } + n[z.expando] && (n[z.expando] = void 0) + } + }, + }), + ce.fn.extend({ + detach: function (e) { + return Be(this, e, !0) + }, + remove: function (e) { + return Be(this, e) + }, + text: function (e) { + return M( + this, + function (e) { + return void 0 === e + ? ce.text(this) + : this.empty().each(function () { + ;(1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType) || + (this.textContent = e) + }) + }, + null, + e, + arguments.length + ) + }, + append: function () { + return $e(this, arguments, function (e) { + ;(1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType) || + Re(this, e).appendChild(e) + }) + }, + prepend: function () { + return $e(this, arguments, function (e) { + if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { + var t = Re(this, e) + t.insertBefore(e, t.firstChild) + } + }) + }, + before: function () { + return $e(this, arguments, function (e) { + this.parentNode && this.parentNode.insertBefore(e, this) + }) + }, + after: function () { + return $e(this, arguments, function (e) { + this.parentNode && this.parentNode.insertBefore(e, this.nextSibling) + }) + }, + empty: function () { + for (var e, t = 0; null != (e = this[t]); t++) + 1 === e.nodeType && (ce.cleanData(Se(e, !1)), (e.textContent = '')) + return this + }, + clone: function (e, t) { + return ( + (e = null != e && e), + (t = null == t ? e : t), + this.map(function () { + return ce.clone(this, e, t) + }) + ) + }, + html: function (e) { + return M( + this, + function (e) { + var t = this[0] || {}, + n = 0, + r = this.length + if (void 0 === e && 1 === t.nodeType) return t.innerHTML + if ( + 'string' == typeof e && + !Oe.test(e) && + !ke[(Te.exec(e) || ['', ''])[1].toLowerCase()] + ) { + e = ce.htmlPrefilter(e) + try { + for (; n < r; n++) + 1 === (t = this[n] || {}).nodeType && (ce.cleanData(Se(t, !1)), (t.innerHTML = e)) + t = 0 + } catch (e) {} + } + t && this.empty().append(e) + }, + null, + e, + arguments.length + ) + }, + replaceWith: function () { + var n = [] + return $e( + this, + arguments, + function (e) { + var t = this.parentNode + ce.inArray(this, n) < 0 && (ce.cleanData(Se(this)), t && t.replaceChild(e, this)) + }, + n + ) + }, + }), + ce.each( + { + appendTo: 'append', + prependTo: 'prepend', + insertBefore: 'before', + insertAfter: 'after', + replaceAll: 'replaceWith', + }, + function (e, a) { + ce.fn[e] = function (e) { + for (var t, n = [], r = ce(e), i = r.length - 1, o = 0; o <= i; o++) + ((t = o === i ? this : this.clone(!0)), ce(r[o])[a](t), s.apply(n, t.get())) + return this.pushStack(n) + } + } + )) + var _e = new RegExp('^(' + G + ')(?!px)[a-z%]+$', 'i'), + ze = /^--/, + Xe = function (e) { + var t = e.ownerDocument.defaultView + return ((t && t.opener) || (t = ie), t.getComputedStyle(e)) + }, + Ue = function (e, t, n) { + var r, + i, + o = {} + for (i in t) ((o[i] = e.style[i]), (e.style[i] = t[i])) + for (i in ((r = n.call(e)), t)) e.style[i] = o[i] + return r + }, + Ve = new RegExp(Q.join('|'), 'i') + function Ge(e, t, n) { + var r, + i, + o, + a, + s = ze.test(t), + u = e.style + return ( + (n = n || Xe(e)) && + ((a = n.getPropertyValue(t) || n[t]), + s && a && (a = a.replace(ve, '$1') || void 0), + '' !== a || K(e) || (a = ce.style(e, t)), + !le.pixelBoxStyles() && + _e.test(a) && + Ve.test(t) && + ((r = u.width), + (i = u.minWidth), + (o = u.maxWidth), + (u.minWidth = u.maxWidth = u.width = a), + (a = n.width), + (u.width = r), + (u.minWidth = i), + (u.maxWidth = o))), + void 0 !== a ? a + '' : a + ) + } + function Ye(e, t) { + return { + get: function () { + if (!e()) return (this.get = t).apply(this, arguments) + delete this.get + }, + } + } + !(function () { + function e() { + if (l) { + ;((u.style.cssText = + 'position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0'), + (l.style.cssText = + 'position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%'), + J.appendChild(u).appendChild(l)) + var e = ie.getComputedStyle(l) + ;((n = '1%' !== e.top), + (s = 12 === t(e.marginLeft)), + (l.style.right = '60%'), + (o = 36 === t(e.right)), + (r = 36 === t(e.width)), + (l.style.position = 'absolute'), + (i = 12 === t(l.offsetWidth / 3)), + J.removeChild(u), + (l = null)) + } + } + function t(e) { + return Math.round(parseFloat(e)) + } + var n, + r, + i, + o, + a, + s, + u = C.createElement('div'), + l = C.createElement('div') + l.style && + ((l.style.backgroundClip = 'content-box'), + (l.cloneNode(!0).style.backgroundClip = ''), + (le.clearCloneStyle = 'content-box' === l.style.backgroundClip), + ce.extend(le, { + boxSizingReliable: function () { + return (e(), r) + }, + pixelBoxStyles: function () { + return (e(), o) + }, + pixelPosition: function () { + return (e(), n) + }, + reliableMarginLeft: function () { + return (e(), s) + }, + scrollboxSize: function () { + return (e(), i) + }, + reliableTrDimensions: function () { + var e, t, n, r + return ( + null == a && + ((e = C.createElement('table')), + (t = C.createElement('tr')), + (n = C.createElement('div')), + (e.style.cssText = 'position:absolute;left:-11111px;border-collapse:separate'), + (t.style.cssText = 'box-sizing:content-box;border:1px solid'), + (t.style.height = '1px'), + (n.style.height = '9px'), + (n.style.display = 'block'), + J.appendChild(e).appendChild(t).appendChild(n), + (r = ie.getComputedStyle(t)), + (a = + parseInt(r.height, 10) + + parseInt(r.borderTopWidth, 10) + + parseInt(r.borderBottomWidth, 10) === + t.offsetHeight), + J.removeChild(e)), + a + ) + }, + })) + })() + var Qe = ['Webkit', 'Moz', 'ms'], + Je = C.createElement('div').style, + Ke = {} + function Ze(e) { + var t = ce.cssProps[e] || Ke[e] + return ( + t || + (e in Je + ? e + : (Ke[e] = + (function (e) { + var t = e[0].toUpperCase() + e.slice(1), + n = Qe.length + while (n--) if ((e = Qe[n] + t) in Je) return e + })(e) || e)) + ) + } + var et = /^(none|table(?!-c[ea]).+)/, + tt = { position: 'absolute', visibility: 'hidden', display: 'block' }, + nt = { letterSpacing: '0', fontWeight: '400' } + function rt(e, t, n) { + var r = Y.exec(t) + return r ? Math.max(0, r[2] - (n || 0)) + (r[3] || 'px') : t + } + function it(e, t, n, r, i, o) { + var a = 'width' === t ? 1 : 0, + s = 0, + u = 0, + l = 0 + if (n === (r ? 'border' : 'content')) return 0 + for (; a < 4; a += 2) + ('margin' === n && (l += ce.css(e, n + Q[a], !0, i)), + r + ? ('content' === n && (u -= ce.css(e, 'padding' + Q[a], !0, i)), + 'margin' !== n && (u -= ce.css(e, 'border' + Q[a] + 'Width', !0, i))) + : ((u += ce.css(e, 'padding' + Q[a], !0, i)), + 'padding' !== n + ? (u += ce.css(e, 'border' + Q[a] + 'Width', !0, i)) + : (s += ce.css(e, 'border' + Q[a] + 'Width', !0, i)))) + return ( + !r && + 0 <= o && + (u += + Math.max(0, Math.ceil(e['offset' + t[0].toUpperCase() + t.slice(1)] - o - u - s - 0.5)) || + 0), + u + l + ) + } + function ot(e, t, n) { + var r = Xe(e), + i = (!le.boxSizingReliable() || n) && 'border-box' === ce.css(e, 'boxSizing', !1, r), + o = i, + a = Ge(e, t, r), + s = 'offset' + t[0].toUpperCase() + t.slice(1) + if (_e.test(a)) { + if (!n) return a + a = 'auto' + } + return ( + ((!le.boxSizingReliable() && i) || + (!le.reliableTrDimensions() && fe(e, 'tr')) || + 'auto' === a || + (!parseFloat(a) && 'inline' === ce.css(e, 'display', !1, r))) && + e.getClientRects().length && + ((i = 'border-box' === ce.css(e, 'boxSizing', !1, r)), (o = s in e) && (a = e[s])), + (a = parseFloat(a) || 0) + it(e, t, n || (i ? 'border' : 'content'), o, r, a) + 'px' + ) + } + function at(e, t, n, r, i) { + return new at.prototype.init(e, t, n, r, i) + } + ;(ce.extend({ + cssHooks: { + opacity: { + get: function (e, t) { + if (t) { + var n = Ge(e, 'opacity') + return '' === n ? '1' : n + } + }, + }, + }, + cssNumber: { + animationIterationCount: !0, + aspectRatio: !0, + borderImageSlice: !0, + columnCount: !0, + flexGrow: !0, + flexShrink: !0, + fontWeight: !0, + gridArea: !0, + gridColumn: !0, + gridColumnEnd: !0, + gridColumnStart: !0, + gridRow: !0, + gridRowEnd: !0, + gridRowStart: !0, + lineHeight: !0, + opacity: !0, + order: !0, + orphans: !0, + scale: !0, + widows: !0, + zIndex: !0, + zoom: !0, + fillOpacity: !0, + floodOpacity: !0, + stopOpacity: !0, + strokeMiterlimit: !0, + strokeOpacity: !0, + }, + cssProps: {}, + style: function (e, t, n, r) { + if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) { + var i, + o, + a, + s = F(t), + u = ze.test(t), + l = e.style + if ((u || (t = Ze(s)), (a = ce.cssHooks[t] || ce.cssHooks[s]), void 0 === n)) + return a && 'get' in a && void 0 !== (i = a.get(e, !1, r)) ? i : l[t] + ;('string' === (o = typeof n) && + (i = Y.exec(n)) && + i[1] && + ((n = te(e, t, i)), (o = 'number')), + null != n && + n == n && + ('number' !== o || u || (n += (i && i[3]) || (ce.cssNumber[s] ? '' : 'px')), + le.clearCloneStyle || '' !== n || 0 !== t.indexOf('background') || (l[t] = 'inherit'), + (a && 'set' in a && void 0 === (n = a.set(e, n, r))) || + (u ? l.setProperty(t, n) : (l[t] = n)))) + } + }, + css: function (e, t, n, r) { + var i, + o, + a, + s = F(t) + return ( + ze.test(t) || (t = Ze(s)), + (a = ce.cssHooks[t] || ce.cssHooks[s]) && 'get' in a && (i = a.get(e, !0, n)), + void 0 === i && (i = Ge(e, t, r)), + 'normal' === i && t in nt && (i = nt[t]), + '' === n || n ? ((o = parseFloat(i)), !0 === n || isFinite(o) ? o || 0 : i) : i + ) + }, + }), + ce.each(['height', 'width'], function (e, u) { + ce.cssHooks[u] = { + get: function (e, t, n) { + if (t) + return !et.test(ce.css(e, 'display')) || + (e.getClientRects().length && e.getBoundingClientRect().width) + ? ot(e, u, n) + : Ue(e, tt, function () { + return ot(e, u, n) + }) + }, + set: function (e, t, n) { + var r, + i = Xe(e), + o = !le.scrollboxSize() && 'absolute' === i.position, + a = (o || n) && 'border-box' === ce.css(e, 'boxSizing', !1, i), + s = n ? it(e, u, n, a, i) : 0 + return ( + a && + o && + (s -= Math.ceil( + e['offset' + u[0].toUpperCase() + u.slice(1)] - + parseFloat(i[u]) - + it(e, u, 'border', !1, i) - + 0.5 + )), + s && + (r = Y.exec(t)) && + 'px' !== (r[3] || 'px') && + ((e.style[u] = t), (t = ce.css(e, u))), + rt(0, t, s) + ) + }, + } + }), + (ce.cssHooks.marginLeft = Ye(le.reliableMarginLeft, function (e, t) { + if (t) + return ( + (parseFloat(Ge(e, 'marginLeft')) || + e.getBoundingClientRect().left - + Ue(e, { marginLeft: 0 }, function () { + return e.getBoundingClientRect().left + })) + 'px' + ) + })), + ce.each({ margin: '', padding: '', border: 'Width' }, function (i, o) { + ;((ce.cssHooks[i + o] = { + expand: function (e) { + for (var t = 0, n = {}, r = 'string' == typeof e ? e.split(' ') : [e]; t < 4; t++) + n[i + Q[t] + o] = r[t] || r[t - 2] || r[0] + return n + }, + }), + 'margin' !== i && (ce.cssHooks[i + o].set = rt)) + }), + ce.fn.extend({ + css: function (e, t) { + return M( + this, + function (e, t, n) { + var r, + i, + o = {}, + a = 0 + if (Array.isArray(t)) { + for (r = Xe(e), i = t.length; a < i; a++) o[t[a]] = ce.css(e, t[a], !1, r) + return o + } + return void 0 !== n ? ce.style(e, t, n) : ce.css(e, t) + }, + e, + t, + 1 < arguments.length + ) + }, + }), + (((ce.Tween = at).prototype = { + constructor: at, + init: function (e, t, n, r, i, o) { + ;((this.elem = e), + (this.prop = n), + (this.easing = i || ce.easing._default), + (this.options = t), + (this.start = this.now = this.cur()), + (this.end = r), + (this.unit = o || (ce.cssNumber[n] ? '' : 'px'))) + }, + cur: function () { + var e = at.propHooks[this.prop] + return e && e.get ? e.get(this) : at.propHooks._default.get(this) + }, + run: function (e) { + var t, + n = at.propHooks[this.prop] + return ( + this.options.duration + ? (this.pos = t = + ce.easing[this.easing](e, this.options.duration * e, 0, 1, this.options.duration)) + : (this.pos = t = e), + (this.now = (this.end - this.start) * t + this.start), + this.options.step && this.options.step.call(this.elem, this.now, this), + n && n.set ? n.set(this) : at.propHooks._default.set(this), + this + ) + }, + }).init.prototype = at.prototype), + ((at.propHooks = { + _default: { + get: function (e) { + var t + return 1 !== e.elem.nodeType || (null != e.elem[e.prop] && null == e.elem.style[e.prop]) + ? e.elem[e.prop] + : (t = ce.css(e.elem, e.prop, '')) && 'auto' !== t + ? t + : 0 + }, + set: function (e) { + ce.fx.step[e.prop] + ? ce.fx.step[e.prop](e) + : 1 !== e.elem.nodeType || (!ce.cssHooks[e.prop] && null == e.elem.style[Ze(e.prop)]) + ? (e.elem[e.prop] = e.now) + : ce.style(e.elem, e.prop, e.now + e.unit) + }, + }, + }).scrollTop = at.propHooks.scrollLeft = + { + set: function (e) { + e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now) + }, + }), + (ce.easing = { + linear: function (e) { + return e + }, + swing: function (e) { + return 0.5 - Math.cos(e * Math.PI) / 2 + }, + _default: 'swing', + }), + (ce.fx = at.prototype.init), + (ce.fx.step = {})) + var st, + ut, + lt, + ct, + ft = /^(?:toggle|show|hide)$/, + pt = /queueHooks$/ + function dt() { + ut && + (!1 === C.hidden && ie.requestAnimationFrame + ? ie.requestAnimationFrame(dt) + : ie.setTimeout(dt, ce.fx.interval), + ce.fx.tick()) + } + function ht() { + return ( + ie.setTimeout(function () { + st = void 0 + }), + (st = Date.now()) + ) + } + function gt(e, t) { + var n, + r = 0, + i = { height: e } + for (t = t ? 1 : 0; r < 4; r += 2 - t) i['margin' + (n = Q[r])] = i['padding' + n] = e + return (t && (i.opacity = i.width = e), i) + } + function vt(e, t, n) { + for ( + var r, i = (yt.tweeners[t] || []).concat(yt.tweeners['*']), o = 0, a = i.length; + o < a; + o++ + ) + if ((r = i[o].call(n, t, e))) return r + } + function yt(o, e, t) { + var n, + a, + r = 0, + i = yt.prefilters.length, + s = ce.Deferred().always(function () { + delete u.elem + }), + u = function () { + if (a) return !1 + for ( + var e = st || ht(), + t = Math.max(0, l.startTime + l.duration - e), + n = 1 - (t / l.duration || 0), + r = 0, + i = l.tweens.length; + r < i; + r++ + ) + l.tweens[r].run(n) + return ( + s.notifyWith(o, [l, n, t]), + n < 1 && i ? t : (i || s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l]), !1) + ) + }, + l = s.promise({ + elem: o, + props: ce.extend({}, e), + opts: ce.extend(!0, { specialEasing: {}, easing: ce.easing._default }, t), + originalProperties: e, + originalOptions: t, + startTime: st || ht(), + duration: t.duration, + tweens: [], + createTween: function (e, t) { + var n = ce.Tween(o, l.opts, e, t, l.opts.specialEasing[e] || l.opts.easing) + return (l.tweens.push(n), n) + }, + stop: function (e) { + var t = 0, + n = e ? l.tweens.length : 0 + if (a) return this + for (a = !0; t < n; t++) l.tweens[t].run(1) + return ( + e ? (s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l, e])) : s.rejectWith(o, [l, e]), + this + ) + }, + }), + c = l.props + for ( + !(function (e, t) { + var n, r, i, o, a + for (n in e) + if ( + ((i = t[(r = F(n))]), + (o = e[n]), + Array.isArray(o) && ((i = o[1]), (o = e[n] = o[0])), + n !== r && ((e[r] = o), delete e[n]), + (a = ce.cssHooks[r]) && ('expand' in a)) + ) + for (n in ((o = a.expand(o)), delete e[r], o)) (n in e) || ((e[n] = o[n]), (t[n] = i)) + else t[r] = i + })(c, l.opts.specialEasing); + r < i; + r++ + ) + if ((n = yt.prefilters[r].call(l, o, c, l.opts))) + return (v(n.stop) && (ce._queueHooks(l.elem, l.opts.queue).stop = n.stop.bind(n)), n) + return ( + ce.map(c, vt, l), + v(l.opts.start) && l.opts.start.call(o, l), + l + .progress(l.opts.progress) + .done(l.opts.done, l.opts.complete) + .fail(l.opts.fail) + .always(l.opts.always), + ce.fx.timer(ce.extend(u, { elem: o, anim: l, queue: l.opts.queue })), + l + ) + } + ;((ce.Animation = ce.extend(yt, { + tweeners: { + '*': [ + function (e, t) { + var n = this.createTween(e, t) + return (te(n.elem, e, Y.exec(t), n), n) + }, + ], + }, + tweener: function (e, t) { + v(e) ? ((t = e), (e = ['*'])) : (e = e.match(D)) + for (var n, r = 0, i = e.length; r < i; r++) + ((n = e[r]), (yt.tweeners[n] = yt.tweeners[n] || []), yt.tweeners[n].unshift(t)) + }, + prefilters: [ + function (e, t, n) { + var r, + i, + o, + a, + s, + u, + l, + c, + f = 'width' in t || 'height' in t, + p = this, + d = {}, + h = e.style, + g = e.nodeType && ee(e), + v = _.get(e, 'fxshow') + for (r in (n.queue || + (null == (a = ce._queueHooks(e, 'fx')).unqueued && + ((a.unqueued = 0), + (s = a.empty.fire), + (a.empty.fire = function () { + a.unqueued || s() + })), + a.unqueued++, + p.always(function () { + p.always(function () { + ;(a.unqueued--, ce.queue(e, 'fx').length || a.empty.fire()) + }) + })), + t)) + if (((i = t[r]), ft.test(i))) { + if ((delete t[r], (o = o || 'toggle' === i), i === (g ? 'hide' : 'show'))) { + if ('show' !== i || !v || void 0 === v[r]) continue + g = !0 + } + d[r] = (v && v[r]) || ce.style(e, r) + } + if ((u = !ce.isEmptyObject(t)) || !ce.isEmptyObject(d)) + for (r in (f && + 1 === e.nodeType && + ((n.overflow = [h.overflow, h.overflowX, h.overflowY]), + null == (l = v && v.display) && (l = _.get(e, 'display')), + 'none' === (c = ce.css(e, 'display')) && + (l + ? (c = l) + : (re([e], !0), (l = e.style.display || l), (c = ce.css(e, 'display')), re([e]))), + ('inline' === c || ('inline-block' === c && null != l)) && + 'none' === ce.css(e, 'float') && + (u || + (p.done(function () { + h.display = l + }), + null == l && ((c = h.display), (l = 'none' === c ? '' : c))), + (h.display = 'inline-block'))), + n.overflow && + ((h.overflow = 'hidden'), + p.always(function () { + ;((h.overflow = n.overflow[0]), + (h.overflowX = n.overflow[1]), + (h.overflowY = n.overflow[2])) + })), + (u = !1), + d)) + (u || + (v ? 'hidden' in v && (g = v.hidden) : (v = _.access(e, 'fxshow', { display: l })), + o && (v.hidden = !g), + g && re([e], !0), + p.done(function () { + for (r in (g || re([e]), _.remove(e, 'fxshow'), d)) ce.style(e, r, d[r]) + })), + (u = vt(g ? v[r] : 0, r, p)), + r in v || ((v[r] = u.start), g && ((u.end = u.start), (u.start = 0)))) + }, + ], + prefilter: function (e, t) { + t ? yt.prefilters.unshift(e) : yt.prefilters.push(e) + }, + })), + (ce.speed = function (e, t, n) { + var r = + e && 'object' == typeof e + ? ce.extend({}, e) + : { + complete: n || (!n && t) || (v(e) && e), + duration: e, + easing: (n && t) || (t && !v(t) && t), + } + return ( + ce.fx.off + ? (r.duration = 0) + : 'number' != typeof r.duration && + (r.duration in ce.fx.speeds + ? (r.duration = ce.fx.speeds[r.duration]) + : (r.duration = ce.fx.speeds._default)), + (null != r.queue && !0 !== r.queue) || (r.queue = 'fx'), + (r.old = r.complete), + (r.complete = function () { + ;(v(r.old) && r.old.call(this), r.queue && ce.dequeue(this, r.queue)) + }), + r + ) + }), + ce.fn.extend({ + fadeTo: function (e, t, n, r) { + return this.filter(ee).css('opacity', 0).show().end().animate({ opacity: t }, e, n, r) + }, + animate: function (t, e, n, r) { + var i = ce.isEmptyObject(t), + o = ce.speed(e, n, r), + a = function () { + var e = yt(this, ce.extend({}, t), o) + ;(i || _.get(this, 'finish')) && e.stop(!0) + } + return ((a.finish = a), i || !1 === o.queue ? this.each(a) : this.queue(o.queue, a)) + }, + stop: function (i, e, o) { + var a = function (e) { + var t = e.stop + ;(delete e.stop, t(o)) + } + return ( + 'string' != typeof i && ((o = e), (e = i), (i = void 0)), + e && this.queue(i || 'fx', []), + this.each(function () { + var e = !0, + t = null != i && i + 'queueHooks', + n = ce.timers, + r = _.get(this) + if (t) r[t] && r[t].stop && a(r[t]) + else for (t in r) r[t] && r[t].stop && pt.test(t) && a(r[t]) + for (t = n.length; t--; ) + n[t].elem !== this || + (null != i && n[t].queue !== i) || + (n[t].anim.stop(o), (e = !1), n.splice(t, 1)) + ;(!e && o) || ce.dequeue(this, i) + }) + ) + }, + finish: function (a) { + return ( + !1 !== a && (a = a || 'fx'), + this.each(function () { + var e, + t = _.get(this), + n = t[a + 'queue'], + r = t[a + 'queueHooks'], + i = ce.timers, + o = n ? n.length : 0 + for ( + t.finish = !0, + ce.queue(this, a, []), + r && r.stop && r.stop.call(this, !0), + e = i.length; + e--; + ) + i[e].elem === this && i[e].queue === a && (i[e].anim.stop(!0), i.splice(e, 1)) + for (e = 0; e < o; e++) n[e] && n[e].finish && n[e].finish.call(this) + delete t.finish + }) + ) + }, + }), + ce.each(['toggle', 'show', 'hide'], function (e, r) { + var i = ce.fn[r] + ce.fn[r] = function (e, t, n) { + return null == e || 'boolean' == typeof e + ? i.apply(this, arguments) + : this.animate(gt(r, !0), e, t, n) + } + }), + ce.each( + { + slideDown: gt('show'), + slideUp: gt('hide'), + slideToggle: gt('toggle'), + fadeIn: { opacity: 'show' }, + fadeOut: { opacity: 'hide' }, + fadeToggle: { opacity: 'toggle' }, + }, + function (e, r) { + ce.fn[e] = function (e, t, n) { + return this.animate(r, e, t, n) + } + } + ), + (ce.timers = []), + (ce.fx.tick = function () { + var e, + t = 0, + n = ce.timers + for (st = Date.now(); t < n.length; t++) (e = n[t])() || n[t] !== e || n.splice(t--, 1) + ;(n.length || ce.fx.stop(), (st = void 0)) + }), + (ce.fx.timer = function (e) { + ;(ce.timers.push(e), ce.fx.start()) + }), + (ce.fx.interval = 13), + (ce.fx.start = function () { + ut || ((ut = !0), dt()) + }), + (ce.fx.stop = function () { + ut = null + }), + (ce.fx.speeds = { slow: 600, fast: 200, _default: 400 }), + (ce.fn.delay = function (r, e) { + return ( + (r = (ce.fx && ce.fx.speeds[r]) || r), + (e = e || 'fx'), + this.queue(e, function (e, t) { + var n = ie.setTimeout(e, r) + t.stop = function () { + ie.clearTimeout(n) + } + }) + ) + }), + (lt = C.createElement('input')), + (ct = C.createElement('select').appendChild(C.createElement('option'))), + (lt.type = 'checkbox'), + (le.checkOn = '' !== lt.value), + (le.optSelected = ct.selected), + ((lt = C.createElement('input')).value = 't'), + (lt.type = 'radio'), + (le.radioValue = 't' === lt.value)) + var mt, + xt = ce.expr.attrHandle + ;(ce.fn.extend({ + attr: function (e, t) { + return M(this, ce.attr, e, t, 1 < arguments.length) + }, + removeAttr: function (e) { + return this.each(function () { + ce.removeAttr(this, e) + }) + }, + }), + ce.extend({ + attr: function (e, t, n) { + var r, + i, + o = e.nodeType + if (3 !== o && 8 !== o && 2 !== o) + return 'undefined' == typeof e.getAttribute + ? ce.prop(e, t, n) + : ((1 === o && ce.isXMLDoc(e)) || + (i = ce.attrHooks[t.toLowerCase()] || (ce.expr.match.bool.test(t) ? mt : void 0)), + void 0 !== n + ? null === n + ? void ce.removeAttr(e, t) + : i && 'set' in i && void 0 !== (r = i.set(e, n, t)) + ? r + : (e.setAttribute(t, n + ''), n) + : i && 'get' in i && null !== (r = i.get(e, t)) + ? r + : null == (r = ce.find.attr(e, t)) + ? void 0 + : r) + }, + attrHooks: { + type: { + set: function (e, t) { + if (!le.radioValue && 'radio' === t && fe(e, 'input')) { + var n = e.value + return (e.setAttribute('type', t), n && (e.value = n), t) + } + }, + }, + }, + removeAttr: function (e, t) { + var n, + r = 0, + i = t && t.match(D) + if (i && 1 === e.nodeType) while ((n = i[r++])) e.removeAttribute(n) + }, + }), + (mt = { + set: function (e, t, n) { + return (!1 === t ? ce.removeAttr(e, n) : e.setAttribute(n, n), n) + }, + }), + ce.each(ce.expr.match.bool.source.match(/\w+/g), function (e, t) { + var a = xt[t] || ce.find.attr + xt[t] = function (e, t, n) { + var r, + i, + o = t.toLowerCase() + return ( + n || ((i = xt[o]), (xt[o] = r), (r = null != a(e, t, n) ? o : null), (xt[o] = i)), + r + ) + } + })) + var bt = /^(?:input|select|textarea|button)$/i, + wt = /^(?:a|area)$/i + function Tt(e) { + return (e.match(D) || []).join(' ') + } + function Ct(e) { + return (e.getAttribute && e.getAttribute('class')) || '' + } + function kt(e) { + return Array.isArray(e) ? e : ('string' == typeof e && e.match(D)) || [] + } + ;(ce.fn.extend({ + prop: function (e, t) { + return M(this, ce.prop, e, t, 1 < arguments.length) + }, + removeProp: function (e) { + return this.each(function () { + delete this[ce.propFix[e] || e] + }) + }, + }), + ce.extend({ + prop: function (e, t, n) { + var r, + i, + o = e.nodeType + if (3 !== o && 8 !== o && 2 !== o) + return ( + (1 === o && ce.isXMLDoc(e)) || ((t = ce.propFix[t] || t), (i = ce.propHooks[t])), + void 0 !== n + ? i && 'set' in i && void 0 !== (r = i.set(e, n, t)) + ? r + : (e[t] = n) + : i && 'get' in i && null !== (r = i.get(e, t)) + ? r + : e[t] + ) + }, + propHooks: { + tabIndex: { + get: function (e) { + var t = ce.find.attr(e, 'tabindex') + return t + ? parseInt(t, 10) + : bt.test(e.nodeName) || (wt.test(e.nodeName) && e.href) + ? 0 + : -1 + }, + }, + }, + propFix: { for: 'htmlFor', class: 'className' }, + }), + le.optSelected || + (ce.propHooks.selected = { + get: function (e) { + var t = e.parentNode + return (t && t.parentNode && t.parentNode.selectedIndex, null) + }, + set: function (e) { + var t = e.parentNode + t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex) + }, + }), + ce.each( + [ + 'tabIndex', + 'readOnly', + 'maxLength', + 'cellSpacing', + 'cellPadding', + 'rowSpan', + 'colSpan', + 'useMap', + 'frameBorder', + 'contentEditable', + ], + function () { + ce.propFix[this.toLowerCase()] = this + } + ), + ce.fn.extend({ + addClass: function (t) { + var e, n, r, i, o, a + return v(t) + ? this.each(function (e) { + ce(this).addClass(t.call(this, e, Ct(this))) + }) + : (e = kt(t)).length + ? this.each(function () { + if (((r = Ct(this)), (n = 1 === this.nodeType && ' ' + Tt(r) + ' '))) { + for (o = 0; o < e.length; o++) + ((i = e[o]), n.indexOf(' ' + i + ' ') < 0 && (n += i + ' ')) + ;((a = Tt(n)), r !== a && this.setAttribute('class', a)) + } + }) + : this + }, + removeClass: function (t) { + var e, n, r, i, o, a + return v(t) + ? this.each(function (e) { + ce(this).removeClass(t.call(this, e, Ct(this))) + }) + : arguments.length + ? (e = kt(t)).length + ? this.each(function () { + if (((r = Ct(this)), (n = 1 === this.nodeType && ' ' + Tt(r) + ' '))) { + for (o = 0; o < e.length; o++) { + i = e[o] + while (-1 < n.indexOf(' ' + i + ' ')) n = n.replace(' ' + i + ' ', ' ') + } + ;((a = Tt(n)), r !== a && this.setAttribute('class', a)) + } + }) + : this + : this.attr('class', '') + }, + toggleClass: function (t, n) { + var e, + r, + i, + o, + a = typeof t, + s = 'string' === a || Array.isArray(t) + return v(t) + ? this.each(function (e) { + ce(this).toggleClass(t.call(this, e, Ct(this), n), n) + }) + : 'boolean' == typeof n && s + ? n + ? this.addClass(t) + : this.removeClass(t) + : ((e = kt(t)), + this.each(function () { + if (s) + for (o = ce(this), i = 0; i < e.length; i++) + ((r = e[i]), o.hasClass(r) ? o.removeClass(r) : o.addClass(r)) + else + (void 0 !== t && 'boolean' !== a) || + ((r = Ct(this)) && _.set(this, '__className__', r), + this.setAttribute && + this.setAttribute( + 'class', + r || !1 === t ? '' : _.get(this, '__className__') || '' + )) + })) + }, + hasClass: function (e) { + var t, + n, + r = 0 + t = ' ' + e + ' ' + while ((n = this[r++])) + if (1 === n.nodeType && -1 < (' ' + Tt(Ct(n)) + ' ').indexOf(t)) return !0 + return !1 + }, + })) + var St = /\r/g + ;(ce.fn.extend({ + val: function (n) { + var r, + e, + i, + t = this[0] + return arguments.length + ? ((i = v(n)), + this.each(function (e) { + var t + 1 === this.nodeType && + (null == (t = i ? n.call(this, e, ce(this).val()) : n) + ? (t = '') + : 'number' == typeof t + ? (t += '') + : Array.isArray(t) && + (t = ce.map(t, function (e) { + return null == e ? '' : e + '' + })), + ((r = ce.valHooks[this.type] || ce.valHooks[this.nodeName.toLowerCase()]) && + 'set' in r && + void 0 !== r.set(this, t, 'value')) || + (this.value = t)) + })) + : t + ? (r = ce.valHooks[t.type] || ce.valHooks[t.nodeName.toLowerCase()]) && + 'get' in r && + void 0 !== (e = r.get(t, 'value')) + ? e + : 'string' == typeof (e = t.value) + ? e.replace(St, '') + : null == e + ? '' + : e + : void 0 + }, + }), + ce.extend({ + valHooks: { + option: { + get: function (e) { + var t = ce.find.attr(e, 'value') + return null != t ? t : Tt(ce.text(e)) + }, + }, + select: { + get: function (e) { + var t, + n, + r, + i = e.options, + o = e.selectedIndex, + a = 'select-one' === e.type, + s = a ? null : [], + u = a ? o + 1 : i.length + for (r = o < 0 ? u : a ? o : 0; r < u; r++) + if ( + ((n = i[r]).selected || r === o) && + !n.disabled && + (!n.parentNode.disabled || !fe(n.parentNode, 'optgroup')) + ) { + if (((t = ce(n).val()), a)) return t + s.push(t) + } + return s + }, + set: function (e, t) { + var n, + r, + i = e.options, + o = ce.makeArray(t), + a = i.length + while (a--) + ((r = i[a]).selected = -1 < ce.inArray(ce.valHooks.option.get(r), o)) && (n = !0) + return (n || (e.selectedIndex = -1), o) + }, + }, + }, + }), + ce.each(['radio', 'checkbox'], function () { + ;((ce.valHooks[this] = { + set: function (e, t) { + if (Array.isArray(t)) return (e.checked = -1 < ce.inArray(ce(e).val(), t)) + }, + }), + le.checkOn || + (ce.valHooks[this].get = function (e) { + return null === e.getAttribute('value') ? 'on' : e.value + })) + })) + var Et = ie.location, + jt = { guid: Date.now() }, + At = /\?/ + ce.parseXML = function (e) { + var t, n + if (!e || 'string' != typeof e) return null + try { + t = new ie.DOMParser().parseFromString(e, 'text/xml') + } catch (e) {} + return ( + (n = t && t.getElementsByTagName('parsererror')[0]), + (t && !n) || + ce.error( + 'Invalid XML: ' + + (n + ? ce + .map(n.childNodes, function (e) { + return e.textContent + }) + .join('\n') + : e) + ), + t + ) + } + var Dt = /^(?:focusinfocus|focusoutblur)$/, + Nt = function (e) { + e.stopPropagation() + } + ;(ce.extend(ce.event, { + trigger: function (e, t, n, r) { + var i, + o, + a, + s, + u, + l, + c, + f, + p = [n || C], + d = ue.call(e, 'type') ? e.type : e, + h = ue.call(e, 'namespace') ? e.namespace.split('.') : [] + if ( + ((o = f = a = n = n || C), + 3 !== n.nodeType && + 8 !== n.nodeType && + !Dt.test(d + ce.event.triggered) && + (-1 < d.indexOf('.') && ((d = (h = d.split('.')).shift()), h.sort()), + (u = d.indexOf(':') < 0 && 'on' + d), + ((e = e[ce.expando] ? e : new ce.Event(d, 'object' == typeof e && e)).isTrigger = r + ? 2 + : 3), + (e.namespace = h.join('.')), + (e.rnamespace = e.namespace + ? new RegExp('(^|\\.)' + h.join('\\.(?:.*\\.|)') + '(\\.|$)') + : null), + (e.result = void 0), + e.target || (e.target = n), + (t = null == t ? [e] : ce.makeArray(t, [e])), + (c = ce.event.special[d] || {}), + r || !c.trigger || !1 !== c.trigger.apply(n, t))) + ) { + if (!r && !c.noBubble && !y(n)) { + for (s = c.delegateType || d, Dt.test(s + d) || (o = o.parentNode); o; o = o.parentNode) + (p.push(o), (a = o)) + a === (n.ownerDocument || C) && p.push(a.defaultView || a.parentWindow || ie) + } + i = 0 + while ((o = p[i++]) && !e.isPropagationStopped()) + ((f = o), + (e.type = 1 < i ? s : c.bindType || d), + (l = (_.get(o, 'events') || Object.create(null))[e.type] && _.get(o, 'handle')) && + l.apply(o, t), + (l = u && o[u]) && + l.apply && + $(o) && + ((e.result = l.apply(o, t)), !1 === e.result && e.preventDefault())) + return ( + (e.type = d), + r || + e.isDefaultPrevented() || + (c._default && !1 !== c._default.apply(p.pop(), t)) || + !$(n) || + (u && + v(n[d]) && + !y(n) && + ((a = n[u]) && (n[u] = null), + (ce.event.triggered = d), + e.isPropagationStopped() && f.addEventListener(d, Nt), + n[d](), + e.isPropagationStopped() && f.removeEventListener(d, Nt), + (ce.event.triggered = void 0), + a && (n[u] = a))), + e.result + ) + } + }, + simulate: function (e, t, n) { + var r = ce.extend(new ce.Event(), n, { type: e, isSimulated: !0 }) + ce.event.trigger(r, null, t) + }, + }), + ce.fn.extend({ + trigger: function (e, t) { + return this.each(function () { + ce.event.trigger(e, t, this) + }) + }, + triggerHandler: function (e, t) { + var n = this[0] + if (n) return ce.event.trigger(e, t, n, !0) + }, + })) + var qt = /\[\]$/, + Lt = /\r?\n/g, + Ht = /^(?:submit|button|image|reset|file)$/i, + Ot = /^(?:input|select|textarea|keygen)/i + function Pt(n, e, r, i) { + var t + if (Array.isArray(e)) + ce.each(e, function (e, t) { + r || qt.test(n) + ? i(n, t) + : Pt(n + '[' + ('object' == typeof t && null != t ? e : '') + ']', t, r, i) + }) + else if (r || 'object' !== x(e)) i(n, e) + else for (t in e) Pt(n + '[' + t + ']', e[t], r, i) + } + ;((ce.param = function (e, t) { + var n, + r = [], + i = function (e, t) { + var n = v(t) ? t() : t + r[r.length] = encodeURIComponent(e) + '=' + encodeURIComponent(null == n ? '' : n) + } + if (null == e) return '' + if (Array.isArray(e) || (e.jquery && !ce.isPlainObject(e))) + ce.each(e, function () { + i(this.name, this.value) + }) + else for (n in e) Pt(n, e[n], t, i) + return r.join('&') + }), + ce.fn.extend({ + serialize: function () { + return ce.param(this.serializeArray()) + }, + serializeArray: function () { + return this.map(function () { + var e = ce.prop(this, 'elements') + return e ? ce.makeArray(e) : this + }) + .filter(function () { + var e = this.type + return ( + this.name && + !ce(this).is(':disabled') && + Ot.test(this.nodeName) && + !Ht.test(e) && + (this.checked || !we.test(e)) + ) + }) + .map(function (e, t) { + var n = ce(this).val() + return null == n + ? null + : Array.isArray(n) + ? ce.map(n, function (e) { + return { name: t.name, value: e.replace(Lt, '\r\n') } + }) + : { name: t.name, value: n.replace(Lt, '\r\n') } + }) + .get() + }, + })) + var Mt = /%20/g, + Rt = /#.*$/, + It = /([?&])_=[^&]*/, + Wt = /^(.*?):[ \t]*([^\r\n]*)$/gm, + Ft = /^(?:GET|HEAD)$/, + $t = /^\/\//, + Bt = {}, + _t = {}, + zt = '*/'.concat('*'), + Xt = C.createElement('a') + function Ut(o) { + return function (e, t) { + 'string' != typeof e && ((t = e), (e = '*')) + var n, + r = 0, + i = e.toLowerCase().match(D) || [] + if (v(t)) + while ((n = i[r++])) + '+' === n[0] + ? ((n = n.slice(1) || '*'), (o[n] = o[n] || []).unshift(t)) + : (o[n] = o[n] || []).push(t) + } + } + function Vt(t, i, o, a) { + var s = {}, + u = t === _t + function l(e) { + var r + return ( + (s[e] = !0), + ce.each(t[e] || [], function (e, t) { + var n = t(i, o, a) + return 'string' != typeof n || u || s[n] + ? u + ? !(r = n) + : void 0 + : (i.dataTypes.unshift(n), l(n), !1) + }), + r + ) + } + return l(i.dataTypes[0]) || (!s['*'] && l('*')) + } + function Gt(e, t) { + var n, + r, + i = ce.ajaxSettings.flatOptions || {} + for (n in t) void 0 !== t[n] && ((i[n] ? e : r || (r = {}))[n] = t[n]) + return (r && ce.extend(!0, e, r), e) + } + ;((Xt.href = Et.href), + ce.extend({ + active: 0, + lastModified: {}, + etag: {}, + ajaxSettings: { + url: Et.href, + type: 'GET', + isLocal: /^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol), + global: !0, + processData: !0, + async: !0, + contentType: 'application/x-www-form-urlencoded; charset=UTF-8', + accepts: { + '*': zt, + text: 'text/plain', + html: 'text/html', + xml: 'application/xml, text/xml', + json: 'application/json, text/javascript', + }, + contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, + responseFields: { xml: 'responseXML', text: 'responseText', json: 'responseJSON' }, + converters: { + '* text': String, + 'text html': !0, + 'text json': JSON.parse, + 'text xml': ce.parseXML, + }, + flatOptions: { url: !0, context: !0 }, + }, + ajaxSetup: function (e, t) { + return t ? Gt(Gt(e, ce.ajaxSettings), t) : Gt(ce.ajaxSettings, e) + }, + ajaxPrefilter: Ut(Bt), + ajaxTransport: Ut(_t), + ajax: function (e, t) { + ;('object' == typeof e && ((t = e), (e = void 0)), (t = t || {})) + var c, + f, + p, + n, + d, + r, + h, + g, + i, + o, + v = ce.ajaxSetup({}, t), + y = v.context || v, + m = v.context && (y.nodeType || y.jquery) ? ce(y) : ce.event, + x = ce.Deferred(), + b = ce.Callbacks('once memory'), + w = v.statusCode || {}, + a = {}, + s = {}, + u = 'canceled', + T = { + readyState: 0, + getResponseHeader: function (e) { + var t + if (h) { + if (!n) { + n = {} + while ((t = Wt.exec(p))) + n[t[1].toLowerCase() + ' '] = (n[t[1].toLowerCase() + ' '] || []).concat(t[2]) + } + t = n[e.toLowerCase() + ' '] + } + return null == t ? null : t.join(', ') + }, + getAllResponseHeaders: function () { + return h ? p : null + }, + setRequestHeader: function (e, t) { + return ( + null == h && ((e = s[e.toLowerCase()] = s[e.toLowerCase()] || e), (a[e] = t)), + this + ) + }, + overrideMimeType: function (e) { + return (null == h && (v.mimeType = e), this) + }, + statusCode: function (e) { + var t + if (e) + if (h) T.always(e[T.status]) + else for (t in e) w[t] = [w[t], e[t]] + return this + }, + abort: function (e) { + var t = e || u + return (c && c.abort(t), l(0, t), this) + }, + } + if ( + (x.promise(T), + (v.url = ((e || v.url || Et.href) + '').replace($t, Et.protocol + '//')), + (v.type = t.method || t.type || v.method || v.type), + (v.dataTypes = (v.dataType || '*').toLowerCase().match(D) || ['']), + null == v.crossDomain) + ) { + r = C.createElement('a') + try { + ;((r.href = v.url), + (r.href = r.href), + (v.crossDomain = Xt.protocol + '//' + Xt.host != r.protocol + '//' + r.host)) + } catch (e) { + v.crossDomain = !0 + } + } + if ( + (v.data && + v.processData && + 'string' != typeof v.data && + (v.data = ce.param(v.data, v.traditional)), + Vt(Bt, v, t, T), + h) + ) + return T + for (i in ((g = ce.event && v.global) && 0 == ce.active++ && ce.event.trigger('ajaxStart'), + (v.type = v.type.toUpperCase()), + (v.hasContent = !Ft.test(v.type)), + (f = v.url.replace(Rt, '')), + v.hasContent + ? v.data && + v.processData && + 0 === (v.contentType || '').indexOf('application/x-www-form-urlencoded') && + (v.data = v.data.replace(Mt, '+')) + : ((o = v.url.slice(f.length)), + v.data && + (v.processData || 'string' == typeof v.data) && + ((f += (At.test(f) ? '&' : '?') + v.data), delete v.data), + !1 === v.cache && + ((f = f.replace(It, '$1')), (o = (At.test(f) ? '&' : '?') + '_=' + jt.guid++ + o)), + (v.url = f + o)), + v.ifModified && + (ce.lastModified[f] && T.setRequestHeader('If-Modified-Since', ce.lastModified[f]), + ce.etag[f] && T.setRequestHeader('If-None-Match', ce.etag[f])), + ((v.data && v.hasContent && !1 !== v.contentType) || t.contentType) && + T.setRequestHeader('Content-Type', v.contentType), + T.setRequestHeader( + 'Accept', + v.dataTypes[0] && v.accepts[v.dataTypes[0]] + ? v.accepts[v.dataTypes[0]] + ('*' !== v.dataTypes[0] ? ', ' + zt + '; q=0.01' : '') + : v.accepts['*'] + ), + v.headers)) + T.setRequestHeader(i, v.headers[i]) + if (v.beforeSend && (!1 === v.beforeSend.call(y, T, v) || h)) return T.abort() + if ( + ((u = 'abort'), + b.add(v.complete), + T.done(v.success), + T.fail(v.error), + (c = Vt(_t, v, t, T))) + ) { + if (((T.readyState = 1), g && m.trigger('ajaxSend', [T, v]), h)) return T + v.async && + 0 < v.timeout && + (d = ie.setTimeout(function () { + T.abort('timeout') + }, v.timeout)) + try { + ;((h = !1), c.send(a, l)) + } catch (e) { + if (h) throw e + l(-1, e) + } + } else l(-1, 'No Transport') + function l(e, t, n, r) { + var i, + o, + a, + s, + u, + l = t + h || + ((h = !0), + d && ie.clearTimeout(d), + (c = void 0), + (p = r || ''), + (T.readyState = 0 < e ? 4 : 0), + (i = (200 <= e && e < 300) || 304 === e), + n && + (s = (function (e, t, n) { + var r, + i, + o, + a, + s = e.contents, + u = e.dataTypes + while ('*' === u[0]) + (u.shift(), + void 0 === r && (r = e.mimeType || t.getResponseHeader('Content-Type'))) + if (r) + for (i in s) + if (s[i] && s[i].test(r)) { + u.unshift(i) + break + } + if (u[0] in n) o = u[0] + else { + for (i in n) { + if (!u[0] || e.converters[i + ' ' + u[0]]) { + o = i + break + } + a || (a = i) + } + o = o || a + } + if (o) return (o !== u[0] && u.unshift(o), n[o]) + })(v, T, n)), + !i && + -1 < ce.inArray('script', v.dataTypes) && + ce.inArray('json', v.dataTypes) < 0 && + (v.converters['text script'] = function () {}), + (s = (function (e, t, n, r) { + var i, + o, + a, + s, + u, + l = {}, + c = e.dataTypes.slice() + if (c[1]) for (a in e.converters) l[a.toLowerCase()] = e.converters[a] + o = c.shift() + while (o) + if ( + (e.responseFields[o] && (n[e.responseFields[o]] = t), + !u && r && e.dataFilter && (t = e.dataFilter(t, e.dataType)), + (u = o), + (o = c.shift())) + ) + if ('*' === o) o = u + else if ('*' !== u && u !== o) { + if (!(a = l[u + ' ' + o] || l['* ' + o])) + for (i in l) + if ( + (s = i.split(' '))[1] === o && + (a = l[u + ' ' + s[0]] || l['* ' + s[0]]) + ) { + !0 === a ? (a = l[i]) : !0 !== l[i] && ((o = s[0]), c.unshift(s[1])) + break + } + if (!0 !== a) + if (a && e['throws']) t = a(t) + else + try { + t = a(t) + } catch (e) { + return { + state: 'parsererror', + error: a ? e : 'No conversion from ' + u + ' to ' + o, + } + } + } + return { state: 'success', data: t } + })(v, s, T, i)), + i + ? (v.ifModified && + ((u = T.getResponseHeader('Last-Modified')) && (ce.lastModified[f] = u), + (u = T.getResponseHeader('etag')) && (ce.etag[f] = u)), + 204 === e || 'HEAD' === v.type + ? (l = 'nocontent') + : 304 === e + ? (l = 'notmodified') + : ((l = s.state), (o = s.data), (i = !(a = s.error)))) + : ((a = l), (!e && l) || ((l = 'error'), e < 0 && (e = 0))), + (T.status = e), + (T.statusText = (t || l) + ''), + i ? x.resolveWith(y, [o, l, T]) : x.rejectWith(y, [T, l, a]), + T.statusCode(w), + (w = void 0), + g && m.trigger(i ? 'ajaxSuccess' : 'ajaxError', [T, v, i ? o : a]), + b.fireWith(y, [T, l]), + g && (m.trigger('ajaxComplete', [T, v]), --ce.active || ce.event.trigger('ajaxStop'))) + } + return T + }, + getJSON: function (e, t, n) { + return ce.get(e, t, n, 'json') + }, + getScript: function (e, t) { + return ce.get(e, void 0, t, 'script') + }, + }), + ce.each(['get', 'post'], function (e, i) { + ce[i] = function (e, t, n, r) { + return ( + v(t) && ((r = r || n), (n = t), (t = void 0)), + ce.ajax( + ce.extend( + { url: e, type: i, dataType: r, data: t, success: n }, + ce.isPlainObject(e) && e + ) + ) + ) + } + }), + ce.ajaxPrefilter(function (e) { + var t + for (t in e.headers) + 'content-type' === t.toLowerCase() && (e.contentType = e.headers[t] || '') + }), + (ce._evalUrl = function (e, t, n) { + return ce.ajax({ + url: e, + type: 'GET', + dataType: 'script', + cache: !0, + async: !1, + global: !1, + converters: { 'text script': function () {} }, + dataFilter: function (e) { + ce.globalEval(e, t, n) + }, + }) + }), + ce.fn.extend({ + wrapAll: function (e) { + var t + return ( + this[0] && + (v(e) && (e = e.call(this[0])), + (t = ce(e, this[0].ownerDocument).eq(0).clone(!0)), + this[0].parentNode && t.insertBefore(this[0]), + t + .map(function () { + var e = this + while (e.firstElementChild) e = e.firstElementChild + return e + }) + .append(this)), + this + ) + }, + wrapInner: function (n) { + return v(n) + ? this.each(function (e) { + ce(this).wrapInner(n.call(this, e)) + }) + : this.each(function () { + var e = ce(this), + t = e.contents() + t.length ? t.wrapAll(n) : e.append(n) + }) + }, + wrap: function (t) { + var n = v(t) + return this.each(function (e) { + ce(this).wrapAll(n ? t.call(this, e) : t) + }) + }, + unwrap: function (e) { + return ( + this.parent(e) + .not('body') + .each(function () { + ce(this).replaceWith(this.childNodes) + }), + this + ) + }, + }), + (ce.expr.pseudos.hidden = function (e) { + return !ce.expr.pseudos.visible(e) + }), + (ce.expr.pseudos.visible = function (e) { + return !!(e.offsetWidth || e.offsetHeight || e.getClientRects().length) + }), + (ce.ajaxSettings.xhr = function () { + try { + return new ie.XMLHttpRequest() + } catch (e) {} + })) + var Yt = { 0: 200, 1223: 204 }, + Qt = ce.ajaxSettings.xhr() + ;((le.cors = !!Qt && 'withCredentials' in Qt), + (le.ajax = Qt = !!Qt), + ce.ajaxTransport(function (i) { + var o, a + if (le.cors || (Qt && !i.crossDomain)) + return { + send: function (e, t) { + var n, + r = i.xhr() + if ((r.open(i.type, i.url, i.async, i.username, i.password), i.xhrFields)) + for (n in i.xhrFields) r[n] = i.xhrFields[n] + for (n in (i.mimeType && r.overrideMimeType && r.overrideMimeType(i.mimeType), + i.crossDomain || e['X-Requested-With'] || (e['X-Requested-With'] = 'XMLHttpRequest'), + e)) + r.setRequestHeader(n, e[n]) + ;((o = function (e) { + return function () { + o && + ((o = + a = + r.onload = + r.onerror = + r.onabort = + r.ontimeout = + r.onreadystatechange = + null), + 'abort' === e + ? r.abort() + : 'error' === e + ? 'number' != typeof r.status + ? t(0, 'error') + : t(r.status, r.statusText) + : t( + Yt[r.status] || r.status, + r.statusText, + 'text' !== (r.responseType || 'text') || 'string' != typeof r.responseText + ? { binary: r.response } + : { text: r.responseText }, + r.getAllResponseHeaders() + )) + } + }), + (r.onload = o()), + (a = r.onerror = r.ontimeout = o('error')), + void 0 !== r.onabort + ? (r.onabort = a) + : (r.onreadystatechange = function () { + 4 === r.readyState && + ie.setTimeout(function () { + o && a() + }) + }), + (o = o('abort'))) + try { + r.send((i.hasContent && i.data) || null) + } catch (e) { + if (o) throw e + } + }, + abort: function () { + o && o() + }, + } + }), + ce.ajaxPrefilter(function (e) { + e.crossDomain && (e.contents.script = !1) + }), + ce.ajaxSetup({ + accepts: { + script: + 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript', + }, + contents: { script: /\b(?:java|ecma)script\b/ }, + converters: { + 'text script': function (e) { + return (ce.globalEval(e), e) + }, + }, + }), + ce.ajaxPrefilter('script', function (e) { + ;(void 0 === e.cache && (e.cache = !1), e.crossDomain && (e.type = 'GET')) + }), + ce.ajaxTransport('script', function (n) { + var r, i + if (n.crossDomain || n.scriptAttrs) + return { + send: function (e, t) { + ;((r = ce('